@tangle-network/agent-app 0.60.181 → 0.60.183

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 (45) hide show
  1. package/dist/assistant/index.js +12 -12
  2. package/dist/chat-routes/index.js +23 -23
  3. package/dist/chat-store/index.js +4 -4
  4. package/dist/{chunk-6ZUVYAKB.js → chunk-6O2NQ7WD.js} +9 -9
  5. package/dist/{chunk-IIE3K2Y5.js → chunk-EOPFHXEA.js} +1 -1
  6. package/dist/{chunk-PYPWEXTD.js → chunk-J26IXWFK.js} +12 -12
  7. package/dist/chunk-LTWJYNEC.js +100 -0
  8. package/dist/chunk-LTWJYNEC.js.map +1 -0
  9. package/dist/{chunk-YR6TZ777.js → chunk-TNWDYAFX.js} +6 -6
  10. package/dist/{chunk-T5PPQPOD.js → chunk-TXUAGSFR.js} +1 -1
  11. package/dist/{chunk-T5PPQPOD.js.map → chunk-TXUAGSFR.js.map} +1 -1
  12. package/dist/{chunk-XNKLQG26.js → chunk-ZGUXI5SI.js} +5 -5
  13. package/dist/design-canvas-react/index.js +4 -4
  14. package/dist/design-canvas-react/lazy.js +1 -1
  15. package/dist/model-resolution/allow-list.d.ts +64 -0
  16. package/dist/model-resolution/index.d.ts +1 -0
  17. package/dist/model-resolution/index.js +28 -0
  18. package/dist/model-resolution/index.js.map +1 -1
  19. package/dist/profile/index.js +2 -1
  20. package/dist/profile/index.js.map +1 -1
  21. package/dist/public-consultation/index.d.ts +1 -1
  22. package/dist/public-consultation/index.js +8 -8
  23. package/dist/skills/index.d.ts +1 -0
  24. package/dist/skills/index.js +26 -2
  25. package/dist/skills/marketplace-drizzle.d.ts +121 -0
  26. package/dist/skills/marketplace-drizzle.js +34 -0
  27. package/dist/skills/marketplace-drizzle.js.map +1 -0
  28. package/dist/skills/marketplace.d.ts +104 -0
  29. package/dist/skills-placement/index.js +2 -1
  30. package/dist/skills-placement/index.js.map +1 -1
  31. package/dist/spend/delegate-budget.d.ts +59 -0
  32. package/dist/spend/index.d.ts +1 -0
  33. package/dist/spend/index.js +43 -0
  34. package/dist/spend/index.js.map +1 -1
  35. package/dist/stream/index.js +2 -2
  36. package/dist/toolbelt/index.d.ts +80 -0
  37. package/dist/toolbelt/index.js +178 -0
  38. package/dist/toolbelt/index.js.map +1 -0
  39. package/dist/web-react/index.js +25 -25
  40. package/package.json +11 -1
  41. /package/dist/{chunk-6ZUVYAKB.js.map → chunk-6O2NQ7WD.js.map} +0 -0
  42. /package/dist/{chunk-IIE3K2Y5.js.map → chunk-EOPFHXEA.js.map} +0 -0
  43. /package/dist/{chunk-PYPWEXTD.js.map → chunk-J26IXWFK.js.map} +0 -0
  44. /package/dist/{chunk-YR6TZ777.js.map → chunk-TNWDYAFX.js.map} +0 -0
  45. /package/dist/{chunk-XNKLQG26.js.map → chunk-ZGUXI5SI.js.map} +0 -0
