diff options
| author | Adam Malczewski <[email protected]> | 2026-06-25 21:45:58 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-25 21:45:58 +0900 |
| commit | 2cc9ddfb590dc60557bba3ed76a6c4639df5f596 (patch) | |
| tree | b0ced1ecb5f899e6a2b835d41603c4040a49bbce /packages/system-prompt/src/resolver.test.ts | |
| parent | 087ce142247637bb10351ab7815144b720836153 (diff) | |
| download | dispatch-2cc9ddfb590dc60557bba3ed76a6c4639df5f596.tar.gz dispatch-2cc9ddfb590dc60557bba3ed76a6c4639df5f596.zip | |
feat(ssh): discover computers from ~/.ssh/known_hosts + remote system-prompt
Two improvements to the SSH support feature:
1. KNOWN_HOSTS DISCOVERY (packages/ssh):
Computers are now auto-discovered from ~/.ssh/known_hosts (every hostname
you've ever connected to) in ADDITION to ~/.ssh/config (explicit Host
aliases). Config entries take precedence (full params); known_hosts entries
get defaulted params (User=defaultUser, IdentityFile=null→pool probes
default keys, Port from [host]:port or 22, knownHost=true). Zero-config —
no ~/.ssh/config file needed; hosts just appear.
Reject list: dispatch.toml [ssh].reject = [...] (glob patterns like
github.com, *.ts.net) filters noise from the catalog. Read from both
the global ~/.config/dispatch/dispatch.toml and the project dispatch.toml.
Parsed with Bun.TOML.parse (zero deps). Only filters discovery (catalog);
specific lookups (getComputer/getStatus/test/connect) ignore the reject
list (it's a visibility filter, not access control).
New pure functions: parseKnownHosts(), isRejected(), globMatch().
+26 tests. tsc EXIT 0, biome clean, 1756 tests pass.
2. REMOTE SYSTEM-PROMPT AWARENESS (packages/system-prompt):
When a conversation has a computerId set (remote turn), the system prompt
now resolves system:os, system:hostname, git:branch/git:status, and
file: reads against the REMOTE machine — not the local host. Previously
the prompt always said 'Arch Linux (WSL)' + local hostname even when the
agent was connected to a remote Artix Linux machine.
The ResolverAdapters' hostname()/platform() are now async (so a remote
adapter can run 'hostname'/'uname -s' over SSH). The system-prompt
extension builds remote adapters from the ExecBackend (readFile→SFTP,
spawn→SSH exec). Cache invalidation now checks computerId (switching
computers rebuilds the prompt). The compaction path also threads
computerId. @dispatch/system-prompt now depends on @dispatch/exec-backend.
Diffstat (limited to 'packages/system-prompt/src/resolver.test.ts')
| -rw-r--r-- | packages/system-prompt/src/resolver.test.ts | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/packages/system-prompt/src/resolver.test.ts b/packages/system-prompt/src/resolver.test.ts index 474c79a..d55af07 100644 --- a/packages/system-prompt/src/resolver.test.ts +++ b/packages/system-prompt/src/resolver.test.ts @@ -37,8 +37,8 @@ describe("resolver", () => { spawn: failSpawn(), fs: fakeFs(new Map()), now: () => fixedNow, - platform: () => "linux", - hostname: () => "myhost", + platform: async () => "linux", + hostname: async () => "myhost", }); expect(map.get("system:time")).toBe("2024-06-15T12:30:00.000Z"); @@ -83,7 +83,7 @@ describe("resolver", () => { const map = await resolveVariables("/proj", { spawn: failSpawn(), fs: fakeFs(files), - platform: () => "linux", + platform: async () => "linux", }); expect(map.get("system:os")).toBe("Ubuntu 22.04 LTS"); }); @@ -95,7 +95,7 @@ describe("resolver", () => { const map = await resolveVariables("/proj", { spawn: failSpawn(), fs: fakeFs(files), - platform: () => "linux", + platform: async () => "linux", }); expect(map.get("system:os")).toBe("Debian 12"); }); @@ -108,7 +108,7 @@ describe("resolver", () => { const map = await resolveVariables("/proj", { spawn: failSpawn(), fs: fakeFs(files), - platform: () => "linux", + platform: async () => "linux", }); expect(map.get("system:os")).toBe("Ubuntu 22.04 LTS (WSL)"); }); @@ -121,7 +121,7 @@ describe("resolver", () => { const map = await resolveVariables("/proj", { spawn: failSpawn(), fs: fakeFs(files), - platform: () => "linux", + platform: async () => "linux", }); expect(map.get("system:os")).toBe("Ubuntu 22.04 LTS (WSL)"); }); @@ -131,7 +131,7 @@ describe("resolver", () => { const map = await resolveVariables("/proj", { spawn: failSpawn(), fs: fakeFs(files), - platform: () => "linux", + platform: async () => "linux", }); expect(map.get("system:os")).toBe("Linux (WSL)"); }); @@ -140,7 +140,7 @@ describe("resolver", () => { const map = await resolveVariables("/proj", { spawn: failSpawn(), fs: fakeFs(new Map()), - platform: () => "linux", + platform: async () => "linux", }); expect(map.get("system:os")).toBe("linux"); }); @@ -149,7 +149,7 @@ describe("resolver", () => { const map = await resolveVariables("/proj", { spawn: failSpawn(), fs: fakeFs(new Map()), - platform: () => "darwin", + platform: async () => "darwin", }); expect(map.get("system:os")).toBe("darwin"); }); |
