@aria-cli/tools 1.0.9 → 1.0.11
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/package.json +9 -5
- package/src/__tests__/web-fetch-download.test.ts +0 -433
- package/src/__tests__/web-tools.test.ts +0 -619
- package/src/ask-user-interaction.ts +0 -33
- package/src/cache/web-cache.ts +0 -110
- package/src/definitions/arion.ts +0 -118
- package/src/definitions/browser/browser.ts +0 -502
- package/src/definitions/browser/index.ts +0 -5
- package/src/definitions/browser/pw-downloads.ts +0 -142
- package/src/definitions/browser/pw-interactions.ts +0 -282
- package/src/definitions/browser/pw-responses.ts +0 -98
- package/src/definitions/browser/pw-session.ts +0 -405
- package/src/definitions/browser/pw-shared.ts +0 -85
- package/src/definitions/browser/pw-snapshot.ts +0 -383
- package/src/definitions/browser/pw-state.ts +0 -101
- package/src/definitions/browser/types.ts +0 -203
- package/src/definitions/code-intelligence.ts +0 -526
- package/src/definitions/core.ts +0 -118
- package/src/definitions/delegation.ts +0 -567
- package/src/definitions/deploy.ts +0 -73
- package/src/definitions/filesystem.ts +0 -217
- package/src/definitions/frg.ts +0 -67
- package/src/definitions/index.ts +0 -28
- package/src/definitions/memory.ts +0 -150
- package/src/definitions/messaging.ts +0 -734
- package/src/definitions/meta.ts +0 -392
- package/src/definitions/network.ts +0 -179
- package/src/definitions/outlook.ts +0 -318
- package/src/definitions/patch/apply-patch.ts +0 -235
- package/src/definitions/patch/fuzzy-match.ts +0 -217
- package/src/definitions/patch/index.ts +0 -1
- package/src/definitions/patch/patch-parser.ts +0 -297
- package/src/definitions/patch/sandbox-paths.ts +0 -129
- package/src/definitions/process/index.ts +0 -5
- package/src/definitions/process/process-registry.ts +0 -303
- package/src/definitions/process/process.ts +0 -456
- package/src/definitions/process/pty-keys.ts +0 -298
- package/src/definitions/process/session-slug.ts +0 -147
- package/src/definitions/quip.ts +0 -225
- package/src/definitions/search.ts +0 -67
- package/src/definitions/session-history.ts +0 -79
- package/src/definitions/shell.ts +0 -202
- package/src/definitions/slack.ts +0 -211
- package/src/definitions/web.ts +0 -119
- package/src/executors/apply-patch.ts +0 -1035
- package/src/executors/arion.ts +0 -199
- package/src/executors/code-intelligence.ts +0 -1179
- package/src/executors/deploy.ts +0 -1066
- package/src/executors/filesystem.ts +0 -1428
- package/src/executors/frg-freshness.ts +0 -743
- package/src/executors/frg.ts +0 -394
- package/src/executors/index.ts +0 -280
- package/src/executors/learning-meta.ts +0 -1367
- package/src/executors/lsp-client.ts +0 -355
- package/src/executors/memory.ts +0 -978
- package/src/executors/meta.ts +0 -293
- package/src/executors/process-registry.ts +0 -570
- package/src/executors/pty-session-store.ts +0 -43
- package/src/executors/pty.ts +0 -342
- package/src/executors/restart.ts +0 -133
- package/src/executors/search-freshness.ts +0 -249
- package/src/executors/search-types.ts +0 -98
- package/src/executors/search.ts +0 -89
- package/src/executors/self-diagnose.ts +0 -552
- package/src/executors/session-history.ts +0 -435
- package/src/executors/shell-safety.ts +0 -519
- package/src/executors/shell.ts +0 -1243
- package/src/executors/utils.ts +0 -40
- package/src/executors/web.ts +0 -786
- package/src/extraction/content-extraction.ts +0 -281
- package/src/extraction/index.ts +0 -5
- package/src/headless-control-contract.ts +0 -1149
- package/src/index.ts +0 -788
- package/src/local-control-http-auth.ts +0 -2
- package/src/mcp/client.ts +0 -218
- package/src/mcp/connection.ts +0 -568
- package/src/mcp/index.ts +0 -11
- package/src/mcp/jsonrpc.ts +0 -195
- package/src/mcp/types.ts +0 -199
- package/src/network-control-adapter.ts +0 -88
- package/src/network-runtime/address-types.ts +0 -218
- package/src/network-runtime/db-owner-fencing.ts +0 -91
- package/src/network-runtime/delivery-receipts.ts +0 -372
- package/src/network-runtime/direct-endpoint-authority.ts +0 -35
- package/src/network-runtime/index.ts +0 -316
- package/src/network-runtime/local-control-contract.ts +0 -784
- package/src/network-runtime/node-store-contract.ts +0 -46
- package/src/network-runtime/pair-route-contract.ts +0 -97
- package/src/network-runtime/peer-capabilities.ts +0 -48
- package/src/network-runtime/peer-principal-ref.ts +0 -20
- package/src/network-runtime/peer-state-machine.ts +0 -160
- package/src/network-runtime/protocol-schemas.ts +0 -265
- package/src/network-runtime/runtime-bootstrap-contract.ts +0 -83
- package/src/outlook/desktop-session.ts +0 -409
- package/src/policy.ts +0 -171
- package/src/providers/brave.ts +0 -80
- package/src/providers/duckduckgo.ts +0 -199
- package/src/providers/exa.ts +0 -85
- package/src/providers/firecrawl.ts +0 -77
- package/src/providers/index.ts +0 -8
- package/src/providers/jina.ts +0 -70
- package/src/providers/router.ts +0 -121
- package/src/providers/search-provider.ts +0 -74
- package/src/providers/tavily.ts +0 -74
- package/src/quip/desktop-session.ts +0 -435
- package/src/registry/index.ts +0 -1
- package/src/registry/registry.ts +0 -905
- package/src/runtime-socket-local-control-client.ts +0 -632
- package/src/security/dns-normalization.ts +0 -34
- package/src/security/dns-pinning.ts +0 -138
- package/src/security/external-content.ts +0 -129
- package/src/security/ssrf.ts +0 -207
- package/src/slack/desktop-session.ts +0 -493
- package/src/tool-factory.ts +0 -91
- package/src/types.ts +0 -1341
- package/src/utils/retry.ts +0 -163
- package/src/utils/safe-parse-json.ts +0 -176
- package/src/utils/url.ts +0 -20
- package/tests/benchmarks/registry.bench.ts +0 -57
- package/tests/cache/web-cache.test.ts +0 -147
- package/tests/critical-integration.test.ts +0 -1465
- package/tests/definitions/apply-patch.test.ts +0 -586
- package/tests/definitions/browser.test.ts +0 -495
- package/tests/definitions/delegation-pause-resume.test.ts +0 -758
- package/tests/definitions/execution.test.ts +0 -671
- package/tests/definitions/messaging-inbox-scope.test.ts +0 -229
- package/tests/definitions/messaging.test.ts +0 -1468
- package/tests/definitions/outlook.test.ts +0 -30
- package/tests/definitions/process.test.ts +0 -469
- package/tests/definitions/slack.test.ts +0 -28
- package/tests/definitions/tool-inventory.test.ts +0 -218
- package/tests/e2e/delegation-quest-orchestration.e2e.test.ts +0 -433
- package/tests/e2e/memory-tool-discovery-contract.e2e.test.ts +0 -81
- package/tests/executors/apply-patch.test.ts +0 -538
- package/tests/executors/arion.test.ts +0 -309
- package/tests/executors/conversation-primitives.test.ts +0 -250
- package/tests/executors/deploy.test.ts +0 -746
- package/tests/executors/filesystem-tools.test.ts +0 -357
- package/tests/executors/filesystem.test.ts +0 -959
- package/tests/executors/frg-freshness.test.ts +0 -136
- package/tests/executors/frg-merge.test.ts +0 -70
- package/tests/executors/frg-session-content.test.ts +0 -40
- package/tests/executors/frg.test.ts +0 -56
- package/tests/executors/memory-bugfixes.test.ts +0 -257
- package/tests/executors/memory-real-memoria.integration.test.ts +0 -316
- package/tests/executors/memory.test.ts +0 -853
- package/tests/executors/meta-tools.test.ts +0 -411
- package/tests/executors/meta.test.ts +0 -683
- package/tests/executors/path-containment.test.ts +0 -51
- package/tests/executors/process-registry.test.ts +0 -505
- package/tests/executors/pty.test.ts +0 -664
- package/tests/executors/quest-security.test.ts +0 -249
- package/tests/executors/read-file-media.test.ts +0 -230
- package/tests/executors/recall-knowledge-schema.test.ts +0 -209
- package/tests/executors/recall-tags.test.ts +0 -278
- package/tests/executors/remember-null-safety.contract.test.ts +0 -41
- package/tests/executors/restart.test.ts +0 -67
- package/tests/executors/search-unified.test.ts +0 -381
- package/tests/executors/session-history.test.ts +0 -340
- package/tests/executors/session-transcript.test.ts +0 -561
- package/tests/executors/shell-abort.test.ts +0 -416
- package/tests/executors/shell-env-blocklist.test.ts +0 -648
- package/tests/executors/shell-env-process.test.ts +0 -245
- package/tests/executors/shell-process-registry.test.ts +0 -334
- package/tests/executors/shell-tools.test.ts +0 -393
- package/tests/executors/shell.test.ts +0 -690
- package/tests/executors/web-abort-vs-timeout.test.ts +0 -213
- package/tests/executors/web-integration.test.ts +0 -633
- package/tests/executors/web-symlink.test.ts +0 -18
- package/tests/executors/web.test.ts +0 -1400
- package/tests/executors/write-stdin.test.ts +0 -145
- package/tests/extraction/content-extraction.test.ts +0 -153
- package/tests/guards/tools-default-test-lane.integration.test.ts +0 -21
- package/tests/guards/tools-package-test-commands.e2e.test.ts +0 -43
- package/tests/guards/tools-test-lane-manifest.contract.test.ts +0 -76
- package/tests/guards/tools-vitest-workspace-alias.contract.test.ts +0 -63
- package/tests/helpers/async-waits.ts +0 -53
- package/tests/integration/headless-control-contract.integration.test.ts +0 -153
- package/tests/integration/memory-tool-schema-parity.integration.test.ts +0 -67
- package/tests/integration/meta-tools-round-trip.integration.test.ts +0 -506
- package/tests/integration/quest-round-trip.test.ts +0 -303
- package/tests/integration/registry-executor-flow.test.ts +0 -85
- package/tests/integration.test.ts +0 -177
- package/tests/loading-tier.test.ts +0 -126
- package/tests/mcp/client-reconnect.test.ts +0 -267
- package/tests/mcp/connection.test.ts +0 -846
- package/tests/mcp/injectable-logger.test.ts +0 -83
- package/tests/mcp/jsonrpc.test.ts +0 -109
- package/tests/mcp/lifecycle.test.ts +0 -879
- package/tests/network-runtime/address-types.contract.test.ts +0 -143
- package/tests/network-runtime/continuity-bind-schema.contract.test.ts +0 -203
- package/tests/network-runtime/local-control-contract.test.ts +0 -869
- package/tests/network-runtime/local-control-invite-token.contract.test.ts +0 -146
- package/tests/network-runtime/node-store-contract.test.ts +0 -11
- package/tests/network-runtime/pair-protocol-nodeid.contract.test.ts +0 -15
- package/tests/network-runtime/peer-state-machine.contract.test.ts +0 -148
- package/tests/network-runtime/protocol-schemas.contract.test.ts +0 -512
- package/tests/network-runtime/relay-pending-nodeid.contract.test.ts +0 -62
- package/tests/network-runtime/runtime-bootstrap-contract.test.ts +0 -227
- package/tests/network-runtime/runtime-socket-local-control-client.test.ts +0 -621
- package/tests/network-runtime/wait-for-message-script.test.ts +0 -288
- package/tests/parallel.test.ts +0 -71
- package/tests/policy.test.ts +0 -184
- package/tests/print-default-test-lane.ts +0 -14
- package/tests/print-test-lane-manifest.ts +0 -22
- package/tests/providers/brave.test.ts +0 -159
- package/tests/providers/duckduckgo.test.ts +0 -207
- package/tests/providers/exa.test.ts +0 -175
- package/tests/providers/firecrawl.test.ts +0 -168
- package/tests/providers/jina.test.ts +0 -144
- package/tests/providers/router.test.ts +0 -328
- package/tests/providers/tavily.test.ts +0 -165
- package/tests/registry/discovery.test.ts +0 -154
- package/tests/registry/injectable-logger.test.ts +0 -230
- package/tests/registry/input-validation.test.ts +0 -361
- package/tests/registry/interface-completeness.test.ts +0 -85
- package/tests/registry/mcp-integration.test.ts +0 -103
- package/tests/registry/mcp-read-only-hint.test.ts +0 -60
- package/tests/registry/memoria-discovery.test.ts +0 -390
- package/tests/registry/nested-validation.test.ts +0 -283
- package/tests/registry/pseudo-tool-filtering.test.ts +0 -258
- package/tests/registry/registration-lifecycle.test.ts +0 -133
- package/tests/registry-validation.test.ts +0 -424
- package/tests/registry.test.ts +0 -460
- package/tests/security/dns-pinning.test.ts +0 -162
- package/tests/security/external-content.test.ts +0 -144
- package/tests/security/ssrf.test.ts +0 -118
- package/tests/shell-safety-integration.test.ts +0 -32
- package/tests/shell-safety.test.ts +0 -365
- package/tests/slack/desktop-session.test.ts +0 -50
- package/tests/test-lane-manifest.ts +0 -440
- package/tests/test-utils.ts +0 -27
- package/tests/tool-factory.test.ts +0 -188
- package/tests/utils/retry.test.ts +0 -231
- package/tests/utils/url.test.ts +0 -63
- package/tsconfig.cjs.json +0 -24
- package/tsconfig.json +0 -12
- package/vitest.config.ts +0 -55
- package/vitest.e2e.config.ts +0 -24
- package/vitest.integration.config.ts +0 -24
- package/vitest.native.config.ts +0 -24
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
2
|
-
import { ToolRegistry } from "../../src/registry/registry.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Regression test: discoverFromMemoria() must NOT register pseudo-tools.
|
|
6
|
-
*
|
|
7
|
-
* A pseudo-tool is a Memoria tool record that has valid metadata (name,
|
|
8
|
-
* description, category, parameters, riskLevel) but lacks executable
|
|
9
|
-
* content. Executable content is defined as having:
|
|
10
|
-
* - a non-empty `responseTemplate` string.
|
|
11
|
-
*
|
|
12
|
-
* Tools with neither field are metadata-only stubs and must be skipped
|
|
13
|
-
* to prevent the registry from surfacing non-functional tools to the LLM.
|
|
14
|
-
*
|
|
15
|
-
* Covers: P1-20 (pseudo-tool filtering) and P1-23 (missing regression coverage)
|
|
16
|
-
* from the unify-skill-types design doc.
|
|
17
|
-
*/
|
|
18
|
-
describe("Pseudo-tool filtering in discoverFromMemoria", () => {
|
|
19
|
-
let registry: ToolRegistry;
|
|
20
|
-
let mockMemoria: any;
|
|
21
|
-
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
registry = new ToolRegistry();
|
|
24
|
-
mockMemoria = {
|
|
25
|
-
recallTools: vi.fn(),
|
|
26
|
-
rememberTool: vi.fn(),
|
|
27
|
-
rememberSkill: vi.fn().mockResolvedValue("skill-id"),
|
|
28
|
-
recallSkills: vi.fn().mockResolvedValue([]),
|
|
29
|
-
getSkill: vi.fn().mockResolvedValue(null),
|
|
30
|
-
recordSkillExecution: vi
|
|
31
|
-
.fn()
|
|
32
|
-
.mockResolvedValue({ id: "exec-1", skillId: "s1", success: true, timestamp: new Date() }),
|
|
33
|
-
};
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("should register a tool with responseTemplate", async () => {
|
|
37
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
38
|
-
{
|
|
39
|
-
id: "tool-rt",
|
|
40
|
-
name: "template_tool",
|
|
41
|
-
description: "Tool with a response template",
|
|
42
|
-
category: "meta",
|
|
43
|
-
parameters: { type: "object", properties: { input: { type: "string" } } },
|
|
44
|
-
riskLevel: "safe",
|
|
45
|
-
responseTemplate: "Result: {{input}}",
|
|
46
|
-
},
|
|
47
|
-
]);
|
|
48
|
-
|
|
49
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
50
|
-
|
|
51
|
-
expect(count).toBe(1);
|
|
52
|
-
expect(registry.has("template_tool")).toBe(true);
|
|
53
|
-
|
|
54
|
-
// Verify the tool is actually executable
|
|
55
|
-
const tool = registry.get("template_tool")!;
|
|
56
|
-
const result = await tool.execute(
|
|
57
|
-
{ input: "hello" },
|
|
58
|
-
{ workingDir: "/tmp", env: {}, confirm: vi.fn().mockResolvedValue(true) },
|
|
59
|
-
);
|
|
60
|
-
expect(result.success).toBe(true);
|
|
61
|
-
expect(result.data).toBe("Result: hello");
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("should skip a tool with only knowledge field (no responseTemplate)", async () => {
|
|
65
|
-
// After the knowledge->tool rename, only tools with responseTemplate
|
|
66
|
-
// are considered executable. Knowledge-only records are metadata stubs.
|
|
67
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
68
|
-
{
|
|
69
|
-
id: "tool-kn",
|
|
70
|
-
name: "knowledge_tool",
|
|
71
|
-
description: "Tool with knowledge content but no responseTemplate",
|
|
72
|
-
category: "meta",
|
|
73
|
-
parameters: { type: "object", properties: {} },
|
|
74
|
-
riskLevel: "safe",
|
|
75
|
-
knowledge:
|
|
76
|
-
"TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.",
|
|
77
|
-
},
|
|
78
|
-
]);
|
|
79
|
-
|
|
80
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
81
|
-
|
|
82
|
-
expect(count).toBe(0);
|
|
83
|
-
expect(registry.has("knowledge_tool")).toBe(false);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("should skip a pseudo-tool with no responseTemplate", async () => {
|
|
87
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
88
|
-
{
|
|
89
|
-
id: "tool-pseudo",
|
|
90
|
-
name: "pseudo_tool",
|
|
91
|
-
description: "Metadata-only entry with no executable content",
|
|
92
|
-
category: "meta",
|
|
93
|
-
parameters: { type: "object", properties: { query: { type: "string" } } },
|
|
94
|
-
riskLevel: "safe",
|
|
95
|
-
// No responseTemplate
|
|
96
|
-
},
|
|
97
|
-
]);
|
|
98
|
-
|
|
99
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
100
|
-
|
|
101
|
-
expect(count).toBe(0);
|
|
102
|
-
expect(registry.has("pseudo_tool")).toBe(false);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("should register tools with responseTemplate and skip all others in a mixed batch", async () => {
|
|
106
|
-
// Only responseTemplate makes a tool executable. Knowledge-only
|
|
107
|
-
// and empty records are both treated as non-executable metadata.
|
|
108
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
109
|
-
{
|
|
110
|
-
id: "tool-1",
|
|
111
|
-
name: "with_template",
|
|
112
|
-
description: "Has a response template",
|
|
113
|
-
category: "meta",
|
|
114
|
-
parameters: { type: "object", properties: {} },
|
|
115
|
-
riskLevel: "safe",
|
|
116
|
-
responseTemplate: "template output",
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
id: "tool-2",
|
|
120
|
-
name: "with_knowledge",
|
|
121
|
-
description: "Has knowledge content only",
|
|
122
|
-
category: "data",
|
|
123
|
-
parameters: { type: "object", properties: {} },
|
|
124
|
-
riskLevel: "safe",
|
|
125
|
-
knowledge: "Some domain knowledge about data processing.",
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
id: "tool-3",
|
|
129
|
-
name: "pseudo_no_content",
|
|
130
|
-
description: "Metadata stub, no executable content",
|
|
131
|
-
category: "meta",
|
|
132
|
-
parameters: { type: "object", properties: {} },
|
|
133
|
-
riskLevel: "safe",
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
id: "tool-4",
|
|
137
|
-
name: "another_pseudo",
|
|
138
|
-
description: "Another metadata-only entry",
|
|
139
|
-
category: "web",
|
|
140
|
-
parameters: { type: "object", properties: {} },
|
|
141
|
-
riskLevel: "moderate",
|
|
142
|
-
},
|
|
143
|
-
]);
|
|
144
|
-
|
|
145
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
146
|
-
|
|
147
|
-
expect(count).toBe(1);
|
|
148
|
-
expect(registry.has("with_template")).toBe(true);
|
|
149
|
-
expect(registry.has("with_knowledge")).toBe(false);
|
|
150
|
-
expect(registry.has("pseudo_no_content")).toBe(false);
|
|
151
|
-
expect(registry.has("another_pseudo")).toBe(false);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it("should treat empty-string responseTemplate as pseudo-tool", async () => {
|
|
155
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
156
|
-
{
|
|
157
|
-
id: "tool-empty-rt",
|
|
158
|
-
name: "empty_template",
|
|
159
|
-
description: "Has an empty responseTemplate",
|
|
160
|
-
category: "meta",
|
|
161
|
-
parameters: { type: "object", properties: {} },
|
|
162
|
-
riskLevel: "safe",
|
|
163
|
-
responseTemplate: "",
|
|
164
|
-
},
|
|
165
|
-
]);
|
|
166
|
-
|
|
167
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
168
|
-
|
|
169
|
-
expect(count).toBe(0);
|
|
170
|
-
expect(registry.has("empty_template")).toBe(false);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it("should treat whitespace-only responseTemplate as pseudo-tool", async () => {
|
|
174
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
175
|
-
{
|
|
176
|
-
id: "tool-ws-rt",
|
|
177
|
-
name: "whitespace_template",
|
|
178
|
-
description: "Has whitespace-only responseTemplate",
|
|
179
|
-
category: "meta",
|
|
180
|
-
parameters: { type: "object", properties: {} },
|
|
181
|
-
riskLevel: "safe",
|
|
182
|
-
responseTemplate: " \n\t ",
|
|
183
|
-
},
|
|
184
|
-
]);
|
|
185
|
-
|
|
186
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
187
|
-
|
|
188
|
-
expect(count).toBe(0);
|
|
189
|
-
expect(registry.has("whitespace_template")).toBe(false);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it("should treat empty-string knowledge as pseudo-tool", async () => {
|
|
193
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
194
|
-
{
|
|
195
|
-
id: "tool-empty-kn",
|
|
196
|
-
name: "empty_knowledge",
|
|
197
|
-
description: "Has an empty knowledge field",
|
|
198
|
-
category: "meta",
|
|
199
|
-
parameters: { type: "object", properties: {} },
|
|
200
|
-
riskLevel: "safe",
|
|
201
|
-
knowledge: "",
|
|
202
|
-
},
|
|
203
|
-
]);
|
|
204
|
-
|
|
205
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
206
|
-
|
|
207
|
-
expect(count).toBe(0);
|
|
208
|
-
expect(registry.has("empty_knowledge")).toBe(false);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it("should treat whitespace-only knowledge as pseudo-tool", async () => {
|
|
212
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
213
|
-
{
|
|
214
|
-
id: "tool-ws-kn",
|
|
215
|
-
name: "whitespace_knowledge",
|
|
216
|
-
description: "Has whitespace-only knowledge field",
|
|
217
|
-
category: "meta",
|
|
218
|
-
parameters: { type: "object", properties: {} },
|
|
219
|
-
riskLevel: "safe",
|
|
220
|
-
knowledge: " \n\t ",
|
|
221
|
-
},
|
|
222
|
-
]);
|
|
223
|
-
|
|
224
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
225
|
-
|
|
226
|
-
expect(count).toBe(0);
|
|
227
|
-
expect(registry.has("whitespace_knowledge")).toBe(false);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it("should prefer responseTemplate over knowledge when both are present", async () => {
|
|
231
|
-
mockMemoria.recallTools.mockResolvedValue([
|
|
232
|
-
{
|
|
233
|
-
id: "tool-both",
|
|
234
|
-
name: "both_fields",
|
|
235
|
-
description: "Has both responseTemplate and knowledge",
|
|
236
|
-
category: "meta",
|
|
237
|
-
parameters: { type: "object", properties: { name: { type: "string" } } },
|
|
238
|
-
riskLevel: "safe",
|
|
239
|
-
responseTemplate: "Hello, {{name}}!",
|
|
240
|
-
knowledge: "This is the knowledge content.",
|
|
241
|
-
},
|
|
242
|
-
]);
|
|
243
|
-
|
|
244
|
-
const count = await registry.discoverFromMemoria(mockMemoria);
|
|
245
|
-
|
|
246
|
-
expect(count).toBe(1);
|
|
247
|
-
expect(registry.has("both_fields")).toBe(true);
|
|
248
|
-
|
|
249
|
-
// responseTemplate takes precedence in the executor
|
|
250
|
-
const tool = registry.get("both_fields")!;
|
|
251
|
-
const result = await tool.execute(
|
|
252
|
-
{ name: "World" },
|
|
253
|
-
{ workingDir: "/tmp", env: {}, confirm: vi.fn().mockResolvedValue(true) },
|
|
254
|
-
);
|
|
255
|
-
expect(result.success).toBe(true);
|
|
256
|
-
expect(result.data).toBe("Hello, World!");
|
|
257
|
-
});
|
|
258
|
-
});
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
-
import { ToolRegistry } from "../../src/registry/registry.js";
|
|
3
|
-
import type { Tool } from "../../src/types.js";
|
|
4
|
-
|
|
5
|
-
describe("Tool Registry - Static Registration", () => {
|
|
6
|
-
let registry: ToolRegistry;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
registry = new ToolRegistry();
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it("should register a new tool", () => {
|
|
13
|
-
const mockTool: Tool = {
|
|
14
|
-
name: "test_tool",
|
|
15
|
-
description: "A test tool",
|
|
16
|
-
category: "meta",
|
|
17
|
-
parameters: {},
|
|
18
|
-
riskLevel: "safe",
|
|
19
|
-
execute: async () => ({ success: true, message: "ok" }),
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
registry.register(mockTool);
|
|
23
|
-
|
|
24
|
-
expect(registry.has("test_tool")).toBe(true);
|
|
25
|
-
expect(registry.get("test_tool")).toBe(mockTool);
|
|
26
|
-
expect(registry.size).toBe(1);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("should throw error on duplicate registration without override", () => {
|
|
30
|
-
const mockTool: Tool = {
|
|
31
|
-
name: "duplicate_tool",
|
|
32
|
-
description: "Test",
|
|
33
|
-
category: "meta",
|
|
34
|
-
parameters: {},
|
|
35
|
-
riskLevel: "safe",
|
|
36
|
-
execute: async () => ({ success: true, message: "ok" }),
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
registry.register(mockTool);
|
|
40
|
-
|
|
41
|
-
expect(() => registry.register(mockTool)).toThrow(
|
|
42
|
-
/already registered|override/i,
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("should allow override with override flag", () => {
|
|
47
|
-
const mockTool1: Tool = {
|
|
48
|
-
name: "override_test",
|
|
49
|
-
description: "Version 1",
|
|
50
|
-
category: "meta",
|
|
51
|
-
parameters: {},
|
|
52
|
-
riskLevel: "safe",
|
|
53
|
-
execute: async () => ({
|
|
54
|
-
success: true,
|
|
55
|
-
message: "ok",
|
|
56
|
-
data: { version: 1 },
|
|
57
|
-
}),
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const mockTool2: Tool = {
|
|
61
|
-
name: "override_test",
|
|
62
|
-
description: "Version 2",
|
|
63
|
-
category: "meta",
|
|
64
|
-
parameters: {},
|
|
65
|
-
riskLevel: "safe",
|
|
66
|
-
execute: async () => ({
|
|
67
|
-
success: true,
|
|
68
|
-
message: "ok",
|
|
69
|
-
data: { version: 2 },
|
|
70
|
-
}),
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
registry.register(mockTool1);
|
|
74
|
-
registry.register(mockTool2, { override: true });
|
|
75
|
-
|
|
76
|
-
const tool = registry.get("override_test");
|
|
77
|
-
expect(tool?.description).toBe("Version 2");
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it("should unregister a tool", () => {
|
|
81
|
-
const mockTool: Tool = {
|
|
82
|
-
name: "removable",
|
|
83
|
-
description: "Test",
|
|
84
|
-
category: "meta",
|
|
85
|
-
parameters: {},
|
|
86
|
-
riskLevel: "safe",
|
|
87
|
-
execute: async () => ({ success: true, message: "ok" }),
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
registry.register(mockTool);
|
|
91
|
-
expect(registry.has("removable")).toBe(true);
|
|
92
|
-
|
|
93
|
-
const removed = registry.unregister("removable");
|
|
94
|
-
expect(removed).toBe(true);
|
|
95
|
-
expect(registry.has("removable")).toBe(false);
|
|
96
|
-
expect(registry.size).toBe(0);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it("should return false when unregistering non-existent tool", () => {
|
|
100
|
-
const removed = registry.unregister("nonexistent");
|
|
101
|
-
expect(removed).toBe(false);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it("should filter tools by category", () => {
|
|
105
|
-
const fileTool: Tool = {
|
|
106
|
-
name: "file_tool",
|
|
107
|
-
description: "File ops",
|
|
108
|
-
category: "filesystem",
|
|
109
|
-
parameters: {},
|
|
110
|
-
riskLevel: "safe",
|
|
111
|
-
execute: async () => ({ success: true, message: "ok" }),
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
const shellTool: Tool = {
|
|
115
|
-
name: "shell_tool",
|
|
116
|
-
description: "Shell ops",
|
|
117
|
-
category: "shell",
|
|
118
|
-
parameters: {},
|
|
119
|
-
riskLevel: "moderate",
|
|
120
|
-
execute: async () => ({ success: true, message: "ok" }),
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
registry.register(fileTool);
|
|
124
|
-
registry.register(shellTool);
|
|
125
|
-
|
|
126
|
-
const fileTools = registry.list("filesystem");
|
|
127
|
-
expect(fileTools).toHaveLength(1);
|
|
128
|
-
expect(fileTools[0].name).toBe("file_tool");
|
|
129
|
-
|
|
130
|
-
const allTools = registry.list();
|
|
131
|
-
expect(allTools).toHaveLength(2);
|
|
132
|
-
});
|
|
133
|
-
});
|