@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.
Files changed (134) hide show
  1. package/README.md +46 -1
  2. package/dist/commands/index.d.ts.map +1 -1
  3. package/dist/commands/index.js +10 -0
  4. package/dist/commands/index.js.map +1 -1
  5. package/dist/components/CybergotchiPanelConnected.d.ts +5 -1
  6. package/dist/components/CybergotchiPanelConnected.d.ts.map +1 -1
  7. package/dist/components/CybergotchiPanelConnected.js +2 -2
  8. package/dist/components/CybergotchiPanelConnected.js.map +1 -1
  9. package/dist/components/DiffView.d.ts +1 -18
  10. package/dist/components/DiffView.d.ts.map +1 -1
  11. package/dist/components/DiffView.js +1 -54
  12. package/dist/components/DiffView.js.map +1 -1
  13. package/dist/components/PermissionPrompt.d.ts.map +1 -1
  14. package/dist/components/PermissionPrompt.js +7 -49
  15. package/dist/components/PermissionPrompt.js.map +1 -1
  16. package/dist/components/REPL.d.ts.map +1 -1
  17. package/dist/components/REPL.js +41 -20
  18. package/dist/components/REPL.js.map +1 -1
  19. package/dist/components/Spinner.d.ts.map +1 -1
  20. package/dist/components/Spinner.js +3 -9
  21. package/dist/components/Spinner.js.map +1 -1
  22. package/dist/cybergotchi/useCybergotchi.d.ts +1 -1
  23. package/dist/cybergotchi/useCybergotchi.d.ts.map +1 -1
  24. package/dist/cybergotchi/useCybergotchi.js +3 -1
  25. package/dist/cybergotchi/useCybergotchi.js.map +1 -1
  26. package/dist/harness/config.d.ts +1 -0
  27. package/dist/harness/config.d.ts.map +1 -1
  28. package/dist/harness/config.js.map +1 -1
  29. package/dist/harness/context-warning.d.ts +12 -0
  30. package/dist/harness/context-warning.d.ts.map +1 -0
  31. package/dist/harness/context-warning.js +36 -0
  32. package/dist/harness/context-warning.js.map +1 -0
  33. package/dist/harness/context-warning.test.d.ts +2 -0
  34. package/dist/harness/context-warning.test.d.ts.map +1 -0
  35. package/dist/harness/context-warning.test.js +72 -0
  36. package/dist/harness/context-warning.test.js.map +1 -0
  37. package/dist/harness/submit-handler.d.ts +35 -0
  38. package/dist/harness/submit-handler.d.ts.map +1 -0
  39. package/dist/harness/submit-handler.js +86 -0
  40. package/dist/harness/submit-handler.js.map +1 -0
  41. package/dist/harness/submit-handler.test.d.ts +2 -0
  42. package/dist/harness/submit-handler.test.d.ts.map +1 -0
  43. package/dist/harness/submit-handler.test.js +62 -0
  44. package/dist/harness/submit-handler.test.js.map +1 -0
  45. package/dist/main.js +26 -3
  46. package/dist/main.js.map +1 -1
  47. package/dist/renderer/cells.d.ts +37 -0
  48. package/dist/renderer/cells.d.ts.map +1 -0
  49. package/dist/renderer/cells.js +122 -0
  50. package/dist/renderer/cells.js.map +1 -0
  51. package/dist/renderer/cells.test.d.ts +2 -0
  52. package/dist/renderer/cells.test.d.ts.map +1 -0
  53. package/dist/renderer/cells.test.js +69 -0
  54. package/dist/renderer/cells.test.js.map +1 -0
  55. package/dist/renderer/diff.d.ts +33 -0
  56. package/dist/renderer/diff.d.ts.map +1 -0
  57. package/dist/renderer/diff.js +104 -0
  58. package/dist/renderer/diff.js.map +1 -0
  59. package/dist/renderer/differ.d.ts +25 -0
  60. package/dist/renderer/differ.d.ts.map +1 -0
  61. package/dist/renderer/differ.js +91 -0
  62. package/dist/renderer/differ.js.map +1 -0
  63. package/dist/renderer/e2e.test.d.ts +6 -0
  64. package/dist/renderer/e2e.test.d.ts.map +1 -0
  65. package/dist/renderer/e2e.test.js +237 -0
  66. package/dist/renderer/e2e.test.js.map +1 -0
  67. package/dist/renderer/image.d.ts +21 -0
  68. package/dist/renderer/image.d.ts.map +1 -0
  69. package/dist/renderer/image.js +97 -0
  70. package/dist/renderer/image.js.map +1 -0
  71. package/dist/renderer/index.d.ts +76 -0
  72. package/dist/renderer/index.d.ts.map +1 -0
  73. package/dist/renderer/index.js +350 -0
  74. package/dist/renderer/index.js.map +1 -0
  75. package/dist/renderer/input.d.ts +17 -0
  76. package/dist/renderer/input.d.ts.map +1 -0
  77. package/dist/renderer/input.js +101 -0
  78. package/dist/renderer/input.js.map +1 -0
  79. package/dist/renderer/layout.d.ts +67 -0
  80. package/dist/renderer/layout.d.ts.map +1 -0
  81. package/dist/renderer/layout.js +439 -0
  82. package/dist/renderer/layout.js.map +1 -0
  83. package/dist/renderer/markdown.d.ts +19 -0
  84. package/dist/renderer/markdown.d.ts.map +1 -0
  85. package/dist/renderer/markdown.js +431 -0
  86. package/dist/renderer/markdown.js.map +1 -0
  87. package/dist/renderer/markdown.test.d.ts +2 -0
  88. package/dist/renderer/markdown.test.d.ts.map +1 -0
  89. package/dist/renderer/markdown.test.js +81 -0
  90. package/dist/renderer/markdown.test.js.map +1 -0
  91. package/dist/renderer/perf.test.d.ts +2 -0
  92. package/dist/renderer/perf.test.d.ts.map +1 -0
  93. package/dist/renderer/perf.test.js +123 -0
  94. package/dist/renderer/perf.test.js.map +1 -0
  95. package/dist/renderer/session-browser.d.ts +34 -0
  96. package/dist/renderer/session-browser.d.ts.map +1 -0
  97. package/dist/renderer/session-browser.js +130 -0
  98. package/dist/renderer/session-browser.js.map +1 -0
  99. package/dist/repl.d.ts +20 -0
  100. package/dist/repl.d.ts.map +1 -0
  101. package/dist/repl.js +535 -0
  102. package/dist/repl.js.map +1 -0
  103. package/dist/tools/GrepTool/index.d.ts +2 -2
  104. package/dist/types/message.d.ts +1 -0
  105. package/dist/types/message.d.ts.map +1 -1
  106. package/dist/utils/diff-algorithm.d.ts +24 -0
  107. package/dist/utils/diff-algorithm.d.ts.map +1 -0
  108. package/dist/utils/diff-algorithm.js +58 -0
  109. package/dist/utils/diff-algorithm.js.map +1 -0
  110. package/dist/utils/diff-algorithm.test.d.ts +2 -0
  111. package/dist/utils/diff-algorithm.test.d.ts.map +1 -0
  112. package/dist/utils/diff-algorithm.test.js +49 -0
  113. package/dist/utils/diff-algorithm.test.js.map +1 -0
  114. package/dist/utils/format.d.ts +6 -0
  115. package/dist/utils/format.d.ts.map +1 -0
  116. package/dist/utils/format.js +12 -0
  117. package/dist/utils/format.js.map +1 -0
  118. package/dist/utils/theme-data.d.ts +31 -0
  119. package/dist/utils/theme-data.d.ts.map +1 -0
  120. package/dist/utils/theme-data.js +55 -0
  121. package/dist/utils/theme-data.js.map +1 -0
  122. package/dist/utils/theme.d.ts +4 -21
  123. package/dist/utils/theme.d.ts.map +1 -1
  124. package/dist/utils/theme.js +4 -36
  125. package/dist/utils/theme.js.map +1 -1
  126. package/dist/utils/tool-summary.d.ts +15 -0
  127. package/dist/utils/tool-summary.d.ts.map +1 -0
  128. package/dist/utils/tool-summary.js +55 -0
  129. package/dist/utils/tool-summary.js.map +1 -0
  130. package/dist/utils/tool-summary.test.d.ts +2 -0
  131. package/dist/utils/tool-summary.test.d.ts.map +1 -0
  132. package/dist/utils/tool-summary.test.js +67 -0
  133. package/dist/utils/tool-summary.test.js.map +1 -0
  134. package/package.json +1 -1
