agenthub-multiagent-mcp 1.51.0 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +192 -192
  2. package/dist/captureHookInstall.d.ts +127 -0
  3. package/dist/captureHookInstall.d.ts.map +1 -0
  4. package/dist/captureHookInstall.js +256 -0
  5. package/dist/captureHookInstall.js.map +1 -0
  6. package/dist/captureHookInstall.test.d.ts +10 -0
  7. package/dist/captureHookInstall.test.d.ts.map +1 -0
  8. package/dist/captureHookInstall.test.js +325 -0
  9. package/dist/captureHookInstall.test.js.map +1 -0
  10. package/dist/channel.js +99 -3
  11. package/dist/channel.js.map +1 -1
  12. package/dist/client.d.ts +80 -1
  13. package/dist/client.d.ts.map +1 -1
  14. package/dist/client.js +197 -4
  15. package/dist/client.js.map +1 -1
  16. package/dist/client.unit.test.js +50 -0
  17. package/dist/client.unit.test.js.map +1 -1
  18. package/dist/daemon.js +217 -3
  19. package/dist/daemon.js.map +1 -1
  20. package/dist/hooks/periodicReminder.js +9 -9
  21. package/dist/index.js +25 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/session-capture.sh +410 -0
  24. package/dist/sessionCapture.d.ts +163 -0
  25. package/dist/sessionCapture.d.ts.map +1 -0
  26. package/dist/sessionCapture.js +279 -0
  27. package/dist/sessionCapture.js.map +1 -0
  28. package/dist/sessionCapture.test.d.ts +9 -0
  29. package/dist/sessionCapture.test.d.ts.map +1 -0
  30. package/dist/sessionCapture.test.js +366 -0
  31. package/dist/sessionCapture.test.js.map +1 -0
  32. package/dist/sessionCaptureScript.test.d.ts +16 -0
  33. package/dist/sessionCaptureScript.test.d.ts.map +1 -0
  34. package/dist/sessionCaptureScript.test.js +92 -0
  35. package/dist/sessionCaptureScript.test.js.map +1 -0
  36. package/dist/setup.js +56 -56
  37. package/dist/steering.test.d.ts +2 -0
  38. package/dist/steering.test.d.ts.map +1 -0
  39. package/dist/steering.test.js +223 -0
  40. package/dist/steering.test.js.map +1 -0
  41. package/dist/streamingRuntimeLib.d.ts +391 -0
  42. package/dist/streamingRuntimeLib.d.ts.map +1 -0
  43. package/dist/streamingRuntimeLib.js +628 -0
  44. package/dist/streamingRuntimeLib.js.map +1 -0
  45. package/dist/streamingRuntimeLib.test.d.ts +2 -0
  46. package/dist/streamingRuntimeLib.test.d.ts.map +1 -0
  47. package/dist/streamingRuntimeLib.test.js +233 -0
  48. package/dist/streamingRuntimeLib.test.js.map +1 -0
  49. package/dist/tools/index.d.ts.map +1 -1
  50. package/dist/tools/index.js +149 -13
  51. package/dist/tools/index.js.map +1 -1
  52. package/dist/tools/openspec-viz/diagram-generator.js +54 -54
  53. package/dist/tools/openspec-viz/html-generator.js +503 -503
  54. package/dist/tools/sessionControl.d.ts +53 -0
  55. package/dist/tools/sessionControl.d.ts.map +1 -0
  56. package/dist/tools/sessionControl.js +265 -0
  57. package/dist/tools/sessionControl.js.map +1 -0
  58. package/dist/tools/sessionControl.test.d.ts +14 -0
  59. package/dist/tools/sessionControl.test.d.ts.map +1 -0
  60. package/dist/tools/sessionControl.test.js +298 -0
  61. package/dist/tools/sessionControl.test.js.map +1 -0
  62. package/dist/tools/tools.test.js +5 -2
  63. package/dist/tools/tools.test.js.map +1 -1
  64. package/dist/tools/zohoAttachments.test.d.ts +10 -0
  65. package/dist/tools/zohoAttachments.test.d.ts.map +1 -0
  66. package/dist/tools/zohoAttachments.test.js +204 -0
  67. package/dist/tools/zohoAttachments.test.js.map +1 -0
  68. package/dist/worker.js +10 -10
  69. package/native/agenthub-memvid/agenthub-memvid.linux-x64-gnu.node +0 -0
  70. package/native/agenthub-memvid/index.d.ts +58 -58
  71. package/native/agenthub-memvid/index.js +319 -319
  72. package/package.json +77 -77
  73. package/skills/catalog.json +76 -76
  74. package/skills/commands/close-session.md +144 -144
  75. package/skills/manifest.json +50 -50
  76. package/skills/skills/code-brain-hook/SKILL.md +61 -61
  77. package/skills/skills/file-bug/SKILL.md +75 -75
  78. package/skills/skills/multiagent-brainstorm/SKILL.md +142 -142
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionCapture.test.js","sourceRoot":"","sources":["../src/sessionCapture.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Guards on `session-capture.sh` itself (add-multiplayer-sessions §1.5/§3.2).
3
+ *
4
+ * The hook embeds its Python in a **bash double-quoted string**, which makes it
5
+ * quietly dangerous to edit: bash expands backticks and `$` inside that string
6
+ * before Python ever sees it. A single backtick in a Python *comment* ran
7
+ * `read`, which ate the hook's stdin — Python then parsed an empty tool payload
8
+ * and the hook did nothing at all, with no error anywhere. Capture just
9
+ * silently stopped working.
10
+ *
11
+ * That failure is invisible to every other kind of test: the shell exits 0, the
12
+ * MCP is fine, and the server simply never hears from anyone. So it is checked
13
+ * statically here, against the file's own text.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=sessionCaptureScript.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionCaptureScript.test.d.ts","sourceRoot":"","sources":["../src/sessionCaptureScript.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Guards on `session-capture.sh` itself (add-multiplayer-sessions §1.5/§3.2).
3
+ *
4
+ * The hook embeds its Python in a **bash double-quoted string**, which makes it
5
+ * quietly dangerous to edit: bash expands backticks and `$` inside that string
6
+ * before Python ever sees it. A single backtick in a Python *comment* ran
7
+ * `read`, which ate the hook's stdin — Python then parsed an empty tool payload
8
+ * and the hook did nothing at all, with no error anywhere. Capture just
9
+ * silently stopped working.
10
+ *
11
+ * That failure is invisible to every other kind of test: the shell exits 0, the
12
+ * MCP is fine, and the server simply never hears from anyone. So it is checked
13
+ * statically here, against the file's own text.
14
+ */
15
+ import { describe, it, expect } from "vitest";
16
+ import { readFileSync } from "fs";
17
+ import * as path from "path";
18
+ import { fileURLToPath } from "url";
19
+ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
20
+ const PACKAGE_COPY = path.join(repoRoot, "mcp-server", "session-capture.sh");
21
+ const REPO_COPY = path.join(repoRoot, ".claude", "hooks", "session-capture.sh");
22
+ function read(p) {
23
+ return readFileSync(p, "utf8");
24
+ }
25
+ /**
26
+ * Extract every embedded Python block — the text between `"$PY" -c "` and the
27
+ * closing `" 2>/dev/null)`. These are the regions bash expands.
28
+ */
29
+ function pythonBlocks(script) {
30
+ const blocks = [];
31
+ const opener = '"$PY" -c "';
32
+ let from = 0;
33
+ for (;;) {
34
+ const start = script.indexOf(opener, from);
35
+ if (start === -1)
36
+ break;
37
+ const bodyStart = start + opener.length;
38
+ const end = script.indexOf('" 2>/dev/null)', bodyStart);
39
+ if (end === -1)
40
+ break;
41
+ blocks.push(script.slice(bodyStart, end));
42
+ from = end + 1;
43
+ }
44
+ return blocks;
45
+ }
46
+ describe("session-capture.sh", () => {
47
+ it("ships two byte-identical copies", () => {
48
+ // The packaged copy is what npm publishes; the repo copy is what a checkout
49
+ // runs. A drift between them means one caller silently gets old behaviour.
50
+ expect(read(PACKAGE_COPY)).toBe(read(REPO_COPY));
51
+ });
52
+ it("embeds exactly the two Python blocks the script is built around", () => {
53
+ // The interactive bootstrap (§3.2) and the event builder (§1.5). A third
54
+ // would mean someone added a block that these guards have not been reviewed
55
+ // against.
56
+ expect(pythonBlocks(read(PACKAGE_COPY))).toHaveLength(2);
57
+ });
58
+ it("contains no backtick inside an embedded Python block", () => {
59
+ // Bash runs backticks inside a double-quoted string as a command, even in
60
+ // what looks like a Python comment. This is the exact bug that silently
61
+ // disabled capture.
62
+ for (const [i, block] of pythonBlocks(read(PACKAGE_COPY)).entries()) {
63
+ const line = block.split("\n").find((l) => l.includes("`"));
64
+ expect(line, `python block ${i} contains a backtick: ${line}`).toBeUndefined();
65
+ }
66
+ });
67
+ it("contains no unescaped $ inside an embedded Python block", () => {
68
+ // Same class of hazard: bash would substitute a variable into the Python
69
+ // source. Escaped \$ is fine; a bare $ is not.
70
+ for (const [i, block] of pythonBlocks(read(PACKAGE_COPY)).entries()) {
71
+ const offending = block
72
+ .split("\n")
73
+ .find((l) => /(^|[^\\])\$/.test(l));
74
+ expect(offending, `python block ${i} has an unescaped $: ${offending}`).toBeUndefined();
75
+ }
76
+ });
77
+ it("keeps the interactive path behind a consent grant, not an env var", () => {
78
+ // §3.1's constraint expressed where it can regress: the bootstrap must be
79
+ // reachable only via the grant file the MCP writes after the server
80
+ // confirms consent. An env-var switch here would let whoever controls the
81
+ // environment on a shared host turn capture on for the person using it.
82
+ const script = read(PACKAGE_COPY);
83
+ expect(script).toContain("AGENTHUB_CAPTURE_GRANT");
84
+ expect(script).toContain("/api/session-capture/sessions");
85
+ expect(script).not.toMatch(/AGENTHUB_CAPTURE_ENABLED|AGENTHUB_CAPTURE_CONSENT=/);
86
+ });
87
+ it("writes the recording indicator to stdout as a systemMessage", () => {
88
+ // §3.3 — the person must see that they are being recorded.
89
+ expect(read(PACKAGE_COPY)).toContain("'systemMessage'");
90
+ });
91
+ });
92
+ //# sourceMappingURL=sessionCaptureScript.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionCaptureScript.test.js","sourceRoot":"","sources":["../src/sessionCaptureScript.test.ts"],"names":[],"mappings":"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"}
package/dist/setup.js CHANGED
@@ -181,28 +181,28 @@ function installWindowsStartup(config) {
181
181
  const thisDir = path.dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/, "$1"));