@@ -0,0 +1,80 @@
1
+ /** One authored tool in the product's manifest — the ONE source of truth the
2
+ * generated program and every derived surface (allowlists, prompt tool
3
+ * tables, dashboards) must agree with. */
4
+ export interface ToolbeltManifestTool {
5
+ readonly name: string;
6
+ /** AAA-standard description (what / example / when NOT). Parity requires the
7
+ * program to serve it byte-identical — truncation at a bundle boundary is
8
+ * drift, not formatting. */
9
+ readonly description: string;
10
+ /** JSON Schema for the tool's input. Compared structurally (key order
11
+ * insensitive) when either side declares one. */
12
+ readonly inputSchema?: unknown;
13
+ /** MCP tool annotations (readOnlyHint, …). Compared structurally when the
14
+ * manifest declares them. */
15
+ readonly annotations?: unknown;
16
+ /** Product-defined transport tag (`pure` | `http` | …). Not part of the
17
+ * wire surface; carried so derived surfaces can key off the manifest. */
18
+ readonly transport?: string;
19
+ }
20
+ /** A tool as the spawned program actually listed it. */
21
+ export interface ProbedTool {
22
+ readonly name: string;
23
+ readonly description?: string;
24
+ readonly inputSchema?: unknown;
25
+ readonly annotations?: unknown;
26
+ }
27
+ /** What `probeStdioToolProgram` saw. `serverInfo`/`raw` are included so a
28
+ * failed probe can name the layer (the diagnosability rule: never swallow). */
29
+ export interface ToolProgramProbe {
30
+ readonly tools: readonly ProbedTool[];
31
+ readonly initializeReply: Record<string, unknown> | null;
32
+ }
33
+ export interface ProbeStdioToolProgramOptions {
34
+ /** Path to the program to spawn. Spawned with the current Node executable. */
35
+ readonly program: string;
36
+ /** Extra argv after the program path. */
37
+ readonly args?: readonly string[];
38
+ /** Environment for the child. Defaults to `process.env`. */
39
+ readonly env?: NodeJS.ProcessEnv;
40
+ /** Working directory for the child. */
41
+ readonly cwd?: string;
42
+ /** Wall-clock ceiling for the whole probe. Default 15s. */
43
+ readonly timeoutMs?: number;
44
+ }
45
+ /** Spawn the embedded tool program and read its REAL tool surface. */
46
+ export declare function probeStdioToolProgram(options: ProbeStdioToolProgramOptions): Promise<ToolProgramProbe>;
47
+ /** Field-level drift between the manifest and the program's real surface. */
48
+ export interface ToolbeltFieldDrift {
49
+ readonly name: string;
50
+ readonly manifest: unknown;
51
+ readonly program: unknown;
52
+ }
53
+ /** The named diff. Every array is sorted; empty arrays mean agreement. */
54
+ export interface ToolbeltParityDiff {
55
+ readonly ok: boolean;
56
+ /** Manifest tools the program did not list (the #10155 class: the verb
57
+ * exists in the manifest, absent from the running surface). */
58
+ readonly missingFromProgram: readonly string[];
59
+ /** Tools the program listed that no manifest entry owns. */
60
+ readonly unknownToManifest: readonly string[];
61
+ /** Tools whose served description is not byte-identical to the manifest. */
62
+ readonly descriptionDrift: readonly ToolbeltFieldDrift[];
63
+ /** Tools whose served input schema differs structurally from the manifest. */
64
+ readonly schemaDrift: readonly ToolbeltFieldDrift[];
65
+ /** Tools whose served annotations differ structurally from the manifest. */
66
+ readonly annotationDrift: readonly ToolbeltFieldDrift[];
67
+ }
68
+ /** Diff a spawned program's real surface against the authored manifest. */
69
+ export declare function toolbeltParityDiff(manifest: readonly ToolbeltManifestTool[], listed: readonly ProbedTool[]): ToolbeltParityDiff;
70
+ /** Render a diff as one actionable report — every drift named, never a bare count. */
71
+ export declare function formatToolbeltParityDiff(diff: ToolbeltParityDiff): string;
72
+ /** Thrown by {@link assertToolbeltParity} with the full formatted diff. */
73
+ export declare class ToolbeltParityError extends Error {
74
+ readonly diff: ToolbeltParityDiff;
75
+ constructor(diff: ToolbeltParityDiff);
76
+ }
77
+ /** Assert parity: same names, byte-identical descriptions, structurally equal
78
+ * schemas and annotations. Throws {@link ToolbeltParityError} with every
79
+ * disagreement named — a red build, not a production silence. */
80
+ export declare function assertToolbeltParity(manifest: readonly ToolbeltManifestTool[], listed: readonly ProbedTool[]): void;
@@ -0,0 +1,178 @@
1
+ // src/toolbelt/index.ts
2
+ import { spawn } from "child_process";
3
+ function probeStdioToolProgram(options) {
4
+ const timeoutMs = options.timeoutMs ?? 15e3;
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn(process.execPath, [options.program, ...options.args ?? []], {
7
+ env: options.env ?? process.env,
8
+ cwd: options.cwd,
9
+ stdio: ["pipe", "pipe", "pipe"]
10
+ });
11
+ let stdout = "";
12
+ let stderr = "";
13
+ let settled = false;
14
+ let initializeReply = null;
15
+ const lines = [];
16
+ const finish = (run) => {
17
+ if (settled) return;
18
+ settled = true;
19
+ clearTimeout(timer);
20
+ try {
21
+ child.kill();
22
+ } catch {
23
+ }
24
+ run();
25
+ };
26
+ const timer = setTimeout(
27
+ () => finish(() => reject(new Error(
28
+ `tool program probe timed out after ${timeoutMs}ms waiting for tools/list. stderr so far: ${stderr.trim().slice(0, 2e3) || "(empty)"}; stdout so far: ${stdout.trim().slice(0, 2e3) || "(empty)"}`
29
+ ))),
30
+ timeoutMs
31
+ );
32
+ child.stdout.setEncoding("utf8");
33
+ child.stdout.on("data", (chunk) => {
34
+ stdout += chunk;
35
+ let index;
36
+ while ((index = stdout.indexOf("\n")) >= 0) {
37
+ const line = stdout.slice(0, index).trim();
38
+ stdout = stdout.slice(index + 1);
39
+ if (!line) continue;
40
+ lines.push(line);
41
+ let message;
42
+ try {
43
+ message = JSON.parse(line);
44
+ } catch {
45
+ continue;
46
+ }
47
+ if (message.method !== void 0) continue;
48
+ if (message.id === 1) initializeReply = message.result ?? null;
49
+ if (message.id === 2 && message.result !== void 0 && message.error === void 0) {
50
+ const rawTools = message.result.tools;
51
+ const tools = Array.isArray(rawTools) ? rawTools.filter((t) => !!t && typeof t === "object" && typeof t.name === "string").map((t) => {
52
+ const tool = t;
53
+ return {
54
+ name: tool.name,
55
+ ...tool.description !== void 0 ? { description: tool.description } : {},
56
+ ...tool.inputSchema !== void 0 ? { inputSchema: tool.inputSchema } : {},
57
+ ...tool.annotations !== void 0 ? { annotations: tool.annotations } : {}
58
+ };
59
+ }) : [];
60
+ finish(() => resolve({ tools, initializeReply }));
61
+ } else if (message.id === 2 && message.error !== void 0) {
62
+ finish(() => reject(new Error(
63
+ `tool program refused tools/list: ${JSON.stringify(message.error)}`
64
+ )));
65
+ }
66
+ }
67
+ });
68
+ child.stderr.setEncoding("utf8");
69
+ child.stderr.on("data", (chunk) => {
70
+ stderr += chunk;
71
+ });
72
+ child.on("error", (error) => finish(() => reject(new Error(
73
+ `tool program probe failed to spawn ${options.program}: ${error.message}`
74
+ ))));
75
+ child.on("exit", (code, signal) => finish(() => reject(new Error(
76
+ `tool program exited before answering tools/list (code ${code}${signal ? `, signal ${signal}` : ""}). stderr: ${stderr.trim().slice(0, 2e3) || "(empty)"}`
77
+ ))));
78
+ const send = (payload) => {
79
+ try {
80
+ child.stdin.write(JSON.stringify(payload) + "\n");
81
+ } catch {
82
+ }
83
+ };
84
+ send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: { name: "toolbelt-parity", version: "0.0.0" } } });
85
+ send({ jsonrpc: "2.0", method: "notifications/initialized" });
86
+ send({ jsonrpc: "2.0", id: 2, method: "tools/list" });
87
+ });
88
+ }
89
+ function stableStringify(value) {
90
+ if (value === null || typeof value !== "object") return JSON.stringify(value) ?? "null";
91
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
92
+ const entries = Object.entries(value).filter(([, v]) => v !== void 0).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
93
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(",")}}`;
94
+ }
95
+ function toolbeltParityDiff(manifest, listed) {
96
+ const byName = new Map(manifest.map((tool) => [tool.name, tool]));
97
+ const listedByName = new Map(listed.map((tool) => [tool.name, tool]));
98
+ const missingFromProgram = manifest.filter((tool) => !listedByName.has(tool.name)).map((tool) => tool.name).sort();
99
+ const unknownToManifest = listed.filter((tool) => !byName.has(tool.name)).map((tool) => tool.name).sort();
100
+ const descriptionDrift = [];
101
+ const schemaDrift = [];
102
+ const annotationDrift = [];
103
+ for (const tool of manifest) {
104
+ const served = listedByName.get(tool.name);
105
+ if (!served) continue;
106
+ if (served.description !== tool.description) {
107
+ descriptionDrift.push({ name: tool.name, manifest: tool.description, program: served.description ?? null });
108
+ }
109
+ const manifestSchema = tool.inputSchema;
110
+ if (manifestSchema !== void 0 || served.inputSchema !== void 0) {
111
+ if (stableStringify(manifestSchema) !== stableStringify(served.inputSchema)) {
112
+ schemaDrift.push({ name: tool.name, manifest: manifestSchema ?? null, program: served.inputSchema ?? null });
113
+ }
114
+ }
115
+ const manifestAnnotations = tool.annotations;
116
+ if (manifestAnnotations !== void 0 || served.annotations !== void 0) {
117
+ if (stableStringify(manifestAnnotations) !== stableStringify(served.annotations)) {
118
+ annotationDrift.push({ name: tool.name, manifest: manifestAnnotations ?? null, program: served.annotations ?? null });
119
+ }
120
+ }
121
+ }
122
+ const ok = missingFromProgram.length === 0 && unknownToManifest.length === 0 && descriptionDrift.length === 0 && schemaDrift.length === 0 && annotationDrift.length === 0;
123
+ return {
124
+ ok,
125
+ missingFromProgram,
126
+ unknownToManifest,
127
+ descriptionDrift,
128
+ schemaDrift,
129
+ annotationDrift
130
+ };
131
+ }
132
+ function formatToolbeltParityDiff(diff) {
133
+ if (diff.ok) return "toolbelt parity: the program is the manifest";
134
+ const lines = ["toolbelt parity FAILED \u2014 the program and the manifest disagree:"];
135
+ if (diff.missingFromProgram.length > 0) {
136
+ lines.push(` missing from the program (in the manifest, NOT served): ${diff.missingFromProgram.join(", ")}`);
137
+ }
138
+ if (diff.unknownToManifest.length > 0) {
139
+ lines.push(` unknown to the manifest (served, NOT authored): ${diff.unknownToManifest.join(", ")}`);
140
+ }
141
+ for (const drift of diff.descriptionDrift) {
142
+ lines.push(` description drift on "${drift.name}":`);
143
+ lines.push(` manifest: ${JSON.stringify(drift.manifest)}`);
144
+ lines.push(` program: ${JSON.stringify(drift.program)}`);
145
+ }
146
+ for (const drift of diff.schemaDrift) {
147
+ lines.push(` input-schema drift on "${drift.name}":`);
148
+ lines.push(` manifest: ${stableStringify(drift.manifest)}`);
149
+ lines.push(` program: ${stableStringify(drift.program)}`);
150
+ }
151
+ for (const drift of diff.annotationDrift) {
152
+ lines.push(` annotation drift on "${drift.name}":`);
153
+ lines.push(` manifest: ${stableStringify(drift.manifest)}`);
154
+ lines.push(` program: ${stableStringify(drift.program)}`);
155
+ }
156
+ lines.push(" Fix the ONE manifest (or the generator that derives the program from it) \u2014 never patch a second list.");
157
+ return lines.join("\n");
158
+ }
159
+ var ToolbeltParityError = class extends Error {
160
+ diff;
161
+ constructor(diff) {
162
+ super(formatToolbeltParityDiff(diff));
163
+ this.name = "ToolbeltParityError";
164
+ this.diff = diff;
165
+ }
166
+ };
167
+ function assertToolbeltParity(manifest, listed) {
168
+ const diff = toolbeltParityDiff(manifest, listed);
169
+ if (!diff.ok) throw new ToolbeltParityError(diff);
170
+ }
171
+ export {
172
+ ToolbeltParityError,
173
+ assertToolbeltParity,
174
+ formatToolbeltParityDiff,
175
+ probeStdioToolProgram,
176
+ toolbeltParityDiff
177
+ };
178
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/toolbelt/index.ts"],"sourcesContent":["/**\n * The toolbelt parity gate — one manifest, every target, enforced at build time.\n *\n * A product with an embedded tool program (a stdio MCP the sandbox spawns)\n * has two representations of its tool surface: the manifest it authors and\n * the program that actually answers `tools/list`. Every hour of pain in the\n * fleet's toolbelt history was those two lists disagreeing — a verb present\n * in one target and absent from the other shipped green and failed in\n * production (hardware-agent #10155 class). This module turns that drift\n * class into a red test: spawn the program, read its real surface, diff it\n * against the manifest, and name every disagreement.\n *\n * Substrate-free by design: Node builtins only, no test-framework\n * dependency, no MCP SDK. `probeStdioToolProgram` speaks just enough\n * JSON-RPC (initialize → initialized → tools/list, replies matched by id,\n * notifications ignored) for a zero-dependency embedded program; the diff\n * and the assert are pure functions any runner (vitest, node:test, a tsx\n * script) can call.\n *\n * Canonical consumer shape:\n *\n * ```ts\n * import { assertToolbeltParity, probeStdioToolProgram } from '@tangle-network/agent-app/toolbelt'\n *\n * const probed = await probeStdioToolProgram({ program: programPath, env })\n * assertToolbeltParity(TOOLBELT, probed.tools) // throws with the named diff\n * ```\n */\nimport { spawn } from 'node:child_process'\n\n/** One authored tool in the product's manifest — the ONE source of truth the\n * generated program and every derived surface (allowlists, prompt tool\n * tables, dashboards) must agree with. */\nexport interface ToolbeltManifestTool {\n readonly name: string\n /** AAA-standard description (what / example / when NOT). Parity requires the\n * program to serve it byte-identical — truncation at a bundle boundary is\n * drift, not formatting. */\n readonly description: string\n /** JSON Schema for the tool's input. Compared structurally (key order\n * insensitive) when either side declares one. */\n readonly inputSchema?: unknown\n /** MCP tool annotations (readOnlyHint, …). Compared structurally when the\n * manifest declares them. */\n readonly annotations?: unknown\n /** Product-defined transport tag (`pure` | `http` | …). Not part of the\n * wire surface; carried so derived surfaces can key off the manifest. */\n readonly transport?: string\n}\n\n/** A tool as the spawned program actually listed it. */\nexport interface ProbedTool {\n readonly name: string\n readonly description?: string\n readonly inputSchema?: unknown\n readonly annotations?: unknown\n}\n\n/** What `probeStdioToolProgram` saw. `serverInfo`/`raw` are included so a\n * failed probe can name the layer (the diagnosability rule: never swallow). */\nexport interface ToolProgramProbe {\n readonly tools: readonly ProbedTool[]\n readonly initializeReply: Record<string, unknown> | null\n}\n\nexport interface ProbeStdioToolProgramOptions {\n /** Path to the program to spawn. Spawned with the current Node executable. */\n readonly program: string\n /** Extra argv after the program path. */\n readonly args?: readonly string[]\n /** Environment for the child. Defaults to `process.env`. */\n readonly env?: NodeJS.ProcessEnv\n /** Working directory for the child. */\n readonly cwd?: string\n /** Wall-clock ceiling for the whole probe. Default 15s. */\n readonly timeoutMs?: number\n}\n\n/** Spawn the embedded tool program and read its REAL tool surface. */\nexport function probeStdioToolProgram(options: ProbeStdioToolProgramOptions): Promise<ToolProgramProbe> {\n const timeoutMs = options.timeoutMs ?? 15_000\n return new Promise<ToolProgramProbe>((resolve, reject) => {\n const child = spawn(process.execPath, [options.program, ...(options.args ?? [])], {\n env: options.env ?? process.env,\n cwd: options.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n let settled = false\n let initializeReply: Record<string, unknown> | null = null\n const lines: string[] = []\n\n const finish = (run: () => void) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n try { child.kill() } catch { /* already gone */ }\n run()\n }\n\n const timer = setTimeout(\n () => finish(() => reject(new Error(\n `tool program probe timed out after ${timeoutMs}ms waiting for tools/list. ` +\n `stderr so far: ${stderr.trim().slice(0, 2000) || '(empty)'}; ` +\n `stdout so far: ${stdout.trim().slice(0, 2000) || '(empty)'}`,\n ))),\n timeoutMs,\n )\n\n child.stdout.setEncoding('utf8')\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk\n let index: number\n while ((index = stdout.indexOf('\\n')) >= 0) {\n const line = stdout.slice(0, index).trim()\n stdout = stdout.slice(index + 1)\n if (!line) continue\n lines.push(line)\n let message: Record<string, unknown>\n try {\n message = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue // a banner line, not JSON-RPC\n }\n if (message.method !== undefined) continue // notification from server\n if (message.id === 1) initializeReply = message.result as Record<string, unknown> ?? null\n if (message.id === 2 && message.result !== undefined && message.error === undefined) {\n const rawTools = (message.result as { tools?: unknown }).tools\n const tools: ProbedTool[] = Array.isArray(rawTools)\n ? rawTools.filter((t): t is Record<string, unknown> => !!t && typeof t === 'object' && typeof (t as { name?: unknown }).name === 'string')\n .map((t) => {\n const tool = t as unknown as { name: string; description?: string; inputSchema?: unknown; annotations?: unknown }\n return {\n name: tool.name,\n ...(tool.description !== undefined ? { description: tool.description } : {}),\n ...(tool.inputSchema !== undefined ? { inputSchema: tool.inputSchema } : {}),\n ...(tool.annotations !== undefined ? { annotations: tool.annotations } : {}),\n }\n })\n : []\n finish(() => resolve({ tools, initializeReply }))\n } else if (message.id === 2 && message.error !== undefined) {\n finish(() => reject(new Error(\n `tool program refused tools/list: ${JSON.stringify(message.error)}`,\n )))\n }\n }\n })\n child.stderr.setEncoding('utf8')\n child.stderr.on('data', (chunk: string) => { stderr += chunk })\n child.on('error', (error) => finish(() => reject(new Error(\n `tool program probe failed to spawn ${options.program}: ${error.message}`,\n ))))\n child.on('exit', (code, signal) => finish(() => reject(new Error(\n `tool program exited before answering tools/list (code ${code}${signal ? `, signal ${signal}` : ''}). ` +\n `stderr: ${stderr.trim().slice(0, 2000) || '(empty)'}`,\n ))))\n\n // Minimal MCP handshake: initialize → initialized → tools/list. Replies\n // are matched by id; a program that never replies to initialize still\n // resolves the probe when its tools/list reply arrives.\n const send = (payload: unknown) => { try { child.stdin.write(JSON.stringify(payload) + '\\n') } catch { /* closed; exit handler reports */ } }\n send({ jsonrpc: '2.0', id: 1, method: 'initialize', params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'toolbelt-parity', version: '0.0.0' } } })\n send({ jsonrpc: '2.0', method: 'notifications/initialized' })\n send({ jsonrpc: '2.0', id: 2, method: 'tools/list' })\n })\n}\n\n/** Structural equality with sorted keys — two JSON schemas are the same\n * contract regardless of key order. */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null'\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(',')}}`\n}\n\n/** Field-level drift between the manifest and the program's real surface. */\nexport interface ToolbeltFieldDrift {\n readonly name: string\n readonly manifest: unknown\n readonly program: unknown\n}\n\n/** The named diff. Every array is sorted; empty arrays mean agreement. */\nexport interface ToolbeltParityDiff {\n readonly ok: boolean\n /** Manifest tools the program did not list (the #10155 class: the verb\n * exists in the manifest, absent from the running surface). */\n readonly missingFromProgram: readonly string[]\n /** Tools the program listed that no manifest entry owns. */\n readonly unknownToManifest: readonly string[]\n /** Tools whose served description is not byte-identical to the manifest. */\n readonly descriptionDrift: readonly ToolbeltFieldDrift[]\n /** Tools whose served input schema differs structurally from the manifest. */\n readonly schemaDrift: readonly ToolbeltFieldDrift[]\n /** Tools whose served annotations differ structurally from the manifest. */\n readonly annotationDrift: readonly ToolbeltFieldDrift[]\n}\n\n/** Diff a spawned program's real surface against the authored manifest. */\nexport function toolbeltParityDiff(\n manifest: readonly ToolbeltManifestTool[],\n listed: readonly ProbedTool[],\n): ToolbeltParityDiff {\n const byName = new Map(manifest.map((tool) => [tool.name, tool]))\n const listedByName = new Map(listed.map((tool) => [tool.name, tool]))\n const missingFromProgram = manifest\n .filter((tool) => !listedByName.has(tool.name))\n .map((tool) => tool.name)\n .sort()\n const unknownToManifest = listed\n .filter((tool) => !byName.has(tool.name))\n .map((tool) => tool.name)\n .sort()\n const descriptionDrift: ToolbeltFieldDrift[] = []\n const schemaDrift: ToolbeltFieldDrift[] = []\n const annotationDrift: ToolbeltFieldDrift[] = []\n for (const tool of manifest) {\n const served = listedByName.get(tool.name)\n if (!served) continue\n if (served.description !== tool.description) {\n descriptionDrift.push({ name: tool.name, manifest: tool.description, program: served.description ?? null })\n }\n const manifestSchema = tool.inputSchema\n if (manifestSchema !== undefined || served.inputSchema !== undefined) {\n if (stableStringify(manifestSchema) !== stableStringify(served.inputSchema)) {\n schemaDrift.push({ name: tool.name, manifest: manifestSchema ?? null, program: served.inputSchema ?? null })\n }\n }\n const manifestAnnotations = tool.annotations\n if (manifestAnnotations !== undefined || served.annotations !== undefined) {\n if (stableStringify(manifestAnnotations) !== stableStringify(served.annotations)) {\n annotationDrift.push({ name: tool.name, manifest: manifestAnnotations ?? null, program: served.annotations ?? null })\n }\n }\n }\n const ok = missingFromProgram.length === 0\n && unknownToManifest.length === 0\n && descriptionDrift.length === 0\n && schemaDrift.length === 0\n && annotationDrift.length === 0\n return {\n ok,\n missingFromProgram,\n unknownToManifest,\n descriptionDrift,\n schemaDrift,\n annotationDrift,\n }\n}\n\n/** Render a diff as one actionable report — every drift named, never a bare count. */\nexport function formatToolbeltParityDiff(diff: ToolbeltParityDiff): string {\n if (diff.ok) return 'toolbelt parity: the program is the manifest'\n const lines = ['toolbelt parity FAILED — the program and the manifest disagree:']\n if (diff.missingFromProgram.length > 0) {\n lines.push(` missing from the program (in the manifest, NOT served): ${diff.missingFromProgram.join(', ')}`)\n }\n if (diff.unknownToManifest.length > 0) {\n lines.push(` unknown to the manifest (served, NOT authored): ${diff.unknownToManifest.join(', ')}`)\n }\n for (const drift of diff.descriptionDrift) {\n lines.push(` description drift on \"${drift.name}\":`)\n lines.push(` manifest: ${JSON.stringify(drift.manifest)}`)\n lines.push(` program: ${JSON.stringify(drift.program)}`)\n }\n for (const drift of diff.schemaDrift) {\n lines.push(` input-schema drift on \"${drift.name}\":`)\n lines.push(` manifest: ${stableStringify(drift.manifest)}`)\n lines.push(` program: ${stableStringify(drift.program)}`)\n }\n for (const drift of diff.annotationDrift) {\n lines.push(` annotation drift on \"${drift.name}\":`)\n lines.push(` manifest: ${stableStringify(drift.manifest)}`)\n lines.push(` program: ${stableStringify(drift.program)}`)\n }\n lines.push(' Fix the ONE manifest (or the generator that derives the program from it) — never patch a second list.')\n return lines.join('\\n')\n}\n\n/** Thrown by {@link assertToolbeltParity} with the full formatted diff. */\nexport class ToolbeltParityError extends Error {\n readonly diff: ToolbeltParityDiff\n constructor(diff: ToolbeltParityDiff) {\n super(formatToolbeltParityDiff(diff))\n this.name = 'ToolbeltParityError'\n this.diff = diff\n }\n}\n\n/** Assert parity: same names, byte-identical descriptions, structurally equal\n * schemas and annotations. Throws {@link ToolbeltParityError} with every\n * disagreement named — a red build, not a production silence. */\nexport function assertToolbeltParity(\n manifest: readonly ToolbeltManifestTool[],\n listed: readonly ProbedTool[],\n): void {\n const diff = toolbeltParityDiff(manifest, listed)\n if (!diff.ok) throw new ToolbeltParityError(diff)\n}\n"],"mappings":"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","names":[]}
@@ -143,7 +143,7 @@ import {
143
143
  withoutRecordGridCreated,
144
144
  withoutRecordGridRemoved,
145
145
  withoutRecordGridUpdate
146
- } from "../chunk-6ZUVYAKB.js";
146
+ } from "../chunk-6O2NQ7WD.js";
147
147
  import {
148
148
  SessionHistoryPanel,
149
149
  formatSessionTimestamp,
@@ -155,20 +155,6 @@ import {
155
155
  MENTION_PILL_CLASS
156
156
  } from "../chunk-3HUFJ5LO.js";
157
157
  import "../chunk-FBVLEGEG.js";
158
- import {
159
- WorkspaceInitial,
160
- WorkspaceSwitcher
161
- } from "../chunk-UDLA3NGY.js";
162
- import "../chunk-A2GG4D4A.js";
163
- import {
164
- tabTerminalConnectionId,
165
- useSandboxTerminalConnection
166
- } from "../chunk-E4AY62T2.js";
167
- import {
168
- AGENT_PROFILE_EDITOR_SECTIONS,
169
- AgentProfileEditor,
170
- AgentProfileRegistryError
171
- } from "../chunk-3RHAF2P5.js";
172
158
  import {
173
159
  EvidenceLineageTable,
174
160
  ExceptionList,
@@ -182,9 +168,6 @@ import {
182
168
  workProductStatusLabel,
183
169
  workProductStatusTone
184
170
  } from "../chunk-Y6PRDUFJ.js";
185
- import {
186
- parseReviewQueueItem
187
- } from "../chunk-GEYACSFW.js";
188
171
  import {
189
172
  ChatComposer,
190
173
  ComposerModeControls,
@@ -199,7 +182,21 @@ import {
199
182
  useDictation
200
183
  } from "../chunk-BBHVV37T.js";
201
184
  import "../chunk-L7MB2LLM.js";
185
+ import {
186
+ WorkspaceInitial,
187
+ WorkspaceSwitcher
188
+ } from "../chunk-UDLA3NGY.js";
189
+ import "../chunk-A2GG4D4A.js";
190
+ import {
191
+ tabTerminalConnectionId,
192
+ useSandboxTerminalConnection
193
+ } from "../chunk-E4AY62T2.js";
202
194
  import "../chunk-SJWIZT7B.js";
195
+ import {
196
+ AGENT_PROFILE_EDITOR_SECTIONS,
197
+ AgentProfileEditor,
198
+ AgentProfileRegistryError
199
+ } from "../chunk-3RHAF2P5.js";
203
200
  import {
204
201
  AgentSessionControls,
205
202
  AgentSettingsPopover,
@@ -230,13 +227,16 @@ import {
230
227
  usePopover
231
228
  } from "../chunk-TJ4DYKF2.js";
232
229
  import {
233
- ProviderLogo
234
- } from "../chunk-RASGKEAL.js";
235
- import "../chunk-LN5RBVGP.js";
230
+ parseReviewQueueItem
231
+ } from "../chunk-GEYACSFW.js";
236
232
  import {
237
233
  ReviewFeedbackForm
238
234
  } from "../chunk-ATQQCG4I.js";
239
235
  import "../chunk-WSEXFTN4.js";
236
+ import {
237
+ ProviderLogo
238
+ } from "../chunk-RASGKEAL.js";
239
+ import "../chunk-LN5RBVGP.js";
240
240
  import "../chunk-FQYAJYPW.js";
241
241
  import {
242
242
  ATTACHMENT_ACCEPT
@@ -252,8 +252,7 @@ import {
252
252
  isChatAttachmentPart,
253
253
  mentionInputToPart,
254
254
  mentionPartsFromMessageParts
255
- } from "../chunk-YR6TZ777.js";
256
- import "../chunk-ZVEEWGDK.js";
255
+ } from "../chunk-TNWDYAFX.js";
257
256
  import {
258
257
  DISPATCH_MAX_MEDIA_PARTS,
259
258
  DISPATCH_MAX_PARTS,
@@ -277,11 +276,11 @@ import {
277
276
  mentionKindForPath,
278
277
  settleTurnResponse
279
278
  } from "../chunk-YHRWZZJN.js";
279
+ import "../chunk-ZVEEWGDK.js";
280
280
  import "../chunk-TXD5HXLE.js";
281
281
  import {
282
282
  attachmentPartKey
283
- } from "../chunk-XNKLQG26.js";
284
- import "../chunk-LQYIBL3G.js";
283
+ } from "../chunk-ZGUXI5SI.js";
285
284
  import {
286
285
  INTERACTION_CANCEL_EVENT,
287
286
  INTERACTION_EVENT,
@@ -307,6 +306,7 @@ import {
307
306
  questionInteractionContentSignature,
308
307
  stampInteractionAnswers
309
308
  } from "../chunk-6VQCFJWP.js";
309
+ import "../chunk-LQYIBL3G.js";
310
310
  export {
311
311
  AGENT_PROFILE_EDITOR_SECTIONS,
312
312
  ATTACHMENT_ACCEPT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-app",
3
- "version": "0.60.181",
3
+ "version": "0.60.183",
4
4
  "packageManager": "pnpm@11.24.0",
5
5
  "description": "Build agent applications with typed chat, tools, sandboxes, integrations, billing, and evaluation.",
6
6
  "keywords": [
@@ -124,11 +124,21 @@
124
124
  "import": "./dist/skills/index.js",
125
125
  "default": "./dist/skills/index.js"
126
126
  },
127
+ "./skills/marketplace-drizzle": {
128
+ "types": "./dist/skills/marketplace-drizzle.d.ts",
129
+ "import": "./dist/skills/marketplace-drizzle.js",
130
+ "default": "./dist/skills/marketplace-drizzle.js"
131
+ },
127
132
  "./skills-placement": {
128
133
  "types": "./dist/skills-placement/index.d.ts",
129
134
  "import": "./dist/skills-placement/index.js",
130
135
  "default": "./dist/skills-placement/index.js"
131
136
  },
137
+ "./toolbelt": {
138
+ "types": "./dist/toolbelt/index.d.ts",
139
+ "import": "./dist/toolbelt/index.js",
140
+ "default": "./dist/toolbelt/index.js"
141
+ },
132
142
  "./profile": {
133
143
  "types": "./dist/profile/index.d.ts",
134
144
  "import": "./dist/profile/index.js",