@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,58 @@
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 function computeDiff(oldText, newText) {
11
+ const oldLines = oldText.split('\n');
12
+ const newLines = newText.split('\n');
13
+ const result = [];
14
+ let oi = 0;
15
+ let ni = 0;
16
+ while (oi < oldLines.length || ni < newLines.length) {
17
+ if (oi < oldLines.length && ni < newLines.length && oldLines[oi] === newLines[ni]) {
18
+ result.push({ type: 'context', line: oldLines[oi] });
19
+ oi++;
20
+ ni++;
21
+ }
22
+ else if (ni < newLines.length && (oi >= oldLines.length || !oldLines.slice(oi).includes(newLines[ni]))) {
23
+ result.push({ type: 'add', line: newLines[ni] });
24
+ ni++;
25
+ }
26
+ else {
27
+ result.push({ type: 'remove', line: oldLines[oi] });
28
+ oi++;
29
+ }
30
+ }
31
+ return result;
32
+ }
33
+ /**
34
+ * Filter diff to show only changed lines with N lines of context.
35
+ */
36
+ export function filterWithContext(diff, contextLines = 3) {
37
+ const changed = new Set();
38
+ diff.forEach((d, i) => {
39
+ if (d.type !== 'context') {
40
+ for (let j = Math.max(0, i - contextLines); j <= Math.min(diff.length - 1, i + contextLines); j++) {
41
+ changed.add(j);
42
+ }
43
+ }
44
+ });
45
+ const result = [];
46
+ let lastShown = -2;
47
+ diff.forEach((d, i) => {
48
+ if (changed.has(i)) {
49
+ if (i > lastShown + 1 && lastShown >= 0) {
50
+ result.push({ type: 'separator', line: '...' });
51
+ }
52
+ result.push(d);
53
+ lastShown = i;
54
+ }
55
+ });
56
+ return result;
57
+ }
58
+ //# sourceMappingURL=diff-algorithm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-algorithm.js","sourceRoot":"","sources":["../../src/utils/diff-algorithm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=diff-algorithm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-algorithm.test.d.ts","sourceRoot":"","sources":["../../src/utils/diff-algorithm.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { computeDiff, filterWithContext } from './diff-algorithm.js';
4
+ describe('computeDiff', () => {
5
+ it('returns empty for identical strings', () => {
6
+ const diff = computeDiff('hello', 'hello');
7
+ assert.strictEqual(diff.length, 1);
8
+ assert.strictEqual(diff[0].type, 'context');
9
+ });
10
+ it('detects added lines', () => {
11
+ const diff = computeDiff('a\nb', 'a\nb\nc');
12
+ const adds = diff.filter(d => d.type === 'add');
13
+ assert.strictEqual(adds.length, 1);
14
+ assert.strictEqual(adds[0].line, 'c');
15
+ });
16
+ it('detects removed lines', () => {
17
+ const diff = computeDiff('a\nb\nc', 'a\nc');
18
+ const removes = diff.filter(d => d.type === 'remove');
19
+ assert.strictEqual(removes.length, 1);
20
+ assert.strictEqual(removes[0].line, 'b');
21
+ });
22
+ it('handles empty old text', () => {
23
+ const diff = computeDiff('', 'new content');
24
+ assert.ok(diff.some(d => d.type === 'add'));
25
+ });
26
+ it('handles empty new text', () => {
27
+ const diff = computeDiff('old content', '');
28
+ assert.ok(diff.some(d => d.type === 'remove'));
29
+ });
30
+ });
31
+ describe('filterWithContext', () => {
32
+ it('shows context around changes', () => {
33
+ const diff = computeDiff('a\nb\nc\nd\ne\nf\ng', 'a\nb\nX\nd\ne\nf\ng');
34
+ const filtered = filterWithContext(diff, 1);
35
+ // Should show b (context), remove c, add X, d (context)
36
+ assert.ok(filtered.length < diff.length);
37
+ assert.ok(filtered.some(d => d.line === 'X' && d.type === 'add'));
38
+ });
39
+ it('adds separator between distant changes', () => {
40
+ const old = Array.from({ length: 20 }, (_, i) => `line${i}`).join('\n');
41
+ const lines = old.split('\n');
42
+ lines[2] = 'CHANGED2';
43
+ lines[18] = 'CHANGED18';
44
+ const diff = computeDiff(old, lines.join('\n'));
45
+ const filtered = filterWithContext(diff, 1);
46
+ assert.ok(filtered.some(d => d.type === 'separator'));
47
+ });
48
+ });
49
+ //# sourceMappingURL=diff-algorithm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-algorithm.test.js","sourceRoot":"","sources":["../../src/utils/diff-algorithm.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared formatting utilities.
3
+ */
4
+ /** Format a token count for display (e.g., 1500 → "1.5K") */
5
+ export declare function formatTokenCount(n: number): string;
6
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIlD"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared formatting utilities.
3
+ */
4
+ /** Format a token count for display (e.g., 1500 → "1.5K") */
5
+ export function formatTokenCount(n) {
6
+ if (n >= 1_000_000)
7
+ return `${(n / 1_000_000).toFixed(1)}M`;
8
+ if (n >= 1_000)
9
+ return `${(n / 1_000).toFixed(1)}K`;
10
+ return `${n}`;
11
+ }
12
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,GAAG,CAAC,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Theme data — framework-agnostic, no React dependency.
3
+ * Import this in the cell renderer instead of theme.ts.
4
+ */
5
+ export type Theme = {
6
+ primary: string;
7
+ primaryShimmer: string;
8
+ user: string;
9
+ assistant: string;
10
+ tool: string;
11
+ error: string;
12
+ success: string;
13
+ warning: string;
14
+ border: string;
15
+ dim: string;
16
+ text: string;
17
+ diffAdded: string;
18
+ diffRemoved: string;
19
+ stall: string;
20
+ stallShimmer: string;
21
+ heading: string;
22
+ codeBlock: string;
23
+ codeFence: string;
24
+ bullet: string;
25
+ };
26
+ export declare const darkTheme: Theme;
27
+ export declare const lightTheme: Theme;
28
+ export declare function getTheme(): Theme;
29
+ /** Set the active theme. Must be called before renderer modules initialize. */
30
+ export declare function setActiveTheme(name: 'dark' | 'light'): void;
31
+ //# sourceMappingURL=theme-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-data.d.ts","sourceRoot":"","sources":["../../src/utils/theme-data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAoBvB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAoBxB,CAAC;AAIF,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAE3D"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Theme data — framework-agnostic, no React dependency.
3
+ * Import this in the cell renderer instead of theme.ts.
4
+ */
5
+ export const darkTheme = {
6
+ primary: "magenta",
7
+ primaryShimmer: "magentaBright",
8
+ user: "cyan",
9
+ assistant: "magenta",
10
+ tool: "yellow",
11
+ error: "red",
12
+ success: "green",
13
+ warning: "yellow",
14
+ border: "gray",
15
+ dim: "gray",
16
+ text: "white",
17
+ diffAdded: "green",
18
+ diffRemoved: "red",
19
+ stall: "yellow",
20
+ stallShimmer: "redBright",
21
+ heading: "cyan",
22
+ codeBlock: "gray",
23
+ codeFence: "gray",
24
+ bullet: "cyan",
25
+ };
26
+ export const lightTheme = {
27
+ primary: "magentaBright",
28
+ primaryShimmer: "magenta",
29
+ user: "cyanBright",
30
+ assistant: "magentaBright",
31
+ tool: "yellowBright",
32
+ error: "redBright",
33
+ success: "greenBright",
34
+ warning: "yellowBright",
35
+ border: "blackBright",
36
+ dim: "blackBright",
37
+ text: "black",
38
+ diffAdded: "greenBright",
39
+ diffRemoved: "redBright",
40
+ stall: "yellowBright",
41
+ stallShimmer: "red",
42
+ heading: "cyanBright",
43
+ codeBlock: "blackBright",
44
+ codeFence: "blackBright",
45
+ bullet: "cyanBright",
46
+ };
47
+ let activeTheme = darkTheme;
48
+ export function getTheme() {
49
+ return activeTheme;
50
+ }
51
+ /** Set the active theme. Must be called before renderer modules initialize. */
52
+ export function setActiveTheme(name) {
53
+ activeTheme = name === 'light' ? lightTheme : darkTheme;
54
+ }
55
+ //# sourceMappingURL=theme-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-data.js","sourceRoot":"","sources":["../../src/utils/theme-data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,eAAe;IAC/B,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,KAAK;IAClB,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,WAAW;IACzB,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,OAAO,EAAE,eAAe;IACxB,cAAc,EAAE,SAAS;IACzB,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,aAAa;IAClB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,aAAa;IACxB,WAAW,EAAE,WAAW;IACxB,KAAK,EAAE,cAAc;IACrB,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,aAAa;IACxB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,IAAI,WAAW,GAAU,SAAS,CAAC;AAEnC,MAAM,UAAU,QAAQ;IACtB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC"}
@@ -1,27 +1,10 @@
1
1
  /**
2
- * Semantic theme system for OpenHarness terminal UI.
3
- * Semantic color tokens with shimmer variants for animations.
2
+ * Theme system with React context for Ink components.
3
+ * Re-exports theme data from theme-data.ts (no React dependency).
4
4
  */
