PAD-12: per-terminal transport (direct Tailscale SSH or Warpgate, pre-session fallback, pinned host keys, agent key from Vault), one-call win10 launch and one-call collect, remote call timings, agentd ping

This commit is contained in:
jj.wang
2026-10-22 02:59:37 +00:00
parent 83bc0f243c
commit 5192e04088
23 changed files with 1850 additions and 132 deletions
+6 -1
View File
@@ -12,6 +12,8 @@ agentd:
max_rounds_per_thread: 8 # rebuild the executor thread (with a handoff summary) after this many rounds
comment_max_chars: 6000
cli_terminal: oregon # identity used by `agentd new/comment/state/assign`
# ssh_key: AGENTD_SSH_KEY # direct-ssh: Vault key / env var of the dedicated private key (default)
# ssh_dir: /run/plane-agentd/ssh # direct-ssh: ControlMaster sockets + generated known_hosts (default state_dir/ssh)
# Plane webhook receiver (`agentd webhook-serve`, docs/runbook.md "Webhook"); leave the section out to run on cron only.
webhook:
@@ -27,7 +29,10 @@ notify: {kind: none} # notification hook: only `none` (no-op) e
terminals:
win10:
transport: warpgate-ssh
transport: warpgate-ssh # or direct-ssh over Tailscale (design §9, docs/deploy-lxc.md "直连 SSH"):
# transport: direct-ssh
# ssh: {host: 100.123.209.19, user: administrator, port: 22, host_key: "ssh-ed25519 AAAA..."} # pinned host key
# fallback: warpgate-ssh # used only when the direct path fails before the command ran
target: win10
os: windows
launch: schtasks
+18 -6
View File
@@ -1,5 +1,5 @@
# plane-agentd live configuration on the LXC agentd-01 (/opt/plane-agentd, runs as root; docs/deploy-lxc.md).
# No secrets: token_key values are Vault key names; the tokens are injected by
# No secrets: token_key / ssh_key values are Vault key names; the values are injected by
# `agent-access.py exec --secret-env KEY=KEY` (cron/agentd-tick-lxc.sh). Rollback to oregon: config/agentd.oregon.yaml.
plane: {base_url: https://plane.kappiee.com, workspace: kappiee}
vault: {client: ~/.local/share/server-access-client/agent-access.py, config: https://nas.tail9531b.ts.net:8443/identity/agent.json}
@@ -12,6 +12,10 @@ agentd:
max_rounds_per_thread: 8
comment_max_chars: 6000
cli_terminal: oregon
# direct-ssh (PAD-12, docs/deploy-lxc.md "直连 SSH"): the dedicated key comes from Vault AGENTD_SSH_KEY via
# --secret-env; ControlMaster sockets and the known_hosts generated from the pinned host keys live in ssh_dir
ssh_key: AGENTD_SSH_KEY
ssh_dir: /run/plane-agentd/ssh
# Plane webhook receiver (`agentd webhook-serve`, systemd plane-agentd-webhook.service; docs/runbook.md "Webhook").
# One workspace-level Plane webhook (work items + comments) -> POST http://10.77.10.249:8790/plane -> one tick.
@@ -30,8 +34,13 @@ notify: {kind: none} # notification hook, no-op (no ntfy servic
terminals:
win10:
transport: warpgate-ssh
target: win10
# direct over Tailscale (PAD-12); Warpgate only when the direct path fails before a command ran.
# Rollback: transport: warpgate-ssh (ssh/fallback may stay, they are ignored then)
transport: direct-ssh
ssh: {host: 100.123.209.19, user: administrator, port: 22,
host_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFzLX7QNHDFYwTgY4wNl0ihZryIyKgpp9HPpPDWbrTX3"}
fallback: warpgate-ssh
target: win10 # Warpgate target of the fallback
os: windows
launch: schtasks
repo: 'C:\Users\Administrator\Documents\GwentAssistantProject\gwent'
@@ -44,9 +53,12 @@ terminals:
capabilities: [android, game]
executors: [codex]
oregon:
# the dispatcher (LXC, no agent CLIs) reaches oregon through Warpgate like any other host (design §9)
transport: warpgate-ssh
target: oregon # agent-access.py target name
# the dispatcher (LXC, no agent CLIs) reaches oregon directly over Tailscale, Warpgate as fallback (design §9)
transport: direct-ssh
ssh: {host: 100.127.58.78, user: ubuntu, port: 22,
host_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICUoI6W7npX+h/kHcXX3iy2XAWbNusrOjg28Xed75wWr"}
fallback: warpgate-ssh
target: oregon # agent-access.py target name (fallback)
os: linux
launch: nohup
repo: /home/ubuntu/Documents/wjj/project/gwent
+16 -2
View File
@@ -33,7 +33,9 @@
"interval": {"type": "integer", "minimum": 10},
"max_rounds_per_thread": {"type": "integer", "minimum": 1},
"comment_max_chars": {"type": "integer", "minimum": 500},
"cli_terminal": {"type": "string"}
"cli_terminal": {"type": "string"},
"ssh_dir": {"type": "string"},
"ssh_key": {"type": "string"}
}
},
"webhook": {
@@ -71,8 +73,20 @@
"required": ["transport", "os", "launch", "repo", "plane_user", "token_key", "executors"],
"additionalProperties": false,
"properties": {
"transport": {"enum": ["local", "warpgate-ssh"]},
"transport": {"enum": ["local", "warpgate-ssh", "direct-ssh"]},
"target": {"type": "string"},
"ssh": {
"type": "object",
"required": ["host", "user", "host_key"],
"additionalProperties": false,
"properties": {
"host": {"type": "string"},
"user": {"type": "string"},
"port": {"type": "integer", "minimum": 1},
"host_key": {"type": "string"}
}
},
"fallback": {"enum": ["warpgate-ssh"]},
"os": {"enum": ["linux", "darwin", "windows"]},
"launch": {"enum": ["subprocess", "nohup", "schtasks"]},
"repo": {"type": "string"},