diff options
| author | Adam Malczewski <[email protected]> | 2026-06-01 01:46:13 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-01 01:46:13 +0900 |
| commit | 8b9533c22a47bbf6f916667e2c25d8e8e419da37 (patch) | |
| tree | 715a6a3d6f43781395e7dc7c8cdb519cef46a870 /packages/core/tests/agents | |
| parent | 1853dd1d40308deb829bc621beb79c5d39b9c57f (diff) | |
| download | dispatch-8b9533c22a47bbf6f916667e2c25d8e8e419da37.tar.gz dispatch-8b9533c22a47bbf6f916667e2c25d8e8e419da37.zip | |
feat(tabs): tab-to-tab agent communication via short handles
Add send_to_tab / read_tab tools so an agent can message or read another
tab by a git-style short handle (shortest unique prefix of the tab UUID,
min 4 chars), shown in the tab bar.
- core/db/tabs: resolveTabPrefix + shortestUniquePrefix (open tabs only,
LIKE-sanitized prefix matching)
- new tools read-tab.ts / send-to-tab.ts (+ tests) decoupled from the DB
TabRow via a minimal ResolvedTabRef projection
- agent-manager: unified deliverMessage routing (busy -> queue, idle ->
new turn) shared by POST /chat and send_to_tab; agent->agent auto-wake
budget (MAX_AGENT_AUTO_WAKES) to bound ping-pong loops
- summon/loader: send_to_tab + read_tab as grantable tools
- frontend: shortHandleFor + handle badge in TabBar; perm toggles
- notes: tab-comm / user-agents / todo-redesign plans
- chore: biome format fixes (debug-logger, summon.test)
Refs notes/plan-tab-comm.md
Diffstat (limited to 'packages/core/tests/agents')
| -rw-r--r-- | packages/core/tests/agents/loader.test.ts | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/packages/core/tests/agents/loader.test.ts b/packages/core/tests/agents/loader.test.ts index 88173ea..35ab0cf 100644 --- a/packages/core/tests/agents/loader.test.ts +++ b/packages/core/tests/agents/loader.test.ts @@ -22,10 +22,34 @@ describe("expandAgentToolNames", () => { expect(out).toContain("run_shell"); }); + it("passes through the tab tools as independent names (no tab_comm group)", () => { + const out = expandAgentToolNames(["send_to_tab", "read_tab"]); + expect(out).toContain("send_to_tab"); + expect(out).toContain("read_tab"); + // Granting only one must not pull in the other. + const onlySend = expandAgentToolNames(["send_to_tab"]); + expect(onlySend).toContain("send_to_tab"); + expect(onlySend).not.toContain("read_tab"); + }); + it("passes through non-group tool names unchanged", () => { - const out = expandAgentToolNames(["summon", "retrieve", "web_search", "youtube_transcribe"]); + const out = expandAgentToolNames([ + "summon", + "retrieve", + "web_search", + "youtube_transcribe", + "send_to_tab", + "read_tab", + ]); expect(out).toEqual( - expect.arrayContaining(["summon", "retrieve", "web_search", "youtube_transcribe"]), + expect.arrayContaining([ + "summon", + "retrieve", + "web_search", + "youtube_transcribe", + "send_to_tab", + "read_tab", + ]), ); }); |
