@duetso/agent 0.1.53 → 0.1.55

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 (106) hide show
  1. package/README.md +13 -2
  2. package/dist/package.json +1 -1
  3. package/dist/src/cli/help.js +1 -1
  4. package/dist/src/cli/memory-db.d.ts.map +1 -1
  5. package/dist/src/cli/memory-db.js +14 -5
  6. package/dist/src/cli/memory-db.js.map +1 -1
  7. package/dist/src/cli/memory-tui.js +1 -1
  8. package/dist/src/cli/memory-tui.js.map +1 -1
  9. package/dist/src/cli/resume-hint.d.ts +1 -1
  10. package/dist/src/cli/resume-hint.d.ts.map +1 -1
  11. package/dist/src/cli/resume-hint.js +2 -2
  12. package/dist/src/cli/resume-hint.js.map +1 -1
  13. package/dist/src/cli/run.d.ts +1 -1
  14. package/dist/src/cli/run.d.ts.map +1 -1
  15. package/dist/src/cli/run.js +7 -6
  16. package/dist/src/cli/run.js.map +1 -1
  17. package/dist/src/memory/context-pack.d.ts +29 -0
  18. package/dist/src/memory/context-pack.d.ts.map +1 -0
  19. package/dist/src/memory/context-pack.js +40 -0
  20. package/dist/src/memory/context-pack.js.map +1 -0
  21. package/dist/src/memory/embedding-worker.d.ts +26 -0
  22. package/dist/src/memory/embedding-worker.d.ts.map +1 -0
  23. package/dist/src/memory/embedding-worker.js +145 -0
  24. package/dist/src/memory/embedding-worker.js.map +1 -0
  25. package/dist/src/memory/embedding.d.ts +59 -0
  26. package/dist/src/memory/embedding.d.ts.map +1 -0
  27. package/dist/src/memory/embedding.js +126 -0
  28. package/dist/src/memory/embedding.js.map +1 -0
  29. package/dist/src/memory/loader.d.ts +81 -0
  30. package/dist/src/memory/loader.d.ts.map +1 -0
  31. package/dist/src/memory/loader.js +162 -0
  32. package/dist/src/memory/loader.js.map +1 -0
  33. package/dist/src/memory/migrations.d.ts +54 -0
  34. package/dist/src/memory/migrations.d.ts.map +1 -0
  35. package/dist/src/memory/migrations.js +199 -0
  36. package/dist/src/memory/migrations.js.map +1 -0
  37. package/dist/src/memory/observational.d.ts +18 -0
  38. package/dist/src/memory/observational.d.ts.map +1 -1
  39. package/dist/src/memory/observational.js +63 -14
  40. package/dist/src/memory/observational.js.map +1 -1
  41. package/dist/src/memory/pglite.d.ts +5 -5
  42. package/dist/src/memory/pglite.d.ts.map +1 -1
  43. package/dist/src/memory/pglite.js +20 -6
  44. package/dist/src/memory/pglite.js.map +1 -1
  45. package/dist/src/memory/recall.d.ts +49 -0
  46. package/dist/src/memory/recall.d.ts.map +1 -0
  47. package/dist/src/memory/recall.js +185 -0
  48. package/dist/src/memory/recall.js.map +1 -0
  49. package/dist/src/memory/storage.d.ts +36 -1
  50. package/dist/src/memory/storage.d.ts.map +1 -1
  51. package/dist/src/memory/storage.js +68 -14
  52. package/dist/src/memory/storage.js.map +1 -1
  53. package/dist/src/memory/store.d.ts +33 -1
  54. package/dist/src/memory/store.d.ts.map +1 -1
  55. package/dist/src/memory/store.js +22 -16
  56. package/dist/src/memory/store.js.map +1 -1
  57. package/dist/src/session/session.d.ts.map +1 -1
  58. package/dist/src/session/session.js +5 -1
  59. package/dist/src/session/session.js.map +1 -1
  60. package/dist/src/tui/app.d.ts.map +1 -1
  61. package/dist/src/tui/app.js +361 -30
  62. package/dist/src/tui/app.js.map +1 -1
  63. package/dist/src/tui/autocomplete.d.ts.map +1 -1
  64. package/dist/src/tui/autocomplete.js +5 -0
  65. package/dist/src/tui/autocomplete.js.map +1 -1
  66. package/dist/src/tui/clipboard.d.ts +28 -0
  67. package/dist/src/tui/clipboard.d.ts.map +1 -0
  68. package/dist/src/tui/clipboard.js +95 -0
  69. package/dist/src/tui/clipboard.js.map +1 -0
  70. package/dist/src/tui/history.d.ts +14 -0
  71. package/dist/src/tui/history.d.ts.map +1 -1
  72. package/dist/src/tui/history.js +21 -0
  73. package/dist/src/tui/history.js.map +1 -1
  74. package/dist/src/tui/recent-sessions.d.ts +51 -0
  75. package/dist/src/tui/recent-sessions.d.ts.map +1 -0
  76. package/dist/src/tui/recent-sessions.js +150 -0
  77. package/dist/src/tui/recent-sessions.js.map +1 -0
  78. package/dist/src/tui/starters.d.ts +92 -0
  79. package/dist/src/tui/starters.d.ts.map +1 -0
  80. package/dist/src/tui/starters.js +196 -0
  81. package/dist/src/tui/starters.js.map +1 -0
  82. package/dist/src/tui/theme.d.ts +2 -2
  83. package/dist/src/tui/theme.d.ts.map +1 -1
  84. package/dist/src/tui/theme.js +2 -2
  85. package/dist/src/tui/theme.js.map +1 -1
  86. package/dist/src/tui/transcript-log.d.ts +45 -0
  87. package/dist/src/tui/transcript-log.d.ts.map +1 -0
  88. package/dist/src/tui/transcript-log.js +76 -0
  89. package/dist/src/tui/transcript-log.js.map +1 -0
  90. package/dist/src/turn-runner/tools.d.ts +28 -1
  91. package/dist/src/turn-runner/tools.d.ts.map +1 -1
  92. package/dist/src/turn-runner/tools.js +135 -3
  93. package/dist/src/turn-runner/tools.js.map +1 -1
  94. package/dist/src/turn-runner/turn-runner.d.ts +1 -0
  95. package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
  96. package/dist/src/turn-runner/turn-runner.js +70 -3
  97. package/dist/src/turn-runner/turn-runner.js.map +1 -1
  98. package/dist/src/types/config.d.ts +12 -0
  99. package/dist/src/types/config.d.ts.map +1 -1
  100. package/dist/src/types/memory.d.ts +59 -21
  101. package/dist/src/types/memory.d.ts.map +1 -1
  102. package/package.json +1 -1
  103. package/dist/src/memory/schema.d.ts +0 -7
  104. package/dist/src/memory/schema.d.ts.map +0 -1
  105. package/dist/src/memory/schema.js +0 -21
  106. package/dist/src/memory/schema.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/tui/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAuBlE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAMV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AA8B9B,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1F,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EACV,iBAAiB,EACjB,iBAAiB,IAAI,sBAAsB,EAC3C,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,2BAA2B,EAC3B,8BAA8B,EAC9B,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACnD,6DAA6D;IAC7D,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAUD;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAs/CvF"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/tui/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAyBlE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAMV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAiC9B,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1F,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EACV,iBAAiB,EACjB,iBAAiB,IAAI,sBAAsB,EAC3C,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,2BAA2B,EAC3B,8BAA8B,EAC9B,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACnD,6DAA6D;IAC7D,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAUD;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAg2DvF"}