5
5
  import React from "react";
6
- export type Theme = {
7
- primary: string;
8
- primaryShimmer: string;
9
- user: string;
10
- assistant: string;
11
- tool: string;
12
- error: string;
13
- success: string;
14
- warning: string;
15
- border: string;
16
- dim: string;
17
- text: string;
18
- diffAdded: string;
19
- diffRemoved: string;
20
- stall: string;
21
- stallShimmer: string;
22
- };
23
- export declare const darkTheme: Theme;
24
- export declare const lightTheme: Theme;
6
+ export { type Theme, darkTheme, lightTheme, getTheme, setActiveTheme } from "./theme-data.js";
7
+ import type { Theme } from "./theme-data.js";
25
8
  export declare const ThemeProvider: React.Provider<Theme>;
26
9
  export declare function useTheme(): Theme;
27
10
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,KAAK,GAAG;IAElB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IAGvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAGhB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAGb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IAGpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAoBvB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAoBxB,CAAC;AAIF,eAAO,MAAM,aAAa,uBAAwB,CAAC;AAEnD,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAI7C,eAAO,MAAM,aAAa,uBAAwB,CAAC;AAEnD,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
@@ -1,42 +1,10 @@
1
1
  /**
2
- * Semantic theme system for OpenHarness terminal UI.
3
- * Semantic color tokens with shimmer variants for animations.
2
+ * Theme system with React context for Ink components.
3
+ * Re-exports theme data from theme-data.ts (no React dependency).
4
4
  */
