agenthub-multiagent-mcp 1.74.0 → 1.76.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 (107) hide show
  1. package/dist/client.d.ts +37 -3
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +39 -1
  4. package/dist/client.js.map +1 -1
  5. package/dist/commands/setup-shell.js +11 -11
  6. package/dist/employee.d.ts +11 -0
  7. package/dist/employee.d.ts.map +1 -1
  8. package/dist/employee.js +64 -1
  9. package/dist/employee.js.map +1 -1
  10. package/dist/employee.test.js +88 -1
  11. package/dist/employee.test.js.map +1 -1
  12. package/dist/goshtiChannel/client.d.ts +9 -0
  13. package/dist/goshtiChannel/client.d.ts.map +1 -0
  14. package/dist/goshtiChannel/client.js +63 -0
  15. package/dist/goshtiChannel/client.js.map +1 -0
  16. package/dist/goshtiChannel/config.d.ts +42 -0
  17. package/dist/goshtiChannel/config.d.ts.map +1 -0
  18. package/dist/goshtiChannel/config.js +129 -0
  19. package/dist/goshtiChannel/config.js.map +1 -0
  20. package/dist/goshtiChannel/config.test.d.ts +2 -0
  21. package/dist/goshtiChannel/config.test.d.ts.map +1 -0
  22. package/dist/goshtiChannel/config.test.js +73 -0
  23. package/dist/goshtiChannel/config.test.js.map +1 -0
  24. package/dist/goshtiChannel/core.d.ts +63 -0
  25. package/dist/goshtiChannel/core.d.ts.map +1 -0
  26. package/dist/goshtiChannel/core.js +237 -0
  27. package/dist/goshtiChannel/core.js.map +1 -0
  28. package/dist/goshtiChannel/core.test.d.ts +2 -0
  29. package/dist/goshtiChannel/core.test.d.ts.map +1 -0
  30. package/dist/goshtiChannel/core.test.js +250 -0
  31. package/dist/goshtiChannel/core.test.js.map +1 -0
  32. package/dist/goshtiChannel/credential.d.ts +29 -0
  33. package/dist/goshtiChannel/credential.d.ts.map +1 -0
  34. package/dist/goshtiChannel/credential.js +160 -0
  35. package/dist/goshtiChannel/credential.js.map +1 -0
  36. package/dist/goshtiChannel/credential.test.d.ts +2 -0
  37. package/dist/goshtiChannel/credential.test.d.ts.map +1 -0
  38. package/dist/goshtiChannel/credential.test.js +127 -0
  39. package/dist/goshtiChannel/credential.test.js.map +1 -0
  40. package/dist/goshtiChannel/e2e.test.d.ts +2 -0
  41. package/dist/goshtiChannel/e2e.test.d.ts.map +1 -0
  42. package/dist/goshtiChannel/e2e.test.js +163 -0
  43. package/dist/goshtiChannel/e2e.test.js.map +1 -0
  44. package/dist/goshtiChannel/policy.d.ts +154 -0
  45. package/dist/goshtiChannel/policy.d.ts.map +1 -0
  46. package/dist/goshtiChannel/policy.js +240 -0
  47. package/dist/goshtiChannel/policy.js.map +1 -0
  48. package/dist/goshtiChannel/policy.test.d.ts +2 -0
  49. package/dist/goshtiChannel/policy.test.d.ts.map +1 -0
  50. package/dist/goshtiChannel/policy.test.js +263 -0
  51. package/dist/goshtiChannel/policy.test.js.map +1 -0
  52. package/dist/goshtiChannel/setup.d.ts +15 -0
  53. package/dist/goshtiChannel/setup.d.ts.map +1 -0
  54. package/dist/goshtiChannel/setup.js +125 -0
  55. package/dist/goshtiChannel/setup.js.map +1 -0
  56. package/dist/goshtiChannel/setup.test.d.ts +2 -0
  57. package/dist/goshtiChannel/setup.test.d.ts.map +1 -0
  58. package/dist/goshtiChannel/setup.test.js +96 -0
  59. package/dist/goshtiChannel/setup.test.js.map +1 -0
  60. package/dist/goshtiChannel/stream.d.ts +39 -0
  61. package/dist/goshtiChannel/stream.d.ts.map +1 -0
  62. package/dist/goshtiChannel/stream.js +174 -0
  63. package/dist/goshtiChannel/stream.js.map +1 -0
  64. package/dist/goshtiChannel/stream.test.d.ts +2 -0
  65. package/dist/goshtiChannel/stream.test.d.ts.map +1 -0
  66. package/dist/goshtiChannel/stream.test.js +164 -0
  67. package/dist/goshtiChannel/stream.test.js.map +1 -0
  68. package/dist/goshtiChannel.d.ts +22 -0
  69. package/dist/goshtiChannel.d.ts.map +1 -0
  70. package/dist/goshtiChannel.js +193 -0
  71. package/dist/goshtiChannel.js.map +1 -0
  72. package/dist/state.d.ts +2 -0
  73. package/dist/state.d.ts.map +1 -1
  74. package/dist/state.js.map +1 -1
  75. package/dist/tools/brainWriteCheck.test.d.ts +10 -0
  76. package/dist/tools/brainWriteCheck.test.d.ts.map +1 -0
  77. package/dist/tools/brainWriteCheck.test.js +67 -0
  78. package/dist/tools/brainWriteCheck.test.js.map +1 -0
  79. package/dist/tools/brainstormTurnAnnotations.test.d.ts +8 -0
  80. package/dist/tools/brainstormTurnAnnotations.test.d.ts.map +1 -0
  81. package/dist/tools/brainstormTurnAnnotations.test.js +93 -0
  82. package/dist/tools/brainstormTurnAnnotations.test.js.map +1 -0
  83. package/dist/tools/employeeTraining.d.ts +46 -0
  84. package/dist/tools/employeeTraining.d.ts.map +1 -0
  85. package/dist/tools/employeeTraining.js +329 -0
  86. package/dist/tools/employeeTraining.js.map +1 -0
  87. package/dist/tools/employeeTraining.test.d.ts +7 -0
  88. package/dist/tools/employeeTraining.test.d.ts.map +1 -0
  89. package/dist/tools/employeeTraining.test.js +190 -0
  90. package/dist/tools/employeeTraining.test.js.map +1 -0
  91. package/dist/tools/index.d.ts.map +1 -1
  92. package/dist/tools/index.js +231 -6
  93. package/dist/tools/index.js.map +1 -1
  94. package/dist/tools/runs.d.ts +43 -0
  95. package/dist/tools/runs.d.ts.map +1 -0
  96. package/dist/tools/runs.js +280 -0
  97. package/dist/tools/runs.js.map +1 -0
  98. package/dist/tools/runs.test.d.ts +9 -0
  99. package/dist/tools/runs.test.d.ts.map +1 -0
  100. package/dist/tools/runs.test.js +114 -0
  101. package/dist/tools/runs.test.js.map +1 -0
  102. package/dist/tools/tools.test.js +153 -2
  103. package/dist/tools/tools.test.js.map +1 -1
  104. package/package.json +79 -78
  105. package/skills/catalog.json +3 -2
  106. package/skills/manifest.json +2 -1
  107. package/skills/skills/multiagent-brainstorm/SKILL.md +50 -4
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Orchestrated run MCP tools (add-live-animated-views §1.3, §1.8).
3
+ *
4
+ * An orchestrating agent that splits work across sub-agents reports it as a
5
+ * run: `run_open`, one `run_item_add` per sub-agent, `run_item_update` as each
6
+ * moves planned → coding → queued → verifying → passed → merged, `run_gate_step`
7
+ * for each verify step, `run_deploy`, and `run_close`. The dashboard's Run view
8
+ * draws it live. Reporting is opt-in: nothing creates a run but `run_open`.
9
+ *
10
+ * The run id returned by `run_open` is remembered in `.agenthub/state`, so the
11
+ * other tools — and sub-agents working in worktrees of the same checkout that
12
+ * share the state file — need not pass it. An explicit `run_id` always wins.
13
+ *
14
+ * Refusals are returned, never thrown: `gate_busy` (wait your turn) and
15
+ * `invalid_transition` (wrong step) call for different next moves, and a model
16
+ * that sees only "failed" will retry the wrong one.
17
+ */
18
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
19
+ import type { ApiClient, SessionControlResult } from "../client.js";
20
+ export declare const RUN_TOOLS: readonly ["run_open", "run_item_add", "run_item_update", "run_gate_step", "run_deploy", "run_close"];
21
+ export type RunToolName = (typeof RUN_TOOLS)[number];
22
+ export declare function isRunTool(name: string): name is RunToolName;
23
+ /** Where the current run id is remembered (`.agenthub/state` in production). */
24
+ export interface RunIdStore {
25
+ get(): string | undefined;
26
+ set(runId: string | undefined): void;
27
+ }
28
+ export declare function registerRunTools(): Tool[];
29
+ export interface RunFailure {
30
+ ok: false;
31
+ error: string;
32
+ status: number;
33
+ message: string;
34
+ current_state?: string;
35
+ holder?: string;
36
+ labels?: string[];
37
+ }
38
+ /** Turn a refused run call into something the model can act on. */
39
+ export declare function describeRunFailure(tool: RunToolName, result: Extract<SessionControlResult, {
40
+ ok: false;
41
+ }>): RunFailure;
42
+ export declare function handleRunToolCall(name: RunToolName, args: Record<string, unknown>, client: ApiClient, runIds: RunIdStore): Promise<unknown>;
43
+ //# sourceMappingURL=runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/tools/runs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpE,eAAO,MAAM,SAAS,sGAOZ,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,WAAW,CAE3D;AAED,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CACtC;AAWD,wBAAgB,gBAAgB,IAAI,IAAI,EAAE,CAyHzC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAgCD,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,oBAAoB,EAAE;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,GAAG,UAAU,CAoCtH;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,OAAO,CAAC,CA6DlB"}
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Orchestrated run MCP tools (add-live-animated-views §1.3, §1.8).
3
+ *
4
+ * An orchestrating agent that splits work across sub-agents reports it as a
5
+ * run: `run_open`, one `run_item_add` per sub-agent, `run_item_update` as each
6
+ * moves planned → coding → queued → verifying → passed → merged, `run_gate_step`
7
+ * for each verify step, `run_deploy`, and `run_close`. The dashboard's Run view
8
+ * draws it live. Reporting is opt-in: nothing creates a run but `run_open`.
9
+ *
10
+ * The run id returned by `run_open` is remembered in `.agenthub/state`, so the
11
+ * other tools — and sub-agents working in worktrees of the same checkout that
12
+ * share the state file — need not pass it. An explicit `run_id` always wins.
13
+ *
14
+ * Refusals are returned, never thrown: `gate_busy` (wait your turn) and
15
+ * `invalid_transition` (wrong step) call for different next moves, and a model
16
+ * that sees only "failed" will retry the wrong one.
17
+ */
18
+ export const RUN_TOOLS = [
19
+ "run_open",
20
+ "run_item_add",
21
+ "run_item_update",
22
+ "run_gate_step",
23
+ "run_deploy",
24
+ "run_close",
25
+ ];
26
+ export function isRunTool(name) {
27
+ return RUN_TOOLS.includes(name);
28
+ }
29
+ const ITEM_STATES = ["planned", "coding", "queued", "verifying", "passed", "failed", "merged", "dropped"];
30
+ const STEP_STATES = ["pending", "running", "passed", "failed", "skipped"];
31
+ const RUN_ID = {
32
+ type: "string",
33
+ description: "The run id or r-YYYYMMDD-NNN display number. Defaults to the run this checkout last opened.",
34
+ };
35
+ const LABEL = { type: "string", description: "The item's label, as given to run_item_add (≤ 64 chars, no slashes)." };
36
+ export function registerRunTools() {
37
+ return [
38
+ {
39
+ name: "run_open",
40
+ description: "Open an orchestrated run so the dashboard's Run view can show your fan-out live " +
41
+ "(add-live-animated-views). Call this when you split work across sub-agents or worktrees. " +
42
+ "The run id is remembered for this checkout; the other run_* tools default to it. " +
43
+ "Close it with run_close when done — an idle run is closed as abandoned after 24h. " +
44
+ "(requires agent_register first)",
45
+ inputSchema: {
46
+ type: "object",
47
+ properties: {
48
+ title: { type: "string", description: "What the run is, e.g. 'phase 1 of add-live-animated-views'." },
49
+ project_id: { type: "string", description: "Project id or key, optional." },
50
+ openspec_change: { type: "string", description: "The OpenSpec change this run delivers, optional." },
51
+ },
52
+ required: ["title"],
53
+ },
54
+ },
55
+ {
56
+ name: "run_item_add",
57
+ description: "Add one item to a run — one per sub-agent or worktree. Idempotent on label: adding a label the run " +
58
+ "already has returns the existing item. Only the run's orchestrator (or an org admin) may add items.",
59
+ inputSchema: {
60
+ type: "object",
61
+ properties: {
62
+ run_id: RUN_ID,
63
+ label: LABEL,
64
+ agent_id: { type: "string", description: "The sub-agent doing this item, if it is an AgentHub agent." },
65
+ branch: { type: "string", description: "Git branch." },
66
+ worktree: { type: "string", description: "Worktree path or name; only the last path segment is stored." },
67
+ rationale: {
68
+ type: "string",
69
+ description: "Why you routed this work here (≤ 500 chars). Shown on hover; nothing is computed from it.",
70
+ },
71
+ },
72
+ required: ["label"],
73
+ },
74
+ },
75
+ {
76
+ name: "run_item_update",
77
+ description: "Update an item: its state, progress, pull request or linked session. States move only " +
78
+ "planned → coding → queued → verifying → passed → merged, verifying → failed, failed → queued " +
79
+ "(a new verify attempt), and any non-terminal state → dropped; anything else is refused with " +
80
+ "invalid_transition. The gate is SERIAL: only one item of a run may be verifying — a second is refused " +
81
+ "with gate_busy naming the holder; wait and retry. The orchestrator or the item's own agent may update it.",
82
+ inputSchema: {
83
+ type: "object",
84
+ properties: {
85
+ run_id: RUN_ID,
86
+ label: LABEL,
87
+ state: { type: "string", enum: [...ITEM_STATES] },
88
+ progress: { type: "number", description: "0–100." },
89
+ pr_url: {
90
+ type: "string",
91
+ description: "https://github.com/<owner>/<repo>/pull/<number>; sets pr_number too.",
92
+ },
93
+ pr_number: { type: "number" },
94
+ session_id: {
95
+ type: "string",
96
+ description: "The coding session doing this item. A personal-workstation session can be linked only by its " +
97
+ "own agent or owner, and stays hidden from everyone else.",
98
+ },
99
+ branch: { type: "string" },
100
+ worktree: { type: "string" },
101
+ rationale: { type: "string" },
102
+ },
103
+ required: ["label"],
104
+ },
105
+ },
106
+ {
107
+ name: "run_gate_step",
108
+ description: "Record one verify-gate step for an item (e.g. go, docs, race, build), under the item's current attempt. " +
109
+ "Report it running when it starts and passed/failed/skipped when it ends; the duration is measured " +
110
+ "between the two. The item must be queued, verifying, passed or failed.",
111
+ inputSchema: {
112
+ type: "object",
113
+ properties: {
114
+ run_id: RUN_ID,
115
+ label: LABEL,
116
+ step: { type: "string", description: "Step name, ≤ 32 chars." },
117
+ state: { type: "string", enum: [...STEP_STATES] },
118
+ summary: { type: "string", description: "One line, ≤ 500 chars, e.g. the failing test." },
119
+ },
120
+ required: ["label", "step", "state"],
121
+ },
122
+ },
123
+ {
124
+ name: "run_deploy",
125
+ description: "Record a deploy of the run's merged work: started, then succeeded or failed. Orchestrator only.",
126
+ inputSchema: {
127
+ type: "object",
128
+ properties: {
129
+ run_id: RUN_ID,
130
+ target: { type: "string", description: "Where, e.g. staging." },
131
+ state: { type: "string", enum: ["started", "succeeded", "failed"] },
132
+ summary: { type: "string" },
133
+ },
134
+ required: ["target", "state"],
135
+ },
136
+ },
137
+ {
138
+ name: "run_close",
139
+ description: "Close the run. `done` requires every item merged or dropped (refused with items_open otherwise); " +
140
+ "`failed` and `abandoned` close it as is. Orchestrator only.",
141
+ inputSchema: {
142
+ type: "object",
143
+ properties: {
144
+ run_id: RUN_ID,
145
+ status: { type: "string", enum: ["done", "failed", "abandoned"] },
146
+ },
147
+ required: ["status"],
148
+ },
149
+ },
150
+ ];
151
+ }
152
+ function requireString(args, key) {
153
+ const v = args[key];
154
+ if (typeof v !== "string" || v.trim() === "")
155
+ throw new Error(`${key} is required`);
156
+ return v.trim();
157
+ }
158
+ function optionalString(args, key) {
159
+ const v = args[key];
160
+ return typeof v === "string" && v.trim() !== "" ? v.trim() : undefined;
161
+ }
162
+ function optionalNumber(args, key) {
163
+ const v = args[key];
164
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
165
+ }
166
+ /** Copy the named arguments that are set into a body. */
167
+ function pick(args, strings, numbers = []) {
168
+ const body = {};
169
+ for (const k of strings) {
170
+ const v = optionalString(args, k);
171
+ if (v !== undefined)
172
+ body[k] = v;
173
+ }
174
+ for (const k of numbers) {
175
+ const v = optionalNumber(args, k);
176
+ if (v !== undefined)
177
+ body[k] = v;
178
+ }
179
+ return body;
180
+ }
181
+ /** Turn a refused run call into something the model can act on. */
182
+ export function describeRunFailure(tool, result) {
183
+ const raw = result.data ?? {};
184
+ const out = { ok: false, error: result.error, status: result.status, message: "" };
185
+ switch (result.error) {
186
+ case "runs_disabled":
187
+ out.message =
188
+ "UNAVAILABLE: orchestrated runs are switched off on this AgentHub server. This is configuration, not a " +
189
+ "permission denial — an operator must set AGENTHUB_RUNS_ENABLED=true. Carry on without reporting the run.";
190
+ break;
191
+ case "gate_busy":
192
+ out.holder = typeof raw.holder === "string" ? raw.holder : undefined;
193
+ out.message = `WAIT: the gate is serial and item "${out.holder ?? "?"}" is verifying. Retry once it has passed or failed.`;
194
+ break;
195
+ case "invalid_transition":
196
+ out.current_state = typeof raw.current_state === "string" ? raw.current_state : undefined;
197
+ out.message =
198
+ `REFUSED: the item is ${out.current_state ?? "in another state"}; that move is not on the state machine ` +
199
+ "(planned → coding → queued → verifying → passed → merged; verifying → failed → queued; any → dropped).";
200
+ break;
201
+ case "items_open":
202
+ out.labels = Array.isArray(raw.labels) ? raw.labels : undefined;
203
+ out.message = `REFUSED: a run closes as done only when every item is merged or dropped. Still open: ${(out.labels ?? []).join(", ")}.`;
204
+ break;
205
+ case "not_run_participant":
206
+ out.message = "DENIED: only the run's orchestrator, the agent on that item, or an org admin may write it.";
207
+ break;
208
+ case "run_closed":
209
+ out.message = "REFUSED: the run is closed. Open a new one with run_open.";
210
+ break;
211
+ case "run_not_found":
212
+ out.message = "Not found: no such run in your organization. Check run_id, or run_open a new run.";
213
+ break;
214
+ default:
215
+ out.message = result.message || result.detail || `${tool} failed: ${result.error} (HTTP ${result.status}).`;
216
+ }
217
+ return out;
218
+ }
219
+ export async function handleRunToolCall(name, args, client, runIds) {
220
+ if (name === "run_open") {
221
+ const body = { title: requireString(args, "title"), ...pick(args, ["project_id", "openspec_change"]) };
222
+ const result = await client.runsRequest("POST", "/runs", body);
223
+ if (!result.ok)
224
+ return describeRunFailure(name, result);
225
+ const run = (result.data.run ?? {});
226
+ const runId = typeof run.id === "string" ? run.id : undefined;
227
+ if (runId)
228
+ runIds.set(runId);
229
+ return {
230
+ ok: true,
231
+ run_id: runId,
232
+ display_number: run.display_number,
233
+ run,
234
+ message: `Opened run ${run.display_number ?? runId}. Add one item per sub-agent with run_item_add; close it with run_close.`,
235
+ };
236
+ }
237
+ const explicit = optionalString(args, "run_id");
238
+ const runId = explicit ?? runIds.get();
239
+ if (!runId)
240
+ throw new Error("No run: pass run_id, or call run_open first in this checkout.");
241
+ const base = `/runs/${encodeURIComponent(runId)}`;
242
+ const item = () => `${base}/items/${encodeURIComponent(requireString(args, "label"))}`;
243
+ let result;
244
+ switch (name) {
245
+ case "run_item_add":
246
+ result = await client.runsRequest("POST", `${base}/items`, {
247
+ label: requireString(args, "label"),
248
+ ...pick(args, ["agent_id", "branch", "worktree", "rationale"]),
249
+ });
250
+ break;
251
+ case "run_item_update":
252
+ result = await client.runsRequest("PATCH", item(), pick(args, ["state", "pr_url", "session_id", "branch", "worktree", "rationale"], ["progress", "pr_number"]));
253
+ break;
254
+ case "run_gate_step":
255
+ result = await client.runsRequest("POST", `${item()}/gate-steps`, {
256
+ step: requireString(args, "step"),
257
+ state: requireString(args, "state"),
258
+ ...pick(args, ["summary"]),
259
+ });
260
+ break;
261
+ case "run_deploy":
262
+ result = await client.runsRequest("POST", `${base}/deploys`, {
263
+ target: requireString(args, "target"),
264
+ state: requireString(args, "state"),
265
+ ...pick(args, ["summary"]),
266
+ });
267
+ break;
268
+ case "run_close":
269
+ result = await client.runsRequest("POST", `${base}/close`, { status: requireString(args, "status") });
270
+ if (result.ok && (!explicit || explicit === runIds.get()))
271
+ runIds.set(undefined);
272
+ break;
273
+ default:
274
+ throw new Error(`unknown run tool ${name}`);
275
+ }
276
+ if (!result.ok)
277
+ return describeRunFailure(name, result);
278
+ return { ok: true, ...result.data };
279
+ }
280
+ //# sourceMappingURL=runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/tools/runs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Orchestrated run tools (add-live-animated-views §1.8).
3
+ *
4
+ * Handlers against a mocked ApiClient and an in-memory run-id store: argument
5
+ * mapping, the run id remembered after run_open, and refusals returned as
6
+ * structured results rather than thrown.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=runs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.test.d.ts","sourceRoot":"","sources":["../../src/tools/runs.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Orchestrated run tools (add-live-animated-views §1.8).
3
+ *
4
+ * Handlers against a mocked ApiClient and an in-memory run-id store: argument
5
+ * mapping, the run id remembered after run_open, and refusals returned as
6
+ * structured results rather than thrown.
7
+ */
8
+ import { describe, expect, it, vi } from "vitest";
9
+ import { RUN_TOOLS, describeRunFailure, handleRunToolCall, isRunTool, registerRunTools, } from "./runs.js";
10
+ const ok = (data, status = 200) => ({ ok: true, status, data });
11
+ const fail = (status, error, data = {}) => ({
12
+ ok: false,
13
+ status,
14
+ error,
15
+ message: typeof data.message === "string" ? data.message : undefined,
16
+ data: { error, ...data },
17
+ });
18
+ function memoryStore(initial) {
19
+ const s = {
20
+ value: initial,
21
+ get: () => s.value,
22
+ set: (id) => {
23
+ s.value = id;
24
+ },
25
+ };
26
+ return s;
27
+ }
28
+ function mockClient(runsRequest) {
29
+ return { runsRequest };
30
+ }
31
+ describe("run tool registration", () => {
32
+ it("registers the six run tools", () => {
33
+ const names = registerRunTools().map((t) => t.name);
34
+ expect(names).toEqual([...RUN_TOOLS]);
35
+ expect(names).toEqual(["run_open", "run_item_add", "run_item_update", "run_gate_step", "run_deploy", "run_close"]);
36
+ for (const n of names)
37
+ expect(isRunTool(n)).toBe(true);
38
+ expect(isRunTool("run_delete")).toBe(false);
39
+ });
40
+ it("offers exactly the item states of the server's state machine", () => {
41
+ const update = registerRunTools().find((t) => t.name === "run_item_update");
42
+ const state = update.inputSchema.properties.state;
43
+ expect(state.enum).toEqual(["planned", "coding", "queued", "verifying", "passed", "failed", "merged", "dropped"]);
44
+ });
45
+ });
46
+ describe("run_open", () => {
47
+ it("opens the run and remembers its id for the other tools", async () => {
48
+ const req = vi.fn().mockResolvedValue(ok({ run: { id: "run_1", display_number: "r-20261101-001", status: "open" } }, 201));
49
+ const store = memoryStore();
50
+ const out = (await handleRunToolCall("run_open", { title: "night marathon", openspec_change: "add-x" }, mockClient(req), store));
51
+ expect(req).toHaveBeenCalledWith("POST", "/runs", { title: "night marathon", openspec_change: "add-x" });
52
+ expect(out.ok).toBe(true);
53
+ expect(out.run_id).toBe("run_1");
54
+ expect(store.value).toBe("run_1");
55
+ });
56
+ it("requires a title", async () => {
57
+ await expect(handleRunToolCall("run_open", {}, mockClient(vi.fn()), memoryStore())).rejects.toThrow(/title/);
58
+ });
59
+ });
60
+ describe("item tools", () => {
61
+ it("uses the remembered run id and escapes the label", async () => {
62
+ const req = vi.fn().mockResolvedValue(ok({ item: { label: "fan-out fix", state: "coding" } }));
63
+ await handleRunToolCall("run_item_update", { label: "fan-out fix", state: "coding", progress: 40 }, mockClient(req), memoryStore("run_1"));
64
+ expect(req).toHaveBeenCalledWith("PATCH", "/runs/run_1/items/fan-out%20fix", { state: "coding", progress: 40 });
65
+ });
66
+ it("an explicit run_id wins over the remembered one", async () => {
67
+ const req = vi.fn().mockResolvedValue(ok({ item: {}, created: true }, 201));
68
+ await handleRunToolCall("run_item_add", { run_id: "run_2", label: "a", agent_id: "sub", rationale: "why" }, mockClient(req), memoryStore("run_1"));
69
+ expect(req).toHaveBeenCalledWith("POST", "/runs/run_2/items", { label: "a", agent_id: "sub", rationale: "why" });
70
+ });
71
+ it("refuses without a run id anywhere", async () => {
72
+ await expect(handleRunToolCall("run_item_add", { label: "a" }, mockClient(vi.fn()), memoryStore())).rejects.toThrow(/run_open/);
73
+ });
74
+ it("records a gate step under the item", async () => {
75
+ const req = vi.fn().mockResolvedValue(ok({ gate_step: { attempt: 2 } }));
76
+ await handleRunToolCall("run_gate_step", { label: "a", step: "go", state: "passed", summary: "ok" }, mockClient(req), memoryStore("run_1"));
77
+ expect(req).toHaveBeenCalledWith("POST", "/runs/run_1/items/a/gate-steps", { step: "go", state: "passed", summary: "ok" });
78
+ });
79
+ });
80
+ describe("refusals", () => {
81
+ it("returns gate_busy with the holder instead of throwing", async () => {
82
+ const req = vi.fn().mockResolvedValue(fail(409, "gate_busy", { holder: "A" }));
83
+ const out = (await handleRunToolCall("run_item_update", { label: "B", state: "verifying" }, mockClient(req), memoryStore("run_1")));
84
+ expect(out.ok).toBe(false);
85
+ expect(out.error).toBe("gate_busy");
86
+ expect(out.holder).toBe("A");
87
+ expect(String(out.message)).toMatch(/A/);
88
+ });
89
+ it("names the current state on invalid_transition", () => {
90
+ const out = describeRunFailure("run_item_update", fail(409, "invalid_transition", { current_state: "coding" }));
91
+ expect(out.current_state).toBe("coding");
92
+ expect(out.message).toMatch(/coding/);
93
+ });
94
+ it("says runs_disabled is configuration, not permission", () => {
95
+ const out = describeRunFailure("run_open", fail(503, "runs_disabled"));
96
+ expect(out.message).toMatch(/AGENTHUB_RUNS_ENABLED/);
97
+ });
98
+ });
99
+ describe("run_close", () => {
100
+ it("forgets the remembered run once it is closed", async () => {
101
+ const req = vi.fn().mockResolvedValue(ok({ run: { id: "run_1", status: "done" } }));
102
+ const store = memoryStore("run_1");
103
+ await handleRunToolCall("run_close", { status: "done" }, mockClient(req), store);
104
+ expect(req).toHaveBeenCalledWith("POST", "/runs/run_1/close", { status: "done" });
105
+ expect(store.value).toBeUndefined();
106
+ });
107
+ it("keeps the remembered run when closing another", async () => {
108
+ const req = vi.fn().mockResolvedValue(ok({ run: { id: "run_9", status: "failed" } }));
109
+ const store = memoryStore("run_1");
110
+ await handleRunToolCall("run_close", { run_id: "run_9", status: "failed" }, mockClient(req), store);
111
+ expect(store.value).toBe("run_1");
112
+ });
113
+ });
114
+ //# sourceMappingURL=runs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.test.js","sourceRoot":"","sources":["../../src/tools/runs.test.ts"],"names":[],"mappings":"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"}