@agi-fans/dsh-tui 0.1.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 (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/lib/autocomplete.d.ts +80 -0
  4. package/lib/autocomplete.js +320 -0
  5. package/lib/autocomplete.js.map +1 -0
  6. package/lib/box.d.ts +79 -0
  7. package/lib/box.js +276 -0
  8. package/lib/box.js.map +1 -0
  9. package/lib/clipboard.d.ts +19 -0
  10. package/lib/clipboard.js +77 -0
  11. package/lib/clipboard.js.map +1 -0
  12. package/lib/command-integrations.d.ts +10 -0
  13. package/lib/command-integrations.js +49 -0
  14. package/lib/command-integrations.js.map +1 -0
  15. package/lib/command-mode.d.ts +5 -0
  16. package/lib/command-mode.js +73 -0
  17. package/lib/command-mode.js.map +1 -0
  18. package/lib/command-model.d.ts +5 -0
  19. package/lib/command-model.js +87 -0
  20. package/lib/command-model.js.map +1 -0
  21. package/lib/command-output.d.ts +6 -0
  22. package/lib/command-output.js +33 -0
  23. package/lib/command-output.js.map +1 -0
  24. package/lib/command-queue.d.ts +5 -0
  25. package/lib/command-queue.js +62 -0
  26. package/lib/command-queue.js.map +1 -0
  27. package/lib/command-registration.d.ts +5 -0
  28. package/lib/command-registration.js +20 -0
  29. package/lib/command-registration.js.map +1 -0
  30. package/lib/command-session.d.ts +5 -0
  31. package/lib/command-session.js +153 -0
  32. package/lib/command-session.js.map +1 -0
  33. package/lib/command-transcript.d.ts +5 -0
  34. package/lib/command-transcript.js +85 -0
  35. package/lib/command-transcript.js.map +1 -0
  36. package/lib/copy-selector.d.ts +52 -0
  37. package/lib/copy-selector.js +136 -0
  38. package/lib/copy-selector.js.map +1 -0
  39. package/lib/copy-targets.d.ts +34 -0
  40. package/lib/copy-targets.js +170 -0
  41. package/lib/copy-targets.js.map +1 -0
  42. package/lib/definition.d.ts +171 -0
  43. package/lib/definition.js +14 -0
  44. package/lib/definition.js.map +1 -0
  45. package/lib/editor.d.ts +66 -0
  46. package/lib/editor.js +365 -0
  47. package/lib/editor.js.map +1 -0
  48. package/lib/event-views.d.ts +188 -0
  49. package/lib/event-views.js +678 -0
  50. package/lib/event-views.js.map +1 -0
  51. package/lib/external-editor.d.ts +2 -0
  52. package/lib/external-editor.js +31 -0
  53. package/lib/external-editor.js.map +1 -0
  54. package/lib/history-search.d.ts +61 -0
  55. package/lib/history-search.js +239 -0
  56. package/lib/history-search.js.map +1 -0
  57. package/lib/history-store.d.ts +8 -0
  58. package/lib/history-store.js +36 -0
  59. package/lib/history-store.js.map +1 -0
  60. package/lib/hotkeys.d.ts +14 -0
  61. package/lib/hotkeys.js +115 -0
  62. package/lib/hotkeys.js.map +1 -0
  63. package/lib/human-interaction.d.ts +5 -0
  64. package/lib/human-interaction.js +8 -0
  65. package/lib/human-interaction.js.map +1 -0
  66. package/lib/image-paste.d.ts +21 -0
  67. package/lib/image-paste.js +277 -0
  68. package/lib/image-paste.js.map +1 -0
  69. package/lib/index.d.ts +10 -0
  70. package/lib/index.js +11 -0
  71. package/lib/index.js.map +1 -0
  72. package/lib/interaction-adapter.d.ts +18 -0
  73. package/lib/interaction-adapter.js +93 -0
  74. package/lib/interaction-adapter.js.map +1 -0
  75. package/lib/keybindings-config.d.ts +5 -0
  76. package/lib/keybindings-config.js +28 -0
  77. package/lib/keybindings-config.js.map +1 -0
  78. package/lib/keys.d.ts +59 -0
  79. package/lib/keys.js +263 -0
  80. package/lib/keys.js.map +1 -0
  81. package/lib/markdown.d.ts +13 -0
  82. package/lib/markdown.js +453 -0
  83. package/lib/markdown.js.map +1 -0
  84. package/lib/path-complete.d.ts +85 -0
  85. package/lib/path-complete.js +231 -0
  86. package/lib/path-complete.js.map +1 -0
  87. package/lib/path-mentions.d.ts +4 -0
  88. package/lib/path-mentions.js +50 -0
  89. package/lib/path-mentions.js.map +1 -0
  90. package/lib/project-context.d.ts +13 -0
  91. package/lib/project-context.js +52 -0
  92. package/lib/project-context.js.map +1 -0
  93. package/lib/project-file-search.d.ts +25 -0
  94. package/lib/project-file-search.js +207 -0
  95. package/lib/project-file-search.js.map +1 -0
  96. package/lib/prompt-selector.d.ts +56 -0
  97. package/lib/prompt-selector.js +297 -0
  98. package/lib/prompt-selector.js.map +1 -0
  99. package/lib/provider-local.d.ts +115 -0
  100. package/lib/provider-local.js +1760 -0
  101. package/lib/provider-local.js.map +1 -0
  102. package/lib/pwd.d.ts +13 -0
  103. package/lib/pwd.js +14 -0
  104. package/lib/pwd.js.map +1 -0
  105. package/lib/relative-time.d.ts +2 -0
  106. package/lib/relative-time.js +11 -0
  107. package/lib/relative-time.js.map +1 -0
  108. package/lib/renderer.d.ts +112 -0
  109. package/lib/renderer.js +181 -0
  110. package/lib/renderer.js.map +1 -0
  111. package/lib/runner.d.ts +9 -0
  112. package/lib/runner.js +94 -0
  113. package/lib/runner.js.map +1 -0
  114. package/lib/session-controller.d.ts +92 -0
  115. package/lib/session-controller.js +571 -0
  116. package/lib/session-controller.js.map +1 -0
  117. package/lib/session-runtime.d.ts +16 -0
  118. package/lib/session-runtime.js +17 -0
  119. package/lib/session-runtime.js.map +1 -0
  120. package/lib/settings-list.d.ts +67 -0
  121. package/lib/settings-list.js +380 -0
  122. package/lib/settings-list.js.map +1 -0
  123. package/lib/status-config.d.ts +32 -0
  124. package/lib/status-config.js +52 -0
  125. package/lib/status-config.js.map +1 -0
  126. package/lib/status-line.d.ts +41 -0
  127. package/lib/status-line.js +351 -0
  128. package/lib/status-line.js.map +1 -0
  129. package/lib/style.d.ts +22 -0
  130. package/lib/style.js +23 -0
  131. package/lib/style.js.map +1 -0
  132. package/lib/theme.d.ts +83 -0
  133. package/lib/theme.js +317 -0
  134. package/lib/theme.js.map +1 -0
  135. package/lib/tool-presentation.d.ts +20 -0
  136. package/lib/tool-presentation.js +79 -0
  137. package/lib/tool-presentation.js.map +1 -0
  138. package/lib/tool-renderers.d.ts +21 -0
  139. package/lib/tool-renderers.js +133 -0
  140. package/lib/tool-renderers.js.map +1 -0
  141. package/lib/tools-list.d.ts +14 -0
  142. package/lib/tools-list.js +61 -0
  143. package/lib/tools-list.js.map +1 -0
  144. package/lib/transcript-export.d.ts +4 -0
  145. package/lib/transcript-export.js +66 -0
  146. package/lib/transcript-export.js.map +1 -0
  147. package/lib/tui-settings.d.ts +20 -0
  148. package/lib/tui-settings.js +23 -0
  149. package/lib/tui-settings.js.map +1 -0
  150. package/lib/welcome-tips.d.ts +10 -0
  151. package/lib/welcome-tips.js +36 -0
  152. package/lib/welcome-tips.js.map +1 -0
  153. package/lib/width.d.ts +54 -0
  154. package/lib/width.js +323 -0
  155. package/lib/width.js.map +1 -0
  156. package/package.json +119 -0
package/lib/editor.js ADDED
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Input-editor state machine: OMP readline/emacs bindings over a single
3
+ * buffer that may contain newlines. Pure — the provider owns history,
4
+ * interrupt, and process lifetime.
5
+ * @module @agi-fans/dsh-tui
6
+ */
7
+ const MAX_UNDO = 80;
8
+ const MAX_KILLS = 60;
9
+ /** Emacs-style kill ring (consecutive kills accumulate). */
10
+ export class KillRing {
11
+ #entries = [];
12
+ push(text, opts) {
13
+ if (text === '')
14
+ return;
15
+ if (opts.accumulate && this.#entries.length > 0) {
16
+ const last = this.#entries.pop() ?? '';
17
+ this.#entries.push(opts.prepend ? text + last : last + text);
18
+ }
19
+ else {
20
+ this.#entries.push(text);
21
+ if (this.#entries.length > MAX_KILLS)
22
+ this.#entries.shift();
23
+ }
24
+ }
25
+ peek() {
26
+ return this.#entries[this.#entries.length - 1];
27
+ }
28
+ rotate() {
29
+ if (this.#entries.length > 1) {
30
+ const last = this.#entries.pop();
31
+ if (last !== undefined)
32
+ this.#entries.unshift(last);
33
+ }
34
+ }
35
+ get length() {
36
+ return this.#entries.length;
37
+ }
38
+ }
39
+ /** Start index of the line containing `cursor`. */
40
+ export function lineStart(text, cursor) {
41
+ const at = text.lastIndexOf('\n', cursor - 1);
42
+ return at < 0 ? 0 : at + 1;
43
+ }
44
+ /** End index (before newline, or length) of the line containing `cursor`. */
45
+ export function lineEnd(text, cursor) {
46
+ const at = text.indexOf('\n', cursor);
47
+ return at < 0 ? text.length : at;
48
+ }
49
+ /** Word-left: skip trailing whitespace, then the previous word. */
50
+ export function moveWordLeft(text, cursor) {
51
+ let i = cursor;
52
+ while (i > 0 && /\s/.test(text[i - 1] ?? ''))
53
+ i -= 1;
54
+ while (i > 0 && !/\s/.test(text[i - 1] ?? ''))
55
+ i -= 1;
56
+ return i;
57
+ }
58
+ /** Word-right: skip the current word, then following whitespace. */
59
+ export function moveWordRight(text, cursor) {
60
+ let i = cursor;
61
+ while (i < text.length && !/\s/.test(text[i] ?? ''))
62
+ i += 1;
63
+ while (i < text.length && /\s/.test(text[i] ?? ''))
64
+ i += 1;
65
+ return i;
66
+ }
67
+ function moveLine(text, cursor, dir) {
68
+ const start = lineStart(text, cursor);
69
+ const col = cursor - start;
70
+ if (dir < 0) {
71
+ if (start === 0)
72
+ return undefined;
73
+ const prevEnd = start - 1;
74
+ const prevStart = lineStart(text, prevEnd);
75
+ return prevStart + Math.min(col, prevEnd - prevStart);
76
+ }
77
+ const end = lineEnd(text, cursor);
78
+ if (end >= text.length)
79
+ return undefined;
80
+ const nextStart = end + 1;
81
+ const nextEnd = lineEnd(text, nextStart);
82
+ return nextStart + Math.min(col, nextEnd - nextStart);
83
+ }
84
+ /**
85
+ * Multiline input buffer with OMP editor bindings.
86
+ */
87
+ export class InputEditor {
88
+ #text = '';
89
+ #cursor = 0;
90
+ #undo = [];
91
+ #last = 'none';
92
+ #kills = new KillRing();
93
+ #yankLen = 0;
94
+ #jump = null;
95
+ get text() {
96
+ return this.#text;
97
+ }
98
+ get cursor() {
99
+ return this.#cursor;
100
+ }
101
+ /** Replace the buffer (history recall). Clears undo. */
102
+ setText(text, cursor = text.length) {
103
+ this.#text = text;
104
+ this.#cursor = Math.max(0, Math.min(cursor, text.length));
105
+ this.#undo = [];
106
+ this.#last = 'none';
107
+ this.#yankLen = 0;
108
+ this.#jump = null;
109
+ }
110
+ /** Move the caret without changing text or undo. */
111
+ setCursor(cursor) {
112
+ this.#cursor = Math.max(0, Math.min(cursor, this.#text.length));
113
+ this.#last = 'none';
114
+ }
115
+ /** Empty the buffer, keeping undo of the previous contents. */
116
+ clear() {
117
+ if (this.#text === '')
118
+ return;
119
+ this.#pushUndo();
120
+ this.#text = '';
121
+ this.#cursor = 0;
122
+ this.#last = 'none';
123
+ }
124
+ /** Apply one decoded event. */
125
+ handle(event) {
126
+ if (this.#jump !== null) {
127
+ if (event.type === 'key' && (event.id === 'ctrl+]' || event.id === 'ctrl+alt+]')) {
128
+ this.#jump = null;
129
+ return { kind: 'changed' };
130
+ }
131
+ if (event.type === 'text' && event.value !== '') {
132
+ const dir = this.#jump;
133
+ this.#jump = null;
134
+ this.#jumpToChar(event.value[0] ?? '', dir);
135
+ return { kind: 'changed' };
136
+ }
137
+ this.#jump = null;
138
+ }
139
+ if (event.type === 'text') {
140
+ this.#insert(event.value);
141
+ return { kind: 'changed', edited: true };
142
+ }
143
+ if (event.type !== 'key')
144
+ return { kind: 'ignored' };
145
+ return this.#handleKey(event.id);
146
+ }
147
+ #handleKey(id) {
148
+ switch (id) {
149
+ case 'enter':
150
+ return { kind: 'submit', text: this.#text };
151
+ case 'ctrl+j':
152
+ case 'shift+enter':
153
+ case 'alt+enter':
154
+ case 'ctrl+enter':
155
+ this.#insert('\n');
156
+ return { kind: 'changed', edited: true };
157
+ case 'ctrl+c':
158
+ return { kind: 'clear' };
159
+ case 'escape':
160
+ return { kind: 'interrupt' };
161
+ case 'ctrl+d':
162
+ if (this.#text === '')
163
+ return { kind: 'quit' };
164
+ this.#deleteForward();
165
+ return { kind: 'changed', edited: true };
166
+ case 'ctrl+z':
167
+ return { kind: 'suspend' };
168
+ case 'alt+l':
169
+ return { kind: 'resetDisplay' };
170
+ case 'up':
171
+ return this.#vertical(-1);
172
+ case 'down':
173
+ return this.#vertical(1);
174
+ case 'left':
175
+ case 'ctrl+b':
176
+ return this.#moveTo(this.#cursor - 1);
177
+ case 'right':
178
+ case 'ctrl+f':
179
+ return this.#moveTo(this.#cursor + 1);
180
+ case 'home':
181
+ case 'ctrl+a':
182
+ return this.#moveTo(lineStart(this.#text, this.#cursor));
183
+ case 'end':
184
+ case 'ctrl+e':
185
+ return this.#moveTo(lineEnd(this.#text, this.#cursor));
186
+ case 'alt+left':
187
+ case 'ctrl+left':
188
+ case 'alt+b':
189
+ return this.#moveTo(moveWordLeft(this.#text, this.#cursor));
190
+ case 'alt+right':
191
+ case 'ctrl+right':
192
+ case 'alt+f':
193
+ return this.#moveTo(moveWordRight(this.#text, this.#cursor));
194
+ case 'backspace':
195
+ this.#deleteBackward();
196
+ return { kind: 'changed', edited: true };
197
+ case 'delete':
198
+ this.#deleteForward();
199
+ return { kind: 'changed', edited: true };
200
+ case 'ctrl+w':
201
+ case 'alt+backspace':
202
+ case 'ctrl+backspace':
203
+ this.#deleteWordBackward();
204
+ return { kind: 'changed', edited: true };
205
+ case 'alt+d':
206
+ case 'alt+delete':
207
+ this.#deleteWordForward();
208
+ return { kind: 'changed', edited: true };
209
+ case 'ctrl+u':
210
+ this.#deleteToLineStart();
211
+ return { kind: 'changed', edited: true };
212
+ case 'ctrl+k':
213
+ this.#deleteToLineEnd();
214
+ return { kind: 'changed', edited: true };
215
+ case 'ctrl+y':
216
+ this.#yank();
217
+ return { kind: 'changed', edited: true };
218
+ case 'alt+y':
219
+ this.#yankPop();
220
+ return { kind: 'changed', edited: true };
221
+ case 'ctrl+-':
222
+ case 'ctrl+_':
223
+ this.#applyUndo();
224
+ return { kind: 'changed', edited: true };
225
+ case 'ctrl+]':
226
+ this.#jump = 'forward';
227
+ return { kind: 'changed' };
228
+ case 'ctrl+alt+]':
229
+ this.#jump = 'backward';
230
+ return { kind: 'changed' };
231
+ default:
232
+ return { kind: 'ignored' };
233
+ }
234
+ }
235
+ #vertical(dir) {
236
+ const next = moveLine(this.#text, this.#cursor, dir);
237
+ if (next === undefined)
238
+ return dir < 0 ? { kind: 'historyPrev' } : { kind: 'historyNext' };
239
+ return this.#moveTo(next);
240
+ }
241
+ #moveTo(cursor) {
242
+ const next = Math.max(0, Math.min(this.#text.length, cursor));
243
+ if (next === this.#cursor)
244
+ return { kind: 'changed' };
245
+ this.#cursor = next;
246
+ this.#last = 'none';
247
+ return { kind: 'changed' };
248
+ }
249
+ #pushUndo() {
250
+ this.#undo.push({ text: this.#text, cursor: this.#cursor });
251
+ if (this.#undo.length > MAX_UNDO)
252
+ this.#undo.shift();
253
+ }
254
+ #insert(value) {
255
+ if (value === '')
256
+ return;
257
+ const coalesce = this.#last === 'insert' && value.length === 1 && value !== '\n';
258
+ if (!coalesce)
259
+ this.#pushUndo();
260
+ this.#text = this.#text.slice(0, this.#cursor) + value + this.#text.slice(this.#cursor);
261
+ this.#cursor += value.length;
262
+ this.#last = 'insert';
263
+ this.#yankLen = 0;
264
+ }
265
+ #deleteRange(start, end, direction) {
266
+ if (start >= end)
267
+ return;
268
+ this.#pushUndo();
269
+ const killed = this.#text.slice(start, end);
270
+ this.#text = this.#text.slice(0, start) + this.#text.slice(end);
271
+ this.#cursor = start;
272
+ this.#kills.push(killed, { prepend: direction === 'backward', accumulate: this.#last === 'kill' });
273
+ this.#last = 'kill';
274
+ this.#yankLen = 0;
275
+ }
276
+ #deleteBackward() {
277
+ if (this.#cursor === 0)
278
+ return;
279
+ this.#deleteRange(this.#cursor - 1, this.#cursor, 'backward');
280
+ }
281
+ #deleteForward() {
282
+ if (this.#cursor >= this.#text.length)
283
+ return;
284
+ this.#deleteRange(this.#cursor, this.#cursor + 1, 'forward');
285
+ }
286
+ #deleteWordBackward() {
287
+ if (this.#cursor === 0)
288
+ return;
289
+ this.#deleteRange(moveWordLeft(this.#text, this.#cursor), this.#cursor, 'backward');
290
+ }
291
+ #deleteWordForward() {
292
+ if (this.#cursor >= this.#text.length)
293
+ return;
294
+ this.#deleteRange(this.#cursor, moveWordRight(this.#text, this.#cursor), 'forward');
295
+ }
296
+ #deleteToLineStart() {
297
+ const start = lineStart(this.#text, this.#cursor);
298
+ if (this.#cursor > start) {
299
+ this.#deleteRange(start, this.#cursor, 'backward');
300
+ return;
301
+ }
302
+ if (start > 0)
303
+ this.#deleteRange(start - 1, start, 'backward');
304
+ }
305
+ #deleteToLineEnd() {
306
+ const end = lineEnd(this.#text, this.#cursor);
307
+ if (this.#cursor < end) {
308
+ this.#deleteRange(this.#cursor, end, 'forward');
309
+ return;
310
+ }
311
+ if (end < this.#text.length)
312
+ this.#deleteRange(end, end + 1, 'forward');
313
+ }
314
+ #yank() {
315
+ const text = this.#kills.peek();
316
+ if (text === undefined)
317
+ return;
318
+ this.#insert(text);
319
+ this.#last = 'yank';
320
+ this.#yankLen = text.length;
321
+ }
322
+ #yankPop() {
323
+ if (this.#last !== 'yank' || this.#kills.length <= 1 || this.#yankLen === 0)
324
+ return;
325
+ const start = this.#cursor - this.#yankLen;
326
+ if (start < 0)
327
+ return;
328
+ this.#text = this.#text.slice(0, start) + this.#text.slice(this.#cursor);
329
+ this.#cursor = start;
330
+ this.#kills.rotate();
331
+ const next = this.#kills.peek();
332
+ if (next === undefined)
333
+ return;
334
+ this.#text = this.#text.slice(0, this.#cursor) + next + this.#text.slice(this.#cursor);
335
+ this.#cursor += next.length;
336
+ this.#yankLen = next.length;
337
+ this.#last = 'yank';
338
+ }
339
+ #jumpToChar(char, dir) {
340
+ if (char === '')
341
+ return;
342
+ this.#last = 'none';
343
+ if (dir === 'forward') {
344
+ const at = this.#text.indexOf(char, this.#cursor + 1);
345
+ if (at >= 0)
346
+ this.#cursor = at;
347
+ return;
348
+ }
349
+ if (this.#cursor === 0)
350
+ return;
351
+ const at = this.#text.lastIndexOf(char, this.#cursor - 1);
352
+ if (at >= 0)
353
+ this.#cursor = at;
354
+ }
355
+ #applyUndo() {
356
+ const snap = this.#undo.pop();
357
+ if (snap === undefined)
358
+ return;
359
+ this.#text = snap.text;
360
+ this.#cursor = snap.cursor;
361
+ this.#last = 'none';
362
+ this.#yankLen = 0;
363
+ }
364
+ }
365
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Transcript state machine: SessionEvent -> display blocks, and the pure
3
+ * view that composes blocks + status + input into a render frame.
4
+
5
+ * applyEvent is the single writer of TranscriptState; renderView is the
6
+ * single reader. windowTranscript clips the body the way OMP's ScrollView
7
+ * does. Both are pure so the whole rendering pipeline is testable without
8
+ * a terminal.
9
+ * @module @agi-fans/dsh-tui
10
+ */
11
+ import type { CallId } from '@deepseek-ai/dsh-llm';
12
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
13
+ import type { AutocompleteItem, SlashCommand } from './autocomplete.ts';
14
+ import { type HistorySearchState } from './history-search.ts';
15
+ import type { Frame, TranscriptScroll } from './renderer.ts';
16
+ import { type CopySelectorState } from './copy-selector.ts';
17
+ import { type SettingsState } from './settings-list.ts';
18
+ import { type PromptSelectorState } from './prompt-selector.ts';
19
+ import { type StatusBarConfig, type StatusPreset } from './status-config.ts';
20
+ import { type Theme, type ThemeName } from './theme.ts';
21
+ import type { TuiRecentSession, TuiSessionControls, TuiSessionStats } from './definition.ts';
22
+ import { type TuiToolPresentation } from './tool-renderers.ts';
23
+ import { type ToolInfo } from './tools-list.ts';
24
+ import { type HotkeyBindings } from './hotkeys.ts';
25
+ import type { WelcomeTip } from './welcome-tips.ts';
26
+ /** Display state of one tool invocation. */
27
+ export type ToolBlockStatus = 'running' | 'ok' | 'error';
28
+ /** One rendered block of the transcript. */
29
+ export type Block = {
30
+ kind: 'user';
31
+ text: string;
32
+ } | {
33
+ kind: 'assistant';
34
+ turn: number;
35
+ step: number;
36
+ text: string;
37
+ reasoning: string;
38
+ streaming: boolean;
39
+ } | {
40
+ kind: 'tool';
41
+ callId: CallId;
42
+ name: string;
43
+ args: string;
44
+ status: ToolBlockStatus;
45
+ output: string;
46
+ partial?: boolean;
47
+ presentation?: TuiToolPresentation;
48
+ } | {
49
+ kind: 'toolCatalog';
50
+ tools: readonly ToolInfo[];
51
+ } | {
52
+ kind: 'hotkeyCatalog';
53
+ bindings: HotkeyBindings;
54
+ } | {
55
+ kind: 'commandOutput';
56
+ command: string;
57
+ text: string;
58
+ } | {
59
+ kind: 'notice';
60
+ level: 'info' | 'error';
61
+ text: string;
62
+ };
63
+ /** Live session status shown on the status line. */
64
+ export type SessionStatus = 'idle' | 'running';
65
+ /** Mutable-free transcript state produced by applyEvent. */
66
+ export interface TranscriptState {
67
+ /** Ordered display blocks (user, assistant, tool). */
68
+ blocks: Block[];
69
+ /** Whole-agent liveness for the status line. */
70
+ status: SessionStatus;
71
+ /** The most recent turn number. */
72
+ turn: number;
73
+ }
74
+ /** Empty starting state. */
75
+ export declare function initialTranscript(): TranscriptState;
76
+ /**
77
+ * Fold one session-log event into the transcript state.
78
+ * @param state - prior state.
79
+ * @param event - the appended session event.
80
+ * @returns the next state.
81
+ */
82
+ export declare function applyEvent(state: TranscriptState, event: SessionEvent, presentation?: TuiToolPresentation): TranscriptState;
83
+ /** View options: terminal geometry and live input state. */
84
+ export interface ViewOptions {
85
+ /** Terminal width in columns. */
86
+ width: number;
87
+ /** Terminal height in rows; the view keeps the frame inside it. */
88
+ height: number;
89
+ /** Model name for the fixed footer. */
90
+ model: string;
91
+ /** Effective reasoning effort for the selected model, including adapter defaults. */
92
+ reasoningEffort?: string;
93
+ /** Current input buffer text. */
94
+ input: string;
95
+ /** Cursor column inside the input buffer (0-based, before the prefix). */
96
+ inputCursor: number;
97
+ /** Number of client-owned image drafts represented by input markers. */
98
+ inputImages?: number;
99
+ /** Whether to emit color SGR sequences. */
100
+ colors: boolean;
101
+ /** Working directory shown in the footer. */
102
+ pwd?: string;
103
+ /** Git branch shown in the footer. */
104
+ branch?: string;
105
+ /** Product version painted on the welcome title. */
106
+ version?: string;
107
+ /** Product name painted on the welcome title. */
108
+ appName?: string;
109
+ /** Spinner phase while a turn or tool is running. */
110
+ spinnerFrame?: number;
111
+ /** 24-bit color; defaults to off so tests stay deterministic. */
112
+ trueColor?: boolean;
113
+ /** Shipped palette; defaults to dark. */
114
+ themeName?: ThemeName;
115
+ /** Slash-command popup sitting under the editor. */
116
+ autocomplete?: {
117
+ items: readonly AutocompleteItem[];
118
+ selected: number;
119
+ };
120
+ /** Ctrl+R history-search overlay; replaces the editor while open. */
121
+ historySearch?: HistorySearchState;
122
+ /** `/settings` overlay; replaces the editor while open. */
123
+ settings?: SettingsState;
124
+ /** `/copy` picker overlay; replaces the editor while open. */
125
+ copySelector?: CopySelectorState;
126
+ /** Human-interaction selector; replaces the normal editor while active. */
127
+ promptSelector?: PromptSelectorState;
128
+ /** Effective local + agent-scoped slash command catalog. */
129
+ commands?: readonly SlashCommand[];
130
+ /** Durable rows shown in the welcome card. */
131
+ recentSessions?: readonly TuiRecentSession[];
132
+ /** Startup-stable sample of hints shown in the welcome card. */
133
+ welcomeTips?: readonly WelcomeTip[];
134
+ /** Whole-session figures rendered in the footer's telemetry row. */
135
+ sessionStats?: TuiSessionStats;
136
+ /** Harness-owned collaboration and permission state rendered in metadata. */
137
+ sessionControls?: TuiSessionControls;
138
+ /** Visible groups, order, and label style for the status line. */
139
+ statusBar?: StatusBarConfig;
140
+ /** Legacy status preset accepted while direct render callers migrate. */
141
+ statusPreset?: StatusPreset;
142
+ /**
143
+ * First transcript row to show (0 = top). Omit or pass +Infinity to pin
144
+ * the window to the latest lines — the OMP follow-tail default.
145
+ */
146
+ scrollStart?: number;
147
+ /** Open one transcript block at its first row instead of following the tail. */
148
+ focusBlock?: number;
149
+ /**
150
+ * When true, tool blocks paint their full output (OMP `ctrl+o`). Default
151
+ * is the collapsed preview of {@link TOOL_COLLAPSED_LINES} rows.
152
+ */
153
+ toolsExpanded?: boolean;
154
+ /** Individual tool calls expanded by the user. */
155
+ expandedTools?: ReadonlySet<string>;
156
+ }
157
+ /** Collapsed tool-output preview height (OMP `DEFAULT_TERMINAL_PREVIEW_LINES`). */
158
+ export declare const TOOL_COLLAPSED_LINES = 10;
159
+ /**
160
+ * Render one transcript block to display lines. Pure; shared by the tty view
161
+ * and the non-tty plain printer.
162
+ * @param block - the block to render.
163
+ * @param theme - active theme.
164
+ * @param width - terminal width in columns.
165
+ * @param spinnerFrame - activity spinner phase for running tools.
166
+ * @param toolsExpanded - paint full tool output instead of the collapsed preview.
167
+ * @returns display lines (already width-fitted).
168
+ */
169
+ export declare function blockLines(block: Block, theme: Theme, width: number, spinnerFrame?: number, toolsExpanded?: boolean): string[];
170
+ /** Rows moved per Shift+Arrow (OMP ScrollView `fastScrollLines`). */
171
+ export declare const TRANSCRIPT_FAST_SCROLL = 5;
172
+ /** Rows moved per mouse-wheel notch. */
173
+ export declare const TRANSCRIPT_WHEEL_SCROLL = 3;
174
+ /**
175
+ * Window `body` into `budget` rows with ↑/↓ overflow markers.
176
+ * `start` is the first body row to keep; non-finite values pin to the tail.
177
+ */
178
+ export declare function windowTranscript(body: readonly string[], budget: number, start: number, theme: Theme): TranscriptScroll & {
179
+ lines: string[];
180
+ };
181
+ /**
182
+ * Compose the welcome card, transcript, working row, and rounded editor into
183
+ * one frame — the oh-my-pi surface.
184
+ * @param state - transcript state.
185
+ * @param options - terminal geometry and input state.
186
+ * @returns the frame to hand to a renderer.
187
+ */
188
+ export declare function renderView(state: TranscriptState, options: ViewOptions): Frame;