@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,154 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
import { ToolRegistry } from "../../src/registry/index.js";
|
|
3
|
-
import type { Tool } from "../../src/types.js";
|
|
4
|
-
|
|
5
|
-
// Mock Memoria
|
|
6
|
-
const mockRecallKnowledge = vi.fn();
|
|
7
|
-
|
|
8
|
-
const mockMemoria = {
|
|
9
|
-
recallTools: mockRecallKnowledge,
|
|
10
|
-
rememberTool: vi.fn(),
|
|
11
|
-
rememberSkill: vi.fn().mockResolvedValue("skill-id"),
|
|
12
|
-
recallSkills: vi.fn().mockResolvedValue([]),
|
|
13
|
-
getSkill: vi.fn().mockResolvedValue(null),
|
|
14
|
-
recordSkillExecution: vi
|
|
15
|
-
.fn()
|
|
16
|
-
.mockResolvedValue({ id: "exec-1", skillId: "s1", success: true, timestamp: new Date() }),
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
describe("Tool Discovery", () => {
|
|
20
|
-
let registry: ToolRegistry;
|
|
21
|
-
|
|
22
|
-
const createMockTool = (name: string, description: string): Tool => ({
|
|
23
|
-
name,
|
|
24
|
-
description,
|
|
25
|
-
category: "meta",
|
|
26
|
-
parameters: { type: "object", properties: {} },
|
|
27
|
-
riskLevel: "safe",
|
|
28
|
-
execute: async () => ({ success: true, message: "ok" }),
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
beforeEach(() => {
|
|
32
|
-
vi.clearAllMocks();
|
|
33
|
-
registry = new ToolRegistry();
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
describe("search", () => {
|
|
37
|
-
it("should search registered tools by name", () => {
|
|
38
|
-
registry.register(createMockTool("file_reader", "Read files from disk"));
|
|
39
|
-
registry.register(createMockTool("file_writer", "Write files to disk"));
|
|
40
|
-
registry.register(createMockTool("http_client", "Make HTTP requests"));
|
|
41
|
-
|
|
42
|
-
const results = registry.search("file");
|
|
43
|
-
|
|
44
|
-
expect(results).toHaveLength(2);
|
|
45
|
-
expect(results.map((t) => t.name)).toContain("file_reader");
|
|
46
|
-
expect(results.map((t) => t.name)).toContain("file_writer");
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("should search tools by description", () => {
|
|
50
|
-
registry.register(createMockTool("reader", "Read files from disk"));
|
|
51
|
-
registry.register(createMockTool("writer", "Write files to disk"));
|
|
52
|
-
registry.register(createMockTool("fetcher", "Fetch data from API"));
|
|
53
|
-
|
|
54
|
-
const results = registry.search("disk");
|
|
55
|
-
|
|
56
|
-
expect(results).toHaveLength(2);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it("should return empty array for no matches", () => {
|
|
60
|
-
registry.register(createMockTool("tool1", "Description"));
|
|
61
|
-
|
|
62
|
-
const results = registry.search("nonexistent");
|
|
63
|
-
|
|
64
|
-
expect(results).toHaveLength(0);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
describe("discoverFromMemoria", () => {
|
|
69
|
-
it("should load tools from Memoria knowledge", async () => {
|
|
70
|
-
mockRecallKnowledge.mockResolvedValue([
|
|
71
|
-
{
|
|
72
|
-
id: "k1",
|
|
73
|
-
name: "custom_tool",
|
|
74
|
-
description: "A custom learned tool",
|
|
75
|
-
category: "meta",
|
|
76
|
-
parameters: { type: "object", properties: { input: { type: "string" } } },
|
|
77
|
-
riskLevel: "safe",
|
|
78
|
-
responseTemplate: "Result: {{input}}",
|
|
79
|
-
},
|
|
80
|
-
]);
|
|
81
|
-
|
|
82
|
-
const count = await registry.discoverFromMemoria(mockMemoria as any);
|
|
83
|
-
|
|
84
|
-
expect(count).toBe(1);
|
|
85
|
-
expect(registry.has("custom_tool")).toBe(true);
|
|
86
|
-
|
|
87
|
-
const tool = registry.get("custom_tool");
|
|
88
|
-
expect(tool?.description).toBe("A custom learned tool");
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it("should register only recalled tools with responseTemplate content", async () => {
|
|
92
|
-
mockRecallKnowledge.mockResolvedValue([
|
|
93
|
-
{
|
|
94
|
-
id: "k1",
|
|
95
|
-
name: "valid_tool",
|
|
96
|
-
description: "Valid",
|
|
97
|
-
category: "meta",
|
|
98
|
-
parameters: { type: "object" },
|
|
99
|
-
riskLevel: "safe",
|
|
100
|
-
responseTemplate: "Result: ok",
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
id: "k2",
|
|
104
|
-
name: "also_a_tool",
|
|
105
|
-
description: "Knowledge-only metadata should be skipped",
|
|
106
|
-
category: "meta",
|
|
107
|
-
parameters: { type: "object", properties: {} },
|
|
108
|
-
riskLevel: "safe",
|
|
109
|
-
knowledge: "This tool does useful things",
|
|
110
|
-
},
|
|
111
|
-
]);
|
|
112
|
-
|
|
113
|
-
const count = await registry.discoverFromMemoria(mockMemoria as any);
|
|
114
|
-
|
|
115
|
-
expect(count).toBe(1);
|
|
116
|
-
expect(registry.has("valid_tool")).toBe(true);
|
|
117
|
-
expect(registry.has("also_a_tool")).toBe(false);
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it("should return 0 when recallTools fails", async () => {
|
|
121
|
-
mockRecallKnowledge.mockRejectedValue(new Error("Network error"));
|
|
122
|
-
|
|
123
|
-
const count = await registry.discoverFromMemoria(mockMemoria as any);
|
|
124
|
-
|
|
125
|
-
expect(count).toBe(0);
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
describe("saveToMemoria", () => {
|
|
130
|
-
it("should save tool definition to Memoria", async () => {
|
|
131
|
-
const rememberMock = vi.fn().mockResolvedValue("k1");
|
|
132
|
-
const memoria = { rememberTool: rememberMock } as any;
|
|
133
|
-
|
|
134
|
-
const tool = createMockTool("my_tool", "My tool description");
|
|
135
|
-
registry.register(tool);
|
|
136
|
-
|
|
137
|
-
await registry.saveToMemoria("my_tool", memoria);
|
|
138
|
-
|
|
139
|
-
expect(rememberMock).toHaveBeenCalledWith(
|
|
140
|
-
expect.objectContaining({
|
|
141
|
-
name: "my_tool",
|
|
142
|
-
description: "My tool description",
|
|
143
|
-
}),
|
|
144
|
-
);
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it("should throw error if tool not found", async () => {
|
|
148
|
-
const memoria = { rememberTool: vi.fn() } as any;
|
|
149
|
-
await expect(registry.saveToMemoria("nonexistent", memoria)).rejects.toThrow(
|
|
150
|
-
'Tool "nonexistent" not found',
|
|
151
|
-
);
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
});
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @aria/tools - Injectable Logger Tests for ToolRegistry
|
|
3
|
-
*
|
|
4
|
-
* Verifies that ToolRegistry uses an injectable logger instead of hardcoded
|
|
5
|
-
* console.warn/error, and that the default behavior (using console) is preserved.
|
|
6
|
-
*
|
|
7
|
-
* aria-rfu.17: Debug cleanup + injectable logger
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
11
|
-
import { ToolRegistry } from "../../src/registry/registry.js";
|
|
12
|
-
import type { Logger, Tool, ToolContext } from "../../src/types.js";
|
|
13
|
-
|
|
14
|
-
function createMockLogger(): Logger & {
|
|
15
|
-
warn: ReturnType<typeof vi.fn>;
|
|
16
|
-
error: ReturnType<typeof vi.fn>;
|
|
17
|
-
} {
|
|
18
|
-
return {
|
|
19
|
-
warn: vi.fn(),
|
|
20
|
-
error: vi.fn(),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function createDummyTool(name: string): Tool {
|
|
25
|
-
return {
|
|
26
|
-
name,
|
|
27
|
-
description: `Tool ${name}`,
|
|
28
|
-
category: "meta",
|
|
29
|
-
parameters: { type: "object", properties: {} },
|
|
30
|
-
riskLevel: "safe",
|
|
31
|
-
execute: async () => ({ success: true, message: "ok" }),
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
describe("ToolRegistry — injectable logger", () => {
|
|
36
|
-
describe("constructor", () => {
|
|
37
|
-
it("accepts a custom logger via options", () => {
|
|
38
|
-
const logger = createMockLogger();
|
|
39
|
-
const registry = new ToolRegistry({ logger });
|
|
40
|
-
|
|
41
|
-
// Registry should be created successfully
|
|
42
|
-
expect(registry.size).toBe(0);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("defaults to console when no logger is provided", () => {
|
|
46
|
-
// Should not throw
|
|
47
|
-
const registry = new ToolRegistry();
|
|
48
|
-
expect(registry.size).toBe(0);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("defaults to console when options is empty object", () => {
|
|
52
|
-
const registry = new ToolRegistry({});
|
|
53
|
-
expect(registry.size).toBe(0);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe("discoverFromMemoria — uses logger.warn on invalid tool definitions", () => {
|
|
58
|
-
it("calls logger.warn when a tool definition throws during creation", async () => {
|
|
59
|
-
const logger = createMockLogger();
|
|
60
|
-
const registry = new ToolRegistry({ logger });
|
|
61
|
-
|
|
62
|
-
// Create a knowledge item with a description getter that throws —
|
|
63
|
-
// simulates a corrupt entry. name is a normal string so the warn
|
|
64
|
-
// message in the catch block can still access k.name safely.
|
|
65
|
-
const badItem = {
|
|
66
|
-
id: "bad-tool",
|
|
67
|
-
name: "broken-tool",
|
|
68
|
-
get description(): string {
|
|
69
|
-
throw new Error("corrupt entry");
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const mockMemoria = {
|
|
74
|
-
recallTools: vi.fn().mockResolvedValue([badItem]),
|
|
75
|
-
rememberTool: vi.fn(),
|
|
76
|
-
rememberSkill: vi.fn().mockResolvedValue("skill-id"),
|
|
77
|
-
recallSkills: vi.fn().mockResolvedValue([]),
|
|
78
|
-
getSkill: vi.fn().mockResolvedValue(null),
|
|
79
|
-
recordSkillExecution: vi.fn().mockResolvedValue({ id: "exec-1", skillId: "s1", success: true, timestamp: new Date() }),
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
await registry.discoverFromMemoria(mockMemoria);
|
|
83
|
-
|
|
84
|
-
// logger.warn should be called for the invalid tool
|
|
85
|
-
expect(logger.warn).toHaveBeenCalledTimes(1);
|
|
86
|
-
expect(logger.warn).toHaveBeenCalledWith(
|
|
87
|
-
expect.stringContaining("Invalid tool definition in Memoria: broken-tool"),
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
// Verify the corrupt tool was not registered
|
|
91
|
-
expect(registry.has("broken-tool")).toBe(false);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("calls logger.error when Memoria query itself fails", async () => {
|
|
95
|
-
const logger = createMockLogger();
|
|
96
|
-
const registry = new ToolRegistry({ logger });
|
|
97
|
-
|
|
98
|
-
const mockMemoria = {
|
|
99
|
-
recallTools: vi.fn().mockRejectedValue(new Error("DB connection lost")),
|
|
100
|
-
rememberTool: vi.fn(),
|
|
101
|
-
rememberSkill: vi.fn().mockResolvedValue("skill-id"),
|
|
102
|
-
recallSkills: vi.fn().mockResolvedValue([]),
|
|
103
|
-
getSkill: vi.fn().mockResolvedValue(null),
|
|
104
|
-
recordSkillExecution: vi.fn().mockResolvedValue({ id: "exec-1", skillId: "s1", success: true, timestamp: new Date() }),
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
await registry.discoverFromMemoria(mockMemoria);
|
|
108
|
-
|
|
109
|
-
// logger.error should be called for the Memoria error
|
|
110
|
-
expect(logger.error).toHaveBeenCalledTimes(1);
|
|
111
|
-
expect(logger.error).toHaveBeenCalledWith(
|
|
112
|
-
expect.stringContaining("Error discovering tools from Memoria"),
|
|
113
|
-
expect.any(Error),
|
|
114
|
-
);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it("does NOT call console.warn/error when custom logger is provided", async () => {
|
|
118
|
-
const logger = createMockLogger();
|
|
119
|
-
const registry = new ToolRegistry({ logger });
|
|
120
|
-
|
|
121
|
-
const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
122
|
-
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
|
123
|
-
|
|
124
|
-
// Create a knowledge item with a description getter that throws
|
|
125
|
-
const badItem = {
|
|
126
|
-
id: "bad-tool",
|
|
127
|
-
name: "broken-tool",
|
|
128
|
-
get description(): string {
|
|
129
|
-
throw new Error("corrupt entry");
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const mockMemoria = {
|
|
134
|
-
recallTools: vi.fn().mockResolvedValue([badItem]),
|
|
135
|
-
rememberTool: vi.fn(),
|
|
136
|
-
rememberSkill: vi.fn().mockResolvedValue("skill-id"),
|
|
137
|
-
recallSkills: vi.fn().mockResolvedValue([]),
|
|
138
|
-
getSkill: vi.fn().mockResolvedValue(null),
|
|
139
|
-
recordSkillExecution: vi.fn().mockResolvedValue({ id: "exec-1", skillId: "s1", success: true, timestamp: new Date() }),
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
await registry.discoverFromMemoria(mockMemoria);
|
|
143
|
-
|
|
144
|
-
// console.warn/error should NOT be called (custom logger handles it)
|
|
145
|
-
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
146
|
-
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
147
|
-
|
|
148
|
-
// Verify the corrupt tool was not registered
|
|
149
|
-
expect(registry.has("broken-tool")).toBe(false);
|
|
150
|
-
|
|
151
|
-
consoleWarnSpy.mockRestore();
|
|
152
|
-
consoleErrorSpy.mockRestore();
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
describe("connectMCP — logger flows to MCPClient", () => {
|
|
157
|
-
it("logger is available on registry (verified via discoverFromMemoria path)", async () => {
|
|
158
|
-
// We verify that the same logger is used across all registry operations.
|
|
159
|
-
// connectMCP spawns real processes, so we verify logger flow through
|
|
160
|
-
// discoverFromMemoria which is fully in-process.
|
|
161
|
-
const logger = createMockLogger();
|
|
162
|
-
const registry = new ToolRegistry({ logger });
|
|
163
|
-
|
|
164
|
-
// First verify logger works via discoverFromMemoria
|
|
165
|
-
const mockMemoria = {
|
|
166
|
-
recallTools: vi.fn().mockRejectedValue(new Error("DB error")),
|
|
167
|
-
rememberTool: vi.fn(),
|
|
168
|
-
rememberSkill: vi.fn().mockResolvedValue("skill-id"),
|
|
169
|
-
recallSkills: vi.fn().mockResolvedValue([]),
|
|
170
|
-
getSkill: vi.fn().mockResolvedValue(null),
|
|
171
|
-
recordSkillExecution: vi.fn().mockResolvedValue({ id: "exec-1", skillId: "s1", success: true, timestamp: new Date() }),
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
await registry.discoverFromMemoria(mockMemoria);
|
|
175
|
-
|
|
176
|
-
// Logger.error should have been called
|
|
177
|
-
expect(logger.error).toHaveBeenCalled();
|
|
178
|
-
|
|
179
|
-
// And console.error should NOT have been called
|
|
180
|
-
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
|
181
|
-
logger.error.mockClear();
|
|
182
|
-
|
|
183
|
-
await registry.discoverFromMemoria(mockMemoria);
|
|
184
|
-
|
|
185
|
-
expect(logger.error).toHaveBeenCalled();
|
|
186
|
-
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
187
|
-
|
|
188
|
-
consoleErrorSpy.mockRestore();
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
describe("default logger (console) is used when no custom logger provided", () => {
|
|
193
|
-
it("uses console.warn for invalid tool definitions in discoverFromMemoria", async () => {
|
|
194
|
-
const registry = new ToolRegistry(); // no custom logger
|
|
195
|
-
|
|
196
|
-
const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
197
|
-
|
|
198
|
-
// Create a knowledge item with a description getter that throws
|
|
199
|
-
const badItem = {
|
|
200
|
-
id: "bad-tool",
|
|
201
|
-
name: "broken-tool",
|
|
202
|
-
get description(): string {
|
|
203
|
-
throw new Error("corrupt entry");
|
|
204
|
-
},
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
const mockMemoria = {
|
|
208
|
-
recallTools: vi.fn().mockResolvedValue([badItem]),
|
|
209
|
-
rememberTool: vi.fn(),
|
|
210
|
-
rememberSkill: vi.fn().mockResolvedValue("skill-id"),
|
|
211
|
-
recallSkills: vi.fn().mockResolvedValue([]),
|
|
212
|
-
getSkill: vi.fn().mockResolvedValue(null),
|
|
213
|
-
recordSkillExecution: vi.fn().mockResolvedValue({ id: "exec-1", skillId: "s1", success: true, timestamp: new Date() }),
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
await registry.discoverFromMemoria(mockMemoria);
|
|
217
|
-
|
|
218
|
-
// console.warn should be called since no custom logger was set
|
|
219
|
-
expect(consoleWarnSpy).toHaveBeenCalledTimes(1);
|
|
220
|
-
expect(consoleWarnSpy).toHaveBeenCalledWith(
|
|
221
|
-
expect.stringContaining("Invalid tool definition"),
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
// Verify the corrupt tool was not registered
|
|
225
|
-
expect(registry.has("broken-tool")).toBe(false);
|
|
226
|
-
|
|
227
|
-
consoleWarnSpy.mockRestore();
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
});
|