@@ -1,9 +1,14 @@
1
1
  import { BoxRenderable, createCliRenderer, decodePasteBytes, fg, ScrollBoxRenderable, t, TextRenderable, TextareaRenderable, } from "@opentui/core";
2
+ import { writeClipboardText } from "./clipboard.js";
2
3
  import { describeMacClipboardTypes, loadImageFromPath, looksLikeImageFilePath, persistPastedImage, sniffImageMimeType, tryReadClipboardImage, tryReadClipboardText, } from "./paste.js";
4
+ import { parseCopyArgument, selectCopyText } from "./transcript-log.js";
3
5
  import { activeFileAutocompleteToken, activeSkillAutocompleteToken, AUTOCOMPLETE_LIMITS, BUILT_IN_SLASH_COMMANDS, fileAutocompleteMatches, formatQuestionOptionDescription, formatSkillAutocompleteDescription, moveQuestionOptionSelection, moveSkillAutocompleteSelection, questionPickerAnswerPayload, skillAutocompleteMatches, } from "./autocomplete.js";
6
+ import { homedir } from "node:os";
4
7
  import { buildFileIndex } from "./file-index.js";
5
- import { DUET_BANNER_LINES, historyDisplayBlocks, limitHistoryDisplayBlocks, startupHeaderLines, } from "./history.js";
8
+ import { DUET_BANNER_LINES_COMPACT, historyDisplayBlocks, limitHistoryDisplayBlocks, } from "./history.js";
9
+ import { listRecentSessions } from "./recent-sessions.js";
6
10
  import { createSidebar, SIDEBAR_WIDTH } from "./sidebar.js";
