@kenkaiiii/ggcoder 4.3.230 → 4.3.231

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 (182) hide show
  1. package/dist/core/goal-controller.d.ts +27 -6
  2. package/dist/core/goal-controller.d.ts.map +1 -1
  3. package/dist/core/goal-controller.js +246 -141
  4. package/dist/core/goal-controller.js.map +1 -1
  5. package/dist/core/goal-controller.test.js +210 -79
  6. package/dist/core/goal-controller.test.js.map +1 -1
  7. package/dist/core/goal-engine.d.ts +61 -0
  8. package/dist/core/goal-engine.d.ts.map +1 -0
  9. package/dist/core/goal-engine.js +123 -0
  10. package/dist/core/goal-engine.js.map +1 -0
  11. package/dist/core/goal-engine.test.d.ts +2 -0
  12. package/dist/core/goal-engine.test.d.ts.map +1 -0
  13. package/dist/core/goal-engine.test.js +295 -0
  14. package/dist/core/goal-engine.test.js.map +1 -0
  15. package/dist/core/goal-integration.d.ts +80 -0
  16. package/dist/core/goal-integration.d.ts.map +1 -0
  17. package/dist/core/goal-integration.js +296 -0
  18. package/dist/core/goal-integration.js.map +1 -0
  19. package/dist/core/goal-integration.test.d.ts +2 -0
  20. package/dist/core/goal-integration.test.d.ts.map +1 -0
  21. package/dist/core/goal-integration.test.js +369 -0
  22. package/dist/core/goal-integration.test.js.map +1 -0
  23. package/dist/core/goal-prerequisites.test.js +37 -1
  24. package/dist/core/goal-prerequisites.test.js.map +1 -1
  25. package/dist/core/goal-store.d.ts +80 -1
  26. package/dist/core/goal-store.d.ts.map +1 -1
  27. package/dist/core/goal-store.js +232 -65
  28. package/dist/core/goal-store.js.map +1 -1
  29. package/dist/core/goal-store.test.js +111 -2
  30. package/dist/core/goal-store.test.js.map +1 -1
  31. package/dist/core/goal-worker.d.ts.map +1 -1
  32. package/dist/core/goal-worker.js +55 -4
  33. package/dist/core/goal-worker.js.map +1 -1
  34. package/dist/core/goal-worker.test.js +75 -6
  35. package/dist/core/goal-worker.test.js.map +1 -1
  36. package/dist/core/goal-worktree.d.ts +55 -1
  37. package/dist/core/goal-worktree.d.ts.map +1 -1
  38. package/dist/core/goal-worktree.js +164 -1
  39. package/dist/core/goal-worktree.js.map +1 -1
  40. package/dist/core/goal-worktree.test.js +226 -4
  41. package/dist/core/goal-worktree.test.js.map +1 -1
  42. package/dist/system-prompt.d.ts.map +1 -1
  43. package/dist/system-prompt.js +9 -6
  44. package/dist/system-prompt.js.map +1 -1
  45. package/dist/system-prompt.test.js +1 -1
  46. package/dist/system-prompt.test.js.map +1 -1
  47. package/dist/tools/edit-diff.d.ts +17 -4
  48. package/dist/tools/edit-diff.d.ts.map +1 -1
  49. package/dist/tools/edit-diff.js +78 -16
  50. package/dist/tools/edit-diff.js.map +1 -1
  51. package/dist/tools/edit-diff.test.js +31 -1
  52. package/dist/tools/edit-diff.test.js.map +1 -1
  53. package/dist/tools/edit-robustness.test.d.ts +2 -0
  54. package/dist/tools/edit-robustness.test.d.ts.map +1 -0
  55. package/dist/tools/edit-robustness.test.js +415 -0
  56. package/dist/tools/edit-robustness.test.js.map +1 -0
  57. package/dist/tools/edit.d.ts.map +1 -1
  58. package/dist/tools/edit.js +15 -16
  59. package/dist/tools/edit.js.map +1 -1
  60. package/dist/tools/edit.test.js +23 -12
  61. package/dist/tools/edit.test.js.map +1 -1
  62. package/dist/tools/goals.d.ts +9 -1
  63. package/dist/tools/goals.d.ts.map +1 -1
  64. package/dist/tools/goals.js +78 -25
  65. package/dist/tools/goals.js.map +1 -1
  66. package/dist/tools/goals.test.js +142 -11
  67. package/dist/tools/goals.test.js.map +1 -1
  68. package/dist/ui/App.d.ts +9 -1
  69. package/dist/ui/App.d.ts.map +1 -1
  70. package/dist/ui/App.js +78 -16
  71. package/dist/ui/App.js.map +1 -1
  72. package/dist/ui/components/ChatLayout.d.ts +8 -1
  73. package/dist/ui/components/ChatLayout.d.ts.map +1 -1
  74. package/dist/ui/components/ChatLayout.js +4 -1
  75. package/dist/ui/components/ChatLayout.js.map +1 -1
  76. package/dist/ui/components/ChatScreen.d.ts +14 -1
  77. package/dist/ui/components/ChatScreen.d.ts.map +1 -1
  78. package/dist/ui/components/ChatScreen.js +3 -2
  79. package/dist/ui/components/ChatScreen.js.map +1 -1
  80. package/dist/ui/components/InputArea.d.ts +13 -1
  81. package/dist/ui/components/InputArea.d.ts.map +1 -1
  82. package/dist/ui/components/InputArea.js +96 -12
  83. package/dist/ui/components/InputArea.js.map +1 -1
  84. package/dist/ui/components/TranscriptViewport.d.ts +34 -0
  85. package/dist/ui/components/TranscriptViewport.d.ts.map +1 -0
  86. package/dist/ui/components/TranscriptViewport.js +45 -0
  87. package/dist/ui/components/TranscriptViewport.js.map +1 -0
  88. package/dist/ui/footer-jump-regression.test.d.ts +2 -0
  89. package/dist/ui/footer-jump-regression.test.d.ts.map +1 -0
  90. package/dist/ui/footer-jump-regression.test.js +167 -0
  91. package/dist/ui/footer-jump-regression.test.js.map +1 -0
  92. package/dist/ui/goal-events.d.ts +1 -1
  93. package/dist/ui/goal-events.d.ts.map +1 -1
  94. package/dist/ui/goal-events.js +2 -2
  95. package/dist/ui/goal-events.js.map +1 -1
  96. package/dist/ui/goal-events.test.js +2 -2
  97. package/dist/ui/goal-events.test.js.map +1 -1
  98. package/dist/ui/goal-lifecycle-orchestration.test.js +13 -97
  99. package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
  100. package/dist/ui/goal-progress.d.ts.map +1 -1
  101. package/dist/ui/goal-progress.js +0 -1
  102. package/dist/ui/goal-progress.js.map +1 -1
  103. package/dist/ui/goal-run-helpers.d.ts +0 -4
  104. package/dist/ui/goal-run-helpers.d.ts.map +1 -1
  105. package/dist/ui/goal-run-helpers.js +2 -21
  106. package/dist/ui/goal-run-helpers.js.map +1 -1
  107. package/dist/ui/hooks/useChatLayoutMeasurements.d.ts +8 -0
  108. package/dist/ui/hooks/useChatLayoutMeasurements.d.ts.map +1 -1
  109. package/dist/ui/hooks/useChatLayoutMeasurements.js +2 -0
  110. package/dist/ui/hooks/useChatLayoutMeasurements.js.map +1 -1
  111. package/dist/ui/hooks/useGoalOrchestration.d.ts +2 -1
  112. package/dist/ui/hooks/useGoalOrchestration.d.ts.map +1 -1
  113. package/dist/ui/hooks/useGoalOrchestration.js +198 -80
  114. package/dist/ui/hooks/useGoalOrchestration.js.map +1 -1
  115. package/dist/ui/hooks/useTerminalSize.d.ts +8 -1
  116. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  117. package/dist/ui/hooks/useTerminalSize.js +12 -2
  118. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  119. package/dist/ui/hooks/useTranscriptHistory.d.ts +1 -1
  120. package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
  121. package/dist/ui/hooks/useTranscriptHistory.js +23 -9
  122. package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
  123. package/dist/ui/hooks/useTranscriptHistory.test.d.ts +2 -0
  124. package/dist/ui/hooks/useTranscriptHistory.test.d.ts.map +1 -0
  125. package/dist/ui/hooks/useTranscriptHistory.test.js +61 -0
  126. package/dist/ui/hooks/useTranscriptHistory.test.js.map +1 -0
  127. package/dist/ui/hooks/useTranscriptScroll.d.ts +30 -0
  128. package/dist/ui/hooks/useTranscriptScroll.d.ts.map +1 -0
  129. package/dist/ui/hooks/useTranscriptScroll.js +44 -0
  130. package/dist/ui/hooks/useTranscriptScroll.js.map +1 -0
  131. package/dist/ui/hooks/useTranscriptScroll.test.d.ts +2 -0
  132. package/dist/ui/hooks/useTranscriptScroll.test.d.ts.map +1 -0
  133. package/dist/ui/hooks/useTranscriptScroll.test.js +119 -0
  134. package/dist/ui/hooks/useTranscriptScroll.test.js.map +1 -0
  135. package/dist/ui/live-area-clamp.test.js +11 -2
  136. package/dist/ui/live-area-clamp.test.js.map +1 -1
  137. package/dist/ui/render.d.ts +8 -0
  138. package/dist/ui/render.d.ts.map +1 -1
  139. package/dist/ui/render.js +69 -7
  140. package/dist/ui/render.js.map +1 -1
  141. package/dist/ui/stores/transcript-scroll-store.d.ts +27 -0
  142. package/dist/ui/stores/transcript-scroll-store.d.ts.map +1 -0
  143. package/dist/ui/stores/transcript-scroll-store.js +73 -0
  144. package/dist/ui/stores/transcript-scroll-store.js.map +1 -0
  145. package/dist/ui/stores/transcript-scroll-store.test.d.ts +2 -0
  146. package/dist/ui/stores/transcript-scroll-store.test.d.ts.map +1 -0
  147. package/dist/ui/stores/transcript-scroll-store.test.js +73 -0
  148. package/dist/ui/stores/transcript-scroll-store.test.js.map +1 -0
  149. package/dist/ui/testing/screen-recorder.d.ts +29 -0
  150. package/dist/ui/testing/screen-recorder.d.ts.map +1 -0
  151. package/dist/ui/testing/screen-recorder.js +179 -0
  152. package/dist/ui/testing/screen-recorder.js.map +1 -0
  153. package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
  154. package/dist/ui/transcript/TranscriptRenderer.js +1 -1
  155. package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
  156. package/dist/ui/transcript/spacing.d.ts +1 -0
  157. package/dist/ui/transcript/spacing.d.ts.map +1 -1
  158. package/dist/ui/transcript/spacing.js +7 -0
  159. package/dist/ui/transcript/spacing.js.map +1 -1
  160. package/dist/ui/transcript/spacing.test.js +29 -0
  161. package/dist/ui/transcript/spacing.test.js.map +1 -1
  162. package/dist/ui/transcript/transcript-lines.d.ts +32 -0
  163. package/dist/ui/transcript/transcript-lines.d.ts.map +1 -0
  164. package/dist/ui/transcript/transcript-lines.js +82 -0
  165. package/dist/ui/transcript/transcript-lines.js.map +1 -0
  166. package/dist/ui/transcript/transcript-lines.test.d.ts +2 -0
  167. package/dist/ui/transcript/transcript-lines.test.d.ts.map +1 -0
  168. package/dist/ui/transcript/transcript-lines.test.js +76 -0
  169. package/dist/ui/transcript/transcript-lines.test.js.map +1 -0
  170. package/dist/ui/transcript-viewport-pinning.test.d.ts +2 -0
  171. package/dist/ui/transcript-viewport-pinning.test.d.ts.map +1 -0
  172. package/dist/ui/transcript-viewport-pinning.test.js +148 -0
  173. package/dist/ui/transcript-viewport-pinning.test.js.map +1 -0
  174. package/dist/ui/tui-simulation.test.d.ts +2 -0
  175. package/dist/ui/tui-simulation.test.d.ts.map +1 -0
  176. package/dist/ui/tui-simulation.test.js +138 -0
  177. package/dist/ui/tui-simulation.test.js.map +1 -0
  178. package/dist/ui/tui-terminal-recorder.test.d.ts +2 -0
  179. package/dist/ui/tui-terminal-recorder.test.d.ts.map +1 -0
  180. package/dist/ui/tui-terminal-recorder.test.js +134 -0
  181. package/dist/ui/tui-terminal-recorder.test.js.map +1 -0
  182. package/package.json +5 -5