182
182
  const workerJs = path.join(thisDir, "worker.js").replace(/\\/g, "\\\\");
183
183
  // Smart bat script: check before start, no zombie loop
184
- const batContent = `@echo off
185
- :: AgentHub Worker — auto-starts on login, checks before spawning
186
- set AGENTHUB_API_KEY=${config.api_key}
187
- set AGENTHUB_URL=${config.server}
188
-
189
- :check
190
- :: Check if worker is already running
191
- set PID_FILE=%TEMP%\\agenthub-workers\\worker.pid
192
- if exist "%PID_FILE%" (
193
- for /f %%i in (%PID_FILE%) do (
194
- tasklist /fi "PID eq %%i" 2>nul | find "node" >nul 2>&1
195
- if not errorlevel 1 (
196
- timeout /t 60 /nobreak >nul
197
- goto check
198
- )
199
- )
200
- )
201
- :: Start worker
202
- node "${workerJs}"
203
- :: Worker exited, wait and retry
204
- timeout /t 10 /nobreak >nul
205
- goto check
184
+ const batContent = `@echo off
185
+ :: AgentHub Worker — auto-starts on login, checks before spawning
186
+ set AGENTHUB_API_KEY=${config.api_key}
187
+ set AGENTHUB_URL=${config.server}
188
+
189
+ :check
190
+ :: Check if worker is already running
191
+ set PID_FILE=%TEMP%\\agenthub-workers\\worker.pid
192
+ if exist "%PID_FILE%" (
193
+ for /f %%i in (%PID_FILE%) do (
194
+ tasklist /fi "PID eq %%i" 2>nul | find "node" >nul 2>&1
195
+ if not errorlevel 1 (
196
+ timeout /t 60 /nobreak >nul
197
+ goto check
198
+ )
199
+ )
200
+ )
201
+ :: Start worker
202
+ node "${workerJs}"
203
+ :: Worker exited, wait and retry
204
+ timeout /t 10 /nobreak >nul
205
+ goto check
206
206
  `;
207
207
  // Write the .bat OUTSIDE the Startup folder. Windows auto-runs every file in
208
208
  // Startup at logon, so a .bat placed there opens its OWN visible console
@@ -214,9 +214,9 @@ goto check
214
214
  const batPath = path.join(CONFIG_DIR, "agenthub-worker.bat");
215
215
  fs.writeFileSync(batPath, batContent);
216
216
  // VBS to run bat hidden
217
- const vbsContent = `' Start AgentHub Worker hidden (no console window)
218
- Set WshShell = CreateObject("WScript.Shell")
219
- WshShell.Run """${batPath.replace(/\\/g, "\\\\")}""", 0, False
217
+ const vbsContent = `' Start AgentHub Worker hidden (no console window)
218
+ Set WshShell = CreateObject("WScript.Shell")
219
+ WshShell.Run """${batPath.replace(/\\/g, "\\\\")}""", 0, False
220
220
  `;