11
+ import { orderedSelectableStarters, selectStarters } from "./starters.js";
7
12
  import { COLORS, HINT_IDLE, HINT_RUNNING } from "./theme.js";
8
13
  // Re-exports preserve the historical `tui/app.js` entry point used by tests
9
14
  // and external callers; the implementations live in focused leaf modules.
@@ -24,8 +29,15 @@ const QUESTION_OPTION_LIMIT = AUTOCOMPLETE_LIMITS.questionOption;
24
29
  */
25
30
  export async function runTui(input) {
26
31
  const previousWindow = Object.getOwnPropertyDescriptor(globalThis, "window");
32
+ // useMouse: true so the scroll wheel reaches the transcript
33
+ // ScrollBoxRenderable. Drag-select for native copy still works in every
34
+ // mainstream terminal by holding Option (macOS) or Shift (most Linux
35
+ // terminals) while dragging, which bypasses the terminal's mouse
36
+ // capture. PageUp/PageDown and Shift+Up/Down keyboard bindings below are
37
+ // the no-mouse fallback.
27
38
  const renderer = await createCliRenderer({
28
39
  exitOnCtrlC: true,
40
+ useMouse: true,
29
41
  useKittyKeyboard: {},
30
42
  targetFps: 60,
31
43
  });
@@ -258,6 +270,17 @@ export async function runTui(input) {
258
270
  // Monotonic counter for the next `[Image #N]` placeholder. Reset alongside
259
271
  // `pendingImages` so users see a fresh `#1` label after each submit.
260
272
  let nextImageId = 1;
273
+ // Parallel record of user/agent message bodies driven by the same code
274
+ // paths that render them into the transcript. The `/copy` slash command
275
+ // and Ctrl+Y keystroke read from this log instead of trying to walk the
276
+ // ScrollBoxRenderable, which only stores presentation lines.
277
+ const transcriptLog = [];
278
+ function recordTranscriptEntry(kind, text) {
279
+ const trimmed = text.trim();
280
+ if (!trimmed)
281
+ return;
282
+ transcriptLog.push({ kind, text: trimmed });
283
+ }
261
284
  let lastTerminal;
262
285
  let latestContextUsage;
263
286
  // Running USD total across every settled turn in this session. Reset only
@@ -415,12 +438,18 @@ export async function runTui(input) {
415
438
  }
416
439
  });