@@ -0,0 +1,123 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { CellGrid } from './cells.js';
4
+ import { rasterize } from './layout.js';
5
+ import { measureMarkdown, renderMarkdown } from './markdown.js';
6
+ import { setActiveTheme } from '../utils/theme-data.js';
7
+ setActiveTheme('dark');
8
+ function makeState(overrides = {}) {
9
+ return {
10
+ messages: [],
11
+ streamingText: '',
12
+ thinkingText: '',
13
+ toolCalls: new Map(),
14
+ inputText: '',
15
+ inputCursor: 0,
16
+ companionLines: null,
17
+ companionColor: 'cyan',
18
+ statusHints: 'exit to quit',
19
+ statusLine: 'model | 1.2K↑ 500↓ | $0.01',
20
+ contextWarning: null,
21
+ errorText: null,
22
+ loading: false,
23
+ spinnerFrame: 0,
24
+ thinkingStartedAt: null,
25
+ tokenCount: 0,
26
+ vimMode: null,
27
+ permissionBox: null,
28
+ permissionDiffVisible: false,
29
+ permissionDiffInfo: null,
30
+ expandedToolCalls: new Set(),
31
+ questionPrompt: null,
32
+ autocomplete: [],
33
+ autocompleteIndex: -1,
34
+ manualScroll: 0,
35
+ codeBlocksExpanded: false,
36
+ sessionBrowser: null,
37
+ ...overrides,
38
+ };
39
+ }
40
+ describe('rasterize performance', () => {
41
+ it('renders 100 messages in under 50ms', () => {
42
+ const messages = Array.from({ length: 100 }, (_, i) => ({
43
+ role: i % 2 === 0 ? 'user' : 'assistant',
44
+ content: `Message ${i}: ${'lorem ipsum dolor sit amet '.repeat(5)}`,
45
+ uuid: `msg-${i}`,
46
+ timestamp: Date.now(),
47
+ }));
48
+ const state = makeState({ messages });
49
+ const grid = new CellGrid(120, 40);
50
+ const start = performance.now();
51
+ for (let frame = 0; frame < 10; frame++) {
52
+ grid.clear();
53
+ rasterize(state, grid);
54
+ }
55
+ const elapsed = performance.now() - start;
56
+ const perFrame = elapsed / 10;
57
+ console.log(` rasterize 100 msgs: ${perFrame.toFixed(2)}ms/frame`);
58
+ assert.ok(perFrame < 50, `Expected < 50ms/frame, got ${perFrame.toFixed(2)}ms`);
59
+ });
60
+ it('renders messages with markdown in under 100ms', () => {
61
+ const mdContent = `# Heading\n\nSome text with **bold** and \`code\`.\n\n\`\`\`typescript\nconst x = 1;\nconst y = "hello";\nfunction foo() {\n return x + y;\n}\n\`\`\`\n\n- item one\n- item two\n- item three\n`;
62
+ const messages = Array.from({ length: 50 }, (_, i) => ({
63
+ role: i % 2 === 0 ? 'user' : 'assistant',
64
+ content: i % 2 === 1 ? mdContent : `Question ${i}`,
65
+ uuid: `msg-${i}`,
66
+ timestamp: Date.now(),
67
+ }));
68
+ const state = makeState({ messages });
69
+ const grid = new CellGrid(120, 40);
70
+ const start = performance.now();
71
+ for (let frame = 0; frame < 10; frame++) {
72
+ grid.clear();
73
+ rasterize(state, grid);
74
+ }
75
+ const elapsed = performance.now() - start;
76
+ const perFrame = elapsed / 10;
77
+ console.log(` rasterize 50 md msgs: ${perFrame.toFixed(2)}ms/frame`);
78
+ assert.ok(perFrame < 100, `Expected < 100ms/frame, got ${perFrame.toFixed(2)}ms`);
79
+ });
80
+ it('measureMarkdown is consistent with renderMarkdown row count', () => {
81
+ const testCases = [
82
+ 'hello world',
83
+ '# Heading\nParagraph text.',
84
+ '```js\nconst x = 1;\n```',
85
+ '- one\n- two\n- three',
86
+ '| A | B |\n| --- | --- |\n| 1 | 2 |',
87
+ '> blockquote\n\n---\n\nMore text.',
88
+ ];
89
+ for (const md of testCases) {
90
+ const measured = measureMarkdown(md, 80);
91
+ const grid = new CellGrid(80, 100);
92
+ const rendered = renderMarkdown(grid, 0, 0, md, 80, true);
93
+ // Allow ±2 row difference due to measurement approximations
94
+ const diff = Math.abs(measured - rendered);
95
+ assert.ok(diff <= 2, `Mismatch for "${md.slice(0, 30)}...": measured=${measured}, rendered=${rendered}`);
96
+ }
97
+ });
98
+ it('rasterize with tool calls stays under 20ms', () => {
99
+ const toolCalls = new Map();
100
+ for (let i = 0; i < 10; i++) {
101
+ toolCalls.set(`tc-${i}`, {
102
+ toolName: `Tool${i}`,
103
+ status: i < 5 ? 'done' : 'running',
104
+ args: `/path/to/file${i}.ts`,
105
+ output: `Output line 1\nOutput line 2\nOutput line 3`,
106
+ liveOutput: i >= 5 ? ['live line 1', 'live line 2'] : undefined,
107
+ });
108
+ }
109
+ const state = makeState({ toolCalls, loading: true, thinkingStartedAt: Date.now() });
110
+ const grid = new CellGrid(120, 40);
111
+ const start = performance.now();
112
+ for (let frame = 0; frame < 20; frame++) {
113
+ state.spinnerFrame = frame;
114
+ grid.clear();
115
+ rasterize(state, grid);
116
+ }
117
+ const elapsed = performance.now() - start;
118
+ const perFrame = elapsed / 20;
119
+ console.log(` rasterize 10 tool calls: ${perFrame.toFixed(2)}ms/frame`);
120
+ assert.ok(perFrame < 20, `Expected < 20ms/frame, got ${perFrame.toFixed(2)}ms`);
121
+ });
122
+ });
123
+ //# sourceMappingURL=perf.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf.test.js","sourceRoot":"","sources":["../../src/renderer/perf.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Interactive session browser — renders in the cell grid.
3
+ * Navigate with ↑/↓, Enter to resume, Escape to cancel.
4
+ */
5
+ import type { CellGrid } from './cells.js';
6
+ import { listSessions } from '../harness/session.js';
7
+ type SessionSummary = ReturnType<typeof listSessions>[number];
8
+ export type SessionBrowserState = {
9
+ allSessions: SessionSummary[];
10
+ sessions: SessionSummary[];
11
+ selectedIndex: number;
12
+ scrollOffset: number;
13
+ preview: string | null;
14
+ searchQuery: string;
15
+ };
16
+ /** Load sessions and create initial browser state */
17
+ export declare function createSessionBrowser(): SessionBrowserState;
18
+ /** Update search query and filter sessions */
19
+ export declare function browserSearch(state: SessionBrowserState, query: string): SessionBrowserState;
20
+ /** Move selection up */
21
+ export declare function browserUp(state: SessionBrowserState): SessionBrowserState;
22
+ /** Move selection down */
23
+ export declare function browserDown(state: SessionBrowserState): SessionBrowserState;
24
+ /** Get the selected session ID */
25
+ export declare function browserSelectedId(state: SessionBrowserState): string | null;
26
+ /** Load preview for the selected session */
27
+ export declare function browserLoadPreview(state: SessionBrowserState): SessionBrowserState;
28
+ /**
29
+ * Render the session browser into the cell grid.
30
+ * Returns number of rows consumed.
31
+ */
32
+ export declare function renderSessionBrowser(grid: CellGrid, row: number, col: number, state: SessionBrowserState, width: number, maxRows: number): number;
33
+ export {};
34
+ //# sourceMappingURL=session-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-browser.d.ts","sourceRoot":"","sources":["../../src/renderer/session-browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAe,MAAM,uBAAuB,CAAC;AAElE,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAM9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,mBAAmB,CAW1D;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAS5F;AAED,wBAAwB;AACxB,wBAAgB,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAIzE;AAED,0BAA0B;AAC1B,wBAAgB,WAAW,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAG3E;AAED,kCAAkC;AAClC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAG3E;AAED,4CAA4C;AAC5C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAclF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,MAAM,CAiER"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Interactive session browser — renders in the cell grid.
3
+ * Navigate with ↑/↓, Enter to resume, Escape to cancel.
4
+ */
5
+ import { getTheme } from '../utils/theme-data.js';
6
+ import { listSessions, loadSession } from '../harness/session.js';
7
+ import { homedir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ const s = (fg, bold = false, dim = false) => ({ fg, bg: null, bold, dim, underline: false });
10
+ /** Load sessions and create initial browser state */
11
+ export function createSessionBrowser() {
12
+ const sessionDir = join(homedir(), '.oh', 'sessions');
13
+ const allSessions = listSessions(sessionDir);
14
+ return {
15
+ allSessions,
16
+ sessions: allSessions,
17
+ selectedIndex: 0,
18
+ scrollOffset: 0,
19
+ preview: null,
20
+ searchQuery: '',
21
+ };
22
+ }
23
+ /** Update search query and filter sessions */
24
+ export function browserSearch(state, query) {
25
+ const q = query.toLowerCase();
26
+ const filtered = q
27
+ ? state.allSessions.filter(s => s.model.toLowerCase().includes(q) ||
28
+ s.id.toLowerCase().includes(q) ||
29
+ new Date(s.updatedAt).toLocaleDateString().includes(q))
30
+ : state.allSessions;
31
+ return { ...state, searchQuery: query, sessions: filtered, selectedIndex: 0, scrollOffset: 0, preview: null };
32
+ }
33
+ /** Move selection up */
34
+ export function browserUp(state) {
35
+ const idx = Math.max(0, state.selectedIndex - 1);
36
+ const scrollOffset = idx < state.scrollOffset ? idx : state.scrollOffset;
37
+ return { ...state, selectedIndex: idx, scrollOffset, preview: null };
38
+ }
39
+ /** Move selection down */
40
+ export function browserDown(state) {
41
+ const idx = Math.min(state.sessions.length - 1, state.selectedIndex + 1);
42
+ return { ...state, selectedIndex: idx, preview: null };
43
+ }
44
+ /** Get the selected session ID */
45
+ export function browserSelectedId(state) {
46
+ const session = state.sessions[state.selectedIndex];
47
+ return session?.id ?? null;
48
+ }
49
+ /** Load preview for the selected session */
50
+ export function browserLoadPreview(state) {
51
+ const session = state.sessions[state.selectedIndex];
52
+ if (!session)
53
+ return { ...state, preview: null };
54
+ try {
55
+ const sessionDir = join(homedir(), '.oh', 'sessions');
56
+ const full = loadSession(session.id, sessionDir);
57
+ const lastMsgs = full.messages.slice(-3);
58
+ const preview = lastMsgs
59
+ .map(m => `${m.role === 'user' ? '❯' : '◆'} ${m.content.slice(0, 100)}`)
60
+ .join('\n');
61
+ return { ...state, preview };
62
+ }
63
+ catch {
64
+ return { ...state, preview: '[could not load preview]' };
65
+ }
66
+ }
67
+ /**
68
+ * Render the session browser into the cell grid.
69
+ * Returns number of rows consumed.
70
+ */
71
+ export function renderSessionBrowser(grid, row, col, state, width, maxRows) {
72
+ const t = getTheme();
73
+ let r = row;
74
+ // Title + search
75
+ grid.writeText(r, col, '─── Session Browser (↑/↓ navigate, Enter resume, Esc cancel) ───', s(null, false, true));
76
+ r++;
77
+ if (state.searchQuery || state.allSessions.length > 5) {
78
+ grid.writeText(r, col, '🔍 ', s(null, false, true));
79
+ grid.writeText(r, col + 3, state.searchQuery || '(type to filter)', state.searchQuery ? s(null) : s(null, false, true));
80
+ r++;
81
+ }
82
+ if (state.sessions.length === 0) {
83
+ grid.writeText(r, col + 2, 'No saved sessions.', s(null, false, true));
84
+ return r - row + 1;
85
+ }
86
+ // Session list
87
+ const listHeight = Math.min(maxRows - 4, state.sessions.length);
88
+ // Adjust scroll offset
89
+ let scrollOffset = state.scrollOffset;
90
+ if (state.selectedIndex >= scrollOffset + listHeight) {
91
+ scrollOffset = state.selectedIndex - listHeight + 1;
92
+ }
93
+ if (state.selectedIndex < scrollOffset) {
94
+ scrollOffset = state.selectedIndex;
95
+ }
96
+ for (let i = 0; i < listHeight && r < row + maxRows; i++) {
97
+ const idx = scrollOffset + i;
98
+ if (idx >= state.sessions.length)
99
+ break;
100
+ const sess = state.sessions[idx];
101
+ const selected = idx === state.selectedIndex;
102
+ const date = new Date(sess.updatedAt).toLocaleDateString();
103
+ const cost = sess.cost > 0 ? ` $${sess.cost.toFixed(4)}` : '';
104
+ const model = (sess.model || '?').slice(0, 20);
105
+ const msgs = String(sess.messages).padStart(3);
106
+ const prefix = selected ? '▶ ' : ' ';
107
+ const style = selected ? s(t.user, true) : s(null);
108
+ const dimStyle = selected ? s(t.user) : s(null, false, true);
109
+ grid.writeText(r, col, prefix, style);
110
+ grid.writeText(r, col + 2, `${date} ${msgs} msgs ${model}${cost}`, dimStyle);
111
+ if (selected) {
112
+ grid.writeText(r, col + 2 + date.length + msgs.length + model.length + cost.length + 12, ` ${sess.id.slice(0, 8)}…`, s(null, false, true));
113
+ }
114
+ r++;
115
+ }
116
+ // Preview
117
+ if (state.preview && r < row + maxRows - 1) {
118
+ r++;
119
+ grid.writeText(r, col, '─── Preview ───', s(null, false, true));
120
+ r++;
121
+ for (const line of state.preview.split('\n')) {
122
+ if (r >= row + maxRows)
123
+ break;
124
+ grid.writeText(r, col + 2, line.slice(0, width - col - 4), s(null, false, true));
125
+ r++;
126
+ }
127
+ }
128
+ return r - row;
129
+ }
130
+ //# sourceMappingURL=session-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-browser.js","sourceRoot":"","sources":["../../src/renderer/session-browser.ts"],"names":[],"mappings":"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"}
package/dist/repl.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Imperative REPL — extracted business logic from React REPL.tsx.
3
+ * Uses TerminalRenderer for display instead of Ink.
4
+ */
5
+ import type { Message } from './types/message.js';
6
+ import type { Provider } from './providers/base.js';
7
+ import type { Tools } from './Tool.js';
8
+ import type { PermissionMode } from './types/permissions.js';
9
+ export type REPLConfig = {
10
+ provider: Provider;
11
+ tools: Tools;
12
+ permissionMode: PermissionMode;
13
+ systemPrompt: string;
14
+ model?: string;
15
+ initialMessages?: Message[];
16
+ resumeSessionId?: string;
17
+ theme?: 'dark' | 'light';
18
+ };
19
+ export declare function startREPL(config: REPLConfig): Promise<void>;
20
+ //# sourceMappingURL=repl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAwB7D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;AAEF,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAidjE"}