@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,424 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
2
|
-
import { ToolRegistry, validateToolInput } from "../src/registry/index.js";
|
|
3
|
-
import type { Tool, ToolContext, ToolResult } from "../src/types.js";
|
|
4
|
-
|
|
5
|
-
// --------------------------------------------------------------------------
|
|
6
|
-
// Helpers
|
|
7
|
-
// --------------------------------------------------------------------------
|
|
8
|
-
|
|
9
|
-
/** Minimal ToolContext for tests */
|
|
10
|
-
const createTestContext = (): ToolContext => ({
|
|
11
|
-
workingDir: "/tmp/test",
|
|
12
|
-
env: { NODE_ENV: "test" },
|
|
13
|
-
confirm: async () => true,
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
/** Create a mock tool with a given JSON Schema for its parameters */
|
|
17
|
-
const createMockTool = (
|
|
18
|
-
name: string,
|
|
19
|
-
parameters: Record<string, unknown>,
|
|
20
|
-
executeFn?: Tool["execute"],
|
|
21
|
-
): Tool => ({
|
|
22
|
-
name,
|
|
23
|
-
description: `Mock tool: ${name}`,
|
|
24
|
-
category: "meta",
|
|
25
|
-
parameters: parameters as Tool["parameters"],
|
|
26
|
-
riskLevel: "safe",
|
|
27
|
-
execute:
|
|
28
|
-
executeFn ??
|
|
29
|
-
(async (input: unknown): Promise<ToolResult> => ({
|
|
30
|
-
success: true,
|
|
31
|
-
message: "executed",
|
|
32
|
-
data: input,
|
|
33
|
-
})),
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// --------------------------------------------------------------------------
|
|
37
|
-
// Unit tests for validateToolInput (standalone function)
|
|
38
|
-
// --------------------------------------------------------------------------
|
|
39
|
-
|
|
40
|
-
describe("validateToolInput", () => {
|
|
41
|
-
it("returns null for non-object schema types (skip validation)", () => {
|
|
42
|
-
expect(validateToolInput("anything", { type: "string" })).toBeNull();
|
|
43
|
-
expect(validateToolInput(42, { type: "number" })).toBeNull();
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("returns null for valid input with no required properties", () => {
|
|
47
|
-
const schema = {
|
|
48
|
-
type: "object",
|
|
49
|
-
properties: {
|
|
50
|
-
name: { type: "string" },
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
expect(validateToolInput({ name: "Alice" }, schema)).toBeNull();
|
|
54
|
-
expect(validateToolInput({}, schema)).toBeNull();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("returns error for missing required properties", () => {
|
|
58
|
-
const schema = {
|
|
59
|
-
type: "object",
|
|
60
|
-
properties: {
|
|
61
|
-
path: { type: "string" },
|
|
62
|
-
content: { type: "string" },
|
|
63
|
-
},
|
|
64
|
-
required: ["path", "content"],
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const error = validateToolInput({ path: "/tmp" }, schema);
|
|
68
|
-
expect(error).not.toBeNull();
|
|
69
|
-
expect(error).toContain("content");
|
|
70
|
-
expect(error).toContain("Missing required");
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it("returns error when input is not an object", () => {
|
|
74
|
-
const schema = {
|
|
75
|
-
type: "object",
|
|
76
|
-
properties: {},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
expect(validateToolInput("hello", schema)).toContain("Expected an object");
|
|
80
|
-
expect(validateToolInput(42, schema)).toContain("Expected an object");
|
|
81
|
-
expect(validateToolInput([1, 2], schema)).toContain("Expected an object");
|
|
82
|
-
expect(validateToolInput(true, schema)).toContain("Expected an object");
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it("returns error when null/undefined input has required fields", () => {
|
|
86
|
-
const schema = {
|
|
87
|
-
type: "object",
|
|
88
|
-
properties: { id: { type: "string" } },
|
|
89
|
-
required: ["id"],
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
expect(validateToolInput(null, schema)).toContain("got null");
|
|
93
|
-
expect(validateToolInput(undefined, schema)).toContain("got undefined");
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("allows null/undefined input when no required fields", () => {
|
|
97
|
-
const schema = {
|
|
98
|
-
type: "object",
|
|
99
|
-
properties: { id: { type: "string" } },
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
expect(validateToolInput(null, schema)).toBeNull();
|
|
103
|
-
expect(validateToolInput(undefined, schema)).toBeNull();
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe("type checking", () => {
|
|
107
|
-
const schema = {
|
|
108
|
-
type: "object",
|
|
109
|
-
properties: {
|
|
110
|
-
name: { type: "string" },
|
|
111
|
-
count: { type: "number" },
|
|
112
|
-
active: { type: "boolean" },
|
|
113
|
-
tags: { type: "array" },
|
|
114
|
-
meta: { type: "object" },
|
|
115
|
-
index: { type: "integer" },
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
it("accepts correct types", () => {
|
|
120
|
-
expect(
|
|
121
|
-
validateToolInput(
|
|
122
|
-
{
|
|
123
|
-
name: "Alice",
|
|
124
|
-
count: 42,
|
|
125
|
-
active: true,
|
|
126
|
-
tags: ["a", "b"],
|
|
127
|
-
meta: { x: 1 },
|
|
128
|
-
index: 5,
|
|
129
|
-
},
|
|
130
|
-
schema,
|
|
131
|
-
),
|
|
132
|
-
).toBeNull();
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it("rejects string where number expected", () => {
|
|
136
|
-
const err = validateToolInput({ count: "not-a-number" }, schema);
|
|
137
|
-
expect(err).toContain("count");
|
|
138
|
-
expect(err).toContain("number");
|
|
139
|
-
expect(err).toContain("string");
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it("rejects number where string expected", () => {
|
|
143
|
-
const err = validateToolInput({ name: 123 }, schema);
|
|
144
|
-
expect(err).toContain("name");
|
|
145
|
-
expect(err).toContain("string");
|
|
146
|
-
expect(err).toContain("number");
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it("rejects string where boolean expected", () => {
|
|
150
|
-
const err = validateToolInput({ active: "yes" }, schema);
|
|
151
|
-
expect(err).toContain("active");
|
|
152
|
-
expect(err).toContain("boolean");
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it("rejects object where array expected", () => {
|
|
156
|
-
const err = validateToolInput({ tags: { a: 1 } }, schema);
|
|
157
|
-
expect(err).toContain("tags");
|
|
158
|
-
expect(err).toContain("array");
|
|
159
|
-
expect(err).toContain("object");
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it("rejects array where object expected", () => {
|
|
163
|
-
const err = validateToolInput({ meta: [1, 2] }, schema);
|
|
164
|
-
expect(err).toContain("meta");
|
|
165
|
-
expect(err).toContain("object");
|
|
166
|
-
expect(err).toContain("array");
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it("rejects float where integer expected", () => {
|
|
170
|
-
const err = validateToolInput({ index: 3.14 }, schema);
|
|
171
|
-
expect(err).toContain("index");
|
|
172
|
-
expect(err).toContain("integer");
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it("accepts integer for integer type", () => {
|
|
176
|
-
expect(validateToolInput({ index: 5 }, schema)).toBeNull();
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it("handles union types (e.g., ['string', 'null'])", () => {
|
|
180
|
-
const unionSchema = {
|
|
181
|
-
type: "object",
|
|
182
|
-
properties: {
|
|
183
|
-
value: { type: ["string", "null"] },
|
|
184
|
-
},
|
|
185
|
-
};
|
|
186
|
-
expect(validateToolInput({ value: "hello" }, unionSchema)).toBeNull();
|
|
187
|
-
expect(validateToolInput({ value: null }, unionSchema)).toBeNull();
|
|
188
|
-
const err = validateToolInput({ value: 42 }, unionSchema);
|
|
189
|
-
expect(err).toContain("value");
|
|
190
|
-
expect(err).toContain("string | null");
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
describe("additionalProperties: false", () => {
|
|
195
|
-
it("rejects unknown properties when additionalProperties is false", () => {
|
|
196
|
-
const schema = {
|
|
197
|
-
type: "object",
|
|
198
|
-
properties: {
|
|
199
|
-
name: { type: "string" },
|
|
200
|
-
},
|
|
201
|
-
additionalProperties: false,
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
const err = validateToolInput({ name: "Alice", extra: true }, schema);
|
|
205
|
-
expect(err).toContain("Unknown properties");
|
|
206
|
-
expect(err).toContain("extra");
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it("allows unknown properties when additionalProperties is not false", () => {
|
|
210
|
-
const schema = {
|
|
211
|
-
type: "object",
|
|
212
|
-
properties: {
|
|
213
|
-
name: { type: "string" },
|
|
214
|
-
},
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
expect(validateToolInput({ name: "Alice", extra: true }, schema)).toBeNull();
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it("allows unknown properties when additionalProperties is true", () => {
|
|
221
|
-
const schema = {
|
|
222
|
-
type: "object",
|
|
223
|
-
properties: {
|
|
224
|
-
name: { type: "string" },
|
|
225
|
-
},
|
|
226
|
-
additionalProperties: true,
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
expect(validateToolInput({ name: "Alice", extra: true }, schema)).toBeNull();
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
it("skips properties without a type annotation", () => {
|
|
234
|
-
const schema = {
|
|
235
|
-
type: "object",
|
|
236
|
-
properties: {
|
|
237
|
-
anything: {},
|
|
238
|
-
},
|
|
239
|
-
};
|
|
240
|
-
// no type on the property, so any value should pass
|
|
241
|
-
expect(validateToolInput({ anything: 42 }, schema)).toBeNull();
|
|
242
|
-
expect(validateToolInput({ anything: "hello" }, schema)).toBeNull();
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
// --------------------------------------------------------------------------
|
|
247
|
-
// Integration tests for ToolRegistry.execute()
|
|
248
|
-
// --------------------------------------------------------------------------
|
|
249
|
-
|
|
250
|
-
describe("ToolRegistry.execute()", () => {
|
|
251
|
-
let registry: ToolRegistry;
|
|
252
|
-
const ctx = createTestContext();
|
|
253
|
-
|
|
254
|
-
beforeEach(() => {
|
|
255
|
-
registry = new ToolRegistry();
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
it("returns error for unregistered tool", async () => {
|
|
259
|
-
const result = await registry.execute("nonexistent", {}, ctx);
|
|
260
|
-
expect(result.success).toBe(false);
|
|
261
|
-
expect(result.message).toContain("not registered");
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
it("passes valid input through to executor", async () => {
|
|
265
|
-
const executeSpy = vi.fn(async () => ({
|
|
266
|
-
success: true as const,
|
|
267
|
-
message: "ok",
|
|
268
|
-
data: "result",
|
|
269
|
-
}));
|
|
270
|
-
|
|
271
|
-
registry.register(
|
|
272
|
-
createMockTool(
|
|
273
|
-
"test_tool",
|
|
274
|
-
{
|
|
275
|
-
type: "object",
|
|
276
|
-
properties: {
|
|
277
|
-
path: { type: "string" },
|
|
278
|
-
},
|
|
279
|
-
required: ["path"],
|
|
280
|
-
},
|
|
281
|
-
executeSpy,
|
|
282
|
-
),
|
|
283
|
-
);
|
|
284
|
-
|
|
285
|
-
const result = await registry.execute("test_tool", { path: "/tmp" }, ctx);
|
|
286
|
-
expect(result.success).toBe(true);
|
|
287
|
-
expect(executeSpy).toHaveBeenCalledWith({ path: "/tmp" }, ctx);
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
it("returns structured error for missing required param", async () => {
|
|
291
|
-
const executeSpy = vi.fn(async () => ({
|
|
292
|
-
success: true as const,
|
|
293
|
-
message: "should not be called",
|
|
294
|
-
}));
|
|
295
|
-
|
|
296
|
-
registry.register(
|
|
297
|
-
createMockTool(
|
|
298
|
-
"write_file",
|
|
299
|
-
{
|
|
300
|
-
type: "object",
|
|
301
|
-
properties: {
|
|
302
|
-
path: { type: "string" },
|
|
303
|
-
content: { type: "string" },
|
|
304
|
-
},
|
|
305
|
-
required: ["path", "content"],
|
|
306
|
-
},
|
|
307
|
-
executeSpy,
|
|
308
|
-
),
|
|
309
|
-
);
|
|
310
|
-
|
|
311
|
-
const result = await registry.execute("write_file", { path: "/tmp" }, ctx);
|
|
312
|
-
expect(result.success).toBe(false);
|
|
313
|
-
expect(result.message).toContain("Invalid input");
|
|
314
|
-
expect(result.message).toContain("content");
|
|
315
|
-
// Executor should NOT have been called
|
|
316
|
-
expect(executeSpy).not.toHaveBeenCalled();
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
it("returns structured error for wrong type", async () => {
|
|
320
|
-
const executeSpy = vi.fn(async () => ({
|
|
321
|
-
success: true as const,
|
|
322
|
-
message: "should not be called",
|
|
323
|
-
}));
|
|
324
|
-
|
|
325
|
-
registry.register(
|
|
326
|
-
createMockTool(
|
|
327
|
-
"count_tool",
|
|
328
|
-
{
|
|
329
|
-
type: "object",
|
|
330
|
-
properties: {
|
|
331
|
-
count: { type: "number" },
|
|
332
|
-
},
|
|
333
|
-
},
|
|
334
|
-
executeSpy,
|
|
335
|
-
),
|
|
336
|
-
);
|
|
337
|
-
|
|
338
|
-
const result = await registry.execute("count_tool", { count: "not-a-number" }, ctx);
|
|
339
|
-
expect(result.success).toBe(false);
|
|
340
|
-
expect(result.message).toContain("Invalid input");
|
|
341
|
-
expect(result.message).toContain("count");
|
|
342
|
-
expect(executeSpy).not.toHaveBeenCalled();
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
it("skips validation for tools without parameters schema", async () => {
|
|
346
|
-
// Tool with an empty/minimal parameters object (not type: "object")
|
|
347
|
-
const executeSpy = vi.fn(async () => ({
|
|
348
|
-
success: true as const,
|
|
349
|
-
message: "ok",
|
|
350
|
-
}));
|
|
351
|
-
|
|
352
|
-
const tool = createMockTool("no_schema_tool", {}, executeSpy);
|
|
353
|
-
registry.register(tool);
|
|
354
|
-
|
|
355
|
-
const result = await registry.execute("no_schema_tool", "anything", ctx);
|
|
356
|
-
expect(result.success).toBe(true);
|
|
357
|
-
expect(executeSpy).toHaveBeenCalledWith("anything", ctx);
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
it("skips validation for non-object schema types", async () => {
|
|
361
|
-
const executeSpy = vi.fn(async () => ({
|
|
362
|
-
success: true as const,
|
|
363
|
-
message: "ok",
|
|
364
|
-
}));
|
|
365
|
-
|
|
366
|
-
const tool = createMockTool("string_schema", { type: "string" }, executeSpy);
|
|
367
|
-
registry.register(tool);
|
|
368
|
-
|
|
369
|
-
const result = await registry.execute("string_schema", "hello", ctx);
|
|
370
|
-
expect(result.success).toBe(true);
|
|
371
|
-
expect(executeSpy).toHaveBeenCalledWith("hello", ctx);
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
it("rejects unknown properties when additionalProperties is false", async () => {
|
|
375
|
-
const executeSpy = vi.fn(async () => ({
|
|
376
|
-
success: true as const,
|
|
377
|
-
message: "should not be called",
|
|
378
|
-
}));
|
|
379
|
-
|
|
380
|
-
registry.register(
|
|
381
|
-
createMockTool(
|
|
382
|
-
"strict_tool",
|
|
383
|
-
{
|
|
384
|
-
type: "object",
|
|
385
|
-
properties: {
|
|
386
|
-
name: { type: "string" },
|
|
387
|
-
},
|
|
388
|
-
additionalProperties: false,
|
|
389
|
-
},
|
|
390
|
-
executeSpy,
|
|
391
|
-
),
|
|
392
|
-
);
|
|
393
|
-
|
|
394
|
-
const result = await registry.execute("strict_tool", { name: "ok", rogue: true }, ctx);
|
|
395
|
-
expect(result.success).toBe(false);
|
|
396
|
-
expect(result.message).toContain("Unknown properties");
|
|
397
|
-
expect(result.message).toContain("rogue");
|
|
398
|
-
expect(executeSpy).not.toHaveBeenCalled();
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
it("allows extra properties when additionalProperties is not false", async () => {
|
|
402
|
-
const executeSpy = vi.fn(async () => ({
|
|
403
|
-
success: true as const,
|
|
404
|
-
message: "ok",
|
|
405
|
-
}));
|
|
406
|
-
|
|
407
|
-
registry.register(
|
|
408
|
-
createMockTool(
|
|
409
|
-
"lenient_tool",
|
|
410
|
-
{
|
|
411
|
-
type: "object",
|
|
412
|
-
properties: {
|
|
413
|
-
name: { type: "string" },
|
|
414
|
-
},
|
|
415
|
-
},
|
|
416
|
-
executeSpy,
|
|
417
|
-
),
|
|
418
|
-
);
|
|
419
|
-
|
|
420
|
-
const result = await registry.execute("lenient_tool", { name: "ok", extra: 42 }, ctx);
|
|
421
|
-
expect(result.success).toBe(true);
|
|
422
|
-
expect(executeSpy).toHaveBeenCalled();
|
|
423
|
-
});
|
|
424
|
-
});
|