package/dist/ui/render.js CHANGED
@@ -28,6 +28,28 @@ const INK_OPTIONS = {
28
28
  // exitOnCtrlC is true. Disable it so our InputArea handles Ctrl+C.
29
29
  exitOnCtrlC: false,
30
30
  };
31
+ // Fullscreen alt-screen render tuning. Two settings work together to make
32
+ // scrolling smooth instead of jumpy/flickery:
33
+ //
34
+ // - incrementalRendering: Ink's default "standard" renderer erases ALL of the
35
+ // previous frame's lines (ansiEscapes.eraseLines) and rewrites the whole
36
+ // frame every tick. For a full-height fullscreen frame that means redrawing
37
+ // the footer/input/status rows — which never change during a scroll — on
38
+ // every step, and that erase-then-refill is the visible flicker. Ink's
39
+ // incremental renderer rewrites ONLY the lines that actually changed (the
40
+ // transcript region), leaving the controls untouched. No erase pass = no
41
+ // flicker. It also has explicit handling for the no-trailing-newline
42
+ // fullscreen frame, so it's the intended mode for this layout.
43
+ //
44
+ // - maxFps: the default 30fps cap (~33ms/frame) makes the coalesced scroll
45
+ // updates feel stepped. A higher cap lets paints keep up for a smooth glide;
46
+ // combined with incremental rendering each paint is cheap (only the changed
47
+ // rows are written). Ink wraps each frame in synchronized output (BSU/ESU)
48
+ // on a TTY, so higher fps doesn't tear.
49
+ //
50
+ // The legacy scrollback path keeps the conservative defaults (it appends to
51
+ // native scrollback, so there's no repaint to optimize).
52
+ const FULLSCREEN_INK_OPTIONS = { ...INK_OPTIONS, maxFps: 120, incrementalRendering: true };
31
53
  // XTMODKEYS "off" — turns off xterm's modifyOtherKeys=2 mode where Shift+Enter,
