agenthub-multiagent-mcp 1.22.0 → 1.23.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 +47 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +38 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/skillInstaller.d.ts +27 -1
- package/dist/skillInstaller.d.ts.map +1 -1
- package/dist/skillInstaller.gate.test.d.ts +2 -0
- package/dist/skillInstaller.gate.test.d.ts.map +1 -0
- package/dist/skillInstaller.gate.test.js +95 -0
- package/dist/skillInstaller.gate.test.js.map +1 -0
- package/dist/skillInstaller.js +59 -0
- package/dist/skillInstaller.js.map +1 -1
- package/dist/skillInstaller.test.js +19 -1
- package/dist/skillInstaller.test.js.map +1 -1
- package/dist/tools/capabilities.test.d.ts +6 -0
- package/dist/tools/capabilities.test.d.ts.map +1 -0
- package/dist/tools/capabilities.test.js +154 -0
- package/dist/tools/capabilities.test.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +88 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/tools.test.js +6 -2
- package/dist/tools/tools.test.js.map +1 -1
- package/package.json +1 -1
- package/skills/catalog.json +18 -0
- package/skills/manifest.json +11 -0
- package/skills/skills/deploy-staging/SKILL.md +164 -0
- package/skills/skills/deploy-vps-openclaw/SKILL.md +97 -0
package/dist/skillInstaller.js
CHANGED
|
@@ -14,6 +14,24 @@ import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
|
14
14
|
import { homedir } from "node:os";
|
|
15
15
|
import { dirname, join, resolve } from "node:path";
|
|
16
16
|
import { fileURLToPath } from "node:url";
|
|
17
|
+
// buildCapabilityGate maps catalog skill capabilities + the agent's attached
|
|
18
|
+
// capability names onto bundle skill paths. The bundle path convention is
|
|
19
|
+
// `skills/<name>/SKILL.md`, matching the catalog row name to the bundled skill
|
|
20
|
+
// directory. (CR-R2.1)
|
|
21
|
+
export function buildCapabilityGate(catalogSkillCaps, attachedCapNames) {
|
|
22
|
+
const destructiveSkillPaths = new Set();
|
|
23
|
+
const attachedSkillPaths = new Set();
|
|
24
|
+
for (const cap of catalogSkillCaps) {
|
|
25
|
+
const path = `skills/${cap.name}/SKILL.md`;
|
|
26
|
+
if (cap.tier === "destructive") {
|
|
27
|
+
destructiveSkillPaths.add(path);
|
|
28
|
+
}
|
|
29
|
+
if (attachedCapNames.has(cap.name)) {
|
|
30
|
+
attachedSkillPaths.add(path);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { destructiveSkillPaths, attachedSkillPaths };
|
|
34
|
+
}
|
|
17
35
|
function sha256(buf) {
|
|
18
36
|
return createHash("sha256").update(buf).digest("hex");
|
|
19
37
|
}
|
|
@@ -51,8 +69,32 @@ async function listBundledSkills(bundleDir) {
|
|
|
51
69
|
"commands/start-session.md",
|
|
52
70
|
"commands/close-session.md",
|
|
53
71
|
"skills/karpathy-guidelines/SKILL.md",
|
|
72
|
+
// Destructive deploy runbooks — gated by CR-R2 (only installed for agents
|
|
73
|
+
// with the matching kind=skill capability attached).
|
|
74
|
+
"skills/deploy-staging/SKILL.md",
|
|
75
|
+
"skills/deploy-vps-openclaw/SKILL.md",
|
|
54
76
|
];
|
|
55
77
|
}
|
|
78
|
+
// gateForAgent builds a CapabilityGate by fetching the catalog (for kind=skill
|
|
79
|
+
// destructive rows) and the agent's attachments. Returns undefined on any
|
|
80
|
+
// failure — the installer then proceeds ungated, which is safe because no
|
|
81
|
+
// destructive-tier skills are bundled by default. (CR-R2.1)
|
|
82
|
+
export async function gateForAgent(client, agentId) {
|
|
83
|
+
try {
|
|
84
|
+
const [catalog, attached] = await Promise.all([
|
|
85
|
+
client.listCapabilities(),
|
|
86
|
+
client.listAgentCapabilities(agentId),
|
|
87
|
+
]);
|
|
88
|
+
const catalogSkillCaps = catalog.capabilities
|
|
89
|
+
.filter((c) => c.kind === "skill")
|
|
90
|
+
.map((c) => ({ name: c.name, tier: c.tier }));
|
|
91
|
+
const attachedNames = new Set(attached.capabilities.filter((c) => c.kind === "skill").map((c) => c.capability_name));
|
|
92
|
+
return buildCapabilityGate(catalogSkillCaps, attachedNames);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
56
98
|
async function tryReadFile(path) {
|
|
57
99
|
try {
|
|
58
100
|
return await readFile(path);
|
|
@@ -76,6 +118,20 @@ export async function installSkills(options = {}) {
|
|
|
76
118
|
for (const skillPath of skillPaths) {
|
|
77
119
|
const bundlePath = join(bundleDir, skillPath);
|
|
78
120
|
const targetPath = join(claudeDir, skillPath);
|
|
121
|
+
// CR-R2.2: gate destructive-tier skills on attachment. A destructive skill
|
|
122
|
+
// the agent hasn't attached is never written to disk, so the Skill tool
|
|
123
|
+
// can't see it.
|
|
124
|
+
if (options.gate &&
|
|
125
|
+
options.gate.destructiveSkillPaths.has(skillPath) &&
|
|
126
|
+
!options.gate.attachedSkillPaths.has(skillPath)) {
|
|
127
|
+
report.actions.push({
|
|
128
|
+
skill: skillPath,
|
|
129
|
+
target: targetPath,
|
|
130
|
+
action: "skipped_no_capability",
|
|
131
|
+
message: "destructive-tier skill requires an attached capability",
|
|
132
|
+
});
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
79
135
|
try {
|
|
80
136
|
const bundleBuf = await readFile(bundlePath);
|
|
81
137
|
const bundleHash = sha256(bundleBuf);
|
|
@@ -147,6 +203,9 @@ export function formatReport(report) {
|
|
|
147
203
|
case "skipped_user_modified":
|
|
148
204
|
lines.push(` skipped ${a.skill} (user-modified)`);
|
|
149
205
|
break;
|
|
206
|
+
case "skipped_no_capability":
|
|
207
|
+
lines.push(` skipped ${a.skill} (no attached capability)`);
|
|
208
|
+
break;
|
|
150
209
|
case "would_install":
|
|
151
210
|
lines.push(` would install ${a.skill}`);
|
|
152
211
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillInstaller.js","sourceRoot":"","sources":["../src/skillInstaller.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,uDAAuD;AACvD,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,qEAAqE;AACrE,6BAA6B;AAC7B,sCAAsC;AACtC,oDAAoD;AACpD,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAQ,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"skillInstaller.js","sourceRoot":"","sources":["../src/skillInstaller.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,12 @@ import { installSkills } from "./skillInstaller.js";
|
|
|
7
7
|
const SKILL_A = "commands/start-session.md";
|
|
8
8
|
const SKILL_B = "commands/close-session.md";
|
|
9
9
|
const SKILL_C = "skills/karpathy-guidelines/SKILL.md";
|
|
10
|
+
// Destructive deploy runbooks are also bundled (gated by CR-R2). They have fixed
|
|
11
|
+
// bodies in the fixture so the no-op / count assertions stay deterministic.
|
|
12
|
+
const SKILL_D = "skills/deploy-staging/SKILL.md";
|
|
13
|
+
const SKILL_E = "skills/deploy-vps-openclaw/SKILL.md";
|
|
14
|
+
const DEPLOY_STAGING_BODY = "deploy-staging v1";
|
|
15
|
+
const DEPLOY_VPS_BODY = "deploy-vps-openclaw v1";
|
|
10
16
|
function sha256(s) {
|
|
11
17
|
return createHash("sha256").update(s).digest("hex");
|
|
12
18
|
}
|
|
@@ -15,15 +21,21 @@ function seedBundle(bundleDir, opts) {
|
|
|
15
21
|
mkdirSync(join(bundleDir, "commands"), { recursive: true });
|
|
16
22
|
mkdirSync(join(bundleDir, "skills"), { recursive: true });
|
|
17
23
|
mkdirSync(join(bundleDir, "skills", "karpathy-guidelines"), { recursive: true });
|
|
24
|
+
mkdirSync(join(bundleDir, "skills", "deploy-staging"), { recursive: true });
|
|
25
|
+
mkdirSync(join(bundleDir, "skills", "deploy-vps-openclaw"), { recursive: true });
|
|
18
26
|
writeFileSync(join(bundleDir, SKILL_A), opts.startBody);
|
|
19
27
|
writeFileSync(join(bundleDir, SKILL_B), opts.closeBody);
|
|
20
28
|
writeFileSync(join(bundleDir, SKILL_C), karpathyBody);
|
|
29
|
+
writeFileSync(join(bundleDir, SKILL_D), DEPLOY_STAGING_BODY);
|
|
30
|
+
writeFileSync(join(bundleDir, SKILL_E), DEPLOY_VPS_BODY);
|
|
21
31
|
const manifest = {
|
|
22
32
|
version: 1,
|
|
23
33
|
skills: {
|
|
24
34
|
[SKILL_A]: { hashes: opts.manifestHashes?.[SKILL_A] ?? [sha256(opts.startBody)] },
|
|
25
35
|
[SKILL_B]: { hashes: opts.manifestHashes?.[SKILL_B] ?? [sha256(opts.closeBody)] },
|
|
26
36
|
[SKILL_C]: { hashes: opts.manifestHashes?.[SKILL_C] ?? [sha256(karpathyBody)] },
|
|
37
|
+
[SKILL_D]: { hashes: opts.manifestHashes?.[SKILL_D] ?? [sha256(DEPLOY_STAGING_BODY)] },
|
|
38
|
+
[SKILL_E]: { hashes: opts.manifestHashes?.[SKILL_E] ?? [sha256(DEPLOY_VPS_BODY)] },
|
|
27
39
|
},
|
|
28
40
|
};
|
|
29
41
|
writeFileSync(join(bundleDir, "manifest.json"), JSON.stringify(manifest));
|
|
@@ -45,18 +57,24 @@ describe("installSkills", () => {
|
|
|
45
57
|
seedBundle(bundleDir, { startBody: "start v1", closeBody: "close v1" });
|
|
46
58
|
const report = await installSkills({ targetHome: home, bundleDir });
|
|
47
59
|
expect(report.errors).toEqual([]);
|
|
48
|
-
expect(report.actions.
|
|
60
|
+
expect(report.actions.every((a) => a.action === "installed")).toBe(true);
|
|
61
|
+
expect(report.actions).toHaveLength(5);
|
|
49
62
|
expect(readFileSync(join(home, ".claude", SKILL_A), "utf8")).toBe("start v1");
|
|
50
63
|
expect(readFileSync(join(home, ".claude", SKILL_B), "utf8")).toBe("close v1");
|
|
51
64
|
expect(readFileSync(join(home, ".claude", SKILL_C), "utf8")).toBe("karpathy v1");
|
|
65
|
+
expect(readFileSync(join(home, ".claude", SKILL_D), "utf8")).toBe(DEPLOY_STAGING_BODY);
|
|
52
66
|
});
|
|
53
67
|
it("no-ops when target matches current bundle", async () => {
|
|
54
68
|
seedBundle(bundleDir, { startBody: "v1", closeBody: "v1", karpathyBody: "v1" });
|
|
55
69
|
mkdirSync(join(home, ".claude", "commands"), { recursive: true });
|
|
56
70
|
mkdirSync(join(home, ".claude", "skills", "karpathy-guidelines"), { recursive: true });
|
|
71
|
+
mkdirSync(join(home, ".claude", "skills", "deploy-staging"), { recursive: true });
|
|
72
|
+
mkdirSync(join(home, ".claude", "skills", "deploy-vps-openclaw"), { recursive: true });
|
|
57
73
|
writeFileSync(join(home, ".claude", SKILL_A), "v1");
|
|
58
74
|
writeFileSync(join(home, ".claude", SKILL_B), "v1");
|
|
59
75
|
writeFileSync(join(home, ".claude", SKILL_C), "v1");
|
|
76
|
+
writeFileSync(join(home, ".claude", SKILL_D), DEPLOY_STAGING_BODY);
|
|
77
|
+
writeFileSync(join(home, ".claude", SKILL_E), DEPLOY_VPS_BODY);
|
|
60
78
|
const report = await installSkills({ targetHome: home, bundleDir });
|
|
61
79
|
expect(report.actions.every((a) => a.action === "skipped_current")).toBe(true);
|
|
62
80
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillInstaller.test.js","sourceRoot":"","sources":["../src/skillInstaller.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAa,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7G,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAC5C,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAC5C,MAAM,OAAO,GAAG,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"skillInstaller.test.js","sourceRoot":"","sources":["../src/skillInstaller.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAa,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7G,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAC5C,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAC5C,MAAM,OAAO,GAAG,qCAAqC,CAAC;AACtD,iFAAiF;AACjF,4EAA4E;AAC5E,MAAM,OAAO,GAAG,gCAAgC,CAAC;AACjD,MAAM,OAAO,GAAG,qCAAqC,CAAC;AACtD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAChD,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAEjD,SAAS,MAAM,CAAC,CAAkB;IAChC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,UAAU,CACjB,SAAiB,EACjB,IAKC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,CAAC;IACxD,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxD,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxD,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;IACtD,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC7D,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,CAAC;QACV,MAAM,EAAE;YACN,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE;YACjF,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE;YACjF,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE;YAC/E,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE;YACtF,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE;SACnF;KACF,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,GAAW,CAAC;IAChB,IAAI,IAAY,CAAC;IACjB,IAAI,SAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzB,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9E,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9E,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjF,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACnE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,OAAO,GAAG,UAAU,CAAC;QAC3B,MAAM,OAAO,GAAG,UAAU,CAAC;QAC3B,UAAU,CAAC,SAAS,EAAE;YACpB,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,UAAU;YACrB,cAAc,EAAE;gBACd,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC7C,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;aAChC;SACF,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9E,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAElF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACnD,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACnD,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACnD,iCAAiC;QACjC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAEtE,8EAA8E;QAC9E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAEvG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChD,wEAAwE;QACxE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.test.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for capability MCP tool handlers.
|
|
3
|
+
* add-agent-capabilities Phase 2 §2.3.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, vi } from "vitest";
|
|
6
|
+
import { handleToolCall } from "./index.js";
|
|
7
|
+
// ─── Module mocks ──────────────────────────────────────────────────────────
|
|
8
|
+
vi.mock("../state.js", () => ({
|
|
9
|
+
loadState: vi.fn(() => null),
|
|
10
|
+
saveState: vi.fn(),
|
|
11
|
+
deleteState: vi.fn(),
|
|
12
|
+
stateExists: vi.fn(() => false),
|
|
13
|
+
getCurrentOwner: vi.fn(() => "test-user"),
|
|
14
|
+
}));
|
|
15
|
+
vi.mock("../hooks/sessionState.js", async (importOriginal) => {
|
|
16
|
+
const actual = await importOriginal();
|
|
17
|
+
return { ...actual, isEnabled: vi.fn(() => false) };
|
|
18
|
+
});
|
|
19
|
+
// ─── Shared fixtures ───────────────────────────────────────────────────────
|
|
20
|
+
const AGENT_ID = "test-agent-42";
|
|
21
|
+
function createMockContext(agentId = AGENT_ID) {
|
|
22
|
+
return {
|
|
23
|
+
getCurrentAgentId: () => agentId,
|
|
24
|
+
setCurrentAgentId: vi.fn(),
|
|
25
|
+
stopHeartbeat: vi.fn(),
|
|
26
|
+
getWorkingDir: () => "/tmp/test",
|
|
27
|
+
setWorkingDir: vi.fn(),
|
|
28
|
+
getPushedItems: () => ({ tasks: [], messages: [] }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function buildMockClient(overrides = {}) {
|
|
32
|
+
return {
|
|
33
|
+
// Base stubs used by wrapWithPendingItems
|
|
34
|
+
getInbox: vi.fn().mockResolvedValue({ messages: [] }),
|
|
35
|
+
getPendingTasks: vi.fn().mockResolvedValue({ tasks: [] }),
|
|
36
|
+
// Capability methods
|
|
37
|
+
listAgentCapabilities: vi.fn(),
|
|
38
|
+
invokeCapability: vi.fn(),
|
|
39
|
+
requestCapability: vi.fn(),
|
|
40
|
+
// Other stubs the switch might need
|
|
41
|
+
post: vi.fn(),
|
|
42
|
+
get: vi.fn(),
|
|
43
|
+
...overrides,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// ─── capability_list ───────────────────────────────────────────────────────
|
|
47
|
+
describe("capability_list", () => {
|
|
48
|
+
it("calls listAgentCapabilities with the current agent id", async () => {
|
|
49
|
+
const expected = {
|
|
50
|
+
capabilities: [
|
|
51
|
+
{
|
|
52
|
+
capability_id: "cap-1",
|
|
53
|
+
capability_name: "test-vault",
|
|
54
|
+
kind: "vault",
|
|
55
|
+
tier: "read",
|
|
56
|
+
attached_by: "user-1",
|
|
57
|
+
attached_at: "2026-05-20T00:00:00Z",
|
|
58
|
+
scope: { deny: false },
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
const client = buildMockClient({
|
|
63
|
+
listAgentCapabilities: vi.fn().mockResolvedValue(expected),
|
|
64
|
+
});
|
|
65
|
+
const ctx = createMockContext();
|
|
66
|
+
const result = await handleToolCall("capability_list", {}, client, ctx);
|
|
67
|
+
expect(client.listAgentCapabilities).toHaveBeenCalledWith(AGENT_ID);
|
|
68
|
+
// wrapWithPendingItems may wrap the result; check the nested result field.
|
|
69
|
+
const r = result.result ?? result;
|
|
70
|
+
expect(r).toEqual(expected);
|
|
71
|
+
});
|
|
72
|
+
it("throws when no agent id is set", async () => {
|
|
73
|
+
const client = buildMockClient();
|
|
74
|
+
const ctx = createMockContext(""); // no agent id
|
|
75
|
+
await expect(handleToolCall("capability_list", {}, client, ctx)).rejects.toThrow(/agent_register/);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// ─── capability_invoke ─────────────────────────────────────────────────────
|
|
79
|
+
describe("capability_invoke", () => {
|
|
80
|
+
it("calls invokeCapability and returns vault response", async () => {
|
|
81
|
+
const vaultResponse = {
|
|
82
|
+
kind: "vault",
|
|
83
|
+
secrets: { MY_SECRET: "supersecret" },
|
|
84
|
+
missing: [],
|
|
85
|
+
};
|
|
86
|
+
const client = buildMockClient({
|
|
87
|
+
invokeCapability: vi.fn().mockResolvedValue(vaultResponse),
|
|
88
|
+
});
|
|
89
|
+
const ctx = createMockContext();
|
|
90
|
+
const result = await handleToolCall("capability_invoke", { capability_id: "test-vault", params: { env: "staging" } }, client, ctx);
|
|
91
|
+
expect(client.invokeCapability).toHaveBeenCalledWith("test-vault", { env: "staging" });
|
|
92
|
+
const r = result.result ?? result;
|
|
93
|
+
expect(r.kind).toBe("vault");
|
|
94
|
+
expect(r.secrets).toEqual({ MY_SECRET: "supersecret" });
|
|
95
|
+
});
|
|
96
|
+
it("calls invokeCapability with empty params when params omitted", async () => {
|
|
97
|
+
const client = buildMockClient({
|
|
98
|
+
invokeCapability: vi.fn().mockResolvedValue({ kind: "skill", skill_name: "deploy-staging", hint: "hint" }),
|
|
99
|
+
});
|
|
100
|
+
const ctx = createMockContext();
|
|
101
|
+
await handleToolCall("capability_invoke", { capability_id: "deploy-staging" }, client, ctx);
|
|
102
|
+
expect(client.invokeCapability).toHaveBeenCalledWith("deploy-staging", {});
|
|
103
|
+
});
|
|
104
|
+
it("throws when capability_id is missing", async () => {
|
|
105
|
+
const client = buildMockClient();
|
|
106
|
+
const ctx = createMockContext();
|
|
107
|
+
await expect(handleToolCall("capability_invoke", {}, client, ctx)).rejects.toThrow(/capability_id/);
|
|
108
|
+
});
|
|
109
|
+
it("throws when no agent id is set", async () => {
|
|
110
|
+
const client = buildMockClient();
|
|
111
|
+
const ctx = createMockContext("");
|
|
112
|
+
await expect(handleToolCall("capability_invoke", { capability_id: "x" }, client, ctx)).rejects.toThrow(/agent_register/);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// ─── capability_request ────────────────────────────────────────────────────
|
|
116
|
+
describe("capability_request", () => {
|
|
117
|
+
it("returns attached:true for read/write tier direct attach", async () => {
|
|
118
|
+
const client = buildMockClient({
|
|
119
|
+
requestCapability: vi.fn().mockResolvedValue({
|
|
120
|
+
agent_id: AGENT_ID,
|
|
121
|
+
capability_id: "cap-read-1",
|
|
122
|
+
}),
|
|
123
|
+
});
|
|
124
|
+
const ctx = createMockContext();
|
|
125
|
+
const result = await handleToolCall("capability_request", { capability_id: "cap-read-1", reason: "need it" }, client, ctx);
|
|
126
|
+
expect(client.requestCapability).toHaveBeenCalledWith(AGENT_ID, "cap-read-1", "need it");
|
|
127
|
+
const r = result.result ?? result;
|
|
128
|
+
expect(r.attached).toBe(true);
|
|
129
|
+
});
|
|
130
|
+
it("returns request_id + pending status for destructive tier", async () => {
|
|
131
|
+
const client = buildMockClient({
|
|
132
|
+
requestCapability: vi.fn().mockResolvedValue({
|
|
133
|
+
request_id: "req-999",
|
|
134
|
+
status: "pending",
|
|
135
|
+
}),
|
|
136
|
+
});
|
|
137
|
+
const ctx = createMockContext();
|
|
138
|
+
const result = await handleToolCall("capability_request", { capability_id: "ssh-staging", reason: "deploy test" }, client, ctx);
|
|
139
|
+
const r = result.result ?? result;
|
|
140
|
+
expect(r.request_id).toBe("req-999");
|
|
141
|
+
expect(r.status).toBe("pending");
|
|
142
|
+
});
|
|
143
|
+
it("throws when no agent id is set", async () => {
|
|
144
|
+
const client = buildMockClient();
|
|
145
|
+
const ctx = createMockContext("");
|
|
146
|
+
await expect(handleToolCall("capability_request", { capability_id: "x" }, client, ctx)).rejects.toThrow(/agent_register/);
|
|
147
|
+
});
|
|
148
|
+
it("throws when capability_id is missing", async () => {
|
|
149
|
+
const client = buildMockClient();
|
|
150
|
+
const ctx = createMockContext();
|
|
151
|
+
await expect(handleToolCall("capability_request", {}, client, ctx)).rejects.toThrow(/capability_id/);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=capabilities.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.test.js","sourceRoot":"","sources":["../../src/tools/capabilities.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;AACrG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AA6B/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,cAAc,EAAE,MAAM,WAAW,CAAC;CACnC;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;AAwJD,wBAAgB,aAAa,IAAI,IAAI,EAAE,
|
|
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;AACrG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AA6B/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,cAAc,EAAE,MAAM,WAAW,CAAC;CACnC;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;AAwJD,wBAAgB,aAAa,IAAI,IAAI,EAAE,CAy1DtC;AAED,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,CAg5DlB"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1911,7 +1911,7 @@ export function registerTools() {
|
|
|
1911
1911
|
},
|
|
1912
1912
|
{
|
|
1913
1913
|
name: "secret_get",
|
|
1914
|
-
description: "
|
|
1914
|
+
description: "DEPRECATED — prefer capability_invoke on a kind=vault capability, which adds per-invocation audit, policy, and rate limits. secret_get remains for backward compatibility and will be removed from the agent surface once direct callers reach zero (tracked via the agenthub_secret_get_direct_calls_total metric). Retrieves a secret value from the vault; access is enforced by scope (org/project/agent).",
|
|
1915
1915
|
inputSchema: {
|
|
1916
1916
|
type: "object",
|
|
1917
1917
|
properties: {
|
|
@@ -1935,6 +1935,60 @@ export function registerTools() {
|
|
|
1935
1935
|
},
|
|
1936
1936
|
},
|
|
1937
1937
|
},
|
|
1938
|
+
// ── Capabilities (add-agent-capabilities Phase 2 §2.3) ──────────────────
|
|
1939
|
+
{
|
|
1940
|
+
name: "capability_list",
|
|
1941
|
+
description: "List this agent's attached capabilities with each capability's resolved scope for the agent's trust tier. " +
|
|
1942
|
+
"Use this to discover what capabilities are available before calling capability_invoke.",
|
|
1943
|
+
inputSchema: {
|
|
1944
|
+
type: "object",
|
|
1945
|
+
properties: {},
|
|
1946
|
+
},
|
|
1947
|
+
},
|
|
1948
|
+
{
|
|
1949
|
+
name: "capability_invoke",
|
|
1950
|
+
description: "Invoke an attached capability by ID or name. " +
|
|
1951
|
+
"For kind=vault: the server reads named secrets from the vault and returns them in {secrets: {NAME: value}}; " +
|
|
1952
|
+
"the agent receives the decrypted values in plaintext (see AC9 — exfil window is documented, not solved). " +
|
|
1953
|
+
"For kind=skill: returns {skill_name, hint} — call the Skill tool with skill_name to execute it. " +
|
|
1954
|
+
"For kind=broker: Phase 3 (returns 501 for now). " +
|
|
1955
|
+
"Writes a per-invocation audit row regardless of outcome.",
|
|
1956
|
+
inputSchema: {
|
|
1957
|
+
type: "object",
|
|
1958
|
+
properties: {
|
|
1959
|
+
capability_id: {
|
|
1960
|
+
type: "string",
|
|
1961
|
+
description: "Capability ID or name (resolved in that order)",
|
|
1962
|
+
},
|
|
1963
|
+
params: {
|
|
1964
|
+
type: "object",
|
|
1965
|
+
description: "Params passed to the capability (schema varies per capability — check capability_list)",
|
|
1966
|
+
},
|
|
1967
|
+
},
|
|
1968
|
+
required: ["capability_id"],
|
|
1969
|
+
},
|
|
1970
|
+
},
|
|
1971
|
+
{
|
|
1972
|
+
name: "capability_request",
|
|
1973
|
+
description: "Request that a capability be attached to this agent. " +
|
|
1974
|
+
"For read/write tier capabilities: attaches immediately and returns {attached: true}. " +
|
|
1975
|
+
"For destructive tier: the request is queued for admin approval and returns {request_id, status: 'pending'}. " +
|
|
1976
|
+
"An admin must approve the request via the dashboard before you can invoke a destructive capability.",
|
|
1977
|
+
inputSchema: {
|
|
1978
|
+
type: "object",
|
|
1979
|
+
properties: {
|
|
1980
|
+
capability_id: {
|
|
1981
|
+
type: "string",
|
|
1982
|
+
description: "Capability ID or name to request",
|
|
1983
|
+
},
|
|
1984
|
+
reason: {
|
|
1985
|
+
type: "string",
|
|
1986
|
+
description: "Why you need this capability (required for destructive-tier caps; shown to the approver)",
|
|
1987
|
+
},
|
|
1988
|
+
},
|
|
1989
|
+
required: ["capability_id"],
|
|
1990
|
+
},
|
|
1991
|
+
},
|
|
1938
1992
|
];
|
|
1939
1993
|
}
|
|
1940
1994
|
export async function handleToolCall(name, args, client, context) {
|
|
@@ -3603,6 +3657,39 @@ export async function handleToolCall(name, args, client, context) {
|
|
|
3603
3657
|
const projectId = args.project_id;
|
|
3604
3658
|
return client.post(`/projects/${projectId}/features/sync-openspec`, {});
|
|
3605
3659
|
}
|
|
3660
|
+
// ── Capabilities (add-agent-capabilities Phase 2 §2.3) ──
|
|
3661
|
+
case "capability_list": {
|
|
3662
|
+
if (!agentId) {
|
|
3663
|
+
throw new Error("capability_list requires an agent identity — run agent_register first");
|
|
3664
|
+
}
|
|
3665
|
+
return client.listAgentCapabilities(agentId);
|
|
3666
|
+
}
|
|
3667
|
+
case "capability_invoke": {
|
|
3668
|
+
if (!agentId) {
|
|
3669
|
+
throw new Error("capability_invoke requires an agent identity — run agent_register first");
|
|
3670
|
+
}
|
|
3671
|
+
const capId = args.capability_id;
|
|
3672
|
+
if (!capId)
|
|
3673
|
+
throw new Error("capability_id is required");
|
|
3674
|
+
const params = (args.params ?? {});
|
|
3675
|
+
return client.invokeCapability(capId, params);
|
|
3676
|
+
}
|
|
3677
|
+
case "capability_request": {
|
|
3678
|
+
if (!agentId) {
|
|
3679
|
+
throw new Error("capability_request requires an agent identity — run agent_register first");
|
|
3680
|
+
}
|
|
3681
|
+
const capId = args.capability_id;
|
|
3682
|
+
if (!capId)
|
|
3683
|
+
throw new Error("capability_id is required");
|
|
3684
|
+
const reason = args.reason;
|
|
3685
|
+
const result = await client.requestCapability(agentId, capId, reason);
|
|
3686
|
+
// Normalise: server returns 201 {agent_id, capability_id} for direct attach
|
|
3687
|
+
// and 202 {request_id, status} for queued destructive requests.
|
|
3688
|
+
if ("request_id" in result && result.request_id) {
|
|
3689
|
+
return result; // {request_id, status: "pending"}
|
|
3690
|
+
}
|
|
3691
|
+
return { attached: true, ...result };
|
|
3692
|
+
}
|
|
3606
3693
|
// ── Secrets Vault ──
|
|
3607
3694
|
case "secret_set": {
|
|
3608
3695
|
const body = {
|