@namzu/sdk 0.6.0 → 1.0.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/CHANGELOG.md +362 -0
- package/dist/advisory/executor.d.ts.map +1 -1
- package/dist/advisory/executor.js +9 -2
- package/dist/advisory/executor.js.map +1 -1
- package/dist/advisory/executor.test.d.ts +2 -1
- package/dist/advisory/executor.test.d.ts.map +1 -1
- package/dist/advisory/executor.test.js +7 -4
- package/dist/advisory/executor.test.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +2 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +7 -0
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/bridge/sse/mapper.test.js +2 -2
- package/dist/constants/compaction/index.d.ts.map +1 -1
- package/dist/constants/compaction/index.js +8 -3
- package/dist/constants/compaction/index.js.map +1 -1
- package/dist/constants/sandbox/index.d.ts +21 -0
- package/dist/constants/sandbox/index.d.ts.map +1 -1
- package/dist/constants/sandbox/index.js +30 -0
- package/dist/constants/sandbox/index.js.map +1 -1
- package/dist/constants/tools/index.d.ts.map +1 -1
- package/dist/constants/tools/index.js +33 -2
- package/dist/constants/tools/index.js.map +1 -1
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +35 -5
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/persona/assembler.d.ts +1 -0
- package/dist/persona/assembler.d.ts.map +1 -1
- package/dist/persona/assembler.js +28 -6
- package/dist/persona/assembler.js.map +1 -1
- package/dist/provider/collect.test.js +2 -2
- package/dist/public-runtime.d.ts +5 -4
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +5 -4
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +2 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +2 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +3 -0
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +1 -0
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +87 -5
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/registry/tool/execute.test.d.ts +4 -2
- package/dist/registry/tool/execute.test.d.ts.map +1 -1
- package/dist/registry/tool/execute.test.js +112 -3
- package/dist/registry/tool/execute.test.js.map +1 -1
- package/dist/registry/toolset/catalog.d.ts +42 -0
- package/dist/registry/toolset/catalog.d.ts.map +1 -0
- package/dist/registry/toolset/catalog.js +217 -0
- package/dist/registry/toolset/catalog.js.map +1 -0
- package/dist/registry/toolset/catalog.test.d.ts +2 -0
- package/dist/registry/toolset/catalog.test.d.ts.map +1 -0
- package/dist/registry/toolset/catalog.test.js +85 -0
- package/dist/registry/toolset/catalog.test.js.map +1 -0
- package/dist/runtime/query/__tests__/deferred-tools.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/deferred-tools.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/deferred-tools.test.js +147 -0
- package/dist/runtime/query/__tests__/deferred-tools.test.js.map +1 -0
- package/dist/runtime/query/__tests__/executor-concurrency.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/executor-concurrency.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/executor-concurrency.test.js +98 -0
- package/dist/runtime/query/__tests__/executor-concurrency.test.js.map +1 -0
- package/dist/runtime/query/__tests__/executor-plugin-hooks.test.js +38 -3
- package/dist/runtime/query/__tests__/executor-plugin-hooks.test.js.map +1 -1
- package/dist/runtime/query/__tests__/prompt.test.js +47 -2
- package/dist/runtime/query/__tests__/prompt.test.js.map +1 -1
- package/dist/runtime/query/__tests__/stream-recovery.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/stream-recovery.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/stream-recovery.test.js +126 -0
- package/dist/runtime/query/__tests__/stream-recovery.test.js.map +1 -0
- package/dist/runtime/query/continuation.d.ts +16 -0
- package/dist/runtime/query/continuation.d.ts.map +1 -0
- package/dist/runtime/query/continuation.js +16 -0
- package/dist/runtime/query/continuation.js.map +1 -0
- package/dist/runtime/query/executor.d.ts +3 -0
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +71 -3
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +19 -3
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +22 -0
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +227 -60
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +10 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +21 -1
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +1 -0
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +1 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +32 -1
- package/dist/sandbox/provider/local.js.map +1 -1
- package/dist/session/workspace/__tests__/shared-run.test.d.ts +2 -0
- package/dist/session/workspace/__tests__/shared-run.test.d.ts.map +1 -0
- package/dist/session/workspace/__tests__/shared-run.test.js +147 -0
- package/dist/session/workspace/__tests__/shared-run.test.js.map +1 -0
- package/dist/session/workspace/index.d.ts +2 -0
- package/dist/session/workspace/index.d.ts.map +1 -1
- package/dist/session/workspace/index.js +1 -0
- package/dist/session/workspace/index.js.map +1 -1
- package/dist/session/workspace/shared-run.d.ts +81 -0
- package/dist/session/workspace/shared-run.d.ts.map +1 -0
- package/dist/session/workspace/shared-run.js +251 -0
- package/dist/session/workspace/shared-run.js.map +1 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +36 -6
- package/dist/skills/loader.js.map +1 -1
- package/dist/skills/loader.test.d.ts +2 -0
- package/dist/skills/loader.test.d.ts.map +1 -0
- package/dist/skills/loader.test.js +65 -0
- package/dist/skills/loader.test.js.map +1 -0
- package/dist/streaming/coalesce.test.js +1 -1
- package/dist/tools/builtins/__tests__/edit.test.d.ts +2 -0
- package/dist/tools/builtins/__tests__/edit.test.d.ts.map +1 -0
- package/dist/tools/builtins/__tests__/edit.test.js +38 -0
- package/dist/tools/builtins/__tests__/edit.test.js.map +1 -0
- package/dist/tools/builtins/__tests__/payload-budget.test.d.ts +2 -0
- package/dist/tools/builtins/__tests__/payload-budget.test.d.ts.map +1 -0
- package/dist/tools/builtins/__tests__/payload-budget.test.js +22 -0
- package/dist/tools/builtins/__tests__/payload-budget.test.js.map +1 -0
- package/dist/tools/builtins/__tests__/read-file.test.d.ts +2 -0
- package/dist/tools/builtins/__tests__/read-file.test.d.ts.map +1 -0
- package/dist/tools/builtins/__tests__/read-file.test.js +24 -0
- package/dist/tools/builtins/__tests__/read-file.test.js.map +1 -0
- package/dist/tools/builtins/__tests__/verify-outputs.test.d.ts +2 -0
- package/dist/tools/builtins/__tests__/verify-outputs.test.d.ts.map +1 -0
- package/dist/tools/builtins/__tests__/verify-outputs.test.js +52 -0
- package/dist/tools/builtins/__tests__/verify-outputs.test.js.map +1 -0
- package/dist/tools/builtins/__tests__/write-file.test.d.ts +2 -0
- package/dist/tools/builtins/__tests__/write-file.test.d.ts.map +1 -0
- package/dist/tools/builtins/__tests__/write-file.test.js +74 -0
- package/dist/tools/builtins/__tests__/write-file.test.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +40 -7
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts +5 -2
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +114 -18
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/index.d.ts +1 -0
- package/dist/tools/builtins/index.d.ts.map +1 -1
- package/dist/tools/builtins/index.js +13 -13
- package/dist/tools/builtins/index.js.map +1 -1
- package/dist/tools/builtins/read-file.d.ts +1 -0
- package/dist/tools/builtins/read-file.d.ts.map +1 -1
- package/dist/tools/builtins/read-file.js +23 -8
- package/dist/tools/builtins/read-file.js.map +1 -1
- package/dist/tools/builtins/search-tools.d.ts.map +1 -1
- package/dist/tools/builtins/search-tools.js +4 -1
- package/dist/tools/builtins/search-tools.js.map +1 -1
- package/dist/tools/builtins/verify-outputs.d.ts +5 -0
- package/dist/tools/builtins/verify-outputs.d.ts.map +1 -0
- package/dist/tools/builtins/verify-outputs.js +103 -0
- package/dist/tools/builtins/verify-outputs.js.map +1 -0
- package/dist/tools/builtins/write-file.d.ts +3 -2
- package/dist/tools/builtins/write-file.d.ts.map +1 -1
- package/dist/tools/builtins/write-file.js +72 -12
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/coordinator/__tests__/agent.test.d.ts +15 -0
- package/dist/tools/coordinator/__tests__/agent.test.d.ts.map +1 -0
- package/dist/tools/coordinator/__tests__/agent.test.js +142 -0
- package/dist/tools/coordinator/__tests__/agent.test.js.map +1 -0
- package/dist/tools/coordinator/__tests__/task-list.test.d.ts +13 -0
- package/dist/tools/coordinator/__tests__/task-list.test.d.ts.map +1 -0
- package/dist/tools/coordinator/__tests__/task-list.test.js +162 -0
- package/dist/tools/coordinator/__tests__/task-list.test.js.map +1 -0
- package/dist/tools/coordinator/agent.d.ts +34 -0
- package/dist/tools/coordinator/agent.d.ts.map +1 -0
- package/dist/tools/coordinator/agent.js +107 -0
- package/dist/tools/coordinator/agent.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +7 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +111 -21
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/types/agent/base.d.ts +8 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/reactive.d.ts +23 -0
- package/dist/types/agent/reactive.d.ts.map +1 -1
- package/dist/types/agent/supervisor.d.ts +14 -0
- package/dist/types/agent/supervisor.d.ts.map +1 -1
- package/dist/types/message/index.d.ts +22 -1
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +7 -2
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/provider/chat.d.ts +2 -9
- package/dist/types/provider/chat.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +6 -0
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/sandbox/index.d.ts +193 -0
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/skills/index.d.ts +2 -0
- package/dist/types/skills/index.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +22 -0
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/toolset/index.d.ts +71 -0
- package/dist/types/toolset/index.d.ts.map +1 -0
- package/dist/types/toolset/index.js +2 -0
- package/dist/types/toolset/index.js.map +1 -0
- package/dist/types/workspace/index.d.ts +1 -0
- package/dist/types/workspace/index.d.ts.map +1 -1
- package/dist/types/workspace/shared-run.d.ts +61 -0
- package/dist/types/workspace/shared-run.d.ts.map +1 -0
- package/dist/types/workspace/shared-run.js +2 -0
- package/dist/types/workspace/shared-run.js.map +1 -0
- package/dist/verification/index.d.ts +1 -0
- package/dist/verification/index.d.ts.map +1 -1
- package/dist/verification/index.js +1 -0
- package/dist/verification/index.js.map +1 -1
- package/dist/verification/presets.d.ts +53 -0
- package/dist/verification/presets.d.ts.map +1 -0
- package/dist/verification/presets.js +70 -0
- package/dist/verification/presets.js.map +1 -0
- package/dist/verification/presets.test.d.ts +16 -0
- package/dist/verification/presets.test.d.ts.map +1 -0
- package/dist/verification/presets.test.js +79 -0
- package/dist/verification/presets.test.js.map +1 -0
- package/package.json +3 -2
- package/src/advisory/executor.test.ts +7 -4
- package/src/advisory/executor.ts +11 -2
- package/src/agents/ReactiveAgent.ts +2 -0
- package/src/agents/SupervisorAgent.ts +7 -0
- package/src/bridge/sse/mapper.test.ts +2 -2
- package/src/constants/compaction/index.ts +8 -3
- package/src/constants/sandbox/index.ts +37 -0
- package/src/constants/tools/index.ts +33 -2
- package/src/manager/run/persistence.ts +34 -6
- package/src/persona/assembler.ts +31 -8
- package/src/provider/collect.test.ts +2 -2
- package/src/public-runtime.ts +14 -1
- package/src/public-tools.ts +2 -0
- package/src/public-types.ts +7 -0
- package/src/registry/index.ts +7 -0
- package/src/registry/tool/execute.test.ts +132 -3
- package/src/registry/tool/execute.ts +94 -9
- package/src/registry/toolset/catalog.test.ts +97 -0
- package/src/registry/toolset/catalog.ts +283 -0
- package/src/runtime/query/__tests__/deferred-tools.test.ts +183 -0
- package/src/runtime/query/__tests__/executor-concurrency.test.ts +122 -0
- package/src/runtime/query/__tests__/executor-plugin-hooks.test.ts +48 -3
- package/src/runtime/query/__tests__/prompt.test.ts +51 -2
- package/src/runtime/query/__tests__/stream-recovery.test.ts +156 -0
- package/src/runtime/query/continuation.ts +16 -0
- package/src/runtime/query/executor.ts +82 -13
- package/src/runtime/query/index.ts +24 -3
- package/src/runtime/query/iteration/index.ts +263 -68
- package/src/runtime/query/iteration/phases/context.ts +10 -0
- package/src/runtime/query/prompt.ts +17 -1
- package/src/runtime/query/tooling.ts +2 -0
- package/src/sandbox/provider/local.ts +33 -0
- package/src/session/workspace/__tests__/shared-run.test.ts +181 -0
- package/src/session/workspace/index.ts +6 -0
- package/src/session/workspace/shared-run.ts +316 -0
- package/src/skills/loader.test.ts +89 -0
- package/src/skills/loader.ts +37 -6
- package/src/streaming/coalesce.test.ts +1 -1
- package/src/tools/builtins/__tests__/edit.test.ts +57 -0
- package/src/tools/builtins/__tests__/payload-budget.test.ts +29 -0
- package/src/tools/builtins/__tests__/read-file.test.ts +31 -0
- package/src/tools/builtins/__tests__/verify-outputs.test.ts +71 -0
- package/src/tools/builtins/__tests__/write-file.test.ts +97 -0
- package/src/tools/builtins/bash.ts +48 -7
- package/src/tools/builtins/edit.ts +162 -27
- package/src/tools/builtins/index.ts +13 -13
- package/src/tools/builtins/read-file.ts +31 -8
- package/src/tools/builtins/search-tools.ts +5 -1
- package/src/tools/builtins/verify-outputs.ts +126 -0
- package/src/tools/builtins/write-file.ts +83 -14
- package/src/tools/coordinator/__tests__/agent.test.ts +172 -0
- package/src/tools/coordinator/__tests__/task-list.test.ts +182 -0
- package/src/tools/coordinator/agent.ts +157 -0
- package/src/tools/coordinator/index.ts +128 -22
- package/src/types/agent/base.ts +8 -0
- package/src/types/agent/reactive.ts +25 -0
- package/src/types/agent/supervisor.ts +16 -0
- package/src/types/message/index.ts +32 -2
- package/src/types/provider/chat.ts +2 -9
- package/src/types/run/events.ts +6 -0
- package/src/types/sandbox/index.ts +219 -0
- package/src/types/skills/index.ts +4 -0
- package/src/types/tool/index.ts +24 -0
- package/src/types/toolset/index.ts +86 -0
- package/src/types/workspace/index.ts +9 -0
- package/src/types/workspace/shared-run.ts +65 -0
- package/src/verification/index.ts +1 -0
- package/src/verification/presets.test.ts +112 -0
- package/src/verification/presets.ts +72 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
2
|
+
const DEFAULT_HOST_SOURCE = {
|
|
3
|
+
id: 'host-tools',
|
|
4
|
+
kind: 'host_tool',
|
|
5
|
+
name: 'Host tools',
|
|
6
|
+
description: 'Tools executed by the host runtime.',
|
|
7
|
+
};
|
|
8
|
+
const DEFAULT_HOST_TOOLSET = {
|
|
9
|
+
id: 'host-tools',
|
|
10
|
+
sourceId: DEFAULT_HOST_SOURCE.id,
|
|
11
|
+
name: 'Host tools',
|
|
12
|
+
defaultPolicy: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
loading: 'eager',
|
|
15
|
+
permissionPolicy: 'default',
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
export class ToolCatalog {
|
|
19
|
+
sources = new Map();
|
|
20
|
+
toolsets = new Map();
|
|
21
|
+
tools = new Map();
|
|
22
|
+
registerSource(source) {
|
|
23
|
+
this.sources.set(source.id, source);
|
|
24
|
+
}
|
|
25
|
+
registerToolset(toolset) {
|
|
26
|
+
if (!this.sources.has(toolset.sourceId)) {
|
|
27
|
+
throw new Error(`Toolset "${toolset.id}" references unknown source "${toolset.sourceId}"`);
|
|
28
|
+
}
|
|
29
|
+
this.toolsets.set(toolset.id, toolset);
|
|
30
|
+
}
|
|
31
|
+
registerTool(tool) {
|
|
32
|
+
if (!this.sources.has(tool.sourceId)) {
|
|
33
|
+
throw new Error(`Tool "${tool.name}" references unknown source "${tool.sourceId}"`);
|
|
34
|
+
}
|
|
35
|
+
if (!this.toolsets.has(tool.toolsetId)) {
|
|
36
|
+
throw new Error(`Tool "${tool.name}" references unknown toolset "${tool.toolsetId}"`);
|
|
37
|
+
}
|
|
38
|
+
this.tools.set(tool.name, tool);
|
|
39
|
+
}
|
|
40
|
+
getSource(id) {
|
|
41
|
+
return this.sources.get(id);
|
|
42
|
+
}
|
|
43
|
+
getToolset(id) {
|
|
44
|
+
return this.toolsets.get(id);
|
|
45
|
+
}
|
|
46
|
+
getTool(name) {
|
|
47
|
+
return this.tools.get(name);
|
|
48
|
+
}
|
|
49
|
+
listSources() {
|
|
50
|
+
return [...this.sources.values()];
|
|
51
|
+
}
|
|
52
|
+
listToolsets() {
|
|
53
|
+
return [...this.toolsets.values()];
|
|
54
|
+
}
|
|
55
|
+
listTools() {
|
|
56
|
+
return [...this.tools.values()];
|
|
57
|
+
}
|
|
58
|
+
snapshot() {
|
|
59
|
+
return {
|
|
60
|
+
sources: this.listSources(),
|
|
61
|
+
toolsets: this.listToolsets(),
|
|
62
|
+
tools: this.listTools(),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
getToolsByLoading(loading) {
|
|
66
|
+
const wanted = new Set(loading);
|
|
67
|
+
return this.listTools().filter((tool) => wanted.has(resolveToolLoading(tool.policy)));
|
|
68
|
+
}
|
|
69
|
+
searchTools(query, options = {}) {
|
|
70
|
+
const normalized = query.trim().toLowerCase();
|
|
71
|
+
const terms = normalized.split(/\s+/).filter(Boolean);
|
|
72
|
+
const loading = options.loading ? new Set(options.loading) : null;
|
|
73
|
+
const results = [];
|
|
74
|
+
for (const tool of this.listTools()) {
|
|
75
|
+
if (loading && !loading.has(resolveToolLoading(tool.policy)))
|
|
76
|
+
continue;
|
|
77
|
+
if (tool.policy.enabled === false)
|
|
78
|
+
continue;
|
|
79
|
+
const source = this.sources.get(tool.sourceId);
|
|
80
|
+
const toolset = this.toolsets.get(tool.toolsetId);
|
|
81
|
+
if (!source || !toolset)
|
|
82
|
+
continue;
|
|
83
|
+
const scored = scoreToolSearch({
|
|
84
|
+
terms,
|
|
85
|
+
tool,
|
|
86
|
+
source,
|
|
87
|
+
toolset,
|
|
88
|
+
});
|
|
89
|
+
if (scored.score <= 0)
|
|
90
|
+
continue;
|
|
91
|
+
results.push({
|
|
92
|
+
tool,
|
|
93
|
+
source,
|
|
94
|
+
toolset,
|
|
95
|
+
score: scored.score,
|
|
96
|
+
matched: scored.matched,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
results.sort((a, b) => b.score - a.score || a.tool.name.localeCompare(b.tool.name));
|
|
100
|
+
return results.slice(0, options.limit ?? 5);
|
|
101
|
+
}
|
|
102
|
+
toLLMTools(options = {}) {
|
|
103
|
+
const loading = options.loading ?? ['eager'];
|
|
104
|
+
return this.getToolsByLoading(loading)
|
|
105
|
+
.filter((tool) => tool.policy.enabled !== false)
|
|
106
|
+
.map((tool) => tool.llmSchema ?? toolDefinitionToLLMTool(tool.definition))
|
|
107
|
+
.filter((tool) => Boolean(tool));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export function createToolCatalogFromRegistry(registry, options = {}) {
|
|
111
|
+
const source = options.source ?? DEFAULT_HOST_SOURCE;
|
|
112
|
+
const toolset = {
|
|
113
|
+
...DEFAULT_HOST_TOOLSET,
|
|
114
|
+
...options.toolset,
|
|
115
|
+
sourceId: options.toolset?.sourceId ?? source.id,
|
|
116
|
+
};
|
|
117
|
+
const catalog = new ToolCatalog();
|
|
118
|
+
catalog.registerSource(source);
|
|
119
|
+
catalog.registerToolset(toolset);
|
|
120
|
+
for (const definition of registry.getAll()) {
|
|
121
|
+
const availability = registry.getAvailability(definition.name);
|
|
122
|
+
catalog.registerTool(toolDefinitionToCatalogEntry(definition, {
|
|
123
|
+
availability,
|
|
124
|
+
sourceId: source.id,
|
|
125
|
+
toolsetId: toolset.id,
|
|
126
|
+
toolsetPolicy: toolset.defaultPolicy,
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
return catalog;
|
|
130
|
+
}
|
|
131
|
+
export function toolDefinitionToCatalogEntry(definition, input) {
|
|
132
|
+
const loading = loadingFromAvailability(input.availability ?? 'active');
|
|
133
|
+
return {
|
|
134
|
+
name: definition.name,
|
|
135
|
+
description: definition.description,
|
|
136
|
+
sourceId: input.sourceId,
|
|
137
|
+
toolsetId: input.toolsetId,
|
|
138
|
+
definition,
|
|
139
|
+
permissions: definition.permissions,
|
|
140
|
+
category: definition.category,
|
|
141
|
+
policy: {
|
|
142
|
+
...input.toolsetPolicy,
|
|
143
|
+
enabled: input.toolsetPolicy?.enabled === false ? false : loading !== 'suspended',
|
|
144
|
+
loading,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export function loadingFromAvailability(availability) {
|
|
149
|
+
switch (availability) {
|
|
150
|
+
case 'deferred':
|
|
151
|
+
return 'deferred';
|
|
152
|
+
case 'suspended':
|
|
153
|
+
return 'suspended';
|
|
154
|
+
default:
|
|
155
|
+
return 'eager';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function resolveToolLoading(policy) {
|
|
159
|
+
if (policy.enabled === false)
|
|
160
|
+
return 'disabled';
|
|
161
|
+
return policy.loading ?? 'eager';
|
|
162
|
+
}
|
|
163
|
+
function toolDefinitionToLLMTool(definition) {
|
|
164
|
+
if (!definition)
|
|
165
|
+
return null;
|
|
166
|
+
return {
|
|
167
|
+
type: 'function',
|
|
168
|
+
function: {
|
|
169
|
+
name: definition.name,
|
|
170
|
+
description: definition.description,
|
|
171
|
+
parameters: zodToJsonSchema(definition.inputSchema, {
|
|
172
|
+
target: 'jsonSchema7',
|
|
173
|
+
$refStrategy: 'none',
|
|
174
|
+
}),
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function scoreToolSearch(input) {
|
|
179
|
+
const terms = input.terms.length > 0 ? input.terms : [''];
|
|
180
|
+
const matched = new Set();
|
|
181
|
+
let score = 0;
|
|
182
|
+
for (const term of terms) {
|
|
183
|
+
if (!term)
|
|
184
|
+
continue;
|
|
185
|
+
const toolName = input.tool.name.toLowerCase();
|
|
186
|
+
const description = input.tool.description.toLowerCase();
|
|
187
|
+
const sourceText = `${input.source.name} ${input.source.description ?? ''} ${input.source.kind}`.toLowerCase();
|
|
188
|
+
const toolsetText = `${input.toolset.name} ${input.toolset.description ?? ''}`.toLowerCase();
|
|
189
|
+
if (toolName === term) {
|
|
190
|
+
score += 12;
|
|
191
|
+
matched.add('name');
|
|
192
|
+
}
|
|
193
|
+
else if (toolName.includes(term)) {
|
|
194
|
+
score += 8;
|
|
195
|
+
matched.add('name');
|
|
196
|
+
}
|
|
197
|
+
if (description.includes(term)) {
|
|
198
|
+
score += 5;
|
|
199
|
+
matched.add('description');
|
|
200
|
+
}
|
|
201
|
+
if (sourceText.includes(term)) {
|
|
202
|
+
score += 3;
|
|
203
|
+
matched.add('source');
|
|
204
|
+
}
|
|
205
|
+
if (toolsetText.includes(term)) {
|
|
206
|
+
score += 2;
|
|
207
|
+
matched.add('toolset');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (input.tool.policy.preferred && score > 0)
|
|
211
|
+
score += 1;
|
|
212
|
+
return {
|
|
213
|
+
score,
|
|
214
|
+
matched: [...matched],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/registry/toolset/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.test.d.ts","sourceRoot":"","sources":["../../../src/registry/toolset/catalog.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ToolRegistry } from '../tool/execute.js';
|
|
4
|
+
import { ToolCatalog, createToolCatalogFromRegistry } from './catalog.js';
|
|
5
|
+
function makeTool(name, description = `${name} tool`) {
|
|
6
|
+
return {
|
|
7
|
+
name,
|
|
8
|
+
description,
|
|
9
|
+
inputSchema: z.object({ query: z.string().optional() }),
|
|
10
|
+
async execute() {
|
|
11
|
+
return { success: true, output: `${name}-ran` };
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
describe('ToolCatalog', () => {
|
|
16
|
+
it('keeps sources, toolsets, and tools as separate records', () => {
|
|
17
|
+
const catalog = new ToolCatalog();
|
|
18
|
+
catalog.registerSource({
|
|
19
|
+
id: 'mcp:microsoft-learn',
|
|
20
|
+
kind: 'mcp_server',
|
|
21
|
+
name: 'Microsoft Learn',
|
|
22
|
+
mcpServer: {
|
|
23
|
+
name: 'microsoft-learn',
|
|
24
|
+
url: 'https://learn.microsoft.com/api/mcp',
|
|
25
|
+
transport: 'streamable_http',
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
catalog.registerToolset({
|
|
29
|
+
id: 'mcp-toolset:microsoft-learn',
|
|
30
|
+
sourceId: 'mcp:microsoft-learn',
|
|
31
|
+
name: 'Microsoft Learn toolset',
|
|
32
|
+
defaultPolicy: {
|
|
33
|
+
enabled: true,
|
|
34
|
+
loading: 'deferred',
|
|
35
|
+
preferred: true,
|
|
36
|
+
permissionPolicy: 'always_allow',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
catalog.registerTool({
|
|
40
|
+
name: 'microsoft_docs_search',
|
|
41
|
+
description: 'Search Microsoft documentation',
|
|
42
|
+
sourceId: 'mcp:microsoft-learn',
|
|
43
|
+
toolsetId: 'mcp-toolset:microsoft-learn',
|
|
44
|
+
policy: { enabled: true, loading: 'deferred', preferred: true },
|
|
45
|
+
});
|
|
46
|
+
expect(catalog.listSources()).toHaveLength(1);
|
|
47
|
+
expect(catalog.listToolsets()).toHaveLength(1);
|
|
48
|
+
expect(catalog.getToolsByLoading(['deferred']).map((t) => t.name)).toEqual([
|
|
49
|
+
'microsoft_docs_search',
|
|
50
|
+
]);
|
|
51
|
+
});
|
|
52
|
+
it('searches deferred tools by name, description, source, and toolset', () => {
|
|
53
|
+
const registry = new ToolRegistry();
|
|
54
|
+
registry.register(makeTool('github_search_issues', 'Search repository issues'), 'deferred');
|
|
55
|
+
registry.register(makeTool('slack_search_messages', 'Search team messages'), 'deferred');
|
|
56
|
+
registry.register(makeTool('bash', 'Run a shell command'));
|
|
57
|
+
const catalog = createToolCatalogFromRegistry(registry, {
|
|
58
|
+
source: {
|
|
59
|
+
id: 'host',
|
|
60
|
+
kind: 'host_tool',
|
|
61
|
+
name: 'Host runtime',
|
|
62
|
+
description: 'Local shell and collaboration tools',
|
|
63
|
+
},
|
|
64
|
+
toolset: {
|
|
65
|
+
id: 'default-host',
|
|
66
|
+
name: 'Default host tools',
|
|
67
|
+
defaultPolicy: { enabled: true, loading: 'eager' },
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
expect(catalog.searchTools('repository', { loading: ['deferred'] }).map((r) => r.tool.name)).toEqual(['github_search_issues']);
|
|
71
|
+
expect(catalog.toLLMTools().map((t) => t.function.name)).toEqual(['bash']);
|
|
72
|
+
});
|
|
73
|
+
it('preserves registry availability as catalog loading policy', () => {
|
|
74
|
+
const registry = new ToolRegistry();
|
|
75
|
+
registry.register(makeTool('read_file'));
|
|
76
|
+
registry.register(makeTool('web_search'), 'deferred');
|
|
77
|
+
registry.register(makeTool('write_file'), 'suspended');
|
|
78
|
+
const catalog = createToolCatalogFromRegistry(registry);
|
|
79
|
+
expect(catalog.getTool('read_file')?.policy.loading).toBe('eager');
|
|
80
|
+
expect(catalog.getTool('web_search')?.policy.loading).toBe('deferred');
|
|
81
|
+
expect(catalog.getTool('write_file')?.policy.loading).toBe('suspended');
|
|
82
|
+
expect(catalog.toLLMTools({ loading: ['suspended'] })).toEqual([]);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=catalog.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.test.js","sourceRoot":"","sources":["../../../src/registry/toolset/catalog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred-tools.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/deferred-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { ToolRegistry } from '../../../registry/tool/execute.js';
|
|
7
|
+
import { SearchToolsTool } from '../../../tools/builtins/search-tools.js';
|
|
8
|
+
import { createUserMessage } from '../../../types/message/index.js';
|
|
9
|
+
import { drainQuery } from '../index.js';
|
|
10
|
+
const ZERO_USAGE = {
|
|
11
|
+
promptTokens: 0,
|
|
12
|
+
completionTokens: 0,
|
|
13
|
+
totalTokens: 0,
|
|
14
|
+
cachedTokens: 0,
|
|
15
|
+
cacheWriteTokens: 0,
|
|
16
|
+
};
|
|
17
|
+
class CapturingProvider {
|
|
18
|
+
id = 'capturing';
|
|
19
|
+
name = 'Capturing Provider';
|
|
20
|
+
lastParams;
|
|
21
|
+
async *chatStream(params) {
|
|
22
|
+
this.lastParams = params;
|
|
23
|
+
yield {
|
|
24
|
+
id: 'msg_1',
|
|
25
|
+
delta: { content: 'done' },
|
|
26
|
+
};
|
|
27
|
+
yield {
|
|
28
|
+
id: 'msg_1',
|
|
29
|
+
delta: {},
|
|
30
|
+
finishReason: 'stop',
|
|
31
|
+
usage: ZERO_USAGE,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function registerDeferredDocumentTool(tools, name = 'generate_document') {
|
|
36
|
+
tools.register({
|
|
37
|
+
name,
|
|
38
|
+
description: 'Generate a project document by document id.',
|
|
39
|
+
inputSchema: z.object({
|
|
40
|
+
documentId: z.string(),
|
|
41
|
+
}),
|
|
42
|
+
execute: async () => ({ success: true, output: 'generated' }),
|
|
43
|
+
}, 'deferred');
|
|
44
|
+
}
|
|
45
|
+
describe('query deferred tool discovery', () => {
|
|
46
|
+
let workdirs = [];
|
|
47
|
+
afterEach(async () => {
|
|
48
|
+
await Promise.all(workdirs.map((dir) => rm(dir, { recursive: true, force: true })));
|
|
49
|
+
workdirs = [];
|
|
50
|
+
});
|
|
51
|
+
it('auto-exposes search_tools when deferred tools are registered', async () => {
|
|
52
|
+
const provider = new CapturingProvider();
|
|
53
|
+
const tools = new ToolRegistry();
|
|
54
|
+
registerDeferredDocumentTool(tools);
|
|
55
|
+
const workingDirectory = await mkdtemp(join(tmpdir(), 'namzu-deferred-tools-'));
|
|
56
|
+
workdirs.push(workingDirectory);
|
|
57
|
+
const run = await drainQuery({
|
|
58
|
+
provider,
|
|
59
|
+
tools,
|
|
60
|
+
runConfig: {
|
|
61
|
+
model: 'mock-model',
|
|
62
|
+
timeoutMs: 5_000,
|
|
63
|
+
tokenBudget: 100_000,
|
|
64
|
+
maxIterations: 1,
|
|
65
|
+
maxResponseTokens: 256,
|
|
66
|
+
},
|
|
67
|
+
agentId: 'agent_test',
|
|
68
|
+
agentName: 'Test Agent',
|
|
69
|
+
messages: [createUserMessage('what tools can you use?')],
|
|
70
|
+
workingDirectory,
|
|
71
|
+
sessionId: 'ses_deferred_tools',
|
|
72
|
+
threadId: 'thd_deferred_tools',
|
|
73
|
+
projectId: 'prj_deferred_tools',
|
|
74
|
+
tenantId: 'tnt_deferred_tools',
|
|
75
|
+
});
|
|
76
|
+
expect(run.status).toBe('completed');
|
|
77
|
+
expect(tools.has(SearchToolsTool.name)).toBe(true);
|
|
78
|
+
expect(tools.getAvailability(SearchToolsTool.name)).toBe('active');
|
|
79
|
+
expect(tools.getAvailability('generate_document')).toBe('deferred');
|
|
80
|
+
const toolNames = provider.lastParams?.tools?.map((tool) => tool.function.name).sort() ?? [];
|
|
81
|
+
expect(toolNames).toEqual([SearchToolsTool.name]);
|
|
82
|
+
const systemPrompt = (provider.lastParams?.messages ?? [])
|
|
83
|
+
.filter((message) => message.role === 'system')
|
|
84
|
+
.map((message) => message.content)
|
|
85
|
+
.join('\n');
|
|
86
|
+
expect(systemPrompt).toContain('Use search_tools to load these before use:');
|
|
87
|
+
expect(systemPrompt).toContain('- generate_document');
|
|
88
|
+
expect(systemPrompt).not.toContain('Deferred tools are discoverable but not executable until the runtime activates them');
|
|
89
|
+
});
|
|
90
|
+
it('keeps search_tools executable when allowedTools names a deferred tool', async () => {
|
|
91
|
+
const provider = new CapturingProvider();
|
|
92
|
+
const tools = new ToolRegistry();
|
|
93
|
+
registerDeferredDocumentTool(tools);
|
|
94
|
+
const workingDirectory = await mkdtemp(join(tmpdir(), 'namzu-deferred-tools-'));
|
|
95
|
+
workdirs.push(workingDirectory);
|
|
96
|
+
const run = await drainQuery({
|
|
97
|
+
provider,
|
|
98
|
+
tools,
|
|
99
|
+
allowedTools: ['generate_document'],
|
|
100
|
+
runConfig: {
|
|
101
|
+
model: 'mock-model',
|
|
102
|
+
timeoutMs: 5_000,
|
|
103
|
+
tokenBudget: 100_000,
|
|
104
|
+
maxIterations: 1,
|
|
105
|
+
maxResponseTokens: 256,
|
|
106
|
+
},
|
|
107
|
+
agentId: 'agent_test',
|
|
108
|
+
agentName: 'Test Agent',
|
|
109
|
+
messages: [createUserMessage('generate D-01')],
|
|
110
|
+
workingDirectory,
|
|
111
|
+
sessionId: 'ses_deferred_allowed_tools',
|
|
112
|
+
threadId: 'thd_deferred_allowed_tools',
|
|
113
|
+
projectId: 'prj_deferred_allowed_tools',
|
|
114
|
+
tenantId: 'tnt_deferred_allowed_tools',
|
|
115
|
+
});
|
|
116
|
+
expect(run.status).toBe('completed');
|
|
117
|
+
expect(tools.getAvailability('generate_document')).toBe('deferred');
|
|
118
|
+
const toolNames = provider.lastParams?.tools?.map((tool) => tool.function.name).sort() ?? [];
|
|
119
|
+
expect(toolNames).toEqual([SearchToolsTool.name]);
|
|
120
|
+
const systemPrompt = (provider.lastParams?.messages ?? [])
|
|
121
|
+
.filter((message) => message.role === 'system')
|
|
122
|
+
.map((message) => message.content)
|
|
123
|
+
.join('\n');
|
|
124
|
+
expect(systemPrompt).toContain('Use search_tools to load these before use:');
|
|
125
|
+
expect(systemPrompt).toContain('- generate_document');
|
|
126
|
+
});
|
|
127
|
+
it('does not let search_tools reveal or activate deferred tools outside allowedTools', async () => {
|
|
128
|
+
const tools = new ToolRegistry();
|
|
129
|
+
registerDeferredDocumentTool(tools);
|
|
130
|
+
registerDeferredDocumentTool(tools, 'dangerous_delete_document');
|
|
131
|
+
const result = await SearchToolsTool.execute({ query: 'delete' }, {
|
|
132
|
+
runId: 'run_deferred_allowed_tools',
|
|
133
|
+
workingDirectory: '/tmp',
|
|
134
|
+
abortSignal: new AbortController().signal,
|
|
135
|
+
env: {},
|
|
136
|
+
log: () => undefined,
|
|
137
|
+
toolRegistry: tools,
|
|
138
|
+
allowedTools: ['generate_document', SearchToolsTool.name],
|
|
139
|
+
});
|
|
140
|
+
expect(result.success).toBe(true);
|
|
141
|
+
expect(result.output).toContain('No deferred tools matching "delete"');
|
|
142
|
+
expect(result.output).not.toContain('dangerous_delete_document');
|
|
143
|
+
expect(tools.getAvailability('generate_document')).toBe('deferred');
|
|
144
|
+
expect(tools.getAvailability('dangerous_delete_document')).toBe('deferred');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=deferred-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred-tools.test.js","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/deferred-tools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAEzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAOnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,UAAU,GAAG;IAClB,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,CAAC;CACnB,CAAA;AAED,MAAM,iBAAiB;IACb,EAAE,GAAG,WAAW,CAAA;IAChB,IAAI,GAAG,oBAAoB,CAAA;IACpC,UAAU,CAAuB;IAEjC,KAAK,CAAC,CAAC,UAAU,CAAC,MAA4B;QAC7C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAA;QACxB,MAAM;YACL,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;SAC1B,CAAA;QACD,MAAM;YACL,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,MAAM;YACpB,KAAK,EAAE,UAAU;SACjB,CAAA;IACF,CAAC;CACD;AAED,SAAS,4BAA4B,CAAC,KAAmB,EAAE,IAAI,GAAG,mBAAmB;IACpF,KAAK,CAAC,QAAQ,CACb;QACC,IAAI;QACJ,WAAW,EAAE,6CAA6C;QAC1D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;SACtB,CAAC;QACF,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;KAC7D,EACD,UAAU,CACV,CAAA;AACF,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC9C,IAAI,QAAQ,GAAa,EAAE,CAAA;IAE3B,SAAS,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACnF,QAAQ,GAAG,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAA;QACxC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAEnC,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAA;QAC/E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE/B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;YAC5B,QAAQ;YACR,KAAK;YACL,SAAS,EAAE;gBACV,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,KAAK;gBAChB,WAAW,EAAE,OAAO;gBACpB,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,GAAG;aACtB;YACD,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;YACxD,gBAAgB;YAChB,SAAS,EAAE,oBAAiC;YAC5C,QAAQ,EAAE,oBAAgC;YAC1C,SAAS,EAAE,oBAAiC;YAC5C,QAAQ,EAAE,oBAAgC;SAC1C,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEnE,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;QAC5F,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;QAEjD,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC;aACxD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;aAC9C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;aACjC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAA;QAC5E,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;QACrD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CACjC,qFAAqF,CACrF,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAA;QACxC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAEnC,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAA;QAC/E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE/B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;YAC5B,QAAQ;YACR,KAAK;YACL,YAAY,EAAE,CAAC,mBAAmB,CAAC;YACnC,SAAS,EAAE;gBACV,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,KAAK;gBAChB,WAAW,EAAE,OAAO;gBACpB,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,GAAG;aACtB;YACD,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAC9C,gBAAgB;YAChB,SAAS,EAAE,4BAAyC;YACpD,QAAQ,EAAE,4BAAwC;YAClD,SAAS,EAAE,4BAAyC;YACpD,QAAQ,EAAE,4BAAwC;SAClD,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEnE,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;QAC5F,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;QAEjD,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC;aACxD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;aAC9C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;aACjC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAA;QAC5E,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,4BAA4B,CAAC,KAAK,CAAC,CAAA;QACnC,4BAA4B,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAA;QAEhE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAC3C,EAAE,KAAK,EAAE,QAAQ,EAAE,EACnB;YACC,KAAK,EAAE,4BAAqC;YAC5C,gBAAgB,EAAE,MAAM;YACxB,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;YACzC,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;YACpB,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,CAAC,mBAAmB,EAAE,eAAe,CAAC,IAAI,CAAC;SACzD,CACD,CAAA;QAED,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAA;QACtE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAA;QAChE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACnE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-concurrency.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/executor-concurrency.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { ActivityStore } from '../../../store/activity/memory.js';
|
|
3
|
+
import { ToolExecutor } from '../executor.js';
|
|
4
|
+
const mockRunId = 'run_test';
|
|
5
|
+
function makeLogger() {
|
|
6
|
+
const stub = { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() };
|
|
7
|
+
return { ...stub, child: vi.fn(() => ({ ...stub, child: vi.fn() })) };
|
|
8
|
+
}
|
|
9
|
+
const delay = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
10
|
+
/** Two tool calls in one assistant message (one batch). */
|
|
11
|
+
function twoCallResponse(name, a, b) {
|
|
12
|
+
return {
|
|
13
|
+
message: {
|
|
14
|
+
role: 'assistant',
|
|
15
|
+
content: null,
|
|
16
|
+
toolCalls: [
|
|
17
|
+
{ id: 'c1', type: 'function', function: { name, arguments: JSON.stringify(a) } },
|
|
18
|
+
{ id: 'c2', type: 'function', function: { name, arguments: JSON.stringify(b) } },
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
finishReason: 'tool_calls',
|
|
22
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
describe('ToolExecutor — concurrencySafe batching', () => {
|
|
26
|
+
let activityStore;
|
|
27
|
+
let emitEvent;
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
activityStore = new ActivityStore(mockRunId, {
|
|
30
|
+
enabled: true,
|
|
31
|
+
trackToolCalls: true,
|
|
32
|
+
trackLlmTurns: true,
|
|
33
|
+
});
|
|
34
|
+
emitEvent = async () => { };
|
|
35
|
+
});
|
|
36
|
+
it('serializes concurrency-unsafe tools so read-modify-write does not race', async () => {
|
|
37
|
+
// Shared mutable state, mutated via read → await → write (like `edit`).
|
|
38
|
+
let file = 'A';
|
|
39
|
+
const execute = vi.fn(async (_name, input) => {
|
|
40
|
+
const current = file; // read
|
|
41
|
+
await delay(10); // window a parallel run would exploit
|
|
42
|
+
file = current + input.add; // write
|
|
43
|
+
return { success: true, output: 'ok' };
|
|
44
|
+
});
|
|
45
|
+
const tools = {
|
|
46
|
+
register: vi.fn(),
|
|
47
|
+
unregister: vi.fn(),
|
|
48
|
+
execute,
|
|
49
|
+
// edit/write/bash declare concurrencySafe:false → isConcurrencySafe()=>false
|
|
50
|
+
get: vi.fn(() => ({ isConcurrencySafe: () => false })),
|
|
51
|
+
has: vi.fn(() => true),
|
|
52
|
+
listNames: vi.fn(() => []),
|
|
53
|
+
getAvailability: vi.fn(),
|
|
54
|
+
};
|
|
55
|
+
const exec = new ToolExecutor({
|
|
56
|
+
tools,
|
|
57
|
+
runId: mockRunId,
|
|
58
|
+
workingDirectory: '/tmp',
|
|
59
|
+
permissionMode: 'auto',
|
|
60
|
+
env: {},
|
|
61
|
+
abortSignal: new AbortController().signal,
|
|
62
|
+
}, activityStore, emitEvent, makeLogger());
|
|
63
|
+
await exec.executeBatch(twoCallResponse('edit', { add: 'B' }, { add: 'C' }));
|
|
64
|
+
// Serialized: A→AB→ABC. A racing run would lose one append (e.g. 'AC').
|
|
65
|
+
expect(file).toBe('ABC');
|
|
66
|
+
});
|
|
67
|
+
it('runs concurrency-safe tools in parallel', async () => {
|
|
68
|
+
let active = 0;
|
|
69
|
+
let maxActive = 0;
|
|
70
|
+
const execute = vi.fn(async () => {
|
|
71
|
+
active++;
|
|
72
|
+
maxActive = Math.max(maxActive, active);
|
|
73
|
+
await delay(10);
|
|
74
|
+
active--;
|
|
75
|
+
return { success: true, output: 'ok' };
|
|
76
|
+
});
|
|
77
|
+
const tools = {
|
|
78
|
+
register: vi.fn(),
|
|
79
|
+
unregister: vi.fn(),
|
|
80
|
+
execute,
|
|
81
|
+
get: vi.fn(() => ({ isConcurrencySafe: () => true })),
|
|
82
|
+
has: vi.fn(() => true),
|
|
83
|
+
listNames: vi.fn(() => []),
|
|
84
|
+
getAvailability: vi.fn(),
|
|
85
|
+
};
|
|
86
|
+
const exec = new ToolExecutor({
|
|
87
|
+
tools,
|
|
88
|
+
runId: mockRunId,
|
|
89
|
+
workingDirectory: '/tmp',
|
|
90
|
+
permissionMode: 'auto',
|
|
91
|
+
env: {},
|
|
92
|
+
abortSignal: new AbortController().signal,
|
|
93
|
+
}, activityStore, emitEvent, makeLogger());
|
|
94
|
+
await exec.executeBatch(twoCallResponse('grep', { p: '1' }, { p: '2' }));
|
|
95
|
+
expect(maxActive).toBe(2); // both ran at once
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=executor-concurrency.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-concurrency.test.js","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/executor-concurrency.test.ts"],"names":[],"mappings":"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"}
|