@duetso/agent 0.1.52 → 0.1.54

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 (107) 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 +17 -8
  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 +7 -2
  61. package/dist/src/tui/app.d.ts.map +1 -1
  62. package/dist/src/tui/app.js +343 -30
  63. package/dist/src/tui/app.js.map +1 -1
  64. package/dist/src/tui/autocomplete.d.ts.map +1 -1
  65. package/dist/src/tui/autocomplete.js +5 -0
  66. package/dist/src/tui/autocomplete.js.map +1 -1
  67. package/dist/src/tui/clipboard.d.ts +28 -0
  68. package/dist/src/tui/clipboard.d.ts.map +1 -0
  69. package/dist/src/tui/clipboard.js +95 -0
  70. package/dist/src/tui/clipboard.js.map +1 -0
  71. package/dist/src/tui/history.d.ts +14 -1
  72. package/dist/src/tui/history.d.ts.map +1 -1
  73. package/dist/src/tui/history.js +21 -2
  74. package/dist/src/tui/history.js.map +1 -1
  75. package/dist/src/tui/recent-sessions.d.ts +51 -0
  76. package/dist/src/tui/recent-sessions.d.ts.map +1 -0
  77. package/dist/src/tui/recent-sessions.js +150 -0
  78. package/dist/src/tui/recent-sessions.js.map +1 -0
  79. package/dist/src/tui/starters.d.ts +92 -0
  80. package/dist/src/tui/starters.d.ts.map +1 -0
  81. package/dist/src/tui/starters.js +196 -0
  82. package/dist/src/tui/starters.js.map +1 -0
  83. package/dist/src/tui/theme.d.ts +2 -2
  84. package/dist/src/tui/theme.d.ts.map +1 -1
  85. package/dist/src/tui/theme.js +2 -2
  86. package/dist/src/tui/theme.js.map +1 -1
  87. package/dist/src/tui/transcript-log.d.ts +45 -0
  88. package/dist/src/tui/transcript-log.d.ts.map +1 -0
  89. package/dist/src/tui/transcript-log.js +76 -0
  90. package/dist/src/tui/transcript-log.js.map +1 -0
  91. package/dist/src/turn-runner/tools.d.ts +28 -1
  92. package/dist/src/turn-runner/tools.d.ts.map +1 -1
  93. package/dist/src/turn-runner/tools.js +135 -3
  94. package/dist/src/turn-runner/tools.js.map +1 -1
  95. package/dist/src/turn-runner/turn-runner.d.ts +1 -0
  96. package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
  97. package/dist/src/turn-runner/turn-runner.js +70 -3
  98. package/dist/src/turn-runner/turn-runner.js.map +1 -1
  99. package/dist/src/types/config.d.ts +12 -0
  100. package/dist/src/types/config.d.ts.map +1 -1
  101. package/dist/src/types/memory.d.ts +59 -21
  102. package/dist/src/types/memory.d.ts.map +1 -1
  103. package/package.json +1 -1
  104. package/dist/src/memory/schema.d.ts +0 -7
  105. package/dist/src/memory/schema.d.ts.map +0 -1
  106. package/dist/src/memory/schema.js +0 -21
  107. 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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"}
