tuplet 2.7.0
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/LICENSE +21 -0
- package/README.md +136 -0
- package/dist/agent.d.ts +46 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +393 -0
- package/dist/agent.js.map +1 -0
- package/dist/built-in-agents/explore.d.ts +9 -0
- package/dist/built-in-agents/explore.d.ts.map +1 -0
- package/dist/built-in-agents/explore.js +40 -0
- package/dist/built-in-agents/explore.js.map +1 -0
- package/dist/built-in-agents/index.d.ts +15 -0
- package/dist/built-in-agents/index.d.ts.map +1 -0
- package/dist/built-in-agents/index.js +19 -0
- package/dist/built-in-agents/index.js.map +1 -0
- package/dist/built-in-agents/plan.d.ts +10 -0
- package/dist/built-in-agents/plan.d.ts.map +1 -0
- package/dist/built-in-agents/plan.js +62 -0
- package/dist/built-in-agents/plan.js.map +1 -0
- package/dist/built-in-agents/worker.d.ts +9 -0
- package/dist/built-in-agents/worker.d.ts.map +1 -0
- package/dist/built-in-agents/worker.js +53 -0
- package/dist/built-in-agents/worker.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-manager.d.ts +65 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +272 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/context-manager.test.d.ts +2 -0
- package/dist/context-manager.test.d.ts.map +1 -0
- package/dist/context-manager.test.js +394 -0
- package/dist/context-manager.test.js.map +1 -0
- package/dist/executor.d.ts +29 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +399 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt/index.d.ts +9 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +10 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/main-agent-builder.d.ts +81 -0
- package/dist/prompt/main-agent-builder.d.ts.map +1 -0
- package/dist/prompt/main-agent-builder.js +287 -0
- package/dist/prompt/main-agent-builder.js.map +1 -0
- package/dist/prompt/sub-agent-builder.d.ts +133 -0
- package/dist/prompt/sub-agent-builder.d.ts.map +1 -0
- package/dist/prompt/sub-agent-builder.js +337 -0
- package/dist/prompt/sub-agent-builder.js.map +1 -0
- package/dist/prompt/templates.d.ts +87 -0
- package/dist/prompt/templates.d.ts.map +1 -0
- package/dist/prompt/templates.js +343 -0
- package/dist/prompt/templates.js.map +1 -0
- package/dist/prompt/types.d.ts +159 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +5 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/prompt.d.ts +32 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +86 -0
- package/dist/prompt.js.map +1 -0
- package/dist/providers/dataset/base.d.ts +74 -0
- package/dist/providers/dataset/base.d.ts.map +1 -0
- package/dist/providers/dataset/base.js +7 -0
- package/dist/providers/dataset/base.js.map +1 -0
- package/dist/providers/dataset/index.d.ts +8 -0
- package/dist/providers/dataset/index.d.ts.map +1 -0
- package/dist/providers/dataset/index.js +8 -0
- package/dist/providers/dataset/index.js.map +1 -0
- package/dist/providers/dataset/recorder.d.ts +46 -0
- package/dist/providers/dataset/recorder.d.ts.map +1 -0
- package/dist/providers/dataset/recorder.js +105 -0
- package/dist/providers/dataset/recorder.js.map +1 -0
- package/dist/providers/dataset/replayer.d.ts +46 -0
- package/dist/providers/dataset/replayer.d.ts.map +1 -0
- package/dist/providers/dataset/replayer.js +163 -0
- package/dist/providers/dataset/replayer.js.map +1 -0
- package/dist/providers/dataset/tester.d.ts +89 -0
- package/dist/providers/dataset/tester.d.ts.map +1 -0
- package/dist/providers/dataset/tester.js +143 -0
- package/dist/providers/dataset/tester.js.map +1 -0
- package/dist/providers/env/memory.d.ts +14 -0
- package/dist/providers/env/memory.d.ts.map +1 -0
- package/dist/providers/env/memory.js +19 -0
- package/dist/providers/env/memory.js.map +1 -0
- package/dist/providers/index.d.ts +12 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +10 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/llm/base.d.ts +7 -0
- package/dist/providers/llm/base.d.ts.map +1 -0
- package/dist/providers/llm/base.js +7 -0
- package/dist/providers/llm/base.js.map +1 -0
- package/dist/providers/llm/claude.d.ts +32 -0
- package/dist/providers/llm/claude.d.ts.map +1 -0
- package/dist/providers/llm/claude.js +171 -0
- package/dist/providers/llm/claude.js.map +1 -0
- package/dist/providers/llm/openai.d.ts +26 -0
- package/dist/providers/llm/openai.d.ts.map +1 -0
- package/dist/providers/llm/openai.js +174 -0
- package/dist/providers/llm/openai.js.map +1 -0
- package/dist/providers/llm/openrouter.d.ts +43 -0
- package/dist/providers/llm/openrouter.d.ts.map +1 -0
- package/dist/providers/llm/openrouter.js +288 -0
- package/dist/providers/llm/openrouter.js.map +1 -0
- package/dist/providers/logger/base.d.ts +7 -0
- package/dist/providers/logger/base.d.ts.map +1 -0
- package/dist/providers/logger/base.js +7 -0
- package/dist/providers/logger/base.js.map +1 -0
- package/dist/providers/logger/console.d.ts +29 -0
- package/dist/providers/logger/console.d.ts.map +1 -0
- package/dist/providers/logger/console.js +70 -0
- package/dist/providers/logger/console.js.map +1 -0
- package/dist/providers/repository/base.d.ts +7 -0
- package/dist/providers/repository/base.d.ts.map +1 -0
- package/dist/providers/repository/base.js +7 -0
- package/dist/providers/repository/base.js.map +1 -0
- package/dist/providers/repository/memory.d.ts +21 -0
- package/dist/providers/repository/memory.d.ts.map +1 -0
- package/dist/providers/repository/memory.js +50 -0
- package/dist/providers/repository/memory.js.map +1 -0
- package/dist/providers/workspace/file.d.ts +26 -0
- package/dist/providers/workspace/file.d.ts.map +1 -0
- package/dist/providers/workspace/file.js +151 -0
- package/dist/providers/workspace/file.js.map +1 -0
- package/dist/providers/workspace/index.d.ts +7 -0
- package/dist/providers/workspace/index.d.ts.map +1 -0
- package/dist/providers/workspace/index.js +6 -0
- package/dist/providers/workspace/index.js.map +1 -0
- package/dist/providers/workspace/memory.d.ts +26 -0
- package/dist/providers/workspace/memory.d.ts.map +1 -0
- package/dist/providers/workspace/memory.js +136 -0
- package/dist/providers/workspace/memory.js.map +1 -0
- package/dist/providers/workspace/types.d.ts +27 -0
- package/dist/providers/workspace/types.d.ts.map +1 -0
- package/dist/providers/workspace/types.js +8 -0
- package/dist/providers/workspace/types.js.map +1 -0
- package/dist/providers/workspace/workspace-provider.test.d.ts +2 -0
- package/dist/providers/workspace/workspace-provider.test.d.ts.map +1 -0
- package/dist/providers/workspace/workspace-provider.test.js +250 -0
- package/dist/providers/workspace/workspace-provider.test.js.map +1 -0
- package/dist/shell/commands/browse.d.ts +6 -0
- package/dist/shell/commands/browse.d.ts.map +1 -0
- package/dist/shell/commands/browse.js +158 -0
- package/dist/shell/commands/browse.js.map +1 -0
- package/dist/shell/commands/cat.d.ts +6 -0
- package/dist/shell/commands/cat.d.ts.map +1 -0
- package/dist/shell/commands/cat.js +104 -0
- package/dist/shell/commands/cat.js.map +1 -0
- package/dist/shell/commands/curl.d.ts +6 -0
- package/dist/shell/commands/curl.d.ts.map +1 -0
- package/dist/shell/commands/curl.js +190 -0
- package/dist/shell/commands/curl.js.map +1 -0
- package/dist/shell/commands/date.d.ts +6 -0
- package/dist/shell/commands/date.d.ts.map +1 -0
- package/dist/shell/commands/date.js +151 -0
- package/dist/shell/commands/date.js.map +1 -0
- package/dist/shell/commands/echo.d.ts +6 -0
- package/dist/shell/commands/echo.d.ts.map +1 -0
- package/dist/shell/commands/echo.js +48 -0
- package/dist/shell/commands/echo.js.map +1 -0
- package/dist/shell/commands/env.d.ts +8 -0
- package/dist/shell/commands/env.d.ts.map +1 -0
- package/dist/shell/commands/env.js +41 -0
- package/dist/shell/commands/env.js.map +1 -0
- package/dist/shell/commands/file.d.ts +6 -0
- package/dist/shell/commands/file.d.ts.map +1 -0
- package/dist/shell/commands/file.js +213 -0
- package/dist/shell/commands/file.js.map +1 -0
- package/dist/shell/commands/find.d.ts +6 -0
- package/dist/shell/commands/find.d.ts.map +1 -0
- package/dist/shell/commands/find.js +100 -0
- package/dist/shell/commands/find.js.map +1 -0
- package/dist/shell/commands/grep.d.ts +6 -0
- package/dist/shell/commands/grep.d.ts.map +1 -0
- package/dist/shell/commands/grep.js +229 -0
- package/dist/shell/commands/grep.js.map +1 -0
- package/dist/shell/commands/head.d.ts +6 -0
- package/dist/shell/commands/head.d.ts.map +1 -0
- package/dist/shell/commands/head.js +88 -0
- package/dist/shell/commands/head.js.map +1 -0
- package/dist/shell/commands/index.d.ts +25 -0
- package/dist/shell/commands/index.d.ts.map +1 -0
- package/dist/shell/commands/index.js +43 -0
- package/dist/shell/commands/index.js.map +1 -0
- package/dist/shell/commands/jq.d.ts +8 -0
- package/dist/shell/commands/jq.d.ts.map +1 -0
- package/dist/shell/commands/jq.js +233 -0
- package/dist/shell/commands/jq.js.map +1 -0
- package/dist/shell/commands/ls.d.ts +6 -0
- package/dist/shell/commands/ls.d.ts.map +1 -0
- package/dist/shell/commands/ls.js +88 -0
- package/dist/shell/commands/ls.js.map +1 -0
- package/dist/shell/commands/mkdir.d.ts +6 -0
- package/dist/shell/commands/mkdir.d.ts.map +1 -0
- package/dist/shell/commands/mkdir.js +43 -0
- package/dist/shell/commands/mkdir.js.map +1 -0
- package/dist/shell/commands/rm.d.ts +6 -0
- package/dist/shell/commands/rm.d.ts.map +1 -0
- package/dist/shell/commands/rm.js +64 -0
- package/dist/shell/commands/rm.js.map +1 -0
- package/dist/shell/commands/sed.d.ts +6 -0
- package/dist/shell/commands/sed.d.ts.map +1 -0
- package/dist/shell/commands/sed.js +414 -0
- package/dist/shell/commands/sed.js.map +1 -0
- package/dist/shell/commands/sort.d.ts +6 -0
- package/dist/shell/commands/sort.d.ts.map +1 -0
- package/dist/shell/commands/sort.js +109 -0
- package/dist/shell/commands/sort.js.map +1 -0
- package/dist/shell/commands/tail.d.ts +6 -0
- package/dist/shell/commands/tail.d.ts.map +1 -0
- package/dist/shell/commands/tail.js +68 -0
- package/dist/shell/commands/tail.js.map +1 -0
- package/dist/shell/commands/wc.d.ts +6 -0
- package/dist/shell/commands/wc.d.ts.map +1 -0
- package/dist/shell/commands/wc.js +86 -0
- package/dist/shell/commands/wc.js.map +1 -0
- package/dist/shell/index.d.ts +10 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +10 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/limits.d.ts +5 -0
- package/dist/shell/limits.d.ts.map +1 -0
- package/dist/shell/limits.js +5 -0
- package/dist/shell/limits.js.map +1 -0
- package/dist/shell/parser.d.ts +8 -0
- package/dist/shell/parser.d.ts.map +1 -0
- package/dist/shell/parser.js +307 -0
- package/dist/shell/parser.js.map +1 -0
- package/dist/shell/path-validation.d.ts +35 -0
- package/dist/shell/path-validation.d.ts.map +1 -0
- package/dist/shell/path-validation.js +81 -0
- package/dist/shell/path-validation.js.map +1 -0
- package/dist/shell/shell.d.ts +66 -0
- package/dist/shell/shell.d.ts.map +1 -0
- package/dist/shell/shell.js +301 -0
- package/dist/shell/shell.js.map +1 -0
- package/dist/shell/shell.test.d.ts +2 -0
- package/dist/shell/shell.test.d.ts.map +1 -0
- package/dist/shell/shell.test.js +1088 -0
- package/dist/shell/shell.test.js.map +1 -0
- package/dist/shell/types.d.ts +82 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +5 -0
- package/dist/shell/types.js.map +1 -0
- package/dist/summarizer.d.ts +28 -0
- package/dist/summarizer.d.ts.map +1 -0
- package/dist/summarizer.js +136 -0
- package/dist/summarizer.js.map +1 -0
- package/dist/summarizer.test.d.ts +2 -0
- package/dist/summarizer.test.d.ts.map +1 -0
- package/dist/summarizer.test.js +192 -0
- package/dist/summarizer.test.js.map +1 -0
- package/dist/tools/ask-user.d.ts +11 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +35 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +18 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/output.d.ts +15 -0
- package/dist/tools/output.d.ts.map +1 -0
- package/dist/tools/output.js +40 -0
- package/dist/tools/output.js.map +1 -0
- package/dist/tools/shell.d.ts +13 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +166 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/sub-agent.d.ts +25 -0
- package/dist/tools/sub-agent.d.ts.map +1 -0
- package/dist/tools/sub-agent.js +312 -0
- package/dist/tools/sub-agent.js.map +1 -0
- package/dist/tools/tasks.d.ts +170 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +947 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/trace/builder.d.ts +54 -0
- package/dist/trace/builder.d.ts.map +1 -0
- package/dist/trace/builder.js +229 -0
- package/dist/trace/builder.js.map +1 -0
- package/dist/trace/console.d.ts +45 -0
- package/dist/trace/console.d.ts.map +1 -0
- package/dist/trace/console.js +143 -0
- package/dist/trace/console.js.map +1 -0
- package/dist/trace/index.d.ts +11 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +11 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/openrouter-pricing.d.ts +9 -0
- package/dist/trace/openrouter-pricing.d.ts.map +1 -0
- package/dist/trace/openrouter-pricing.js +321 -0
- package/dist/trace/openrouter-pricing.js.map +1 -0
- package/dist/trace/pricing.d.ts +13 -0
- package/dist/trace/pricing.d.ts.map +1 -0
- package/dist/trace/pricing.js +41 -0
- package/dist/trace/pricing.js.map +1 -0
- package/dist/trace/types.d.ts +142 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +16 -0
- package/dist/trace/types.js.map +1 -0
- package/dist/trace.d.ts +5 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +5 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +382 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace.d.ts +287 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +560 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
2
|
+
import { MemoryWorkspaceProvider } from './memory.js';
|
|
3
|
+
import { FileWorkspaceProvider } from './file.js';
|
|
4
|
+
import { Workspace } from '../../workspace.js';
|
|
5
|
+
import { mkdtemp, rm, readFile } from 'node:fs/promises';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
describe('MemoryWorkspaceProvider', () => {
|
|
9
|
+
let provider;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
provider = new MemoryWorkspaceProvider();
|
|
12
|
+
});
|
|
13
|
+
it('read returns null for non-existent path', async () => {
|
|
14
|
+
expect(await provider.read('/missing')).toBeNull();
|
|
15
|
+
});
|
|
16
|
+
it('write and read round-trip', async () => {
|
|
17
|
+
await provider.write('/test.json', '{"a":1}');
|
|
18
|
+
expect(await provider.read('/test.json')).toBe('{"a":1}');
|
|
19
|
+
});
|
|
20
|
+
it('delete returns true for existing file', async () => {
|
|
21
|
+
await provider.write('/file', 'data');
|
|
22
|
+
expect(await provider.delete('/file')).toBe(true);
|
|
23
|
+
expect(await provider.read('/file')).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
it('delete returns false for non-existent file', async () => {
|
|
26
|
+
expect(await provider.delete('/missing')).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it('exists returns true for files', async () => {
|
|
29
|
+
await provider.write('/file', 'data');
|
|
30
|
+
expect(await provider.exists('/file')).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it('exists returns false for missing paths', async () => {
|
|
33
|
+
expect(await provider.exists('/missing')).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
it('exists returns true for directories', async () => {
|
|
36
|
+
await provider.mkdir('/dir');
|
|
37
|
+
expect(await provider.exists('/dir')).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
it('list returns children of a directory', async () => {
|
|
40
|
+
await provider.write('/dir/a', '1');
|
|
41
|
+
await provider.write('/dir/b', '2');
|
|
42
|
+
const items = await provider.list('/dir');
|
|
43
|
+
expect(items).toEqual(['a', 'b']);
|
|
44
|
+
});
|
|
45
|
+
it('list includes subdirectories with trailing slash', async () => {
|
|
46
|
+
await provider.write('/dir/sub/file', 'data');
|
|
47
|
+
const items = await provider.list('/dir');
|
|
48
|
+
expect(items).toContain('sub/');
|
|
49
|
+
});
|
|
50
|
+
it('glob matches patterns', async () => {
|
|
51
|
+
await provider.write('/a.json', '{}');
|
|
52
|
+
await provider.write('/b.json', '{}');
|
|
53
|
+
await provider.write('/c.txt', 'text');
|
|
54
|
+
const matches = await provider.glob('/*.json');
|
|
55
|
+
expect(matches).toEqual(['/a.json', '/b.json']);
|
|
56
|
+
});
|
|
57
|
+
it('glob with ** matches nested paths', async () => {
|
|
58
|
+
await provider.write('/dir/a.json', '{}');
|
|
59
|
+
await provider.write('/dir/sub/b.json', '{}');
|
|
60
|
+
const matches = await provider.glob('/dir/**/*.json');
|
|
61
|
+
expect(matches).toContain('/dir/a.json');
|
|
62
|
+
expect(matches).toContain('/dir/sub/b.json');
|
|
63
|
+
});
|
|
64
|
+
it('mkdir creates directories', async () => {
|
|
65
|
+
await provider.mkdir('/new/dir');
|
|
66
|
+
expect(await provider.isDirectory('/new')).toBe(true);
|
|
67
|
+
expect(await provider.isDirectory('/new/dir')).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('isDirectory returns false for files', async () => {
|
|
70
|
+
await provider.write('/file', 'data');
|
|
71
|
+
expect(await provider.isDirectory('/file')).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
it('delete directory removes all children', async () => {
|
|
74
|
+
await provider.write('/dir/a', '1');
|
|
75
|
+
await provider.write('/dir/b', '2');
|
|
76
|
+
await provider.delete('/dir');
|
|
77
|
+
expect(await provider.read('/dir/a')).toBeNull();
|
|
78
|
+
expect(await provider.read('/dir/b')).toBeNull();
|
|
79
|
+
});
|
|
80
|
+
it('constructor accepts initial data', async () => {
|
|
81
|
+
const p = new MemoryWorkspaceProvider({ name: 'Alice', config: { port: 3000 } });
|
|
82
|
+
expect(await p.read('/name')).toBe('Alice');
|
|
83
|
+
expect(await p.read('/config')).toBe('{\n "port": 3000\n}');
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('FileWorkspaceProvider', () => {
|
|
87
|
+
let tmpDir;
|
|
88
|
+
let provider;
|
|
89
|
+
beforeEach(async () => {
|
|
90
|
+
tmpDir = await mkdtemp(join(tmpdir(), 'ws-test-'));
|
|
91
|
+
provider = new FileWorkspaceProvider(tmpDir);
|
|
92
|
+
});
|
|
93
|
+
afterEach(async () => {
|
|
94
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
95
|
+
});
|
|
96
|
+
it('read returns null when file does not exist', async () => {
|
|
97
|
+
expect(await provider.read('/missing')).toBeNull();
|
|
98
|
+
});
|
|
99
|
+
it('write and read round-trip', async () => {
|
|
100
|
+
await provider.write('/config.json', '{"port":3000}');
|
|
101
|
+
expect(await provider.read('/config.json')).toBe('{"port":3000}');
|
|
102
|
+
});
|
|
103
|
+
it('write creates nested directories', async () => {
|
|
104
|
+
await provider.write('/deep/nested/file.txt', 'hello');
|
|
105
|
+
const content = await readFile(join(tmpDir, 'deep/nested/file.txt'), 'utf-8');
|
|
106
|
+
expect(content).toBe('hello');
|
|
107
|
+
});
|
|
108
|
+
it('delete removes a file and returns true', async () => {
|
|
109
|
+
await provider.write('/to-delete.txt', 'bye');
|
|
110
|
+
expect(await provider.delete('/to-delete.txt')).toBe(true);
|
|
111
|
+
expect(await provider.read('/to-delete.txt')).toBeNull();
|
|
112
|
+
});
|
|
113
|
+
it('delete returns false for non-existent file', async () => {
|
|
114
|
+
expect(await provider.delete('/nope')).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
it('exists returns true for existing file', async () => {
|
|
117
|
+
await provider.write('/file.txt', 'data');
|
|
118
|
+
expect(await provider.exists('/file.txt')).toBe(true);
|
|
119
|
+
});
|
|
120
|
+
it('exists returns false for missing file', async () => {
|
|
121
|
+
expect(await provider.exists('/missing')).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
it('list returns directory entries', async () => {
|
|
124
|
+
await provider.write('/dir/a.txt', 'a');
|
|
125
|
+
await provider.write('/dir/b.txt', 'b');
|
|
126
|
+
const items = await provider.list('/dir');
|
|
127
|
+
expect(items).toEqual(['a.txt', 'b.txt']);
|
|
128
|
+
});
|
|
129
|
+
it('list returns empty for non-existent directory', async () => {
|
|
130
|
+
expect(await provider.list('/missing')).toEqual([]);
|
|
131
|
+
});
|
|
132
|
+
it('glob matches file patterns', async () => {
|
|
133
|
+
await provider.write('/a.json', '{}');
|
|
134
|
+
await provider.write('/b.json', '{}');
|
|
135
|
+
await provider.write('/c.txt', 'text');
|
|
136
|
+
const matches = await provider.glob('/*.json');
|
|
137
|
+
expect(matches).toEqual(['/a.json', '/b.json']);
|
|
138
|
+
});
|
|
139
|
+
it('mkdir creates directories', async () => {
|
|
140
|
+
await provider.mkdir('/new/dir');
|
|
141
|
+
expect(await provider.isDirectory('/new/dir')).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
it('isDirectory returns true for directories', async () => {
|
|
144
|
+
await provider.mkdir('/mydir');
|
|
145
|
+
expect(await provider.isDirectory('/mydir')).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
it('isDirectory returns false for files', async () => {
|
|
148
|
+
await provider.write('/file.txt', 'data');
|
|
149
|
+
expect(await provider.isDirectory('/file.txt')).toBe(false);
|
|
150
|
+
});
|
|
151
|
+
it('isDirectory returns false for non-existent path', async () => {
|
|
152
|
+
expect(await provider.isDirectory('/missing')).toBe(false);
|
|
153
|
+
});
|
|
154
|
+
it('round-trip: write, fresh provider, verify', async () => {
|
|
155
|
+
await provider.write('/user.json', '{"name":"Alice"}');
|
|
156
|
+
await provider.write('/notes.md', '# Notes\nHello');
|
|
157
|
+
const provider2 = new FileWorkspaceProvider(tmpDir);
|
|
158
|
+
expect(await provider2.read('/user.json')).toBe('{"name":"Alice"}');
|
|
159
|
+
expect(await provider2.read('/notes.md')).toBe('# Notes\nHello');
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('Workspace + Provider integration', () => {
|
|
163
|
+
it('init is a no-op when no provider subscription', async () => {
|
|
164
|
+
const ws = new Workspace();
|
|
165
|
+
await ws.init(); // should not throw
|
|
166
|
+
});
|
|
167
|
+
it('reads data written via shell', async () => {
|
|
168
|
+
const ws = new Workspace();
|
|
169
|
+
await ws.init();
|
|
170
|
+
const shell = ws.getShell();
|
|
171
|
+
await shell.execute('echo hello > greeting.txt');
|
|
172
|
+
expect(await ws.read('greeting.txt')).toBe('hello\n');
|
|
173
|
+
});
|
|
174
|
+
it('writes are readable via provider', async () => {
|
|
175
|
+
const ws = new Workspace();
|
|
176
|
+
ws.write('test.json', { hello: 'world' });
|
|
177
|
+
// Allow fire-and-forget write to complete
|
|
178
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
179
|
+
expect(await ws.read('test.json')).toEqual({ hello: 'world' });
|
|
180
|
+
});
|
|
181
|
+
it('deletes work correctly', async () => {
|
|
182
|
+
const ws = new Workspace();
|
|
183
|
+
ws.write('item', 'data');
|
|
184
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
185
|
+
await ws.delete('item');
|
|
186
|
+
expect(await ws.read('item')).toBeUndefined();
|
|
187
|
+
});
|
|
188
|
+
it('dispose calls flush and dispose on provider', async () => {
|
|
189
|
+
const flushSpy = vi.fn().mockResolvedValue(undefined);
|
|
190
|
+
const disposeSpy = vi.fn().mockResolvedValue(undefined);
|
|
191
|
+
const provider = {
|
|
192
|
+
async read() { return null; },
|
|
193
|
+
async write() { },
|
|
194
|
+
async delete() { return false; },
|
|
195
|
+
async exists() { return false; },
|
|
196
|
+
async list() { return []; },
|
|
197
|
+
async glob() { return []; },
|
|
198
|
+
async mkdir() { },
|
|
199
|
+
async isDirectory() { return false; },
|
|
200
|
+
flush: flushSpy,
|
|
201
|
+
dispose: disposeSpy
|
|
202
|
+
};
|
|
203
|
+
const ws = new Workspace({ provider });
|
|
204
|
+
await ws.init();
|
|
205
|
+
await ws.dispose();
|
|
206
|
+
expect(flushSpy).toHaveBeenCalled();
|
|
207
|
+
expect(disposeSpy).toHaveBeenCalled();
|
|
208
|
+
});
|
|
209
|
+
it('init is idempotent', async () => {
|
|
210
|
+
const subscribeSpy = vi.fn().mockReturnValue(() => { });
|
|
211
|
+
const provider = {
|
|
212
|
+
async read() { return null; },
|
|
213
|
+
async write() { },
|
|
214
|
+
async delete() { return false; },
|
|
215
|
+
async exists() { return false; },
|
|
216
|
+
async list() { return []; },
|
|
217
|
+
async glob() { return []; },
|
|
218
|
+
async mkdir() { },
|
|
219
|
+
async isDirectory() { return false; },
|
|
220
|
+
subscribe: subscribeSpy
|
|
221
|
+
};
|
|
222
|
+
const ws = new Workspace({ provider });
|
|
223
|
+
await ws.init();
|
|
224
|
+
await ws.init();
|
|
225
|
+
expect(subscribeSpy).toHaveBeenCalledTimes(1);
|
|
226
|
+
});
|
|
227
|
+
it('FileWorkspaceProvider round-trip with Workspace', async () => {
|
|
228
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'ws-integration-'));
|
|
229
|
+
try {
|
|
230
|
+
// Write phase
|
|
231
|
+
const provider1 = new FileWorkspaceProvider(tmpDir);
|
|
232
|
+
const ws1 = new Workspace({ provider: provider1 });
|
|
233
|
+
await ws1.init();
|
|
234
|
+
ws1.write('user.json', { name: 'Alice', age: 30 });
|
|
235
|
+
ws1.write('notes.md', '# My Notes');
|
|
236
|
+
// Small delay for fire-and-forget writes to settle
|
|
237
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
238
|
+
// Read phase with fresh workspace
|
|
239
|
+
const provider2 = new FileWorkspaceProvider(tmpDir);
|
|
240
|
+
const ws2 = new Workspace({ provider: provider2 });
|
|
241
|
+
await ws2.init();
|
|
242
|
+
expect(await ws2.read('user.json')).toEqual({ name: 'Alice', age: 30 });
|
|
243
|
+
expect(await ws2.read('notes.md')).toBe('# My Notes');
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=workspace-provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-provider.test.js","sourceRoot":"","sources":["../../../src/providers/workspace/workspace-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/browse.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AA8F9E,eAAO,MAAM,aAAa,EAAE,cAuF3B,CAAA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* browse - Fetch web pages and convert to readable text
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert HTML to readable plain text.
|
|
6
|
+
* Strips scripts/styles/nav/footer, converts headings/links/lists to markdown-like format.
|
|
7
|
+
*/
|
|
8
|
+
function htmlToText(html) {
|
|
9
|
+
let text = html;
|
|
10
|
+
// Remove script, style, nav, footer blocks
|
|
11
|
+
text = text.replace(/<script[\s\S]*?<\/script>/gi, '');
|
|
12
|
+
text = text.replace(/<style[\s\S]*?<\/style>/gi, '');
|
|
13
|
+
text = text.replace(/<nav[\s\S]*?<\/nav>/gi, '');
|
|
14
|
+
text = text.replace(/<footer[\s\S]*?<\/footer>/gi, '');
|
|
15
|
+
// Convert headings to # format
|
|
16
|
+
text = text.replace(/<h1[^>]*>([\s\S]*?)<\/h1>/gi, '\n# $1\n');
|
|
17
|
+
text = text.replace(/<h2[^>]*>([\s\S]*?)<\/h2>/gi, '\n## $1\n');
|
|
18
|
+
text = text.replace(/<h3[^>]*>([\s\S]*?)<\/h3>/gi, '\n### $1\n');
|
|
19
|
+
text = text.replace(/<h4[^>]*>([\s\S]*?)<\/h4>/gi, '\n#### $1\n');
|
|
20
|
+
text = text.replace(/<h5[^>]*>([\s\S]*?)<\/h5>/gi, '\n##### $1\n');
|
|
21
|
+
text = text.replace(/<h6[^>]*>([\s\S]*?)<\/h6>/gi, '\n###### $1\n');
|
|
22
|
+
// Convert links: <a href="url">text</a> -> [text](url)
|
|
23
|
+
text = text.replace(/<a[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi, '[$2]($1)');
|
|
24
|
+
// Convert list items
|
|
25
|
+
text = text.replace(/<li[^>]*>([\s\S]*?)<\/li>/gi, '- $1\n');
|
|
26
|
+
// Convert paragraphs and divs to newlines
|
|
27
|
+
text = text.replace(/<\/p>/gi, '\n\n');
|
|
28
|
+
text = text.replace(/<br\s*\/?>/gi, '\n');
|
|
29
|
+
text = text.replace(/<\/div>/gi, '\n');
|
|
30
|
+
// Strip all remaining HTML tags
|
|
31
|
+
text = text.replace(/<[^>]+>/g, '');
|
|
32
|
+
// Decode common HTML entities
|
|
33
|
+
text = text.replace(/&/g, '&');
|
|
34
|
+
text = text.replace(/</g, '<');
|
|
35
|
+
text = text.replace(/>/g, '>');
|
|
36
|
+
text = text.replace(/"/g, '"');
|
|
37
|
+
text = text.replace(/'/g, "'");
|
|
38
|
+
text = text.replace(/ /g, ' ');
|
|
39
|
+
// Collapse whitespace: multiple spaces to single, multiple newlines to double
|
|
40
|
+
text = text.replace(/[ \t]+/g, ' ');
|
|
41
|
+
text = text.replace(/\n /g, '\n');
|
|
42
|
+
text = text.replace(/ \n/g, '\n');
|
|
43
|
+
text = text.replace(/\n{3,}/g, '\n\n');
|
|
44
|
+
return text.trim();
|
|
45
|
+
}
|
|
46
|
+
const MAX_OUTPUT_LENGTH = 50_000;
|
|
47
|
+
/** Minimum meaningful content length (characters) after HTML-to-text conversion */
|
|
48
|
+
const MIN_CONTENT_LENGTH = 50;
|
|
49
|
+
/** Patterns that indicate the page blocked us or requires JavaScript */
|
|
50
|
+
const BLOCKED_PATTERNS = [
|
|
51
|
+
/please\s+enable\s+javascript/i,
|
|
52
|
+
/you\s+need\s+to\s+enable\s+javascript/i,
|
|
53
|
+
/javascript\s+is\s+required/i,
|
|
54
|
+
/please\s+click\s+here\s+if\s+you\s+are\s+not\s+redirected/i,
|
|
55
|
+
/if\s+you\s+are\s+not\s+redirected/i,
|
|
56
|
+
/checking\s+(your\s+)?browser/i,
|
|
57
|
+
/verify\s+you\s+are\s+(a\s+)?human/i,
|
|
58
|
+
/captcha/i,
|
|
59
|
+
/access\s+denied/i,
|
|
60
|
+
/forbidden/i,
|
|
61
|
+
/bot\s+detected/i,
|
|
62
|
+
/unusual\s+traffic/i,
|
|
63
|
+
/automated\s+requests/i
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* Check if the converted text looks like a blocked/useless response.
|
|
67
|
+
* Returns a warning message if problematic, null if content looks fine.
|
|
68
|
+
*/
|
|
69
|
+
function detectLowQuality(text) {
|
|
70
|
+
if (text.length < MIN_CONTENT_LENGTH) {
|
|
71
|
+
return `browse: page returned very little content (${text.length} chars). The site likely requires JavaScript or blocked the request. Try a different source or use \`curl\` with an API endpoint instead.`;
|
|
72
|
+
}
|
|
73
|
+
for (const pattern of BLOCKED_PATTERNS) {
|
|
74
|
+
if (pattern.test(text)) {
|
|
75
|
+
return `browse: page appears to require JavaScript or blocked the request (matched: ${pattern.source}). Content returned is not useful. Try a different URL, use a direct API, or try a different source for this information.`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
export const browseCommand = {
|
|
81
|
+
name: 'browse',
|
|
82
|
+
help: {
|
|
83
|
+
usage: 'browse [OPTIONS] URL',
|
|
84
|
+
description: 'Fetch a web page and convert HTML to readable text',
|
|
85
|
+
flags: [
|
|
86
|
+
{ flag: '--raw', description: 'Return raw HTML instead of converted text' }
|
|
87
|
+
],
|
|
88
|
+
examples: [
|
|
89
|
+
{ command: 'browse https://example.com', description: 'Fetch and convert page to text' },
|
|
90
|
+
{ command: 'browse --raw https://example.com', description: 'Fetch raw HTML' },
|
|
91
|
+
{ command: 'browse https://example.com | grep "keyword"', description: 'Fetch and search for keyword' },
|
|
92
|
+
{ command: 'browse https://example.com > page.md', description: 'Save page content to file' }
|
|
93
|
+
],
|
|
94
|
+
notes: [
|
|
95
|
+
'Strips <script>, <style>, <nav>, <footer> tags',
|
|
96
|
+
'Converts headings to # format, links to [text](url)',
|
|
97
|
+
'Output is trimmed to 50K characters',
|
|
98
|
+
'No JavaScript engine — sites requiring JS (Google, SPA apps) will return errors',
|
|
99
|
+
'Returns exitCode 1 if the page appears blocked or has no useful content',
|
|
100
|
+
'For search, use a search API via curl instead of browsing search engine pages'
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
async execute(args, ctx) {
|
|
104
|
+
let raw = false;
|
|
105
|
+
let url = null;
|
|
106
|
+
for (const arg of args) {
|
|
107
|
+
if (arg === '--raw') {
|
|
108
|
+
raw = true;
|
|
109
|
+
}
|
|
110
|
+
else if (!arg.startsWith('-')) {
|
|
111
|
+
url = arg;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!url) {
|
|
115
|
+
return { exitCode: 1, stdout: '', stderr: 'browse: no URL specified' };
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const fetchOptions = {
|
|
119
|
+
headers: {
|
|
120
|
+
'User-Agent': 'Mozilla/5.0 (compatible; ShellBrowser/1.0)',
|
|
121
|
+
'Accept': 'text/html, application/xhtml+xml, */*'
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
if (ctx.config.timeout) {
|
|
125
|
+
const controller = new AbortController();
|
|
126
|
+
setTimeout(() => controller.abort(), ctx.config.timeout);
|
|
127
|
+
fetchOptions.signal = controller.signal;
|
|
128
|
+
}
|
|
129
|
+
const response = await fetch(url, fetchOptions);
|
|
130
|
+
const html = await response.text();
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
return {
|
|
133
|
+
exitCode: 1,
|
|
134
|
+
stdout: '',
|
|
135
|
+
stderr: `browse: HTTP ${response.status} ${response.statusText}`
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
let output = raw ? html : htmlToText(html);
|
|
139
|
+
// Check for low-quality / blocked content (only on converted text)
|
|
140
|
+
if (!raw) {
|
|
141
|
+
const warning = detectLowQuality(output);
|
|
142
|
+
if (warning) {
|
|
143
|
+
return { exitCode: 1, stdout: output + '\n', stderr: warning };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Trim to max length
|
|
147
|
+
if (output.length > MAX_OUTPUT_LENGTH) {
|
|
148
|
+
output = output.slice(0, MAX_OUTPUT_LENGTH) + '\n\n[... truncated at 50K characters]';
|
|
149
|
+
}
|
|
150
|
+
return { exitCode: 0, stdout: output + '\n', stderr: '' };
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
154
|
+
return { exitCode: 1, stdout: '', stderr: `browse: ${message}` };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=browse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browse.js","sourceRoot":"","sources":["../../../src/shell/commands/browse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/cat.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAG9E,eAAO,MAAM,UAAU,EAAE,cA8GxB,CAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cat - Concatenate and print files
|
|
3
|
+
*/
|
|
4
|
+
import { MAX_FILE_SIZE, DEFAULT_LINE_LIMIT, MAX_LINE_LENGTH } from '../limits.js';
|
|
5
|
+
export const catCommand = {
|
|
6
|
+
name: 'cat',
|
|
7
|
+
help: {
|
|
8
|
+
usage: 'cat [OPTIONS] [FILE...]',
|
|
9
|
+
description: 'Concatenate and print files',
|
|
10
|
+
flags: [
|
|
11
|
+
{ flag: '-n', description: 'Show line numbers' },
|
|
12
|
+
{ flag: '--offset N', description: 'Start from line N (0-based)' },
|
|
13
|
+
{ flag: '--limit N', description: `Max lines to show (default: ${DEFAULT_LINE_LIMIT})` }
|
|
14
|
+
],
|
|
15
|
+
examples: [
|
|
16
|
+
{ command: 'cat data.json', description: 'Print file contents' },
|
|
17
|
+
{ command: 'cat -n data.json', description: 'Print with line numbers' },
|
|
18
|
+
{ command: 'cat --offset 0 --limit 100 big.txt', description: 'Read first 100 lines' },
|
|
19
|
+
{ command: 'cat a b', description: 'Concatenate multiple files' },
|
|
20
|
+
{ command: 'cat *.json', description: 'Print all JSON files' }
|
|
21
|
+
],
|
|
22
|
+
notes: [
|
|
23
|
+
'Supports glob patterns (e.g. *.json)',
|
|
24
|
+
'Reads from stdin when no files given and input is piped',
|
|
25
|
+
`Files over ${MAX_FILE_SIZE} bytes require --offset/--limit for paginated access`,
|
|
26
|
+
`Lines are truncated to ${MAX_LINE_LENGTH} characters`
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
async execute(args, ctx) {
|
|
30
|
+
// If no args and stdin, output stdin
|
|
31
|
+
if (args.length === 0 && ctx.stdin !== undefined) {
|
|
32
|
+
return { exitCode: 0, stdout: ctx.stdin, stderr: '' };
|
|
33
|
+
}
|
|
34
|
+
let showLineNumbers = false;
|
|
35
|
+
let offset = null;
|
|
36
|
+
let limit = null;
|
|
37
|
+
const paths = [];
|
|
38
|
+
for (let i = 0; i < args.length; i++) {
|
|
39
|
+
const arg = args[i];
|
|
40
|
+
if (arg === '-n') {
|
|
41
|
+
showLineNumbers = true;
|
|
42
|
+
}
|
|
43
|
+
else if (arg === '--offset') {
|
|
44
|
+
offset = parseInt(args[++i], 10);
|
|
45
|
+
}
|
|
46
|
+
else if (arg === '--limit') {
|
|
47
|
+
limit = parseInt(args[++i], 10);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
paths.push(arg);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (paths.length === 0) {
|
|
54
|
+
return { exitCode: 1, stdout: '', stderr: 'cat: missing file operand' };
|
|
55
|
+
}
|
|
56
|
+
const hasPagination = offset !== null || limit !== null;
|
|
57
|
+
const effectiveLimit = limit ?? DEFAULT_LINE_LIMIT;
|
|
58
|
+
const parts = [];
|
|
59
|
+
for (const path of paths) {
|
|
60
|
+
// Handle glob patterns
|
|
61
|
+
const files = path.includes('*') ? await ctx.fs.glob(path) : [path];
|
|
62
|
+
for (const file of files) {
|
|
63
|
+
// Size gate
|
|
64
|
+
if (ctx.fs.size) {
|
|
65
|
+
const fileSize = await ctx.fs.size(file);
|
|
66
|
+
if (fileSize === null) {
|
|
67
|
+
return { exitCode: 1, stdout: '', stderr: `cat: ${file}: No such file` };
|
|
68
|
+
}
|
|
69
|
+
if (fileSize > MAX_FILE_SIZE && !hasPagination && !ctx.piped) {
|
|
70
|
+
return {
|
|
71
|
+
exitCode: 1,
|
|
72
|
+
stdout: '',
|
|
73
|
+
stderr: `cat: ${file} (${fileSize} bytes) exceeds max size (${MAX_FILE_SIZE} bytes). Use \`head -n 2000 ${file}\` to read the first 2000 lines, \`tail -n 2000 ${file}\` for the last, or \`grep "pattern" ${file}\` to search.`
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const content = await ctx.fs.read(file);
|
|
78
|
+
if (content === null) {
|
|
79
|
+
return { exitCode: 1, stdout: '', stderr: `cat: ${file}: No such file` };
|
|
80
|
+
}
|
|
81
|
+
const allLines = content.split('\n');
|
|
82
|
+
const totalLines = allLines.length;
|
|
83
|
+
const effectiveOffset = offset ?? 0;
|
|
84
|
+
const sliced = allLines.slice(effectiveOffset, effectiveOffset + effectiveLimit);
|
|
85
|
+
// Only truncate long lines for display — skip when piped to preserve data integrity
|
|
86
|
+
const truncated = ctx.piped ? sliced : sliced.map(line => line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line);
|
|
87
|
+
if (offset !== null) {
|
|
88
|
+
const shown = truncated.length;
|
|
89
|
+
parts.push(`[Showing lines ${effectiveOffset + 1}-${effectiveOffset + shown} of ${totalLines}]\n`);
|
|
90
|
+
}
|
|
91
|
+
if (showLineNumbers) {
|
|
92
|
+
const startNum = effectiveOffset + 1;
|
|
93
|
+
const formatted = truncated.map((line, i) => `${startNum + i}\t${line}`);
|
|
94
|
+
parts.push(formatted.join('\n'));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
parts.push(truncated.join('\n'));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { exitCode: 0, stdout: parts.join(''), stderr: '' };
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=cat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat.js","sourceRoot":"","sources":["../../../src/shell/commands/cat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/curl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAU9E,eAAO,MAAM,WAAW,EAAE,cA8KzB,CAAA"}
|