@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.
- package/dist/core/goal-controller.d.ts +27 -6
- package/dist/core/goal-controller.d.ts.map +1 -1
- package/dist/core/goal-controller.js +246 -141
- package/dist/core/goal-controller.js.map +1 -1
- package/dist/core/goal-controller.test.js +210 -79
- package/dist/core/goal-controller.test.js.map +1 -1
- package/dist/core/goal-engine.d.ts +61 -0
- package/dist/core/goal-engine.d.ts.map +1 -0
- package/dist/core/goal-engine.js +123 -0
- package/dist/core/goal-engine.js.map +1 -0
- package/dist/core/goal-engine.test.d.ts +2 -0
- package/dist/core/goal-engine.test.d.ts.map +1 -0
- package/dist/core/goal-engine.test.js +295 -0
- package/dist/core/goal-engine.test.js.map +1 -0
- package/dist/core/goal-integration.d.ts +80 -0
- package/dist/core/goal-integration.d.ts.map +1 -0
- package/dist/core/goal-integration.js +296 -0
- package/dist/core/goal-integration.js.map +1 -0
- package/dist/core/goal-integration.test.d.ts +2 -0
- package/dist/core/goal-integration.test.d.ts.map +1 -0
- package/dist/core/goal-integration.test.js +369 -0
- package/dist/core/goal-integration.test.js.map +1 -0
- package/dist/core/goal-prerequisites.test.js +37 -1
- package/dist/core/goal-prerequisites.test.js.map +1 -1
- package/dist/core/goal-store.d.ts +80 -1
- package/dist/core/goal-store.d.ts.map +1 -1
- package/dist/core/goal-store.js +232 -65
- package/dist/core/goal-store.js.map +1 -1
- package/dist/core/goal-store.test.js +111 -2
- package/dist/core/goal-store.test.js.map +1 -1
- package/dist/core/goal-worker.d.ts.map +1 -1
- package/dist/core/goal-worker.js +55 -4
- package/dist/core/goal-worker.js.map +1 -1
- package/dist/core/goal-worker.test.js +75 -6
- package/dist/core/goal-worker.test.js.map +1 -1
- package/dist/core/goal-worktree.d.ts +55 -1
- package/dist/core/goal-worktree.d.ts.map +1 -1
- package/dist/core/goal-worktree.js +164 -1
- package/dist/core/goal-worktree.js.map +1 -1
- package/dist/core/goal-worktree.test.js +226 -4
- package/dist/core/goal-worktree.test.js.map +1 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +9 -6
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +1 -1
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/edit-diff.d.ts +17 -4
- package/dist/tools/edit-diff.d.ts.map +1 -1
- package/dist/tools/edit-diff.js +78 -16
- package/dist/tools/edit-diff.js.map +1 -1
- package/dist/tools/edit-diff.test.js +31 -1
- package/dist/tools/edit-diff.test.js.map +1 -1
- package/dist/tools/edit-robustness.test.d.ts +2 -0
- package/dist/tools/edit-robustness.test.d.ts.map +1 -0
- package/dist/tools/edit-robustness.test.js +415 -0
- package/dist/tools/edit-robustness.test.js.map +1 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +15 -16
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +23 -12
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/goals.d.ts +9 -1
- package/dist/tools/goals.d.ts.map +1 -1
- package/dist/tools/goals.js +78 -25
- package/dist/tools/goals.js.map +1 -1
- package/dist/tools/goals.test.js +142 -11
- package/dist/tools/goals.test.js.map +1 -1
- package/dist/ui/App.d.ts +9 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +78 -16
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ChatLayout.d.ts +8 -1
- package/dist/ui/components/ChatLayout.d.ts.map +1 -1
- package/dist/ui/components/ChatLayout.js +4 -1
- package/dist/ui/components/ChatLayout.js.map +1 -1
- package/dist/ui/components/ChatScreen.d.ts +14 -1
- package/dist/ui/components/ChatScreen.d.ts.map +1 -1
- package/dist/ui/components/ChatScreen.js +3 -2
- package/dist/ui/components/ChatScreen.js.map +1 -1
- package/dist/ui/components/InputArea.d.ts +13 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +96 -12
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/TranscriptViewport.d.ts +34 -0
- package/dist/ui/components/TranscriptViewport.d.ts.map +1 -0
- package/dist/ui/components/TranscriptViewport.js +45 -0
- package/dist/ui/components/TranscriptViewport.js.map +1 -0
- package/dist/ui/footer-jump-regression.test.d.ts +2 -0
- package/dist/ui/footer-jump-regression.test.d.ts.map +1 -0
- package/dist/ui/footer-jump-regression.test.js +167 -0
- package/dist/ui/footer-jump-regression.test.js.map +1 -0
- package/dist/ui/goal-events.d.ts +1 -1
- package/dist/ui/goal-events.d.ts.map +1 -1
- package/dist/ui/goal-events.js +2 -2
- package/dist/ui/goal-events.js.map +1 -1
- package/dist/ui/goal-events.test.js +2 -2
- package/dist/ui/goal-events.test.js.map +1 -1
- package/dist/ui/goal-lifecycle-orchestration.test.js +13 -97
- package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
- package/dist/ui/goal-progress.d.ts.map +1 -1
- package/dist/ui/goal-progress.js +0 -1
- package/dist/ui/goal-progress.js.map +1 -1
- package/dist/ui/goal-run-helpers.d.ts +0 -4
- package/dist/ui/goal-run-helpers.d.ts.map +1 -1
- package/dist/ui/goal-run-helpers.js +2 -21
- package/dist/ui/goal-run-helpers.js.map +1 -1
- package/dist/ui/hooks/useChatLayoutMeasurements.d.ts +8 -0
- package/dist/ui/hooks/useChatLayoutMeasurements.d.ts.map +1 -1
- package/dist/ui/hooks/useChatLayoutMeasurements.js +2 -0
- package/dist/ui/hooks/useChatLayoutMeasurements.js.map +1 -1
- package/dist/ui/hooks/useGoalOrchestration.d.ts +2 -1
- package/dist/ui/hooks/useGoalOrchestration.d.ts.map +1 -1
- package/dist/ui/hooks/useGoalOrchestration.js +198 -80
- package/dist/ui/hooks/useGoalOrchestration.js.map +1 -1
- package/dist/ui/hooks/useTerminalSize.d.ts +8 -1
- package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
- package/dist/ui/hooks/useTerminalSize.js +12 -2
- package/dist/ui/hooks/useTerminalSize.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts +1 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.js +23 -9
- package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.test.d.ts +2 -0
- package/dist/ui/hooks/useTranscriptHistory.test.d.ts.map +1 -0
- package/dist/ui/hooks/useTranscriptHistory.test.js +61 -0
- package/dist/ui/hooks/useTranscriptHistory.test.js.map +1 -0
- package/dist/ui/hooks/useTranscriptScroll.d.ts +30 -0
- package/dist/ui/hooks/useTranscriptScroll.d.ts.map +1 -0
- package/dist/ui/hooks/useTranscriptScroll.js +44 -0
- package/dist/ui/hooks/useTranscriptScroll.js.map +1 -0
- package/dist/ui/hooks/useTranscriptScroll.test.d.ts +2 -0
- package/dist/ui/hooks/useTranscriptScroll.test.d.ts.map +1 -0
- package/dist/ui/hooks/useTranscriptScroll.test.js +119 -0
- package/dist/ui/hooks/useTranscriptScroll.test.js.map +1 -0
- package/dist/ui/live-area-clamp.test.js +11 -2
- package/dist/ui/live-area-clamp.test.js.map +1 -1
- package/dist/ui/render.d.ts +8 -0
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +69 -7
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/stores/transcript-scroll-store.d.ts +27 -0
- package/dist/ui/stores/transcript-scroll-store.d.ts.map +1 -0
- package/dist/ui/stores/transcript-scroll-store.js +73 -0
- package/dist/ui/stores/transcript-scroll-store.js.map +1 -0
- package/dist/ui/stores/transcript-scroll-store.test.d.ts +2 -0
- package/dist/ui/stores/transcript-scroll-store.test.d.ts.map +1 -0
- package/dist/ui/stores/transcript-scroll-store.test.js +73 -0
- package/dist/ui/stores/transcript-scroll-store.test.js.map +1 -0
- package/dist/ui/testing/screen-recorder.d.ts +29 -0
- package/dist/ui/testing/screen-recorder.d.ts.map +1 -0
- package/dist/ui/testing/screen-recorder.js +179 -0
- package/dist/ui/testing/screen-recorder.js.map +1 -0
- package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.js +1 -1
- package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
- package/dist/ui/transcript/spacing.d.ts +1 -0
- package/dist/ui/transcript/spacing.d.ts.map +1 -1
- package/dist/ui/transcript/spacing.js +7 -0
- package/dist/ui/transcript/spacing.js.map +1 -1
- package/dist/ui/transcript/spacing.test.js +29 -0
- package/dist/ui/transcript/spacing.test.js.map +1 -1
- package/dist/ui/transcript/transcript-lines.d.ts +32 -0
- package/dist/ui/transcript/transcript-lines.d.ts.map +1 -0
- package/dist/ui/transcript/transcript-lines.js +82 -0
- package/dist/ui/transcript/transcript-lines.js.map +1 -0
- package/dist/ui/transcript/transcript-lines.test.d.ts +2 -0
- package/dist/ui/transcript/transcript-lines.test.d.ts.map +1 -0
- package/dist/ui/transcript/transcript-lines.test.js +76 -0
- package/dist/ui/transcript/transcript-lines.test.js.map +1 -0
- package/dist/ui/transcript-viewport-pinning.test.d.ts +2 -0
- package/dist/ui/transcript-viewport-pinning.test.d.ts.map +1 -0
- package/dist/ui/transcript-viewport-pinning.test.js +148 -0
- package/dist/ui/transcript-viewport-pinning.test.js.map +1 -0
- package/dist/ui/tui-simulation.test.d.ts +2 -0
- package/dist/ui/tui-simulation.test.d.ts.map +1 -0
- package/dist/ui/tui-simulation.test.js +138 -0
- package/dist/ui/tui-simulation.test.js.map +1 -0
- package/dist/ui/tui-terminal-recorder.test.d.ts +2 -0
- package/dist/ui/tui-terminal-recorder.test.d.ts.map +1 -0
- package/dist/ui/tui-terminal-recorder.test.js +134 -0
- package/dist/ui/tui-terminal-recorder.test.js.map +1 -0
- 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
|
-
|
|
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
|
-
|
|
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(),
|
|
259
|
+
ref.instance = render(buildElement(), inkOptions);
|
|
203
260
|
}
|
|
204
|
-
ref.instance = render(buildElement(),
|
|
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
|
package/dist/ui/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAgC,MAAM,KAAK,CAAC;AAQ3D,OAAO,EAAE,GAAG,EAAuC,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAkB,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAgKlE,mFAAmF;AACnF,SAAS,aAAa,CAAC,EACrB,OAAO,EACP,QAAQ,GAGR;IACA,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAe,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhF,OAAO,KAAK,CAAC,aAAa,CACxB,eAAe,CAAC,QAAQ,EACxB,EAAE,KAAK,EAAE,QAAQ,EAAE,EACnB,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,kEAAkE;IAClE,mEAAmE;IACnE,oDAAoD;IACpD,aAAa,EAAE;QACb,IAAI,EAAE,SAAkB;QACxB,KAAK,EAAE,CAAC,yBAAkC,CAAC;KAC5C;IACD,oEAAoE;IACpE,oEAAoE;IACpE,gEAAgE;IAChE,mEAAmE;IACnE,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF,gFAAgF;AAChF,uEAAuE;AACvE,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,wEAAwE;AACxE,gFAAgF;AAChF,uEAAuE;AACvE,4EAA4E;AAC5E,oCAAoC;AACpC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AAC/C,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAC9C,MAAM,YAAY,GAAG,yBAAyB,GAAG,sBAAsB,CAAC;AACxE,MAAM,cAAc,GAAG,yBAAyB,GAAG,eAAe,CAAC;
|
|
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":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAoB1D,MAAM,KAAK,GAAG,WAAW,CAAwB,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;AAEvF;;;;;GAKG;AACH,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAqB;IAC7D,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,KAAK,MAAM;QAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO;IAC5B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACjC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO;IAC5B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,yBAAyB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc;QAAE,OAAO;IAC5C,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,qBAAqB;IACnC,yBAAyB,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,yBAAyB;IACvC,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,yBAAyB;IACvC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AAChC,CAAC"}
|
|
@@ -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,
|
|
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 }));
|