agenthub-multiagent-mcp 1.75.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.
- package/dist/client.d.ts +19 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +31 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/setup-shell.js +11 -11
- package/dist/employee.d.ts +11 -0
- package/dist/employee.d.ts.map +1 -1
- package/dist/employee.js +64 -1
- package/dist/employee.js.map +1 -1
- package/dist/employee.test.js +88 -1
- package/dist/employee.test.js.map +1 -1
- package/dist/goshtiChannel/client.d.ts +9 -0
- package/dist/goshtiChannel/client.d.ts.map +1 -0
- package/dist/goshtiChannel/client.js +63 -0
- package/dist/goshtiChannel/client.js.map +1 -0
- package/dist/goshtiChannel/config.d.ts +42 -0
- package/dist/goshtiChannel/config.d.ts.map +1 -0
- package/dist/goshtiChannel/config.js +129 -0
- package/dist/goshtiChannel/config.js.map +1 -0
- package/dist/goshtiChannel/config.test.d.ts +2 -0
- package/dist/goshtiChannel/config.test.d.ts.map +1 -0
- package/dist/goshtiChannel/config.test.js +73 -0
- package/dist/goshtiChannel/config.test.js.map +1 -0
- package/dist/goshtiChannel/core.d.ts +63 -0
- package/dist/goshtiChannel/core.d.ts.map +1 -0
- package/dist/goshtiChannel/core.js +237 -0
- package/dist/goshtiChannel/core.js.map +1 -0
- package/dist/goshtiChannel/core.test.d.ts +2 -0
- package/dist/goshtiChannel/core.test.d.ts.map +1 -0
- package/dist/goshtiChannel/core.test.js +250 -0
- package/dist/goshtiChannel/core.test.js.map +1 -0
- package/dist/goshtiChannel/credential.d.ts +29 -0
- package/dist/goshtiChannel/credential.d.ts.map +1 -0
- package/dist/goshtiChannel/credential.js +160 -0
- package/dist/goshtiChannel/credential.js.map +1 -0
- package/dist/goshtiChannel/credential.test.d.ts +2 -0
- package/dist/goshtiChannel/credential.test.d.ts.map +1 -0
- package/dist/goshtiChannel/credential.test.js +127 -0
- package/dist/goshtiChannel/credential.test.js.map +1 -0
- package/dist/goshtiChannel/e2e.test.d.ts +2 -0
- package/dist/goshtiChannel/e2e.test.d.ts.map +1 -0
- package/dist/goshtiChannel/e2e.test.js +163 -0
- package/dist/goshtiChannel/e2e.test.js.map +1 -0
- package/dist/goshtiChannel/policy.d.ts +154 -0
- package/dist/goshtiChannel/policy.d.ts.map +1 -0
- package/dist/goshtiChannel/policy.js +240 -0
- package/dist/goshtiChannel/policy.js.map +1 -0
- package/dist/goshtiChannel/policy.test.d.ts +2 -0
- package/dist/goshtiChannel/policy.test.d.ts.map +1 -0
- package/dist/goshtiChannel/policy.test.js +263 -0
- package/dist/goshtiChannel/policy.test.js.map +1 -0
- package/dist/goshtiChannel/setup.d.ts +15 -0
- package/dist/goshtiChannel/setup.d.ts.map +1 -0
- package/dist/goshtiChannel/setup.js +125 -0
- package/dist/goshtiChannel/setup.js.map +1 -0
- package/dist/goshtiChannel/setup.test.d.ts +2 -0
- package/dist/goshtiChannel/setup.test.d.ts.map +1 -0
- package/dist/goshtiChannel/setup.test.js +96 -0
- package/dist/goshtiChannel/setup.test.js.map +1 -0
- package/dist/goshtiChannel/stream.d.ts +39 -0
- package/dist/goshtiChannel/stream.d.ts.map +1 -0
- package/dist/goshtiChannel/stream.js +174 -0
- package/dist/goshtiChannel/stream.js.map +1 -0
- package/dist/goshtiChannel/stream.test.d.ts +2 -0
- package/dist/goshtiChannel/stream.test.d.ts.map +1 -0
- package/dist/goshtiChannel/stream.test.js +164 -0
- package/dist/goshtiChannel/stream.test.js.map +1 -0
- package/dist/goshtiChannel.d.ts +22 -0
- package/dist/goshtiChannel.d.ts.map +1 -0
- package/dist/goshtiChannel.js +193 -0
- package/dist/goshtiChannel.js.map +1 -0
- package/dist/state.d.ts +2 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js.map +1 -1
- package/dist/tools/brainWriteCheck.test.d.ts +10 -0
- package/dist/tools/brainWriteCheck.test.d.ts.map +1 -0
- package/dist/tools/brainWriteCheck.test.js +67 -0
- package/dist/tools/brainWriteCheck.test.js.map +1 -0
- package/dist/tools/employeeTraining.d.ts +46 -0
- package/dist/tools/employeeTraining.d.ts.map +1 -0
- package/dist/tools/employeeTraining.js +329 -0
- package/dist/tools/employeeTraining.js.map +1 -0
- package/dist/tools/employeeTraining.test.d.ts +7 -0
- package/dist/tools/employeeTraining.test.d.ts.map +1 -0
- package/dist/tools/employeeTraining.test.js +190 -0
- package/dist/tools/employeeTraining.test.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +146 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/runs.d.ts +43 -0
- package/dist/tools/runs.d.ts.map +1 -0
- package/dist/tools/runs.js +280 -0
- package/dist/tools/runs.js.map +1 -0
- package/dist/tools/runs.test.d.ts +9 -0
- package/dist/tools/runs.test.d.ts.map +1 -0
- package/dist/tools/runs.test.js +114 -0
- package/dist/tools/runs.test.js.map +1 -0
- package/dist/tools/tools.test.js +54 -2
- package/dist/tools/tools.test.js.map +1 -1
- package/package.json +79 -78
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Employee training MCP tools (add-employee-training-loops §1.3 manual trigger,
|
|
3
|
+
* §2–§3). Handlers against a mocked ApiClient for result/refusal shaping, and
|
|
4
|
+
* the real ApiClient with fetch stubbed for the wire contract.
|
|
5
|
+
*/
|
|
6
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
7
|
+
import { EMPLOYEE_TRAINING_TOOLS, handleEmployeeTrainingToolCall, isEmployeeTrainingTool, registerEmployeeTrainingTools, } from "./employeeTraining.js";
|
|
8
|
+
import { ApiClient } from "../client.js";
|
|
9
|
+
function mockClient(overrides = {}) {
|
|
10
|
+
return {
|
|
11
|
+
getTrainingObservations: vi.fn(),
|
|
12
|
+
runTrainingPass: vi.fn(),
|
|
13
|
+
listTrainingRecords: vi.fn(),
|
|
14
|
+
getTrainingCurriculum: vi.fn(),
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const ok = (data, status = 200) => ({ ok: true, status, data });
|
|
19
|
+
const fail = (status, error, message) => ({
|
|
20
|
+
ok: false,
|
|
21
|
+
status,
|
|
22
|
+
error,
|
|
23
|
+
message,
|
|
24
|
+
data: { error, message },
|
|
25
|
+
});
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
vi.unstubAllGlobals();
|
|
28
|
+
vi.restoreAllMocks();
|
|
29
|
+
});
|
|
30
|
+
describe("employee training tool registration", () => {
|
|
31
|
+
it("registers the four training tools", () => {
|
|
32
|
+
expect(registerEmployeeTrainingTools().map((t) => t.name)).toEqual([...EMPLOYEE_TRAINING_TOOLS]);
|
|
33
|
+
expect(EMPLOYEE_TRAINING_TOOLS).toEqual([
|
|
34
|
+
"employee_training_observe",
|
|
35
|
+
"employee_training_run",
|
|
36
|
+
"employee_training_history",
|
|
37
|
+
"employee_training_curriculum",
|
|
38
|
+
]);
|
|
39
|
+
expect(isEmployeeTrainingTool("employee_training_run")).toBe(true);
|
|
40
|
+
expect(isEmployeeTrainingTool("employee_get")).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it("offers only the charter fields the server accepts", () => {
|
|
43
|
+
const run = registerEmployeeTrainingTools().find((t) => t.name === "employee_training_run");
|
|
44
|
+
const edits = run.inputSchema.properties.charter_edits;
|
|
45
|
+
expect(edits.items.properties.field.enum).toEqual(["mission", "responsibilities", "scope", "success_metrics"]);
|
|
46
|
+
expect(run.inputSchema.required).toEqual(["agent_id"]);
|
|
47
|
+
});
|
|
48
|
+
it("says a charter edit is only a proposal", () => {
|
|
49
|
+
const run = registerEmployeeTrainingTools().find((t) => t.name === "employee_training_run");
|
|
50
|
+
expect(run.description).toMatch(/person/i);
|
|
51
|
+
expect(run.description).toMatch(/not applied|never applied|nothing changes/i);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe("employee_training_run", () => {
|
|
55
|
+
it("passes lessons, edits and spend through and summarises the record", async () => {
|
|
56
|
+
const runTrainingPass = vi.fn().mockResolvedValue(ok({
|
|
57
|
+
record: {
|
|
58
|
+
id: "rec-1",
|
|
59
|
+
status: "completed",
|
|
60
|
+
lessons: [{ text: "a", duplicate: false }, { text: "b", duplicate: true }],
|
|
61
|
+
proposed_charter_edits: [{ field: "scope", review_id: "rev-1", state: "pending" }],
|
|
62
|
+
budget_spent: 900,
|
|
63
|
+
budget_limit: 50000,
|
|
64
|
+
},
|
|
65
|
+
scorecard: { score: 72, ladder: { decision: "hold" } },
|
|
66
|
+
}));
|
|
67
|
+
const client = mockClient({ runTrainingPass });
|
|
68
|
+
const out = (await handleEmployeeTrainingToolCall("employee_training_run", {
|
|
69
|
+
agent_id: "eng-ic-test",
|
|
70
|
+
lessons: ["a", "b"],
|
|
71
|
+
charter_edits: [{ field: "scope", after: "x", rationale: "y" }],
|
|
72
|
+
tokens_spent: 900,
|
|
73
|
+
window_days: 7,
|
|
74
|
+
}, client));
|
|
75
|
+
expect(runTrainingPass).toHaveBeenCalledWith("eng-ic-test", {
|
|
76
|
+
lessons: ["a", "b"],
|
|
77
|
+
charter_edits: [{ field: "scope", after: "x", rationale: "y" }],
|
|
78
|
+
tokens_spent: 900,
|
|
79
|
+
window_days: 7,
|
|
80
|
+
});
|
|
81
|
+
expect(out.ok).toBe(true);
|
|
82
|
+
expect(out.record_id).toBe("rec-1");
|
|
83
|
+
expect(out.message).toContain("1 new lesson");
|
|
84
|
+
expect(out.message).toContain("1 already known");
|
|
85
|
+
expect(out.message).toContain("rev-1");
|
|
86
|
+
expect(out.message).toMatch(/person/i);
|
|
87
|
+
});
|
|
88
|
+
it("passes practice and skills through and summarises them", async () => {
|
|
89
|
+
const runTrainingPass = vi.fn().mockResolvedValue(ok({
|
|
90
|
+
record: {
|
|
91
|
+
id: "rec-3",
|
|
92
|
+
status: "partial",
|
|
93
|
+
stop_reason: "budget_exhausted",
|
|
94
|
+
lessons: [],
|
|
95
|
+
proposed_charter_edits: [],
|
|
96
|
+
practice_scores: [
|
|
97
|
+
{ item_id: "cur-blocked", state: "graded", passed: true },
|
|
98
|
+
{ item_id: "cur-planning", state: "assigned" },
|
|
99
|
+
{ item_id: "cur-guardrails", state: "skipped_budget" },
|
|
100
|
+
],
|
|
101
|
+
skills_added: [
|
|
102
|
+
{ name: "brag", state: "install_sent" },
|
|
103
|
+
{ name: "cybersecurity", state: "pending_approval", review_id: "rev-s" },
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
scorecard: {},
|
|
107
|
+
}));
|
|
108
|
+
const client = mockClient({ runTrainingPass });
|
|
109
|
+
const practice = { item_ids: ["cur-blocked", "cur-planning", "cur-guardrails"] };
|
|
110
|
+
const skills = [{ pack: "brag" }, { pack: "cybersecurity", gap: "secrets" }];
|
|
111
|
+
const out = (await handleEmployeeTrainingToolCall("employee_training_run", { agent_id: "e", practice, skills }, client));
|
|
112
|
+
expect(runTrainingPass).toHaveBeenCalledWith("e", { practice, skills });
|
|
113
|
+
expect(out.message).toContain("1 graded (1 passed), 1 sent");
|
|
114
|
+
expect(out.message).toContain("1 not sent (budget)");
|
|
115
|
+
expect(out.message).toContain("rev-s");
|
|
116
|
+
expect(out.message).toMatch(/person/i);
|
|
117
|
+
});
|
|
118
|
+
it("describes the governed skill install", () => {
|
|
119
|
+
const run = registerEmployeeTrainingTools().find((t) => t.name === "employee_training_run");
|
|
120
|
+
const skills = run.inputSchema.properties.skills;
|
|
121
|
+
expect(skills.description).toMatch(/skill-pack:<name>/);
|
|
122
|
+
expect(skills.description).toMatch(/No agent can approve/);
|
|
123
|
+
});
|
|
124
|
+
it("reports a partial pass as stopped by the budget", async () => {
|
|
125
|
+
const client = mockClient({
|
|
126
|
+
runTrainingPass: vi.fn().mockResolvedValue(ok({
|
|
127
|
+
record: { id: "rec-2", status: "partial", stop_reason: "budget_exhausted", lessons: [], proposed_charter_edits: [] },
|
|
128
|
+
scorecard: {},
|
|
129
|
+
})),
|
|
130
|
+
});
|
|
131
|
+
const out = (await handleEmployeeTrainingToolCall("employee_training_run", { agent_id: "e" }, client));
|
|
132
|
+
expect(out.status).toBe("partial");
|
|
133
|
+
expect(out.message).toMatch(/budget/i);
|
|
134
|
+
});
|
|
135
|
+
it.each([
|
|
136
|
+
["training_disabled", 503, /AGENTHUB_EMPLOYEE_TRAINING_ENABLED/],
|
|
137
|
+
["self_training", 403, /cannot train itself/i],
|
|
138
|
+
["trainer_required", 403, /trainer/i],
|
|
139
|
+
["not_employee", 404, /not an employee/i],
|
|
140
|
+
])("turns %s into an actionable refusal", async (code, status, pattern) => {
|
|
141
|
+
const client = mockClient({ runTrainingPass: vi.fn().mockResolvedValue(fail(status, code)) });
|
|
142
|
+
const out = (await handleEmployeeTrainingToolCall("employee_training_run", { agent_id: "e" }, client));
|
|
143
|
+
expect(out.ok).toBe(false);
|
|
144
|
+
expect(out.error).toBe(code);
|
|
145
|
+
expect(out.message).toMatch(pattern);
|
|
146
|
+
});
|
|
147
|
+
it("requires agent_id", async () => {
|
|
148
|
+
await expect(handleEmployeeTrainingToolCall("employee_training_run", {}, mockClient())).rejects.toThrow(/agent_id/);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe("observe and history", () => {
|
|
152
|
+
it("returns observations unchanged", async () => {
|
|
153
|
+
const obs = { agent_id: "e", shifts: [{ message_id: "m1" }] };
|
|
154
|
+
const client = mockClient({ getTrainingObservations: vi.fn().mockResolvedValue(ok(obs)) });
|
|
155
|
+
const out = (await handleEmployeeTrainingToolCall("employee_training_observe", { agent_id: "e", window_days: 3 }, client));
|
|
156
|
+
expect(client.getTrainingObservations).toHaveBeenCalledWith("e", 3);
|
|
157
|
+
expect(out.ok).toBe(true);
|
|
158
|
+
expect(out.observations).toEqual(obs);
|
|
159
|
+
});
|
|
160
|
+
it("lists history", async () => {
|
|
161
|
+
const client = mockClient({ listTrainingRecords: vi.fn().mockResolvedValue(ok({ records: [{ id: "r" }], total: 1 })) });
|
|
162
|
+
const out = (await handleEmployeeTrainingToolCall("employee_training_history", { agent_id: "e" }, client));
|
|
163
|
+
expect(client.listTrainingRecords).toHaveBeenCalledWith("e", undefined);
|
|
164
|
+
expect(out.records).toEqual([{ id: "r" }]);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe("wire contract", () => {
|
|
168
|
+
it("hits the employee training routes", async () => {
|
|
169
|
+
const fetchSpy = vi.fn(async () => ({
|
|
170
|
+
ok: true,
|
|
171
|
+
status: 200,
|
|
172
|
+
text: async () => JSON.stringify({ record: { id: "r" } }),
|
|
173
|
+
}));
|
|
174
|
+
vi.stubGlobal("fetch", fetchSpy);
|
|
175
|
+
const client = new ApiClient("https://hub.example/api", "key");
|
|
176
|
+
await client.runTrainingPass("eng ic", { lessons: ["x"] });
|
|
177
|
+
await client.getTrainingObservations("eng ic", 5);
|
|
178
|
+
await client.listTrainingRecords("eng ic", 10);
|
|
179
|
+
await client.getTrainingCurriculum("eng ic", 2);
|
|
180
|
+
const calls = fetchSpy.mock.calls;
|
|
181
|
+
expect(calls[0][0]).toBe("https://hub.example/api/employees/eng%20ic/training");
|
|
182
|
+
expect(calls[0][1].method).toBe("POST");
|
|
183
|
+
expect(JSON.parse(String(calls[0][1].body))).toEqual({ lessons: ["x"] });
|
|
184
|
+
expect(calls[1][0]).toBe("https://hub.example/api/employees/eng%20ic/training/observations?window_days=5");
|
|
185
|
+
expect(calls[1][1].method).toBe("GET");
|
|
186
|
+
expect(calls[2][0]).toBe("https://hub.example/api/employees/eng%20ic/training?limit=10");
|
|
187
|
+
expect(calls[3][0]).toBe("https://hub.example/api/employees/eng%20ic/training/curriculum?tickets=2");
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=employeeTraining.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"employeeTraining.test.js","sourceRoot":"","sources":["../../src/tools/employeeTraining.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAqD,MAAM,cAAc,CAAC;AAOrG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAqD,MAAM,cAAc,CAAC;AAOrG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAkH/D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,WAAW,CAAC;IACpC,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE;QAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,KAAK,IAAI,CAAC;CACZ;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAyLD,wBAAgB,aAAa,IAAI,IAAI,EAAE,CAohGtC;AAqCD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAwyFlB"}
|
package/dist/tools/index.js
CHANGED
|
@@ -12,8 +12,10 @@ import open from "open";
|
|
|
12
12
|
import { registerOpenSpecVizTools, handleOpenSpecVizToolCall } from "./openspec-viz/index.js";
|
|
13
13
|
import { syncTaskGroups, describeTaskSync } from "./openspec-viz/taskSync.js";
|
|
14
14
|
import { registerIntakeRequestTools, handleIntakeRequestToolCall, isIntakeRequestTool, } from "./intakeRequests.js";
|
|
15
|
+
import { handleEmployeeTrainingToolCall, isEmployeeTrainingTool, registerEmployeeTrainingTools, } from "./employeeTraining.js";
|
|
15
16
|
import { registerSessionControlTools, handleSessionControlToolCall, isSessionControlTool, } from "./sessionControl.js";
|
|
16
17
|
import { registerGoshtiReadTools, handleGoshtiReadToolCall, isGoshtiReadTool, } from "./goshtiRead.js";
|
|
18
|
+
import { registerRunTools, handleRunToolCall, isRunTool } from "./runs.js";
|
|
17
19
|
import { installPackFromArchive } from "../skillPackInstaller.js";
|
|
18
20
|
import { getServerTime, useTimeInjection } from "../lib/server-time.js";
|
|
19
21
|
import { getPendingItems } from "../lib/pending-items.js";
|
|
@@ -2216,8 +2218,11 @@ export function registerTools() {
|
|
|
2216
2218
|
...registerSessionControlTools(),
|
|
2217
2219
|
// Intake requests: file, triage, scope check (add-intake-requests §6.1)
|
|
2218
2220
|
...registerIntakeRequestTools(),
|
|
2221
|
+
...registerEmployeeTrainingTools(),
|
|
2219
2222
|
// Reading Goshti as the agent's owner (add-agent-goshti-read §3.1)
|
|
2220
2223
|
...registerGoshtiReadTools(),
|
|
2224
|
+
// Orchestrated runs for the dashboard Run view (add-live-animated-views §1.8)
|
|
2225
|
+
...registerRunTools(),
|
|
2221
2226
|
// OpenSpec Visualizer tools
|
|
2222
2227
|
...registerOpenSpecVizTools(),
|
|
2223
2228
|
// Intel layer tools (§2.5 — read-only MCP surface for intel.search + source catalog)
|
|
@@ -2373,7 +2378,7 @@ export function registerTools() {
|
|
|
2373
2378
|
},
|
|
2374
2379
|
{
|
|
2375
2380
|
name: "brain_write_knowledge",
|
|
2376
|
-
description: "Write an org knowledge fact (decision, convention, architecture insight, blocker, or alert) to the shared org brain.",
|
|
2381
|
+
description: "Write an org knowledge fact (decision, convention, architecture insight, blocker, or alert) to the shared org brain. The result carries `check`: `created` for a new row (with its `id`), or `deduped` when an identical active fact already exists — then `canonical_id` names the existing row if it is your organization's, and nothing is named if the match belongs to another organization. A refusal (missing fact, unknown category) is an error.",
|
|
2377
2382
|
inputSchema: {
|
|
2378
2383
|
type: "object",
|
|
2379
2384
|
properties: {
|
|
@@ -2827,6 +2832,86 @@ export function registerTools() {
|
|
|
2827
2832
|
required: ["project_id"],
|
|
2828
2833
|
},
|
|
2829
2834
|
},
|
|
2835
|
+
// ── Scheduled Reporting (add-scheduled-reporting §6.2) ──
|
|
2836
|
+
// Report schedules are their own rows — create_cron_job cannot express a
|
|
2837
|
+
// report (its schema has no action field). Every tool answers
|
|
2838
|
+
// 503 reporting_disabled while AGENTHUB_REPORTING_ENABLED is off.
|
|
2839
|
+
{
|
|
2840
|
+
name: "report_schedule_create",
|
|
2841
|
+
description: "Create a recurring report schedule. The report composes the chosen sections (shipped_tickets, meeting_decisions, session_digests, roadmap, brain_knowledge, token_usage) over a lookback window, filters them for the audience, and delivers to Slack/chat channels and/or email. Members may deliver to channels and their own email; any other email recipient needs an org owner/admin (a person). Returns the schedule.",
|
|
2842
|
+
inputSchema: {
|
|
2843
|
+
type: "object",
|
|
2844
|
+
properties: {
|
|
2845
|
+
name: { type: "string", description: "Unique name within the org" },
|
|
2846
|
+
schedule: { type: "string", description: "5-field cron, evaluated in UTC (e.g. '0 9 * * 1' = Mondays 09:00)" },
|
|
2847
|
+
sections: {
|
|
2848
|
+
type: "array",
|
|
2849
|
+
items: {
|
|
2850
|
+
type: "string",
|
|
2851
|
+
enum: ["shipped_tickets", "meeting_decisions", "session_digests", "roadmap", "brain_knowledge", "token_usage"],
|
|
2852
|
+
},
|
|
2853
|
+
description: "Sections to include (at least one)",
|
|
2854
|
+
},
|
|
2855
|
+
delivery_targets: {
|
|
2856
|
+
type: "array",
|
|
2857
|
+
items: {
|
|
2858
|
+
type: "object",
|
|
2859
|
+
properties: {
|
|
2860
|
+
kind: { type: "string", enum: ["slack", "email"] },
|
|
2861
|
+
target: { type: "string", description: "Channel (e.g. #leadership) or email address" },
|
|
2862
|
+
},
|
|
2863
|
+
required: ["kind", "target"],
|
|
2864
|
+
},
|
|
2865
|
+
description: "Where to deliver (at least one)",
|
|
2866
|
+
},
|
|
2867
|
+
project_id: { type: "string", description: "Optional project (required for the roadmap section)" },
|
|
2868
|
+
window: { type: "string", description: "Lookback as a Go duration, default 168h, at most 2160h" },
|
|
2869
|
+
audience: {
|
|
2870
|
+
type: "string",
|
|
2871
|
+
enum: ["investor", "leadership", "customer", "product"],
|
|
2872
|
+
description: "Audience filter. Omit for internal. customer/product strip sensitive entries (finance, partners, token spend).",
|
|
2873
|
+
},
|
|
2874
|
+
enabled: { type: "boolean", description: "Default true" },
|
|
2875
|
+
},
|
|
2876
|
+
required: ["name", "schedule", "sections", "delivery_targets"],
|
|
2877
|
+
},
|
|
2878
|
+
},
|
|
2879
|
+
{
|
|
2880
|
+
name: "report_schedule_list",
|
|
2881
|
+
description: "List your org's report schedules (enabled flag, watermark, consecutive failures).",
|
|
2882
|
+
inputSchema: { type: "object", properties: {} },
|
|
2883
|
+
},
|
|
2884
|
+
{
|
|
2885
|
+
name: "report_schedule_delete",
|
|
2886
|
+
description: "Delete a report schedule. Past runs stay readable only while the schedule exists.",
|
|
2887
|
+
inputSchema: {
|
|
2888
|
+
type: "object",
|
|
2889
|
+
properties: { schedule_id: { type: "string", description: "Schedule id" } },
|
|
2890
|
+
required: ["schedule_id"],
|
|
2891
|
+
},
|
|
2892
|
+
},
|
|
2893
|
+
{
|
|
2894
|
+
name: "report_run_now",
|
|
2895
|
+
description: "Force a run of a schedule now, through the same code the cron uses (it delivers, and advances the watermark on delivery). Returns the run: status success|partial|failed, window, per-source availability, per-channel delivery outcome, token accounting.",
|
|
2896
|
+
inputSchema: {
|
|
2897
|
+
type: "object",
|
|
2898
|
+
properties: { schedule_id: { type: "string", description: "Schedule id" } },
|
|
2899
|
+
required: ["schedule_id"],
|
|
2900
|
+
},
|
|
2901
|
+
},
|
|
2902
|
+
{
|
|
2903
|
+
name: "report_get",
|
|
2904
|
+
description: "Read report runs. With run_id: one run, its snapshot, and (format=markdown, the default) the report as delivered. With schedule_id: that schedule's run history, newest first.",
|
|
2905
|
+
inputSchema: {
|
|
2906
|
+
type: "object",
|
|
2907
|
+
properties: {
|
|
2908
|
+
run_id: { type: "string", description: "Run id" },
|
|
2909
|
+
schedule_id: { type: "string", description: "Schedule id (lists runs)" },
|
|
2910
|
+
format: { type: "string", enum: ["json", "markdown"], description: "For run_id: include the rendered markdown (default markdown)" },
|
|
2911
|
+
limit: { type: "number", description: "For schedule_id: max runs (default 50)" },
|
|
2912
|
+
},
|
|
2913
|
+
},
|
|
2914
|
+
},
|
|
2830
2915
|
// ── Secrets Vault ──
|
|
2831
2916
|
{
|
|
2832
2917
|
name: "secret_set",
|
|
@@ -3155,6 +3240,10 @@ export async function handleToolCall(name, args, client, context) {
|
|
|
3155
3240
|
if (isIntakeRequestTool(name)) {
|
|
3156
3241
|
return handleIntakeRequestToolCall(name, args, client, () => state.loadState(context.getWorkingDir())?.project_id);
|
|
3157
3242
|
}
|
|
3243
|
+
// Employee training (add-employee-training-loops). Same module pattern.
|
|
3244
|
+
if (isEmployeeTrainingTool(name)) {
|
|
3245
|
+
return handleEmployeeTrainingToolCall(name, args, client);
|
|
3246
|
+
}
|
|
3158
3247
|
// Goshti reads (add-agent-goshti-read §3.1). Same module pattern. The owner's
|
|
3159
3248
|
// grant, the per-agent switch and the fixed tool list are all the server's
|
|
3160
3249
|
// decisions; this only shapes the call and labels the answer as other
|
|
@@ -3162,6 +3251,20 @@ export async function handleToolCall(name, args, client, context) {
|
|
|
3162
3251
|
if (isGoshtiReadTool(name)) {
|
|
3163
3252
|
return handleGoshtiReadToolCall(name, args, client);
|
|
3164
3253
|
}
|
|
3254
|
+
// Orchestrated runs (add-live-animated-views §1.8). Same module pattern. The
|
|
3255
|
+
// run id run_open returns is kept in .agenthub/state, so the other run tools
|
|
3256
|
+
// (and sub-agents sharing the checkout's state) default to it.
|
|
3257
|
+
if (isRunTool(name)) {
|
|
3258
|
+
const workingDir = context.getWorkingDir();
|
|
3259
|
+
return handleRunToolCall(name, args, client, {
|
|
3260
|
+
get: () => state.loadState(workingDir)?.run_id,
|
|
3261
|
+
set: (runId) => {
|
|
3262
|
+
const current = state.loadState(workingDir);
|
|
3263
|
+
if (current)
|
|
3264
|
+
state.saveState(workingDir, { ...current, run_id: runId });
|
|
3265
|
+
},
|
|
3266
|
+
});
|
|
3267
|
+
}
|
|
3165
3268
|
switch (name) {
|
|
3166
3269
|
// Registration
|
|
3167
3270
|
case "agent_register": {
|
|
@@ -5461,6 +5564,48 @@ export async function handleToolCall(name, args, client, context) {
|
|
|
5461
5564
|
body.audience = args.audience;
|
|
5462
5565
|
return client.post(`/projects/${projectId}/roadmap/share/slack`, body);
|
|
5463
5566
|
}
|
|
5567
|
+
// ── Scheduled Reporting (add-scheduled-reporting §6.2) ──
|
|
5568
|
+
case "report_schedule_create": {
|
|
5569
|
+
const body = {
|
|
5570
|
+
name: args.name,
|
|
5571
|
+
schedule: args.schedule,
|
|
5572
|
+
sections: args.sections,
|
|
5573
|
+
delivery_targets: args.delivery_targets,
|
|
5574
|
+
};
|
|
5575
|
+
for (const k of ["project_id", "window", "audience", "enabled"]) {
|
|
5576
|
+
if (args[k] !== undefined)
|
|
5577
|
+
body[k] = args[k];
|
|
5578
|
+
}
|
|
5579
|
+
return client.post("/reports/schedules", body);
|
|
5580
|
+
}
|
|
5581
|
+
case "report_schedule_list":
|
|
5582
|
+
return client.get("/reports/schedules");
|
|
5583
|
+
case "report_schedule_delete": {
|
|
5584
|
+
const id = args.schedule_id;
|
|
5585
|
+
if (!id)
|
|
5586
|
+
throw new Error("schedule_id is required");
|
|
5587
|
+
return client.del(`/reports/schedules/${encodeURIComponent(id)}`);
|
|
5588
|
+
}
|
|
5589
|
+
case "report_run_now": {
|
|
5590
|
+
const id = args.schedule_id;
|
|
5591
|
+
if (!id)
|
|
5592
|
+
throw new Error("schedule_id is required");
|
|
5593
|
+
return client.post(`/reports/schedules/${encodeURIComponent(id)}/run`, {});
|
|
5594
|
+
}
|
|
5595
|
+
case "report_get": {
|
|
5596
|
+
const runId = args.run_id;
|
|
5597
|
+
const scheduleId = args.schedule_id;
|
|
5598
|
+
if (runId) {
|
|
5599
|
+
const format = (args.format || "markdown").toLowerCase();
|
|
5600
|
+
const suffix = format === "markdown" ? "?format=markdown" : "";
|
|
5601
|
+
return client.get(`/reports/runs/${encodeURIComponent(runId)}${suffix}`);
|
|
5602
|
+
}
|
|
5603
|
+
if (scheduleId) {
|
|
5604
|
+
const limit = args.limit !== undefined ? `?limit=${Number(args.limit)}` : "";
|
|
5605
|
+
return client.get(`/reports/schedules/${encodeURIComponent(scheduleId)}/runs${limit}`);
|
|
5606
|
+
}
|
|
5607
|
+
throw new Error("run_id or schedule_id is required");
|
|
5608
|
+
}
|
|
5464
5609
|
// ── Capabilities (add-agent-capabilities Phase 2 §2.3) ──
|
|
5465
5610
|
case "capability_list": {
|
|
5466
5611
|
if (!agentId) {
|