@@ -24,8 +24,13 @@ export interface RunTuiInput {
24
24
  memoryModelName: string;
25
25
  /** Human-readable provenance for memoryModelName. */
26
26
  memoryModelSource?: string;
27
- /** Best-effort package update notice, shown in-TUI because stderr is hidden. */
28
- newVersionNotice?: string;
27
+ /**
28
+ * Pending probe for a package update notice. The TUI renders a placeholder
29
+ * line in the intro and replaces it with the notice once the probe settles.
30
+ * Resolves to undefined when the user is already on the latest version or
31
+ * the registry lookup failed.
32
+ */
33
+ versionNoticePromise?: Promise<string | undefined>;
29
34
  /** Past messages to replay into the transcript on resume. */
30
35
  history?: AgentMessage[];
31
36
  /** Maximum prior-session display lines to replay on resume; 0 disables replay. */
@@ -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,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,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,CAu+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,CA4zDvF"}
@@ -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,14 @@ 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: false hands the mouse channel back to the terminal emulator
33
+ // so users can drag-select transcript text and Cmd+C / Cmd+V work
34
+ // natively, the way they do in Claude Code. The cost is that the
35
+ // sidebar and scroll wheel become keyboard-only — a tradeoff we made
36
+ // intentionally so copy-out works without a slash command or modifier.
27
37
  const renderer = await createCliRenderer({
28
38
  exitOnCtrlC: true,
39
+ useMouse: false,
29
40
  useKittyKeyboard: {},
30
41
  targetFps: 60,
31
42
  });
@@ -258,6 +269,17 @@ export async function runTui(input) {
258
269
  // Monotonic counter for the next `[Image #N]` placeholder. Reset alongside
259
270
  // `pendingImages` so users see a fresh `#1` label after each submit.
260
271
  let nextImageId = 1;
272
+ // Parallel record of user/agent message bodies driven by the same code
273
+ // paths that render them into the transcript. The `/copy` slash command
274
+ // and Ctrl+Y keystroke read from this log instead of trying to walk the
275
+ // ScrollBoxRenderable, which only stores presentation lines.
276
+ const transcriptLog = [];
277
+ function recordTranscriptEntry(kind, text) {
278
+ const trimmed = text.trim();
279
+ if (!trimmed)
280
+ return;
281
+ transcriptLog.push({ kind, text: trimmed });
282
+ }
261
283
  let lastTerminal;
262
284
  let latestContextUsage;
263
285
  // Running USD total across every settled turn in this session. Reset only
@@ -415,27 +437,204 @@ export async function runTui(input) {
415
437
  }
416
438
  });
417
439
  function renderSetupIntro(skills, agentFiles) {
418
- for (const line of DUET_BANNER_LINES)
440
+ // Compact 3-row wordmark. The full DUET_BANNER_LINES is ~6 rows tall
441
+ // and pushed the starter list off-screen on small terminals; this one
442
+ // keeps the brand mark visible while leaving room for the ice-break
443
+ // prompts to land above the fold.
444
+ for (const line of DUET_BANNER_LINES_COMPACT)
419
445
  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, line === input.newVersionNotice ? COLORS.system : COLORS.hint);
