@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,411 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { existsSync, rmSync } from "node:fs";
|
|
3
|
-
import { mkdtempSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
|
-
import {
|
|
7
|
-
executeCreateSkill,
|
|
8
|
-
executeCreateTool,
|
|
9
|
-
executeLearnSkill,
|
|
10
|
-
executeUseSkill,
|
|
11
|
-
} from "../../src/executors/learning-meta.js";
|
|
12
|
-
import type { ToolContext } from "../../src/types.js";
|
|
13
|
-
|
|
14
|
-
function makeContext(overrides: Partial<ToolContext> = {}): ToolContext {
|
|
15
|
-
return {
|
|
16
|
-
workingDir: overrides.workingDir ?? process.cwd(),
|
|
17
|
-
env: overrides.env ?? (process.env as Record<string, string>),
|
|
18
|
-
confirm: overrides.confirm ?? (async () => true),
|
|
19
|
-
memoria: overrides.memoria,
|
|
20
|
-
manager: overrides.manager,
|
|
21
|
-
arion: overrides.arion,
|
|
22
|
-
abortSignal: overrides.abortSignal,
|
|
23
|
-
context: overrides.context,
|
|
24
|
-
processRegistry: overrides.processRegistry,
|
|
25
|
-
ptySessionStore: overrides.ptySessionStore,
|
|
26
|
-
providerContext: overrides.providerContext,
|
|
27
|
-
delegationRegistry: overrides.delegationRegistry,
|
|
28
|
-
delegationExecutor: overrides.delegationExecutor,
|
|
29
|
-
nativeSearchAdapter: overrides.nativeSearchAdapter,
|
|
30
|
-
userInteraction: overrides.userInteraction,
|
|
31
|
-
questStore: overrides.questStore,
|
|
32
|
-
askUserCallCounter: overrides.askUserCallCounter,
|
|
33
|
-
router: overrides.router,
|
|
34
|
-
toolRegistry: overrides.toolRegistry,
|
|
35
|
-
mailbox: overrides.mailbox,
|
|
36
|
-
networkControl: overrides.networkControl,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
describe("learning meta executors", () => {
|
|
41
|
-
let workdir: string;
|
|
42
|
-
|
|
43
|
-
beforeEach(() => {
|
|
44
|
-
workdir = mkdtempSync(join(tmpdir(), "meta-tools-test-"));
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
afterEach(() => {
|
|
48
|
-
if (existsSync(workdir)) {
|
|
49
|
-
rmSync(workdir, { recursive: true, force: true });
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("learn_skill stores inline skill content", async () => {
|
|
54
|
-
const rememberSkill = vi.fn().mockResolvedValue("skill-inline-1");
|
|
55
|
-
const ctx = makeContext({
|
|
56
|
-
workingDir: workdir,
|
|
57
|
-
memoria: { rememberSkill } as unknown as ToolContext["memoria"],
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
const result = await executeLearnSkill(
|
|
61
|
-
{
|
|
62
|
-
name: "repo-rules",
|
|
63
|
-
description: "Repository-specific instructions",
|
|
64
|
-
content: "Always use pnpm",
|
|
65
|
-
},
|
|
66
|
-
ctx,
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
expect(result.success).toBe(true);
|
|
70
|
-
expect(rememberSkill).toHaveBeenCalledTimes(1);
|
|
71
|
-
expect(rememberSkill).toHaveBeenCalledWith(
|
|
72
|
-
expect.objectContaining({
|
|
73
|
-
name: "repo-rules",
|
|
74
|
-
content: "Always use pnpm",
|
|
75
|
-
}),
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("create_tool writes executable script and stores tool", async () => {
|
|
80
|
-
const rememberTool = vi.fn().mockResolvedValue("tool-1");
|
|
81
|
-
const recallTools = vi.fn().mockResolvedValue([]);
|
|
82
|
-
const ctx = makeContext({
|
|
83
|
-
workingDir: workdir,
|
|
84
|
-
memoria: { rememberTool, recallTools } as unknown as ToolContext["memoria"],
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const result = await executeCreateTool(
|
|
88
|
-
{
|
|
89
|
-
name: "lint-repo",
|
|
90
|
-
description: "Run lint in workspace",
|
|
91
|
-
script: "pnpm lint",
|
|
92
|
-
},
|
|
93
|
-
ctx,
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
expect(result.success).toBe(true);
|
|
97
|
-
const data = result.data as { scriptPath: string };
|
|
98
|
-
expect(data.scriptPath).toMatch(/\.aria\/tools\/lint-repo\.sh$/);
|
|
99
|
-
expect(existsSync(data.scriptPath)).toBe(true);
|
|
100
|
-
expect(rememberTool).toHaveBeenCalledTimes(1);
|
|
101
|
-
expect(rememberTool).toHaveBeenCalledWith(
|
|
102
|
-
expect.objectContaining({
|
|
103
|
-
source: { type: "external", ref: `file:${data.scriptPath}`, format: "markdown" },
|
|
104
|
-
responseTemplate: `bash:${data.scriptPath} {{args}}`,
|
|
105
|
-
usageHint: `${data.scriptPath} ...`,
|
|
106
|
-
}),
|
|
107
|
-
);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it("create_tool refreshes the live tool registry after persistence", async () => {
|
|
111
|
-
const rememberTool = vi.fn().mockResolvedValue("tool-2");
|
|
112
|
-
const recallTools = vi.fn().mockResolvedValue([]);
|
|
113
|
-
const discoverFromMemoria = vi.fn().mockResolvedValue(1);
|
|
114
|
-
const memoria = { rememberTool, recallTools } as unknown as ToolContext["memoria"];
|
|
115
|
-
const ctx = makeContext({
|
|
116
|
-
workingDir: workdir,
|
|
117
|
-
memoria,
|
|
118
|
-
toolRegistry: { discoverFromMemoria } as unknown as ToolContext["toolRegistry"],
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const result = await executeCreateTool(
|
|
122
|
-
{
|
|
123
|
-
name: "format-repo",
|
|
124
|
-
description: "Run formatter in workspace",
|
|
125
|
-
script: "pnpm format",
|
|
126
|
-
},
|
|
127
|
-
ctx,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
expect(result.success).toBe(true);
|
|
131
|
-
expect(discoverFromMemoria).toHaveBeenCalledWith(memoria);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it("create_tool stores adversarial review issues as failures and keeps dangerous risk", async () => {
|
|
135
|
-
const rememberTool = vi.fn().mockResolvedValue("tool-unsafe");
|
|
136
|
-
const recallTools = vi.fn().mockResolvedValue([]);
|
|
137
|
-
const router = {
|
|
138
|
-
chat: vi.fn().mockResolvedValue({
|
|
139
|
-
content: JSON.stringify({
|
|
140
|
-
safe: false,
|
|
141
|
-
issues: ["force-push can overwrite remote history", "no branch protection check"],
|
|
142
|
-
}),
|
|
143
|
-
}),
|
|
144
|
-
};
|
|
145
|
-
const ctx = makeContext({
|
|
146
|
-
workingDir: workdir,
|
|
147
|
-
memoria: { rememberTool, recallTools } as unknown as ToolContext["memoria"],
|
|
148
|
-
router: router as unknown as ToolContext["router"],
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
const result = await executeCreateTool(
|
|
152
|
-
{
|
|
153
|
-
name: "git-force-push",
|
|
154
|
-
description: "Force push current branch",
|
|
155
|
-
script: "git push --force origin HEAD",
|
|
156
|
-
},
|
|
157
|
-
ctx,
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
expect(result.success).toBe(true);
|
|
161
|
-
expect(rememberTool).toHaveBeenCalledWith(
|
|
162
|
-
expect.objectContaining({
|
|
163
|
-
name: "git-force-push",
|
|
164
|
-
riskLevel: "dangerous",
|
|
165
|
-
failures: expect.arrayContaining([
|
|
166
|
-
expect.objectContaining({ error: "force-push can overwrite remote history" }),
|
|
167
|
-
expect.objectContaining({ error: "no branch protection check" }),
|
|
168
|
-
]),
|
|
169
|
-
}),
|
|
170
|
-
);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it("create_tool marks tool moderate only for explicitly safe reviews with no issues", async () => {
|
|
174
|
-
const rememberTool = vi.fn().mockResolvedValue("tool-safe");
|
|
175
|
-
const recallTools = vi.fn().mockResolvedValue([]);
|
|
176
|
-
const router = {
|
|
177
|
-
chat: vi.fn().mockResolvedValue({
|
|
178
|
-
content: JSON.stringify({ safe: true, issues: [] }),
|
|
179
|
-
}),
|
|
180
|
-
};
|
|
181
|
-
const ctx = makeContext({
|
|
182
|
-
workingDir: workdir,
|
|
183
|
-
memoria: { rememberTool, recallTools } as unknown as ToolContext["memoria"],
|
|
184
|
-
router: router as unknown as ToolContext["router"],
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
const result = await executeCreateTool(
|
|
188
|
-
{
|
|
189
|
-
name: "lint-repo-safe",
|
|
190
|
-
description: "Run lint",
|
|
191
|
-
script: "pnpm lint",
|
|
192
|
-
},
|
|
193
|
-
ctx,
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
expect(result.success).toBe(true);
|
|
197
|
-
expect(rememberTool).toHaveBeenCalledWith(
|
|
198
|
-
expect.objectContaining({
|
|
199
|
-
name: "lint-repo-safe",
|
|
200
|
-
riskLevel: "moderate",
|
|
201
|
-
}),
|
|
202
|
-
);
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
it("create_tool rejects names that start with hyphens or sanitize to empty", async () => {
|
|
206
|
-
const rememberTool = vi.fn();
|
|
207
|
-
const recallTools = vi.fn().mockResolvedValue([]);
|
|
208
|
-
const ctx = makeContext({
|
|
209
|
-
workingDir: workdir,
|
|
210
|
-
memoria: { rememberTool, recallTools } as unknown as ToolContext["memoria"],
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
const leadingHyphen = await executeCreateTool(
|
|
214
|
-
{
|
|
215
|
-
name: "--version",
|
|
216
|
-
description: "unsafe",
|
|
217
|
-
script: "echo test",
|
|
218
|
-
},
|
|
219
|
-
ctx,
|
|
220
|
-
);
|
|
221
|
-
expect(leadingHyphen.success).toBe(false);
|
|
222
|
-
expect(leadingHyphen.message).toMatch(/must not start with a hyphen/i);
|
|
223
|
-
|
|
224
|
-
const sanitizedEmpty = await executeCreateTool(
|
|
225
|
-
{
|
|
226
|
-
name: "...",
|
|
227
|
-
description: "unsafe",
|
|
228
|
-
script: "echo test",
|
|
229
|
-
},
|
|
230
|
-
ctx,
|
|
231
|
-
);
|
|
232
|
-
expect(sanitizedEmpty.success).toBe(false);
|
|
233
|
-
expect(sanitizedEmpty.message).toMatch(/contains no safe characters|letter or digit/i);
|
|
234
|
-
expect(rememberTool).not.toHaveBeenCalled();
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
it("create_tool enforces maximum tool count", async () => {
|
|
238
|
-
const rememberTool = vi.fn();
|
|
239
|
-
const recallTools = vi.fn().mockResolvedValue(
|
|
240
|
-
Array.from({ length: 50 }, (_, i) => ({
|
|
241
|
-
id: `tool-${i}`,
|
|
242
|
-
name: `tool-${i}`,
|
|
243
|
-
description: `Tool ${i}`,
|
|
244
|
-
})),
|
|
245
|
-
);
|
|
246
|
-
const ctx = makeContext({
|
|
247
|
-
workingDir: workdir,
|
|
248
|
-
memoria: { rememberTool, recallTools } as unknown as ToolContext["memoria"],
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
const result = await executeCreateTool(
|
|
252
|
-
{
|
|
253
|
-
name: "overflow-tool",
|
|
254
|
-
description: "should fail when at max",
|
|
255
|
-
script: "echo test",
|
|
256
|
-
},
|
|
257
|
-
ctx,
|
|
258
|
-
);
|
|
259
|
-
|
|
260
|
-
expect(result.success).toBe(false);
|
|
261
|
-
expect(result.message).toMatch(/tool limit reached/i);
|
|
262
|
-
expect(rememberTool).not.toHaveBeenCalled();
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
it("create_skill links skillId to active arion badge", async () => {
|
|
266
|
-
const rememberSkill = vi.fn().mockResolvedValue("skill-42");
|
|
267
|
-
const evolveSkills = vi.fn().mockResolvedValue({ id: "arion-1", name: "ARIA", emoji: "🌟" });
|
|
268
|
-
const ctx = makeContext({
|
|
269
|
-
workingDir: workdir,
|
|
270
|
-
memoria: { rememberSkill } as unknown as ToolContext["memoria"],
|
|
271
|
-
manager: { evolveSkills } as unknown as ToolContext["manager"],
|
|
272
|
-
arion: { id: "arion-1", name: "ARIA", emoji: "🌟" },
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
const result = await executeCreateSkill(
|
|
276
|
-
{
|
|
277
|
-
name: "safe-rebase",
|
|
278
|
-
description: "Recoverable rebase workflow",
|
|
279
|
-
content: "git fetch --all && git rebase --rebase-merges",
|
|
280
|
-
},
|
|
281
|
-
ctx,
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
expect(result.success).toBe(true);
|
|
285
|
-
expect(rememberSkill).toHaveBeenCalledTimes(1);
|
|
286
|
-
expect(evolveSkills).toHaveBeenCalledWith(
|
|
287
|
-
"ARIA",
|
|
288
|
-
expect.objectContaining({
|
|
289
|
-
addSkills: [
|
|
290
|
-
expect.objectContaining({
|
|
291
|
-
name: "safe-rebase",
|
|
292
|
-
skillId: "skill-42",
|
|
293
|
-
}),
|
|
294
|
-
],
|
|
295
|
-
}),
|
|
296
|
-
);
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
it("create_skill broadcasts skill offer with questId and priority 2 (Fix 6)", async () => {
|
|
300
|
-
const rememberSkill = vi.fn().mockResolvedValue("skill-fix6");
|
|
301
|
-
const evolveSkills = vi.fn().mockResolvedValue({ id: "arion-1", name: "ARIA", emoji: "🌟" });
|
|
302
|
-
const sendMock = vi.fn().mockResolvedValue(undefined);
|
|
303
|
-
|
|
304
|
-
const ctx = makeContext({
|
|
305
|
-
workingDir: workdir,
|
|
306
|
-
memoria: { rememberSkill } as unknown as ToolContext["memoria"],
|
|
307
|
-
manager: { evolveSkills } as unknown as ToolContext["manager"],
|
|
308
|
-
arion: { id: "arion-1", name: "ARIA", emoji: "🌟" },
|
|
309
|
-
mailbox: {
|
|
310
|
-
sendBestEffort: sendMock,
|
|
311
|
-
sendDurable: vi
|
|
312
|
-
.fn()
|
|
313
|
-
.mockResolvedValue({ transport: "in_process", delivered: true, queued: false }),
|
|
314
|
-
has: () => true,
|
|
315
|
-
hasByName: () => true,
|
|
316
|
-
},
|
|
317
|
-
networkControl: {
|
|
318
|
-
status: () => ({
|
|
319
|
-
configured: true,
|
|
320
|
-
nodeId: "node-alpha",
|
|
321
|
-
transportPublicKey: "pubkey",
|
|
322
|
-
signingPublicKey: "c2lnbmluZy1rZXk=", // base64 "signing-key"
|
|
323
|
-
listenPort: 51820,
|
|
324
|
-
externalEndpoint: null,
|
|
325
|
-
activePeers: 1,
|
|
326
|
-
totalPeers: 1,
|
|
327
|
-
}),
|
|
328
|
-
listPeers: () => [
|
|
329
|
-
{
|
|
330
|
-
peerId: "peer-alpha",
|
|
331
|
-
nodeId: "peer-alpha",
|
|
332
|
-
transportPublicKey: "peer-pub",
|
|
333
|
-
displayNameSnapshot: "peer-alpha",
|
|
334
|
-
endpointHost: "10.0.0.2",
|
|
335
|
-
endpointPort: 51820,
|
|
336
|
-
endpointRevision: 1,
|
|
337
|
-
controlEndpoint: null,
|
|
338
|
-
signingPublicKey: "peer-signing",
|
|
339
|
-
status: "active",
|
|
340
|
-
lastHandshake: Date.now(),
|
|
341
|
-
createdAt: Date.now() - 60000,
|
|
342
|
-
updatedAt: Date.now(),
|
|
343
|
-
},
|
|
344
|
-
],
|
|
345
|
-
invite: () => ({ token: "", psk: "" }),
|
|
346
|
-
revokePeer: () => true,
|
|
347
|
-
} as unknown as ToolContext["networkControl"],
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
const result = await executeCreateSkill(
|
|
351
|
-
{
|
|
352
|
-
name: "fix6-skill",
|
|
353
|
-
description: "Test skill for Fix 6",
|
|
354
|
-
content: "do something useful",
|
|
355
|
-
},
|
|
356
|
-
ctx,
|
|
357
|
-
);
|
|
358
|
-
|
|
359
|
-
expect(result.success).toBe(true);
|
|
360
|
-
|
|
361
|
-
// Verify mailbox.send was called with correct Fix 6 fields
|
|
362
|
-
expect(sendMock).toHaveBeenCalledTimes(1);
|
|
363
|
-
const sentMessage = sendMock.mock.calls[0]![0];
|
|
364
|
-
|
|
365
|
-
// Fix 6a: questId must be present in the content JSON
|
|
366
|
-
const content = JSON.parse(sentMessage.content);
|
|
367
|
-
expect(content.questId).toBeDefined();
|
|
368
|
-
expect(content.questId).toMatch(/^skill-offer-/);
|
|
369
|
-
|
|
370
|
-
// Fix 6a: delegationType and task must also be present
|
|
371
|
-
expect(content.delegationType).toBe("remote");
|
|
372
|
-
expect(content.task).toContain("fix6-skill");
|
|
373
|
-
expect(content.sourceNodeId).toBe("node-alpha");
|
|
374
|
-
expect(content.sourceDisplayName).toBe("ARIA");
|
|
375
|
-
expect("sourcePeer" in content).toBe(false);
|
|
376
|
-
|
|
377
|
-
// Fix 6b: priority must be 2 (not 1)
|
|
378
|
-
expect(sentMessage.priority).toBe(2);
|
|
379
|
-
|
|
380
|
-
// Message type should be "quest"
|
|
381
|
-
expect(sentMessage.type).toBe("quest");
|
|
382
|
-
expect(sentMessage.sender.id).toBe("node-alpha");
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
it("use_skill loads skill and records execution", async () => {
|
|
386
|
-
const skill = {
|
|
387
|
-
id: "skill-use-1",
|
|
388
|
-
name: "deploy-checklist",
|
|
389
|
-
description: "Release checklist",
|
|
390
|
-
content: "1. tests 2. build 3. deploy",
|
|
391
|
-
};
|
|
392
|
-
const getSkill = vi.fn().mockResolvedValue(skill);
|
|
393
|
-
const recordSkillExecution = vi.fn().mockResolvedValue(undefined);
|
|
394
|
-
|
|
395
|
-
const ctx = makeContext({
|
|
396
|
-
workingDir: workdir,
|
|
397
|
-
memoria: { getSkill, recordSkillExecution } as unknown as ToolContext["memoria"],
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
const result = await executeUseSkill({ skillId: "skill-use-1", success: true }, ctx);
|
|
401
|
-
|
|
402
|
-
expect(result.success).toBe(true);
|
|
403
|
-
expect(getSkill).toHaveBeenCalledWith("skill-use-1");
|
|
404
|
-
expect(recordSkillExecution).toHaveBeenCalledWith(
|
|
405
|
-
expect.objectContaining({
|
|
406
|
-
skillId: "skill-use-1",
|
|
407
|
-
success: true,
|
|
408
|
-
}),
|
|
409
|
-
);
|
|
410
|
-
});
|
|
411
|
-
});
|