32
54
  // Ctrl+letters, etc. arrive as ESC[27;<mod>;<keycode>~. Some terminals
33
55
  // (Terminal.app, tmux passthrough, certain xterm configs) leave this enabled
@@ -42,15 +64,38 @@ const DISABLE_MODIFY_OTHER_KEYS = "\x1b[>4;0m";
42
64
  const DISABLE_FOCUS_REPORTING = "\x1b[?1004l";
43
65
  const SCREEN_CLEAR = DISABLE_MODIFY_OTHER_KEYS + "\x1b[2J\x1b[3J\x1b[H";
44
66
  const VIEWPORT_CLEAR = DISABLE_MODIFY_OTHER_KEYS + "\x1b[2J\x1b[H";
67
+ // Alternate screen buffer (smcup/rmcup). Entering gives a fresh blank screen
68
+ // with no native scrollback, so nothing can ever scroll Ink's live frame —
69
+ // this is what makes the footer a truly fixed bottom region. Leaving restores
70
+ // the user's original shell screen + scrollback intact.
71
+ const ALT_SCREEN_ENTER = "\x1b[?1049h";
72
+ const ALT_SCREEN_LEAVE = "\x1b[?1049l";
73
+ /**
74
+ * Fullscreen alternate-screen viewport mode. Default OFF: native terminal
75
+ * scrollback is the default (smooth, GPU-accelerated, real mouse-wheel scroll).
76
+ * Set `GG_FULLSCREEN=1` to opt into the alternate-screen in-Ink viewport
77
+ * (pinned footer, but no native scrollback). Non-TTY / CI / print modes never
78
+ * use it.
79
+ */
80
+ export function isFullscreenViewportEnabled() {
81
+ if (process.env.GG_FULLSCREEN === "1") {
82
+ return Boolean(process.stdout.isTTY && process.stdin.isTTY);
83
+ }
84
+ return false;
85
+ }
45
86
  export function getResetClearMode(options) {
46
87
  return options?.wipeSession || options?.history || options?.resizeRedraw ? "screen" : "viewport";
47
88
  }