424
- }
425
- if (agentFiles.length === 0) {
426
- appendLine("[agent file] none", COLORS.hint);
446
+ appendLine(" ", COLORS.hint);
447
+ appendLine(" ", COLORS.hint);
448
+ // One-line header. Keeps cwd/model context visible without burning
449
+ // another five rows. Provenance (env/file source) is intentionally
450
+ // dropped here — surface it via /whoami later.
451
+ appendLine(formatBootHeader(input), COLORS.status);
452
+ if (input.versionNoticePromise) {
453
+ const versionLine = new TextRenderable(renderer, {
454
+ content: "[version] checking for updates…",
455
+ fg: COLORS.hint,
456
+ });
457
+ transcript.add(versionLine);
458
+ void input.versionNoticePromise.then((notice) => {
459
+ if (notice) {
460
+ versionLine.content = notice;
461
+ versionLine.fg = COLORS.system;
462
+ }
463
+ else {
464
+ transcript.remove(versionLine.id);
465
+ versionLine.destroy();
466
+ }
467
+ });
427
468
  }
428
- else {
469
+ // Only mention agent files when one is actually loaded; "[agent file]
470
+ // none" is noise on every empty boot.
471
+ if (agentFiles.length > 0) {
429
472
  appendLine(`[agent file] ${agentFiles.map((file) => file.name).join(", ")}`, COLORS.hint);
430
473
  }
431
- if (skills.length === 0) {
432
- appendLine("[skills] none", COLORS.hint);
474
+ renderStarters(skills);
475
+ }
476
+ function formatBootHeader(headerInput) {
477
+ const cwdLabel = shortenCwd(headerInput.workDir);
478
+ return `DUET AGENT v${headerInput.packageVersion} · ${cwdLabel} · ${headerInput.modelName} + ${headerInput.memoryModelName}`;
479
+ }
480
+ function shortenCwd(cwd) {
481
+ const home = homedir();
482
+ if (cwd === home)
483
+ return "~";
484
+ if (cwd.startsWith(`${home}/`))
485
+ return `~${cwd.slice(home.length)}`;
486
+ return cwd;
487
+ }
488
+ const starterEntries = [];
489
+ // Lines we render for the starter section so we can repaint highlights
490
+ // and tear them all down on dismissal. Includes the headline, numbered
491
+ // rows, the optional resume row, and the two trailing hint rows.
492
+ const starterRefs = [];
493
+ // Indexes within `starterRefs` that correspond to numbered rows; used
494
+ // to repaint highlight on arrow / digit navigation.
495
+ const starterRowIndexes = [];
496
+ let highlightedStarterIndex = 0;
497
+ let startersVisible = false;
498
+ function startersAreVisible() {
499
+ return startersVisible;
500
+ }
501
+ function renderStarters(skills) {
502
+ // Read recent sessions off disk synchronously. The helper swallows fs
503
+ // errors and returns an empty list; a missing/empty ~/.duet/sessions
504
+ // directory is the common first-boot case.
505
+ const recentSessions = listRecentSessions({
506
+ excludeId: input.sessionId,
507
+ limit: 4,
508
+ });
509
+ const result = selectStarters({
510
+ cwd: input.workDir,
511
+ sessionHistory: input.history,
512
+ recentSessions,
513
+ });
514
+ // Selectable rows in render order. Recent sessions lead so returning
515
+ // users hit "pick up the thread" first; new users see the cwd starters
516
+ // under the original "what should we work on today?" headline.
517
+ const ordered = orderedSelectableStarters(result);
518
+ starterEntries.length = 0;
519
+ for (const row of ordered) {
520
+ if (row.kind === "recent" && row.sessionId !== undefined) {
521
+ starterEntries.push({
522
+ kind: "recent",
523
+ label: row.label,
524
+ submit: row.submit,
525
+ sessionId: row.sessionId,
526
+ });
527
+ }
528
+ else {
529
+ starterEntries.push({ kind: "prompt", label: row.label, submit: row.submit });
530
+ }
531
+ }
532
+ const hasRecent = result.recentSessions.length > 0;
533
+ starterRowIndexes.length = 0;
534
+ appendLine(" ", COLORS.hint);
535
+ if (hasRecent) {
536
+ // Returning user: continuity first.
537
+ starterRefs.push(addLine("pick up the thread", COLORS.agent));
538
+ appendLine(" ", COLORS.hint);
539
+ for (let i = 0; i < result.recentSessions.length; i += 1) {
540
+ const ref = addLine(formatStarterRow(i, false), COLORS.hint);
541
+ starterRowIndexes.push(starterRefs.length);
542
+ starterRefs.push(ref);
543
+ }
544
+ appendLine(" ", COLORS.hint);
545
+ starterRefs.push(addLine("or start something new", COLORS.agent));
546
+ appendLine(" ", COLORS.hint);
547
+ for (let j = 0; j < result.starters.length; j += 1) {
548
+ const i = result.recentSessions.length + j;
549
+ const ref = addLine(formatStarterRow(i, false), COLORS.hint);
550
+ starterRowIndexes.push(starterRefs.length);
551
+ starterRefs.push(ref);
552
+ }
433
553
  }
434
554
  else {
435
- const names = skills.map((skill) => skill.name).join(", ");
436
- appendLine(`[skills] ${skills.length} loaded: ${names}`, COLORS.hint);
555
+ // New user: original cwd-only ice-break.
556
+ starterRefs.push(addLine("what should we work on today?", COLORS.agent));
557
+ appendLine(" ", COLORS.hint);
558
+ for (let i = 0; i < starterEntries.length; i += 1) {
559
+ const ref = addLine(formatStarterRow(i, false), COLORS.hint);
560
+ starterRowIndexes.push(starterRefs.length);
561
+ starterRefs.push(ref);
562
+ }
563
+ }
564
+ appendLine(" ", COLORS.hint);
565
+ starterRefs.push(addLine("type a number to run, ↑/↓ to highlight, or just start typing.", COLORS.hint));
566
+ starterRefs.push(addLine(`✦ ${skills.length} skill${skills.length === 1 ? "" : "s"} · /help`, COLORS.hint));
567
+ startersVisible = starterEntries.length > 0;
568
+ if (startersVisible) {
569
+ highlightedStarterIndex = 0;
570
+ paintStarterHighlight();
571
+ }
572
+ }
573
+ function addLine(content, fg) {
574
+ const line = new TextRenderable(renderer, { content: content || " ", fg });
575
+ transcript.add(line);
576
+ return line;
577
+ }
578
+ function formatStarterRow(index, highlighted) {
579
+ const entry = starterEntries[index];
580
+ const text = entry?.label ?? "";
581
+ const number = index + 1;
582
+ const arrow = highlighted ? "▶" : "→";
583
+ const numberCell = highlighted ? `[${number}]` : ` ${number} `;
584
+ return ` ${numberCell} ${arrow} ${text}`;
585
+ }
586
+ function paintStarterHighlight() {
587
+ for (let i = 0; i < starterRowIndexes.length; i += 1) {
588
+ const ref = starterRefs[starterRowIndexes[i]];
589
+ const isHighlighted = i === highlightedStarterIndex;
590
+ ref.content = formatStarterRow(i, isHighlighted);
591
+ ref.fg = isHighlighted ? COLORS.user : COLORS.hint;
437
592
  }
438
593
  }
594
+ function moveStarterHighlight(delta) {
595
+ if (!startersVisible || starterEntries.length === 0)
596
+ return;
597
+ const next = (highlightedStarterIndex + delta + starterEntries.length) % starterEntries.length;
598
+ highlightedStarterIndex = next;
599
+ paintStarterHighlight();
600
+ }
601
+ function jumpStarterHighlight(targetIndex) {
602
+ if (!startersVisible)
603
+ return false;
604
+ if (targetIndex < 0 || targetIndex >= starterEntries.length)
605
+ return false;
606
+ highlightedStarterIndex = targetIndex;
607
+ paintStarterHighlight();
608
+ return true;
609
+ }
610
+ function dismissStarters() {
611
+ if (!startersVisible && starterRefs.length === 0)
612
+ return;
613
+ for (const ref of starterRefs) {
614
+ transcript.remove(ref.id);
615
+ ref.destroy();
616
+ }
617
+ starterRefs.length = 0;
618
+ starterRowIndexes.length = 0;
619
+ starterEntries.length = 0;
620
+ startersVisible = false;
621
+ }
622
+ function submitHighlightedStarter() {
623
+ if (!startersVisible)
624
+ return false;
625
+ const entry = starterEntries[highlightedStarterIndex];
626
+ if (!entry)
627
+ return false;
628
+ dismissStarters();
629
+ // Recent-session rows reuse the prompt text in the *current* session
630
+ // rather than tearing down the runtime to switch sessions. The agent
631
+ // won't have prior context, but the user lands on the same task with
632
+ // one keystroke instead of typing it again. Documented tradeoff: a
633
+ // future iteration can swap this for true cross-session resume once
634
+ // the session manager exposes a hot-swap API.
635
+ submit(entry.submit);
636
+ return true;
637
+ }
439
638
  function renderUsage(usage) {
440
639
  if (!usage)
441
640
  return;
@@ -485,6 +684,7 @@ export async function runTui(input) {
485
684
  activeReasoningStream = renderDelta(activeReasoningStream, "[reasoning]", step.delta, COLORS.reasoning, true);
486
685
  }
487
686
  else if (step.type === "text") {
687
+ recordTranscriptEntry("agent", step.text);
488
688
  if (activeTextStream) {
489
689
  finalizeDelta(activeTextStream, step.text);
490
690
  activeTextStream = undefined;
@@ -634,10 +834,6 @@ export async function runTui(input) {
634
834
  return truncateToolText(`${event.message}\n${content}`);
635
835
  }
636
836
  // ---- input handling --------------------------------------------------------
637
- // Track shift state for the most recent Enter keypress. The focused
638
- // InputRenderable handles its own `enter` event after onKeyDown fires, so we
639
- // capture the modifier here and read it during the ENTER event below.
640
- let lastEnterShift = false;
641
837
  let skillAutocompleteSkills = [];
642
838
  let skillAutocompleteToken;
643
839
  let skillAutocompleteItems = [];
@@ -754,7 +950,9 @@ export async function runTui(input) {
754
950
  const answers = questionPickerAnswerPayload(pendingQuestions, questionOptionSelectedIndex);
755
951
  if (!answers)
756
952
  return false;
757
- appendBlock("you:", Object.values(answers).join("\n"), COLORS.user);
953
+ const answerText = Object.values(answers).join("\n");
954
+ recordTranscriptEntry("user", answerText);
955
+ appendBlock("you:", answerText, COLORS.user);
758
956
  void input.session
759
957
  .answer({ questions: pendingQuestions, answers, behavior: "follow_up" })
760
958
  .catch(reportError);
@@ -956,6 +1154,34 @@ export async function runTui(input) {
956
1154
  // consumes escape via its own keybindings before any global keypress handler
957
1155
  // fires, so we intercept at the Renderable's onKeyDown hook which runs first.
958
1156
  inputField.onKeyDown = (key) => {
1157
+ // Boot starter navigation. Only intercepts when the starter section is
1158
+ // still on screen; once dismissed (by composition or first submit) all
1159
+ // of these branches no-op and keys flow normally to the input.
1160
+ if (startersAreVisible() && inputField.plainText.length === 0) {
1161
+ if (key.name === "up") {
1162
+ moveStarterHighlight(-1);
1163
+ key.preventDefault();
1164
+ return;
1165
+ }
1166
+ if (key.name === "down") {
1167
+ moveStarterHighlight(1);
1168
+ key.preventDefault();
1169
+ return;
1170
+ }
1171
+ if (key.name &&
1172
+ key.name.length === 1 &&
1173
+ key.name >= "1" &&
1174
+ key.name <= "9" &&
1175
+ !key.ctrl &&
1176
+ !key.meta &&
1177
+ !key.super) {
1178
+ const target = Number.parseInt(key.name, 10) - 1;
1179
+ if (jumpStarterHighlight(target)) {
1180
+ key.preventDefault();
1181
+ return;
1182
+ }
1183
+ }
1184
+ }
959
1185
  // Cmd+V / Ctrl+V keystroke trigger. Many terminals (Warp in particular,
960
1186
  // and macOS Terminal.app for binary clipboards) do not forward a paste
961
1187
  // event to TUI programs on Cmd+V — they handle the clipboard at the app
@@ -972,6 +1198,15 @@ export async function runTui(input) {
972
1198
  void triggerClipboardProbe("keystroke");
973
1199
  return;
974
1200
  }
1201
+ // Ctrl+Y — emacs-style "yank," repurposed here as the keyboard hotkey
1202
+ // for the `/copy` slash command. macOS Cmd+C is owned by the terminal
1203
+ // emulator and never reaches the TUI, so Ctrl+Y is the closest thing
1204
+ // to a real copy keystroke we can deliver across all terminals.
1205
+ if (key.name === "y" && key.ctrl && !key.shift && !key.super && !key.meta) {
1206
+ key.preventDefault();
1207
+ void handleCopySlashCommand("/copy");
1208
+ return;
1209
+ }
975
1210
  if (skillAutocompleteIsOpen()) {
976
1211
  if (key.name === "up") {
977
1212
  skillAutocompleteSelectedIndex = moveSkillAutocompleteSelection(skillAutocompleteSelectedIndex, skillAutocompleteItems.length, -1);
@@ -1043,17 +1278,26 @@ export async function runTui(input) {
1043
1278
  }
1044
1279
  }
1045
1280
  if (key.name === "return" || key.name === "enter") {
1046
- lastEnterShift = Boolean(key.shift);
1281
+ // Shift+Enter inserts a literal newline at the cursor, matching every
1282
+ // modern chat composer (Slack, Claude Code, ChatGPT, Discord). Plain
1283
+ // Enter always submits — when the agent is running the submit path
1284
+ // queues the message as a follow-up; otherwise it kicks off a new turn.
1285
+ key.preventDefault();
1286
+ if (key.shift) {
1287
+ inputField.insertText("\n");
1288
+ return;
1289
+ }
1047
1290
  const value = inputField.plainText.trim();
1048
1291
  inputField.clear();
1049
- key.preventDefault();
1050
1292
  if (value) {
1051
- submit(value, lastEnterShift);
1293
+ submit(value);
1052
1294
  }
1053
1295
  else if (questionPickerIsOpen()) {
1054
1296
  submitSelectedQuestionOption();
1055
1297
  }
1056
- lastEnterShift = false;
1298
+ else if (startersAreVisible()) {
1299
+ submitHighlightedStarter();
1300
+ }
1057
1301
  return;
1058
1302
  }
1059
1303
  if (key.name === "escape") {
@@ -1061,7 +1305,14 @@ export async function runTui(input) {
1061
1305
  return;
1062
1306
  }
1063
1307
  };
1064
- inputField.onContentChange = () => refreshAutocomplete();
1308
+ inputField.onContentChange = () => {
1309
+ // First real keystroke into the input collapses the starter section
1310
+ // — the user is composing their own prompt, so the suggestions get
1311
+ // out of the way for the rest of the session.
1312
+ if (startersAreVisible() && inputField.plainText.length > 0)
1313
+ dismissStarters();
1314
+ refreshAutocomplete();
1315
+ };
1065
1316
  inputField.onCursorChange = () => refreshAutocomplete();
1066
1317
  // Paste handling. Terminals that forward binary clipboard contents (kitty,
1067
1318
  // ghostty, recent iTerm2 builds) deliver image bytes directly via the paste
@@ -1206,7 +1457,11 @@ export async function runTui(input) {
1206
1457
  appendBlock("[paste]", `clipboard probe failed: ${error instanceof Error ? error.message : String(error)}`, COLORS.error);
1207
1458
  }
1208
1459
  }
1209
- function submit(message, shiftEnter) {
1460
+ function submit(message) {
1461
+ // First user submit collapses the boot starter section permanently for
1462
+ // this session, even when the prompt came from autocomplete or paste.
1463
+ if (startersAreVisible())
1464
+ dismissStarters();
1210
1465
  // Slash-style attach commands run locally and never reach the runner so
1211
1466
  // users on terminals that do not forward image bytes still have a way to
1212
1467
  // attach images by path.
@@ -1223,7 +1478,12 @@ export async function runTui(input) {
1223
1478
  appendBlock("[paste]", "cleared pending image attachments", COLORS.system);
1224
1479
  return;
1225
1480
  }
1481
+ if (message === "/copy" || message.startsWith("/copy ")) {
1482
+ void handleCopySlashCommand(message);
1483
+ return;
1484
+ }
1226
1485
  const submittedImages = pendingImages;
1486
+ recordTranscriptEntry("user", message);
1227
1487
  appendBlock("you:", message, COLORS.user);
1228
1488
  // Render attachments as a separate hint-colored footnote rather than
1229
1489
  // inlining them into the user-message block. Keeps the transcript
@@ -1239,13 +1499,49 @@ export async function runTui(input) {
1239
1499
  // Reset before dispatch so an in-flight error does not leave the user
1240
1500
  // double-charged with the same attachments on retry.
1241
1501
  clearPendingImages();
1242
- if (running) {
1243
- const behavior = shiftEnter ? "follow_up" : "steer";
1244
- void input.session.prompt({ message, behavior, images }).catch(reportError);
1502
+ // Every submit — running or idle — is a follow_up. While the agent is
1503
+ // running this queues; while idle it kicks off a fresh turn. Single
1504
+ // mental model: type, press Enter, your message lands.
1505
+ void input.session.prompt({ message, behavior: "follow_up", images }).catch(reportError);
1506
+ if (!running) {
1507
+ markRunning();
1508
+ }
1509
+ }
1510
+ /**
1511
+ * Resolve a `/copy ...` invocation to clipboard text and pipe it to the
1512
+ * OS clipboard. Surfaces every failure mode in the transcript so users on
1513
+ * minimal Linux installs see exactly which writer is missing (e.g.
1514
+ * "install xclip or wl-clipboard").
1515
+ */
1516
+ async function handleCopySlashCommand(raw) {
1517
+ const argumentRaw = raw === "/copy" ? "" : raw.slice("/copy ".length);
1518
+ const argument = parseCopyArgument(argumentRaw);
1519
+ if (argument === undefined) {
1520
+ appendBlock("[copy]", "Usage: /copy [last|all|<N>] — last (default) copies the most recent agent reply", COLORS.system);
1245
1521
  return;
1246
1522
  }
1247
- void input.session.prompt({ message, behavior: "follow_up", images }).catch(reportError);
1248
- markRunning();
1523
+ const text = selectCopyText(transcriptLog, argument);
1524
+ if (!text) {
1525
+ appendBlock("[copy]", "nothing to copy yet", COLORS.system);
1526
+ return;
1527
+ }
1528
+ const result = await writeClipboardText(text);
1529
+ if (result.ok) {
1530
+ const summary = describeCopySelection(argument, text.length);
1531
+ appendBlock("[copy]", `copied ${summary} to clipboard via ${result.via}`, COLORS.system);
1532
+ }
1533
+ else {
1534
+ appendBlock("[copy]", `clipboard write failed: ${result.error ?? "unknown error"}` +
1535
+ (process.platform === "linux" ? "\nInstall one of: wl-clipboard, xclip, xsel" : ""), COLORS.error);
1536
+ }
1537
+ }
1538
+ function describeCopySelection(argument, length) {
1539
+ const chars = `${length} char${length === 1 ? "" : "s"}`;
1540
+ if (argument === "last")
1541
+ return `last message (${chars})`;
1542
+ if (argument === "all")
1543
+ return `full transcript (${chars})`;
1544
+ return `last ${argument} messages (${chars})`;
1249
1545
  }
1250
1546
  async function handleImageSlashCommand(raw) {
1251
1547
  const rest = raw.slice("/image".length).trim();
@@ -1307,8 +1603,25 @@ export async function runTui(input) {
1307
1603
  appendDisplayBlock(block);
1308
1604
  }
1309
1605
  }
1606
+ // Seed the copy-out log from full resumed history (not the trimmed display
1607
+ // slice) so `/copy all` and `/copy <N>` can reach back further than what is
1608
+ // actually rendered in the transcript on resume.
1609
+ if (input.history && input.history.length > 0) {
1610
+ for (const block of historyDisplayBlocks(input.history)) {
1611
+ if (block.kind === "user") {
1612
+ // History blocks for users are formatted as `you:\n<text>`; strip the
1613
+ // label so the clipboard text matches what the user originally typed.
1614
+ const stripped = block.content.replace(/^you:\n?/, "");
1615
+ recordTranscriptEntry("user", stripped);
1616
+ }
1617
+ else if (block.kind === "agent") {
1618
+ recordTranscriptEntry("agent", block.content);
1619
+ }
1620
+ }
1621
+ }
1310
1622
  // ---- bootstrap initial prompt ----------------------------------------------
1311
1623
  if (input.initialPrompt) {
1624
+ recordTranscriptEntry("user", input.initialPrompt);
1312
1625
  appendBlock("you:", input.initialPrompt, COLORS.user);
1313
1626
  void input.session
1314
1627
  .prompt({ message: input.initialPrompt, behavior: "follow_up" })