@zhijiewang/openharness 0.6.1 → 0.7.1
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/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +10 -0
- 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/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 +41 -20
- 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/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/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/main.js +26 -3
- package/dist/main.js.map +1 -1
- 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 +33 -0
- package/dist/renderer/diff.d.ts.map +1 -0
- package/dist/renderer/diff.js +104 -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 +237 -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 +76 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +350 -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 +67 -0
- package/dist/renderer/layout.d.ts.map +1 -0
- package/dist/renderer/layout.js +439 -0
- package/dist/renderer/layout.js.map +1 -0
- package/dist/renderer/markdown.d.ts +19 -0
- package/dist/renderer/markdown.d.ts.map +1 -0
- package/dist/renderer/markdown.js +431 -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 +123 -0
- package/dist/renderer/perf.test.js.map +1 -0
- package/dist/renderer/session-browser.d.ts +34 -0
- package/dist/renderer/session-browser.d.ts.map +1 -0
- package/dist/renderer/session-browser.js +130 -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 +535 -0
- package/dist/repl.js.map +1 -0
- package/dist/tools/GrepTool/index.d.ts +2 -2
- package/dist/types/message.d.ts +1 -0
- package/dist/types/message.d.ts.map +1 -1
- 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,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,237 @@
|
|
|
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
|
+
autocomplete: [],
|
|
36
|
+
autocompleteIndex: -1,
|
|
37
|
+
manualScroll: 0,
|
|
38
|
+
codeBlocksExpanded: false,
|
|
39
|
+
sessionBrowser: null,
|
|
40
|
+
...overrides,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function gridText(grid, row) {
|
|
44
|
+
return grid.cells[row].map(c => c.char).join('').trimEnd();
|
|
45
|
+
}
|
|
46
|
+
describe('E2E: REPL state machine', () => {
|
|
47
|
+
it('renders empty state with input prompt', () => {
|
|
48
|
+
const state = makeState();
|
|
49
|
+
const grid = new CellGrid(80, 24);
|
|
50
|
+
const cursor = rasterize(state, grid);
|
|
51
|
+
// Should show input prompt
|
|
52
|
+
const inputLine = gridText(grid, cursor.cursorRow);
|
|
53
|
+
assert.ok(inputLine.includes('❯'), 'Should show input prompt');
|
|
54
|
+
});
|
|
55
|
+
it('renders user message', () => {
|
|
56
|
+
const state = makeState({
|
|
57
|
+
messages: [{
|
|
58
|
+
role: 'user',
|
|
59
|
+
content: 'hello world',
|
|
60
|
+
uuid: 'u1',
|
|
61
|
+
timestamp: Date.now(),
|
|
62
|
+
}],
|
|
63
|
+
});
|
|
64
|
+
const grid = new CellGrid(80, 24);
|
|
65
|
+
rasterize(state, grid);
|
|
66
|
+
const line0 = gridText(grid, 0);
|
|
67
|
+
assert.ok(line0.includes('hello world'), `Expected user message, got: ${line0}`);
|
|
68
|
+
});
|
|
69
|
+
it('renders assistant message with markdown', () => {
|
|
70
|
+
const state = makeState({
|
|
71
|
+
messages: [
|
|
72
|
+
{ role: 'user', content: 'hi', uuid: 'u1', timestamp: Date.now() },
|
|
73
|
+
{ role: 'assistant', content: '# Hello\n\nWorld', uuid: 'a1', timestamp: Date.now() },
|
|
74
|
+
],
|
|
75
|
+
});
|
|
76
|
+
const grid = new CellGrid(80, 24);
|
|
77
|
+
rasterize(state, grid);
|
|
78
|
+
// Find the heading
|
|
79
|
+
let found = false;
|
|
80
|
+
for (let r = 0; r < grid.height; r++) {
|
|
81
|
+
const line = gridText(grid, r);
|
|
82
|
+
if (line.includes('# Hello')) {
|
|
83
|
+
found = true;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
assert.ok(found, 'Should render markdown heading');
|
|
88
|
+
});
|
|
89
|
+
it('renders spinner when loading with no streaming text', () => {
|
|
90
|
+
const state = makeState({
|
|
91
|
+
loading: true,
|
|
92
|
+
thinkingStartedAt: Date.now(),
|
|
93
|
+
});
|
|
94
|
+
const grid = new CellGrid(80, 24);
|
|
95
|
+
rasterize(state, grid);
|
|
96
|
+
let found = false;
|
|
97
|
+
for (let r = 0; r < grid.height; r++) {
|
|
98
|
+
if (gridText(grid, r).includes('Thinking')) {
|
|
99
|
+
found = true;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
assert.ok(found, 'Should show shimmer spinner');
|
|
104
|
+
});
|
|
105
|
+
it('renders streaming text', () => {
|
|
106
|
+
const state = makeState({
|
|
107
|
+
loading: true,
|
|
108
|
+
streamingText: 'partial response text',
|
|
109
|
+
});
|
|
110
|
+
const grid = new CellGrid(80, 24);
|
|
111
|
+
rasterize(state, grid);
|
|
112
|
+
let found = false;
|
|
113
|
+
for (let r = 0; r < grid.height; r++) {
|
|
114
|
+
if (gridText(grid, r).includes('partial response')) {
|
|
115
|
+
found = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
assert.ok(found, 'Should render streaming text');
|
|
120
|
+
});
|
|
121
|
+
it('renders tool calls with status icons', () => {
|
|
122
|
+
const toolCalls = new Map();
|
|
123
|
+
toolCalls.set('tc1', { toolName: 'Read', status: 'done', args: '/path/to/file.ts', output: 'file content' });
|
|
124
|
+
toolCalls.set('tc2', { toolName: 'Bash', status: 'running', args: '$ npm test' });
|
|
125
|
+
const state = makeState({ toolCalls, loading: true, thinkingStartedAt: Date.now() });
|
|
126
|
+
const grid = new CellGrid(80, 24);
|
|
127
|
+
rasterize(state, grid);
|
|
128
|
+
let foundRead = false, foundBash = false;
|
|
129
|
+
for (let r = 0; r < grid.height; r++) {
|
|
130
|
+
const line = gridText(grid, r);
|
|
131
|
+
if (line.includes('Read') && line.includes('✓'))
|
|
132
|
+
foundRead = true;
|
|
133
|
+
if (line.includes('Bash') && line.includes('⠋'))
|
|
134
|
+
foundBash = true;
|
|
135
|
+
}
|
|
136
|
+
assert.ok(foundRead, 'Should show completed tool with ✓');
|
|
137
|
+
assert.ok(foundBash, 'Should show running tool with spinner');
|
|
138
|
+
});
|
|
139
|
+
it('renders permission prompt box', () => {
|
|
140
|
+
const state = makeState({
|
|
141
|
+
permissionBox: { toolName: 'Bash', description: '{"command":"rm -rf /"}', riskLevel: 'high', suggestion: '$ rm -rf /' },
|
|
142
|
+
});
|
|
143
|
+
const grid = new CellGrid(80, 24);
|
|
144
|
+
rasterize(state, grid);
|
|
145
|
+
let foundTool = false, foundYN = false;
|
|
146
|
+
for (let r = 0; r < grid.height; r++) {
|
|
147
|
+
const line = gridText(grid, r);
|
|
148
|
+
if (line.includes('Bash') && line.includes('high risk'))
|
|
149
|
+
foundTool = true;
|
|
150
|
+
if (line.includes('[Y]es') && line.includes('[N]o'))
|
|
151
|
+
foundYN = true;
|
|
152
|
+
}
|
|
153
|
+
assert.ok(foundTool, 'Should show tool name and risk');
|
|
154
|
+
assert.ok(foundYN, 'Should show Y/N options');
|
|
155
|
+
});
|
|
156
|
+
it('renders status line', () => {
|
|
157
|
+
const state = makeState({
|
|
158
|
+
statusLine: 'gemma3:12b │ 1.2K↑ 500↓ │ $0.0100',
|
|
159
|
+
});
|
|
160
|
+
const grid = new CellGrid(80, 24);
|
|
161
|
+
rasterize(state, grid);
|
|
162
|
+
let found = false;
|
|
163
|
+
for (let r = 0; r < grid.height; r++) {
|
|
164
|
+
if (gridText(grid, r).includes('gemma3:12b')) {
|
|
165
|
+
found = true;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
assert.ok(found, 'Should show status line with model info');
|
|
170
|
+
});
|
|
171
|
+
it('renders context warning', () => {
|
|
172
|
+
const state = makeState({
|
|
173
|
+
contextWarning: { text: '⚠ Context ~85% full — consider /compact', critical: false },
|
|
174
|
+
});
|
|
175
|
+
const grid = new CellGrid(80, 24);
|
|
176
|
+
rasterize(state, grid);
|
|
177
|
+
let found = false;
|
|
178
|
+
for (let r = 0; r < grid.height; r++) {
|
|
179
|
+
if (gridText(grid, r).includes('Context ~85%')) {
|
|
180
|
+
found = true;
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
assert.ok(found, 'Should show context warning');
|
|
185
|
+
});
|
|
186
|
+
it('renders error message', () => {
|
|
187
|
+
const state = makeState({
|
|
188
|
+
errorText: 'Connection refused',
|
|
189
|
+
});
|
|
190
|
+
const grid = new CellGrid(80, 24);
|
|
191
|
+
rasterize(state, grid);
|
|
192
|
+
let found = false;
|
|
193
|
+
for (let r = 0; r < grid.height; r++) {
|
|
194
|
+
if (gridText(grid, r).includes('Connection refused')) {
|
|
195
|
+
found = true;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
assert.ok(found, 'Should show error text');
|
|
200
|
+
});
|
|
201
|
+
it('renders question prompt', () => {
|
|
202
|
+
const state = makeState({
|
|
203
|
+
questionPrompt: { question: 'What is your name?', options: ['Alice', 'Bob'], input: 'Al', cursor: 2 },
|
|
204
|
+
});
|
|
205
|
+
const grid = new CellGrid(80, 24);
|
|
206
|
+
const cursor = rasterize(state, grid);
|
|
207
|
+
let foundQ = false;
|
|
208
|
+
for (let r = 0; r < grid.height; r++) {
|
|
209
|
+
if (gridText(grid, r).includes('What is your name?')) {
|
|
210
|
+
foundQ = true;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
assert.ok(foundQ, 'Should show question');
|
|
215
|
+
// Cursor should be positioned in the question input
|
|
216
|
+
assert.strictEqual(cursor.cursorCol, 5 + 2, 'Cursor should be at input position');
|
|
217
|
+
});
|
|
218
|
+
it('scrollback navigation changes visible content', () => {
|
|
219
|
+
const messages = Array.from({ length: 50 }, (_, i) => ({
|
|
220
|
+
role: 'user',
|
|
221
|
+
content: `Message ${i}`,
|
|
222
|
+
uuid: `u${i}`,
|
|
223
|
+
timestamp: Date.now(),
|
|
224
|
+
}));
|
|
225
|
+
const grid1 = new CellGrid(80, 24);
|
|
226
|
+
const state1 = makeState({ messages, manualScroll: 0 });
|
|
227
|
+
rasterize(state1, grid1);
|
|
228
|
+
const grid2 = new CellGrid(80, 24);
|
|
229
|
+
const state2 = makeState({ messages, manualScroll: 20 });
|
|
230
|
+
rasterize(state2, grid2);
|
|
231
|
+
// The two grids should show different content
|
|
232
|
+
const line1 = gridText(grid1, 0);
|
|
233
|
+
const line2 = gridText(grid2, 0);
|
|
234
|
+
assert.notStrictEqual(line1, line2, 'Scrolled view should show different content');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
//# 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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
import { IMAGE_PREFIX } from '../tools/ImageReadTool/index.js';
|
|
12
|
+
function detectProtocol() {
|
|
13
|
+
const termProgram = process.env.TERM_PROGRAM?.toLowerCase() ?? '';
|
|
14
|
+
const term = process.env.TERM?.toLowerCase() ?? '';
|
|
15
|
+
if (termProgram.includes('kitty') || termProgram.includes('ghostty') || termProgram.includes('wezterm')) {
|
|
16
|
+
return 'kitty';
|
|
17
|
+
}
|
|
18
|
+
if (termProgram.includes('iterm') || termProgram.includes('wezterm')) {
|
|
19
|
+
return 'iterm';
|
|
20
|
+
}
|
|
21
|
+
if (term.includes('xterm-kitty')) {
|
|
22
|
+
return 'kitty';
|
|
23
|
+
}
|
|
24
|
+
return 'none';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if a tool output contains an image result.
|
|
28
|
+
*/
|
|
29
|
+
export function isImageOutput(output) {
|
|
30
|
+
return output.startsWith(IMAGE_PREFIX + ':');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse an image output string into its components.
|
|
34
|
+
*/
|
|
35
|
+
function parseImageOutput(output) {
|
|
36
|
+
if (!output.startsWith(IMAGE_PREFIX + ':'))
|
|
37
|
+
return null;
|
|
38
|
+
const rest = output.slice(IMAGE_PREFIX.length + 1);
|
|
39
|
+
const colonIdx = rest.indexOf(':');
|
|
40
|
+
if (colonIdx < 0)
|
|
41
|
+
return null;
|
|
42
|
+
return {
|
|
43
|
+
mediaType: rest.slice(0, colonIdx),
|
|
44
|
+
base64: rest.slice(colonIdx + 1),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Render an image inline in the terminal.
|
|
49
|
+
* Returns the ANSI escape sequence to display the image,
|
|
50
|
+
* or a text fallback if the terminal doesn't support graphics.
|
|
51
|
+
*/
|
|
52
|
+
export function renderImageInline(output, maxWidth = 60, maxHeight = 15) {
|
|
53
|
+
const parsed = parseImageOutput(output);
|
|
54
|
+
if (!parsed)
|
|
55
|
+
return '[image: parse error]';
|
|
56
|
+
const protocol = detectProtocol();
|
|
57
|
+
if (protocol === 'kitty') {
|
|
58
|
+
return renderKitty(parsed.base64, parsed.mediaType, maxWidth, maxHeight);
|
|
59
|
+
}
|
|
60
|
+
if (protocol === 'iterm') {
|
|
61
|
+
return renderIterm(parsed.base64, maxWidth, maxHeight);
|
|
62
|
+
}
|
|
63
|
+
// Fallback: show info
|
|
64
|
+
const sizeKB = Math.round(parsed.base64.length * 3 / 4 / 1024);
|
|
65
|
+
return `[image: ${parsed.mediaType}, ${sizeKB}KB]`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Kitty graphics protocol.
|
|
69
|
+
* Sends base64-encoded image data via escape sequences.
|
|
70
|
+
*/
|
|
71
|
+
function renderKitty(base64, mediaType, maxCols, maxRows) {
|
|
72
|
+
// Kitty protocol: ESC_P ... ESC\
|
|
73
|
+
// a=T (transmit), f=100 (PNG), t=d (direct), c=cols, r=rows
|
|
74
|
+
const chunks = [];
|
|
75
|
+
const chunkSize = 4096;
|
|
76
|
+
for (let i = 0; i < base64.length; i += chunkSize) {
|
|
77
|
+
const chunk = base64.slice(i, i + chunkSize);
|
|
78
|
+
const isLast = i + chunkSize >= base64.length;
|
|
79
|
+
const more = isLast ? 0 : 1;
|
|
80
|
+
if (i === 0) {
|
|
81
|
+
// First chunk: include metadata
|
|
82
|
+
chunks.push(`\x1b_Ga=T,f=100,t=d,c=${maxCols},r=${maxRows},m=${more};${chunk}\x1b\\`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
chunks.push(`\x1b_Gm=${more};${chunk}\x1b\\`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return chunks.join('');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* iTerm2 inline image protocol.
|
|
92
|
+
*/
|
|
93
|
+
function renderIterm(base64, maxWidth, maxHeight) {
|
|
94
|
+
const size = base64.length;
|
|
95
|
+
return `\x1b]1337;File=inline=1;size=${size};width=${maxWidth};height=${maxHeight}:${base64}\x07`;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/renderer/image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalRenderer — cell-level diffing terminal renderer.
|
|
3
|
+
* Replaces Ink for the REPL. Only writes changed characters to stdout.
|
|
4
|
+
*/
|
|
5
|
+
import { type ToolCallInfo } from './layout.js';
|
|
6
|
+
import { type KeyEvent } from './input.js';
|
|
7
|
+
import type { Message } from '../types/message.js';
|
|
8
|
+
export type { KeyEvent } from './input.js';
|
|
9
|
+
export type { LayoutState, ToolCallInfo } from './layout.js';
|
|
10
|
+
export declare class TerminalRenderer {
|
|
11
|
+
private current;
|
|
12
|
+
private previous;
|
|
13
|
+
private state;
|
|
14
|
+
private stopInput;
|
|
15
|
+
private animationTimer;
|
|
16
|
+
private renderPending;
|
|
17
|
+
private started;
|
|
18
|
+
private keypressHandler;
|
|
19
|
+
private permissionResolve;
|
|
20
|
+
permissionPrompt: {
|
|
21
|
+
toolName: string;
|
|
22
|
+
description: string;
|
|
23
|
+
riskLevel: string;
|
|
24
|
+
} | null;
|
|
25
|
+
private questionResolve;
|
|
26
|
+
private animationCallback;
|
|
27
|
+
constructor();
|
|
28
|
+
start(): void;
|
|
29
|
+
stop(): void;
|
|
30
|
+
setMessages(msgs: Message[]): void;
|
|
31
|
+
setStreamingText(text: string): void;
|
|
32
|
+
setThinkingText(text: string): void;
|
|
33
|
+
setError(text: string | null): void;
|
|
34
|
+
setLoading(loading: boolean): void;
|
|
35
|
+
setInputText(text: string): void;
|
|
36
|
+
setInputCursor(pos: number): void;
|
|
37
|
+
setCompanion(lines: string[] | null, color: string): void;
|
|
38
|
+
setStatusHints(text: string): void;
|
|
39
|
+
setAutocomplete(suggestions: string[], index: number): void;
|
|
40
|
+
setStatusLine(text: string): void;
|
|
41
|
+
setContextWarning(warning: {
|
|
42
|
+
text: string;
|
|
43
|
+
critical: boolean;
|
|
44
|
+
} | null): void;
|
|
45
|
+
setVimMode(mode: 'normal' | 'insert' | null): void;
|
|
46
|
+
setThinkingStartedAt(time: number | null): void;
|
|
47
|
+
setTokenCount(count: number): void;
|
|
48
|
+
scrollUp(rows: number): void;
|
|
49
|
+
scrollDown(rows: number): void;
|
|
50
|
+
scrollToBottom(): void;
|
|
51
|
+
toggleCodeBlockExpansion(): void;
|
|
52
|
+
openSessionBrowser(): void;
|
|
53
|
+
closeSessionBrowser(): void;
|
|
54
|
+
sessionBrowserUp(): void;
|
|
55
|
+
sessionBrowserDown(): void;
|
|
56
|
+
sessionBrowserSelect(): string | null;
|
|
57
|
+
sessionBrowserType(char: string): void;
|
|
58
|
+
sessionBrowserBackspace(): void;
|
|
59
|
+
isSessionBrowserOpen(): boolean;
|
|
60
|
+
setToolCall(callId: string, info: ToolCallInfo): void;
|
|
61
|
+
getToolCall(callId: string): ToolCallInfo | undefined;
|
|
62
|
+
clearToolCalls(): void;
|
|
63
|
+
/** Show a question prompt and wait for text answer */
|
|
64
|
+
askQuestion(question: string, options?: string[]): Promise<string>;
|
|
65
|
+
toggleToolCallExpanded(callId: string): void;
|
|
66
|
+
/** Cycle to next tool call and toggle its expansion */
|
|
67
|
+
cycleToolCallExpansion(): void;
|
|
68
|
+
/** Show permission prompt and wait for Y/N response */
|
|
69
|
+
askPermission(toolName: string, description: string, riskLevel: string): Promise<boolean>;
|
|
70
|
+
onKeypress(handler: (key: KeyEvent) => void): void;
|
|
71
|
+
onAnimation(handler: (frame: number) => void): void;
|
|
72
|
+
private scheduleRender;
|
|
73
|
+
private render;
|
|
74
|
+
private handleResize;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"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"}
|