@zhijiewang/openharness 0.6.0 → 0.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/README.md +46 -1
- package/dist/Tool.test.d.ts +2 -0
- package/dist/Tool.test.d.ts.map +1 -0
- package/dist/Tool.test.js +42 -0
- package/dist/Tool.test.js.map +1 -0
- package/dist/commands/commands.test.d.ts +2 -0
- package/dist/commands/commands.test.d.ts.map +1 -0
- package/dist/commands/commands.test.js +67 -0
- package/dist/commands/commands.test.js.map +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +5 -2
- package/dist/commands/index.js.map +1 -1
- package/dist/components/CybergotchiPanelConnected.d.ts +5 -1
- package/dist/components/CybergotchiPanelConnected.d.ts.map +1 -1
- package/dist/components/CybergotchiPanelConnected.js +2 -2
- package/dist/components/CybergotchiPanelConnected.js.map +1 -1
- package/dist/components/DiffView.d.ts +1 -18
- package/dist/components/DiffView.d.ts.map +1 -1
- package/dist/components/DiffView.js +1 -54
- package/dist/components/DiffView.js.map +1 -1
- package/dist/components/Messages.js +1 -1
- package/dist/components/Messages.js.map +1 -1
- package/dist/components/PermissionPrompt.d.ts.map +1 -1
- package/dist/components/PermissionPrompt.js +7 -49
- package/dist/components/PermissionPrompt.js.map +1 -1
- package/dist/components/REPL.d.ts.map +1 -1
- package/dist/components/REPL.js +56 -90
- package/dist/components/REPL.js.map +1 -1
- package/dist/components/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner.js +3 -9
- package/dist/components/Spinner.js.map +1 -1
- package/dist/cybergotchi/bones.test.d.ts +2 -0
- package/dist/cybergotchi/bones.test.d.ts.map +1 -0
- package/dist/cybergotchi/bones.test.js +100 -0
- package/dist/cybergotchi/bones.test.js.map +1 -0
- package/dist/cybergotchi/useCybergotchi.d.ts +1 -1
- package/dist/cybergotchi/useCybergotchi.d.ts.map +1 -1
- package/dist/cybergotchi/useCybergotchi.js +3 -1
- package/dist/cybergotchi/useCybergotchi.js.map +1 -1
- package/dist/harness/config.d.ts +1 -0
- package/dist/harness/config.d.ts.map +1 -1
- package/dist/harness/config.js.map +1 -1
- package/dist/harness/context-warning.d.ts +12 -0
- package/dist/harness/context-warning.d.ts.map +1 -0
- package/dist/harness/context-warning.js +36 -0
- package/dist/harness/context-warning.js.map +1 -0
- package/dist/harness/context-warning.test.d.ts +2 -0
- package/dist/harness/context-warning.test.d.ts.map +1 -0
- package/dist/harness/context-warning.test.js +72 -0
- package/dist/harness/context-warning.test.js.map +1 -0
- package/dist/harness/cost.d.ts.map +1 -1
- package/dist/harness/cost.js +1 -0
- package/dist/harness/cost.js.map +1 -1
- package/dist/harness/credentials.test.d.ts +2 -0
- package/dist/harness/credentials.test.d.ts.map +1 -0
- package/dist/harness/credentials.test.js +113 -0
- package/dist/harness/credentials.test.js.map +1 -0
- package/dist/harness/hooks.test.d.ts +2 -0
- package/dist/harness/hooks.test.d.ts.map +1 -0
- package/dist/harness/hooks.test.js +24 -0
- package/dist/harness/hooks.test.js.map +1 -0
- package/dist/harness/keybindings.test.d.ts +2 -0
- package/dist/harness/keybindings.test.d.ts.map +1 -0
- package/dist/harness/keybindings.test.js +38 -0
- package/dist/harness/keybindings.test.js.map +1 -0
- package/dist/harness/memory.test.d.ts +2 -0
- package/dist/harness/memory.test.d.ts.map +1 -0
- package/dist/harness/memory.test.js +65 -0
- package/dist/harness/memory.test.js.map +1 -0
- package/dist/harness/plugins.test.d.ts +2 -0
- package/dist/harness/plugins.test.d.ts.map +1 -0
- package/dist/harness/plugins.test.js +97 -0
- package/dist/harness/plugins.test.js.map +1 -0
- package/dist/harness/submit-handler.d.ts +35 -0
- package/dist/harness/submit-handler.d.ts.map +1 -0
- package/dist/harness/submit-handler.js +86 -0
- package/dist/harness/submit-handler.js.map +1 -0
- package/dist/harness/submit-handler.test.d.ts +2 -0
- package/dist/harness/submit-handler.test.d.ts.map +1 -0
- package/dist/harness/submit-handler.test.js +62 -0
- package/dist/harness/submit-handler.test.js.map +1 -0
- package/dist/lsp/client.test.d.ts +2 -0
- package/dist/lsp/client.test.d.ts.map +1 -0
- package/dist/lsp/client.test.js +44 -0
- package/dist/lsp/client.test.js.map +1 -0
- package/dist/main.js +29 -4
- package/dist/main.js.map +1 -1
- package/dist/mcp/McpTool.test.d.ts +2 -0
- package/dist/mcp/McpTool.test.d.ts.map +1 -0
- package/dist/mcp/McpTool.test.js +53 -0
- package/dist/mcp/McpTool.test.js.map +1 -0
- package/dist/mcp/schema.test.d.ts +2 -0
- package/dist/mcp/schema.test.d.ts.map +1 -0
- package/dist/mcp/schema.test.js +33 -0
- package/dist/mcp/schema.test.js.map +1 -0
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.test.d.ts +2 -0
- package/dist/mcp/server.test.d.ts.map +1 -0
- package/dist/mcp/server.test.js +54 -0
- package/dist/mcp/server.test.js.map +1 -0
- package/dist/providers/index.js +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/message-format.test.d.ts +2 -0
- package/dist/providers/message-format.test.d.ts.map +1 -0
- package/dist/providers/message-format.test.js +31 -0
- package/dist/providers/message-format.test.js.map +1 -0
- package/dist/providers/ollama.d.ts.map +1 -1
- package/dist/providers/ollama.js +39 -4
- package/dist/providers/ollama.js.map +1 -1
- package/dist/query.test.d.ts +2 -0
- package/dist/query.test.d.ts.map +1 -0
- package/dist/query.test.js +121 -0
- package/dist/query.test.js.map +1 -0
- package/dist/remote/server.test.d.ts +2 -0
- package/dist/remote/server.test.d.ts.map +1 -0
- package/dist/remote/server.test.js +120 -0
- package/dist/remote/server.test.js.map +1 -0
- package/dist/renderer/cells.d.ts +37 -0
- package/dist/renderer/cells.d.ts.map +1 -0
- package/dist/renderer/cells.js +122 -0
- package/dist/renderer/cells.js.map +1 -0
- package/dist/renderer/cells.test.d.ts +2 -0
- package/dist/renderer/cells.test.d.ts.map +1 -0
- package/dist/renderer/cells.test.js +69 -0
- package/dist/renderer/cells.test.js.map +1 -0
- package/dist/renderer/diff.d.ts +32 -0
- package/dist/renderer/diff.d.ts.map +1 -0
- package/dist/renderer/diff.js +103 -0
- package/dist/renderer/diff.js.map +1 -0
- package/dist/renderer/differ.d.ts +25 -0
- package/dist/renderer/differ.d.ts.map +1 -0
- package/dist/renderer/differ.js +91 -0
- package/dist/renderer/differ.js.map +1 -0
- package/dist/renderer/e2e.test.d.ts +6 -0
- package/dist/renderer/e2e.test.d.ts.map +1 -0
- package/dist/renderer/e2e.test.js +235 -0
- package/dist/renderer/e2e.test.js.map +1 -0
- package/dist/renderer/image.d.ts +21 -0
- package/dist/renderer/image.d.ts.map +1 -0
- package/dist/renderer/image.js +97 -0
- package/dist/renderer/image.js.map +1 -0
- package/dist/renderer/index.d.ts +73 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +331 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/input.d.ts +17 -0
- package/dist/renderer/input.d.ts.map +1 -0
- package/dist/renderer/input.js +101 -0
- package/dist/renderer/input.js.map +1 -0
- package/dist/renderer/layout.d.ts +62 -0
- package/dist/renderer/layout.d.ts.map +1 -0
- package/dist/renderer/layout.js +412 -0
- package/dist/renderer/layout.js.map +1 -0
- package/dist/renderer/markdown.d.ts +18 -0
- package/dist/renderer/markdown.d.ts.map +1 -0
- package/dist/renderer/markdown.js +430 -0
- package/dist/renderer/markdown.js.map +1 -0
- package/dist/renderer/markdown.test.d.ts +2 -0
- package/dist/renderer/markdown.test.d.ts.map +1 -0
- package/dist/renderer/markdown.test.js +81 -0
- package/dist/renderer/markdown.test.js.map +1 -0
- package/dist/renderer/perf.test.d.ts +2 -0
- package/dist/renderer/perf.test.d.ts.map +1 -0
- package/dist/renderer/perf.test.js +121 -0
- package/dist/renderer/perf.test.js.map +1 -0
- package/dist/renderer/session-browser.d.ts +30 -0
- package/dist/renderer/session-browser.d.ts.map +1 -0
- package/dist/renderer/session-browser.js +113 -0
- package/dist/renderer/session-browser.js.map +1 -0
- package/dist/repl.d.ts +20 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +464 -0
- package/dist/repl.js.map +1 -0
- package/dist/services/AgentDispatcher.test.d.ts +2 -0
- package/dist/services/AgentDispatcher.test.d.ts.map +1 -0
- package/dist/services/AgentDispatcher.test.js +66 -0
- package/dist/services/AgentDispatcher.test.js.map +1 -0
- package/dist/services/StreamingToolExecutor.test.d.ts +2 -0
- package/dist/services/StreamingToolExecutor.test.d.ts.map +1 -0
- package/dist/services/StreamingToolExecutor.test.js +103 -0
- package/dist/services/StreamingToolExecutor.test.js.map +1 -0
- package/dist/test-helpers.d.ts +31 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +106 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/tools/GrepTool/index.d.ts +2 -2
- package/dist/tools/tools-basic.test.d.ts +6 -0
- package/dist/tools/tools-basic.test.d.ts.map +1 -0
- package/dist/tools/tools-basic.test.js +190 -0
- package/dist/tools/tools-basic.test.js.map +1 -0
- package/dist/types/message.d.ts +1 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.test.d.ts +2 -0
- package/dist/types/message.test.d.ts.map +1 -0
- package/dist/types/message.test.js +46 -0
- package/dist/types/message.test.js.map +1 -0
- package/dist/utils/diff-algorithm.d.ts +24 -0
- package/dist/utils/diff-algorithm.d.ts.map +1 -0
- package/dist/utils/diff-algorithm.js +58 -0
- package/dist/utils/diff-algorithm.js.map +1 -0
- package/dist/utils/diff-algorithm.test.d.ts +2 -0
- package/dist/utils/diff-algorithm.test.d.ts.map +1 -0
- package/dist/utils/diff-algorithm.test.js +49 -0
- package/dist/utils/diff-algorithm.test.js.map +1 -0
- package/dist/utils/format.d.ts +6 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +12 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/theme-data.d.ts +31 -0
- package/dist/utils/theme-data.d.ts.map +1 -0
- package/dist/utils/theme-data.js +55 -0
- package/dist/utils/theme-data.js.map +1 -0
- package/dist/utils/theme.d.ts +4 -21
- package/dist/utils/theme.d.ts.map +1 -1
- package/dist/utils/theme.js +4 -36
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/tool-summary.d.ts +15 -0
- package/dist/utils/tool-summary.d.ts.map +1 -0
- package/dist/utils/tool-summary.js +55 -0
- package/dist/utils/tool-summary.js.map +1 -0
- package/dist/utils/tool-summary.test.d.ts +2 -0
- package/dist/utils/tool-summary.test.d.ts.map +1 -0
- package/dist/utils/tool-summary.test.js +67 -0
- package/dist/utils/tool-summary.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { StreamingToolExecutor } from './StreamingToolExecutor.js';
|
|
4
|
+
import { createMockTool } from '../test-helpers.js';
|
|
5
|
+
const baseContext = { workingDir: '/tmp' };
|
|
6
|
+
test('executor: concurrent-safe tool starts immediately', async () => {
|
|
7
|
+
const tool = createMockTool('Fast', { concurrent: true });
|
|
8
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust');
|
|
9
|
+
executor.addTool({ id: 'c1', toolName: 'Fast', arguments: {} });
|
|
10
|
+
await executor.waitForAll();
|
|
11
|
+
const results = [...executor.getCompletedResults()];
|
|
12
|
+
assert.equal(results.length, 1);
|
|
13
|
+
assert.equal(results[0].result.isError, false);
|
|
14
|
+
});
|
|
15
|
+
test('executor: multiple concurrent tools run in parallel', async () => {
|
|
16
|
+
const tool = createMockTool('Fast', { concurrent: true, delay: 10 });
|
|
17
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust');
|
|
18
|
+
executor.addTool({ id: 'c1', toolName: 'Fast', arguments: {} });
|
|
19
|
+
executor.addTool({ id: 'c2', toolName: 'Fast', arguments: {} });
|
|
20
|
+
executor.addTool({ id: 'c3', toolName: 'Fast', arguments: {} });
|
|
21
|
+
await executor.waitForAll();
|
|
22
|
+
const results = [...executor.getCompletedResults()];
|
|
23
|
+
assert.equal(results.length, 3);
|
|
24
|
+
});
|
|
25
|
+
test('executor: non-concurrent tool runs sequentially', async () => {
|
|
26
|
+
const tool = createMockTool('Tool', { concurrent: false, delay: 10 });
|
|
27
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust');
|
|
28
|
+
executor.addTool({ id: 'c1', toolName: 'Tool', arguments: {} });
|
|
29
|
+
// Wait for first to complete before adding second
|
|
30
|
+
await executor.waitForAll();
|
|
31
|
+
const firstResults = [...executor.getCompletedResults()];
|
|
32
|
+
assert.equal(firstResults.length, 1);
|
|
33
|
+
executor.addTool({ id: 'c2', toolName: 'Tool', arguments: {} });
|
|
34
|
+
await executor.waitForAll();
|
|
35
|
+
const secondResults = [...executor.getCompletedResults()];
|
|
36
|
+
assert.equal(secondResults.length, 1);
|
|
37
|
+
});
|
|
38
|
+
test('executor: waitForAll resolves when all complete', async () => {
|
|
39
|
+
const tool = createMockTool('Slow', { concurrent: true, delay: 20 });
|
|
40
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust');
|
|
41
|
+
executor.addTool({ id: 'c1', toolName: 'Slow', arguments: {} });
|
|
42
|
+
executor.addTool({ id: 'c2', toolName: 'Slow', arguments: {} });
|
|
43
|
+
assert.ok(executor.pendingCount > 0);
|
|
44
|
+
await executor.waitForAll();
|
|
45
|
+
assert.equal(executor.pendingCount, 0);
|
|
46
|
+
});
|
|
47
|
+
test('executor: getCompletedResults yields in order', async () => {
|
|
48
|
+
const tool = createMockTool('Tool', { concurrent: true });
|
|
49
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust');
|
|
50
|
+
executor.addTool({ id: 'first', toolName: 'Tool', arguments: {} });
|
|
51
|
+
executor.addTool({ id: 'second', toolName: 'Tool', arguments: {} });
|
|
52
|
+
await executor.waitForAll();
|
|
53
|
+
const results = [...executor.getCompletedResults()];
|
|
54
|
+
assert.equal(results[0].toolCall.id, 'first');
|
|
55
|
+
assert.equal(results[1].toolCall.id, 'second');
|
|
56
|
+
});
|
|
57
|
+
test('executor: unknown tool returns error', async () => {
|
|
58
|
+
const executor = new StreamingToolExecutor([], baseContext, 'trust');
|
|
59
|
+
executor.addTool({ id: 'c1', toolName: 'NonExistent', arguments: {} });
|
|
60
|
+
await executor.waitForAll();
|
|
61
|
+
const results = [...executor.getCompletedResults()];
|
|
62
|
+
assert.equal(results.length, 1);
|
|
63
|
+
assert.equal(results[0].result.isError, true);
|
|
64
|
+
assert.ok(results[0].result.output.includes('Unknown tool'));
|
|
65
|
+
});
|
|
66
|
+
test('executor: permission denied in deny mode', async () => {
|
|
67
|
+
const tool = createMockTool('Write', { readOnly: false, risk: 'medium' });
|
|
68
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'deny');
|
|
69
|
+
executor.addTool({ id: 'c1', toolName: 'Write', arguments: {} });
|
|
70
|
+
await executor.waitForAll();
|
|
71
|
+
const results = [...executor.getCompletedResults()];
|
|
72
|
+
assert.equal(results[0].result.isError, true);
|
|
73
|
+
assert.ok(results[0].result.output.includes('Denied') || results[0].result.output.includes('denied'));
|
|
74
|
+
});
|
|
75
|
+
test('executor: abort signal prevents execution', async () => {
|
|
76
|
+
const controller = new AbortController();
|
|
77
|
+
controller.abort();
|
|
78
|
+
const tool = createMockTool('Tool', { concurrent: true, delay: 100 });
|
|
79
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust', undefined, controller.signal);
|
|
80
|
+
executor.addTool({ id: 'c1', toolName: 'Tool', arguments: {} });
|
|
81
|
+
await executor.waitForAll();
|
|
82
|
+
const results = [...executor.getCompletedResults()];
|
|
83
|
+
assert.equal(results.length, 1);
|
|
84
|
+
assert.ok(results[0].result.output.includes('Abort'));
|
|
85
|
+
});
|
|
86
|
+
test('executor: pendingCount reflects queued + executing', async () => {
|
|
87
|
+
const tool = createMockTool('Slow', { concurrent: true, delay: 50 });
|
|
88
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust');
|
|
89
|
+
executor.addTool({ id: 'c1', toolName: 'Slow', arguments: {} });
|
|
90
|
+
executor.addTool({ id: 'c2', toolName: 'Slow', arguments: {} });
|
|
91
|
+
assert.ok(executor.pendingCount >= 1);
|
|
92
|
+
await executor.waitForAll();
|
|
93
|
+
assert.equal(executor.pendingCount, 0);
|
|
94
|
+
});
|
|
95
|
+
test('executor: output chunks collected', async () => {
|
|
96
|
+
const tool = createMockTool('Chunky', { concurrent: true });
|
|
97
|
+
const executor = new StreamingToolExecutor([tool], baseContext, 'trust');
|
|
98
|
+
executor.addTool({ id: 'c1', toolName: 'Chunky', arguments: {} });
|
|
99
|
+
await executor.waitForAll();
|
|
100
|
+
// outputChunks may or may not have entries depending on tool implementation
|
|
101
|
+
assert.ok(Array.isArray(executor.outputChunks));
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=StreamingToolExecutor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingToolExecutor.test.js","sourceRoot":"","sources":["../../src/services/StreamingToolExecutor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test helpers — mock provider, mock tools, tmpdir, mock fetch.
|
|
3
|
+
*/
|
|
4
|
+
import type { Provider } from './providers/base.js';
|
|
5
|
+
import type { StreamEvent } from './types/events.js';
|
|
6
|
+
import type { Message } from './types/message.js';
|
|
7
|
+
import type { Tool, ToolResult } from './Tool.js';
|
|
8
|
+
export declare function createMockProvider(streamEvents?: StreamEvent[][]): Provider & {
|
|
9
|
+
calls: Array<{
|
|
10
|
+
messages: Message[];
|
|
11
|
+
systemPrompt: string;
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
/** Create events for a simple text response */
|
|
15
|
+
export declare function textResponseEvents(text: string): StreamEvent[];
|
|
16
|
+
/** Create events for a tool call response */
|
|
17
|
+
export declare function toolCallEvents(toolName: string, args: Record<string, unknown>, callId?: string): StreamEvent[];
|
|
18
|
+
/** Create a mock provider that throws on stream */
|
|
19
|
+
export declare function createErrorProvider(error: Error): Provider;
|
|
20
|
+
export declare function createMockTool(name: string, opts?: {
|
|
21
|
+
readOnly?: boolean;
|
|
22
|
+
concurrent?: boolean;
|
|
23
|
+
risk?: 'low' | 'medium' | 'high';
|
|
24
|
+
result?: ToolResult;
|
|
25
|
+
delay?: number;
|
|
26
|
+
}): Tool;
|
|
27
|
+
export declare function makeTmpDir(): string;
|
|
28
|
+
export declare function writeFile(dir: string, name: string, content: string): string;
|
|
29
|
+
export declare function mockFetch(handler: (url: string, init?: RequestInit) => Promise<Response>): () => void;
|
|
30
|
+
export declare function mockFetchJson(data: unknown, status?: number): () => void;
|
|
31
|
+
//# sourceMappingURL=test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAyC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAe,MAAM,WAAW,CAAC;AAK/D,wBAAgB,kBAAkB,CAChC,YAAY,GAAE,WAAW,EAAE,EAAS,GACnC,QAAQ,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAqC5E;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAK9D;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAW,GAAG,WAAW,EAAE,CAMhH;AAED,mDAAmD;AACnD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAQ1D;AAID,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IACJ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,IAAI,CAiBN;AAID,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAK5E;AAMD,wBAAgB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAGrG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,SAAM,GAAG,MAAM,IAAI,CAErE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test helpers — mock provider, mock tools, tmpdir, mock fetch.
|
|
3
|
+
*/
|
|
4
|
+
import { mkdtempSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { createAssistantMessage } from './types/message.js';
|
|
9
|
+
// ── Mock Provider ──
|
|
10
|
+
export function createMockProvider(streamEvents = [[]]) {
|
|
11
|
+
let turnIndex = 0;
|
|
12
|
+
const calls = [];
|
|
13
|
+
return {
|
|
14
|
+
name: 'mock',
|
|
15
|
+
calls,
|
|
16
|
+
async *stream(messages, systemPrompt, tools, model) {
|
|
17
|
+
calls.push({ messages, systemPrompt });
|
|
18
|
+
const events = streamEvents[turnIndex] ?? [];
|
|
19
|
+
turnIndex++;
|
|
20
|
+
for (const event of events) {
|
|
21
|
+
yield event;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
async complete(messages, systemPrompt, tools, model) {
|
|
25
|
+
calls.push({ messages, systemPrompt });
|
|
26
|
+
return createAssistantMessage('mock response');
|
|
27
|
+
},
|
|
28
|
+
listModels() {
|
|
29
|
+
return [{
|
|
30
|
+
id: 'mock-model',
|
|
31
|
+
provider: 'mock',
|
|
32
|
+
contextWindow: 128_000,
|
|
33
|
+
supportsTools: true,
|
|
34
|
+
supportsStreaming: true,
|
|
35
|
+
supportsVision: false,
|
|
36
|
+
inputCostPerMtok: 0,
|
|
37
|
+
outputCostPerMtok: 0,
|
|
38
|
+
}];
|
|
39
|
+
},
|
|
40
|
+
async healthCheck() { return true; },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Create events for a simple text response */
|
|
44
|
+
export function textResponseEvents(text) {
|
|
45
|
+
return [
|
|
46
|
+
{ type: 'text_delta', content: text },
|
|
47
|
+
{ type: 'cost_update', inputTokens: 10, outputTokens: 5, cost: 0, model: 'mock' },
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
/** Create events for a tool call response */
|
|
51
|
+
export function toolCallEvents(toolName, args, callId = 'call-1') {
|
|
52
|
+
return [
|
|
53
|
+
{ type: 'tool_call_start', toolName, callId },
|
|
54
|
+
{ type: 'tool_call_complete', toolName, callId, arguments: args },
|
|
55
|
+
{ type: 'cost_update', inputTokens: 10, outputTokens: 5, cost: 0, model: 'mock' },
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
/** Create a mock provider that throws on stream */
|
|
59
|
+
export function createErrorProvider(error) {
|
|
60
|
+
return {
|
|
61
|
+
name: 'mock-error',
|
|
62
|
+
async *stream() { throw error; },
|
|
63
|
+
async complete() { throw error; },
|
|
64
|
+
listModels() { return []; },
|
|
65
|
+
async healthCheck() { return false; },
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// ── Mock Tool ──
|
|
69
|
+
export function createMockTool(name, opts = {}) {
|
|
70
|
+
const inputSchema = z.object({ input: z.string().optional() });
|
|
71
|
+
const result = opts.result ?? { output: `${name} executed`, isError: false };
|
|
72
|
+
return {
|
|
73
|
+
name,
|
|
74
|
+
description: `Mock tool: ${name}`,
|
|
75
|
+
inputSchema,
|
|
76
|
+
riskLevel: opts.risk ?? 'low',
|
|
77
|
+
isReadOnly() { return opts.readOnly ?? true; },
|
|
78
|
+
isConcurrencySafe() { return opts.concurrent ?? true; },
|
|
79
|
+
async call(_input, _context) {
|
|
80
|
+
if (opts.delay)
|
|
81
|
+
await new Promise(r => setTimeout(r, opts.delay));
|
|
82
|
+
return result;
|
|
83
|
+
},
|
|
84
|
+
prompt() { return `Mock tool ${name}`; },
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ── Tmpdir ──
|
|
88
|
+
export function makeTmpDir() {
|
|
89
|
+
return mkdtempSync(join(tmpdir(), 'oh-test-'));
|
|
90
|
+
}
|
|
91
|
+
export function writeFile(dir, name, content) {
|
|
92
|
+
const path = join(dir, name);
|
|
93
|
+
mkdirSync(join(dir, ...name.split('/').slice(0, -1)), { recursive: true });
|
|
94
|
+
writeFileSync(path, content);
|
|
95
|
+
return path;
|
|
96
|
+
}
|
|
97
|
+
// ── Mock Fetch ──
|
|
98
|
+
const originalFetch = globalThis.fetch;
|
|
99
|
+
export function mockFetch(handler) {
|
|
100
|
+
globalThis.fetch = handler;
|
|
101
|
+
return () => { globalThis.fetch = originalFetch; };
|
|
102
|
+
}
|
|
103
|
+
export function mockFetchJson(data, status = 200) {
|
|
104
|
+
return mockFetch(async () => new Response(JSON.stringify(data), { status }));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,13 @@ declare const inputSchema: z.ZodObject<{
|
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
9
|
pattern: string;
|
|
10
10
|
path?: string | undefined;
|
|
11
|
-
context?: number | undefined;
|
|
12
11
|
glob?: string | undefined;
|
|
12
|
+
context?: number | undefined;
|
|
13
13
|
}, {
|
|
14
14
|
pattern: string;
|
|
15
15
|
path?: string | undefined;
|
|
16
|
-
context?: number | undefined;
|
|
17
16
|
glob?: string | undefined;
|
|
17
|
+
context?: number | undefined;
|
|
18
18
|
}>;
|
|
19
19
|
export declare const GrepTool: Tool<typeof inputSchema>;
|
|
20
20
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-basic.test.d.ts","sourceRoot":"","sources":["../../src/tools/tools-basic.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic happy-path tests for all tools.
|
|
3
|
+
* Uses node:test + node:assert/strict.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, afterEach } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { makeTmpDir, writeFile, mockFetch, createMockTool } from "../test-helpers.js";
|
|
9
|
+
// Tool imports
|
|
10
|
+
import { BashTool } from "./BashTool/index.js";
|
|
11
|
+
import { FileReadTool } from "./FileReadTool/index.js";
|
|
12
|
+
import { FileWriteTool } from "./FileWriteTool/index.js";
|
|
13
|
+
import { GlobTool } from "./GlobTool/index.js";
|
|
14
|
+
import { GrepTool } from "./GrepTool/index.js";
|
|
15
|
+
import { LSTool } from "./LSTool/index.js";
|
|
16
|
+
import { WebSearchTool } from "./WebSearchTool/index.js";
|
|
17
|
+
import { TaskCreateTool } from "./TaskCreateTool/index.js";
|
|
18
|
+
import { TaskUpdateTool } from "./TaskUpdateTool/index.js";
|
|
19
|
+
import { TaskListTool } from "./TaskListTool/index.js";
|
|
20
|
+
import { AskUserTool } from "./AskUserTool/index.js";
|
|
21
|
+
import { SkillTool } from "./SkillTool/index.js";
|
|
22
|
+
import { AgentTool } from "./AgentTool/index.js";
|
|
23
|
+
import { EnterPlanModeTool } from "./EnterPlanModeTool/index.js";
|
|
24
|
+
import { ExitPlanModeTool } from "./ExitPlanModeTool/index.js";
|
|
25
|
+
import { NotebookEditTool } from "./NotebookEditTool/index.js";
|
|
26
|
+
import { ImageReadTool } from "./ImageReadTool/index.js";
|
|
27
|
+
import { DiagnosticsTool } from "./DiagnosticsTool/index.js";
|
|
28
|
+
import { ParallelAgentTool } from "./ParallelAgentTool/index.js";
|
|
29
|
+
import { ToolSearchTool } from "./ToolSearchTool/index.js";
|
|
30
|
+
function ctx(tmpdir, extra = {}) {
|
|
31
|
+
return { workingDir: tmpdir, ...extra };
|
|
32
|
+
}
|
|
33
|
+
describe("tools-basic", () => {
|
|
34
|
+
let cleanupFetch = null;
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
if (cleanupFetch) {
|
|
37
|
+
cleanupFetch();
|
|
38
|
+
cleanupFetch = null;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
it("BashTool — echo hello", async () => {
|
|
42
|
+
const tmp = makeTmpDir();
|
|
43
|
+
const result = await BashTool.call({ command: "echo hello" }, ctx(tmp));
|
|
44
|
+
assert.equal(result.isError, false);
|
|
45
|
+
assert.ok(result.output.includes("hello"));
|
|
46
|
+
});
|
|
47
|
+
it("FileReadTool — reads file contents", async () => {
|
|
48
|
+
const tmp = makeTmpDir();
|
|
49
|
+
const filePath = writeFile(tmp, "read-me.txt", "greetings from file");
|
|
50
|
+
const result = await FileReadTool.call({ file_path: filePath }, ctx(tmp));
|
|
51
|
+
assert.equal(result.isError, false);
|
|
52
|
+
assert.ok(result.output.includes("greetings from file"));
|
|
53
|
+
});
|
|
54
|
+
it("FileWriteTool — writes a file", async () => {
|
|
55
|
+
const tmp = makeTmpDir();
|
|
56
|
+
const filePath = join(tmp, "output.txt");
|
|
57
|
+
const result = await FileWriteTool.call({ file_path: filePath, content: "test content" }, ctx(tmp));
|
|
58
|
+
assert.equal(result.isError, false);
|
|
59
|
+
assert.ok(result.output.includes(filePath));
|
|
60
|
+
});
|
|
61
|
+
it("GlobTool — finds files by pattern", async () => {
|
|
62
|
+
const tmp = makeTmpDir();
|
|
63
|
+
writeFile(tmp, "alpha.txt", "a");
|
|
64
|
+
writeFile(tmp, "beta.txt", "b");
|
|
65
|
+
writeFile(tmp, "gamma.js", "c");
|
|
66
|
+
const result = await GlobTool.call({ pattern: "*.txt", path: tmp }, ctx(tmp));
|
|
67
|
+
assert.equal(result.isError, false);
|
|
68
|
+
assert.ok(result.output.includes("alpha.txt"));
|
|
69
|
+
assert.ok(result.output.includes("beta.txt"));
|
|
70
|
+
assert.ok(!result.output.includes("gamma.js"));
|
|
71
|
+
});
|
|
72
|
+
it("GrepTool — searches file contents", async () => {
|
|
73
|
+
const tmp = makeTmpDir();
|
|
74
|
+
writeFile(tmp, "haystack.txt", "hello world\ngoodbye world");
|
|
75
|
+
const result = await GrepTool.call({ pattern: "hello", path: tmp }, ctx(tmp));
|
|
76
|
+
assert.equal(result.isError, false);
|
|
77
|
+
assert.ok(result.output.includes("haystack.txt"));
|
|
78
|
+
});
|
|
79
|
+
it("LSTool — lists directory contents", async () => {
|
|
80
|
+
const tmp = makeTmpDir();
|
|
81
|
+
writeFile(tmp, "one.txt", "1");
|
|
82
|
+
writeFile(tmp, "two.txt", "2");
|
|
83
|
+
const result = await LSTool.call({ path: tmp }, ctx(tmp));
|
|
84
|
+
assert.equal(result.isError, false);
|
|
85
|
+
assert.ok(result.output.includes("one.txt"));
|
|
86
|
+
assert.ok(result.output.includes("two.txt"));
|
|
87
|
+
});
|
|
88
|
+
it("WebSearchTool — returns results with mocked fetch", async () => {
|
|
89
|
+
const html = `
|
|
90
|
+
<a class="result__a" href="?uddg=https%3A%2F%2Fexample.com">Example</a>
|
|
91
|
+
<a class="result__snippet">A snippet</a>
|
|
92
|
+
`;
|
|
93
|
+
cleanupFetch = mockFetch(async () => new Response(html, { status: 200 }));
|
|
94
|
+
const tmp = makeTmpDir();
|
|
95
|
+
const result = await WebSearchTool.call({ query: "test" }, ctx(tmp));
|
|
96
|
+
assert.equal(result.isError, false);
|
|
97
|
+
});
|
|
98
|
+
it("TaskCreateTool — creates a task", async () => {
|
|
99
|
+
const tmp = makeTmpDir();
|
|
100
|
+
const result = await TaskCreateTool.call({ subject: "test task", description: "a test description" }, ctx(tmp));
|
|
101
|
+
assert.equal(result.isError, false);
|
|
102
|
+
assert.ok(result.output.includes("Task #1"));
|
|
103
|
+
});
|
|
104
|
+
it("TaskUpdateTool — updates an existing task", async () => {
|
|
105
|
+
const tmp = makeTmpDir();
|
|
106
|
+
// Create a task first
|
|
107
|
+
await TaskCreateTool.call({ subject: "task to update", description: "original desc" }, ctx(tmp));
|
|
108
|
+
const result = await TaskUpdateTool.call({ taskId: 1, status: "done" }, ctx(tmp));
|
|
109
|
+
assert.equal(result.isError, false);
|
|
110
|
+
assert.ok(result.output.includes("done"));
|
|
111
|
+
});
|
|
112
|
+
it("TaskListTool — lists tasks", async () => {
|
|
113
|
+
const tmp = makeTmpDir();
|
|
114
|
+
await TaskCreateTool.call({ subject: "listed task", description: "desc" }, ctx(tmp));
|
|
115
|
+
const result = await TaskListTool.call({}, ctx(tmp));
|
|
116
|
+
assert.equal(result.isError, false);
|
|
117
|
+
assert.ok(result.output.includes("listed task"));
|
|
118
|
+
});
|
|
119
|
+
it("AskUserTool — headless fallback", async () => {
|
|
120
|
+
const tmp = makeTmpDir();
|
|
121
|
+
const result = await AskUserTool.call({ question: "What color?" }, ctx(tmp));
|
|
122
|
+
assert.equal(result.isError, false);
|
|
123
|
+
assert.ok(result.output.includes("What color?"));
|
|
124
|
+
});
|
|
125
|
+
it("SkillTool — list skills (empty is OK)", async () => {
|
|
126
|
+
const tmp = makeTmpDir();
|
|
127
|
+
const result = await SkillTool.call({ skill: "list" }, ctx(tmp));
|
|
128
|
+
assert.equal(result.isError, false);
|
|
129
|
+
});
|
|
130
|
+
it("AgentTool — errors without provider in context", async () => {
|
|
131
|
+
const tmp = makeTmpDir();
|
|
132
|
+
const result = await AgentTool.call({ prompt: "do something" }, ctx(tmp));
|
|
133
|
+
assert.equal(result.isError, true);
|
|
134
|
+
assert.ok(result.output.includes("unavailable"));
|
|
135
|
+
});
|
|
136
|
+
it("EnterPlanModeTool — creates plan mode", async () => {
|
|
137
|
+
const tmp = makeTmpDir();
|
|
138
|
+
const result = await EnterPlanModeTool.call({}, ctx(tmp));
|
|
139
|
+
assert.equal(result.isError, false);
|
|
140
|
+
assert.ok(result.output.includes("Plan mode entered"));
|
|
141
|
+
});
|
|
142
|
+
it("ExitPlanModeTool — exits plan mode", async () => {
|
|
143
|
+
const tmp = makeTmpDir();
|
|
144
|
+
const result = await ExitPlanModeTool.call({}, ctx(tmp));
|
|
145
|
+
assert.equal(result.isError, false);
|
|
146
|
+
assert.ok(result.output.includes("Plan mode exited"));
|
|
147
|
+
});
|
|
148
|
+
it("NotebookEditTool — edits a notebook cell", async () => {
|
|
149
|
+
const tmp = makeTmpDir();
|
|
150
|
+
const notebook = {
|
|
151
|
+
cells: [
|
|
152
|
+
{ cell_type: "code", source: ["print('old')"], metadata: {}, outputs: [] },
|
|
153
|
+
],
|
|
154
|
+
metadata: {},
|
|
155
|
+
nbformat: 4,
|
|
156
|
+
nbformat_minor: 2,
|
|
157
|
+
};
|
|
158
|
+
writeFile(tmp, "test.ipynb", JSON.stringify(notebook));
|
|
159
|
+
const result = await NotebookEditTool.call({ notebook_path: "test.ipynb", cell_index: 0, new_source: "print('new')" }, ctx(tmp));
|
|
160
|
+
assert.equal(result.isError, false);
|
|
161
|
+
assert.ok(result.output.includes("Cell 0 updated"));
|
|
162
|
+
});
|
|
163
|
+
it("ImageReadTool — errors on non-image file", async () => {
|
|
164
|
+
const tmp = makeTmpDir();
|
|
165
|
+
const filePath = writeFile(tmp, "test.txt", "not an image");
|
|
166
|
+
const result = await ImageReadTool.call({ file_path: filePath }, ctx(tmp));
|
|
167
|
+
assert.equal(result.isError, true);
|
|
168
|
+
assert.ok(result.output.includes("Unsupported image type"));
|
|
169
|
+
});
|
|
170
|
+
it("DiagnosticsTool — errors without LSP server", async () => {
|
|
171
|
+
const tmp = makeTmpDir();
|
|
172
|
+
const result = await DiagnosticsTool.call({ file_path: "/nonexistent/file.txt", action: "diagnostics" }, ctx(tmp));
|
|
173
|
+
assert.equal(result.isError, true);
|
|
174
|
+
assert.ok(result.output.includes("No language server"));
|
|
175
|
+
});
|
|
176
|
+
it("ParallelAgentTool — errors without provider in context", async () => {
|
|
177
|
+
const tmp = makeTmpDir();
|
|
178
|
+
const result = await ParallelAgentTool.call({ tasks: [{ id: "a", prompt: "test" }] }, ctx(tmp));
|
|
179
|
+
assert.equal(result.isError, true);
|
|
180
|
+
assert.ok(result.output.includes("unavailable"));
|
|
181
|
+
});
|
|
182
|
+
it("ToolSearchTool — finds a mock tool by name", async () => {
|
|
183
|
+
const tmp = makeTmpDir();
|
|
184
|
+
const mock = createMockTool("MockAlpha");
|
|
185
|
+
const result = await ToolSearchTool.call({ query: "Mock", maxResults: 5 }, ctx(tmp, { tools: [mock] }));
|
|
186
|
+
assert.equal(result.isError, false);
|
|
187
|
+
assert.ok(result.output.includes("MockAlpha"));
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=tools-basic.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-basic.test.js","sourceRoot":"","sources":["../../src/tools/tools-basic.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types/message.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export type Message = {
|
|
|
23
23
|
readonly meta?: {
|
|
24
24
|
isInfo?: boolean;
|
|
25
25
|
pinned?: boolean;
|
|
26
|
+
isStreaming?: boolean;
|
|
26
27
|
};
|
|
27
28
|
};
|
|
28
29
|
export declare function createMessage(role: Role, content: string, extra?: Partial<Pick<Message, "toolCalls" | "toolResults" | "meta">>): Message;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC/E,CAAC;AAEF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC,CAAC,GACnE,OAAO,CAQT;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,GAC9B,OAAO,CAET;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.test.d.ts","sourceRoot":"","sources":["../../src/types/message.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { createUserMessage, createAssistantMessage, createToolResultMessage, createInfoMessage, createPinnedMessage, } from "./message.js";
|
|
4
|
+
test("createUserMessage has role 'user', uuid, and timestamp", () => {
|
|
5
|
+
const msg = createUserMessage("hello");
|
|
6
|
+
assert.equal(msg.role, "user");
|
|
7
|
+
assert.equal(msg.content, "hello");
|
|
8
|
+
assert.equal(typeof msg.uuid, "string");
|
|
9
|
+
assert.ok(msg.uuid.length > 0);
|
|
10
|
+
assert.equal(typeof msg.timestamp, "number");
|
|
11
|
+
assert.ok(msg.timestamp > 0);
|
|
12
|
+
});
|
|
13
|
+
test("createAssistantMessage has role 'assistant' and optional toolCalls", () => {
|
|
14
|
+
const plain = createAssistantMessage("hi");
|
|
15
|
+
assert.equal(plain.role, "assistant");
|
|
16
|
+
assert.equal(plain.toolCalls, undefined);
|
|
17
|
+
const withTools = createAssistantMessage("hi", [
|
|
18
|
+
{ id: "c1", toolName: "Read", arguments: { path: "/tmp" } },
|
|
19
|
+
]);
|
|
20
|
+
assert.equal(withTools.role, "assistant");
|
|
21
|
+
assert.equal(withTools.toolCalls.length, 1);
|
|
22
|
+
assert.equal(withTools.toolCalls[0].toolName, "Read");
|
|
23
|
+
});
|
|
24
|
+
test("createToolResultMessage has role 'tool' and toolResults array", () => {
|
|
25
|
+
const msg = createToolResultMessage({
|
|
26
|
+
callId: "c1",
|
|
27
|
+
output: "done",
|
|
28
|
+
isError: false,
|
|
29
|
+
});
|
|
30
|
+
assert.equal(msg.role, "tool");
|
|
31
|
+
assert.ok(Array.isArray(msg.toolResults));
|
|
32
|
+
assert.equal(msg.toolResults.length, 1);
|
|
33
|
+
assert.equal(msg.toolResults[0].callId, "c1");
|
|
34
|
+
});
|
|
35
|
+
test("createInfoMessage has meta.isInfo = true", () => {
|
|
36
|
+
const msg = createInfoMessage("info text");
|
|
37
|
+
assert.equal(msg.role, "system");
|
|
38
|
+
assert.equal(msg.meta?.isInfo, true);
|
|
39
|
+
});
|
|
40
|
+
test("createPinnedMessage has meta.pinned = true AND meta.isInfo = true", () => {
|
|
41
|
+
const msg = createPinnedMessage("pinned text");
|
|
42
|
+
assert.equal(msg.role, "system");
|
|
43
|
+
assert.equal(msg.meta?.pinned, true);
|
|
44
|
+
assert.equal(msg.meta?.isInfo, true);
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=message.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.test.js","sourceRoot":"","sources":["../../src/types/message.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure diff algorithm — no framework dependencies.
|
|
3
|
+
* Extracted from DiffView.tsx so it can be used by both
|
|
4
|
+
* the Ink component and the cell-level renderer.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Compute a simple unified diff between two strings.
|
|
8
|
+
* Returns an array of { type, line } entries.
|
|
9
|
+
*/
|
|
10
|
+
export declare function computeDiff(oldText: string, newText: string): Array<{
|
|
11
|
+
type: 'add' | 'remove' | 'context';
|
|
12
|
+
line: string;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Filter diff to show only changed lines with N lines of context.
|
|
16
|
+
*/
|
|
17
|
+
export declare function filterWithContext(diff: Array<{
|
|
18
|
+
type: 'add' | 'remove' | 'context';
|
|
19
|
+
line: string;
|
|
20
|
+
}>, contextLines?: number): Array<{
|
|
21
|
+
type: 'add' | 'remove' | 'context' | 'separator';
|
|
22
|
+
line: string;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=diff-algorithm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-algorithm.d.ts","sourceRoot":"","sources":["../../src/utils/diff-algorithm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACjE,YAAY,SAAI,GACf,KAAK,CAAC;IAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB3E"}
|