48
89
  export async function renderApp(config) {
49
90
  const themeSetting = config.theme ?? "auto";
50
91
  const resolvedTheme = themeSetting === "auto" ? await detectTheme() : themeSetting;
92
+ const fullscreen = isFullscreenViewportEnabled();
51
93
  // Clear screen + scrollback so old commands don't appear above the TUI.
52
- // Also disables modifyOtherKeys (see DISABLE_MODIFY_OTHER_KEYS).
53
- process.stdout.write(SCREEN_CLEAR);
94
+ // Also disables modifyOtherKeys (see DISABLE_MODIFY_OTHER_KEYS). In fullscreen
95
+ // mode we first switch to the alternate screen buffer so the entire viewport
96
+ // (bounded transcript + pinned controls) is owned by Ink and nothing written
97
+ // around it can scroll the frame.
98
+ process.stdout.write((fullscreen ? ALT_SCREEN_ENTER : "") + SCREEN_CLEAR);
54
99
  // Belt-and-suspenders cleanup: tmux can re-enable modifyOtherKeys when it
55
100
  // forwards keyboard mode changes, and Ink's unmount path doesn't touch this
56
101
  // mode (it manages kitty + alternate-screen but not XTMODKEYS). Re-disable
@@ -58,7 +103,9 @@ export async function renderApp(config) {
58
103
  // that confuse the parent shell.
59
104
  const onProcessExit = () => {
60
105
  try {
61
- process.stdout.write(DISABLE_MODIFY_OTHER_KEYS + DISABLE_FOCUS_REPORTING);
106
+ // Leave the alternate screen LAST so the user's original shell scrollback
107
+ // returns intact, with no leftover artifacts from the fullscreen viewport.
108
+ process.stdout.write(DISABLE_MODIFY_OTHER_KEYS + DISABLE_FOCUS_REPORTING + (fullscreen ? ALT_SCREEN_LEAVE : ""));
62
109
  }
63
110
  catch {
64
111
  // stdout may already be torn down; nothing useful to do here.
@@ -98,8 +145,9 @@ export async function renderApp(config) {
98
145
  planMode: config.planModeRef?.current ?? false,
99
146
  };
100
147
  const terminalHistoryPrinter = createTerminalHistoryPrinter();
148
+ const inkOptions = fullscreen ? FULLSCREEN_INK_OPTIONS : INK_OPTIONS;
101
149
  const ref = { instance: null };
102
- const buildElement = () => React.createElement(ThemeProvider, { initial: resolvedTheme }, React.createElement(TerminalSizeProvider, { isAgentRunning: () => !!sessionStore.isAgentRunning }, React.createElement(AnimationProvider, null, React.createElement(App, {
150
+ const buildElement = () => React.createElement(ThemeProvider, { initial: resolvedTheme }, React.createElement(TerminalSizeProvider, { isAgentRunning: () => !!sessionStore.isAgentRunning, fullscreen }, React.createElement(AnimationProvider, null, React.createElement(App, {
103
151
  provider: runtimeState.provider,
104
152
  model: runtimeState.model,
105
153
  tools: config.tools,
@@ -135,6 +183,7 @@ export async function renderApp(config) {
135
183
  connectInitialMcpTools: config.connectInitialMcpTools,
136
184
  planCallbacks: config.planCallbacks,
137
185
  terminalHistoryPrinter,
186
+ fullscreen,
138
187
  resetUI,
139
188
  onRuntimeStateChange,
140
189
  sessionStore,
@@ -184,6 +233,14 @@ export async function renderApp(config) {
184
233
  if (options?.resizeRedraw) {
185
234
  terminalHistoryPrinter.resetPrinted();
186
235
  }
236
+ // Fullscreen alt-screen mode owns the entire screen and renders the
237
+ // transcript inside Ink, so there is no native scrollback to preserve or
238
+ // repaint — "clear" is just a screen wipe + cursor home before re-render.
239
+ if (fullscreen) {
240
+ process.stdout.write(VIEWPORT_CLEAR);
241
+ ref.instance = render(buildElement(), inkOptions);
242
+ return;
243
+ }
187
244
  // Resize can leave log-update frames at the old width in the visible viewport.
188
245
  // Repaint the durable transcript after a full clear so messages don't appear
189
246
  // to vanish on maximize and old input/status frames don't stack as duplicates.
@@ -199,9 +256,9 @@ export async function renderApp(config) {
199
256
  cwd: config.cwd,
200
257
  });
201
258
  }
202
- ref.instance = render(buildElement(), INK_OPTIONS);
259
+ ref.instance = render(buildElement(), inkOptions);
203
260
  }
204
- ref.instance = render(buildElement(), INK_OPTIONS);
261
+ ref.instance = render(buildElement(), inkOptions);
205
262
  // Terminal resize → full unmount/remount. Completed transcript rows are real
206
263
  // terminal output now, so resetUI() only rebuilds the live Ink controls unless
207
264
  // a fresh-session path asked to wipe scrollback. Debounced 250ms (shorter than
@@ -209,6 +266,11 @@ export async function renderApp(config) {
209
266
  // cancelled by its own useEffect cleanup when the old instance unmounts.
210
267
  let resizeTimer = null;
211
268
  const onTerminalResize = () => {
269
+ // Fullscreen alt-screen mode owns a full-height frame that Ink repaints in
270
+ // place on dimension changes (handled inside TerminalSizeProvider). No
271
+ // unmount/remount is needed — and doing one would flash the whole screen.
272
+ if (fullscreen)
273
+ return;
212
274
  if (resizeTimer)
213
275
  clearTimeout(resizeTimer);
214
276
  resizeTimer = setTimeout(() => {
@@ -252,7 +314,7 @@ export async function renderApp(config) {
252
314
  // but writing here ensures the disable lands before Node tears stdout
253
315
  // down on process termination.
254
316
  try {
255
- process.stdout.write(DISABLE_MODIFY_OTHER_KEYS + DISABLE_FOCUS_REPORTING);
317
+ process.stdout.write(DISABLE_MODIFY_OTHER_KEYS + DISABLE_FOCUS_REPORTING + (fullscreen ? ALT_SCREEN_LEAVE : ""));
256
318
  }
257
319
  catch {
258
320
  // ignored
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Update the maximum scroll offset (total transcript lines − viewport rows).
3
+ * Called by App whenever content length or viewport height changes. Re-pins to
4
+ * the bottom when the user hasn't scrolled, otherwise clamps their offset into
5
+ * the new range. Emits only when the offset actually changes, so growing
6
+ * content during a scroll-locked read doesn't churn renders.
7
+ */
8
+ export declare function setTranscriptScrollBounds(nextMaxOffset: number): void;
9
+ /**
10
+ * Scroll by a signed number of lines. Positive scrolls UP (toward older
11
+ * output), negative scrolls DOWN (toward newest). No-op when clamped to an
12
+ * edge, so wheel jitter at the top/bottom can't churn renders.
13
+ */
14
+ export declare function scrollTranscriptByLines(deltaLines: number): void;
15
+ /** Set the absolute offset (used by PageUp/Down, Shift+Arrows, g/G). */
16
+ export declare function setTranscriptScrollOffset(targetOffset: number): void;
17
+ /** Page up/down relative to the current offset by `page` lines. */
18
+ export declare function pageTranscriptScroll(page: number): void;
19
+ /** Snap back to the newest output (offset 0) — e.g. on a new prompt submit. */
20
+ export declare function resetTranscriptScroll(): void;
21
+ /** Jump to the very top (oldest output). */
22
+ export declare function scrollTranscriptToTop(): void;
23
+ /** Current clamped offset, non-reactively (for tests / imperative reads). */
24
+ export declare function getTranscriptScrollOffset(): number;
25
+ /** Reactive hook: re-renders the caller only when the scroll offset changes. */
26
+ export declare function useTranscriptScrollOffset(): number;
27
+ //# sourceMappingURL=transcript-scroll-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-scroll-store.d.ts","sourceRoot":"","sources":["../../../src/ui/stores/transcript-scroll-store.ts"],"names":[],"mappings":"AAkCA;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAKrE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAMhE;AAED,wEAAwE;AACxE,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAKpE;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGvD;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C;AAED,4CAA4C;AAC5C,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
@@ -0,0 +1,73 @@
1
+ import { createStore, useStore } from "./create-store.js";
2
+ const store = createStore({ offset: 0, isUserScrolled: false });
3
+ /**
4
+ * Scroll bounds kept OUTSIDE the reactive store: they change as content/layout
5
+ * change (driven by App), but on their own they should not trigger a viewport
6
+ * re-render — only an actual offset change should. `setTranscriptScrollBounds`
7
+ * re-clamps the offset and emits only when the visible offset actually moves.
8
+ */
9
+ let maxOffset = 0;
10
+ function clamp(value) {
11
+ return Math.min(Math.max(0, value), maxOffset);
12
+ }
13
+ /**
14
+ * Update the maximum scroll offset (total transcript lines − viewport rows).
15
+ * Called by App whenever content length or viewport height changes. Re-pins to
16
+ * the bottom when the user hasn't scrolled, otherwise clamps their offset into
17
+ * the new range. Emits only when the offset actually changes, so growing
18
+ * content during a scroll-locked read doesn't churn renders.
19
+ */
20
+ export function setTranscriptScrollBounds(nextMaxOffset) {
21
+ maxOffset = Math.max(0, Math.floor(nextMaxOffset));
22
+ const { offset, isUserScrolled } = store.getSnapshot();
23
+ const next = isUserScrolled ? Math.min(offset, maxOffset) : 0;
24
+ if (next !== offset)
25
+ store.setState({ offset: next });
26
+ }
27
+ /**
28
+ * Scroll by a signed number of lines. Positive scrolls UP (toward older
29
+ * output), negative scrolls DOWN (toward newest). No-op when clamped to an
30
+ * edge, so wheel jitter at the top/bottom can't churn renders.
31
+ */
32
+ export function scrollTranscriptByLines(deltaLines) {
33
+ if (deltaLines === 0)
34
+ return;
35
+ const { offset } = store.getSnapshot();
36
+ const next = clamp(offset + deltaLines);
37
+ if (next === offset)
38
+ return;
39
+ store.setState({ offset: next, isUserScrolled: next > 0 });
40
+ }
41
+ /** Set the absolute offset (used by PageUp/Down, Shift+Arrows, g/G). */
42
+ export function setTranscriptScrollOffset(targetOffset) {
43
+ const { offset } = store.getSnapshot();
44
+ const next = clamp(targetOffset);
45
+ if (next === offset)
46
+ return;
47
+ store.setState({ offset: next, isUserScrolled: next > 0 });
48
+ }
49
+ /** Page up/down relative to the current offset by `page` lines. */
50
+ export function pageTranscriptScroll(page) {
51
+ const { offset } = store.getSnapshot();
52
+ setTranscriptScrollOffset(offset + page);
53
+ }
54
+ /** Snap back to the newest output (offset 0) — e.g. on a new prompt submit. */
55
+ export function resetTranscriptScroll() {
56
+ const { offset, isUserScrolled } = store.getSnapshot();
57
+ if (offset === 0 && !isUserScrolled)
58
+ return;
59
+ store.setState({ offset: 0, isUserScrolled: false });
60
+ }
61
+ /** Jump to the very top (oldest output). */
62
+ export function scrollTranscriptToTop() {
63
+ setTranscriptScrollOffset(maxOffset);
64
+ }
65
+ /** Current clamped offset, non-reactively (for tests / imperative reads). */
66
+ export function getTranscriptScrollOffset() {
67
+ return clamp(store.getSnapshot().offset);
68
+ }
69
+ /** Reactive hook: re-renders the caller only when the scroll offset changes. */
70
+ export function useTranscriptScrollOffset() {
71
+ return useStore(store).offset;
72
+ }
73
+ //# sourceMappingURL=transcript-scroll-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-scroll-store.js","sourceRoot":"","sources":["../../../src/ui/stores/transcript-scroll-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transcript-scroll-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-scroll-store.test.d.ts","sourceRoot":"","sources":["../../../src/ui/stores/transcript-scroll-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { getTranscriptScrollOffset, pageTranscriptScroll, resetTranscriptScroll, scrollTranscriptByLines, scrollTranscriptToTop, setTranscriptScrollBounds, setTranscriptScrollOffset, } from "./transcript-scroll-store.js";
3
+ // The store is a module singleton; reset bounds + offset before each test.
4
+ beforeEach(() => {
5
+ setTranscriptScrollBounds(0);
6
+ resetTranscriptScroll();
7
+ });
8
+ describe("transcript-scroll-store", () => {
9
+ it("starts pinned to the bottom", () => {
10
+ expect(getTranscriptScrollOffset()).toBe(0);
11
+ });
12
+ it("scrolls up by a positive delta within bounds", () => {
13
+ setTranscriptScrollBounds(90);
14
+ scrollTranscriptByLines(3);
15
+ expect(getTranscriptScrollOffset()).toBe(3);
16
+ });
17
+ it("scrolls down toward the newest and clamps at 0", () => {
18
+ setTranscriptScrollBounds(90);
19
+ scrollTranscriptByLines(5);
20
+ scrollTranscriptByLines(-2);
21
+ expect(getTranscriptScrollOffset()).toBe(3);
22
+ scrollTranscriptByLines(-100);
23
+ expect(getTranscriptScrollOffset()).toBe(0);
24
+ });
25
+ it("clamps scroll-up to the maximum offset", () => {
26
+ setTranscriptScrollBounds(90);
27
+ scrollTranscriptByLines(9999);
28
+ expect(getTranscriptScrollOffset()).toBe(90);
29
+ });
30
+ it("pages relative to the current offset", () => {
31
+ setTranscriptScrollBounds(90);
32
+ pageTranscriptScroll(20);
33
+ expect(getTranscriptScrollOffset()).toBe(20);
34
+ pageTranscriptScroll(-5);
35
+ expect(getTranscriptScrollOffset()).toBe(15);
36
+ });
37
+ it("jumps to the top (max offset) and to the bottom (0)", () => {
38
+ setTranscriptScrollBounds(90);
39
+ scrollTranscriptToTop();
40
+ expect(getTranscriptScrollOffset()).toBe(90);
41
+ setTranscriptScrollOffset(0);
42
+ expect(getTranscriptScrollOffset()).toBe(0);
43
+ });
44
+ it("re-pins to the bottom on reset", () => {
45
+ setTranscriptScrollBounds(90);
46
+ scrollTranscriptByLines(40);
47
+ resetTranscriptScroll();
48
+ expect(getTranscriptScrollOffset()).toBe(0);
49
+ });
50
+ it("re-clamps the offset when bounds shrink while the user is scrolled", () => {
51
+ setTranscriptScrollBounds(90);
52
+ scrollTranscriptByLines(80);
53
+ expect(getTranscriptScrollOffset()).toBe(80);
54
+ // Content shrinks (e.g. compaction) — offset must clamp into the new range.
55
+ setTranscriptScrollBounds(50);
56
+ expect(getTranscriptScrollOffset()).toBe(50);
57
+ });
58
+ it("keeps the user pinned to the bottom as content grows when not scrolled", () => {
59
+ setTranscriptScrollBounds(10);
60
+ expect(getTranscriptScrollOffset()).toBe(0);
61
+ // New output arrives; an un-scrolled user stays at the bottom.
62
+ setTranscriptScrollBounds(40);
63
+ expect(getTranscriptScrollOffset()).toBe(0);
64
+ });
65
+ it("treats a no-op scroll at an edge without moving the offset", () => {
66
+ setTranscriptScrollBounds(0);
67
+ scrollTranscriptByLines(5);
68
+ expect(getTranscriptScrollOffset()).toBe(0);
69
+ scrollTranscriptByLines(-5);
70
+ expect(getTranscriptScrollOffset()).toBe(0);
71
+ });
72
+ });
73
+ //# sourceMappingURL=transcript-scroll-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-scroll-store.test.js","sourceRoot":"","sources":["../../../src/ui/stores/transcript-scroll-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare class ScreenRecorder {
2
+ readonly columns: number;
3
+ readonly rows: number;
4
+ private lines;
5
+ private cursorRow;
6
+ private cursorCol;
7
+ constructor({ columns, rows }: {
8
+ columns: number;
9
+ rows: number;
10
+ });
11
+ write(data: string): void;
12
+ /** The bottom `rows` lines of the buffer, trailing-trimmed. */
13
+ viewportLines(): string[];
14
+ /** Whole buffer joined as text (trailing-trimmed per line). */
15
+ fullText(): string;
16
+ /** 0-based row of the first viewport line containing `needle`, or -1. */
17
+ footerRow(needle: string): number;
18
+ private parseEscape;
19
+ private applyCsi;
20
+ private putChar;
21
+ private newLine;
22
+ private ensureLine;
23
+ }
24
+ /**
25
+ * A stdout-shaped object that replays every write into a {@link ScreenRecorder}.
26
+ * Mirrors the minimal surface Ink touches on a TTY stream.
27
+ */
28
+ export declare function makeRecordingStdout(recorder: ScreenRecorder): NodeJS.WriteStream;
29
+ //# sourceMappingURL=screen-recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-recorder.d.ts","sourceRoot":"","sources":["../../../src/ui/testing/screen-recorder.ts"],"names":[],"mappings":"AAgBA,qBAAa,cAAc;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;gBAEV,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAKhE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6BzB,+DAA+D;IAC/D,aAAa,IAAI,MAAM,EAAE;IAMzB,+DAA+D;IAC/D,QAAQ,IAAI,MAAM;IAIlB,yEAAyE;IACzE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIjC,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,QAAQ;IAoEhB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,UAAU;CAGnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC,WAAW,CAiBhF"}
@@ -0,0 +1,179 @@
1
+ export class ScreenRecorder {
2
+ columns;
3
+ rows;
4
+ lines = [[]];
5
+ cursorRow = 0;
6
+ cursorCol = 0;
7
+ constructor({ columns, rows }) {
8
+ this.columns = columns;
9
+ this.rows = rows;
10
+ }
11
+ write(data) {
12
+ let index = 0;
13
+ while (index < data.length) {
14
+ const char = data[index];
15
+ if (char === "\u001B") {
16
+ const parsed = this.parseEscape(data, index);
17
+ if (parsed === null) {
18
+ index += 1;
19
+ continue;
20
+ }
21
+ this.applyCsi(parsed.command);
22
+ index = parsed.nextIndex;
23
+ continue;
24
+ }
25
+ if (char === "\r") {
26
+ this.cursorCol = 0;
27
+ index += 1;
28
+ continue;
29
+ }
30
+ if (char === "\n") {
31
+ this.newLine();
32
+ index += 1;
33
+ continue;
34
+ }
35
+ this.putChar(char ?? " ");
36
+ index += 1;
37
+ }
38
+ }
39
+ /** The bottom `rows` lines of the buffer, trailing-trimmed. */
40
+ viewportLines() {
41
+ const rendered = this.lines.map((line) => line.join("").trimEnd());
42
+ const start = Math.max(0, rendered.length - this.rows);
43
+ return rendered.slice(start);
44
+ }
45
+ /** Whole buffer joined as text (trailing-trimmed per line). */
46
+ fullText() {
47
+ return this.lines.map((line) => line.join("").trimEnd()).join("\n");
48
+ }
49
+ /** 0-based row of the first viewport line containing `needle`, or -1. */
50
+ footerRow(needle) {
51
+ return this.viewportLines().findIndex((line) => line.includes(needle));
52
+ }
53
+ parseEscape(data, start) {
54
+ if (data[start + 1] !== "[")
55
+ return null;
56
+ let index = start + 2;
57
+ let params = "";
58
+ while (index < data.length) {
59
+ const char = data[index];
60
+ if (char && /[A-Za-z~]/u.test(char)) {
61
+ return { command: { params, final: char }, nextIndex: index + 1 };
62
+ }
63
+ params += char;
64
+ index += 1;
65
+ }
66
+ return null;
67
+ }
68
+ applyCsi({ params, final }) {
69
+ if (params.startsWith("?") || params.startsWith(">"))
70
+ return;
71
+ if (final === "m")
72
+ return;
73
+ const values = params
74
+ .split(";")
75
+ .filter((part) => part.length > 0)
76
+ .map((part) => Number(part));
77
+ const first = Number.isFinite(values[0]) ? values[0] : 0;
78
+ if (final === "A") {
79
+ this.cursorRow = Math.max(0, this.cursorRow - (first || 1));
80
+ return;
81
+ }
82
+ if (final === "B") {
83
+ this.cursorRow += first || 1;
84
+ this.ensureLine(this.cursorRow);
85
+ return;
86
+ }
87
+ if (final === "C") {
88
+ this.cursorCol = Math.min(this.columns - 1, this.cursorCol + (first || 1));
89
+ return;
90
+ }
91
+ if (final === "D") {
92
+ this.cursorCol = Math.max(0, this.cursorCol - (first || 1));
93
+ return;
94
+ }
95
+ if (final === "E") {
96
+ this.cursorRow += first || 1;
97
+ this.cursorCol = 0;
98
+ this.ensureLine(this.cursorRow);
99
+ return;
100
+ }
101
+ if (final === "F") {
102
+ this.cursorRow = Math.max(0, this.cursorRow - (first || 1));
103
+ this.cursorCol = 0;
104
+ return;
105
+ }
106
+ if (final === "G") {
107
+ this.cursorCol = Math.max(0, Math.min(this.columns - 1, (first || 1) - 1));
108
+ return;
109
+ }
110
+ if (final === "H" || final === "f") {
111
+ const row = Number.isFinite(values[0]) && values[0] > 0 ? values[0] - 1 : 0;
112
+ const col = Number.isFinite(values[1]) && values[1] > 0 ? values[1] - 1 : 0;
113
+ this.cursorRow = row;
114
+ this.cursorCol = Math.max(0, Math.min(this.columns - 1, col));
115
+ this.ensureLine(this.cursorRow);
116
+ return;
117
+ }
118
+ if (final === "J") {
119
+ if (first === 2 || first === 3) {
120
+ this.lines = [[]];
121
+ this.cursorRow = 0;
122
+ this.cursorCol = 0;
123
+ }
124
+ return;
125
+ }
126
+ if (final === "K") {
127
+ this.ensureLine(this.cursorRow);
128
+ if (first === 2) {
129
+ this.lines[this.cursorRow] = [];
130
+ this.cursorCol = 0;
131
+ }
132
+ else {
133
+ this.lines[this.cursorRow] = this.lines[this.cursorRow].slice(0, this.cursorCol);
134
+ }
135
+ }
136
+ }
137
+ putChar(char) {
138
+ if (this.cursorCol >= this.columns)
139
+ this.newLine();
140
+ this.ensureLine(this.cursorRow);
141
+ const line = this.lines[this.cursorRow];
142
+ while (line.length < this.cursorCol)
143
+ line.push(" ");
144
+ line[this.cursorCol] = char;
145
+ this.cursorCol += 1;
146
+ }
147
+ newLine() {
148
+ this.cursorRow += 1;
149
+ this.cursorCol = 0;
150
+ this.ensureLine(this.cursorRow);
151
+ }
152
+ ensureLine(row) {
153
+ while (this.lines.length <= row)
154
+ this.lines.push([]);
155
+ }
156
+ }
157
+ /**
158
+ * A stdout-shaped object that replays every write into a {@link ScreenRecorder}.
159
+ * Mirrors the minimal surface Ink touches on a TTY stream.
160
+ */
161
+ export function makeRecordingStdout(recorder) {
162
+ return {
163
+ columns: recorder.columns,
164
+ rows: recorder.rows,
165
+ isTTY: true,
166
+ writable: true,
167
+ writableEnded: false,
168
+ destroyed: false,
169
+ writableLength: 0,
170
+ write(chunk, callback) {
171
+ recorder.write(chunk);
172
+ callback?.(null);
173
+ return true;
174
+ },
175
+ on() { },
176
+ off() { },
177
+ };
178
+ }
179
+ //# sourceMappingURL=screen-recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-recorder.js","sourceRoot":"","sources":["../../../src/ui/testing/screen-recorder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TranscriptRenderer.d.ts","sourceRoot":"","sources":["../../../src/ui/transcript/TranscriptRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAkCrD,UAAU,2BAA2B;IACnC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,2BAA2B,CAAC,EAAE,aAAa,CAAC;IAC5C,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,QAAQ,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,KAAK,EACL,KAAK,EACL,2BAA2B,EAC3B,eAAe,EACf,OAAO,EACP,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,OAAO,EACP,KAAK,EAAE,MAAM,EACb,cAAc,EACd,oBAAoB,GACrB,EAAE,2BAA2B,GAAG,KAAK,CAAC,SAAS,CAgI/C"}
1
+ {"version":3,"file":"TranscriptRenderer.d.ts","sourceRoot":"","sources":["../../../src/ui/transcript/TranscriptRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAkCrD,UAAU,2BAA2B;IACnC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,2BAA2B,CAAC,EAAE,aAAa,CAAC;IAC5C,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,QAAQ,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,KAAK,EACL,KAAK,EACL,2BAA2B,EAC3B,eAAe,EACf,OAAO,EACP,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,OAAO,EACP,KAAK,EAAE,MAAM,EACb,cAAc,EACd,oBAAoB,GACrB,EAAE,2BAA2B,GAAG,KAAK,CAAC,SAAS,CAiI/C"}
@@ -45,7 +45,7 @@ export function renderTranscriptItem({ item, index, items, pendingHistoryFlushLa
45
45
  // Keep THINKING_HEADER_ROWS in sync with ThinkingBlock's collapsed layout.
46
46
  const THINKING_HEADER_ROWS = 2;
47
47
  const assistantLiveBudget = Math.max(1, measuredLiveAreaRows - transcriptMarginTop - (item.thinking ? THINKING_HEADER_ROWS : 0));
48
- return withTranscriptSpacing(_jsx(AssistantMessage, { text: item.text, thinking: item.thinking, thinkingMs: item.thinkingMs, renderMarkdown: renderMarkdown, availableTerminalHeight: assistantLiveBudget }, item.id));
48
+ return withTranscriptSpacing(_jsx(AssistantMessage, { text: item.text, thinking: item.thinking, thinkingMs: item.thinkingMs, continuation: item.continuation, renderMarkdown: renderMarkdown, availableTerminalHeight: assistantLiveBudget }, item.id));
49
49
  }
50
50
  case "tool_start":
51
51
  return withTranscriptSpacing(_jsx(ToolStartRow, { item: item }));