5
5
  import React from "react";
6
- export const darkTheme = {
7
- primary: "magenta",
8
- primaryShimmer: "magentaBright",
9
- user: "cyan",
10
- assistant: "magenta",
11
- tool: "yellow",
12
- error: "red",
13
- success: "green",
14
- warning: "yellow",
15
- border: "gray",
16
- dim: "gray",
17
- text: "white",
18
- diffAdded: "green",
19
- diffRemoved: "red",
20
- stall: "yellow",
21
- stallShimmer: "redBright",
22
- };
23
- export const lightTheme = {
24
- primary: "magentaBright",
25
- primaryShimmer: "magenta",
26
- user: "cyanBright",
27
- assistant: "magentaBright",
28
- tool: "yellowBright",
29
- error: "redBright",
30
- success: "greenBright",
31
- warning: "yellowBright",
32
- border: "blackBright",
33
- dim: "blackBright",
34
- text: "black",
35
- diffAdded: "greenBright",
36
- diffRemoved: "redBright",
37
- stall: "yellowBright",
38
- stallShimmer: "red",
39
- };
6
+ export { darkTheme, lightTheme, getTheme, setActiveTheme } from "./theme-data.js";
7
+ import { darkTheme } from "./theme-data.js";
40
8
  const ThemeContext = React.createContext(darkTheme);
