warpgate-ssh: remote Linux/macOS terminals through the relay; oregon launched remotely

The dispatcher moves to an LXC without agent CLIs (design 9), so every terminal is
reached through Warpgate. The relay call (agent-access.py run --target <t>) lives in
one helper; the target comes from the terminal config.

os linux/darwin (PosixWarpgateTransport): each primitive is one bash -c call. Files
go up as base64 (chunked above 60k), start_run stages prompt.md + run.sh and launches
in a single round trip; the runner is detached with setsid nohup (pid == pgid == sid,
$! kept in launch.pid); kill signals the process group and session (TERM, then KILL),
skipped once exit.txt exists. macOS detaches with perl POSIX::setsid.

os windows keeps the win10-ps.sh / win10-put.sh helper scripts (target win10) and
schtasks, now through the shared call() helper.

oregon is now warpgate-ssh (target oregon, run_root ~/.gwent-board/agentd-runs);
the local transport stays for co-located setups and tests.
This commit is contained in:
jj.wang
2026-10-21 08:08:01 +00:00
parent f2f7e4308a
commit dc8271a06a
9 changed files with 490 additions and 45 deletions
+13 -5
View File
@@ -91,11 +91,19 @@ def semantic_errors(data):
for ex in t.get("executors", []):
if ex not in execs:
errs.append("terminals.%s: unknown executor '%s'" % (tname, ex))
if t.get("transport") == "warpgate-ssh":
if t.get("os") != "windows" or t.get("launch") != "schtasks":
errs.append("terminals.%s: warpgate-ssh currently supports only os=windows, launch=schtasks" % tname)
if t.get("target") != "win10":
errs.append("terminals.%s: warpgate-ssh helper scripts only reach target 'win10' for now" % tname)
if t.get("transport") == "warpgate-ssh" and t.get("os") == "windows":
if t.get("launch") != "schtasks":
errs.append("terminals.%s: warpgate-ssh on windows needs launch=schtasks" % tname)
if t.get("target", tname) != "win10":
errs.append("terminals.%s: the Windows helper scripts only reach target 'win10' for now" % tname)
elif t.get("transport") == "warpgate-ssh":
if t.get("launch") != "nohup":
errs.append("terminals.%s: warpgate-ssh on %s needs launch=nohup" % (tname, t.get("os")))
for key in ("repo", "run_root"):
if key in t and not str(t[key]).startswith("/"):
errs.append("terminals.%s.%s: must be an absolute path on the remote (no ~)" % (tname, key))
if not data.get("vault", {}).get("config"):
errs.append("terminals.%s: remote POSIX terminals need vault.config (relay identity)" % tname)
if t.get("transport") == "local" and t.get("os") != "linux":
errs.append("terminals.%s: local transport supports only os=linux" % tname)
for ename, e in execs.items():