@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,69 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { CellGrid, EMPTY_STYLE, cellsEqual } from './cells.js';
|
|
4
|
+
describe('CellGrid', () => {
|
|
5
|
+
it('initializes with spaces', () => {
|
|
6
|
+
const grid = new CellGrid(10, 5);
|
|
7
|
+
assert.strictEqual(grid.width, 10);
|
|
8
|
+
assert.strictEqual(grid.height, 5);
|
|
9
|
+
assert.strictEqual(grid.cells[0][0].char, ' ');
|
|
10
|
+
});
|
|
11
|
+
it('setCell writes a character with style', () => {
|
|
12
|
+
const grid = new CellGrid(10, 5);
|
|
13
|
+
grid.setCell(0, 0, 'A', { fg: 'red', bg: null, bold: true, dim: false, underline: false });
|
|
14
|
+
assert.strictEqual(grid.cells[0][0].char, 'A');
|
|
15
|
+
assert.strictEqual(grid.cells[0][0].style.fg, 'red');
|
|
16
|
+
assert.strictEqual(grid.cells[0][0].style.bold, true);
|
|
17
|
+
});
|
|
18
|
+
it('setCell ignores out-of-bounds', () => {
|
|
19
|
+
const grid = new CellGrid(5, 5);
|
|
20
|
+
grid.setCell(-1, 0, 'X', EMPTY_STYLE);
|
|
21
|
+
grid.setCell(0, 10, 'X', EMPTY_STYLE);
|
|
22
|
+
// Should not throw
|
|
23
|
+
assert.strictEqual(grid.cells[0][0].char, ' ');
|
|
24
|
+
});
|
|
25
|
+
it('writeText handles newlines', () => {
|
|
26
|
+
const grid = new CellGrid(20, 5);
|
|
27
|
+
const rows = grid.writeText(0, 0, 'ab\ncd', EMPTY_STYLE);
|
|
28
|
+
assert.strictEqual(rows, 2);
|
|
29
|
+
assert.strictEqual(grid.cells[0][0].char, 'a');
|
|
30
|
+
assert.strictEqual(grid.cells[1][0].char, 'c');
|
|
31
|
+
});
|
|
32
|
+
it('writeWrapped wraps long words', () => {
|
|
33
|
+
const grid = new CellGrid(10, 5);
|
|
34
|
+
const rows = grid.writeWrapped(0, 0, 'hello world foo', EMPTY_STYLE, 10);
|
|
35
|
+
assert.ok(rows >= 2, `expected >= 2 rows, got ${rows}`);
|
|
36
|
+
});
|
|
37
|
+
it('clear resets all cells', () => {
|
|
38
|
+
const grid = new CellGrid(5, 5);
|
|
39
|
+
grid.setCell(0, 0, 'X', { fg: 'red', bg: null, bold: true, dim: false, underline: false });
|
|
40
|
+
grid.clear();
|
|
41
|
+
assert.strictEqual(grid.cells[0][0].char, ' ');
|
|
42
|
+
});
|
|
43
|
+
it('clone produces an independent copy', () => {
|
|
44
|
+
const grid = new CellGrid(5, 5);
|
|
45
|
+
grid.setCell(0, 0, 'A', EMPTY_STYLE);
|
|
46
|
+
const clone = grid.clone();
|
|
47
|
+
clone.setCell(0, 0, 'B', EMPTY_STYLE);
|
|
48
|
+
assert.strictEqual(grid.cells[0][0].char, 'A');
|
|
49
|
+
assert.strictEqual(clone.cells[0][0].char, 'B');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('cellsEqual', () => {
|
|
53
|
+
it('returns true for identical cells', () => {
|
|
54
|
+
const a = { char: 'A', style: { ...EMPTY_STYLE } };
|
|
55
|
+
const b = { char: 'A', style: { ...EMPTY_STYLE } };
|
|
56
|
+
assert.strictEqual(cellsEqual(a, b), true);
|
|
57
|
+
});
|
|
58
|
+
it('returns false for different chars', () => {
|
|
59
|
+
const a = { char: 'A', style: { ...EMPTY_STYLE } };
|
|
60
|
+
const b = { char: 'B', style: { ...EMPTY_STYLE } };
|
|
61
|
+
assert.strictEqual(cellsEqual(a, b), false);
|
|
62
|
+
});
|
|
63
|
+
it('returns false for different underline', () => {
|
|
64
|
+
const a = { char: 'A', style: { ...EMPTY_STYLE, underline: false } };
|
|
65
|
+
const b = { char: 'A', style: { ...EMPTY_STYLE, underline: true } };
|
|
66
|
+
assert.strictEqual(cellsEqual(a, b), false);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=cells.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cells.test.js","sourceRoot":"","sources":["../../src/renderer/cells.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff rendering for CellGrid — used in the permission prompt
|
|
3
|
+
* to show inline diffs for write/edit tool calls.
|
|
4
|
+
*/
|
|
5
|
+
import type { CellGrid } from './cells.js';
|
|
6
|
+
export type DiffLine = {
|
|
7
|
+
type: 'add' | 'remove' | 'context' | 'separator';
|
|
8
|
+
line: string;
|
|
9
|
+
};
|
|
10
|
+
export type DiffInfo = {
|
|
11
|
+
filePath: string;
|
|
12
|
+
oldContent: string;
|
|
13
|
+
newContent: string;
|
|
14
|
+
oldString?: string;
|
|
15
|
+
newString?: string;
|
|
16
|
+
cachedDisplay?: DiffLine[];
|
|
17
|
+
cachedAdds?: number;
|
|
18
|
+
cachedRemoves?: number;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Try to extract file info and compute diff from tool args JSON.
|
|
22
|
+
* Returns null if not applicable.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractDiffInfo(toolName: string, argsJson: string): DiffInfo | null;
|
|
25
|
+
/**
|
|
26
|
+
* Render a diff into the CellGrid starting at (row, col).
|
|
27
|
+
* Returns the number of rows consumed.
|
|
28
|
+
*/
|
|
29
|
+
/** Pre-compute and cache the diff for a DiffInfo. Call once, not per frame. */
|
|
30
|
+
export declare function prepareDiff(diffInfo: DiffInfo, maxLines?: number): void;
|
|
31
|
+
export declare function renderDiff(grid: CellGrid, row: number, col: number, diffInfo: DiffInfo, width: number, maxLines?: number): number;
|
|
32
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/renderer/diff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAyB3C,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAsBnF;AAED;;;GAGG;AACH,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,SAAK,GAAG,IAAI,CAOnE;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,SAAK,GACZ,MAAM,CA8CR"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff rendering for CellGrid — used in the permission prompt
|
|
3
|
+
* to show inline diffs for write/edit tool calls.
|
|
4
|
+
*/
|
|
5
|
+
import { computeDiff, filterWithContext } from '../utils/diff-algorithm.js';
|
|
6
|
+
import { getTheme } from '../utils/theme-data.js';
|
|
7
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
8
|
+
const s = (fg, bold = false, dim = false) => ({ fg, bg: null, bold, dim, underline: false });
|
|
9
|
+
const S_CONTEXT = s(null, false, true);
|
|
10
|
+
const S_SEPARATOR = s(null, false, true);
|
|
11
|
+
const S_HEADER = s(null, false, true);
|
|
12
|
+
// Theme-dependent (lazy)
|
|
13
|
+
let S_ADD, S_REMOVE, S_STAT_ADD, S_STAT_REMOVE;
|
|
14
|
+
let _diffStylesInit = false;
|
|
15
|
+
function ensureDiffStyles() {
|
|
16
|
+
if (_diffStylesInit)
|
|
17
|
+
return;
|
|
18
|
+
_diffStylesInit = true;
|
|
19
|
+
const t = getTheme();
|
|
20
|
+
S_ADD = s(t.diffAdded);
|
|
21
|
+
S_REMOVE = s(t.diffRemoved);
|
|
22
|
+
S_STAT_ADD = s(t.diffAdded, true);
|
|
23
|
+
S_STAT_REMOVE = s(t.diffRemoved, true);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Try to extract file info and compute diff from tool args JSON.
|
|
27
|
+
* Returns null if not applicable.
|
|
28
|
+
*/
|
|
29
|
+
export function extractDiffInfo(toolName, argsJson) {
|
|
30
|
+
try {
|
|
31
|
+
const args = JSON.parse(argsJson);
|
|
32
|
+
const name = toolName.toLowerCase();
|
|
33
|
+
if (name.includes('write') && args.file_path && args.content) {
|
|
34
|
+
const old = existsSync(args.file_path) ? readFileSync(args.file_path, 'utf-8') : '';
|
|
35
|
+
return { filePath: args.file_path, oldContent: old, newContent: args.content };
|
|
36
|
+
}
|
|
37
|
+
if (name.includes('edit') && args.file_path && args.old_string && args.new_string) {
|
|
38
|
+
if (existsSync(args.file_path)) {
|
|
39
|
+
const old = readFileSync(args.file_path, 'utf-8');
|
|
40
|
+
const newContent = old.replace(args.old_string, args.new_string);
|
|
41
|
+
return { filePath: args.file_path, oldContent: old, newContent, oldString: args.old_string, newString: args.new_string };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Render a diff into the CellGrid starting at (row, col).
|
|
52
|
+
* Returns the number of rows consumed.
|
|
53
|
+
*/
|
|
54
|
+
/** Pre-compute and cache the diff for a DiffInfo. Call once, not per frame. */
|
|
55
|
+
export function prepareDiff(diffInfo, maxLines = 20) {
|
|
56
|
+
if (diffInfo.cachedDisplay)
|
|
57
|
+
return;
|
|
58
|
+
const rawDiff = computeDiff(diffInfo.oldContent, diffInfo.newContent);
|
|
59
|
+
const filtered = filterWithContext(rawDiff);
|
|
60
|
+
diffInfo.cachedDisplay = filtered.slice(0, maxLines);
|
|
61
|
+
diffInfo.cachedAdds = rawDiff.filter(d => d.type === 'add').length;
|
|
62
|
+
diffInfo.cachedRemoves = rawDiff.filter(d => d.type === 'remove').length;
|
|
63
|
+
}
|
|
64
|
+
export function renderDiff(grid, row, col, diffInfo, width, maxLines = 20) {
|
|
65
|
+
ensureDiffStyles();
|
|
66
|
+
prepareDiff(diffInfo, maxLines);
|
|
67
|
+
const display = diffInfo.cachedDisplay;
|
|
68
|
+
const adds = diffInfo.cachedAdds;
|
|
69
|
+
const removes = diffInfo.cachedRemoves;
|
|
70
|
+
let r = row;
|
|
71
|
+
const maxCol = width - col;
|
|
72
|
+
// Header: file path
|
|
73
|
+
grid.writeText(r, col, `─── ${diffInfo.filePath} ───`, S_HEADER);
|
|
74
|
+
r++;
|
|
75
|
+
// Stats
|
|
76
|
+
if (r < grid.height) {
|
|
77
|
+
grid.writeText(r, col, `+${adds}`, S_STAT_ADD);
|
|
78
|
+
grid.writeText(r, col + `+${adds}`.length, ' ', S_CONTEXT);
|
|
79
|
+
grid.writeText(r, col + `+${adds}`.length + 1, `-${removes}`, S_STAT_REMOVE);
|
|
80
|
+
r++;
|
|
81
|
+
}
|
|
82
|
+
// Diff lines
|
|
83
|
+
for (const d of display) {
|
|
84
|
+
if (r >= grid.height)
|
|
85
|
+
break;
|
|
86
|
+
if (d.type === 'separator') {
|
|
87
|
+
grid.writeText(r, col, ' ...', S_SEPARATOR);
|
|
88
|
+
r++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const prefix = d.type === 'add' ? '+ ' : d.type === 'remove' ? '- ' : ' ';
|
|
92
|
+
const style = d.type === 'add' ? S_ADD : d.type === 'remove' ? S_REMOVE : S_CONTEXT;
|
|
93
|
+
const lineText = (prefix + d.line).slice(0, maxCol);
|
|
94
|
+
grid.writeText(r, col, lineText, style);
|
|
95
|
+
r++;
|
|
96
|
+
}
|
|
97
|
+
if (display.length >= maxLines && r < grid.height) {
|
|
98
|
+
grid.writeText(r, col, ` ... (more lines)`, S_SEPARATOR);
|
|
99
|
+
r++;
|
|
100
|
+
}
|
|
101
|
+
return r - row;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/renderer/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cell-level differ — compares two CellGrids and produces minimal ANSI output.
|
|
3
|
+
*/
|
|
4
|
+
import type { Style, CellGrid } from './cells.js';
|
|
5
|
+
/** Convert a Style to an SGR escape sequence */
|
|
6
|
+
export declare function styleToSGR(style: Style): string;
|
|
7
|
+
/**
|
|
8
|
+
* Compare two grids and return the ANSI string that transforms prev into next.
|
|
9
|
+
* Only emits escape sequences for changed cells.
|
|
10
|
+
*/
|
|
11
|
+
export declare function diff(prev: CellGrid, next: CellGrid): string;
|
|
12
|
+
/**
|
|
13
|
+
* Write ANSI output wrapped in DEC 2026 synchronized output markers.
|
|
14
|
+
* Terminals that support this will buffer all output and paint atomically.
|
|
15
|
+
*/
|
|
16
|
+
export declare function syncWrite(output: string): void;
|
|
17
|
+
/** Clear the entire screen */
|
|
18
|
+
export declare function clearScreen(): void;
|
|
19
|
+
/** Hide cursor */
|
|
20
|
+
export declare function hideCursor(): void;
|
|
21
|
+
/** Show cursor */
|
|
22
|
+
export declare function showCursor(): void;
|
|
23
|
+
/** Move cursor to position */
|
|
24
|
+
export declare function moveCursor(row: number, col: number): void;
|
|
25
|
+
//# sourceMappingURL=differ.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../../src/renderer/differ.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAelD,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAQ/C;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAqC3D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,kBAAkB;AAClB,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,kBAAkB;AAClB,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,8BAA8B;AAC9B,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cell-level differ — compares two CellGrids and produces minimal ANSI output.
|
|
3
|
+
*/
|
|
4
|
+
import { cellsEqual } from './cells.js';
|
|
5
|
+
const FG_CODES = {
|
|
6
|
+
black: 30, red: 31, green: 32, yellow: 33, blue: 34,
|
|
7
|
+
magenta: 35, cyan: 36, white: 37,
|
|
8
|
+
gray: 90, brightRed: 91, brightGreen: 92, brightYellow: 93,
|
|
9
|
+
brightBlue: 94, brightMagenta: 95, brightCyan: 96, brightWhite: 97,
|
|
10
|
+
};
|
|
11
|
+
const BG_CODES = {
|
|
12
|
+
black: 40, red: 41, green: 42, yellow: 43, blue: 44,
|
|
13
|
+
magenta: 45, cyan: 46, white: 47,
|
|
14
|
+
};
|
|
15
|
+
/** Convert a Style to an SGR escape sequence */
|
|
16
|
+
export function styleToSGR(style) {
|
|
17
|
+
const codes = [0]; // reset first
|
|
18
|
+
if (style.bold)
|
|
19
|
+
codes.push(1);
|
|
20
|
+
if (style.dim)
|
|
21
|
+
codes.push(2);
|
|
22
|
+
if (style.underline)
|
|
23
|
+
codes.push(4);
|
|
24
|
+
if (style.fg && FG_CODES[style.fg])
|
|
25
|
+
codes.push(FG_CODES[style.fg]);
|
|
26
|
+
if (style.bg && BG_CODES[style.bg])
|
|
27
|
+
codes.push(BG_CODES[style.bg]);
|
|
28
|
+
return `\x1b[${codes.join(';')}m`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Compare two grids and return the ANSI string that transforms prev into next.
|
|
32
|
+
* Only emits escape sequences for changed cells.
|
|
33
|
+
*/
|
|
34
|
+
export function diff(prev, next) {
|
|
35
|
+
const parts = [];
|
|
36
|
+
let lastStyle = null;
|
|
37
|
+
let expectedRow = -1;
|
|
38
|
+
let expectedCol = -1;
|
|
39
|
+
for (let r = 0; r < next.height; r++) {
|
|
40
|
+
for (let c = 0; c < next.width; c++) {
|
|
41
|
+
const prevCell = r < prev.height && c < prev.width ? prev.cells[r][c] : null;
|
|
42
|
+
const nextCell = next.cells[r][c];
|
|
43
|
+
if (prevCell && cellsEqual(prevCell, nextCell))
|
|
44
|
+
continue;
|
|
45
|
+
// Position cursor if not already there
|
|
46
|
+
if (r !== expectedRow || c !== expectedCol) {
|
|
47
|
+
parts.push(`\x1b[${r + 1};${c + 1}H`);
|
|
48
|
+
}
|
|
49
|
+
// Apply style if changed
|
|
50
|
+
const sgr = styleToSGR(nextCell.style);
|
|
51
|
+
if (sgr !== lastStyle) {
|
|
52
|
+
parts.push(sgr);
|
|
53
|
+
lastStyle = sgr;
|
|
54
|
+
}
|
|
55
|
+
parts.push(nextCell.char);
|
|
56
|
+
expectedRow = r;
|
|
57
|
+
expectedCol = c + 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Reset style at end
|
|
61
|
+
if (parts.length > 0) {
|
|
62
|
+
parts.push('\x1b[0m');
|
|
63
|
+
}
|
|
64
|
+
return parts.join('');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Write ANSI output wrapped in DEC 2026 synchronized output markers.
|
|
68
|
+
* Terminals that support this will buffer all output and paint atomically.
|
|
69
|
+
*/
|
|
70
|
+
export function syncWrite(output) {
|
|
71
|
+
if (!output)
|
|
72
|
+
return;
|
|
73
|
+
process.stdout.write('\x1b[?2026h' + output + '\x1b[?2026l');
|
|
74
|
+
}
|
|
75
|
+
/** Clear the entire screen */
|
|
76
|
+
export function clearScreen() {
|
|
77
|
+
process.stdout.write('\x1b[2J\x1b[H');
|
|
78
|
+
}
|
|
79
|
+
/** Hide cursor */
|
|
80
|
+
export function hideCursor() {
|
|
81
|
+
process.stdout.write('\x1b[?25l');
|
|
82
|
+
}
|
|
83
|
+
/** Show cursor */
|
|
84
|
+
export function showCursor() {
|
|
85
|
+
process.stdout.write('\x1b[?25h');
|
|
86
|
+
}
|
|
87
|
+
/** Move cursor to position */
|
|
88
|
+
export function moveCursor(row, col) {
|
|
89
|
+
process.stdout.write(`\x1b[${row + 1};${col + 1}H`);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=differ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"differ.js","sourceRoot":"","sources":["../../src/renderer/differ.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.test.d.ts","sourceRoot":"","sources":["../../src/renderer/e2e.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end test for the cell renderer REPL.
|
|
3
|
+
* Tests the full state machine: message → render → tool call → complete.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
import { CellGrid } from './cells.js';
|
|
8
|
+
import { rasterize } from './layout.js';
|
|
9
|
+
import { setActiveTheme } from '../utils/theme-data.js';
|
|
10
|
+
setActiveTheme('dark');
|
|
11
|
+
function makeState(overrides = {}) {
|
|
12
|
+
return {
|
|
13
|
+
messages: [],
|
|
14
|
+
streamingText: '',
|
|
15
|
+
thinkingText: '',
|
|
16
|
+
toolCalls: new Map(),
|
|
17
|
+
inputText: '',
|
|
18
|
+
inputCursor: 0,
|
|
19
|
+
companionLines: null,
|
|
20
|
+
companionColor: 'cyan',
|
|
21
|
+
statusHints: 'exit to quit',
|
|
22
|
+
statusLine: '',
|
|
23
|
+
contextWarning: null,
|
|
24
|
+
errorText: null,
|
|
25
|
+
loading: false,
|
|
26
|
+
spinnerFrame: 0,
|
|
27
|
+
thinkingStartedAt: null,
|
|
28
|
+
tokenCount: 0,
|
|
29
|
+
vimMode: null,
|
|
30
|
+
permissionBox: null,
|
|
31
|
+
permissionDiffVisible: false,
|
|
32
|
+
permissionDiffInfo: null,
|
|
33
|
+
expandedToolCalls: new Set(),
|
|
34
|
+
questionPrompt: null,
|
|
35
|
+
manualScroll: 0,
|
|
36
|
+
codeBlocksExpanded: false,
|
|
37
|
+
sessionBrowser: null,
|
|
38
|
+
...overrides,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function gridText(grid, row) {
|
|
42
|
+
return grid.cells[row].map(c => c.char).join('').trimEnd();
|
|
43
|
+
}
|
|
44
|
+
describe('E2E: REPL state machine', () => {
|
|
45
|
+
it('renders empty state with input prompt', () => {
|
|
46
|
+
const state = makeState();
|
|
47
|
+
const grid = new CellGrid(80, 24);
|
|
48
|
+
const cursor = rasterize(state, grid);
|
|
49
|
+
// Should show input prompt
|
|
50
|
+
const inputLine = gridText(grid, cursor.cursorRow);
|
|
51
|
+
assert.ok(inputLine.includes('❯'), 'Should show input prompt');
|
|
52
|
+
});
|
|
53
|
+
it('renders user message', () => {
|
|
54
|
+
const state = makeState({
|
|
55
|
+
messages: [{
|
|
56
|
+
role: 'user',
|
|
57
|
+
content: 'hello world',
|
|
58
|
+
uuid: 'u1',
|
|
59
|
+
timestamp: Date.now(),
|
|
60
|
+
}],
|
|
61
|
+
});
|
|
62
|
+
const grid = new CellGrid(80, 24);
|
|
63
|
+
rasterize(state, grid);
|
|
64
|
+
const line0 = gridText(grid, 0);
|
|
65
|
+
assert.ok(line0.includes('hello world'), `Expected user message, got: ${line0}`);
|
|
66
|
+
});
|
|
67
|
+
it('renders assistant message with markdown', () => {
|
|
68
|
+
const state = makeState({
|
|
69
|
+
messages: [
|
|
70
|
+
{ role: 'user', content: 'hi', uuid: 'u1', timestamp: Date.now() },
|
|
71
|
+
{ role: 'assistant', content: '# Hello\n\nWorld', uuid: 'a1', timestamp: Date.now() },
|
|
72
|
+
],
|
|
73
|
+
});
|
|
74
|
+
const grid = new CellGrid(80, 24);
|
|
75
|
+
rasterize(state, grid);
|
|
76
|
+
// Find the heading
|
|
77
|
+
let found = false;
|
|
78
|
+
for (let r = 0; r < grid.height; r++) {
|
|
79
|
+
const line = gridText(grid, r);
|
|
80
|
+
if (line.includes('# Hello')) {
|
|
81
|
+
found = true;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
assert.ok(found, 'Should render markdown heading');
|
|
86
|
+
});
|
|
87
|
+
it('renders spinner when loading with no streaming text', () => {
|
|
88
|
+
const state = makeState({
|
|
89
|
+
loading: true,
|
|
90
|
+
thinkingStartedAt: Date.now(),
|
|
91
|
+
});
|
|
92
|
+
const grid = new CellGrid(80, 24);
|
|
93
|
+
rasterize(state, grid);
|
|
94
|
+
let found = false;
|
|
95
|
+
for (let r = 0; r < grid.height; r++) {
|
|
96
|
+
if (gridText(grid, r).includes('Thinking')) {
|
|
97
|
+
found = true;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
assert.ok(found, 'Should show shimmer spinner');
|
|
102
|
+
});
|
|
103
|
+
it('renders streaming text', () => {
|
|
104
|
+
const state = makeState({
|
|
105
|
+
loading: true,
|
|
106
|
+
streamingText: 'partial response text',
|
|
107
|
+
});
|
|
108
|
+
const grid = new CellGrid(80, 24);
|
|
109
|
+
rasterize(state, grid);
|
|
110
|
+
let found = false;
|
|
111
|
+
for (let r = 0; r < grid.height; r++) {
|
|
112
|
+
if (gridText(grid, r).includes('partial response')) {
|
|
113
|
+
found = true;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
assert.ok(found, 'Should render streaming text');
|
|
118
|
+
});
|
|
119
|
+
it('renders tool calls with status icons', () => {
|
|
120
|
+
const toolCalls = new Map();
|
|
121
|
+
toolCalls.set('tc1', { toolName: 'Read', status: 'done', args: '/path/to/file.ts', output: 'file content' });
|
|
122
|
+
toolCalls.set('tc2', { toolName: 'Bash', status: 'running', args: '$ npm test' });
|
|
123
|
+
const state = makeState({ toolCalls, loading: true, thinkingStartedAt: Date.now() });
|
|
124
|
+
const grid = new CellGrid(80, 24);
|
|
125
|
+
rasterize(state, grid);
|
|
126
|
+
let foundRead = false, foundBash = false;
|
|
127
|
+
for (let r = 0; r < grid.height; r++) {
|
|
128
|
+
const line = gridText(grid, r);
|
|
129
|
+
if (line.includes('Read') && line.includes('✓'))
|
|
130
|
+
foundRead = true;
|
|
131
|
+
if (line.includes('Bash') && line.includes('⠋'))
|
|
132
|
+
foundBash = true;
|
|
133
|
+
}
|
|
134
|
+
assert.ok(foundRead, 'Should show completed tool with ✓');
|
|
135
|
+
assert.ok(foundBash, 'Should show running tool with spinner');
|
|
136
|
+
});
|
|
137
|
+
it('renders permission prompt box', () => {
|
|
138
|
+
const state = makeState({
|
|
139
|
+
permissionBox: { toolName: 'Bash', description: '{"command":"rm -rf /"}', riskLevel: 'high', suggestion: '$ rm -rf /' },
|
|
140
|
+
});
|
|
141
|
+
const grid = new CellGrid(80, 24);
|
|
142
|
+
rasterize(state, grid);
|
|
143
|
+
let foundTool = false, foundYN = false;
|
|
144
|
+
for (let r = 0; r < grid.height; r++) {
|
|
145
|
+
const line = gridText(grid, r);
|
|
146
|
+
if (line.includes('Bash') && line.includes('high risk'))
|
|
147
|
+
foundTool = true;
|
|
148
|
+
if (line.includes('[Y]es') && line.includes('[N]o'))
|
|
149
|
+
foundYN = true;
|
|
150
|
+
}
|
|
151
|
+
assert.ok(foundTool, 'Should show tool name and risk');
|
|
152
|
+
assert.ok(foundYN, 'Should show Y/N options');
|
|
153
|
+
});
|
|
154
|
+
it('renders status line', () => {
|
|
155
|
+
const state = makeState({
|
|
156
|
+
statusLine: 'gemma3:12b │ 1.2K↑ 500↓ │ $0.0100',
|
|
157
|
+
});
|
|
158
|
+
const grid = new CellGrid(80, 24);
|
|
159
|
+
rasterize(state, grid);
|
|
160
|
+
let found = false;
|
|
161
|
+
for (let r = 0; r < grid.height; r++) {
|
|
162
|
+
if (gridText(grid, r).includes('gemma3:12b')) {
|
|
163
|
+
found = true;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
assert.ok(found, 'Should show status line with model info');
|
|
168
|
+
});
|
|
169
|
+
it('renders context warning', () => {
|
|
170
|
+
const state = makeState({
|
|
171
|
+
contextWarning: { text: '⚠ Context ~85% full — consider /compact', critical: false },
|
|
172
|
+
});
|
|
173
|
+
const grid = new CellGrid(80, 24);
|
|
174
|
+
rasterize(state, grid);
|
|
175
|
+
let found = false;
|
|
176
|
+
for (let r = 0; r < grid.height; r++) {
|
|
177
|
+
if (gridText(grid, r).includes('Context ~85%')) {
|
|
178
|
+
found = true;
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
assert.ok(found, 'Should show context warning');
|
|
183
|
+
});
|
|
184
|
+
it('renders error message', () => {
|
|
185
|
+
const state = makeState({
|
|
186
|
+
errorText: 'Connection refused',
|
|
187
|
+
});
|
|
188
|
+
const grid = new CellGrid(80, 24);
|
|
189
|
+
rasterize(state, grid);
|
|
190
|
+
let found = false;
|
|
191
|
+
for (let r = 0; r < grid.height; r++) {
|
|
192
|
+
if (gridText(grid, r).includes('Connection refused')) {
|
|
193
|
+
found = true;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
assert.ok(found, 'Should show error text');
|
|
198
|
+
});
|
|
199
|
+
it('renders question prompt', () => {
|
|
200
|
+
const state = makeState({
|
|
201
|
+
questionPrompt: { question: 'What is your name?', options: ['Alice', 'Bob'], input: 'Al', cursor: 2 },
|
|
202
|
+
});
|
|
203
|
+
const grid = new CellGrid(80, 24);
|
|
204
|
+
const cursor = rasterize(state, grid);
|
|
205
|
+
let foundQ = false;
|
|
206
|
+
for (let r = 0; r < grid.height; r++) {
|
|
207
|
+
if (gridText(grid, r).includes('What is your name?')) {
|
|
208
|
+
foundQ = true;
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
assert.ok(foundQ, 'Should show question');
|
|
213
|
+
// Cursor should be positioned in the question input
|
|
214
|
+
assert.strictEqual(cursor.cursorCol, 5 + 2, 'Cursor should be at input position');
|
|
215
|
+
});
|
|
216
|
+
it('scrollback navigation changes visible content', () => {
|
|
217
|
+
const messages = Array.from({ length: 50 }, (_, i) => ({
|
|
218
|
+
role: 'user',
|
|
219
|
+
content: `Message ${i}`,
|
|
220
|
+
uuid: `u${i}`,
|
|
221
|
+
timestamp: Date.now(),
|
|
222
|
+
}));
|
|
223
|
+
const grid1 = new CellGrid(80, 24);
|
|
224
|
+
const state1 = makeState({ messages, manualScroll: 0 });
|
|
225
|
+
rasterize(state1, grid1);
|
|
226
|
+
const grid2 = new CellGrid(80, 24);
|
|
227
|
+
const state2 = makeState({ messages, manualScroll: 20 });
|
|
228
|
+
rasterize(state2, grid2);
|
|
229
|
+
// The two grids should show different content
|
|
230
|
+
const line1 = gridText(grid1, 0);
|
|
231
|
+
const line2 = gridText(grid2, 0);
|
|
232
|
+
assert.notStrictEqual(line1, line2, 'Scrolled view should show different content');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.test.js","sourceRoot":"","sources":["../../src/renderer/e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal image rendering.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Kitty graphics protocol (kitty, WezTerm, Ghostty)
|
|
6
|
+
* - iTerm2 inline images (iTerm2, WezTerm)
|
|
7
|
+
* - Fallback: display file path and dimensions
|
|
8
|
+
*
|
|
9
|
+
* Detection order: TERM_PROGRAM → TERM → fallback
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Check if a tool output contains an image result.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isImageOutput(output: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Render an image inline in the terminal.
|
|
17
|
+
* Returns the ANSI escape sequence to display the image,
|
|
18
|
+
* or a text fallback if the terminal doesn't support graphics.
|
|
19
|
+
*/
|
|
20
|
+
export declare function renderImageInline(output: string, maxWidth?: number, maxHeight?: number): string;
|
|
21
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/renderer/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsBH;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAgBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,SAAK,EACb,SAAS,SAAK,GACb,MAAM,CAgBR"}
|