41
9
  export const ThemeProvider = ThemeContext.Provider;
42
10
  export function useTheme() {
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AA6B1B,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,eAAe;IAE/B,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,QAAQ;IAEjB,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,OAAO;IAEb,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,KAAK;IAElB,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,WAAW;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,OAAO,EAAE,eAAe;IACxB,cAAc,EAAE,SAAS;IAEzB,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,cAAc;IAEvB,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,aAAa;IAClB,IAAI,EAAE,OAAO;IAEb,SAAS,EAAE,aAAa;IACxB,WAAW,EAAE,WAAW;IAExB,KAAK,EAAE,cAAc;IACrB,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAQ,SAAS,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC;AAEnD,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAc,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAQ,SAAS,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC;AAEnD,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shared tool argument summary utilities.
3
+ * Used by both the cell renderer and Ink permission prompt.
4
+ */
5
+ /**
6
+ * Extract a human-readable suggestion from tool name + args JSON.
7
+ * Returns null if no meaningful suggestion can be derived.
8
+ */
9
+ export declare function summarizeToolArgs(toolName: string, argsJson: string): string | null;
10
+ /**
11
+ * Extract a readable summary of tool arguments for display.
12
+ * Simpler version for inline display (tool call rows).
13
+ */
14
+ export declare function formatToolArgs(toolName: string, args: Record<string, unknown>): string;
15
+ //# sourceMappingURL=tool-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-summary.d.ts","sourceRoot":"","sources":["../../src/utils/tool-summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BnF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAKtF"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared tool argument summary utilities.
3
+ * Used by both the cell renderer and Ink permission prompt.
4
+ */
5
+ /**
6
+ * Extract a human-readable suggestion from tool name + args JSON.
7
+ * Returns null if no meaningful suggestion can be derived.
8
+ */
9
+ export function summarizeToolArgs(toolName, argsJson) {
10
+ const lower = toolName.toLowerCase();
11
+ if (lower === 'bash' || lower === 'shell' || lower === 'execute') {
12
+ const cmdMatch = argsJson.match(/command[:\s]+["`]?(.+?)["`]?(?:\n|$)/i);
13
+ if (cmdMatch)
14
+ return `$ ${cmdMatch[1]}`;
15
+ try {
16
+ const args = JSON.parse(argsJson);
17
+ if (args.command)
18
+ return `$ ${args.command.slice(0, 60)}`;
19
+ }
20
+ catch { /* ignore */ }
21
+ }
22
+ if (lower.includes('read') || lower.includes('write') || lower.includes('edit') || lower.includes('glob') || lower.includes('grep')) {
23
+ try {
24
+ const args = JSON.parse(argsJson);
25
+ if (args.file_path) {
26
+ const action = lower.includes('read') ? 'reading' : lower.includes('write') ? 'writing' : lower.includes('edit') ? 'editing' : lower;
27
+ return `${action} ${args.file_path}`;
28
+ }
29
+ if (args.pattern)
30
+ return `pattern: ${args.pattern}`;
31
+ }
32
+ catch {
33
+ const pathMatch = argsJson.match(/(?:path|file)[:\s]+["`]?([^\s"`]+)/i);
34
+ if (pathMatch) {
35
+ const action = lower.includes('read') ? 'reading' : lower.includes('write') ? 'writing' : lower.includes('edit') ? 'editing' : lower;
36
+ return `${action} ${pathMatch[1]}`;
37
+ }
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ /**
43
+ * Extract a readable summary of tool arguments for display.
44
+ * Simpler version for inline display (tool call rows).
45
+ */
46
+ export function formatToolArgs(toolName, args) {
47
+ if (args.file_path)
48
+ return args.file_path;
49
+ if (args.command)
50
+ return `$ ${args.command.slice(0, 60)}`;
51
+ if (args.pattern)
52
+ return `pattern: ${args.pattern}`;
53
+ return JSON.stringify(args).slice(0, 80);
54
+ }
55
+ //# sourceMappingURL=tool-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-summary.js","sourceRoot":"","sources":["../../src/utils/tool-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-summary.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-summary.test.d.ts","sourceRoot":"","sources":["../../src/utils/tool-summary.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { summarizeToolArgs, formatToolArgs } from './tool-summary.js';
4
+ describe('summarizeToolArgs', () => {
5
+ it('extracts command from Bash tool', () => {
6
+ const result = summarizeToolArgs('Bash', JSON.stringify({ command: 'ls -la' }));
7
+ assert.ok(result !== null);
8
+ assert.ok(result.includes('ls -la'));
9
+ assert.ok(result.startsWith('$'));
10
+ });
11
+ it('extracts file_path from Read tool', () => {
12
+ const result = summarizeToolArgs('Read', JSON.stringify({ file_path: '/src/index.ts' }));
13
+ assert.ok(result !== null);
14
+ assert.ok(result.includes('/src/index.ts'));
15
+ assert.ok(result.includes('reading'));
16
+ });
17
+ it('extracts file_path from Write tool', () => {
18
+ const result = summarizeToolArgs('Write', JSON.stringify({ file_path: '/out/file.txt' }));
19
+ assert.ok(result !== null);
20
+ assert.ok(result.includes('/out/file.txt'));
21
+ assert.ok(result.includes('writing'));
22
+ });
23
+ it('extracts file_path from Edit tool', () => {
24
+ const result = summarizeToolArgs('Edit', JSON.stringify({ file_path: '/src/app.ts' }));
25
+ assert.ok(result !== null);
26
+ assert.ok(result.includes('/src/app.ts'));
27
+ assert.ok(result.includes('editing'));
28
+ });
29
+ it('extracts pattern from Grep tool', () => {
30
+ const result = summarizeToolArgs('Grep', JSON.stringify({ pattern: 'TODO' }));
31
+ assert.ok(result !== null);
32
+ assert.ok(result.includes('pattern: TODO'));
33
+ });
34
+ it('returns null for unknown tool', () => {
35
+ const result = summarizeToolArgs('UnknownTool', JSON.stringify({ foo: 'bar' }));
36
+ assert.strictEqual(result, null);
37
+ });
38
+ it('returns null for malformed JSON', () => {
39
+ const result = summarizeToolArgs('Bash', 'not valid json {{');
40
+ assert.strictEqual(result, null);
41
+ });
42
+ it('returns null for malformed JSON on file tools', () => {
43
+ const result = summarizeToolArgs('Read', '{broken json');
44
+ // Falls back to regex; if no path/file match, returns null
45
+ assert.ok(result === null || typeof result === 'string');
46
+ });
47
+ });
48
+ describe('formatToolArgs', () => {
49
+ it('returns file_path when present', () => {
50
+ const result = formatToolArgs('Read', { file_path: '/src/index.ts' });
51
+ assert.strictEqual(result, '/src/index.ts');
52
+ });
53
+ it('returns command prefixed with $ when present', () => {
54
+ const result = formatToolArgs('Bash', { command: 'echo hello' });
55
+ assert.strictEqual(result, '$ echo hello');
56
+ });
57
+ it('returns pattern when present', () => {
58
+ const result = formatToolArgs('Grep', { pattern: 'TODO' });
59
+ assert.strictEqual(result, 'pattern: TODO');
60
+ });
61
+ it('falls back to JSON.stringify for unknown args', () => {
62
+ const args = { foo: 'bar' };
63
+ const result = formatToolArgs('UnknownTool', args);
64
+ assert.strictEqual(result, JSON.stringify(args));
65
+ });
66
+ });
67
+ //# sourceMappingURL=tool-summary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-summary.test.js","sourceRoot":"","sources":["../../src/utils/tool-summary.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhijiewang/openharness",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Open-source terminal coding agent. Works with any LLM.",
5
5
  "type": "module",
6
6
  "bin": {