221
221
  const vbsPath = path.join(startupDir, "AgentHub-Worker.vbs");
222
222
  fs.writeFileSync(vbsPath, vbsContent);
@@ -241,26 +241,26 @@ function installMacStartup() {
241
241
  const plistDir = path.join(os.homedir(), "Library", "LaunchAgents");
242
242
  const thisDir = path.dirname(new URL(import.meta.url).pathname);
243
243
  const workerJs = path.join(thisDir, "worker.js");
244
- const plist = `<?xml version="1.0" encoding="UTF-8"?>
245
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
246
- <plist version="1.0">
247
- <dict>
248
- <key>Label</key>
249
- <string>com.agenthub.worker</string>
250
- <key>ProgramArguments</key>
251
- <array>
252
- <string>node</string>
253
- <string>${workerJs}</string>
254
- </array>
255
- <key>RunAtLoad</key>
256
- <true/>
257
- <key>KeepAlive</key>
258
- <true/>
259
- <key>StandardOutPath</key>
260
- <string>${path.join(CONFIG_DIR, "worker.log")}</string>
261
- <key>StandardErrorPath</key>
262
- <string>${path.join(CONFIG_DIR, "worker.log")}</string>
263
- </dict>
244
+ const plist = `<?xml version="1.0" encoding="UTF-8"?>
245
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
246
+ <plist version="1.0">
247
+ <dict>
248
+ <key>Label</key>
249
+ <string>com.agenthub.worker</string>
250
+ <key>ProgramArguments</key>
251
+ <array>
252
+ <string>node</string>
253
+ <string>${workerJs}</string>
254
+ </array>
255
+ <key>RunAtLoad</key>
256
+ <true/>
257
+ <key>KeepAlive</key>
258
+ <true/>
259
+ <key>StandardOutPath</key>
260
+ <string>${path.join(CONFIG_DIR, "worker.log")}</string>
261
+ <key>StandardErrorPath</key>
262
+ <string>${path.join(CONFIG_DIR, "worker.log")}</string>
263
+ </dict>
264
264
  </plist>`;
265
265
  try {
266
266
  fs.mkdirSync(plistDir, { recursive: true });
@@ -273,17 +273,17 @@ function installMacStartup() {
273
273
  function installLinuxStartup() {
274
274
  const thisDir = path.dirname(new URL(import.meta.url).pathname);
275
275
  const workerJs = path.join(thisDir, "worker.js");
276
- const serviceContent = `[Unit]
277
- Description=AgentHub Worker
278
- After=network.target
279
-
280
- [Service]
281
- ExecStart=/usr/bin/node ${workerJs}
282
- Restart=always
283
- RestartSec=10
284
-
285
- [Install]
286
- WantedBy=default.target
276
+ const serviceContent = `[Unit]
277
+ Description=AgentHub Worker
278
+ After=network.target
279
+
280
+ [Service]
281
+ ExecStart=/usr/bin/node ${workerJs}
282
+ Restart=always
283
+ RestartSec=10
284
+
285
+ [Install]
286
+ WantedBy=default.target
287
287
  `;
288
288
  const serviceDir = path.join(os.homedir(), ".config", "systemd", "user");
289
289
  try {
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=steering.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steering.test.d.ts","sourceRoot":"","sources":["../src/steering.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Steering, from the mcp-server side (add-multiplayer-sessions §4.3–§4.5).
3
+ *
4
+ * This package owns two of the three producers: the one-shot daemon (which
5
+ * declares `one_shot` so a `claude -p` shift is refused with a reason, not by
6
+ * accident) and the channel plugin (whose steer frame previously fell through
7
+ * the message handler with nothing to match it — accepted by the server and
8
+ * dropped on arrival).
9
+ *
10
+ * The channel plugin itself is an executable script, so the parts worth testing
11
+ * were put in `streamingRuntimeLib.ts`, which is importable: the frame parser and
12
+ * the framing. What is asserted here is the pair of properties that together mean
13
+ * "never accepted and dropped" — a routed steer is recognised and rendered, and
14
+ * nothing in either package declares the `channel` transport in the first place,
15
+ * so the server refuses those sessions up front.
16
+ */
17
+ import { describe, it, expect } from "vitest";
18
+ import * as fs from "fs";
19
+ import * as path from "path";
20
+ import { fileURLToPath } from "url";
21
+ import { buildTurnContent, buildSteerTurnContent, parseSteerFrame, sessionSteerEnabled, recordResultUsage, shouldRecycle, newRuntimeStats, SessionEventExtractor, SessionEventEmitter, STEER_MESSAGE_TYPE, } from "./streamingRuntimeLib.js";
22
+ const here = path.dirname(fileURLToPath(import.meta.url));
23
+ describe("§4.8 kill switch", () => {
24
+ it("is off unless explicitly enabled, so an unconfigured deployment does no steering I/O", () => {
25
+ expect(sessionSteerEnabled({})).toBe(false);
26
+ expect(sessionSteerEnabled({ AGENTHUB_SESSION_STEER_ENABLED: "" })).toBe(false);
27
+ expect(sessionSteerEnabled({ AGENTHUB_SESSION_STEER_ENABLED: "nope" })).toBe(false);
28
+ expect(sessionSteerEnabled({ AGENTHUB_SESSION_STEER_ENABLED: "1" })).toBe(true);
29
+ expect(sessionSteerEnabled({ AGENTHUB_SESSION_STEER_ENABLED: "true" })).toBe(true);
30
+ });
31
+ });
32
+ describe("§4.3 steer framing", () => {
33
+ it("frames a steer as a human instruction and never tells the model to reply", () => {
34
+ const content = buildTurnContent({
35
+ id: "st-1",
36
+ from_agent: "sumit@contetial.com",
37
+ type: STEER_MESSAGE_TYPE,
38
+ body: "Drop the migration, ship the hotfix.",
39
+ });
40
+ expect(content).toContain("steering this session");
41
+ expect(content).toContain("direct instruction from a human operator");
42
+ expect(content).toContain("Drop the migration, ship the hotfix.");
43
+ expect(content).toContain("Do NOT call mcp__agenthub__reply");
44
+ expect(content).not.toContain("Reply with mcp__agenthub__reply");
45
+ });
46
+ it("leaves the agent-to-agent inbox framing exactly as it was (regression)", () => {
47
+ const content = buildTurnContent({
48
+ id: "msg-7",
49
+ from_agent: "krishi-dev",
50
+ type: "message",
51
+ subject: "deploy window",
52
+ body: "Can we ship at 5?",
53
+ priority: "high",
54
+ });
55
+ expect(content).toBe("You received a message on AgentHub.\n" +
56
+ "From: krishi-dev\n" +
57
+ "Subject: deploy window\n" +
58
+ "Type: message | Priority: high\n\n" +
59
+ "Can we ship at 5?\n\n" +
60
+ 'Reply with mcp__agenthub__reply(message_id="msg-7", body="…"). ' +
61
+ "If this is outside your charter, escalate via send_message instead of guessing.");
62
+ });
63
+ it("does not hijack a message that merely mentions steering", () => {
64
+ const content = buildTurnContent({
65
+ id: "msg-8",
66
+ from_agent: "krishi-dev",
67
+ type: "message",
68
+ body: "who owns the steer endpoint?",
69
+ });
70
+ expect(content).toContain("You received a message on AgentHub");
71
+ });
72
+ });
73
+ describe("§4.5 channel transport — delivered, or refused; never dropped", () => {
74
+ it("recognises a session_steer frame, so a routed steer is delivered rather than ignored", () => {
75
+ const frame = parseSteerFrame({
76
+ type: "session_steer",
77
+ timestamp: "2026-07-26T00:00:00Z",
78
+ data: {
79
+ session_id: "sess-1",
80
+ steer_id: "st-1",
81
+ message_type: "steer",
82
+ text: "use the staging DB, not prod",
83
+ created_by: "user-42",
84
+ },
85
+ });
86
+ expect(frame).toEqual({
87
+ sessionId: "sess-1",
88
+ steerId: "st-1",
89
+ text: "use the staging DB, not prod",
90
+ createdBy: "user-42",
91
+ messageType: "steer",
92
+ });
93
+ });
94
+ it("renders a channel steer with the same human-instruction framing as the runtime", () => {
95
+ const frame = parseSteerFrame({
96
+ type: "session_steer",
97
+ data: { session_id: "s", steer_id: "st-1", text: "stop", created_by: "user-42" },
98
+ });
99
+ const content = buildSteerTurnContent({
100
+ id: frame.steerId,
101
+ from_agent: frame.createdBy,
102
+ type: frame.messageType,
103
+ body: frame.text,
104
+ });
105
+ expect(content).toContain("direct instruction from a human operator");
106
+ expect(content).toContain("Do NOT call mcp__agenthub__reply");
107
+ });
108
+ it("refuses to half-understand a frame: no id or no text means null, not a partial steer", () => {
109
+ const base = { type: "session_steer", data: { session_id: "s", steer_id: "st-1", text: "go" } };
110
+ expect(parseSteerFrame({ ...base, data: { ...base.data, steer_id: "" } })).toBeNull();
111
+ expect(parseSteerFrame({ ...base, data: { ...base.data, session_id: "" } })).toBeNull();
112
+ expect(parseSteerFrame({ ...base, data: { ...base.data, text: " " } })).toBeNull();
113
+ expect(parseSteerFrame({ type: "session_steer" })).toBeNull();
114
+ expect(parseSteerFrame({ type: "message", message: { id: "m" } })).toBeNull();
115
+ expect(parseSteerFrame(null)).toBeNull();
116
+ expect(parseSteerFrame("session_steer")).toBeNull();
117
+ });
118
+ it("no producer in this repo declares the `channel` transport, so those sessions stay refused", () => {
119
+ // The plugin cannot honestly declare it: `PUT /transport` needs the coding
120
+ // session's id, and an interactive session's id belongs to the capture hook,
121
+ // not to this sibling subprocess. Declaring it would mean guessing which
122
+ // session the socket belongs to — a wrong guess routes a steer at a session
123
+ // nobody is watching, which is the silent drop this rules out. The check is a
124
+ // source scan because the failure it guards is somebody later adding the
125
+ // declaration without the id, which no type can catch.
126
+ const stripComments = (src) => src.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|\s)\/\/[^\n]*/g, "$1");
127
+ const roots = [here, path.join(here, "..", "..", "employee-runtime", "src")];
128
+ const offenders = [];
129
+ for (const root of roots) {
130
+ if (!fs.existsSync(root))
131
+ continue;
132
+ for (const name of fs.readdirSync(root)) {
133
+ if (!name.endsWith(".ts") || name.endsWith(".test.ts"))
134
+ continue;
135
+ const code = stripComments(fs.readFileSync(path.join(root, name), "utf8"));
136
+ if (/transport["']?\s*[:,]\s*["']channel["']/.test(code))
137
+ offenders.push(name);
138
+ if (/declareSessionTransport\([^)]*["']channel["']/.test(code))
139
+ offenders.push(name);
140
+ }
141
+ }
142
+ expect(offenders).toEqual([]);
143
+ });
144
+ });
145
+ describe("SessionEventEmitter.onOpen — the seam the transport is declared from", () => {
146
+ it("fires once with the session id and cannot be broken by a throwing listener", async () => {
147
+ const seen = [];
148
+ const posted = [];
149
+ const emitter = new SessionEventEmitter({
150
+ enabled: true,
151
+ onOpen: (id) => {
152
+ seen.push(id);
153
+ throw new Error("declare blew up");
154
+ },
155
+ transport: {
156
+ open: async () => "sess-9",
157
+ post: async (_id, events) => void posted.push(events.length),
158
+ close: async () => { },
159
+ },
160
+ });
161
+ emitter.emit([{ event_type: "assistant_message", payload: "{}", token_count: 0 }]);
162
+ await emitter.flush();
163
+ emitter.emit([{ event_type: "assistant_message", payload: "{}", token_count: 0 }]);
164
+ await emitter.flush();
165
+ expect(seen).toEqual(["sess-9"]);
166
+ expect(posted).toEqual([1, 1]); // capture unaffected by the broken listener
167
+ });
168
+ });
169
+ describe("regression: usage accounting and the recycle decision are untouched", () => {
170
+ it("folds result usage exactly as before", () => {
171
+ const stats = newRuntimeStats();
172
+ recordResultUsage(stats, {
173
+ input_tokens: 10,
174
+ cache_read_input_tokens: 5,
175
+ cache_creation_input_tokens: 2,
176
+ output_tokens: 7,
177
+ });
178
+ expect(stats).toEqual({
179
+ turns: 1,
180
+ estInputTokens: 17,
181
+ estOutputTokens: 7,
182
+ sessionRecycles: 0,
183
+ reconnects: 0,
184
+ dedupHits: 0,
185
+ });
186
+ });
187
+ it("recycles on either threshold and not before", () => {
188
+ const opts = { maxTurns: 25, tokenBudget: 200_000 };
189
+ expect(shouldRecycle({ turns: 24, estInputTokens: 199_999 }, opts)).toBe(false);
190
+ expect(shouldRecycle({ turns: 25, estInputTokens: 0 }, opts)).toBe(true);
191
+ expect(shouldRecycle({ turns: 0, estInputTokens: 200_000 }, opts)).toBe(true);
192
+ });
193
+ it("emits no session events for a `result` message, so the usage branch sees what it always did", () => {
194
+ expect(new SessionEventExtractor().extract({ type: "result", usage: { input_tokens: 1 } })).toEqual([]);
195
+ });
196
+ });
197
+ describe("streamingRuntime.ts keeps the result/usage block textually unchanged", () => {
198
+ // The recycle accounting must not be perturbable by a steering change, so the
199
+ // turn-boundary report was added as a THIRD separate `result` branch rather
200
+ // than folded in — same discipline the capture flush already follows.
201
+ const runtime = path.join(here, "..", "..", "employee-runtime", "src", "streamingRuntime.ts");
202
+ it.skipIf(!fs.existsSync(runtime))("the usage branch is byte-for-byte the pre-steering one", () => {
203
+ const src = fs.readFileSync(runtime, "utf8").replace(/\r\n/g, "\n");
204
+ expect(src).toContain([
205
+ ' if (m?.type === "result") {',
206
+ " const u = m.usage ?? {};",
207
+ " session.turns++;",
208
+ " session.estInputTokens +=",
209
+ " (u.input_tokens ?? 0) + (u.cache_read_input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0);",
210
+ " recordResultUsage(stats, u); // cumulative counters (incl. output tokens), survives recycles",
211
+ " if (shouldRecycle({ turns: session.turns, estInputTokens: session.estInputTokens }, recycleOpts)) {",
212
+ " log(`recycle threshold reached (turns=${session.turns}, estTokens=${session.estInputTokens})`);",
213
+ " session.recycle = true;",
214
+ " stats.sessionRecycles++;",
215
+ " logUsage();",
216
+ " }",
217
+ " }",
218
+ ].join("\n"));
219
+ // and the boundary report is its own branch, not inside that block
220
+ expect(src).toContain('if (m?.type === "result") steering.turnComplete();');
221
+ });
222
+ });
223
+ //# sourceMappingURL=steering.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steering.test.js","sourceRoot":"","sources":["../src/steering.test.ts"],"names":[],"mappings":"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"}