ccompactor 0.1.1 → 0.1.2

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.
@@ -0,0 +1,513 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * The interactive browser.
4
+ *
5
+ * Three screens, because there are three questions: *which session* (browse),
6
+ * *is this the one* (quick look), and *what do I do with it* (actions). The
7
+ * first version had one screen and answered none of them — it listed sessions,
8
+ * and pressing `h` did nothing at all unless you had already extracted, which
9
+ * is the wrong order for anyone who does not yet know what they want.
10
+ *
11
+ * The rules it follows:
12
+ *
13
+ * - **The session id is never truncated.** It is the one column a reader may
14
+ * need to copy, and a truncated id is a useless one.
15
+ * - **Nothing is silent.** Every operation that can take longer than a blink
16
+ * shows the stage it is in, because on a 260 MB transcript a frozen screen and
17
+ * a working one look identical.
18
+ * - **The actions are named, not remembered.** Choosing a session shows what can
19
+ * be done to it, with the destination written out.
20
+ */
21
+ import { Box, Text, useApp, useInput, useStdout } from 'ink';
22
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
23
+ import { listSessions, fuzzyScore } from '../discover/index.js';
24
+ import { extractSession } from '../extract.js';
25
+ import { plan, installed } from '../handoff/index.js';
26
+ import { THEME, hazard, sizeLabel } from './theme.js';
27
+ import { enableMouse, readMouse } from './mouse.js';
28
+ import { loadDetails } from './details.js';
29
+ /** The terminal row the first session row occupies. Fixed, so a click maps. */
30
+ const LIST_TOP = 4;
31
+ /**
32
+ * How large a transcript may be before the table stops reading it in the
33
+ * background. Above this the row shows a size and a date, and the rest arrives
34
+ * when the reader lands on it.
35
+ */
36
+ const PREFILL_MAX_BYTES = 32 * 1024 * 1024;
37
+ export function App({ outDir, anyProject, onDone }) {
38
+ const { exit } = useApp();
39
+ const { stdout } = useStdout();
40
+ const columns = stdout?.columns ?? 100;
41
+ const rows = stdout?.rows ?? 30;
42
+ const [sessions, setSessions] = useState([]);
43
+ const [loading, setLoading] = useState('scanning agent stores …');
44
+ const [query, setQuery] = useState('');
45
+ const [searching, setSearching] = useState(false);
46
+ const [agentsOff, setAgentsOff] = useState(new Set());
47
+ const [cursor, setCursor] = useState(0);
48
+ const [offset, setOffset] = useState(0);
49
+ const [screen, setScreen] = useState('browse');
50
+ // One cache for every session whose metadata has been read, and one for the
51
+ // row being looked at. The window is prefilled in the background so the
52
+ // MSGS/TURNS/CWD columns fill in as the reader browses rather than sitting
53
+ // empty until they land on a row.
54
+ const [cache, setCache] = useState(new Map());
55
+ const [previewScroll, setPreviewScroll] = useState(0);
56
+ const [actionIndex, setActionIndex] = useState(0);
57
+ const [targetIndex, setTargetIndex] = useState(0);
58
+ const [targets, setTargets] = useState([]);
59
+ const [status, setStatus] = useState('');
60
+ const [progress, setProgress] = useState([]);
61
+ const [results, setResults] = useState([]);
62
+ const [lastArtifact, setLastArtifact] = useState();
63
+ const [error, setError] = useState();
64
+ const busy = useRef(false);
65
+ // ---- loading ------------------------------------------------------------
66
+ useEffect(() => {
67
+ void (async () => {
68
+ const found = await listSessions({ anyProject });
69
+ setSessions(found);
70
+ setTargets(installed());
71
+ setLoading('');
72
+ })();
73
+ }, [anyProject]);
74
+ const agents = useMemo(() => {
75
+ const counts = new Map();
76
+ for (const ref of sessions)
77
+ counts.set(ref.agent, (counts.get(ref.agent) ?? 0) + 1);
78
+ return [...counts.entries()].sort((a, b) => b[1] - a[1]);
79
+ }, [sessions]);
80
+ const filtered = useMemo(() => {
81
+ let out = sessions.filter((ref) => !agentsOff.has(ref.agent));
82
+ if (query.trim().length > 0) {
83
+ out = out
84
+ .map((ref) => ({ ref, score: fuzzyScore(query, `${ref.agent} ${ref.id} ${ref.path}`) }))
85
+ .filter((hit) => hit.score > 0)
86
+ .sort((a, b) => b.score - a.score)
87
+ .map((hit) => hit.ref);
88
+ }
89
+ return out;
90
+ }, [sessions, query, agentsOff]);
91
+ const visibleRows = Math.max(3, rows - LIST_TOP - 3);
92
+ const selected = filtered[cursor];
93
+ // Keep the cursor on screen without a scroll library.
94
+ useEffect(() => {
95
+ setOffset((current) => {
96
+ if (cursor < current)
97
+ return cursor;
98
+ if (cursor >= current + visibleRows)
99
+ return cursor - visibleRows + 1;
100
+ return current;
101
+ });
102
+ }, [cursor, visibleRows]);
103
+ // ---- details, loaded for whatever is under the cursor ----------------
104
+ //
105
+ // Debounced, because holding an arrow key should not queue twenty parses of a
106
+ // 260 MB file.
107
+ // ---- prefill the window -------------------------------------------------
108
+ //
109
+ // Bounded on purpose: only what is on screen, three at a time, and never a
110
+ // file already in the cache. Filling all 720 would mean parsing hundreds of
111
+ // megabytes for rows nobody has looked at.
112
+ useEffect(() => {
113
+ const window = filtered.slice(offset, offset + visibleRows);
114
+ // Big transcripts are left alone here and read only when the reader lands on
115
+ // one. Parsing a 268 MB session to fill in a column of file sizes is not a
116
+ // trade worth making, and doing thirty of them at once is what killed the
117
+ // process.
118
+ const wanted = window.filter((ref) => !cache.has(`${ref.agent}:${ref.id}`) && (ref.bytes ?? 0) < PREFILL_MAX_BYTES);
119
+ if (wanted.length === 0)
120
+ return;
121
+ let cancelled = false;
122
+ void (async () => {
123
+ for (const ref of wanted) {
124
+ if (cancelled)
125
+ return;
126
+ try {
127
+ const loaded = await loadDetails(ref, 1);
128
+ if (cancelled)
129
+ return;
130
+ setCache((current) => {
131
+ const next = new Map(current);
132
+ next.set(`${ref.agent}:${ref.id}`, loaded);
133
+ return next;
134
+ });
135
+ }
136
+ catch {
137
+ // A session that cannot be read is a row with no metadata, not a
138
+ // failed run. The real error is still available through `extract`.
139
+ }
140
+ }
141
+ })();
142
+ return () => {
143
+ cancelled = true;
144
+ };
145
+ }, [filtered, offset, visibleRows, cache]);
146
+ // Whatever is under the cursor is always read, however large, one at a time.
147
+ useEffect(() => {
148
+ if (!selected)
149
+ return;
150
+ const key = `${selected.agent}:${selected.id}`;
151
+ if (cache.has(key))
152
+ return;
153
+ let cancelled = false;
154
+ void (async () => {
155
+ try {
156
+ const loaded = await loadDetails(selected, 40);
157
+ if (cancelled)
158
+ return;
159
+ setCache((current) => {
160
+ const next = new Map(current);
161
+ next.set(key, loaded);
162
+ return next;
163
+ });
164
+ }
165
+ catch {
166
+ // As above: a row with no metadata.
167
+ }
168
+ })();
169
+ return () => {
170
+ cancelled = true;
171
+ };
172
+ }, [selected, cache]);
173
+ // ---- actions ------------------------------------------------------------
174
+ const actions = useMemo(() => {
175
+ const hasLlm = Boolean(process.env['CCOMPAT_API_KEY'] ?? process.env['CCOMPACTOR_API_KEY'] ?? process.env['ANTHROPIC_API_KEY'] ?? process.env['OPENAI_API_KEY']);
176
+ return [
177
+ {
178
+ id: 'handoff',
179
+ label: 'Extract, then hand off to another agent',
180
+ detail: 'fork this session into a new one, with the compacted context preloaded',
181
+ },
182
+ {
183
+ id: 'handoff-run',
184
+ label: 'Extract and launch the agent',
185
+ detail: 'same, and start it in this terminal when it is done',
186
+ },
187
+ {
188
+ id: 'extract',
189
+ label: 'Extract handoff — deterministic, no model',
190
+ detail: `brief + ledgers + retrieval index → ${outDir}/handoff.md`,
191
+ },
192
+ {
193
+ id: 'extract-llm',
194
+ label: 'Extract handoff — with a model-written summary',
195
+ detail: hasLlm ? `adds L1 via the configured backend → ${outDir}/handoff.md` : 'no API key found; set CCOMPACTOR_API_KEY and CCOMPACTOR_BASE_URL',
196
+ },
197
+ {
198
+ id: 'transcript',
199
+ label: 'Readable transcript — what was said, in order',
200
+ detail: `user and agent turns only → ${outDir}/transcript.md`,
201
+ },
202
+ {
203
+ id: 'transcript-full',
204
+ label: 'Readable transcript — including tool calls',
205
+ detail: `adds every tool call and its output → ${outDir}/transcript.md`,
206
+ },
207
+ {
208
+ id: 'verify',
209
+ label: 'Verify the artifact already in this directory',
210
+ detail: `re-check quotes and file paths against the transcript → ${outDir}`,
211
+ },
212
+ ];
213
+ }, [outDir]);
214
+ const run = useCallback(async (actionId, target) => {
215
+ if (!selected || busy.current)
216
+ return;
217
+ busy.current = true;
218
+ setError(undefined);
219
+ setResults([]);
220
+ setProgress([]);
221
+ setScreen('running');
222
+ const onProgress = (stage, message) => {
223
+ setProgress((current) => [...current.slice(-8), `${stage}: ${message}`]);
224
+ };
225
+ try {
226
+ if (actionId === 'verify') {
227
+ const { verify } = await import('../artifact/verify.js');
228
+ const report = await verify(outDir);
229
+ setResults([
230
+ `${report.constraintsQuoted} quote(s) checked, ${report.missingQuotes.length} missing`,
231
+ `${report.filesClaimed} file(s) claimed, ${report.missingFiles.length} gone`,
232
+ ]);
233
+ setScreen('done');
234
+ return;
235
+ }
236
+ const format = actionId.startsWith('transcript') ? 'transcript' : 'handoff';
237
+ const result = await extractSession(`${selected.agent}:${selected.id}`, {
238
+ outDir,
239
+ format,
240
+ full: actionId === 'transcript-full',
241
+ llm: actionId === 'extract-llm'
242
+ ? (await import('../llm/index.js')).resolveAuto()
243
+ : { kind: 'none' },
244
+ anyProject: true,
245
+ }, onProgress);
246
+ const artifact = result.written[0] ?? `${outDir}/handoff.md`;
247
+ setLastArtifact(artifact);
248
+ setResults([
249
+ `${result.rendered.tokens} tokens in ${result.elapsedMs} ms`,
250
+ ...result.written,
251
+ ]);
252
+ if (actionId === 'handoff' || actionId === 'handoff-run') {
253
+ const chosen = target ?? targets[0];
254
+ if (!chosen) {
255
+ setError('no launchable agent found on PATH');
256
+ setScreen('done');
257
+ return;
258
+ }
259
+ const launch = plan(chosen, artifact, process.cwd());
260
+ setResults((current) => [...current, `→ ${launch.display}`]);
261
+ if (actionId === 'handoff-run') {
262
+ exit();
263
+ const { spawnSync } = await import('node:child_process');
264
+ const child = spawnSync(launch.program, launch.argv, { stdio: 'inherit' });
265
+ onDone(child.status ?? 0);
266
+ return;
267
+ }
268
+ }
269
+ setScreen('done');
270
+ }
271
+ catch (caught) {
272
+ setError(caught.message);
273
+ setScreen('done');
274
+ }
275
+ finally {
276
+ busy.current = false;
277
+ }
278
+ }, [selected, outDir, targets, exit, onDone]);
279
+ const openActions = useCallback(() => {
280
+ setActionIndex(0);
281
+ setScreen('actions');
282
+ }, []);
283
+ const openPreview = useCallback(() => {
284
+ setPreviewScroll(0);
285
+ setScreen('preview');
286
+ }, []);
287
+ // ---- mouse --------------------------------------------------------------
288
+ useEffect(() => {
289
+ const stop = enableMouse(process.stdout);
290
+ const onData = (chunk) => {
291
+ const text = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
292
+ const { events } = readMouse(text);
293
+ for (const event of events)
294
+ handleMouse(event);
295
+ };
296
+ process.stdin.on('data', onData);
297
+ return () => {
298
+ process.stdin.off('data', onData);
299
+ stop();
300
+ };
301
+ // eslint-disable-next-line react-hooks/exhaustive-deps
302
+ }, [screen, cursor, offset, filtered.length, previewScroll, cache]);
303
+ function handleMouse(event) {
304
+ if (screen === 'browse') {
305
+ if (event.kind === 'wheel-up') {
306
+ setCursor((c) => Math.max(0, c - 3));
307
+ return;
308
+ }
309
+ if (event.kind === 'wheel-down') {
310
+ setCursor((c) => Math.min(filtered.length - 1, c + 3));
311
+ return;
312
+ }
313
+ if (event.kind === 'click') {
314
+ const row = event.y - LIST_TOP + offset;
315
+ if (row >= 0 && row < filtered.length) {
316
+ setCursor(row);
317
+ openPreview();
318
+ }
319
+ }
320
+ return;
321
+ }
322
+ if (screen === 'preview') {
323
+ if (event.kind === 'wheel-up')
324
+ setPreviewScroll((s) => Math.max(0, s - 3));
325
+ if (event.kind === 'wheel-down')
326
+ setPreviewScroll((s) => s + 3);
327
+ }
328
+ }
329
+ // ---- keys ---------------------------------------------------------------
330
+ useInput((input, key) => {
331
+ if (key.ctrl && input === 'c') {
332
+ exit();
333
+ onDone(0);
334
+ return;
335
+ }
336
+ if (screen === 'running')
337
+ return;
338
+ if (screen === 'done') {
339
+ if (key.return || key.escape || input === 'q') {
340
+ setScreen('browse');
341
+ }
342
+ return;
343
+ }
344
+ if (screen === 'actions') {
345
+ if (key.upArrow)
346
+ setActionIndex((i) => Math.max(0, i - 1));
347
+ if (key.downArrow)
348
+ setActionIndex((i) => Math.min(actions.length - 1, i + 1));
349
+ if (key.escape)
350
+ setScreen('browse');
351
+ if (key.return) {
352
+ const action = actions[actionIndex];
353
+ if (!action)
354
+ return;
355
+ if (action.id === 'handoff' || action.id === 'handoff-run') {
356
+ setTargetIndex(0);
357
+ setScreen('target');
358
+ return;
359
+ }
360
+ void run(action.id);
361
+ }
362
+ return;
363
+ }
364
+ if (screen === 'target') {
365
+ if (key.upArrow)
366
+ setTargetIndex((i) => Math.max(0, i - 1));
367
+ if (key.downArrow)
368
+ setTargetIndex((i) => Math.min(targets.length - 1, i + 1));
369
+ if (key.escape)
370
+ setScreen('actions');
371
+ if (key.return) {
372
+ const action = actions[actionIndex];
373
+ const target = targets[targetIndex];
374
+ if (action && target)
375
+ void run(action.id, target);
376
+ }
377
+ return;
378
+ }
379
+ if (screen === 'preview') {
380
+ if (key.escape || input === 'q') {
381
+ setScreen('browse');
382
+ return;
383
+ }
384
+ const lines = selected ? (cache.get(`${selected.agent}:${selected.id}`)?.preview.length ?? 0) : 0;
385
+ if (key.upArrow)
386
+ setPreviewScroll((s) => Math.max(0, s - 1));
387
+ if (key.downArrow)
388
+ setPreviewScroll((s) => Math.min(Math.max(0, lines - 1), s + 1));
389
+ if (input === 'a' || input === 'h' || key.return)
390
+ openActions();
391
+ return;
392
+ }
393
+ // browse
394
+ if (searching) {
395
+ if (key.return || key.escape)
396
+ setSearching(false);
397
+ else if (key.backspace || key.delete)
398
+ setQuery((q) => q.slice(0, -1));
399
+ else if (input && !key.ctrl && !key.meta) {
400
+ setQuery((q) => q + input);
401
+ setCursor(0);
402
+ }
403
+ return;
404
+ }
405
+ if (input === 'q') {
406
+ exit();
407
+ onDone(0);
408
+ return;
409
+ }
410
+ if (input === '/') {
411
+ setSearching(true);
412
+ setQuery('');
413
+ return;
414
+ }
415
+ if (input === 'c') {
416
+ setAgentFilter('claude');
417
+ return;
418
+ }
419
+ if (input === 'x') {
420
+ setAgentFilter('codex');
421
+ return;
422
+ }
423
+ if (input === 'p') {
424
+ setAgentFilter('pi');
425
+ return;
426
+ }
427
+ // `a` used to clear the agent filter here and open actions in the preview
428
+ // pane, so the hint line was lying on one of the two screens. One key, one
429
+ // meaning: `a` is actions everywhere, and `0` is the whole list.
430
+ if (input === '0') {
431
+ setAgentsOff(new Set());
432
+ setCursor(0);
433
+ return;
434
+ }
435
+ if (key.upArrow)
436
+ setCursor((c) => Math.max(0, c - 1));
437
+ if (key.downArrow)
438
+ setCursor((c) => Math.min(filtered.length - 1, c + 1));
439
+ if (key.return || input === ' ')
440
+ openPreview();
441
+ if (input === 'a' || input === 'e' || input === 'h')
442
+ openActions();
443
+ });
444
+ function setAgentFilter(agent) {
445
+ const known = agents.map(([name]) => name);
446
+ setAgentsOff(new Set(known.filter((name) => name !== agent)));
447
+ setCursor(0);
448
+ }
449
+ // ---- render -------------------------------------------------------------
450
+ if (loading)
451
+ return _jsx(Text, { color: THEME.yellow, children: loading });
452
+ const layout = layoutFor(columns, filtered.length > 0 ? filtered : sessions);
453
+ const chips = (_jsxs(Box, { children: [_jsx(Text, { bold: true, backgroundColor: THEME.yellow, color: THEME.onYellow, children: ' ccompactor ' }), _jsxs(Text, { color: THEME.muted, children: [' ', filtered.length, " of ", sessions.length, ' '] }), agents.map(([agent, count]) => {
454
+ const off = agentsOff.has(agent);
455
+ return (_jsx(Text, { ...(off
456
+ ? { color: THEME.muted }
457
+ : { backgroundColor: THEME.yellow, color: THEME.onYellow, bold: true }), children: ` ${agent} ${count} ` }, agent));
458
+ }), _jsx(Text, { color: THEME.muted, children: agentsOff.size > 0 ? ' press 0 for all' : '' })] }));
459
+ const hints = screen === 'browse'
460
+ ? 'c/x/p filter agent · 0 all · / search · ↑↓ wheel · enter or click quick look · a actions · q quit'
461
+ : screen === 'preview'
462
+ ? '↑↓ or wheel scroll · a actions · esc back'
463
+ : screen === 'actions'
464
+ ? '↑↓ choose · enter run · esc back'
465
+ : screen === 'target'
466
+ ? '↑↓ choose the agent to continue in · enter fork · esc back'
467
+ : '';
468
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: hazard(columns).map((cell, i) => (_jsx(Text, { color: cell.dim ? THEME.stripeDim : THEME.yellow, children: cell.ch }, i))) }), chips, screen === 'browse' && (_jsxs(_Fragment, { children: [_jsx(Columns, { layout: layout, width: columns }), _jsx(Box, { flexDirection: "column", children: filtered.slice(offset, offset + visibleRows).map((ref, i) => {
469
+ const index = offset + i;
470
+ const active = index === cursor;
471
+ const meta = cache.get(`${ref.agent}:${ref.id}`);
472
+ return (_jsx(Row, { ref_: ref, active: active, layout: layout, details: meta }, ref.path));
473
+ }) })] })), screen === 'preview' && selected && (_jsx(Preview, { ref_: selected, details: cache.get(`${selected.agent}:${selected.id}`), scroll: previewScroll, height: visibleRows + 2, width: columns })), screen === 'actions' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { bold: true, color: THEME.yellowInk, children: ["What do you want to do with ", selected?.agent, ":", selected?.id.slice(0, 8), "?"] }), actions.map((action, i) => (_jsxs(Text, { ...(i === actionIndex
474
+ ? { backgroundColor: THEME.yellow, color: THEME.onYellow, bold: true }
475
+ : {}), children: [i === actionIndex ? '❯ ' : ' ', action.label, _jsxs(Text, { color: i === actionIndex ? THEME.onYellow : THEME.muted, children: [' ', action.detail] })] }, action.id)))] })), screen === 'target' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, color: THEME.yellowInk, children: "Continue this session in which agent?" }), targets.length === 0 && _jsx(Text, { color: THEME.muted, children: "none found on PATH" }), targets.map((target, i) => (_jsxs(Text, { ...(i === targetIndex
476
+ ? { backgroundColor: THEME.yellow, color: THEME.onYellow, bold: true }
477
+ : {}), children: [i === targetIndex ? '❯ ' : ' ', target] }, target)))] })), screen === 'running' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { bold: true, color: THEME.yellowInk, children: ["working on ", selected?.agent, ":", selected?.id.slice(0, 8), " \u2026 ", elapsedLabel()] }), progress.slice(-6).map((line, i) => (_jsxs(Text, { color: THEME.muted, children: [' ', line] }, i)))] })), screen === 'done' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [error ? (_jsxs(Text, { color: "#FF6B6B", children: ["error: ", error] })) : (_jsx(Text, { bold: true, color: THEME.yellowInk, children: "done" })), results.map((line, i) => (_jsxs(Text, { color: THEME.muted, children: [' ', line] }, i))), lastArtifact && (_jsxs(Text, { color: THEME.muted, children: [' ', "read it: ", lastArtifact] })), _jsx(Text, { color: THEME.muted, children: "press enter to go back" })] })), status.length > 0 && _jsx(Text, { color: THEME.yellowInk, children: status }), searching && screen === 'browse' && (_jsxs(Box, { children: [_jsxs(Text, { bold: true, color: THEME.yellow, children: ["search:", ' '] }), _jsx(Text, { children: query }), _jsx(Text, { color: THEME.yellowInk, children: "\u258F" })] })), screen !== 'done' && screen !== 'running' && hints.length > 0 && (_jsx(Text, { color: THEME.muted, children: hints }))] }));
478
+ function elapsedLabel() {
479
+ return '';
480
+ }
481
+ }
482
+ function layoutFor(columns, sessions) {
483
+ const longest = sessions.reduce((n, ref) => Math.max(n, ref.id.length), 0);
484
+ const id = Math.min(Math.max(longest, 36), 64);
485
+ const fixed = 2 + 8 + id + 10 + 18;
486
+ return {
487
+ id,
488
+ meta: columns - fixed >= 14,
489
+ size: columns - fixed >= 10,
490
+ cwd: columns - fixed - (columns - fixed >= 14 ? 14 : 0) >= 42,
491
+ };
492
+ }
493
+ function Columns({ layout, width: columns }) {
494
+ return (_jsxs(Text, { color: THEME.muted, bold: true, children: [' ', 'AGENT'.padEnd(8), 'SESSION ID'.padEnd(layout.id), layout.meta ? 'MSGS'.padStart(7) + 'TURNS'.padStart(7) : '', layout.size ? 'SIZE'.padStart(10) : '', 'MODIFIED'.padStart(18), layout.cwd ? ` ${'CWD'}` : '', columns < 0 ? '' : ''] }));
495
+ }
496
+ function Row({ ref_, active, layout, details, }) {
497
+ const cwd = details?.cwd ?? '';
498
+ const shortCwd = cwd.length > 44 ? `…${cwd.slice(-42)}` : cwd;
499
+ const style = active ? { backgroundColor: THEME.yellow, color: THEME.onYellow, bold: true } : {};
500
+ return (_jsxs(Text, { ...style, children: [active ? '❯ ' : ' ', ref_.agent.padEnd(8), ref_.id.padEnd(layout.id), layout.meta
501
+ ? `${details ? String(details.messages) : '·'}`.padStart(7) +
502
+ `${details ? String(details.userTurns) : '·'}`.padStart(7)
503
+ : '', layout.size ? sizeLabel(ref_.bytes).padStart(10) : '', new Date(ref_.mtime).toISOString().slice(0, 16).replace('T', ' ').padStart(18), layout.cwd ? ` ${shortCwd}` : ''] }));
504
+ }
505
+ function Preview({ ref_, details, scroll, height, width: columns, }) {
506
+ if (!details) {
507
+ return (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: THEME.yellow, children: ["reading ", ref_.id, " \u2026"] }) }));
508
+ }
509
+ const lines = details.preview;
510
+ const shown = lines.slice(Math.max(0, lines.length - height - scroll + 1), lines.length - scroll);
511
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: THEME.muted, children: [ref_.agent, ":", ref_.id, ' ', details.messages, " msg \u00B7 ", details.userTurns, " user turns \u00B7 ", details.toolCalls, " tool calls \u00B7", ' ', details.tokens, " tokens \u00B7 ", details.compactBoundaries, " compaction(s)"] }), details.cwd && _jsxs(Text, { color: THEME.muted, children: ["cwd: ", details.cwd] }), details.branch && (_jsxs(Text, { color: THEME.muted, children: ["branch: ", details.branch, details.model ? ` · model: ${details.model}` : '', details.first ? ` · ${details.first.slice(0, 16).replace('T', ' ')} → ${details.last?.slice(0, 16).replace('T', ' ')}` : ''] })), _jsx(Text, { color: THEME.yellowInk, children: '─'.repeat(Math.max(10, Math.min(columns - 2, 100))) }), shown.map((line, i) => (_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: line.role === 'user' ? THEME.yellow : THEME.muted, bold: line.role === 'user', children: line.role === 'user' ? 'user ' : line.role === 'agent' ? 'agent ' : 'tool ' }), _jsx(Text, { children: line.text.slice(0, Math.max(20, columns - 10)) })] }, `${line.evt}-${i}`))), lines.length === 0 && _jsx(Text, { color: THEME.muted, children: "no user or agent turns in this session" })] }));
512
+ }
513
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Session metadata and a preview, loaded on demand.
3
+ *
4
+ * The list must stay fast — `stat` and nothing else — because scanning several
5
+ * hundred sessions with a full parse each would take minutes. So the columns a
6
+ * reader cares about are filled in when they land on a row, and the preview is
7
+ * loaded when they ask to look inside.
8
+ *
9
+ * The preview is what makes the tool usable without a session id in hand: the
10
+ * first thing anyone wants to know is "is this the session I meant?", and the
11
+ * only thing that answers it is the last few turns.
12
+ */
13
+ import type { SessionIR, SessionRef } from '../ir/types.js';
14
+ export interface PreviewLine {
15
+ role: string;
16
+ text: string;
17
+ evt: number;
18
+ }
19
+ export interface SessionDetails {
20
+ messages: number;
21
+ userTurns: number;
22
+ toolCalls: number;
23
+ tokens: number;
24
+ cwd?: string;
25
+ branch?: string;
26
+ model?: string;
27
+ version?: string;
28
+ first?: string;
29
+ last?: string;
30
+ compactBoundaries: number;
31
+ /** The newest turns, oldest first, for the quick look. */
32
+ preview: PreviewLine[];
33
+ diagnostics: number;
34
+ }
35
+ /** Load metadata and the newest `previewCount` turns. */
36
+ export declare function loadDetails(ref: SessionRef, previewCount?: number): Promise<SessionDetails>;
37
+ export declare function describe(ir: SessionIR, previewCount: number): SessionDetails;