agenthub-multiagent-mcp 1.52.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.
- package/dist/captureHookInstall.d.ts +127 -0
- package/dist/captureHookInstall.d.ts.map +1 -0
- package/dist/captureHookInstall.js +256 -0
- package/dist/captureHookInstall.js.map +1 -0
- package/dist/captureHookInstall.test.d.ts +10 -0
- package/dist/captureHookInstall.test.d.ts.map +1 -0
- package/dist/captureHookInstall.test.js +325 -0
- package/dist/captureHookInstall.test.js.map +1 -0
- package/dist/channel.js +96 -0
- package/dist/channel.js.map +1 -1
- package/dist/client.d.ts +50 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +90 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/setup-shell.js +11 -11
- package/dist/daemon.js +142 -3
- package/dist/daemon.js.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/session-capture.sh +410 -0
- package/dist/sessionCapture.d.ts +163 -0
- package/dist/sessionCapture.d.ts.map +1 -0
- package/dist/sessionCapture.js +279 -0
- package/dist/sessionCapture.js.map +1 -0
- package/dist/sessionCapture.test.d.ts +9 -0
- package/dist/sessionCapture.test.d.ts.map +1 -0
- package/dist/sessionCapture.test.js +366 -0
- package/dist/sessionCapture.test.js.map +1 -0
- package/dist/sessionCaptureScript.test.d.ts +16 -0
- package/dist/sessionCaptureScript.test.d.ts.map +1 -0
- package/dist/sessionCaptureScript.test.js +92 -0
- package/dist/sessionCaptureScript.test.js.map +1 -0
- package/dist/steering.test.d.ts +2 -0
- package/dist/steering.test.d.ts.map +1 -0
- package/dist/steering.test.js +223 -0
- package/dist/steering.test.js.map +1 -0
- package/dist/streamingRuntimeLib.d.ts +260 -1
- package/dist/streamingRuntimeLib.d.ts.map +1 -1
- package/dist/streamingRuntimeLib.js +474 -1
- package/dist/streamingRuntimeLib.js.map +1 -1
- package/dist/streamingRuntimeLib.test.js +87 -1
- package/dist/streamingRuntimeLib.test.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/sessionControl.d.ts +53 -0
- package/dist/tools/sessionControl.d.ts.map +1 -0
- package/dist/tools/sessionControl.js +265 -0
- package/dist/tools/sessionControl.js.map +1 -0
- package/dist/tools/sessionControl.test.d.ts +14 -0
- package/dist/tools/sessionControl.test.d.ts.map +1 -0
- package/dist/tools/sessionControl.test.js +298 -0
- package/dist/tools/sessionControl.test.js.map +1 -0
- package/dist/tools/tools.test.js +4 -2
- package/dist/tools/tools.test.js.map +1 -1
- package/native/agenthub-memvid/agenthub-memvid.linux-x64-gnu.node +0 -0
- package/package.json +2 -2
- package/skills/commands/start-session.md +77 -77
- package/skills/skills/deploy-staging/SKILL.md +164 -164
- package/skills/skills/deploy-vps-openclaw/SKILL.md +97 -97
- package/skills/skills/karpathy-guidelines/SKILL.md +67 -67
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* add-multiplayer-sessions §3.2/§3.3/§3.4 — consent-gated install of the
|
|
3
|
+
* interactive capture hook.
|
|
4
|
+
*
|
|
5
|
+
* The load-bearing assertions here are the negative ones: with no consent, or
|
|
6
|
+
* with a consent lookup that failed, nothing is written to the user's machine
|
|
7
|
+
* that could cause their session to be recorded.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from "vitest";
|
|
10
|
+
import * as path from "path";
|
|
11
|
+
import { applyCaptureConsent, captureApiRoot, captureStateDir, fetchCaptureConsent, installCaptureHook, removeCaptureHook, } from "./captureHookInstall.js";
|
|
12
|
+
import { CAPTURE_HOOK_MARKER } from "./sessionCapture.js";
|
|
13
|
+
/** In-memory filesystem so the tests never touch a real ~/.claude. */
|
|
14
|
+
function fakeFs(seed = {}) {
|
|
15
|
+
const files = new Map(Object.entries(seed));
|
|
16
|
+
const dirs = new Set();
|
|
17
|
+
const removedDirs = [];
|
|
18
|
+
const modes = new Map();
|
|
19
|
+
const deps = {
|
|
20
|
+
exists: (p) => files.has(p),
|
|
21
|
+
readFile: (p) => {
|
|
22
|
+
const v = files.get(p);
|
|
23
|
+
if (v === undefined)
|
|
24
|
+
throw new Error("ENOENT " + p);
|
|
25
|
+
return v;
|
|
26
|
+
},
|
|
27
|
+
writeFile: (p, d) => void files.set(p, d),
|
|
28
|
+
mkdir: (p) => void dirs.add(p),
|
|
29
|
+
removeFile: (p) => void files.delete(p),
|
|
30
|
+
removeDir: (p) => void removedDirs.push(p),
|
|
31
|
+
chmod: (p, m) => void modes.set(p, m),
|
|
32
|
+
now: () => new Date("2026-07-26T00:00:00.000Z"),
|
|
33
|
+
};
|
|
34
|
+
return { files, dirs, removedDirs, modes, deps };
|
|
35
|
+
}
|
|
36
|
+
const SETTINGS = "/home/alice/.claude/settings.json";
|
|
37
|
+
const GRANT = "/home/alice/.claude/agenthub-capture.json";
|
|
38
|
+
function opts(over = {}) {
|
|
39
|
+
return {
|
|
40
|
+
settingsPath: SETTINGS,
|
|
41
|
+
grantPath: GRANT,
|
|
42
|
+
hookScript: "/opt/mcp/dist/session-capture.sh",
|
|
43
|
+
apiRoot: "https://agenthub.example.com",
|
|
44
|
+
userId: "user-alice",
|
|
45
|
+
agentId: "agent-alice",
|
|
46
|
+
connectToken: "rt-alice",
|
|
47
|
+
...over,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
describe("captureApiRoot", () => {
|
|
51
|
+
it("strips the client's /api suffix so the hook does not build /api/api", () => {
|
|
52
|
+
expect(captureApiRoot("https://agenthub.example.com/api")).toBe("https://agenthub.example.com");
|
|
53
|
+
expect(captureApiRoot("https://agenthub.example.com/api/")).toBe("https://agenthub.example.com");
|
|
54
|
+
});
|
|
55
|
+
it("leaves a root that has no /api alone", () => {
|
|
56
|
+
expect(captureApiRoot("https://agenthub.example.com")).toBe("https://agenthub.example.com");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("applyCaptureConsent — consent absent", () => {
|
|
60
|
+
it("writes nothing at all for a user who has not consented", () => {
|
|
61
|
+
const fs = fakeFs();
|
|
62
|
+
const status = applyCaptureConsent(false, opts(), fs.deps);
|
|
63
|
+
expect(fs.files.has(GRANT)).toBe(false);
|
|
64
|
+
expect(fs.files.has(SETTINGS)).toBe(false);
|
|
65
|
+
expect(status).toMatch(/not consented/);
|
|
66
|
+
});
|
|
67
|
+
it("removes a grant and deregisters the hook when consent is withdrawn", () => {
|
|
68
|
+
const existing = {
|
|
69
|
+
hooks: {
|
|
70
|
+
PostToolUse: [
|
|
71
|
+
{ matcher: "", hooks: [{ type: "command", command: `bash "/opt/mcp/${CAPTURE_HOOK_MARKER}"` }] },
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
const fs = fakeFs({
|
|
76
|
+
[SETTINGS]: JSON.stringify(existing),
|
|
77
|
+
[GRANT]: JSON.stringify({ connect_token: "rt-alice" }),
|
|
78
|
+
});
|
|
79
|
+
applyCaptureConsent(false, opts(), fs.deps);
|
|
80
|
+
expect(fs.files.has(GRANT)).toBe(false);
|
|
81
|
+
const after = JSON.parse(fs.files.get(SETTINGS));
|
|
82
|
+
expect(after.hooks.PostToolUse).toEqual([]);
|
|
83
|
+
// The per-session bootstrap cache goes too, so a stale session id cannot
|
|
84
|
+
// be reused if consent is granted again later.
|
|
85
|
+
expect(fs.removedDirs).toContain(captureStateDir(GRANT));
|
|
86
|
+
});
|
|
87
|
+
it("leaves the user's other hooks untouched while removing ours", () => {
|
|
88
|
+
const existing = {
|
|
89
|
+
model: "opus",
|
|
90
|
+
hooks: {
|
|
91
|
+
SessionStart: [{ hooks: [{ type: "command", command: "node inboxHookCli.js" }] }],
|
|
92
|
+
PostToolUse: [
|
|
93
|
+
{ matcher: "", hooks: [{ type: "command", command: "node activityHookCli.js" }] },
|
|
94
|
+
{ matcher: "", hooks: [{ type: "command", command: `bash "/opt/${CAPTURE_HOOK_MARKER}"` }] },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
const fs = fakeFs({ [SETTINGS]: JSON.stringify(existing) });
|
|
99
|
+
applyCaptureConsent(false, opts(), fs.deps);
|
|
100
|
+
const after = JSON.parse(fs.files.get(SETTINGS));
|
|
101
|
+
expect(after.model).toBe("opus");
|
|
102
|
+
expect(after.hooks.SessionStart).toHaveLength(1);
|
|
103
|
+
expect(after.hooks.PostToolUse).toHaveLength(1);
|
|
104
|
+
expect(after.hooks.PostToolUse[0].hooks[0].command).toContain("activityHookCli");
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe("applyCaptureConsent — consent given", () => {
|
|
108
|
+
it("writes the grant and registers the hook", () => {
|
|
109
|
+
const fs = fakeFs();
|
|
110
|
+
const status = applyCaptureConsent(true, opts(), fs.deps);
|
|
111
|
+
const grant = JSON.parse(fs.files.get(GRANT));
|
|
112
|
+
expect(grant.api_url).toBe("https://agenthub.example.com");
|
|
113
|
+
expect(grant.connect_token).toBe("rt-alice");
|
|
114
|
+
expect(grant.user_id).toBe("user-alice");
|
|
115
|
+
expect(grant.notice_interval_sec).toBeGreaterThan(0);
|
|
116
|
+
const settings = JSON.parse(fs.files.get(SETTINGS));
|
|
117
|
+
expect(settings.hooks.PostToolUse[0].hooks[0].command).toContain(CAPTURE_HOOK_MARKER);
|
|
118
|
+
expect(status).toMatch(/consented/);
|
|
119
|
+
});
|
|
120
|
+
it("writes the grant owner-only — it carries a credential", () => {
|
|
121
|
+
const fs = fakeFs();
|
|
122
|
+
applyCaptureConsent(true, opts(), fs.deps);
|
|
123
|
+
expect(fs.modes.get(GRANT)).toBe(0o600);
|
|
124
|
+
});
|
|
125
|
+
// The required test: the merge must not be a rewrite.
|
|
126
|
+
it("preserves an existing user hook configuration", () => {
|
|
127
|
+
const existing = {
|
|
128
|
+
permissions: { allow: ["Bash(npm run test)"] },
|
|
129
|
+
hooks: {
|
|
130
|
+
SessionStart: [{ hooks: [{ type: "command", command: "node inboxHookCli.js" }] }],
|
|
131
|
+
PostToolUse: [{ matcher: "Edit", hooks: [{ type: "command", command: "node activityHookCli.js" }] }],
|
|
132
|
+
Stop: [{ hooks: [{ type: "command", command: "say done" }] }],
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
const fs = fakeFs({ [SETTINGS]: JSON.stringify(existing) });
|
|
136
|
+
applyCaptureConsent(true, opts(), fs.deps);
|
|
137
|
+
const after = JSON.parse(fs.files.get(SETTINGS));
|
|
138
|
+
expect(after.permissions).toEqual(existing.permissions);
|
|
139
|
+
expect(after.hooks.SessionStart).toEqual(existing.hooks.SessionStart);
|
|
140
|
+
expect(after.hooks.Stop).toEqual(existing.hooks.Stop);
|
|
141
|
+
// The pre-existing PostToolUse entry survives verbatim, alongside ours.
|
|
142
|
+
expect(after.hooks.PostToolUse).toHaveLength(2);
|
|
143
|
+
expect(after.hooks.PostToolUse[0]).toEqual(existing.hooks.PostToolUse[0]);
|
|
144
|
+
expect(after.hooks.PostToolUse[1].hooks[0].command).toContain(CAPTURE_HOOK_MARKER);
|
|
145
|
+
});
|
|
146
|
+
it("is idempotent — a second run does not duplicate the hook entry", () => {
|
|
147
|
+
const fs = fakeFs();
|
|
148
|
+
applyCaptureConsent(true, opts(), fs.deps);
|
|
149
|
+
applyCaptureConsent(true, opts(), fs.deps);
|
|
150
|
+
const after = JSON.parse(fs.files.get(SETTINGS));
|
|
151
|
+
expect(after.hooks.PostToolUse).toHaveLength(1);
|
|
152
|
+
});
|
|
153
|
+
it("refuses to install without a credential rather than writing an inert grant", () => {
|
|
154
|
+
const fs = fakeFs();
|
|
155
|
+
const status = applyCaptureConsent(true, opts({ connectToken: "" }), fs.deps);
|
|
156
|
+
expect(fs.files.has(GRANT)).toBe(false);
|
|
157
|
+
expect(fs.files.has(SETTINGS)).toBe(false);
|
|
158
|
+
expect(status).toMatch(/no connect token/);
|
|
159
|
+
});
|
|
160
|
+
it("refuses to install when the hook script cannot be found", () => {
|
|
161
|
+
const fs = fakeFs();
|
|
162
|
+
const status = applyCaptureConsent(true, opts({ hookScript: null }), fs.deps);
|
|
163
|
+
expect(fs.files.has(GRANT)).toBe(false);
|
|
164
|
+
expect(status).toMatch(/not found/);
|
|
165
|
+
});
|
|
166
|
+
it("never rewrites a settings file it cannot parse", () => {
|
|
167
|
+
const fs = fakeFs({ [SETTINGS]: "{ this is not json" });
|
|
168
|
+
const status = applyCaptureConsent(true, opts(), fs.deps);
|
|
169
|
+
expect(fs.files.get(SETTINGS)).toBe("{ this is not json");
|
|
170
|
+
expect(fs.files.has(GRANT)).toBe(false);
|
|
171
|
+
expect(status).toMatch(/not valid JSON/);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe("removeCaptureHook", () => {
|
|
175
|
+
it("keeps an entry that also carries a hook we did not install", () => {
|
|
176
|
+
const base = {
|
|
177
|
+
hooks: {
|
|
178
|
+
PostToolUse: [
|
|
179
|
+
{
|
|
180
|
+
matcher: "",
|
|
181
|
+
hooks: [
|
|
182
|
+
{ type: "command", command: "node activityHookCli.js" },
|
|
183
|
+
{ type: "command", command: `bash "${CAPTURE_HOOK_MARKER}"` },
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
const after = removeCaptureHook(base);
|
|
190
|
+
expect(after.hooks.PostToolUse).toHaveLength(1);
|
|
191
|
+
expect(after.hooks.PostToolUse[0].hooks).toHaveLength(1);
|
|
192
|
+
});
|
|
193
|
+
it("does not mutate the input", () => {
|
|
194
|
+
const base = {
|
|
195
|
+
hooks: { PostToolUse: [{ hooks: [{ type: "command", command: CAPTURE_HOOK_MARKER }] }] },
|
|
196
|
+
};
|
|
197
|
+
const snapshot = JSON.stringify(base);
|
|
198
|
+
removeCaptureHook(base);
|
|
199
|
+
expect(JSON.stringify(base)).toBe(snapshot);
|
|
200
|
+
});
|
|
201
|
+
it("is a no-op on settings that never had the hook", () => {
|
|
202
|
+
const base = { hooks: { SessionStart: [{ hooks: [{ type: "command", command: "x" }] }] } };
|
|
203
|
+
expect(removeCaptureHook(base)).toEqual(base);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe("fetchCaptureConsent", () => {
|
|
207
|
+
const okResponse = (consented, streaming = true) => async () => ({
|
|
208
|
+
ok: true,
|
|
209
|
+
status: 200,
|
|
210
|
+
json: async () => ({
|
|
211
|
+
consent: { consented, user_id: "user-alice" },
|
|
212
|
+
streaming_enabled: streaming,
|
|
213
|
+
}),
|
|
214
|
+
});
|
|
215
|
+
it("reports consent when the server grants it", async () => {
|
|
216
|
+
const got = await fetchCaptureConsent("https://x/api", "rt", okResponse(true));
|
|
217
|
+
expect(got).toEqual({ consented: true, userId: "user-alice", streamingEnabled: true });
|
|
218
|
+
});
|
|
219
|
+
it("reports the absence of consent as such, not as an error", async () => {
|
|
220
|
+
const got = await fetchCaptureConsent("https://x/api", "rt", okResponse(false));
|
|
221
|
+
expect(got?.consented).toBe(false);
|
|
222
|
+
});
|
|
223
|
+
it("returns null (⇒ do not capture) when the server refuses", async () => {
|
|
224
|
+
const f = async () => ({ ok: false, status: 401, json: async () => ({}) });
|
|
225
|
+
expect(await fetchCaptureConsent("https://x/api", "rt", f)).toBeNull();
|
|
226
|
+
});
|
|
227
|
+
it("returns null (⇒ do not capture) when the server is unreachable", async () => {
|
|
228
|
+
const f = async () => {
|
|
229
|
+
throw new Error("ECONNREFUSED");
|
|
230
|
+
};
|
|
231
|
+
expect(await fetchCaptureConsent("https://x/api", "rt", f)).toBeNull();
|
|
232
|
+
});
|
|
233
|
+
it("does not even ask without a credential", async () => {
|
|
234
|
+
let called = false;
|
|
235
|
+
const f = async () => {
|
|
236
|
+
called = true;
|
|
237
|
+
return { ok: true, status: 200, json: async () => ({}) };
|
|
238
|
+
};
|
|
239
|
+
expect(await fetchCaptureConsent("https://x/api", "", f)).toBeNull();
|
|
240
|
+
expect(called).toBe(false);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe("installCaptureHook — end to end", () => {
|
|
244
|
+
const base = {
|
|
245
|
+
clientBaseUrl: "https://agenthub.example.com/api",
|
|
246
|
+
connectToken: "rt-alice",
|
|
247
|
+
agentId: "agent-alice",
|
|
248
|
+
homeDir: "/home/alice",
|
|
249
|
+
moduleDir: "/opt/mcp/dist",
|
|
250
|
+
};
|
|
251
|
+
// installCaptureHook builds these with path.join, so the tests must too —
|
|
252
|
+
// otherwise they only pass on POSIX.
|
|
253
|
+
const grantPath = path.join(base.homeDir, ".claude", "agenthub-capture.json");
|
|
254
|
+
const settingsPath = path.join(base.homeDir, ".claude", "settings.json");
|
|
255
|
+
function withScript(seed = {}) {
|
|
256
|
+
const fs = fakeFs(seed);
|
|
257
|
+
// resolveCaptureHookScript probes the filesystem through the same `exists`.
|
|
258
|
+
fs.files.set(path.join(base.moduleDir, "session-capture.sh"), "#!/bin/bash");
|
|
259
|
+
return fs;
|
|
260
|
+
}
|
|
261
|
+
it("§3.4 — a server that says 'not consented' leaves the machine clean", async () => {
|
|
262
|
+
const fs = withScript();
|
|
263
|
+
const f = async () => ({
|
|
264
|
+
ok: true,
|
|
265
|
+
status: 200,
|
|
266
|
+
json: async () => ({ consent: { consented: false, user_id: "user-alice" }, streaming_enabled: true }),
|
|
267
|
+
});
|
|
268
|
+
await installCaptureHook({ ...base, fetchImpl: f, deps: fs.deps });
|
|
269
|
+
expect(fs.files.has(grantPath)).toBe(false);
|
|
270
|
+
expect(fs.files.has(settingsPath)).toBe(false);
|
|
271
|
+
});
|
|
272
|
+
it("fails closed — an unreachable server installs nothing", async () => {
|
|
273
|
+
const fs = withScript();
|
|
274
|
+
const f = async () => {
|
|
275
|
+
throw new Error("network down");
|
|
276
|
+
};
|
|
277
|
+
const status = await installCaptureHook({ ...base, fetchImpl: f, deps: fs.deps });
|
|
278
|
+
expect(fs.files.has(grantPath)).toBe(false);
|
|
279
|
+
expect(status).toMatch(/could not be confirmed/);
|
|
280
|
+
});
|
|
281
|
+
it("installs when the server confirms consent", async () => {
|
|
282
|
+
const fs = withScript();
|
|
283
|
+
const f = async () => ({
|
|
284
|
+
ok: true,
|
|
285
|
+
status: 200,
|
|
286
|
+
json: async () => ({ consent: { consented: true, user_id: "user-alice" }, streaming_enabled: true }),
|
|
287
|
+
});
|
|
288
|
+
await installCaptureHook({ ...base, fetchImpl: f, deps: fs.deps });
|
|
289
|
+
const grant = JSON.parse(fs.files.get(grantPath));
|
|
290
|
+
expect(grant.api_url).toBe("https://agenthub.example.com");
|
|
291
|
+
expect(grant.user_id).toBe("user-alice");
|
|
292
|
+
const settings = JSON.parse(fs.files.get(settingsPath));
|
|
293
|
+
expect(settings.hooks.PostToolUse[0].hooks[0].command).toContain(CAPTURE_HOOK_MARKER);
|
|
294
|
+
});
|
|
295
|
+
it("says so when consent is given but the server-side switch is off", async () => {
|
|
296
|
+
const fs = withScript();
|
|
297
|
+
const f = async () => ({
|
|
298
|
+
ok: true,
|
|
299
|
+
status: 200,
|
|
300
|
+
json: async () => ({ consent: { consented: true, user_id: "user-alice" }, streaming_enabled: false }),
|
|
301
|
+
});
|
|
302
|
+
const status = await installCaptureHook({ ...base, fetchImpl: f, deps: fs.deps });
|
|
303
|
+
expect(status).toMatch(/streaming is disabled/);
|
|
304
|
+
});
|
|
305
|
+
it("propagates a revocation: a previously installed hook and grant are removed", async () => {
|
|
306
|
+
const fs = withScript({
|
|
307
|
+
[settingsPath]: JSON.stringify({
|
|
308
|
+
hooks: {
|
|
309
|
+
PostToolUse: [{ matcher: "", hooks: [{ type: "command", command: `bash "${CAPTURE_HOOK_MARKER}"` }] }],
|
|
310
|
+
},
|
|
311
|
+
}),
|
|
312
|
+
[grantPath]: JSON.stringify({ connect_token: "rt-alice" }),
|
|
313
|
+
});
|
|
314
|
+
const f = async () => ({
|
|
315
|
+
ok: true,
|
|
316
|
+
status: 200,
|
|
317
|
+
json: async () => ({ consent: { consented: false, user_id: "user-alice" }, streaming_enabled: true }),
|
|
318
|
+
});
|
|
319
|
+
await installCaptureHook({ ...base, fetchImpl: f, deps: fs.deps });
|
|
320
|
+
expect(fs.files.has(grantPath)).toBe(false);
|
|
321
|
+
const settings = JSON.parse(fs.files.get(settingsPath));
|
|
322
|
+
expect(settings.hooks.PostToolUse).toEqual([]);
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
//# sourceMappingURL=captureHookInstall.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captureHookInstall.test.js","sourceRoot":"","sources":["../src/captureHookInstall.test.ts"],"names":[],"mappings":"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"}
|
package/dist/channel.js
CHANGED
|
@@ -20,6 +20,8 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
|
20
20
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
21
21
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
22
22
|
import WebSocket from "ws";
|
|
23
|
+
import { buildSteerTurnContent, parseSteerFrame, sessionSteerEnabled } from "./streamingRuntimeLib.js";
|
|
24
|
+
import * as state from "./state.js";
|
|
23
25
|
// =============================================================================
|
|
24
26
|
// Config
|
|
25
27
|
// =============================================================================
|
|
@@ -134,6 +136,93 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
134
136
|
return { content: [{ type: "text", text: `Unknown tool: ${name}` }] };
|
|
135
137
|
});
|
|
136
138
|
// =============================================================================
|
|
139
|
+
// Human steering over the channel (add-multiplayer-sessions §4.5)
|
|
140
|
+
// =============================================================================
|
|
141
|
+
//
|
|
142
|
+
// DELIVERY IS IMPLEMENTED HERE; THE DECLARATION IS DELIBERATELY NOT.
|
|
143
|
+
//
|
|
144
|
+
// The server refuses a steer for any session whose runtime has not declared a
|
|
145
|
+
// transport, so the question §4.5 asks of this plugin is: if a steer ever *is*
|
|
146
|
+
// routed here, does it land, or is it accepted and silently dropped? Before this
|
|
147
|
+
// branch existed the answer was "dropped" — the frame arrived on the socket and
|
|
148
|
+
// fell through the message handler with nothing to match it.
|
|
149
|
+
//
|
|
150
|
+
// The declaration is a separate matter, and this plugin genuinely cannot make
|
|
151
|
+
// it. `PUT /api/sessions/{id}/transport` needs the id of the coding session the
|
|
152
|
+
// steer is aimed at, and this process does not have one: an interactive Claude
|
|
153
|
+
// Code session is captured by the `session-capture.sh` hook, which owns
|
|
154
|
+
// `AGENTHUB_SESSION_ID`, and the plugin is a sibling subprocess with no view of
|
|
155
|
+
// it. Declaring `channel` from here would mean guessing which session this
|
|
156
|
+
// socket belongs to, and a wrong guess is a steer routed to a session nobody is
|
|
157
|
+
// watching — the same silent drop wearing the transport contract's clothes.
|
|
158
|
+
//
|
|
159
|
+
// So: nothing in this repository declares `channel`, interactive sessions stay
|
|
160
|
+
// non-injectable, and a human aiming a steer at one gets the server's 409 naming
|
|
161
|
+
// the transport rather than a 202 that lies. When the declaration is wired up
|
|
162
|
+
// (it needs the capture hook, which is outside this change's file ownership),
|
|
163
|
+
// the delivery half is already correct and tested.
|
|
164
|
+
/** Ack a channel-delivered steer (§4.4). Best-effort; see the note on identity. */
|
|
165
|
+
async function markSteerApplied(frame) {
|
|
166
|
+
// The endpoint refuses a caller it cannot name — an org API key identifies a
|
|
167
|
+
// deployment, not a person, and every steer action is audited with an acting
|
|
168
|
+
// identity. The connect token lives in the workspace's `.agenthub/state`, the
|
|
169
|
+
// same place the MCP client reads it from.
|
|
170
|
+
const connectToken = state.loadState(process.cwd())?.token;
|
|
171
|
+
if (!connectToken)
|
|
172
|
+
return; // the steer stays `pending`, which is honest: nothing acked it
|
|
173
|
+
try {
|
|
174
|
+
await fetch(`${API_URL}/api/sessions/${encodeURIComponent(frame.sessionId)}/steers/${encodeURIComponent(frame.steerId)}/applied`, {
|
|
175
|
+
method: "POST",
|
|
176
|
+
headers: {
|
|
177
|
+
"Content-Type": "application/json",
|
|
178
|
+
"X-API-Key": API_KEY,
|
|
179
|
+
"X-Connect-Token": connectToken,
|
|
180
|
+
},
|
|
181
|
+
body: "{}",
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// A failed ack leaves the steer `pending` — the model still saw it, and the
|
|
186
|
+
// display under-reports rather than over-reports. Never fatal to the plugin.
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Deliver a steer into the live session as a channel notification.
|
|
191
|
+
*
|
|
192
|
+
* Emitting the notification *is* consumption for this transport: the frame
|
|
193
|
+
* becomes a new turn the model sees, and there is no later moment at which the
|
|
194
|
+
* plugin learns whether it was acted on. So the ack follows a successful emit and
|
|
195
|
+
* nothing else — an ack before it would claim delivery that had not happened.
|
|
196
|
+
*/
|
|
197
|
+
async function handleSteerFrame(msg) {
|
|
198
|
+
if (!sessionSteerEnabled())
|
|
199
|
+
return;
|
|
200
|
+
const frame = parseSteerFrame(msg);
|
|
201
|
+
if (!frame)
|
|
202
|
+
return;
|
|
203
|
+
// Same framing function the streaming runtime uses (§4.3): a human instruction,
|
|
204
|
+
// with no suggestion of replying via agenthub_reply.
|
|
205
|
+
await server.notification({
|
|
206
|
+
method: "notifications/claude/channel",
|
|
207
|
+
params: {
|
|
208
|
+
content: buildSteerTurnContent({
|
|
209
|
+
id: frame.steerId,
|
|
210
|
+
from_agent: frame.createdBy,
|
|
211
|
+
type: frame.messageType,
|
|
212
|
+
body: frame.text,
|
|
213
|
+
}),
|
|
214
|
+
meta: {
|
|
215
|
+
source: "agenthub",
|
|
216
|
+
type: "session_steer",
|
|
217
|
+
session_id: frame.sessionId,
|
|
218
|
+
steer_id: frame.steerId,
|
|
219
|
+
from: frame.createdBy,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
await markSteerApplied(frame);
|
|
224
|
+
}
|
|
225
|
+
// =============================================================================
|
|
137
226
|
// WebSocket: connect to AgentHub and emit channel notifications
|
|
138
227
|
// =============================================================================
|
|
139
228
|
let ws = null;
|
|
@@ -180,6 +269,13 @@ function connectWebSocket() {
|
|
|
180
269
|
},
|
|
181
270
|
});
|
|
182
271
|
}
|
|
272
|
+
// add-multiplayer-sessions §4.5 — a human steering this session. Handled
|
|
273
|
+
// rather than falling through, which is what "never accepted and dropped"
|
|
274
|
+
// means on the receiving end.
|
|
275
|
+
if (msg.type === "session_steer") {
|
|
276
|
+
await handleSteerFrame(msg);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
183
279
|
if (msg.type === "task" && msg.task) {
|
|
184
280
|
const t = msg.task;
|
|
185
281
|
await server.notification({
|
package/dist/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,SAAS,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -167,6 +167,32 @@ export declare function filenameFromContentDisposition(header: string | null): s
|
|
|
167
167
|
* ownership §7.1). Non-lifecycle errors pass through unchanged.
|
|
168
168
|
*/
|
|
169
169
|
export declare function authLifecycleHint(status: number, code: string, message: string): string;
|
|
170
|
+
/**
|
|
171
|
+
* Result of a session steer/control call (add-multiplayer-sessions).
|
|
172
|
+
*
|
|
173
|
+
* Deliberately non-throwing: these endpoints answer with expected 4xx/503
|
|
174
|
+
* codes (`session_not_injectable`, `session_already_claimed`,
|
|
175
|
+
* `session_steer_disabled`) that a tool must be able to relay verbatim rather
|
|
176
|
+
* than collapse into an exception message.
|
|
177
|
+
*/
|
|
178
|
+
export type SessionControlResult = {
|
|
179
|
+
ok: true;
|
|
180
|
+
status: number;
|
|
181
|
+
data: Record<string, unknown>;
|
|
182
|
+
} | {
|
|
183
|
+
ok: false;
|
|
184
|
+
status: number;
|
|
185
|
+
/** Server `error` code, or `http_<status>` when the body carried none. */
|
|
186
|
+
error: string;
|
|
187
|
+
/** Server `message`, when present. */
|
|
188
|
+
message?: string;
|
|
189
|
+
/** Server `reason` — why a session cannot be steered. */
|
|
190
|
+
reason?: string;
|
|
191
|
+
/** Server `holder` — who currently holds the claim. */
|
|
192
|
+
holder?: string;
|
|
193
|
+
/** Set when the error body was not JSON; carries the status + a snippet. */
|
|
194
|
+
detail?: string;
|
|
195
|
+
};
|
|
170
196
|
export declare class ApiClient {
|
|
171
197
|
private baseUrl;
|
|
172
198
|
private apiKey;
|
|
@@ -1151,5 +1177,29 @@ export declare class ApiClient {
|
|
|
1151
1177
|
request_id?: string;
|
|
1152
1178
|
status?: string;
|
|
1153
1179
|
}>;
|
|
1180
|
+
private sessionControlHeaders;
|
|
1181
|
+
/**
|
|
1182
|
+
* Issue a session-control request and return a structured result.
|
|
1183
|
+
*
|
|
1184
|
+
* Never throws on an HTTP status. Parses the body defensively and *always*
|
|
1185
|
+
* carries the HTTP status forward: an empty body (chi's bare 405 for an
|
|
1186
|
+
* unmatched method) or an HTML body (a proxy error page) must not degrade
|
|
1187
|
+
* into an opaque JSON parse error the way `request()` once did before
|
|
1188
|
+
* fix-mcp-nonjson-error-handling. Status first, parse second.
|
|
1189
|
+
*/
|
|
1190
|
+
private sessionControlFetch;
|
|
1191
|
+
/**
|
|
1192
|
+
* Inject a human instruction into a live session.
|
|
1193
|
+
* `sessionId` may be a UUID or a display number (`s-YYYYMMDD-NNN`).
|
|
1194
|
+
*/
|
|
1195
|
+
steerSession(sessionId: string, text: string): Promise<SessionControlResult>;
|
|
1196
|
+
/** List recorded steers for a session with their pending/applied status. */
|
|
1197
|
+
listSessionSteers(sessionId: string): Promise<SessionControlResult>;
|
|
1198
|
+
/** Read the session's control state (agent_driven | draining | human_driven). */
|
|
1199
|
+
getSessionControl(sessionId: string): Promise<SessionControlResult>;
|
|
1200
|
+
/** Claim exclusive (leased) control of a live session. */
|
|
1201
|
+
claimSession(sessionId: string): Promise<SessionControlResult>;
|
|
1202
|
+
/** Hand control of a session back to the agent. */
|
|
1203
|
+
releaseSession(sessionId: string): Promise<SessionControlResult>;
|
|
1154
1204
|
}
|
|
1155
1205
|
//# sourceMappingURL=client.d.ts.map
|