417
440
  function renderSetupIntro(skills, agentFiles) {
418
- for (const line of DUET_BANNER_LINES)
441
+ // Compact 3-row wordmark. The full DUET_BANNER_LINES is ~6 rows tall
442
+ // and pushed the starter list off-screen on small terminals; this one
443
+ // keeps the brand mark visible while leaving room for the ice-break
444
+ // prompts to land above the fold.
445
+ for (const line of DUET_BANNER_LINES_COMPACT)
419
446
  appendLine(line, COLORS.status);
420
- const [title, ...details] = startupHeaderLines(input);
421
- appendLine(title ?? "[duet]", COLORS.status);
422
- for (const line of details)
423
- appendLine(line, COLORS.hint);
447
+ appendLine(" ", COLORS.hint);
448
+ appendLine(" ", COLORS.hint);
449
+ // One-line header. Keeps cwd/model context visible without burning
450
+ // another five rows. Provenance (env/file source) is intentionally
451
+ // dropped here — surface it via /whoami later.
452
+ appendLine(formatBootHeader(input), COLORS.status);
424
453
  if (input.versionNoticePromise) {
425
454
  const versionLine = new TextRenderable(renderer, {
426
455
  content: "[version] checking for updates…",
@@ -438,19 +467,174 @@ export async function runTui(input) {
438
467
  }
439
468
  });
440
469
  }
441
- if (agentFiles.length === 0) {
442
- appendLine("[agent file] none", COLORS.hint);
443
- }
444
- else {
470
+ // Only mention agent files when one is actually loaded; "[agent file]
471
+ // none" is noise on every empty boot.
472
+ if (agentFiles.length > 0) {
445
473
  appendLine(`[agent file] ${agentFiles.map((file) => file.name).join(", ")}`, COLORS.hint);
446
474
  }
447
- if (skills.length === 0) {
448
- appendLine("[skills] none", COLORS.hint);
475
+ renderStarters(skills);
476
+ }
477
+ function formatBootHeader(headerInput) {
478
+ const cwdLabel = shortenCwd(headerInput.workDir);
479
+ return `DUET AGENT v${headerInput.packageVersion} · ${cwdLabel} · ${headerInput.modelName} + ${headerInput.memoryModelName}`;
480
+ }
481
+ function shortenCwd(cwd) {
482
+ const home = homedir();
483
+ if (cwd === home)
484
+ return "~";
485
+ if (cwd.startsWith(`${home}/`))
486
+ return `~${cwd.slice(home.length)}`;
487
+ return cwd;
488
+ }
489
+ const starterEntries = [];
490
+ // Lines we render for the starter section so we can repaint highlights
491
+ // and tear them all down on dismissal. Includes the headline, numbered
492
+ // rows, the optional resume row, and the two trailing hint rows.
493
+ const starterRefs = [];
494
+ // Indexes within `starterRefs` that correspond to numbered rows; used
495
+ // to repaint highlight on arrow / digit navigation.
496
+ const starterRowIndexes = [];
497
+ let highlightedStarterIndex = 0;
498
+ let startersVisible = false;
499
+ function startersAreVisible() {
500
+ return startersVisible;
501
+ }
502
+ function renderStarters(skills) {
503
+ // Read recent sessions off disk synchronously. The helper swallows fs
504
+ // errors and returns an empty list; a missing/empty ~/.duet/sessions
505
+ // directory is the common first-boot case.
506
+ const recentSessions = listRecentSessions({
507
+ excludeId: input.sessionId,
508
+ limit: 4,
509
+ });
510
+ const result = selectStarters({
511
+ cwd: input.workDir,
512
+ sessionHistory: input.history,
513
+ recentSessions,
514
+ });
515
+ // Selectable rows in render order. Recent sessions lead so returning
516
+ // users hit "pick up the thread" first; new users see the cwd starters
517
+ // under the original "what should we work on today?" headline.
518
+ const ordered = orderedSelectableStarters(result);
519
+ starterEntries.length = 0;
520
+ for (const row of ordered) {
521
+ if (row.kind === "recent" && row.sessionId !== undefined) {
522
+ starterEntries.push({
523
+ kind: "recent",
524
+ label: row.label,
525
+ submit: row.submit,
526
+ sessionId: row.sessionId,
527
+ });
528
+ }
529
+ else {
530
+ starterEntries.push({ kind: "prompt", label: row.label, submit: row.submit });
531
+ }
532
+ }
533
+ const hasRecent = result.recentSessions.length > 0;
534
+ starterRowIndexes.length = 0;
535
+ appendLine(" ", COLORS.hint);
536
+ if (hasRecent) {
537
+ // Returning user: continuity first.
538
+ starterRefs.push(addLine("pick up the thread", COLORS.agent));
539
+ appendLine(" ", COLORS.hint);
540
+ for (let i = 0; i < result.recentSessions.length; i += 1) {
541
+ const ref = addLine(formatStarterRow(i, false), COLORS.hint);
542
+ starterRowIndexes.push(starterRefs.length);
543
+ starterRefs.push(ref);
544
+ }
545
+ appendLine(" ", COLORS.hint);
546
+ starterRefs.push(addLine("or start something new", COLORS.agent));
547
+ appendLine(" ", COLORS.hint);
548
+ for (let j = 0; j < result.starters.length; j += 1) {
549
+ const i = result.recentSessions.length + j;
550
+ const ref = addLine(formatStarterRow(i, false), COLORS.hint);
551
+ starterRowIndexes.push(starterRefs.length);
552
+ starterRefs.push(ref);
553
+ }
449
554
  }
450
555
  else {
451
- const names = skills.map((skill) => skill.name).join(", ");
452
- appendLine(`[skills] ${skills.length} loaded: ${names}`, COLORS.hint);
556
+ // New user: original cwd-only ice-break.
557
+ starterRefs.push(addLine("what should we work on today?", COLORS.agent));
558
+ appendLine(" ", COLORS.hint);
559
+ for (let i = 0; i < starterEntries.length; i += 1) {
560
+ const ref = addLine(formatStarterRow(i, false), COLORS.hint);
561
+ starterRowIndexes.push(starterRefs.length);
562
+ starterRefs.push(ref);
563
+ }
453
564
  }
565
+ appendLine(" ", COLORS.hint);
566
+ starterRefs.push(addLine("type a number to run, ↑/↓ to highlight, or just start typing.", COLORS.hint));
567
+ starterRefs.push(addLine(`✦ ${skills.length} skill${skills.length === 1 ? "" : "s"} · /help`, COLORS.hint));
568
+ startersVisible = starterEntries.length > 0;
569
+ if (startersVisible) {
570
+ highlightedStarterIndex = 0;
571
+ paintStarterHighlight();
572
+ }
573
+ }
574
+ function addLine(content, fg) {
575
+ const line = new TextRenderable(renderer, { content: content || " ", fg });
576
+ transcript.add(line);
577
+ return line;
578
+ }
579
+ function formatStarterRow(index, highlighted) {
580
+ const entry = starterEntries[index];
581
+ const text = entry?.label ?? "";
582
+ const number = index + 1;
583
+ const arrow = highlighted ? "▶" : "→";
584
+ const numberCell = highlighted ? `[${number}]` : ` ${number} `;
585
+ return ` ${numberCell} ${arrow} ${text}`;
586
+ }
587
+ function paintStarterHighlight() {
588
+ for (let i = 0; i < starterRowIndexes.length; i += 1) {
589
+ const ref = starterRefs[starterRowIndexes[i]];
590
+ const isHighlighted = i === highlightedStarterIndex;
591
+ ref.content = formatStarterRow(i, isHighlighted);
592
+ ref.fg = isHighlighted ? COLORS.user : COLORS.hint;
593
+ }
594
+ }
595
+ function moveStarterHighlight(delta) {
596
+ if (!startersVisible || starterEntries.length === 0)
597
+ return;
598
+ const next = (highlightedStarterIndex + delta + starterEntries.length) % starterEntries.length;
599
+ highlightedStarterIndex = next;
600
+ paintStarterHighlight();
601
+ }
602
+ function jumpStarterHighlight(targetIndex) {
603
+ if (!startersVisible)
604
+ return false;
605
+ if (targetIndex < 0 || targetIndex >= starterEntries.length)
606
+ return false;
607
+ highlightedStarterIndex = targetIndex;
608
+ paintStarterHighlight();
609
+ return true;
610
+ }
611
+ function dismissStarters() {
612
+ if (!startersVisible && starterRefs.length === 0)
613
+ return;
614
+ for (const ref of starterRefs) {
615
+ transcript.remove(ref.id);
616
+ ref.destroy();
617
+ }
618
+ starterRefs.length = 0;
619
+ starterRowIndexes.length = 0;
620
+ starterEntries.length = 0;
621
+ startersVisible = false;
622
+ }
623
+ function submitHighlightedStarter() {
624
+ if (!startersVisible)
625
+ return false;
626
+ const entry = starterEntries[highlightedStarterIndex];
627
+ if (!entry)
628
+ return false;
629
+ dismissStarters();
630
+ // Recent-session rows reuse the prompt text in the *current* session
631
+ // rather than tearing down the runtime to switch sessions. The agent
632
+ // won't have prior context, but the user lands on the same task with
633
+ // one keystroke instead of typing it again. Documented tradeoff: a
634
+ // future iteration can swap this for true cross-session resume once
635
+ // the session manager exposes a hot-swap API.
636
+ submit(entry.submit);
637
+ return true;
454
638
  }
455
639
  function renderUsage(usage) {
456
640
  if (!usage)
@@ -501,6 +685,7 @@ export async function runTui(input) {
501
685
  activeReasoningStream = renderDelta(activeReasoningStream, "[reasoning]", step.delta, COLORS.reasoning, true);
502
686
  }
503
687
  else if (step.type === "text") {
688
+ recordTranscriptEntry("agent", step.text);
504
689
  if (activeTextStream) {
505
690
  finalizeDelta(activeTextStream, step.text);
506
691
  activeTextStream = undefined;
@@ -650,10 +835,6 @@ export async function runTui(input) {
650
835
  return truncateToolText(`${event.message}\n${content}`);
651
836
  }
652
837
  // ---- input handling --------------------------------------------------------
653
- // Track shift state for the most recent Enter keypress. The focused
654
- // InputRenderable handles its own `enter` event after onKeyDown fires, so we
655
- // capture the modifier here and read it during the ENTER event below.
656
- let lastEnterShift = false;
657
838
  let skillAutocompleteSkills = [];
658
839
  let skillAutocompleteToken;
659
840
  let skillAutocompleteItems = [];
@@ -770,7 +951,9 @@ export async function runTui(input) {
770
951
  const answers = questionPickerAnswerPayload(pendingQuestions, questionOptionSelectedIndex);
771
952
  if (!answers)
772
953
  return false;
773
- appendBlock("you:", Object.values(answers).join("\n"), COLORS.user);
954
+ const answerText = Object.values(answers).join("\n");
955
+ recordTranscriptEntry("user", answerText);
956
+ appendBlock("you:", answerText, COLORS.user);
774
957
  void input.session
775
958
  .answer({ questions: pendingQuestions, answers, behavior: "follow_up" })
776
959
  .catch(reportError);
@@ -968,10 +1151,71 @@ export async function runTui(input) {
968
1151
  key.preventDefault();
969
1152
  void requestExit();
970
1153
  });
1154
+ // Keyboard scroll bindings for the transcript. Mirrors the mouse wheel
1155
+ // for terminals that swallow mouse events (tmux without mouse mode, ssh
1156
+ // sessions where the local terminal owns the wheel, screen readers).
1157
+ // Page = one viewport; Shift+arrow = three lines, matching wheel cadence.
1158
+ function scrollTranscriptByLines(delta) {
1159
+ transcript.scrollBy({ x: 0, y: delta });
1160
+ }
1161
+ function scrollTranscriptByPage(direction) {
1162
+ // Subtract 2 to account for the top+bottom border rows; padding lives
1163
+ // inside the scroll viewport and does not need to be deducted.
1164
+ const viewport = Math.max(1, transcript.height - 2);
1165
+ transcript.scrollBy({ x: 0, y: direction * viewport });
1166
+ }
971
1167
  // Attach directly to the focused InputRenderable. The Textarea-based input
972
1168
  // consumes escape via its own keybindings before any global keypress handler
973
1169
  // fires, so we intercept at the Renderable's onKeyDown hook which runs first.
974
1170
  inputField.onKeyDown = (key) => {
1171
+ if (key.name === "pageup") {
1172
+ scrollTranscriptByPage(-1);
1173
+ key.preventDefault();
1174
+ return;
1175
+ }
1176
+ if (key.name === "pagedown") {
1177
+ scrollTranscriptByPage(1);
1178
+ key.preventDefault();
1179
+ return;
1180
+ }
1181
+ if (key.shift && key.name === "up" && !key.ctrl && !key.meta && !key.super) {
1182
+ scrollTranscriptByLines(-3);
1183
+ key.preventDefault();
1184
+ return;
1185
+ }
1186
+ if (key.shift && key.name === "down" && !key.ctrl && !key.meta && !key.super) {
1187
+ scrollTranscriptByLines(3);
1188
+ key.preventDefault();
1189
+ return;
1190
+ }
1191
+ // Boot starter navigation. Only intercepts when the starter section is
1192
+ // still on screen; once dismissed (by composition or first submit) all
1193
+ // of these branches no-op and keys flow normally to the input.
1194
+ if (startersAreVisible() && inputField.plainText.length === 0) {
1195
+ if (key.name === "up") {
1196
+ moveStarterHighlight(-1);
1197
+ key.preventDefault();
1198
+ return;
1199
+ }
1200
+ if (key.name === "down") {
1201
+ moveStarterHighlight(1);
1202
+ key.preventDefault();
1203
+ return;
1204
+ }
1205
+ if (key.name &&
1206
+ key.name.length === 1 &&
1207
+ key.name >= "1" &&
1208
+ key.name <= "9" &&
1209
+ !key.ctrl &&
1210
+ !key.meta &&
1211
+ !key.super) {
1212
+ const target = Number.parseInt(key.name, 10) - 1;
1213
+ if (jumpStarterHighlight(target)) {
1214
+ key.preventDefault();
1215
+ return;
1216
+ }
1217
+ }
1218
+ }
975
1219
  // Cmd+V / Ctrl+V keystroke trigger. Many terminals (Warp in particular,
976
1220
  // and macOS Terminal.app for binary clipboards) do not forward a paste
977
1221
  // event to TUI programs on Cmd+V — they handle the clipboard at the app
@@ -988,6 +1232,15 @@ export async function runTui(input) {
988
1232
  void triggerClipboardProbe("keystroke");
989
1233
  return;
990
1234
  }
1235
+ // Ctrl+Y — emacs-style "yank," repurposed here as the keyboard hotkey
1236
+ // for the `/copy` slash command. macOS Cmd+C is owned by the terminal
1237
+ // emulator and never reaches the TUI, so Ctrl+Y is the closest thing
1238
+ // to a real copy keystroke we can deliver across all terminals.
1239
+ if (key.name === "y" && key.ctrl && !key.shift && !key.super && !key.meta) {
1240
+ key.preventDefault();
1241
+ void handleCopySlashCommand("/copy");
1242
+ return;
1243
+ }
991
1244
  if (skillAutocompleteIsOpen()) {
992
1245
  if (key.name === "up") {
993
1246
  skillAutocompleteSelectedIndex = moveSkillAutocompleteSelection(skillAutocompleteSelectedIndex, skillAutocompleteItems.length, -1);
@@ -1059,17 +1312,26 @@ export async function runTui(input) {
1059
1312
  }
1060
1313
  }
1061
1314
  if (key.name === "return" || key.name === "enter") {
1062
- lastEnterShift = Boolean(key.shift);
1315
+ // Shift+Enter inserts a literal newline at the cursor, matching every
1316
+ // modern chat composer (Slack, Claude Code, ChatGPT, Discord). Plain
1317
+ // Enter always submits — when the agent is running the submit path
1318
+ // queues the message as a follow-up; otherwise it kicks off a new turn.
1319
+ key.preventDefault();
1320
+ if (key.shift) {
1321
+ inputField.insertText("\n");
1322
+ return;
1323
+ }
1063
1324
  const value = inputField.plainText.trim();
1064
1325
  inputField.clear();
1065
- key.preventDefault();
1066
1326
  if (value) {
1067
- submit(value, lastEnterShift);
1327
+ submit(value);
1068
1328
  }
1069
1329
  else if (questionPickerIsOpen()) {
1070
1330
  submitSelectedQuestionOption();
1071
1331
  }
1072
- lastEnterShift = false;
1332
+ else if (startersAreVisible()) {
1333
+ submitHighlightedStarter();
1334
+ }
1073
1335
  return;
1074
1336
  }
1075
1337
  if (key.name === "escape") {
@@ -1077,7 +1339,14 @@ export async function runTui(input) {
1077
1339
  return;
1078
1340
  }
1079
1341
  };
1080
- inputField.onContentChange = () => refreshAutocomplete();
1342
+ inputField.onContentChange = () => {
1343
+ // First real keystroke into the input collapses the starter section
1344
+ // — the user is composing their own prompt, so the suggestions get
1345
+ // out of the way for the rest of the session.
1346
+ if (startersAreVisible() && inputField.plainText.length > 0)
1347
+ dismissStarters();
1348
+ refreshAutocomplete();
1349
+ };
1081
1350
  inputField.onCursorChange = () => refreshAutocomplete();
1082
1351
  // Paste handling. Terminals that forward binary clipboard contents (kitty,
1083
1352
  // ghostty, recent iTerm2 builds) deliver image bytes directly via the paste
@@ -1222,7 +1491,11 @@ export async function runTui(input) {
1222
1491
  appendBlock("[paste]", `clipboard probe failed: ${error instanceof Error ? error.message : String(error)}`, COLORS.error);
1223
1492
  }
1224
1493
  }
1225
- function submit(message, shiftEnter) {
1494
+ function submit(message) {
1495
+ // First user submit collapses the boot starter section permanently for
1496
+ // this session, even when the prompt came from autocomplete or paste.
1497
+ if (startersAreVisible())
1498
+ dismissStarters();
1226
1499
  // Slash-style attach commands run locally and never reach the runner so
1227
1500
  // users on terminals that do not forward image bytes still have a way to
1228
1501
  // attach images by path.
@@ -1239,7 +1512,12 @@ export async function runTui(input) {
1239
1512
  appendBlock("[paste]", "cleared pending image attachments", COLORS.system);
1240
1513
  return;
1241
1514
  }
1515
+ if (message === "/copy" || message.startsWith("/copy ")) {
1516
+ void handleCopySlashCommand(message);
1517
+ return;
1518
+ }
1242
1519
  const submittedImages = pendingImages;
1520
+ recordTranscriptEntry("user", message);
1243
1521
  appendBlock("you:", message, COLORS.user);
1244
1522
  // Render attachments as a separate hint-colored footnote rather than
1245
1523
  // inlining them into the user-message block. Keeps the transcript
@@ -1255,13 +1533,49 @@ export async function runTui(input) {
1255
1533
  // Reset before dispatch so an in-flight error does not leave the user
1256
1534
  // double-charged with the same attachments on retry.
1257
1535
  clearPendingImages();
1258
- if (running) {
1259
- const behavior = shiftEnter ? "follow_up" : "steer";
1260
- void input.session.prompt({ message, behavior, images }).catch(reportError);
1536
+ // Every submit — running or idle — is a follow_up. While the agent is
1537
+ // running this queues; while idle it kicks off a fresh turn. Single
1538
+ // mental model: type, press Enter, your message lands.
1539
+ void input.session.prompt({ message, behavior: "follow_up", images }).catch(reportError);
1540
+ if (!running) {
1541
+ markRunning();
1542
+ }
1543
+ }
1544
+ /**
1545
+ * Resolve a `/copy ...` invocation to clipboard text and pipe it to the
1546
+ * OS clipboard. Surfaces every failure mode in the transcript so users on
1547
+ * minimal Linux installs see exactly which writer is missing (e.g.
1548
+ * "install xclip or wl-clipboard").
1549
+ */
1550
+ async function handleCopySlashCommand(raw) {
1551
+ const argumentRaw = raw === "/copy" ? "" : raw.slice("/copy ".length);
1552
+ const argument = parseCopyArgument(argumentRaw);
1553
+ if (argument === undefined) {
1554
+ appendBlock("[copy]", "Usage: /copy [last|all|<N>] — last (default) copies the most recent agent reply", COLORS.system);
1261
1555
  return;
1262
1556
  }
1263
- void input.session.prompt({ message, behavior: "follow_up", images }).catch(reportError);
1264
- markRunning();
1557
+ const text = selectCopyText(transcriptLog, argument);
1558
+ if (!text) {
1559
+ appendBlock("[copy]", "nothing to copy yet", COLORS.system);
1560
+ return;
1561
+ }
1562
+ const result = await writeClipboardText(text);
1563
+ if (result.ok) {
1564
+ const summary = describeCopySelection(argument, text.length);
1565
+ appendBlock("[copy]", `copied ${summary} to clipboard via ${result.via}`, COLORS.system);
1566
+ }
1567
+ else {
1568
+ appendBlock("[copy]", `clipboard write failed: ${result.error ?? "unknown error"}` +
1569
+ (process.platform === "linux" ? "\nInstall one of: wl-clipboard, xclip, xsel" : ""), COLORS.error);
1570
+ }
1571
+ }
1572
+ function describeCopySelection(argument, length) {
1573
+ const chars = `${length} char${length === 1 ? "" : "s"}`;
1574
+ if (argument === "last")
1575
+ return `last message (${chars})`;
1576
+ if (argument === "all")
1577
+ return `full transcript (${chars})`;
1578
+ return `last ${argument} messages (${chars})`;
1265
1579
  }
1266
1580
  async function handleImageSlashCommand(raw) {
1267
1581
  const rest = raw.slice("/image".length).trim();
@@ -1323,8 +1637,25 @@ export async function runTui(input) {
1323
1637
  appendDisplayBlock(block);
1324
1638
  }
1325
1639
  }
1640
+ // Seed the copy-out log from full resumed history (not the trimmed display
1641
+ // slice) so `/copy all` and `/copy <N>` can reach back further than what is
1642
+ // actually rendered in the transcript on resume.
1643
+ if (input.history && input.history.length > 0) {
1644
+ for (const block of historyDisplayBlocks(input.history)) {
1645
+ if (block.kind === "user") {
1646
+ // History blocks for users are formatted as `you:\n<text>`; strip the
1647
+ // label so the clipboard text matches what the user originally typed.
1648
+ const stripped = block.content.replace(/^you:\n?/, "");
1649
+ recordTranscriptEntry("user", stripped);
1650
+ }
1651
+ else if (block.kind === "agent") {
1652
+ recordTranscriptEntry("agent", block.content);
1653
+ }
1654
+ }
1655
+ }
1326
1656
  // ---- bootstrap initial prompt ----------------------------------------------
1327
1657
  if (input.initialPrompt) {
1658
+ recordTranscriptEntry("user", input.initialPrompt);
1328
1659
  appendBlock("you:", input.initialPrompt, COLORS.user);
1329
1660
  void input.session
1330
1661
  .prompt({ message: input.initialPrompt, behavior: "follow_up" })