@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.
Files changed (225) hide show
  1. package/README.md +46 -1
  2. package/dist/Tool.test.d.ts +2 -0
  3. package/dist/Tool.test.d.ts.map +1 -0
  4. package/dist/Tool.test.js +42 -0
  5. package/dist/Tool.test.js.map +1 -0
  6. package/dist/commands/commands.test.d.ts +2 -0
  7. package/dist/commands/commands.test.d.ts.map +1 -0
  8. package/dist/commands/commands.test.js +67 -0
  9. package/dist/commands/commands.test.js.map +1 -0
  10. package/dist/commands/index.d.ts.map +1 -1
  11. package/dist/commands/index.js +5 -2
  12. package/dist/commands/index.js.map +1 -1
  13. package/dist/components/CybergotchiPanelConnected.d.ts +5 -1
  14. package/dist/components/CybergotchiPanelConnected.d.ts.map +1 -1
  15. package/dist/components/CybergotchiPanelConnected.js +2 -2
  16. package/dist/components/CybergotchiPanelConnected.js.map +1 -1
  17. package/dist/components/DiffView.d.ts +1 -18
  18. package/dist/components/DiffView.d.ts.map +1 -1
  19. package/dist/components/DiffView.js +1 -54
  20. package/dist/components/DiffView.js.map +1 -1
  21. package/dist/components/Messages.js +1 -1
  22. package/dist/components/Messages.js.map +1 -1
  23. package/dist/components/PermissionPrompt.d.ts.map +1 -1
  24. package/dist/components/PermissionPrompt.js +7 -49
  25. package/dist/components/PermissionPrompt.js.map +1 -1
  26. package/dist/components/REPL.d.ts.map +1 -1
  27. package/dist/components/REPL.js +56 -90
  28. package/dist/components/REPL.js.map +1 -1
  29. package/dist/components/Spinner.d.ts.map +1 -1
  30. package/dist/components/Spinner.js +3 -9
  31. package/dist/components/Spinner.js.map +1 -1
  32. package/dist/cybergotchi/bones.test.d.ts +2 -0
  33. package/dist/cybergotchi/bones.test.d.ts.map +1 -0
  34. package/dist/cybergotchi/bones.test.js +100 -0
  35. package/dist/cybergotchi/bones.test.js.map +1 -0
  36. package/dist/cybergotchi/useCybergotchi.d.ts +1 -1
  37. package/dist/cybergotchi/useCybergotchi.d.ts.map +1 -1
  38. package/dist/cybergotchi/useCybergotchi.js +3 -1
  39. package/dist/cybergotchi/useCybergotchi.js.map +1 -1
  40. package/dist/harness/config.d.ts +1 -0
  41. package/dist/harness/config.d.ts.map +1 -1
  42. package/dist/harness/config.js.map +1 -1
  43. package/dist/harness/context-warning.d.ts +12 -0
  44. package/dist/harness/context-warning.d.ts.map +1 -0
  45. package/dist/harness/context-warning.js +36 -0
  46. package/dist/harness/context-warning.js.map +1 -0
  47. package/dist/harness/context-warning.test.d.ts +2 -0
  48. package/dist/harness/context-warning.test.d.ts.map +1 -0
  49. package/dist/harness/context-warning.test.js +72 -0
  50. package/dist/harness/context-warning.test.js.map +1 -0
  51. package/dist/harness/cost.d.ts.map +1 -1
  52. package/dist/harness/cost.js +1 -0
  53. package/dist/harness/cost.js.map +1 -1
  54. package/dist/harness/credentials.test.d.ts +2 -0
  55. package/dist/harness/credentials.test.d.ts.map +1 -0
  56. package/dist/harness/credentials.test.js +113 -0
  57. package/dist/harness/credentials.test.js.map +1 -0
  58. package/dist/harness/hooks.test.d.ts +2 -0
  59. package/dist/harness/hooks.test.d.ts.map +1 -0
  60. package/dist/harness/hooks.test.js +24 -0
  61. package/dist/harness/hooks.test.js.map +1 -0
  62. package/dist/harness/keybindings.test.d.ts +2 -0
  63. package/dist/harness/keybindings.test.d.ts.map +1 -0
  64. package/dist/harness/keybindings.test.js +38 -0
  65. package/dist/harness/keybindings.test.js.map +1 -0
  66. package/dist/harness/memory.test.d.ts +2 -0
  67. package/dist/harness/memory.test.d.ts.map +1 -0
  68. package/dist/harness/memory.test.js +65 -0
  69. package/dist/harness/memory.test.js.map +1 -0
  70. package/dist/harness/plugins.test.d.ts +2 -0
  71. package/dist/harness/plugins.test.d.ts.map +1 -0
  72. package/dist/harness/plugins.test.js +97 -0
  73. package/dist/harness/plugins.test.js.map +1 -0
  74. package/dist/harness/submit-handler.d.ts +35 -0
  75. package/dist/harness/submit-handler.d.ts.map +1 -0
  76. package/dist/harness/submit-handler.js +86 -0
  77. package/dist/harness/submit-handler.js.map +1 -0
  78. package/dist/harness/submit-handler.test.d.ts +2 -0
  79. package/dist/harness/submit-handler.test.d.ts.map +1 -0
  80. package/dist/harness/submit-handler.test.js +62 -0
  81. package/dist/harness/submit-handler.test.js.map +1 -0
  82. package/dist/lsp/client.test.d.ts +2 -0
  83. package/dist/lsp/client.test.d.ts.map +1 -0
  84. package/dist/lsp/client.test.js +44 -0
  85. package/dist/lsp/client.test.js.map +1 -0
  86. package/dist/main.js +29 -4
  87. package/dist/main.js.map +1 -1
  88. package/dist/mcp/McpTool.test.d.ts +2 -0
  89. package/dist/mcp/McpTool.test.d.ts.map +1 -0
  90. package/dist/mcp/McpTool.test.js +53 -0
  91. package/dist/mcp/McpTool.test.js.map +1 -0
  92. package/dist/mcp/schema.test.d.ts +2 -0
  93. package/dist/mcp/schema.test.d.ts.map +1 -0
  94. package/dist/mcp/schema.test.js +33 -0
  95. package/dist/mcp/schema.test.js.map +1 -0
  96. package/dist/mcp/server.js +1 -1
  97. package/dist/mcp/server.test.d.ts +2 -0
  98. package/dist/mcp/server.test.d.ts.map +1 -0
  99. package/dist/mcp/server.test.js +54 -0
  100. package/dist/mcp/server.test.js.map +1 -0
  101. package/dist/providers/index.js +1 -1
  102. package/dist/providers/index.js.map +1 -1
  103. package/dist/providers/message-format.test.d.ts +2 -0
  104. package/dist/providers/message-format.test.d.ts.map +1 -0
  105. package/dist/providers/message-format.test.js +31 -0
  106. package/dist/providers/message-format.test.js.map +1 -0
  107. package/dist/providers/ollama.d.ts.map +1 -1
  108. package/dist/providers/ollama.js +39 -4
  109. package/dist/providers/ollama.js.map +1 -1
  110. package/dist/query.test.d.ts +2 -0
  111. package/dist/query.test.d.ts.map +1 -0
  112. package/dist/query.test.js +121 -0
  113. package/dist/query.test.js.map +1 -0
  114. package/dist/remote/server.test.d.ts +2 -0
  115. package/dist/remote/server.test.d.ts.map +1 -0
  116. package/dist/remote/server.test.js +120 -0
  117. package/dist/remote/server.test.js.map +1 -0
  118. package/dist/renderer/cells.d.ts +37 -0
  119. package/dist/renderer/cells.d.ts.map +1 -0
  120. package/dist/renderer/cells.js +122 -0
  121. package/dist/renderer/cells.js.map +1 -0
  122. package/dist/renderer/cells.test.d.ts +2 -0
  123. package/dist/renderer/cells.test.d.ts.map +1 -0
  124. package/dist/renderer/cells.test.js +69 -0
  125. package/dist/renderer/cells.test.js.map +1 -0
  126. package/dist/renderer/diff.d.ts +32 -0
  127. package/dist/renderer/diff.d.ts.map +1 -0
  128. package/dist/renderer/diff.js +103 -0
  129. package/dist/renderer/diff.js.map +1 -0
  130. package/dist/renderer/differ.d.ts +25 -0
  131. package/dist/renderer/differ.d.ts.map +1 -0
  132. package/dist/renderer/differ.js +91 -0
  133. package/dist/renderer/differ.js.map +1 -0
  134. package/dist/renderer/e2e.test.d.ts +6 -0
  135. package/dist/renderer/e2e.test.d.ts.map +1 -0
  136. package/dist/renderer/e2e.test.js +235 -0
  137. package/dist/renderer/e2e.test.js.map +1 -0
  138. package/dist/renderer/image.d.ts +21 -0
  139. package/dist/renderer/image.d.ts.map +1 -0
  140. package/dist/renderer/image.js +97 -0
  141. package/dist/renderer/image.js.map +1 -0
  142. package/dist/renderer/index.d.ts +73 -0
  143. package/dist/renderer/index.d.ts.map +1 -0
  144. package/dist/renderer/index.js +331 -0
  145. package/dist/renderer/index.js.map +1 -0
  146. package/dist/renderer/input.d.ts +17 -0
  147. package/dist/renderer/input.d.ts.map +1 -0
  148. package/dist/renderer/input.js +101 -0
  149. package/dist/renderer/input.js.map +1 -0
  150. package/dist/renderer/layout.d.ts +62 -0
  151. package/dist/renderer/layout.d.ts.map +1 -0
  152. package/dist/renderer/layout.js +412 -0
  153. package/dist/renderer/layout.js.map +1 -0
  154. package/dist/renderer/markdown.d.ts +18 -0
  155. package/dist/renderer/markdown.d.ts.map +1 -0
  156. package/dist/renderer/markdown.js +430 -0
  157. package/dist/renderer/markdown.js.map +1 -0
  158. package/dist/renderer/markdown.test.d.ts +2 -0
  159. package/dist/renderer/markdown.test.d.ts.map +1 -0
  160. package/dist/renderer/markdown.test.js +81 -0
  161. package/dist/renderer/markdown.test.js.map +1 -0
  162. package/dist/renderer/perf.test.d.ts +2 -0
  163. package/dist/renderer/perf.test.d.ts.map +1 -0
  164. package/dist/renderer/perf.test.js +121 -0
  165. package/dist/renderer/perf.test.js.map +1 -0
  166. package/dist/renderer/session-browser.d.ts +30 -0
  167. package/dist/renderer/session-browser.d.ts.map +1 -0
  168. package/dist/renderer/session-browser.js +113 -0
  169. package/dist/renderer/session-browser.js.map +1 -0
  170. package/dist/repl.d.ts +20 -0
  171. package/dist/repl.d.ts.map +1 -0
  172. package/dist/repl.js +464 -0
  173. package/dist/repl.js.map +1 -0
  174. package/dist/services/AgentDispatcher.test.d.ts +2 -0
  175. package/dist/services/AgentDispatcher.test.d.ts.map +1 -0
  176. package/dist/services/AgentDispatcher.test.js +66 -0
  177. package/dist/services/AgentDispatcher.test.js.map +1 -0
  178. package/dist/services/StreamingToolExecutor.test.d.ts +2 -0
  179. package/dist/services/StreamingToolExecutor.test.d.ts.map +1 -0
  180. package/dist/services/StreamingToolExecutor.test.js +103 -0
  181. package/dist/services/StreamingToolExecutor.test.js.map +1 -0
  182. package/dist/test-helpers.d.ts +31 -0
  183. package/dist/test-helpers.d.ts.map +1 -0
  184. package/dist/test-helpers.js +106 -0
  185. package/dist/test-helpers.js.map +1 -0
  186. package/dist/tools/GrepTool/index.d.ts +2 -2
  187. package/dist/tools/tools-basic.test.d.ts +6 -0
  188. package/dist/tools/tools-basic.test.d.ts.map +1 -0
  189. package/dist/tools/tools-basic.test.js +190 -0
  190. package/dist/tools/tools-basic.test.js.map +1 -0
  191. package/dist/types/message.d.ts +1 -0
  192. package/dist/types/message.d.ts.map +1 -1
  193. package/dist/types/message.test.d.ts +2 -0
  194. package/dist/types/message.test.d.ts.map +1 -0
  195. package/dist/types/message.test.js +46 -0
  196. package/dist/types/message.test.js.map +1 -0
  197. package/dist/utils/diff-algorithm.d.ts +24 -0
  198. package/dist/utils/diff-algorithm.d.ts.map +1 -0
  199. package/dist/utils/diff-algorithm.js +58 -0
  200. package/dist/utils/diff-algorithm.js.map +1 -0
  201. package/dist/utils/diff-algorithm.test.d.ts +2 -0
  202. package/dist/utils/diff-algorithm.test.d.ts.map +1 -0
  203. package/dist/utils/diff-algorithm.test.js +49 -0
  204. package/dist/utils/diff-algorithm.test.js.map +1 -0
  205. package/dist/utils/format.d.ts +6 -0
  206. package/dist/utils/format.d.ts.map +1 -0
  207. package/dist/utils/format.js +12 -0
  208. package/dist/utils/format.js.map +1 -0
  209. package/dist/utils/theme-data.d.ts +31 -0
  210. package/dist/utils/theme-data.d.ts.map +1 -0
  211. package/dist/utils/theme-data.js +55 -0
  212. package/dist/utils/theme-data.js.map +1 -0
  213. package/dist/utils/theme.d.ts +4 -21
  214. package/dist/utils/theme.d.ts.map +1 -1
  215. package/dist/utils/theme.js +4 -36
  216. package/dist/utils/theme.js.map +1 -1
  217. package/dist/utils/tool-summary.d.ts +15 -0
  218. package/dist/utils/tool-summary.d.ts.map +1 -0
  219. package/dist/utils/tool-summary.js +55 -0
  220. package/dist/utils/tool-summary.js.map +1 -0
  221. package/dist/utils/tool-summary.test.d.ts +2 -0
  222. package/dist/utils/tool-summary.test.d.ts.map +1 -0
  223. package/dist/utils/tool-summary.test.js +67 -0
  224. package/dist/utils/tool-summary.test.js.map +1 -0
  225. 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,6 @@
1
+ /**
2
+ * Basic happy-path tests for all tools.
3
+ * Uses node:test + node:assert/strict.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=tools-basic.test.d.ts.map
@@ -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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"}
@@ -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;CACxD,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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message.test.d.ts.map
@@ -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"}