@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,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @aria/tools - WriteStdin executor tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for the write_stdin tool that sends input to interactive PTY sessions.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect, vi } from "vitest";
|
|
8
|
-
import type { ToolContext, PTYSessionStoreRef } from "../../src/types.js";
|
|
9
|
-
import { executeWriteStdin } from "../../src/executors/shell.js";
|
|
10
|
-
|
|
11
|
-
// Helper to create a base context
|
|
12
|
-
const createContext = (overrides?: Partial<ToolContext>): ToolContext => ({
|
|
13
|
-
workingDir: "/test/dir",
|
|
14
|
-
env: {},
|
|
15
|
-
confirm: async () => true,
|
|
16
|
-
...overrides,
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
// Helper to create a mock PTY session
|
|
20
|
-
const createMockPTYSession = (overrides?: {
|
|
21
|
-
isRunning?: boolean;
|
|
22
|
-
output?: string;
|
|
23
|
-
exitCode?: number;
|
|
24
|
-
}) => {
|
|
25
|
-
let _output = overrides?.output ?? "";
|
|
26
|
-
return {
|
|
27
|
-
get isRunning() {
|
|
28
|
-
return overrides?.isRunning ?? true;
|
|
29
|
-
},
|
|
30
|
-
get output() {
|
|
31
|
-
return _output;
|
|
32
|
-
},
|
|
33
|
-
get exitCode() {
|
|
34
|
-
return overrides?.exitCode;
|
|
35
|
-
},
|
|
36
|
-
write: vi.fn((data: string) => {
|
|
37
|
-
// Simulate output appearing after write
|
|
38
|
-
_output += `echo: ${data}`;
|
|
39
|
-
}),
|
|
40
|
-
resize: vi.fn(),
|
|
41
|
-
pid: 12345,
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
// Helper to create a mock PTY session store
|
|
46
|
-
const createMockPTYStore = (
|
|
47
|
-
sessions: Map<number, ReturnType<typeof createMockPTYSession>>,
|
|
48
|
-
): PTYSessionStoreRef => ({
|
|
49
|
-
has: (pid: number) => sessions.has(pid),
|
|
50
|
-
get: (pid: number) => sessions.get(pid),
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe("WriteStdin Executor", () => {
|
|
54
|
-
it("returns error for PID 0", async () => {
|
|
55
|
-
const ctx = createContext();
|
|
56
|
-
const result = await executeWriteStdin({ pid: 0, input: "hello" }, ctx);
|
|
57
|
-
|
|
58
|
-
expect(result.success).toBe(false);
|
|
59
|
-
expect(result.message).toContain("Invalid PID");
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it("returns error for own process PID", async () => {
|
|
63
|
-
const ctx = createContext();
|
|
64
|
-
const result = await executeWriteStdin({ pid: process.pid, input: "hello" }, ctx);
|
|
65
|
-
|
|
66
|
-
expect(result.success).toBe(false);
|
|
67
|
-
expect(result.message).toContain("Cannot write to own process");
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("returns error when ptySessionStore is not available", async () => {
|
|
71
|
-
const ctx = createContext(); // no ptySessionStore
|
|
72
|
-
|
|
73
|
-
const result = await executeWriteStdin({ pid: 999, input: "hello" }, ctx);
|
|
74
|
-
|
|
75
|
-
expect(result.success).toBe(false);
|
|
76
|
-
expect(result.message).toContain("PTY session store not available");
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("returns error for unknown PID (not in store)", async () => {
|
|
80
|
-
const sessions = new Map();
|
|
81
|
-
const ctx = createContext({
|
|
82
|
-
ptySessionStore: createMockPTYStore(sessions),
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
const result = await executeWriteStdin({ pid: 9999, input: "hello" }, ctx);
|
|
86
|
-
|
|
87
|
-
expect(result.success).toBe(false);
|
|
88
|
-
expect(result.message).toContain("No interactive session found");
|
|
89
|
-
expect(result.message).toContain("9999");
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it("writes to session and returns output", async () => {
|
|
93
|
-
const mockSession = createMockPTYSession();
|
|
94
|
-
const sessions = new Map<number, ReturnType<typeof createMockPTYSession>>();
|
|
95
|
-
sessions.set(12345, mockSession);
|
|
96
|
-
const ctx = createContext({
|
|
97
|
-
ptySessionStore: createMockPTYStore(sessions),
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
const result = await executeWriteStdin({ pid: 12345, input: "ls\n" }, ctx);
|
|
101
|
-
|
|
102
|
-
expect(result.success).toBe(true);
|
|
103
|
-
expect(result.message).toContain("Wrote");
|
|
104
|
-
expect(result.message).toContain("12345");
|
|
105
|
-
expect(mockSession.write).toHaveBeenCalledWith("ls\n");
|
|
106
|
-
const data = result.data as { output: string };
|
|
107
|
-
expect(data.output).toContain("echo: ls");
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it("returns error when session has exited", async () => {
|
|
111
|
-
const mockSession = createMockPTYSession({ isRunning: false, exitCode: 1 });
|
|
112
|
-
const sessions = new Map<number, ReturnType<typeof createMockPTYSession>>();
|
|
113
|
-
sessions.set(42, mockSession);
|
|
114
|
-
const ctx = createContext({
|
|
115
|
-
ptySessionStore: createMockPTYStore(sessions),
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const result = await executeWriteStdin({ pid: 42, input: "hello" }, ctx);
|
|
119
|
-
|
|
120
|
-
expect(result.success).toBe(false);
|
|
121
|
-
expect(result.message).toContain("exited");
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it("returns error for negative PID", async () => {
|
|
125
|
-
const ctx = createContext();
|
|
126
|
-
const result = await executeWriteStdin({ pid: -1, input: "hello" }, ctx);
|
|
127
|
-
|
|
128
|
-
expect(result.success).toBe(false);
|
|
129
|
-
expect(result.message).toContain("Invalid PID");
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it("returns error when input is not a string", async () => {
|
|
133
|
-
const mockSession = createMockPTYSession();
|
|
134
|
-
const sessions = new Map<number, ReturnType<typeof createMockPTYSession>>();
|
|
135
|
-
sessions.set(100, mockSession);
|
|
136
|
-
const ctx = createContext({
|
|
137
|
-
ptySessionStore: createMockPTYStore(sessions),
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
const result = await executeWriteStdin({ pid: 100, input: 123 as unknown as string }, ctx);
|
|
141
|
-
|
|
142
|
-
expect(result.success).toBe(false);
|
|
143
|
-
expect(result.message).toContain("Input must be a string");
|
|
144
|
-
});
|
|
145
|
-
});
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
extractContent,
|
|
4
|
-
extractFromResponse,
|
|
5
|
-
type ExtractedContent,
|
|
6
|
-
} from "../../src/extraction/content-extraction.js";
|
|
7
|
-
|
|
8
|
-
describe("extractContent", () => {
|
|
9
|
-
it("converts article HTML to markdown with isArticle true", async () => {
|
|
10
|
-
const html = `
|
|
11
|
-
<html>
|
|
12
|
-
<head><title>Test Article</title></head>
|
|
13
|
-
<body>
|
|
14
|
-
<article>
|
|
15
|
-
<h1>Main Heading</h1>
|
|
16
|
-
<p>This is a paragraph with a <a href="https://example.com">link</a>.</p>
|
|
17
|
-
<p>Code example: <code>console.log("hello")</code></p>
|
|
18
|
-
</article>
|
|
19
|
-
</body>
|
|
20
|
-
</html>
|
|
21
|
-
`;
|
|
22
|
-
const result = await extractContent(html, "https://example.com/article");
|
|
23
|
-
|
|
24
|
-
expect(result.isArticle).toBe(true);
|
|
25
|
-
// Markdown heading (Readability demotes h1→h2 for embedded content)
|
|
26
|
-
expect(result.content).toContain("Main Heading");
|
|
27
|
-
expect(result.content).toMatch(/^#+\s+Main Heading/m);
|
|
28
|
-
// Markdown link (Readability may normalize URL with trailing slash)
|
|
29
|
-
expect(result.content).toMatch(/\[link\]\(https:\/\/example\.com\/?/);
|
|
30
|
-
// Code preserved
|
|
31
|
-
expect(result.content).toContain("console.log");
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("converts non-article HTML to markdown with isArticle false", async () => {
|
|
35
|
-
const html = `
|
|
36
|
-
<html>
|
|
37
|
-
<head><title>Non Article</title></head>
|
|
38
|
-
<body>
|
|
39
|
-
<div>
|
|
40
|
-
<p>Some content in a div</p>
|
|
41
|
-
<p>Another paragraph</p>
|
|
42
|
-
</div>
|
|
43
|
-
</body>
|
|
44
|
-
</html>
|
|
45
|
-
`;
|
|
46
|
-
const result = await extractContent(html, "https://example.com/page");
|
|
47
|
-
|
|
48
|
-
expect(result.isArticle).toBe(false);
|
|
49
|
-
expect(result.content).toContain("Some content in a div");
|
|
50
|
-
expect(result.content).toContain("Another paragraph");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("gracefully handles malformed HTML without crashing", async () => {
|
|
54
|
-
// Verifies regex fallback when Readability can't parse.
|
|
55
|
-
const result = await extractContent("<malformed", "https://example.com");
|
|
56
|
-
expect(result).toBeDefined();
|
|
57
|
-
expect(typeof result.content).toBe("string");
|
|
58
|
-
expect(result.isArticle).toBe(false);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("extracts title from HTML", async () => {
|
|
62
|
-
const html = `
|
|
63
|
-
<html>
|
|
64
|
-
<head><title>My Page</title></head>
|
|
65
|
-
<body><p>Content</p></body>
|
|
66
|
-
</html>
|
|
67
|
-
`;
|
|
68
|
-
const result = await extractContent(html, "https://example.com");
|
|
69
|
-
|
|
70
|
-
expect(result.title).toBe("My Page");
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it("truncates content at 50K characters", async () => {
|
|
74
|
-
const longParagraph = "x".repeat(60_000);
|
|
75
|
-
const html = `
|
|
76
|
-
<html>
|
|
77
|
-
<head><title>Long Page</title></head>
|
|
78
|
-
<body><p>${longParagraph}</p></body>
|
|
79
|
-
</html>
|
|
80
|
-
`;
|
|
81
|
-
const result = await extractContent(html, "https://example.com/long");
|
|
82
|
-
|
|
83
|
-
expect(result.content.length).toBeLessThanOrEqual(50_000);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("returns empty content for empty HTML", async () => {
|
|
87
|
-
const result = await extractContent("", "https://example.com/empty");
|
|
88
|
-
|
|
89
|
-
expect(result.title).toBe("");
|
|
90
|
-
expect(result.content).toBe("");
|
|
91
|
-
expect(result.isArticle).toBe(false);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("returns raw content for non-HTML response types", async () => {
|
|
95
|
-
const raw = '{"status":"ok","payload":"<script>alert(1)</script>"}';
|
|
96
|
-
const result = await extractFromResponse(raw, "https://example.com/data.json", "application/json");
|
|
97
|
-
|
|
98
|
-
expect(result.isArticle).toBe(false);
|
|
99
|
-
expect(result.title).toBe("");
|
|
100
|
-
expect(result.content).toBe(raw);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it("falls back to default extraction concurrency when env value is invalid", async () => {
|
|
104
|
-
const original = process.env.ARIA_MAX_CONCURRENT_EXTRACTIONS;
|
|
105
|
-
process.env.ARIA_MAX_CONCURRENT_EXTRACTIONS = "0";
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
vi.resetModules();
|
|
109
|
-
const reloadedModule = await import("../../src/extraction/content-extraction.js");
|
|
110
|
-
|
|
111
|
-
const result = await Promise.race<ExtractedContent>([
|
|
112
|
-
reloadedModule.extractContent("<html><body><p>Hello</p></body></html>", "https://example.com"),
|
|
113
|
-
new Promise<ExtractedContent>((_resolve, reject) => {
|
|
114
|
-
setTimeout(() => reject(new Error("extractContent timed out")), 500);
|
|
115
|
-
}),
|
|
116
|
-
]);
|
|
117
|
-
|
|
118
|
-
expect(result.content).toContain("Hello");
|
|
119
|
-
} finally {
|
|
120
|
-
if (original === undefined) {
|
|
121
|
-
delete process.env.ARIA_MAX_CONCURRENT_EXTRACTIONS;
|
|
122
|
-
} else {
|
|
123
|
-
process.env.ARIA_MAX_CONCURRENT_EXTRACTIONS = original;
|
|
124
|
-
}
|
|
125
|
-
vi.resetModules();
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("strips script and style tags from output", async () => {
|
|
130
|
-
const html = `
|
|
131
|
-
<html>
|
|
132
|
-
<head>
|
|
133
|
-
<title>Clean Page</title>
|
|
134
|
-
<style>body { color: red; }</style>
|
|
135
|
-
</head>
|
|
136
|
-
<body>
|
|
137
|
-
<script>alert("xss")</script>
|
|
138
|
-
<p>Visible content only</p>
|
|
139
|
-
<style>.hidden { display: none; }</style>
|
|
140
|
-
<script>document.cookie</script>
|
|
141
|
-
</body>
|
|
142
|
-
</html>
|
|
143
|
-
`;
|
|
144
|
-
const result = await extractContent(html, "https://example.com/clean");
|
|
145
|
-
|
|
146
|
-
expect(result.content).toContain("Visible content only");
|
|
147
|
-
expect(result.content).not.toContain("alert");
|
|
148
|
-
expect(result.content).not.toContain("xss");
|
|
149
|
-
expect(result.content).not.toContain("document.cookie");
|
|
150
|
-
expect(result.content).not.toContain("color: red");
|
|
151
|
-
expect(result.content).not.toContain("display: none");
|
|
152
|
-
});
|
|
153
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import config from "../../vitest.config.ts";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { loadToolsTestLaneManifest } from "../test-lane-manifest.js";
|
|
4
|
-
|
|
5
|
-
describe("tools default test lane", () => {
|
|
6
|
-
it("wires the default vitest config to the unit lane only", () => {
|
|
7
|
-
const manifest = loadToolsTestLaneManifest();
|
|
8
|
-
const include = config.test?.include ?? [];
|
|
9
|
-
|
|
10
|
-
expect(include).toEqual(manifest.lanes.unit);
|
|
11
|
-
expect(config.test?.maxWorkers).toBe(manifest.maxWorkers.unit);
|
|
12
|
-
expect(config.test?.pool).toBe(manifest.pool.unit);
|
|
13
|
-
expect(config.test?.fileParallelism).toBe(manifest.fileParallelism.unit);
|
|
14
|
-
expect(include).toContain("tests/guards/tools-test-lane-manifest.contract.test.ts");
|
|
15
|
-
expect(include).not.toContain("tests/definitions/messaging.test.ts");
|
|
16
|
-
expect(include).not.toContain("tests/executors/pty.test.ts");
|
|
17
|
-
expect(include).not.toContain("tests/integration.test.ts");
|
|
18
|
-
expect(include).not.toContain("tests/executors/shell.test.ts");
|
|
19
|
-
expect(include).not.toContain("tests/e2e/delegation-quest-orchestration.e2e.test.ts");
|
|
20
|
-
});
|
|
21
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { execPnpmJsonCommand } from "../../../../scripts/package-test-command-helpers";
|
|
4
|
-
|
|
5
|
-
const repoRoot = path.resolve(import.meta.dirname, "../../../..");
|
|
6
|
-
|
|
7
|
-
describe("tools package test commands", () => {
|
|
8
|
-
it("exposes a package-level list command for the safe default lane", () => {
|
|
9
|
-
const listing = execPnpmJsonCommand<{ defaultLane: string; files: string[] }>(
|
|
10
|
-
repoRoot,
|
|
11
|
-
["--filter", "@aria-cli/tools", "test:list"],
|
|
12
|
-
{
|
|
13
|
-
timeout: 15_000,
|
|
14
|
-
maxBuffer: 10 * 1024 * 1024,
|
|
15
|
-
},
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
expect(listing.defaultLane).toBe("unit");
|
|
19
|
-
expect(listing.files).toContain("tests/guards/tools-test-lane-manifest.contract.test.ts");
|
|
20
|
-
expect(listing.files).toContain("tests/executors/write-stdin.test.ts");
|
|
21
|
-
expect(listing.files).not.toContain("tests/definitions/messaging.test.ts");
|
|
22
|
-
expect(listing.files).not.toContain("tests/executors/pty.test.ts");
|
|
23
|
-
expect(listing.files).not.toContain("tests/integration.test.ts");
|
|
24
|
-
}, 30_000);
|
|
25
|
-
|
|
26
|
-
it("reports explicit lane counts for the package", () => {
|
|
27
|
-
const report = execPnpmJsonCommand<{
|
|
28
|
-
defaultLane: string;
|
|
29
|
-
counts: Record<string, number>;
|
|
30
|
-
unclassified: string[];
|
|
31
|
-
}>(repoRoot, ["--filter", "@aria-cli/tools", "test:lanes"], {
|
|
32
|
-
timeout: 15_000,
|
|
33
|
-
maxBuffer: 10 * 1024 * 1024,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
expect(report.defaultLane).toBe("unit");
|
|
37
|
-
expect(report.counts.unit).toBeGreaterThan(0);
|
|
38
|
-
expect(report.counts.integration).toBeGreaterThan(0);
|
|
39
|
-
expect(report.counts.native).toBeGreaterThan(0);
|
|
40
|
-
expect(report.counts.e2e).toBeGreaterThan(0);
|
|
41
|
-
expect(report.unclassified).toEqual([]);
|
|
42
|
-
}, 30_000);
|
|
43
|
-
});
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
PACKAGE_TEST_AUTHORITY,
|
|
4
|
-
classifyToolsTestFile,
|
|
5
|
-
classifyToolsTestPlacement,
|
|
6
|
-
classifyToolsTestProofClass,
|
|
7
|
-
loadToolsTestLaneManifest,
|
|
8
|
-
type ToolsTestLaneId,
|
|
9
|
-
} from "../test-lane-manifest.js";
|
|
10
|
-
|
|
11
|
-
function expectLane(relativePath: string, expected: ToolsTestLaneId): void {
|
|
12
|
-
expect(classifyToolsTestFile(relativePath)).toBe(expected);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
describe("tools test lane manifest", () => {
|
|
16
|
-
it("classifies every tools test file into an explicit lane", () => {
|
|
17
|
-
const manifest = loadToolsTestLaneManifest();
|
|
18
|
-
|
|
19
|
-
expect(manifest.defaultLane).toBe("unit");
|
|
20
|
-
expect(manifest.unclassified).toEqual([]);
|
|
21
|
-
expect(manifest.unclassifiedProofClasses).toEqual([]);
|
|
22
|
-
expect(manifest.proofClasses.live).toEqual([]);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it("keeps unsafe plain-name suites out of the default unit lane", () => {
|
|
26
|
-
expectLane("tests/definitions/messaging.test.ts", "native");
|
|
27
|
-
expectLane("tests/definitions/messaging-inbox-scope.test.ts", "native");
|
|
28
|
-
expectLane("tests/executors/pty.test.ts", "native");
|
|
29
|
-
expectLane("tests/executors/shell-tools.test.ts", "native");
|
|
30
|
-
expectLane("tests/integration.test.ts", "integration");
|
|
31
|
-
expectLane("tests/executors/shell.test.ts", "integration");
|
|
32
|
-
expectLane("tests/executors/shell-process-registry.test.ts", "integration");
|
|
33
|
-
expectLane("tests/executors/shell-abort.test.ts", "integration");
|
|
34
|
-
expectLane("tests/e2e/delegation-quest-orchestration.e2e.test.ts", "e2e");
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("keeps obvious hermetic suites in the bounded unit lane", () => {
|
|
38
|
-
expectLane("tests/executors/write-stdin.test.ts", "unit");
|
|
39
|
-
expectLane("tests/registry.test.ts", "unit");
|
|
40
|
-
expectLane("tests/registry/discovery.test.ts", "unit");
|
|
41
|
-
expectLane("tests/executors/memory.test.ts", "unit");
|
|
42
|
-
expectLane("tests/executors/shell-env-blocklist.test.ts", "unit");
|
|
43
|
-
expectLane("tests/network-runtime/nearby-peer-principal.contract.test.ts", "unit");
|
|
44
|
-
expect(classifyToolsTestProofClass("tests/registry.test.ts")).toBe("gate");
|
|
45
|
-
expect(classifyToolsTestPlacement("tests/registry.test.ts")).toMatchObject({
|
|
46
|
-
lane: "unit",
|
|
47
|
-
proofClass: "gate",
|
|
48
|
-
resourceKeys: [],
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("marks the heavier tools lanes as explicit system proof ownership", () => {
|
|
53
|
-
expect(classifyToolsTestProofClass("tests/executors/pty.test.ts")).toBe("system");
|
|
54
|
-
expect(classifyToolsTestProofClass("tests/e2e/delegation-quest-orchestration.e2e.test.ts")).toBe(
|
|
55
|
-
"system",
|
|
56
|
-
);
|
|
57
|
-
expect(PACKAGE_TEST_AUTHORITY.getProofClassFiles("system")).toContain(
|
|
58
|
-
"tests/executors/pty.test.ts",
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it("keeps the default tools unit lane parallel-capable while the heavier non-unit lanes stay serialized", () => {
|
|
63
|
-
const manifest = loadToolsTestLaneManifest();
|
|
64
|
-
|
|
65
|
-
expect(manifest.maxWorkers.unit).toBeGreaterThan(1);
|
|
66
|
-
expect(manifest.maxWorkers.unit).toBeLessThanOrEqual(4);
|
|
67
|
-
expect(manifest.fileParallelism.unit).toBe(true);
|
|
68
|
-
|
|
69
|
-
expect(manifest.maxWorkers.integration).toBe(1);
|
|
70
|
-
expect(manifest.maxWorkers.native).toBe(1);
|
|
71
|
-
expect(manifest.maxWorkers.e2e).toBe(1);
|
|
72
|
-
expect(manifest.fileParallelism.integration).toBe(false);
|
|
73
|
-
expect(manifest.fileParallelism.native).toBe(false);
|
|
74
|
-
expect(manifest.fileParallelism.e2e).toBe(false);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import vitestConfig from "../../vitest.config.ts";
|
|
3
|
-
import { loadToolsTestLaneManifest } from "../test-lane-manifest.js";
|
|
4
|
-
|
|
5
|
-
interface AliasEntry {
|
|
6
|
-
find: string | RegExp;
|
|
7
|
-
replacement: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function requireAliasEntries(): AliasEntry[] {
|
|
11
|
-
const alias = vitestConfig.resolve?.alias;
|
|
12
|
-
if (!alias || !Array.isArray(alias)) {
|
|
13
|
-
throw new Error("Tools Vitest workspace alias entries are unavailable");
|
|
14
|
-
}
|
|
15
|
-
return alias as AliasEntry[];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function requireAliasEntry(entries: AliasEntry[], find: RegExp): AliasEntry {
|
|
19
|
-
const entry = entries.find(
|
|
20
|
-
(candidate) =>
|
|
21
|
-
candidate.find instanceof RegExp && candidate.find.toString() === find.toString(),
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
if (!entry) {
|
|
25
|
-
throw new Error(`Missing alias entry for ${find.toString()}`);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return entry;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
describe("tools vitest workspace alias contract", () => {
|
|
32
|
-
it("resolves transitive workspace packages from source instead of package dist exports", () => {
|
|
33
|
-
const alias = requireAliasEntries();
|
|
34
|
-
|
|
35
|
-
expect(requireAliasEntry(alias, /^@aria\/auth$/).replacement).toContain(
|
|
36
|
-
"/packages/auth/src/index.ts",
|
|
37
|
-
);
|
|
38
|
-
expect(requireAliasEntry(alias, /^@aria\/memoria$/).replacement).toContain(
|
|
39
|
-
"/packages/memoria/src/index.ts",
|
|
40
|
-
);
|
|
41
|
-
expect(requireAliasEntry(alias, /^@aria\/memoria\/storage$/).replacement).toContain(
|
|
42
|
-
"/packages/memoria/src/storage/index.ts",
|
|
43
|
-
);
|
|
44
|
-
expect(requireAliasEntry(alias, /^@aria\/models$/).replacement).toContain(
|
|
45
|
-
"/packages/models/src/index.ts",
|
|
46
|
-
);
|
|
47
|
-
expect(requireAliasEntry(alias, /^@aria\/types$/).replacement).toContain(
|
|
48
|
-
"/packages/types/src/index.ts",
|
|
49
|
-
);
|
|
50
|
-
expect(requireAliasEntry(alias, /^@aria\/tools$/).replacement).toContain(
|
|
51
|
-
"/packages/tools/src/index.ts",
|
|
52
|
-
);
|
|
53
|
-
expect(requireAliasEntry(alias, /^@aria\/tools\/network-runtime$/).replacement).toContain(
|
|
54
|
-
"/packages/tools/src/network-runtime/index.ts",
|
|
55
|
-
);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("runs the package lane in isolated forks with a single worker", () => {
|
|
59
|
-
const manifest = loadToolsTestLaneManifest();
|
|
60
|
-
expect(vitestConfig.test?.pool).toBe("forks");
|
|
61
|
-
expect(vitestConfig.test?.maxWorkers).toBe(manifest.maxWorkers.unit);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import type { ChildProcess } from "node:child_process";
|
|
2
|
-
import { once } from "node:events";
|
|
3
|
-
import { access } from "node:fs/promises";
|
|
4
|
-
|
|
5
|
-
export async function withTimeout<T>(
|
|
6
|
-
promise: Promise<T>,
|
|
7
|
-
timeoutMs: number,
|
|
8
|
-
timeoutMessage: string,
|
|
9
|
-
): Promise<T> {
|
|
10
|
-
let timeoutId: NodeJS.Timeout | undefined;
|
|
11
|
-
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
12
|
-
timeoutId = setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
return await Promise.race([promise, timeoutPromise]);
|
|
17
|
-
} finally {
|
|
18
|
-
if (timeoutId) {
|
|
19
|
-
clearTimeout(timeoutId);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export async function waitForFile(filePath: string, timeoutMs = 5_000): Promise<void> {
|
|
25
|
-
const start = Date.now();
|
|
26
|
-
while (Date.now() - start < timeoutMs) {
|
|
27
|
-
try {
|
|
28
|
-
await access(filePath);
|
|
29
|
-
return;
|
|
30
|
-
} catch {
|
|
31
|
-
// File not ready yet.
|
|
32
|
-
}
|
|
33
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
34
|
-
}
|
|
35
|
-
throw new Error(`Timed out waiting for file: ${filePath}`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export async function waitForChildExit(
|
|
39
|
-
child: ChildProcess,
|
|
40
|
-
timeoutMs = 5_000,
|
|
41
|
-
): Promise<{ code: number | null; signal: NodeJS.Signals | null }> {
|
|
42
|
-
if (child.exitCode !== null || child.signalCode !== null) {
|
|
43
|
-
return { code: child.exitCode, signal: child.signalCode };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const [code, signal] = await withTimeout(
|
|
47
|
-
once(child, "exit") as Promise<[number | null, NodeJS.Signals | null]>,
|
|
48
|
-
timeoutMs,
|
|
49
|
-
`Timed out waiting for child process ${child.pid ?? "unknown"} to exit`,
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
return { code, signal };
|
|
53
|
-
}
|