negotium 0.1.12 → 0.1.13

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 (137) hide show
  1. package/dist/canonical-mcp-bridge.js +2 -3
  2. package/dist/canonical-mcp-bridge.js.map +1 -1
  3. package/dist/chunk-a9y2rwxf.js.map +1 -1
  4. package/dist/{chunk-j0kjscb7.js → chunk-s2gez3wg.js} +20 -2
  5. package/dist/{chunk-j0kjscb7.js.map → chunk-s2gez3wg.js.map} +2 -2
  6. package/dist/cron.js +49 -25
  7. package/dist/cron.js.map +15 -14
  8. package/dist/hosted-agent.js +3012 -17
  9. package/dist/hosted-agent.js.map +30 -3
  10. package/dist/main.js +31323 -36
  11. package/dist/main.js.map +198 -3
  12. package/dist/prompts.js +11 -8
  13. package/dist/prompts.js.map +4 -4
  14. package/dist/runtime/src/application/submit-user-message.ts +3 -0
  15. package/dist/runtime/src/index.ts +7 -0
  16. package/dist/runtime/src/mcp/runtime-spec.ts +3 -0
  17. package/dist/runtime/src/mcp/session-comm/server.ts +1 -1
  18. package/dist/runtime/src/platform/mcp-config.ts +13 -0
  19. package/dist/runtime/src/prompts/builders.ts +20 -6
  20. package/dist/runtime/src/query/active-rooms.ts +2 -0
  21. package/dist/runtime/src/runtime/delivery-ack.ts +112 -0
  22. package/dist/runtime/src/runtime/errors.ts +12 -12
  23. package/dist/runtime/src/runtime/turn-runner.ts +12 -0
  24. package/dist/runtime/src/storage/runtime-turn-requests.ts +1 -0
  25. package/dist/runtime/src/types/api.ts +2 -0
  26. package/dist/runtime/src/types.ts +2 -0
  27. package/dist/runtime/src/version.ts +1 -1
  28. package/dist/runtime-helpers.js.map +1 -1
  29. package/dist/storage.js.map +1 -1
  30. package/dist/types/packages/core/src/mcp/runtime-spec.d.ts +2 -0
  31. package/dist/types/packages/core/src/platform/mcp-config.d.ts +4 -0
  32. package/dist/types/packages/core/src/prompts/builders.d.ts +2 -0
  33. package/dist/types/packages/core/src/types/api.d.ts +2 -0
  34. package/dist/types/packages/core/src/types.d.ts +2 -0
  35. package/dist/types/packages/core/src/version.d.ts +1 -1
  36. package/dist/vault.js.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/chunk-00q25k7p.js +0 -2387
  39. package/dist/chunk-00q25k7p.js.map +0 -26
  40. package/dist/chunk-03kv7mvj.js +0 -2152
  41. package/dist/chunk-03kv7mvj.js.map +0 -15
  42. package/dist/chunk-05pm51dh.js +0 -589
  43. package/dist/chunk-05pm51dh.js.map +0 -11
  44. package/dist/chunk-0eh16bk1.js +0 -2936
  45. package/dist/chunk-0eh16bk1.js.map +0 -20
  46. package/dist/chunk-0yfqyv88.js +0 -108
  47. package/dist/chunk-0yfqyv88.js.map +0 -10
  48. package/dist/chunk-1k7t7bnx.js +0 -97
  49. package/dist/chunk-1k7t7bnx.js.map +0 -10
  50. package/dist/chunk-3gkfr9vb.js +0 -431
  51. package/dist/chunk-3gkfr9vb.js.map +0 -11
  52. package/dist/chunk-5akd1gbj.js +0 -281
  53. package/dist/chunk-5akd1gbj.js.map +0 -10
  54. package/dist/chunk-7k19pcg8.js +0 -577
  55. package/dist/chunk-7k19pcg8.js.map +0 -14
  56. package/dist/chunk-81tbfbmt.js +0 -10
  57. package/dist/chunk-81tbfbmt.js.map +0 -10
  58. package/dist/chunk-82qhv1mq.js +0 -512
  59. package/dist/chunk-82qhv1mq.js.map +0 -13
  60. package/dist/chunk-8dy7e2a9.js +0 -103
  61. package/dist/chunk-8dy7e2a9.js.map +0 -10
  62. package/dist/chunk-8f2sqmrj.js +0 -1712
  63. package/dist/chunk-8f2sqmrj.js.map +0 -18
  64. package/dist/chunk-9hjeemfz.js +0 -372
  65. package/dist/chunk-9hjeemfz.js.map +0 -10
  66. package/dist/chunk-a4aa2ccv.js +0 -141
  67. package/dist/chunk-a4aa2ccv.js.map +0 -10
  68. package/dist/chunk-bsg215q3.js +0 -3536
  69. package/dist/chunk-bsg215q3.js.map +0 -20
  70. package/dist/chunk-bxnfsc7w.js +0 -58
  71. package/dist/chunk-bxnfsc7w.js.map +0 -10
  72. package/dist/chunk-c500xe9z.js +0 -33
  73. package/dist/chunk-c500xe9z.js.map +0 -10
  74. package/dist/chunk-cngrf7ab.js +0 -149
  75. package/dist/chunk-cngrf7ab.js.map +0 -10
  76. package/dist/chunk-d7tprf06.js +0 -53
  77. package/dist/chunk-d7tprf06.js.map +0 -10
  78. package/dist/chunk-ddnrmkrv.js +0 -61
  79. package/dist/chunk-ddnrmkrv.js.map +0 -10
  80. package/dist/chunk-edb07sjp.js +0 -567
  81. package/dist/chunk-edb07sjp.js.map +0 -14
  82. package/dist/chunk-ejcm6zx8.js +0 -591
  83. package/dist/chunk-ejcm6zx8.js.map +0 -11
  84. package/dist/chunk-ezs352qs.js +0 -237
  85. package/dist/chunk-ezs352qs.js.map +0 -11
  86. package/dist/chunk-f5xgprg1.js +0 -59
  87. package/dist/chunk-f5xgprg1.js.map +0 -10
  88. package/dist/chunk-fbtb3v0s.js +0 -1339
  89. package/dist/chunk-fbtb3v0s.js.map +0 -16
  90. package/dist/chunk-ffefbd3r.js +0 -17
  91. package/dist/chunk-ffefbd3r.js.map +0 -10
  92. package/dist/chunk-gaknyw04.js +0 -708
  93. package/dist/chunk-gaknyw04.js.map +0 -14
  94. package/dist/chunk-gxmny6tq.js +0 -1637
  95. package/dist/chunk-gxmny6tq.js.map +0 -15
  96. package/dist/chunk-h7bj5zwb.js +0 -3069
  97. package/dist/chunk-h7bj5zwb.js.map +0 -32
  98. package/dist/chunk-hp4g7wx7.js +0 -46
  99. package/dist/chunk-hp4g7wx7.js.map +0 -10
  100. package/dist/chunk-hwy3n31w.js +0 -21
  101. package/dist/chunk-hwy3n31w.js.map +0 -9
  102. package/dist/chunk-jzz91jwh.js +0 -70
  103. package/dist/chunk-jzz91jwh.js.map +0 -10
  104. package/dist/chunk-k778y16p.js +0 -153
  105. package/dist/chunk-k778y16p.js.map +0 -11
  106. package/dist/chunk-mh5mexsf.js +0 -147
  107. package/dist/chunk-mh5mexsf.js.map +0 -11
  108. package/dist/chunk-mnwaext5.js +0 -318
  109. package/dist/chunk-mnwaext5.js.map +0 -10
  110. package/dist/chunk-nkgs40ch.js +0 -23
  111. package/dist/chunk-nkgs40ch.js.map +0 -10
  112. package/dist/chunk-pz57vwsm.js +0 -250
  113. package/dist/chunk-pz57vwsm.js.map +0 -11
  114. package/dist/chunk-r6kdp7gn.js +0 -252
  115. package/dist/chunk-r6kdp7gn.js.map +0 -10
  116. package/dist/chunk-rkvrkcgx.js +0 -117
  117. package/dist/chunk-rkvrkcgx.js.map +0 -10
  118. package/dist/chunk-s74rdyqe.js +0 -117
  119. package/dist/chunk-s74rdyqe.js.map +0 -12
  120. package/dist/chunk-sa874j5c.js +0 -9
  121. package/dist/chunk-sa874j5c.js.map +0 -10
  122. package/dist/chunk-sffqdkvq.js +0 -122
  123. package/dist/chunk-sffqdkvq.js.map +0 -10
  124. package/dist/chunk-tcs9qjps.js +0 -64
  125. package/dist/chunk-tcs9qjps.js.map +0 -10
  126. package/dist/chunk-wx83ep8e.js +0 -131
  127. package/dist/chunk-wx83ep8e.js.map +0 -10
  128. package/dist/chunk-xag86ng3.js +0 -122
  129. package/dist/chunk-xag86ng3.js.map +0 -10
  130. package/dist/chunk-xfdkep71.js +0 -371
  131. package/dist/chunk-xfdkep71.js.map +0 -11
  132. package/dist/chunk-xhm1rfpt.js +0 -2907
  133. package/dist/chunk-xhm1rfpt.js.map +0 -24
  134. package/dist/chunk-xpcps28p.js +0 -2138
  135. package/dist/chunk-xpcps28p.js.map +0 -29
  136. package/dist/chunk-yb4rbev9.js +0 -214
  137. package/dist/chunk-yb4rbev9.js.map +0 -10
@@ -1,20 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../adapters/terminal/src/clipboard.ts", "../../../adapters/terminal/src/clock.ts", "../../../adapters/terminal/src/commands.ts", "../../../adapters/terminal/src/path-suggest.ts", "../../../adapters/terminal/src/state.ts", "../../../adapters/terminal/src/render.ts", "../../../adapters/terminal/src/screen-renderer.ts", "../../../adapters/terminal/src/selection.ts", "../../../adapters/terminal/src/text-buffer.ts", "../../../adapters/terminal/src/app.ts", "../../../adapters/terminal/src/index.ts"],
4
- "sourcesContent": [
5
- "export const MAX_CLIPBOARD_BYTES = 100_000;\n\nfunction truncateUtf8(value: string, maxBytes: number): string {\n if (Buffer.byteLength(value) <= maxBytes) return value;\n let output = \"\";\n let used = 0;\n for (const character of value) {\n const bytes = Buffer.byteLength(character);\n if (used + bytes > maxBytes) break;\n output += character;\n used += bytes;\n }\n return output;\n}\n\nexport function osc52Sequence(value: string): string {\n const text = truncateUtf8(value, MAX_CLIPBOARD_BYTES);\n return `\\u001b]52;c;${Buffer.from(text).toString(\"base64\")}\\u0007`;\n}\n\nasync function pipeTo(command: string, args: string[], value: string): Promise<boolean> {\n try {\n const child = Bun.spawn([command, ...args], {\n stdin: \"pipe\",\n stdout: \"ignore\",\n stderr: \"ignore\",\n });\n child.stdin.write(value);\n child.stdin.end();\n return (await child.exited) === 0;\n } catch {\n return false;\n }\n}\n\nexport interface ClipboardCopyResult {\n method: \"native\" | \"tmux\" | \"osc52\";\n truncated: boolean;\n}\n\n/** Prefer an OS clipboard command, then tmux, and finally terminal OSC52. */\nexport async function copyToClipboard(\n value: string,\n write: (sequence: string) => void = (sequence) => process.stdout.write(sequence),\n): Promise<ClipboardCopyResult> {\n const text = truncateUtf8(value, MAX_CLIPBOARD_BYTES);\n const truncated = text !== value;\n const nativeCandidates: Array<[string, string[]]> =\n process.platform === \"darwin\"\n ? [[\"pbcopy\", []]]\n : process.platform === \"win32\"\n ? [[\"clip.exe\", []]]\n : [\n [\"wl-copy\", []],\n [\"xclip\", [\"-selection\", \"clipboard\"]],\n [\"xsel\", [\"--clipboard\", \"--input\"]],\n [\"clip.exe\", []],\n ];\n for (const [command, args] of nativeCandidates) {\n const executable = Bun.which(command);\n if (executable && (await pipeTo(executable, args, text))) {\n return { method: \"native\", truncated };\n }\n }\n const tmux = process.env.TMUX ? Bun.which(\"tmux\") : null;\n if (tmux && (await pipeTo(tmux, [\"load-buffer\", \"-\"], text))) {\n return { method: \"tmux\", truncated };\n }\n write(osc52Sequence(text));\n return { method: \"osc52\", truncated };\n}\n",
6
- "/** Epoch-shaped monotonic clock for stable elapsed-time rendering. */\nexport function terminalNowMs(): number {\n return performance.timeOrigin + performance.now();\n}\n",
7
- "export interface TerminalCommand {\n name: string;\n usage: string;\n description: string;\n}\n\nexport const TERMINAL_COMMANDS: readonly TerminalCommand[] = [\n { name: \"new\", usage: \"/new\", description: \"reset the current session\" },\n { name: \"compact\", usage: \"/compact\", description: \"summarize and shrink context\" },\n { name: \"status\", usage: \"/status\", description: \"show model and token usage\" },\n { name: \"model\", usage: \"/model\", description: \"choose the model\" },\n { name: \"effort\", usage: \"/effort\", description: \"choose reasoning effort\" },\n { name: \"topics\", usage: \"/topics\", description: \"open topic picker\" },\n {\n name: \"fork\",\n usage: \"/fork [name]\",\n description: \"fork this topic (config + history) into a new one\",\n },\n {\n name: \"spawn\",\n usage: \"/spawn [name]\",\n description: \"spawn a new topic from this one's config (fresh session)\",\n },\n { name: \"del\", usage: \"/del\", description: \"delete the current topic\" },\n { name: \"copy\", usage: \"/copy [all]\", description: \"copy answer or transcript\" },\n {\n name: \"vault\",\n usage: \"/vault\",\n description: \"manage encrypted secrets\",\n },\n { name: \"abort\", usage: \"/abort\", description: \"stop the active turn\" },\n { name: \"help\", usage: \"/help\", description: \"show keyboard help\" },\n { name: \"quit\", usage: \"/quit\", description: \"exit Terminal\" },\n];\n\nexport function commandSuggestions(input: string): TerminalCommand[] {\n if (!input.startsWith(\"/\") || input.includes(\"\\n\")) return [];\n const token = input.slice(1);\n if (token.includes(\" \")) return [];\n const normalized = token.toLowerCase();\n return TERMINAL_COMMANDS.filter((command) => command.name.startsWith(normalized));\n}\n\nexport function completeCommand(input: string, index: number): string | null {\n const suggestions = commandSuggestions(input);\n if (suggestions.length === 0) return null;\n const selected = suggestions[(index + suggestions.length) % suggestions.length];\n return `${selected.usage.includes(\"<\") || selected.usage.includes(\"[\") ? `/${selected.name} ` : `/${selected.name}`}`;\n}\n",
8
- "/**\n * `@`-triggered filesystem path completion for the terminal composer.\n *\n * Typing `@` (optionally followed by a path fragment) offers suggestions drawn\n * from the *real* filesystem, rooted at the user's home directory by default.\n * `@~/…`, `@/abs/…`, and bare `@name` (relative to home) are all supported.\n * The list is capped so a large directory never floods the composer.\n */\n\nimport { type Dirent, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport interface PathSuggestion {\n /** Row label — basename with a trailing `/` for directories. */\n label: string;\n /** Replacement token including the leading `@` (e.g. `@~/Documents/`). */\n value: string;\n isDir: boolean;\n}\n\nexport interface PathSuggestResult {\n /** Column (0-based) of the `@` that starts the active token on its line. */\n start: number;\n /** Column just past the fragment (where the cursor sits). */\n end: number;\n items: PathSuggestion[];\n /** Count of matches beyond `items` that were trimmed off. */\n truncated: number;\n}\n\nconst MAX_SUGGESTIONS = 8;\n\n/** Locate an active `@…` token that ends at `col` on a single input line. */\nexport function activeAtToken(\n lineText: string,\n col: number,\n): { start: number; frag: string } | null {\n const upto = lineText.slice(0, col);\n // Token = trailing run of non-space chars, must be preceded by start/space.\n const match = /(?:^|\\s)@([^\\s]*)$/.exec(upto);\n if (!match) return null;\n const frag = match[1] ?? \"\";\n return { start: col - frag.length - 1, frag };\n}\n\n/** Resolve a fragment (text after `@`) to the directory to list + name prefix. */\nfunction resolveFragment(frag: string): { dir: string; prefix: string } {\n const home = homedir();\n let path: string;\n if (frag === \"\" || frag === \"~\") path = home;\n else if (frag === \"~/\") path = home;\n else if (frag.startsWith(\"~/\")) path = join(home, frag.slice(2));\n else if (frag.startsWith(\"/\")) path = frag;\n else path = join(home, frag); // bare `@name` → relative to home\n\n // A trailing slash means \"list this directory\"; otherwise the last segment\n // is a prefix to match within its parent.\n if (frag.endsWith(\"/\") || frag === \"\" || frag === \"~\") {\n return { dir: path, prefix: \"\" };\n }\n return { dir: dirname(path), prefix: basename(path) };\n}\n\n/** Render an absolute path back into the composer, preferring `~` under home. */\nfunction toToken(fullPath: string, isDir: boolean): string {\n const home = homedir();\n let shown = fullPath;\n if (fullPath === home) shown = \"~\";\n else if (fullPath.startsWith(`${home}/`)) shown = `~/${fullPath.slice(home.length + 1)}`;\n return `@${shown}${isDir ? \"/\" : \"\"}`;\n}\n\n/** Compute `@`-path suggestions for the cursor position, or null if inactive. */\nexport function pathSuggestions(lineText: string, col: number): PathSuggestResult | null {\n const token = activeAtToken(lineText, col);\n if (!token) return null;\n const { dir, prefix } = resolveFragment(token.frag);\n\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return { start: token.start, end: col, items: [], truncated: 0 };\n }\n\n const lowerPrefix = prefix.toLowerCase();\n const showHidden = prefix.startsWith(\".\");\n const matched = entries\n .filter((entry) => {\n const name = entry.name;\n if (!showHidden && name.startsWith(\".\")) return false;\n return name.toLowerCase().startsWith(lowerPrefix);\n })\n .map((entry) => {\n let isDir = entry.isDirectory();\n if (!isDir && entry.isSymbolicLink()) {\n try {\n isDir = statSync(join(dir, entry.name)).isDirectory();\n } catch {\n // Broken symlink / permission race: treat it as a file.\n }\n }\n return { name: entry.name, isDir };\n })\n // Directories first, then case-insensitive name order.\n .sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n const items: PathSuggestion[] = matched.slice(0, MAX_SUGGESTIONS).map(({ name, isDir }) => ({\n label: `${name}${isDir ? \"/\" : \"\"}`,\n value: toToken(join(dir, name), isDir),\n isDir,\n }));\n\n return {\n start: token.start,\n end: col,\n items,\n truncated: Math.max(0, matched.length - items.length),\n };\n}\n\n/**\n * Replace the active `@` token on `lineText` with `suggestion`. Directory\n * suggestions keep the cursor right after the trailing `/` so the user can\n * immediately keep drilling; file suggestions leave the cursor at the end.\n */\nexport function completePathToken(\n lineText: string,\n col: number,\n suggestion: PathSuggestion,\n options: { keepTrigger?: boolean } = {},\n): { line: string; col: number } | null {\n const token = activeAtToken(lineText, col);\n if (!token) return null;\n const replacement = options.keepTrigger ? suggestion.value : suggestion.value.slice(1);\n const line = lineText.slice(0, token.start) + replacement + lineText.slice(col);\n return { line, col: token.start + replacement.length };\n}\n",
9
- "import {\n type BackgroundSessionDto,\n getGlobalAiName,\n type MessageDto,\n type RuntimeBusEvent,\n type TopicDto,\n type VaultEntry,\n} from \"@negotium/core\";\nimport { terminalNowMs } from \"@/clock\";\n\ntype Overlay =\n | \"help\"\n | \"status\"\n | \"topics\"\n | \"background-session\"\n | \"models\"\n | \"effort\"\n | \"vault\"\n | \"transcript\"\n | \"confirm-delete\"\n | null;\n\ninterface ToolActivity {\n id: string;\n label: string;\n output?: string;\n status?: string;\n}\n\ninterface TopicActivity {\n running: boolean;\n queryId?: string;\n snapshot?: true;\n startedAtMs?: number;\n status?: string;\n error?: string;\n tools: ToolActivity[];\n}\n\nexport type VaultMode = \"list\" | \"key\" | \"value\" | \"description\" | \"confirm-delete\";\n\nexport interface MessageHistoryStatus {\n hasMore: boolean;\n loading: boolean;\n}\n\nexport interface AppState {\n userId: string;\n aiName: string;\n topics: TopicDto[];\n backgroundSessions: BackgroundSessionDto[];\n activeTopicId: string | null;\n messages: Record<string, MessageDto[]>;\n messageHistory: Record<string, MessageHistoryStatus>;\n activity: Record<string, TopicActivity>;\n input: string;\n inputCursor: { row: number; col: number };\n suggestionIndex: number;\n topicPickerIndex: number;\n topicPickerBackgroundId?: string;\n modelPickerIndex: number;\n effortPickerIndex: number;\n pendingDeleteTopicId?: string;\n creatingTopic: boolean;\n scrollOffset: number;\n askChoiceIndex: number;\n overlay: Overlay;\n topicPickerRoot: boolean;\n notice?: string;\n vaultEntries: VaultEntry[];\n vaultPickerIndex: number;\n vaultMode: VaultMode;\n vaultDraftKey?: string;\n vaultDraftDescription: string;\n vaultEditing: boolean;\n vaultNotice?: string;\n}\n\nexport function createInitialState(userId: string): AppState {\n return {\n userId,\n aiName: getGlobalAiName(),\n topics: [],\n backgroundSessions: [],\n activeTopicId: null,\n messages: {},\n messageHistory: {},\n activity: {},\n input: \"\",\n inputCursor: { row: 0, col: 0 },\n suggestionIndex: 0,\n topicPickerIndex: 0,\n modelPickerIndex: 0,\n effortPickerIndex: 0,\n creatingTopic: false,\n scrollOffset: 0,\n askChoiceIndex: 0,\n overlay: null,\n topicPickerRoot: false,\n vaultEntries: [],\n vaultPickerIndex: 0,\n vaultMode: \"list\",\n vaultDraftDescription: \"\",\n vaultEditing: false,\n };\n}\n\nexport function activeTopic(state: AppState): TopicDto | null {\n return state.topics.find((topic) => topic.id === state.activeTopicId) ?? null;\n}\n\nexport function activeMessages(state: AppState): MessageDto[] {\n return state.activeTopicId ? (state.messages[state.activeTopicId] ?? []) : [];\n}\n\nexport function activeQuestion(state: AppState): MessageDto | null {\n return (\n activeMessages(state)\n .slice()\n .reverse()\n .find(\n (message) =>\n message.kind === \"ask_user_question\" &&\n message.askUserQuestion &&\n !message.askUserQuestion.expired &&\n !message.askUserQuestion.selectedLabel,\n ) ?? null\n );\n}\n\nexport function activeTaskPanel(state: AppState): MessageDto | null {\n return (\n activeMessages(state)\n .slice()\n .reverse()\n .find((message) => message.id.startsWith(\"tasks-\")) ?? null\n );\n}\n\nfunction orderTopicsByParent(topics: TopicDto[]): TopicDto[] {\n const topicIds = new Set(topics.map((topic) => topic.id));\n const childrenByParent = new Map<string, TopicDto[]>();\n const attachedChildIds = new Set<string>();\n\n for (const topic of topics) {\n if (\n !topic.isSubagent ||\n !topic.parentTopicId ||\n topic.parentTopicId === topic.id ||\n !topicIds.has(topic.parentTopicId)\n ) {\n continue;\n }\n const children = childrenByParent.get(topic.parentTopicId) ?? [];\n children.push(topic);\n childrenByParent.set(topic.parentTopicId, children);\n attachedChildIds.add(topic.id);\n }\n\n const ordered: TopicDto[] = [];\n const visited = new Set<string>();\n const appendTopic = (topic: TopicDto): void => {\n if (visited.has(topic.id)) return;\n visited.add(topic.id);\n ordered.push(topic);\n for (const child of childrenByParent.get(topic.id) ?? []) appendTopic(child);\n };\n\n const roots = topics.filter((topic) => !attachedChildIds.has(topic.id));\n const orderedRoots = [\n ...roots.filter((topic) => topic.title.toLowerCase() === \"general\"),\n ...roots.filter((topic) => topic.title.toLowerCase() !== \"general\"),\n ];\n for (const topic of orderedRoots) {\n if (!attachedChildIds.has(topic.id)) appendTopic(topic);\n }\n // Keep malformed/cyclic relationships discoverable instead of dropping them.\n for (const topic of topics) appendTopic(topic);\n return ordered;\n}\n\nexport function setBackgroundSessions(\n state: AppState,\n backgroundSessions: BackgroundSessionDto[],\n): AppState {\n const orderedSessions = [\n ...backgroundSessions.filter((session) => session.kind === \"memory\"),\n ...backgroundSessions.filter((session) => session.kind === \"cron\"),\n ];\n const selectedStillExists = orderedSessions.some(\n (session) => session.id === state.topicPickerBackgroundId,\n );\n return {\n ...state,\n backgroundSessions: orderedSessions,\n topicPickerBackgroundId: selectedStillExists ? state.topicPickerBackgroundId : undefined,\n overlay:\n state.overlay === \"background-session\" && !selectedStillExists ? \"topics\" : state.overlay,\n };\n}\n\nexport function pickedBackgroundSession(state: AppState): BackgroundSessionDto | undefined {\n return state.backgroundSessions.find((session) => session.id === state.topicPickerBackgroundId);\n}\n\nexport function pickedTopic(state: AppState): TopicDto | undefined {\n return state.topicPickerBackgroundId ? undefined : state.topics[state.topicPickerIndex];\n}\n\nexport function moveTopicPickerSelection(state: AppState, delta: number): AppState {\n const items = [\n ...state.topics.map((topic, index) => ({ kind: \"topic\" as const, id: topic.id, index })),\n ...state.backgroundSessions.map((session) => ({\n kind: \"background\" as const,\n id: session.id,\n })),\n ];\n if (items.length === 0) return state;\n const currentId = state.topicPickerBackgroundId ?? state.topics[state.topicPickerIndex]?.id;\n const current = Math.max(\n 0,\n items.findIndex((item) => item.id === currentId),\n );\n const next = items[(current + delta + items.length) % items.length];\n return next.kind === \"topic\"\n ? { ...state, topicPickerIndex: next.index, topicPickerBackgroundId: undefined }\n : { ...state, topicPickerBackgroundId: next.id };\n}\n\nexport function setTopics(state: AppState, topics: TopicDto[], preferredTitle?: string): AppState {\n const orderedTopics = orderTopicsByParent(topics);\n const stillVisible = orderedTopics.some((topic) => topic.id === state.activeTopicId);\n // Seed an initial \"busy\" snapshot for topics the server reports as running\n // but that this client has no live activity entry for yet (e.g. right after\n // opening the picker, before the next ai-status event arrives). Entries with\n // a query id came from live events and remain authoritative; snapshot-only\n // entries are reconciled on the next topic refresh.\n let activity = state.activity;\n for (const topic of orderedTopics) {\n const current = activity[topic.id];\n const snapshotIsNewer =\n topic.runningQueryId &&\n current?.running === false &&\n current.queryId !== topic.runningQueryId;\n if (topic.running && (!current || current.snapshot || snapshotIsNewer)) {\n if (activity === state.activity) activity = { ...state.activity };\n activity[topic.id] = {\n running: true,\n queryId: topic.runningQueryId,\n snapshot: true,\n tools: [],\n startedAtMs:\n current?.snapshot && current.queryId === topic.runningQueryId\n ? current.startedAtMs\n : Date.now(),\n };\n } else if (!topic.running && current?.snapshot) {\n if (activity === state.activity) activity = { ...state.activity };\n delete activity[topic.id];\n }\n }\n const pickedTopicId = state.topics[state.topicPickerIndex]?.id;\n const pickedTopicIndex = orderedTopics.findIndex((topic) => topic.id === pickedTopicId);\n const preferred = preferredTitle\n ? orderedTopics.find((topic) => topic.title.toLowerCase() === preferredTitle.toLowerCase())\n : undefined;\n const nextActive = state.topicPickerRoot\n ? null\n : (preferred?.id ?? (stillVisible ? state.activeTopicId : orderedTopics[0]?.id) ?? null);\n return {\n ...state,\n topics: orderedTopics,\n activity,\n activeTopicId: nextActive,\n scrollOffset: nextActive === state.activeTopicId ? state.scrollOffset : 0,\n askChoiceIndex: nextActive === state.activeTopicId ? state.askChoiceIndex : 0,\n topicPickerIndex:\n state.overlay === \"topics\"\n ? Math.max(0, pickedTopicIndex)\n : Math.max(\n 0,\n orderedTopics.findIndex((topic) => topic.id === nextActive),\n ),\n topicPickerBackgroundId: state.topicPickerBackgroundId,\n };\n}\n\nexport function selectTopic(state: AppState, topicId: string): AppState {\n if (!state.topics.some((topic) => topic.id === topicId)) return state;\n return {\n ...state,\n activeTopicId: topicId,\n scrollOffset: 0,\n askChoiceIndex: 0,\n overlay: null,\n topicPickerRoot: false,\n creatingTopic: false,\n topicPickerIndex: state.topics.findIndex((topic) => topic.id === topicId),\n topicPickerBackgroundId: undefined,\n notice: undefined,\n };\n}\n\n/** Select a newly-created topic before asynchronous list refreshes can race it. */\nexport function focusCreatedTopic(state: AppState, topic: TopicDto): AppState {\n const topics = state.topics.some((candidate) => candidate.id === topic.id)\n ? state.topics.map((candidate) => (candidate.id === topic.id ? topic : candidate))\n : [...state.topics, topic];\n return selectTopic(setTopics(state, topics), topic.id);\n}\n\nexport function openTopicPicker(\n state: AppState,\n notice = state.notice,\n topicPickerRoot = false,\n): AppState {\n const activeIndex = state.topics.findIndex((topic) => topic.id === state.activeTopicId);\n return {\n ...state,\n activeTopicId: topicPickerRoot ? null : state.activeTopicId,\n overlay: \"topics\",\n topicPickerRoot,\n creatingTopic: false,\n topicPickerIndex: Math.max(0, activeIndex >= 0 ? activeIndex : state.topicPickerIndex),\n topicPickerBackgroundId: undefined,\n notice,\n };\n}\n\nexport function startTopicCreation(state: AppState): AppState {\n return {\n ...state,\n overlay: null,\n creatingTopic: true,\n notice: \"Type a new topic name, then press Enter\",\n };\n}\n\nexport function setMessages(state: AppState, topicId: string, messages: MessageDto[]): AppState {\n return { ...state, messages: { ...state.messages, [topicId]: messages } };\n}\n\nexport function setMessageHistoryStatus(\n state: AppState,\n topicId: string,\n status: MessageHistoryStatus,\n): AppState {\n return {\n ...state,\n messageHistory: { ...state.messageHistory, [topicId]: status },\n };\n}\n\nexport function upsertMessage(state: AppState, message: MessageDto): AppState {\n const current = state.messages[message.topicId] ?? [];\n const index = current.findIndex((item) => item.id === message.id);\n const next = [...current];\n if (index >= 0) next[index] = message;\n else next.push(message);\n next.sort((left, right) => {\n const leftTime = Date.parse(left.createdAt);\n const rightTime = Date.parse(right.createdAt);\n if (!Number.isFinite(leftTime) || !Number.isFinite(rightTime)) return 0;\n return leftTime - rightTime;\n });\n return {\n ...state,\n messages: { ...state.messages, [message.topicId]: next },\n // Keep the user's place while reading history. Explicit navigation and\n // message submission return to the live edge instead.\n scrollOffset: state.scrollOffset,\n };\n}\n\nfunction patchMessage(\n state: AppState,\n topicId: string,\n messageId: string,\n patch: Partial<MessageDto>,\n): AppState {\n const current = state.messages[topicId] ?? [];\n const index = current.findIndex((message) => message.id === messageId);\n if (index < 0) return state;\n const next = [...current];\n next[index] = { ...next[index], ...patch } as MessageDto;\n return { ...state, messages: { ...state.messages, [topicId]: next } };\n}\n\nfunction removeMessage(state: AppState, topicId: string, messageId: string): AppState {\n const current = state.messages[topicId] ?? [];\n const next = current.filter((message) => message.id !== messageId);\n if (next.length === current.length) return state;\n return { ...state, messages: { ...state.messages, [topicId]: next } };\n}\n\nfunction activityFor(state: AppState, topicId: string): TopicActivity {\n return state.activity[topicId] ?? { running: false, tools: [] };\n}\n\nfunction setActivity(state: AppState, topicId: string, activity: TopicActivity): AppState {\n return { ...state, activity: { ...state.activity, [topicId]: activity } };\n}\n\nfunction activityStartMs(createdAt?: string): number {\n const parsed = createdAt ? Date.parse(createdAt) : Number.NaN;\n return Number.isFinite(parsed) ? parsed : terminalNowMs();\n}\n\nfunction isStaleTerminalStatus(current: TopicActivity, status: Record<string, unknown>): boolean {\n const queryId = typeof status.queryId === \"string\" ? status.queryId.trim() : \"\";\n return Boolean(queryId && current.queryId && queryId !== current.queryId);\n}\n\nfunction compactPath(value: unknown): string {\n if (typeof value !== \"string\" || !value.trim()) return \"file\";\n const normalized = value.trim().replaceAll(\"\\\\\", \"/\");\n const parts = normalized.split(\"/\").filter(Boolean);\n return parts.length > 2 ? `…/${parts.slice(-2).join(\"/\")}` : normalized;\n}\n\nfunction compactToolLabel(value: string): string {\n const match = value.match(/^([^()]+)\\((.*)\\)$/);\n return match ? `${match[1]} · ${match[2]}` : value;\n}\n\nfunction toolTimelineText(status: Record<string, unknown>): string {\n const name = String(status.name ?? \"tool\");\n const shortName = name.split(\"__\").at(-1)?.toLowerCase() ?? name.toLowerCase();\n const input =\n status.input && typeof status.input === \"object\"\n ? (status.input as Record<string, unknown>)\n : {};\n const path = compactPath(input.file_path ?? input.path ?? input.file_id);\n if (shortName === \"ask_session\" || shortName === \"tell_session\") {\n const target = typeof input.to === \"string\" && input.to.trim() ? input.to.trim() : \"session\";\n const message = typeof input.message === \"string\" ? input.message.trim() : \"\";\n const action = shortName === \"ask_session\" ? \"Ask session\" : \"Tell session\";\n return [`${action} · ${target}`, message].filter(Boolean).join(\"\\n\");\n }\n if (shortName === \"edit\") {\n const before = typeof input.before === \"string\" ? input.before : \"\";\n const after = typeof input.after === \"string\" ? input.after : \"\";\n return [`Edit · ${path}`, before ? `- ${before}` : \"\", after ? `+ ${after}` : \"\"]\n .filter(Boolean)\n .join(\"\\n\");\n }\n if (shortName === \"write\") {\n const lines = typeof input.lines === \"number\" ? ` · ${input.lines} lines` : \"\";\n const preview = typeof input.preview === \"string\" ? input.preview : \"\";\n return [`Write · ${path}${lines}`, preview ? `+ ${preview}` : \"\"].filter(Boolean).join(\"\\n\");\n }\n return compactToolLabel(String(status.label ?? status.name ?? \"tool\"));\n}\n\nfunction toolMessageId(status: Record<string, unknown>, toolUseId: string): string {\n return `terminal-tool:${String(status.queryId ?? \"query\")}:${toolUseId}`;\n}\n\nfunction applyAiStatus(\n state: AppState,\n topicId: string,\n raw: unknown,\n createdAt?: string,\n): AppState {\n const status = (raw ?? {}) as Record<string, unknown>;\n const kind = String(status.kind ?? \"\");\n const current = activityFor(state, topicId);\n const liveCurrent = { ...current };\n delete liveCurrent.snapshot;\n if (kind === \"ai_active\") {\n const queryId = String(status.queryId ?? \"\");\n return setActivity(state, topicId, {\n running: true,\n queryId,\n startedAtMs:\n current.running && current.queryId === queryId && current.startedAtMs !== undefined\n ? current.startedAtMs\n : activityStartMs(createdAt),\n status: \"Thinking…\",\n tools: [],\n });\n }\n if (kind === \"ai_done\") {\n // A superseded provider can finish unwinding after its replacement has\n // already broadcast ai_active. Its late terminal event must not stop the\n // replacement's spinner or overwrite its status.\n if (isStaleTerminalStatus(current, status)) return state;\n return setActivity(state, topicId, {\n ...liveCurrent,\n running: false,\n status: \"Done\",\n });\n }\n if (kind === \"ai_aborted\") {\n if (isStaleTerminalStatus(current, status)) return state;\n return setActivity(state, topicId, {\n ...liveCurrent,\n running: false,\n status: \"Aborted\",\n });\n }\n if (kind === \"ai_error\") {\n if (isStaleTerminalStatus(current, status)) return state;\n return setActivity(state, topicId, {\n ...liveCurrent,\n running: false,\n status: \"Error\",\n error: String(status.error ?? \"Unknown error\"),\n });\n }\n if (kind === \"tool_call\") {\n if (isStaleTerminalStatus(current, status)) return state;\n const queryId = String(status.queryId ?? \"\");\n const tool: ToolActivity = {\n id: String(status.toolUseId ?? `${queryId || \"query\"}:tool`),\n label: String(status.label ?? status.name ?? \"tool\"),\n status: \"running\",\n };\n const withActivity = setActivity(state, topicId, {\n ...liveCurrent,\n running: true,\n queryId: queryId || current.queryId,\n startedAtMs:\n current.queryId === queryId && current.startedAtMs !== undefined\n ? current.startedAtMs\n : activityStartMs(createdAt),\n status: tool.label,\n tools: [...current.tools.filter((item) => item.id !== tool.id), tool].slice(-8),\n });\n return upsertMessage(withActivity, {\n id: toolMessageId(status, tool.id),\n topicId,\n authorId: \"ai\",\n text: toolTimelineText(status),\n kind: \"tool\",\n queryId: typeof status.queryId === \"string\" ? status.queryId : undefined,\n createdAt: createdAt ?? new Date().toISOString(),\n });\n }\n if (kind === \"tool_output\") {\n if (isStaleTerminalStatus(current, status)) return state;\n const id = String(status.toolUseId ?? \"\");\n const tools = current.tools.map((tool) =>\n tool.id === id ? { ...tool, output: String(status.content ?? \"\"), status: \"done\" } : tool,\n );\n const withActivity = setActivity(state, topicId, { ...liveCurrent, tools });\n return patchMessage(withActivity, topicId, toolMessageId(status, id), {\n editedAt: createdAt ?? new Date().toISOString(),\n });\n }\n if (kind === \"tool_status\") {\n if (isStaleTerminalStatus(current, status)) return state;\n return setActivity(state, topicId, {\n ...liveCurrent,\n status: String(status.content ?? current.status ?? \"Working…\"),\n });\n }\n return state;\n}\n\nexport function applyRuntimeEvent(state: AppState, event: RuntimeBusEvent): AppState {\n if (event.type === \"message\") {\n return upsertMessage(state, event.payload as MessageDto);\n }\n if (event.type === \"message-updated\") {\n const payload = event.payload as {\n messageId?: string;\n patch?: Partial<MessageDto>;\n };\n if (!payload.messageId || !payload.patch) return state;\n if (payload.patch.deleted) return removeMessage(state, event.topicId, payload.messageId);\n return patchMessage(state, event.topicId, payload.messageId, payload.patch);\n }\n if (event.type === \"ai-status\") {\n return applyAiStatus(state, event.topicId, event.payload, event.createdAt);\n }\n if (event.type === \"topic-deleted\" && state.activeTopicId === event.topicId) {\n return { ...state, activeTopicId: null };\n }\n return state;\n}\n",
10
- "import {\n EFFORT_VALUES,\n getRegistry,\n type MessageDto,\n resolveModelForAgent,\n SELECTABLE_MODELS,\n type TopicDto,\n} from \"@negotium/core\";\nimport { terminalNowMs } from \"@/clock\";\nimport { commandSuggestions } from \"@/commands\";\nimport { pathSuggestions } from \"@/path-suggest\";\nimport {\n type AppState,\n activeMessages,\n activeQuestion,\n activeTaskPanel,\n activeTopic,\n pickedBackgroundSession,\n} from \"@/state\";\n\ntype Rgb = readonly [number, number, number];\n\nconst theme = {\n canvas: [10, 11, 15] as Rgb,\n surface: [18, 20, 27] as Rgb,\n surfaceRaised: [24, 27, 36] as Rgb,\n selected: [42, 37, 69] as Rgb,\n border: [48, 52, 67] as Rgb,\n borderActive: [119, 103, 239] as Rgb,\n text: [232, 233, 239] as Rgb,\n muted: [137, 141, 158] as Rgb,\n subtle: [91, 95, 112] as Rgb,\n accent: [139, 124, 246] as Rgb,\n cyan: [87, 205, 220] as Rgb,\n green: [94, 211, 142] as Rgb,\n amber: [241, 190, 91] as Rgb,\n red: [245, 116, 128] as Rgb,\n};\n\n// cli-spinners' compact \"dots\" pattern: fast, stable-width, and reads as\n// active computation rather than a slow mechanical wheel.\nconst WORKING_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"] as const;\nexport const WORKING_FRAME_INTERVAL_MS = 50;\n\nexport function workingFrame(frame: number): string {\n const index = Math.abs(Math.trunc(frame)) % WORKING_FRAMES.length;\n return WORKING_FRAMES[index] ?? WORKING_FRAMES[0];\n}\n\nexport function workingElapsedSeconds(\n startedAtMs: number | undefined,\n nowMs = terminalNowMs(),\n): number {\n if (startedAtMs === undefined || !Number.isFinite(startedAtMs)) return 0;\n return Math.max(0, Math.floor((nowMs - startedAtMs) / 1_000));\n}\n\nexport function formatElapsedDuration(totalSeconds: number): string {\n const elapsed = Number.isFinite(totalSeconds) ? Math.max(0, Math.floor(totalSeconds)) : 0;\n const days = Math.floor(elapsed / 86_400);\n const hours = Math.floor((elapsed % 86_400) / 3_600);\n const minutes = Math.floor((elapsed % 3_600) / 60);\n const seconds = elapsed % 60;\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (days > 0 || hours > 0) parts.push(`${hours}h`);\n if (days > 0 || hours > 0 || minutes > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n return parts.join(\" \");\n}\n\n/** Hide legacy cross-agent defaults such as codex + deepseek-pro. */\nexport function effectiveTopicModel(topic: TopicDto | null): string {\n if (!topic?.agent) return topic?.defaultModel ?? \"-\";\n return resolveModelForAgent(\n topic.agent,\n topic.effectiveModel ?? topic.defaultModel,\n getRegistry(topic.agent),\n );\n}\n\nfunction effectiveTopicEffort(topic: TopicDto | null): string {\n return topic?.effectiveEffort ?? topic?.defaultEffort ?? \"-\";\n}\n\ninterface UiLine {\n text: string;\n fg?: Rgb;\n bg?: Rgb;\n bold?: boolean;\n dim?: boolean;\n}\n\nexport interface RenderedTerminalApp {\n frame: string;\n cursor: { x: number; y: number } | null;\n}\n\nconst ESC = \"\\u001b[\";\nconst RESET = `${ESC}0m`;\nconst fg = ([r, g, b]: Rgb) => `${ESC}38;2;${r};${g};${b}m`;\nconst bg = ([r, g, b]: Rgb) => `${ESC}48;2;${r};${g};${b}m`;\n\nfunction paint(\n value: string,\n options: { fg?: Rgb; bg?: Rgb; bold?: boolean; dim?: boolean } = {},\n): string {\n return `${options.fg ? fg(options.fg) : \"\"}${options.bg ? bg(options.bg) : \"\"}${options.bold ? `${ESC}1m` : \"\"}${options.dim ? `${ESC}2m` : \"\"}${value}${RESET}`;\n}\n\nexport function stripAnsi(value: string): string {\n // biome-ignore lint/complexity/useRegexLiterals: avoids literal terminal control bytes in source.\n return value.replace(new RegExp(\"\\\\u001b\\\\[[0-?]*[ -/]*[@-~]\", \"g\"), \"\");\n}\n\nfunction safeText(value: string): string {\n return [...stripAnsi(value).replaceAll(\"\\r\", \"\")]\n .filter((character) => {\n const code = character.charCodeAt(0);\n return code === 0x09 || code === 0x0a || (code >= 0x20 && code !== 0x7f);\n })\n .join(\"\");\n}\n\nfunction runeWidth(char: string): number {\n const code = char.codePointAt(0) ?? 0;\n if (code === 0x200d || (code >= 0xfe00 && code <= 0xfe0f)) return 0;\n if (\n code >= 0x1100 &&\n (code <= 0x115f ||\n code === 0x2329 ||\n code === 0x232a ||\n (code >= 0x2e80 && code <= 0xa4cf) ||\n (code >= 0xac00 && code <= 0xd7a3) ||\n (code >= 0xf900 && code <= 0xfaff) ||\n (code >= 0xfe10 && code <= 0xfe6f) ||\n (code >= 0xff00 && code <= 0xff60) ||\n (code >= 0x1f300 && code <= 0x1faff) ||\n code >= 0x20000)\n ) {\n return 2;\n }\n return 1;\n}\n\nexport function displayWidth(value: string): number {\n return [...stripAnsi(value)].reduce((width, char) => width + runeWidth(char), 0);\n}\n\nfunction sliceWidth(value: string, width: number): string {\n let out = \"\";\n let used = 0;\n for (const char of [...safeText(value)]) {\n const next = runeWidth(char);\n if (used + next > width) break;\n out += char;\n used += next;\n }\n return out;\n}\n\nfunction fit(value: string, width: number): string {\n if (width <= 0) return \"\";\n const clean = safeText(value).replaceAll(\"\\n\", \" \");\n const clipped = sliceWidth(clean, width);\n return clipped + \" \".repeat(Math.max(0, width - displayWidth(clipped)));\n}\n\nfunction joinSides(left: string, right: string, width: number): string {\n const safeLeft = sliceWidth(left, width);\n const remaining = Math.max(1, width - displayWidth(safeLeft));\n const safeRight = sliceWidth(right, remaining);\n const gap = Math.max(1, width - displayWidth(safeLeft) - displayWidth(safeRight));\n return fit(`${safeLeft}${\" \".repeat(gap)}${safeRight}`, width);\n}\n\nexport function wrapText(value: string, width: number): string[] {\n if (width <= 1) return [sliceWidth(value, Math.max(0, width))];\n const output: string[] = [];\n for (const paragraph of safeText(value).split(\"\\n\")) {\n if (!paragraph) {\n output.push(\"\");\n continue;\n }\n let current = \"\";\n let currentWidth = 0;\n for (const character of [...paragraph]) {\n const characterWidth = runeWidth(character);\n if (currentWidth + characterWidth > width && current) {\n output.push(current);\n current = \"\";\n currentWidth = 0;\n }\n current += character;\n currentWidth += characterWidth;\n }\n output.push(current);\n }\n return output.length > 0 ? output : [\"\"];\n}\n\nfunction line(text: string, options: Omit<UiLine, \"text\"> = {}): UiLine {\n return { text, ...options };\n}\n\nfunction framePane(\n title: string,\n content: UiLine[],\n width: number,\n height: number,\n options: { active?: boolean; accent?: Rgb } = {},\n): string[] {\n const innerWidth = Math.max(1, width - 2);\n const borderColor = options.active ? (options.accent ?? theme.borderActive) : theme.border;\n const label = ` ${sliceWidth(title, Math.max(0, innerWidth - 3))} `;\n const top = paint(`╭${label}${\"─\".repeat(Math.max(0, innerWidth - displayWidth(label)))}╮`, {\n fg: borderColor,\n bg: theme.canvas,\n bold: true,\n });\n const body = Array.from({ length: Math.max(0, height - 2) }, (_, index) => {\n const item = content[index] ?? line(\"\");\n const side = paint(\"│\", { fg: borderColor, bg: theme.canvas });\n const cell = paint(fit(item.text, innerWidth), {\n fg: item.fg ?? theme.text,\n bg: item.bg ?? theme.surface,\n bold: item.bold,\n dim: item.dim,\n });\n return `${side}${cell}${side}`;\n });\n const bottom = paint(`╰${\"─\".repeat(innerWidth)}╯`, {\n fg: borderColor,\n bg: theme.canvas,\n });\n return [top, ...body, bottom];\n}\n\nfunction cleanInlineMarkdown(value: string): string {\n return value\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\")\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, \"$1 ($2)\")\n .replace(/(\\*\\*|__)(.*?)\\1/g, \"$2\")\n .replace(/(?<!\\*)\\*([^*]+)\\*/g, \"$1\")\n .replace(/`([^`]+)`/g, \"‹$1›\");\n}\n\n/** Lightweight block renderer adapted to agent replies: headings, lists, quotes and fenced code. */\nexport function renderMarkdown(value: string, width: number): UiLine[] {\n const result: UiLine[] = [];\n let codeLanguage = \"\";\n let inCode = false;\n for (const rawLine of safeText(value).split(\"\\n\")) {\n const fence = rawLine.match(/^\\s*```([^`]*)$/);\n if (fence) {\n if (!inCode) {\n codeLanguage = fence[1]?.trim() ?? \"\";\n result.push(\n line(` ┌─ code${codeLanguage ? ` · ${codeLanguage}` : \"\"}`, {\n fg: theme.cyan,\n bg: theme.surfaceRaised,\n bold: true,\n }),\n );\n } else {\n result.push(line(\" └─\", { fg: theme.subtle, bg: theme.surfaceRaised }));\n }\n inCode = !inCode;\n continue;\n }\n if (inCode) {\n for (const wrapped of wrapText(rawLine || \" \", Math.max(4, width - 4))) {\n result.push(line(` │ ${wrapped}`, { fg: theme.text, bg: theme.surfaceRaised }));\n }\n continue;\n }\n const heading = rawLine.match(/^\\s{0,3}(#{1,6})\\s+(.+)$/);\n if (heading) {\n for (const wrapped of wrapText(cleanInlineMarkdown(heading[2]), Math.max(4, width - 2))) {\n result.push(line(` ${wrapped}`, { fg: theme.accent, bold: true }));\n }\n continue;\n }\n const bullet = rawLine.match(/^\\s*[-+*]\\s+(.+)$/);\n if (bullet) {\n for (const [index, wrapped] of wrapText(\n cleanInlineMarkdown(bullet[1]),\n Math.max(4, width - 5),\n ).entries()) {\n result.push(line(` ${index === 0 ? \"•\" : \" \"} ${wrapped}`, { fg: theme.text }));\n }\n continue;\n }\n const ordered = rawLine.match(/^\\s*(\\d+[.)])\\s+(.+)$/);\n if (ordered) {\n const marker = ordered[1];\n for (const [index, wrapped] of wrapText(\n cleanInlineMarkdown(ordered[2]),\n Math.max(4, width - marker.length - 4),\n ).entries()) {\n result.push(line(` ${index === 0 ? marker : \" \".repeat(marker.length)} ${wrapped}`));\n }\n continue;\n }\n const quote = rawLine.match(/^\\s*>\\s?(.*)$/);\n if (quote) {\n for (const wrapped of wrapText(cleanInlineMarkdown(quote[1]), Math.max(4, width - 5))) {\n result.push(line(` ▏ ${wrapped}`, { fg: theme.muted }));\n }\n continue;\n }\n if (/^\\s*([-*_])(?:\\s*\\1){2,}\\s*$/.test(rawLine)) {\n result.push(line(` ${\"─\".repeat(Math.max(1, width - 4))}`, { fg: theme.border }));\n continue;\n }\n if (!rawLine.trim()) {\n result.push(line(\"\"));\n continue;\n }\n for (const wrapped of wrapText(cleanInlineMarkdown(rawLine), Math.max(4, width - 2))) {\n result.push(line(` ${wrapped}`, { fg: theme.text }));\n }\n }\n if (inCode) result.push(line(\" └─\", { fg: theme.subtle, bg: theme.surfaceRaised }));\n return result;\n}\n\nfunction subagentLines(message: MessageDto, width: number): UiLine[] {\n const card = message.subagentCard;\n if (!card) return [];\n const done = card.status === \"completed\";\n const failed = card.status === \"failed\";\n const color = failed ? theme.red : done ? theme.green : theme.cyan;\n const output = card.errorMessage ?? card.resultSummary ?? card.task;\n return [\n line(` ↳ ${card.name} ${card.status}`, { fg: color, bold: true }),\n ...wrapText(output, Math.max(4, width - 6))\n .slice(0, 4)\n .map((text) => line(` ${text}`, { fg: theme.muted })),\n line(\"\"),\n ];\n}\n\nfunction isVisibleSystemMessage(message: MessageDto): boolean {\n return message.sourceAdapter === \"session-comm\" || message.id.startsWith(\"tell-\");\n}\n\nfunction messageLines(message: MessageDto, width: number, userId: string): UiLine[] {\n if (\n message.kind === \"system\" ||\n (message.authorId === \"system\" && !isVisibleSystemMessage(message))\n ) {\n return [];\n }\n if (message.kind === \"subagent\" && message.subagentCard) return subagentLines(message, width);\n if (message.kind === \"tool\") {\n const [title = \"Tool\", ...details] = safeText(message.text).split(\"\\n\");\n const done = Boolean(message.editedAt);\n return [\n line(` ${done ? \"✓\" : \"●\"} ${title}`, {\n fg: done ? theme.green : theme.cyan,\n dim: done,\n }),\n ...details.slice(0, 2).flatMap((detail) =>\n wrapText(detail, Math.max(4, width - 6))\n .slice(0, 1)\n .map((text) =>\n line(` ${text}`, {\n fg: detail.startsWith(\"-\")\n ? theme.red\n : detail.startsWith(\"+\")\n ? theme.green\n : theme.muted,\n dim: true,\n }),\n ),\n ),\n ];\n }\n const own = message.authorId === userId;\n const ai = message.authorId === \"ai\";\n const icon = own ? \"›\" : ai ? \"●\" : \"•\";\n const body = ai\n ? renderMarkdown(message.text, Math.max(4, width - 6))\n : wrapText(message.text, Math.max(4, width - 6)).map((text, index) =>\n line(`${index === 0 ? ` ${icon} ` : \" \"}${text}`, {\n fg: theme.text,\n bg: theme.surfaceRaised,\n }),\n );\n if (ai) {\n const firstContent = body.findIndex((item) => item.text.trim().length > 0);\n if (firstContent >= 0) {\n const first = body[firstContent];\n body[firstContent] = {\n ...first,\n text: ` ${icon} ${first.text.trimStart()}`,\n };\n }\n }\n if (!ai) {\n const padding = line(\"\", { bg: theme.surfaceRaised });\n return [padding, ...body, padding, line(\"\")];\n }\n return [...body, line(\"\")];\n}\n\nfunction activityDetail(value: string | undefined): string | undefined {\n const raw = value?.trim();\n if (!raw) return undefined;\n if (raw.startsWith(\"Working…\")) return undefined;\n if (raw.startsWith(\"Thinking…\")) return \"Thinking\";\n const running = raw.match(/^(.*?) running \\d+s$/u);\n return running?.[1]?.trim() || raw;\n}\n\nfunction activityLines(state: AppState, animationFrame = 0, nowMs = terminalNowMs()): UiLine[] {\n const topic = activeTopic(state);\n if (!topic) return [];\n const activity = state.activity[topic.id];\n if (!activity) return [];\n const result: UiLine[] = [];\n if (activity.running) {\n const detail = activityDetail(activity.status);\n const lastToolLabel = activity.tools.at(-1)?.label;\n const elapsed = workingElapsedSeconds(activity.startedAtMs, nowMs);\n result.push(\n line(\n ` ${workingFrame(animationFrame)} Working · ${formatElapsedDuration(elapsed)}${detail && detail !== lastToolLabel ? ` · ${detail}` : \"\"}`,\n { fg: theme.amber, bold: true },\n ),\n );\n } else if (activity.error) {\n result.push(line(` ! ${activity.error}`, { fg: theme.red }));\n }\n if (result.length > 0) result.push(line(\"\"));\n return result;\n}\n\nfunction taskLines(state: AppState, width: number): UiLine[] {\n const taskPanel = activeTaskPanel(state);\n if (!taskPanel) return [];\n return [\n line(\" ◫ Tasks\", { fg: theme.amber, bold: true }),\n ...safeText(taskPanel.text)\n .split(\"\\n\")\n .slice(1, 6)\n .flatMap((task) =>\n wrapText(task.trimStart(), Math.max(4, width - 6)).map((text) =>\n line(` ${text}`, { fg: theme.muted }),\n ),\n ),\n line(\"\"),\n ];\n}\n\nfunction helpLines(): UiLine[] {\n return [\n line(\" Keyboard\", { fg: theme.accent, bold: true }),\n line(\"\"),\n line(\" Alt-Enter newline\"),\n line(\" ← → move · Ctrl/Alt-← → move by word · ↑ ↓ history\"),\n line(\" Ctrl-W delete word · Ctrl-U/K clear before/after cursor\"),\n line(\" Mouse wheel / PgUp/PgDn scroll · Ctrl-E load older · Ctrl-T transcript\"),\n line(\" Ctrl-O topics · Ctrl-P/N previous/next topic\"),\n line(\" Esc/Ctrl-C stop active turn · Ctrl-C twice when idle to quit\"),\n line(\"\"),\n line(\" Commands\", { fg: theme.cyan, bold: true }),\n line(\" /new /model /effort /topics /fork /spawn /del /copy\"),\n line(\" /abort /help /quit\", { fg: theme.muted }),\n ];\n}\n\nfunction tokenCount(value: number | undefined): string {\n if (value === undefined || !Number.isFinite(value)) return \"unavailable\";\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(2)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(value >= 100_000 ? 0 : 1)}K`;\n return String(Math.round(value));\n}\n\nfunction statusLines(state: AppState): UiLine[] {\n const topic = activeTopic(state);\n const latest = activeMessages(state)\n .slice()\n .reverse()\n .find((message) => message.authorId === \"ai\" && message.usage);\n const usage = latest?.usage;\n const ratio =\n usage?.context !== undefined && usage.contextWindow\n ? Math.round((usage.context / usage.contextWindow) * 100)\n : undefined;\n return [\n line(\" Status\", { fg: theme.accent, bold: true }),\n line(\"\"),\n line(` Topic ${topic?.title ?? \"none\"}`),\n line(` Agent ${topic?.agent ?? \"none\"}`),\n line(` Model ${effectiveTopicModel(topic)}`),\n line(` Effort ${topic?.effectiveEffort ?? topic?.defaultEffort ?? \"-\"}`),\n line(\"\"),\n line(\n ` Context ${tokenCount(usage?.context)} / ${tokenCount(usage?.contextWindow)}${ratio === undefined ? \"\" : ` (${ratio}%)`}`,\n { fg: ratio !== undefined && ratio >= 80 ? theme.amber : theme.text },\n ),\n line(\" Measured on the latest model request\", { fg: theme.muted, dim: true }),\n line(\"\"),\n line(` Last turn input ${tokenCount(usage?.input)} · output ${tokenCount(usage?.output)}`),\n line(` Cache read ${tokenCount(usage?.cachedInput)}`),\n line(\" Turn input is aggregate spend; it is not context size.\", {\n fg: theme.muted,\n dim: true,\n }),\n line(\"\"),\n line(\" Esc close\", { fg: theme.muted }),\n ];\n}\n\nexport function plainTranscript(state: AppState): string {\n const topic = activeTopic(state);\n const rows = [`# ${topic?.title ?? \"Conversation\"}`];\n for (const message of activeMessages(state).filter(\n (item) =>\n !item.id.startsWith(\"tasks-\") &&\n item.kind !== \"tool\" &&\n item.kind !== \"system\" &&\n (item.authorId !== \"system\" || isVisibleSystemMessage(item)),\n )) {\n const author =\n message.authorId === state.userId\n ? \"You\"\n : message.authorId === \"ai\"\n ? state.aiName\n : \"System\";\n rows.push(\"\", `${author}:`, safeText(message.text));\n }\n return rows.join(\"\\n\");\n}\n\ntype TopicOverlayEntry =\n | { kind: \"manager\" }\n | { kind: \"heading\"; label: string }\n | { kind: \"separator\" }\n | { kind: \"topic\"; topic: TopicDto; topicIndex: number }\n | {\n kind: \"background\";\n sessionId: string;\n label: string;\n status: string;\n active: boolean;\n };\n\nfunction topicOverlayLines(\n state: AppState,\n width: number,\n height: number,\n animationFrame = 0,\n): UiLine[] {\n const indexedTopics = state.topics.map((topic, topicIndex) => ({ topic, topicIndex }));\n const general = indexedTopics.filter(({ topic }) => topic.title.toLowerCase() === \"general\");\n const otherTopics = indexedTopics.filter(({ topic }) => topic.title.toLowerCase() !== \"general\");\n const entries: TopicOverlayEntry[] = [];\n if (general.length > 0) {\n entries.push(\n { kind: \"manager\" },\n ...general.map(({ topic, topicIndex }) => ({ kind: \"topic\" as const, topic, topicIndex })),\n );\n }\n if (otherTopics.length > 0) {\n if (general.length > 0) entries.push({ kind: \"separator\" });\n entries.push({ kind: \"heading\", label: \"Worker\" });\n entries.push(\n ...otherTopics.map(({ topic, topicIndex }) => ({\n kind: \"topic\" as const,\n topic,\n topicIndex,\n })),\n );\n }\n for (const kind of [\"memory\", \"cron\"] as const) {\n const sessions = state.backgroundSessions.filter((session) => session.kind === kind);\n if (sessions.length === 0) continue;\n if (entries.length > 0) entries.push({ kind: \"separator\" });\n entries.push({ kind: \"heading\", label: kind === \"memory\" ? \"Memory\" : \"Cron\" });\n entries.push(\n ...sessions.map((session) => ({\n kind: \"background\" as const,\n sessionId: session.id,\n label: session.title,\n status: session.status,\n active: session.active ?? true,\n })),\n );\n }\n const visibleCount = Math.max(1, height - 3);\n const selectedEntryIndex = entries.findIndex(\n (entry) =>\n (entry.kind === \"topic\" &&\n !state.topicPickerBackgroundId &&\n entry.topicIndex === state.topicPickerIndex) ||\n (entry.kind === \"background\" && entry.sessionId === state.topicPickerBackgroundId),\n );\n let start = Math.min(\n Math.max(0, entries.length - visibleCount),\n Math.max(0, selectedEntryIndex - visibleCount + 1),\n );\n if (\n start > 0 &&\n entries[start - 1]?.kind === \"manager\" &&\n selectedEntryIndex - (start - 1) < visibleCount\n ) {\n start -= 1;\n }\n\n return [\n line(\" Topics\", { fg: theme.accent, bold: true }),\n line(\n state.topicPickerRoot\n ? \" ↑↓ select · Enter open · N new · D/Del delete · Esc/Ctrl-C exit\"\n : \" ↑↓ select · Enter open · N new · D/Del delete · Esc close · Ctrl-C exit; work continues\",\n { fg: theme.muted },\n ),\n line(\"\"),\n ...(entries.length === 0\n ? [line(\" No topics yet · Press N to create one\", { fg: theme.muted })]\n : entries.slice(start, start + visibleCount).map((entry) => {\n if (entry.kind === \"manager\") {\n return line(\" Manager\", { fg: theme.cyan, bold: true });\n }\n if (entry.kind === \"heading\") {\n return line(` ${entry.label}`, { fg: theme.cyan, bold: true });\n }\n if (entry.kind === \"separator\") {\n return line(` ${\"─\".repeat(Math.max(1, width - 4))}`, { fg: theme.border });\n }\n if (entry.kind === \"background\") {\n const selected = entry.sessionId === state.topicPickerBackgroundId;\n return line(\n ` ${selected ? \"›\" : \" \"} ${entry.active ? workingFrame(animationFrame) : \"○\"} ${entry.label} · ${entry.status}`,\n {\n fg: selected ? theme.text : entry.active ? theme.green : theme.muted,\n bg: selected ? theme.selected : theme.canvas,\n bold: selected,\n },\n );\n }\n const { topic, topicIndex } = entry;\n const selected = topicIndex === state.topicPickerIndex;\n const running = state.activity[topic.id]?.running;\n const childPrefix = topic.isSubagent ? \" ↳ \" : \"\";\n return line(\n ` ${selected ? \"›\" : \" \"} ${childPrefix}${running ? workingFrame(animationFrame) : \"○\"} ${topic.title} · ${topic.agent ?? \"no agent\"} · ${effectiveTopicModel(topic)} · ${effectiveTopicEffort(topic)}`,\n {\n fg: selected ? theme.text : running ? theme.green : theme.muted,\n bg: selected ? theme.selected : theme.canvas,\n bold: selected,\n },\n );\n })),\n ];\n}\n\nfunction backgroundSessionLines(state: AppState, width: number, nowMs = terminalNowMs()): UiLine[] {\n const session = pickedBackgroundSession(state);\n if (!session) return [line(\" This background session has finished.\", { fg: theme.muted })];\n const elapsed = formatElapsedDuration(\n Math.max(0, Math.floor((nowMs - Date.parse(session.startedAt)) / 1_000)),\n );\n return [\n line(` ${session.kind === \"memory\" ? \"Memory\" : \"Cron\"} · read-only`, {\n fg: theme.accent,\n bold: true,\n }),\n line(\n session.kind === \"cron\"\n ? \" Esc back · session stays available between runs\"\n : \" Esc back · this entry disappears when archiving finishes\",\n { fg: theme.muted },\n ),\n line(\"\"),\n line(` ${session.title}`, { bold: true }),\n line(` ${session.status}${session.active === false ? \"\" : ` · ${elapsed}`}`, {\n fg: session.active === false ? theme.muted : theme.green,\n }),\n ...(session.agent || session.model || session.effort\n ? [\n line(\n ` ${session.agent ?? \"-\"} · ${session.model ?? \"default\"} · ${session.effort ?? \"default\"}`,\n { fg: theme.muted },\n ),\n ]\n : []),\n ...(session.prompt\n ? [\n line(\"\"),\n line(` ${session.promptTitle ?? \"Prompt\"}`, { fg: theme.cyan, bold: true }),\n ...session.prompt\n .split(\"\\n\")\n .flatMap((part) => wrapText(part || \" \", Math.max(4, width - 4)))\n .map((part) => line(` ${safeText(part)}`, { fg: theme.text })),\n ]\n : []),\n line(\"\"),\n line(\" Activity\", { fg: theme.cyan, bold: true }),\n ...(session.steps.length > 0\n ? session.steps.map((step) => line(` ○ ${safeText(step)}`, { fg: theme.muted }))\n : [line(\" ○ Waiting for runtime activity\", { fg: theme.muted })]),\n ];\n}\n\nfunction modelOverlayLines(state: AppState, height: number): UiLine[] {\n const currentModel = effectiveTopicModel(activeTopic(state));\n const modelColumnWidth = Math.max(\n ...SELECTABLE_MODELS.map(({ model }) => `${model} (current)`.length),\n );\n const visibleCount = Math.max(1, height - 3);\n const start = Math.min(\n Math.max(0, SELECTABLE_MODELS.length - visibleCount),\n Math.max(0, state.modelPickerIndex - visibleCount + 1),\n );\n return [\n line(\" Models\", { fg: theme.accent, bold: true }),\n line(\" ↑↓ select · Enter apply · Esc close\", { fg: theme.muted }),\n line(\"\"),\n ...SELECTABLE_MODELS.slice(start, start + visibleCount).map(\n ({ model, description }, visibleIndex) => {\n const index = start + visibleIndex;\n const selected = index === state.modelPickerIndex;\n const current = model === currentModel;\n const label = `${model}${current ? \" (current)\" : \"\"}`.padEnd(modelColumnWidth);\n return line(` ${selected ? \"›\" : \" \"} ${label} ${description}`, {\n fg: selected ? theme.text : current ? theme.green : theme.muted,\n bg: selected ? theme.selected : theme.canvas,\n bold: selected,\n });\n },\n ),\n ];\n}\n\nfunction vaultOverlayLines(state: AppState, width: number, height: number): UiLine[] {\n const header = [\n line(\" Vault\", { fg: theme.accent, bold: true }),\n line(\" Encrypted locally · secret values are never displayed\", { fg: theme.muted }),\n line(\"\"),\n ];\n\n if (state.vaultMode === \"confirm-delete\") {\n const selected = state.vaultEntries[state.vaultPickerIndex];\n return [\n ...header,\n line(` Delete ${selected?.key ?? \"this key\"}?`, { fg: theme.red, bold: true }),\n line(\"\"),\n line(\" This cannot be undone. The secret value will be removed.\", { fg: theme.muted }),\n line(\" Press y to delete or n to cancel.\", { fg: theme.amber }),\n ].slice(0, height);\n }\n\n if (state.vaultMode !== \"list\") {\n const step = state.vaultMode === \"key\" ? 1 : state.vaultMode === \"value\" ? 2 : 3;\n const action = state.vaultEditing ? \"Update secret\" : \"Add secret\";\n const guidance =\n state.vaultMode === \"key\"\n ? \"Choose a recognizable key, for example GITHUB_TOKEN.\"\n : state.vaultMode === \"value\"\n ? \"Enter the secret value. Input is hidden and is never saved to history.\"\n : \"Add an optional description so the agent knows when to use this key.\";\n return [\n ...header,\n line(` ${action} · ${step}/3`, { bold: true }),\n ...(state.vaultDraftKey ? [line(` Key ${state.vaultDraftKey}`, { fg: theme.muted })] : []),\n line(\"\"),\n ...wrapText(guidance, Math.max(4, width - 4)).map((text) => line(` ${text}`)),\n ...(state.vaultNotice\n ? [line(\"\"), line(` ! ${state.vaultNotice}`, { fg: theme.amber })]\n : []),\n ].slice(0, height);\n }\n\n const entries = state.vaultEntries;\n const visibleCount = Math.max(1, height - 7);\n const start = Math.min(\n Math.max(0, entries.length - visibleCount),\n Math.max(0, state.vaultPickerIndex - visibleCount + 1),\n );\n return [\n ...header,\n ...(entries.length === 0\n ? [\n line(\" No secrets stored\", { bold: true }),\n line(\" Press N to add your first key.\", { fg: theme.muted }),\n ]\n : entries.slice(start, start + visibleCount).map((entry, visibleIndex) => {\n const selected = start + visibleIndex === state.vaultPickerIndex;\n const description = entry.description || \"No description\";\n return line(` ${selected ? \"›\" : \" \"} ${entry.key} ${description}`, {\n fg: selected ? theme.text : theme.muted,\n bg: selected ? theme.selected : theme.canvas,\n bold: selected,\n });\n })),\n ...(state.vaultNotice ? [line(\"\"), line(` ${state.vaultNotice}`, { fg: theme.green })] : []),\n ].slice(0, height);\n}\n\nfunction effortOverlayLines(state: AppState): UiLine[] {\n const topic = activeTopic(state);\n const currentEffort = topic?.effectiveEffort ?? topic?.defaultEffort;\n const efforts = topic?.agent ? getRegistry(topic.agent).validEfforts : EFFORT_VALUES;\n return [\n line(\" Reasoning effort\", { fg: theme.accent, bold: true }),\n line(\" ↑↓ select · Enter apply · Esc close\", { fg: theme.muted }),\n line(\"\"),\n ...efforts.map((effort, index) => {\n const selected = index === state.effortPickerIndex;\n const current = effort === currentEffort;\n return line(` ${selected ? \"›\" : \" \"} ${effort}${current ? \" (current)\" : \"\"}`, {\n fg: selected ? theme.text : current ? theme.green : theme.muted,\n bg: selected ? theme.selected : theme.canvas,\n bold: selected,\n });\n }),\n ];\n}\n\nfunction conversationContentLines(\n state: AppState,\n width: number,\n animationFrame = 0,\n nowMs = terminalNowMs(),\n): UiLine[] {\n const all: UiLine[] = [];\n for (const message of activeMessages(state).filter(\n (item) =>\n !item.id.startsWith(\"tasks-\") &&\n item.kind !== \"system\" &&\n (item.authorId !== \"system\" || isVisibleSystemMessage(item)),\n )) {\n all.push(...messageLines(message, width, state.userId));\n }\n all.push(...activityLines(state, animationFrame, nowMs), ...taskLines(state, width));\n if (all.length === 0) {\n all.push(\n line(\"\"),\n line(\" ✦ Start a conversation\", { fg: theme.accent, bold: true }),\n line(\" Ask, build, research, or delegate from the composer below.\", { fg: theme.muted }),\n );\n }\n return all;\n}\n\nfunction conversationLines(\n state: AppState,\n width: number,\n height: number,\n animationFrame = 0,\n nowMs = terminalNowMs(),\n): UiLine[] {\n if (state.overlay === \"help\") return helpLines().slice(0, height);\n if (state.overlay === \"status\") return statusLines(state).slice(0, height);\n if (state.overlay === \"topics\")\n return topicOverlayLines(state, width, height, animationFrame).slice(0, height);\n if (state.overlay === \"background-session\")\n return backgroundSessionLines(state, width, nowMs).slice(0, height);\n if (state.overlay === \"models\") return modelOverlayLines(state, height).slice(0, height);\n if (state.overlay === \"effort\") return effortOverlayLines(state).slice(0, height);\n if (state.overlay === \"vault\") return vaultOverlayLines(state, width, height);\n if (state.creatingTopic) {\n return [\n line(\"\"),\n line(\" New topic\", { fg: theme.accent, bold: true }),\n line(\"\"),\n line(\" Type only the topic name in the composer below.\"),\n line(\" Enter create · Esc cancel\", { fg: theme.muted }),\n ].slice(0, height);\n }\n if (state.overlay === \"transcript\") {\n return [\n line(\" Transcript · Ctrl-T close\", { fg: theme.accent, bold: true }),\n line(\"\"),\n ...plainTranscript(state)\n .split(\"\\n\")\n .flatMap((text) => wrapText(text, Math.max(4, width - 4)).map((part) => line(` ${part}`))),\n ].slice(0, height);\n }\n if (state.overlay === \"confirm-delete\") {\n const topic = state.topics.find((candidate) => candidate.id === state.pendingDeleteTopicId);\n return [\n line(\"\"),\n line(` Delete “${topic?.title ?? \"this topic\"}”?`, { fg: theme.red, bold: true }),\n line(\"\"),\n line(\" The transcript is archived before the topic and its runtime state are removed.\"),\n line(\" Press y to delete or n to cancel.\", { fg: theme.amber }),\n ].slice(0, height);\n }\n\n const all = conversationContentLines(state, width, animationFrame, nowMs);\n const { contentHeight, maxOffset, offset } = conversationViewport(\n all.length,\n height,\n state.scrollOffset,\n );\n const end = all.length - offset;\n const visible = all.slice(Math.max(0, end - contentHeight), end);\n const history = state.activeTopicId ? state.messageHistory[state.activeTopicId] : undefined;\n const marker =\n offset >= maxOffset && history?.loading\n ? \" ↑ Loading older messages…\"\n : offset >= maxOffset && history?.hasMore\n ? \" ↑ Loaded history start · Ctrl-E load older\"\n : offset >= maxOffset\n ? \" ↑ Start of conversation\"\n : ` ↑ history · ${offset} lines from latest · wheel down/PgDn to return`;\n return offset > 0\n ? [\n line(marker, {\n fg: theme.amber,\n dim: true,\n }),\n ...visible,\n ]\n : visible;\n}\n\nfunction conversationViewport(\n lineCount: number,\n height: number,\n requestedOffset: number,\n): { contentHeight: number; maxOffset: number; offset: number } {\n if (lineCount <= height) return { contentHeight: height, maxOffset: 0, offset: 0 };\n const contentHeight = Math.max(1, height - 1);\n const maxOffset = Math.max(0, lineCount - contentHeight);\n return {\n contentHeight,\n maxOffset,\n offset: Math.min(maxOffset, Math.max(0, requestedOffset)),\n };\n}\n\nfunction decisionPane(state: AppState, width: number): string[] {\n if (state.overlay) return [];\n const ask = activeQuestion(state);\n const question = ask?.askUserQuestion;\n if (!ask || !question?.choices.length) return [];\n const selected = Math.min(state.askChoiceIndex, question.choices.length - 1);\n const content: UiLine[] = [\n line(` ${question.question}`, { bold: true }),\n ...question.choices.map((choice, index) =>\n line(\n ` ${index === selected ? \"●\" : \"○\"} ${choice.label}${choice.description ? ` — ${choice.description}` : \"\"}`,\n {\n fg: index === selected ? theme.text : theme.muted,\n bg: index === selected ? theme.selected : theme.surface,\n bold: index === selected,\n },\n ),\n ),\n ];\n return framePane(\n \"decision required · ↑↓ select · Enter confirm\",\n content,\n width,\n Math.min(8, Math.max(4, content.length + 2)),\n { active: true, accent: theme.amber },\n );\n}\n\ninterface InputVisual {\n lines: UiLine[];\n cursorLine: number;\n cursorColumn: number;\n}\n\nfunction wrappedCursorPosition(\n value: string,\n codePointColumn: number,\n width: number,\n): { line: number; column: number } {\n let line = 0;\n let column = 0;\n for (const character of Array.from(value).slice(0, Math.max(0, codePointColumn))) {\n const characterWidth = runeWidth(character);\n if (column + characterWidth > width && column > 0) {\n line += 1;\n column = 0;\n }\n column += characterWidth;\n }\n return { line, column };\n}\n\nfunction inputVisualLines(state: AppState, width: number): InputVisual {\n const secretInput = state.overlay === \"vault\" && state.vaultMode === \"value\";\n const displayInput = secretInput\n ? state.input\n .split(\"\\n\")\n .map((row) => \"*\".repeat(Array.from(row).length))\n .join(\"\\n\")\n : state.input;\n if (!displayInput) {\n const placeholder =\n state.overlay === \"vault\"\n ? state.vaultMode === \"key\"\n ? \"Type a key name…\"\n : state.vaultMode === \"value\"\n ? \"Type the secret value…\"\n : \"Optional description…\"\n : state.creatingTopic\n ? \"Type a topic name…\"\n : \"Type a message or /command…\";\n return {\n lines: [line(` › ${placeholder}`, { fg: theme.subtle, bg: theme.surfaceRaised })],\n cursorLine: 0,\n cursorColumn: 5,\n };\n }\n const contentWidth = Math.max(4, width - 5);\n const result: UiLine[] = [];\n let cursorLine = 0;\n let cursorColumn = 5;\n for (const [row, inputLine] of displayInput.split(\"\\n\").entries()) {\n const firstVisualLine = result.length;\n if (row === state.inputCursor.row) {\n const cursor = wrappedCursorPosition(inputLine, state.inputCursor.col, contentWidth);\n cursorLine = firstVisualLine + cursor.line;\n cursorColumn = 5 + cursor.column;\n }\n for (const [visualIndex, wrapped] of wrapText(inputLine, contentWidth).entries()) {\n result.push(\n line(`${row === 0 && visualIndex === 0 ? \" › \" : \" \"}${wrapped}`, {\n bg: theme.surfaceRaised,\n }),\n );\n }\n }\n return { lines: result, cursorLine, cursorColumn };\n}\n\ninterface ComposerPane {\n lines: string[];\n cursor: { x: number; y: number };\n}\n\nfunction composerPane(state: AppState, width: number): ComposerPane {\n const title = state.creatingTopic\n ? \"new topic · type a name · Enter create\"\n : state.overlay === \"vault\"\n ? `${state.vaultMode === \"key\" ? \"key\" : state.vaultMode === \"value\" ? \"secret value\" : \"description\"} · Enter continue · Esc cancel`\n : \"Ctrl-O topics\";\n const visual = inputVisualLines(state, width);\n let inputStart = Math.max(0, visual.lines.length - 5);\n if (visual.cursorLine < inputStart) inputStart = visual.cursorLine;\n else if (visual.cursorLine >= inputStart + 5) inputStart = visual.cursorLine - 4;\n const inputLines = visual.lines.slice(inputStart, inputStart + 5);\n const visibleCursorLine = visual.cursorLine - inputStart;\n const suggestionsDisabled = state.creatingTopic || state.overlay === \"vault\";\n const commands = suggestionsDisabled ? [] : commandSuggestions(state.input);\n const cap = Math.max(0, 6 - inputLines.length);\n let suggestionLines: ReturnType<typeof line>[];\n if (commands.length > 0) {\n suggestionLines = commands.slice(0, cap).map((command, index) =>\n line(\n ` ${index === state.suggestionIndex ? \"›\" : \" \"} ${command.usage} ${command.description}`,\n {\n fg: index === state.suggestionIndex ? theme.text : theme.muted,\n bg: index === state.suggestionIndex ? theme.selected : theme.surface,\n },\n ),\n );\n } else if (!suggestionsDisabled) {\n // `@`-path completion: suggestions drawn from the real filesystem.\n const cursor = state.inputCursor;\n const lineText = state.input.split(\"\\n\")[cursor.row] ?? \"\";\n const paths = pathSuggestions(lineText, cursor.col);\n const items = paths?.items ?? [];\n suggestionLines = items.slice(0, cap).map((item, index) =>\n line(` ${index === state.suggestionIndex ? \"›\" : \" \"} ${item.value.slice(1)}`, {\n fg: index === state.suggestionIndex ? theme.text : theme.muted,\n bg: index === state.suggestionIndex ? theme.selected : theme.surface,\n }),\n );\n const hidden = (paths?.truncated ?? 0) + Math.max(0, items.length - suggestionLines.length);\n if (hidden > 0 && suggestionLines.length < cap) {\n suggestionLines.push(line(` … +${hidden} more`, { fg: theme.muted, dim: true }));\n }\n } else {\n suggestionLines = [];\n }\n const content = [line(\"\"), ...inputLines, line(\"\"), ...suggestionLines].slice(0, 8);\n const input = content.map((item) =>\n paint(fit(item.text, width), {\n fg: item.fg ?? theme.text,\n bg: item.bg ?? theme.surfaceRaised,\n bold: item.bold,\n dim: item.dim,\n }),\n );\n const hint = paint(fit(` ${title}`, width), { fg: theme.muted, bg: theme.canvas });\n return {\n lines: state.creatingTopic ? [hint, ...input] : [...input, hint],\n cursor: {\n x: visual.cursorColumn,\n y: 2 + visibleCursorLine + (state.creatingTopic ? 1 : 0),\n },\n };\n}\n\nfunction footerLines(state: AppState, width: number): string[] {\n if (state.creatingTopic) {\n return [\n paint(joinSides(\" New topic\", \"○ naming \", width), {\n fg: theme.accent,\n bg: theme.surfaceRaised,\n bold: true,\n }),\n paint(joinSides(\"\", \"Esc cancel \", width), {\n fg: theme.muted,\n bg: theme.canvas,\n }),\n ];\n }\n const topic = activeTopic(state);\n const running = Boolean(topic && state.activity[topic.id]?.running);\n return [\n paint(\n joinSides(\n ` ${topic?.agent ?? \"-\"} · ${effectiveTopicModel(topic)} · ${effectiveTopicEffort(topic)}`,\n \"\",\n width,\n ),\n {\n fg: theme.accent,\n bg: theme.surfaceRaised,\n bold: true,\n },\n ),\n paint(\n joinSides(\n \"\",\n state.notice\n ? `! ${state.notice} `\n : state.overlay === \"topics\"\n ? state.topicPickerRoot\n ? \"Esc/Ctrl-C exit \"\n : \"Esc close · Ctrl-C exit; work continues \"\n : state.overlay === \"background-session\"\n ? \"Esc back · read-only \"\n : state.overlay === \"vault\"\n ? state.vaultMode === \"list\"\n ? state.vaultEntries.length > 0\n ? \"↑↓ select · Enter edit · N add · D delete · Esc close \"\n : \"N add · Esc close \"\n : state.vaultMode === \"confirm-delete\"\n ? \"Y delete · N cancel \"\n : \"Enter continue · Esc cancel \"\n : running\n ? \"Esc/Ctrl-C stop \"\n : \"Ctrl-C twice to quit \",\n width,\n ),\n {\n fg: state.notice ? theme.amber : theme.muted,\n bg: theme.canvas,\n },\n ),\n ];\n}\n\nfunction renderBody(lines: UiLine[], width: number, height: number): string[] {\n return Array.from({ length: height }, (_, index) => {\n const item = lines[index] ?? line(\"\");\n return paint(fit(item.text, width), {\n fg: item.fg ?? theme.text,\n bg: item.bg ?? theme.canvas,\n bold: item.bold,\n dim: item.dim,\n });\n });\n}\n\nexport function renderApp(\n state: AppState,\n columns: number,\n rows: number,\n animationFrame = 0,\n nowMs = terminalNowMs(),\n): string {\n return renderAppFrame(state, columns, rows, animationFrame, nowMs).frame;\n}\n\nexport function renderAppFrame(\n state: AppState,\n columns: number,\n rows: number,\n animationFrame = 0,\n nowMs = terminalNowMs(),\n): RenderedTerminalApp {\n const width = Math.max(32, columns);\n const height = Math.max(14, rows);\n const footer = footerLines(state, width);\n const decision = decisionPane(state, width);\n const hideComposer =\n state.overlay === \"background-session\" ||\n (state.overlay === \"vault\" &&\n (state.vaultMode === \"list\" || state.vaultMode === \"confirm-delete\"));\n const composer = hideComposer ? { lines: [], cursor: null } : composerPane(state, width);\n const bodyHeight = Math.max(3, height - footer.length - decision.length - composer.lines.length);\n const body = renderBody(\n conversationLines(state, width, bodyHeight, animationFrame, nowMs),\n width,\n bodyHeight,\n );\n const cursorY = composer.cursor\n ? body.length + decision.length + composer.cursor.y\n : Number.POSITIVE_INFINITY;\n return {\n frame: [...body, ...decision, ...composer.lines, ...footer].slice(0, height).join(\"\\n\"),\n cursor: composer.cursor && cursorY <= height ? { x: composer.cursor.x, y: cursorY } : null,\n };\n}\n\nexport function maxConversationScrollOffset(\n state: AppState,\n columns: number,\n rows: number,\n): number {\n if (state.overlay) return 0;\n const width = Math.max(32, columns);\n const height = Math.max(14, rows);\n const bodyHeight = Math.max(\n 3,\n height -\n footerLines(state, width).length -\n decisionPane(state, width).length -\n composerPane(state, width).lines.length,\n );\n const lineCount = conversationContentLines(state, width).length;\n return conversationViewport(lineCount, bodyHeight, state.scrollOffset).maxOffset;\n}\n",
11
- "const ESC = \"\\u001b[\";\n\nexport function placeTerminalCursor(cursor: { x: number; y: number }): string {\n const x = Math.max(1, Math.trunc(cursor.x));\n const y = Math.max(1, Math.trunc(cursor.y));\n return `${ESC}${y};${x}H${ESC}?25h`;\n}\n\n/**\n * Produces small ANSI patches instead of clearing and repainting the terminal.\n *\n * Apple Terminal lays every full-screen write out through AppKit/CoreText. A\n * fast stream of clear-and-repaint frames can therefore make the terminal\n * application itself unstable. Keeping the previous frame also avoids the\n * flicker that a full clear introduces in every terminal emulator.\n */\nexport class TerminalScreenRenderer {\n #previousLines: string[] = [];\n #invalidated = true;\n\n invalidate(): void {\n this.#invalidated = true;\n }\n\n reset(): void {\n this.#previousLines = [];\n this.#invalidated = true;\n }\n\n update(frame: string): string {\n const lines = frame.split(\"\\n\");\n const previous = this.#previousLines;\n const redrawAll = this.#invalidated;\n const rowCount = Math.max(lines.length, previous.length);\n let output = \"\";\n\n for (let index = 0; index < rowCount; index += 1) {\n const current = lines[index];\n if (!redrawAll && current === previous[index]) continue;\n\n // Move before erasing. This also cancels a pending auto-wrap after a\n // full-width line without relying on newline behavior.\n output += `${ESC}${index + 1};1H${ESC}2K${current ?? \"\"}`;\n }\n\n if (output) output += `${ESC}H`;\n this.#previousLines = lines;\n this.#invalidated = false;\n return output;\n }\n}\n",
12
- "import { displayWidth, stripAnsi } from \"@/render\";\n\nexport interface ScreenPoint {\n /** One-based terminal column. */\n x: number;\n /** One-based terminal row. */\n y: number;\n}\n\nexport interface ScreenSelection {\n anchor: ScreenPoint;\n focus: ScreenPoint;\n}\n\nfunction ordered(selection: ScreenSelection): [ScreenPoint, ScreenPoint] {\n const { anchor, focus } = selection;\n return anchor.y < focus.y || (anchor.y === focus.y && anchor.x <= focus.x)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nfunction columnSlice(value: string, from: number, to: number): string {\n let output = \"\";\n let column = 0;\n for (const character of stripAnsi(value)) {\n const width = displayWidth(character);\n const next = column + width;\n if (next > from && column < to) output += character;\n column = next;\n if (column >= to) break;\n }\n return output;\n}\n\n/** Extract the text covered by an inclusive, screen-coordinate drag. */\nexport function screenSelectionText(lines: string[], selection: ScreenSelection): string {\n const [start, end] = ordered(selection);\n const selected: string[] = [];\n for (let row = start.y; row <= end.y; row += 1) {\n const value = lines[row - 1] ?? \"\";\n const from = row === start.y ? Math.max(0, start.x - 1) : 0;\n const to = row === end.y ? Math.max(from, end.x) : Number.POSITIVE_INFINITY;\n selected.push(columnSlice(value, from, to).trimEnd());\n }\n return selected.join(\"\\n\").replace(/\\n+$/, \"\");\n}\n\n// biome-ignore lint/complexity/useRegexLiterals: avoids a control character in a regex literal.\nconst ANSI_PATTERN = new RegExp(\"\\\\u001b\\\\[[0-?]*[ -/]*[@-~]\", \"y\");\n\nfunction highlightRow(value: string, from: number, to: number): string {\n let output = \"\";\n let column = 0;\n let inverse = false;\n let index = 0;\n while (index < value.length) {\n ANSI_PATTERN.lastIndex = index;\n const ansi = ANSI_PATTERN.exec(value);\n if (ansi) {\n output += ansi[0];\n index += ansi[0].length;\n continue;\n }\n const codePoint = value.codePointAt(index);\n if (codePoint === undefined) break;\n const character = String.fromCodePoint(codePoint);\n const width = displayWidth(character);\n const selected = column + width > from && column < to;\n if (selected && !inverse) {\n output += \"\\u001b[7m\";\n inverse = true;\n } else if (!selected && inverse) {\n output += \"\\u001b[27m\";\n inverse = false;\n }\n output += character;\n column += width;\n index += character.length;\n }\n return inverse ? `${output}\\u001b[27m` : output;\n}\n\n/** Add inverse-video highlighting without changing the frame's plain text. */\nexport function highlightScreenSelection(frame: string, selection: ScreenSelection): string {\n const [start, end] = ordered(selection);\n return frame\n .split(\"\\n\")\n .map((line, index) => {\n const row = index + 1;\n if (row < start.y || row > end.y) return line;\n const from = row === start.y ? Math.max(0, start.x - 1) : 0;\n const to = row === end.y ? Math.max(from, end.x) : Number.POSITIVE_INFINITY;\n return highlightRow(line, from, to);\n })\n .join(\"\\n\");\n}\n",
13
- "export interface BufferCursor {\n row: number;\n col: number;\n}\n\nfunction codePoints(value: string): string[] {\n return Array.from(value);\n}\n\nfunction codePointLength(value: string): number {\n return codePoints(value).length;\n}\n\nfunction sliceCodePoints(value: string, start?: number, end?: number): string {\n return codePoints(value).slice(start, end).join(\"\");\n}\n\nfunction normalizeText(value: string): string {\n return value.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\");\n}\n\nfunction characterClass(character: string): string {\n if (/\\s/u.test(character)) return \"space\";\n if (!/[\\p{L}\\p{N}\\p{M}_]/u.test(character)) return \"punctuation\";\n if (/\\p{Script=Latin}/u.test(character)) return \"word:latin\";\n if (/\\p{Script=Hangul}/u.test(character)) return \"word:hangul\";\n if (/\\p{Script=Han}/u.test(character)) return \"word:han\";\n if (/\\p{Script=Hiragana}/u.test(character)) return \"word:hiragana\";\n if (/\\p{Script=Katakana}/u.test(character)) return \"word:katakana\";\n if (/\\p{Script=Cyrillic}/u.test(character)) return \"word:cyrillic\";\n if (/\\p{Script=Arabic}/u.test(character)) return \"word:arabic\";\n return \"word:other\";\n}\n\n/**\n * Logical multiline editor buffer. Rows and columns are Unicode code-point\n * positions rather than UTF-16 offsets, so Korean and emoji edit atomically.\n */\nexport class TextBuffer {\n #lines: string[] = [\"\"];\n #cursor: BufferCursor = { row: 0, col: 0 };\n #preferredCol: number | null = null;\n\n constructor(initialText = \"\") {\n this.setText(initialText);\n }\n\n get text(): string {\n return this.#lines.join(\"\\n\");\n }\n\n get lines(): readonly string[] {\n return this.#lines;\n }\n\n get cursor(): BufferCursor {\n return { ...this.#cursor };\n }\n\n get isAtStart(): boolean {\n return this.#cursor.row === 0 && this.#cursor.col === 0;\n }\n\n get isAtEnd(): boolean {\n const lastRow = this.#lines.length - 1;\n return (\n this.#cursor.row === lastRow && this.#cursor.col === codePointLength(this.#lines[lastRow])\n );\n }\n\n get isOnFirstLine(): boolean {\n return this.#cursor.row === 0;\n }\n\n get isOnLastLine(): boolean {\n return this.#cursor.row === this.#lines.length - 1;\n }\n\n setText(value: string, cursor: \"start\" | \"end\" | BufferCursor = \"end\"): void {\n this.#lines = normalizeText(value).split(\"\\n\");\n if (this.#lines.length === 0) this.#lines = [\"\"];\n if (cursor === \"start\") this.#cursor = { row: 0, col: 0 };\n else if (cursor === \"end\") {\n const row = this.#lines.length - 1;\n this.#cursor = { row, col: codePointLength(this.#lines[row]) };\n } else {\n this.#cursor = this.#clampCursor(cursor);\n }\n this.#preferredCol = null;\n }\n\n insert(value: string): void {\n if (!value) return;\n this.#replaceRange(this.#cursor, this.#cursor, normalizeText(value));\n }\n\n backspace(): boolean {\n if (this.isAtStart) return false;\n const end = this.cursor;\n const start = this.cursor;\n if (start.col > 0) start.col -= 1;\n else {\n start.row -= 1;\n start.col = codePointLength(this.#lines[start.row]);\n }\n this.#replaceRange(start, end, \"\");\n return true;\n }\n\n deleteForward(): boolean {\n if (this.isAtEnd) return false;\n const start = this.cursor;\n const end = this.cursor;\n const lineLength = codePointLength(this.#lines[end.row]);\n if (end.col < lineLength) end.col += 1;\n else {\n end.row += 1;\n end.col = 0;\n }\n this.#replaceRange(start, end, \"\");\n return true;\n }\n\n deleteWordLeft(): boolean {\n if (this.isAtStart) return false;\n const end = this.cursor;\n this.moveWordLeft();\n this.#replaceRange(this.cursor, end, \"\");\n return true;\n }\n\n clearBeforeCursor(): void {\n this.#replaceRange({ row: 0, col: 0 }, this.cursor, \"\");\n }\n\n clearAfterCursor(): void {\n const row = this.#lines.length - 1;\n this.#replaceRange(this.cursor, { row, col: codePointLength(this.#lines[row]) }, \"\");\n }\n\n moveLeft(): void {\n if (this.#cursor.col > 0) this.#cursor.col -= 1;\n else if (this.#cursor.row > 0) {\n this.#cursor.row -= 1;\n this.#cursor.col = codePointLength(this.#lines[this.#cursor.row]);\n }\n this.#preferredCol = null;\n }\n\n moveRight(): void {\n const lineLength = codePointLength(this.#lines[this.#cursor.row]);\n if (this.#cursor.col < lineLength) this.#cursor.col += 1;\n else if (this.#cursor.row < this.#lines.length - 1) {\n this.#cursor.row += 1;\n this.#cursor.col = 0;\n }\n this.#preferredCol = null;\n }\n\n moveUp(): void {\n if (this.#cursor.row === 0) return;\n const preferred = this.#preferredCol ?? this.#cursor.col;\n this.#preferredCol = preferred;\n this.#cursor.row -= 1;\n this.#cursor.col = Math.min(preferred, codePointLength(this.#lines[this.#cursor.row]));\n }\n\n moveDown(): void {\n if (this.#cursor.row >= this.#lines.length - 1) return;\n const preferred = this.#preferredCol ?? this.#cursor.col;\n this.#preferredCol = preferred;\n this.#cursor.row += 1;\n this.#cursor.col = Math.min(preferred, codePointLength(this.#lines[this.#cursor.row]));\n }\n\n moveHome(): void {\n this.#cursor.col = 0;\n this.#preferredCol = null;\n }\n\n moveEnd(): void {\n this.#cursor.col = codePointLength(this.#lines[this.#cursor.row]);\n this.#preferredCol = null;\n }\n\n moveWordLeft(): void {\n if (this.#cursor.col === 0) {\n if (this.#cursor.row === 0) return;\n this.#cursor.row -= 1;\n this.#cursor.col = codePointLength(this.#lines[this.#cursor.row]);\n }\n const characters = codePoints(this.#lines[this.#cursor.row]);\n let col = this.#cursor.col;\n while (col > 0 && characterClass(characters[col - 1]) === \"space\") col -= 1;\n if (col > 0) {\n const targetClass = characterClass(characters[col - 1]);\n while (col > 0 && characterClass(characters[col - 1]) === targetClass) col -= 1;\n }\n this.#cursor.col = col;\n this.#preferredCol = null;\n }\n\n moveWordRight(): void {\n const characters = codePoints(this.#lines[this.#cursor.row]);\n let col = this.#cursor.col;\n if (col >= characters.length) {\n if (this.#cursor.row >= this.#lines.length - 1) return;\n this.#cursor.row += 1;\n this.#cursor.col = 0;\n this.#preferredCol = null;\n return;\n }\n const targetClass = characterClass(characters[col]);\n while (col < characters.length && characterClass(characters[col]) === targetClass) col += 1;\n while (col < characters.length && characterClass(characters[col]) === \"space\") col += 1;\n this.#cursor.col = col;\n this.#preferredCol = null;\n }\n\n #clampCursor(cursor: BufferCursor): BufferCursor {\n const row = Math.max(0, Math.min(cursor.row, this.#lines.length - 1));\n return {\n row,\n col: Math.max(0, Math.min(cursor.col, codePointLength(this.#lines[row]))),\n };\n }\n\n #replaceRange(startInput: BufferCursor, endInput: BufferCursor, replacement: string): void {\n const start = this.#clampCursor(startInput);\n const end = this.#clampCursor(endInput);\n if (start.row > end.row || (start.row === end.row && start.col > end.col)) return;\n const prefix = sliceCodePoints(this.#lines[start.row], 0, start.col);\n const suffix = sliceCodePoints(this.#lines[end.row], end.col);\n const parts = normalizeText(replacement).split(\"\\n\");\n if (parts.length === 1) {\n this.#lines.splice(start.row, end.row - start.row + 1, `${prefix}${parts[0]}${suffix}`);\n this.#cursor = { row: start.row, col: start.col + codePointLength(parts[0]) };\n } else {\n const first = `${prefix}${parts[0]}`;\n const lastPart = parts.at(-1) ?? \"\";\n const last = `${lastPart}${suffix}`;\n this.#lines.splice(start.row, end.row - start.row + 1, first, ...parts.slice(1, -1), last);\n this.#cursor = {\n row: start.row + parts.length - 1,\n col: codePointLength(lastPart),\n };\n }\n this.#preferredCol = null;\n }\n}\n\n/** Shell-like history navigation with restoration of the unfinished draft. */\nexport class InputHistory {\n #entries: string[];\n #index: number;\n #draft = \"\";\n\n constructor(\n entries: readonly string[] = [],\n readonly maxEntries = 200,\n ) {\n this.#entries = entries.filter(Boolean).slice(-maxEntries);\n this.#index = this.#entries.length;\n }\n\n get entries(): readonly string[] {\n return this.#entries;\n }\n\n record(value: string): void {\n const text = value.trim();\n if (!text) return;\n if (this.#entries.at(-1) !== text) this.#entries.push(text);\n this.#entries = this.#entries.slice(-this.maxEntries);\n this.reset();\n }\n\n previous(currentDraft: string): string | null {\n if (this.#entries.length === 0 || this.#index === 0) return null;\n if (this.#index === this.#entries.length) this.#draft = currentDraft;\n this.#index -= 1;\n return this.#entries[this.#index] ?? null;\n }\n\n next(): string | null {\n if (this.#index >= this.#entries.length) return null;\n this.#index += 1;\n return this.#index === this.#entries.length ? this.#draft : (this.#entries[this.#index] ?? \"\");\n }\n\n reset(): void {\n this.#index = this.#entries.length;\n this.#draft = \"\";\n }\n}\n",
14
- "import {\n type AgentKind,\n EFFORT_VALUES,\n getRegistry,\n isVaultCommandLine,\n normalizeVaultKey,\n type RuntimeBusEvent,\n SELECTABLE_MODELS,\n type TopicDto,\n VAULT_DESCRIPTION_MAX_LENGTH,\n VAULT_VALUE_MAX_BYTES,\n VAULT_VALUE_MIN_BYTES,\n validateVaultKey,\n} from \"@negotium/core\";\nimport {\n INITIAL_MESSAGE_HISTORY_LIMIT,\n MESSAGE_HISTORY_PAGE_SIZE,\n type MessageHistoryPage,\n type NegotiumClient,\n} from \"@/client\";\nimport { copyToClipboard } from \"@/clipboard\";\nimport { terminalNowMs } from \"@/clock\";\nimport { commandSuggestions, completeCommand } from \"@/commands\";\nimport { completePathToken, type PathSuggestion, pathSuggestions } from \"@/path-suggest\";\nimport {\n maxConversationScrollOffset,\n plainTranscript,\n renderAppFrame,\n stripAnsi,\n WORKING_FRAME_INTERVAL_MS,\n} from \"@/render\";\nimport { placeTerminalCursor, TerminalScreenRenderer } from \"@/screen-renderer\";\nimport {\n highlightScreenSelection,\n type ScreenPoint,\n type ScreenSelection,\n screenSelectionText,\n} from \"@/selection\";\nimport {\n type AppState,\n activeMessages,\n activeQuestion,\n activeTopic,\n applyRuntimeEvent,\n createInitialState,\n focusCreatedTopic,\n moveTopicPickerSelection,\n openTopicPicker,\n pickedBackgroundSession,\n pickedTopic,\n selectTopic,\n setBackgroundSessions,\n setMessageHistoryStatus,\n setMessages,\n setTopics,\n startTopicCreation,\n upsertMessage,\n} from \"@/state\";\nimport { InputHistory, TextBuffer } from \"@/text-buffer\";\n\nexport const ENTER_ALT_SCREEN =\n \"\\u001b]11;#0a0b0f\\u0007\\u001b[?1049h\\u001b[48;2;10;11;15m\\u001b[2J\\u001b[H\\u001b[?25l\\u001b[?2004h\\u001b[?1002h\\u001b[?1006h\";\nconst EXIT_ALT_SCREEN =\n \"\\u001b[0m\\u001b[?1006l\\u001b[?1002l\\u001b[?2004l\\u001b[?25h\\u001b[?1049l\\u001b]111\\u0007\";\nconst NEW_TOPIC_KEYS = new Set([\"n\", \"ㅜ\"]);\nconst DELETE_TOPIC_KEYS = new Set([\"d\", \"ㅇ\", \"\\u007f\", \"\\b\", \"\\u001b[3~\"]);\nconst CONFIRM_KEYS = new Set([\"y\", \"ㅛ\"]);\nconst CANCEL_KEYS = new Set([\"n\", \"ㅜ\"]);\n// ai-status kinds that mutate the messages array (tool timeline entries) and\n// must therefore wait for an in-flight history load to finish, so they don't\n// get clobbered when the load's setMessages() replaces the messages array.\nconst MESSAGE_MUTATING_AI_STATUS_KINDS = new Set([\"tool_call\", \"tool_output\"]);\n// biome-ignore lint/complexity/useRegexLiterals: avoids a literal terminal control byte in source.\nconst SGR_MOUSE_PATTERN = new RegExp(\"\\\\u001b\\\\[<(\\\\d+);(\\\\d+);(\\\\d+)([mM])\", \"g\");\n\nfunction selectableEfforts(topic: TopicDto | null) {\n return topic?.agent ? getRegistry(topic.agent).validEfforts : EFFORT_VALUES;\n}\n\nexport function vaultFormBlocksOverlaySwitch(\n state: Pick<AppState, \"overlay\" | \"vaultMode\">,\n): boolean {\n return (\n state.overlay === \"vault\" && (state.vaultMode === \"value\" || state.vaultMode === \"description\")\n );\n}\n\nexport interface TerminalMouseEvent extends ScreenPoint {\n button: number;\n kind: \"press\" | \"drag\" | \"release\";\n}\n\nexport function runtimeEventWaitsForMessageLoad(event: RuntimeBusEvent): boolean {\n if (event.type === \"message\" || event.type === \"message-updated\") return true;\n if (event.type !== \"ai-status\") return false;\n const payload = event.payload as { kind?: unknown } | null;\n return typeof payload?.kind === \"string\" && MESSAGE_MUTATING_AI_STATUS_KINDS.has(payload.kind);\n}\n\nexport function animationFrameAt(nowMs = terminalNowMs()): number {\n return Math.floor(nowMs / WORKING_FRAME_INTERVAL_MS);\n}\n\nexport function consumeMouseInput(raw: string): {\n input: string;\n scrollDelta: number;\n events: TerminalMouseEvent[];\n} {\n let scrollDelta = 0;\n const events: TerminalMouseEvent[] = [];\n const input = raw.replace(\n SGR_MOUSE_PATTERN,\n (_sequence, rawButton: string, rawX: string, rawY: string, suffix: string) => {\n const button = Number.parseInt(rawButton, 10);\n if (Number.isFinite(button) && (button & 64) !== 0) {\n scrollDelta += (button & 1) === 0 ? 3 : -3;\n } else {\n const x = Number.parseInt(rawX, 10);\n const y = Number.parseInt(rawY, 10);\n if (Number.isFinite(button) && Number.isFinite(x) && Number.isFinite(y)) {\n events.push({\n button,\n x,\n y,\n kind: suffix === \"m\" ? \"release\" : (button & 32) !== 0 ? \"drag\" : \"press\",\n });\n }\n }\n return \"\";\n },\n );\n return { input, scrollDelta, events };\n}\n\nexport interface TerminalAppOptions {\n userId: string;\n preferredTopic?: string;\n defaultAgent?: AgentKind;\n}\n\nexport function escapeStopsActiveTurn(state: AppState): boolean {\n if (state.overlay || state.creatingTopic) return false;\n const topic = activeTopic(state);\n return Boolean(topic && state.activity[topic.id]?.running);\n}\n\nexport function ctrlCExitsTopicPicker(state: AppState): boolean {\n return state.overlay === \"topics\";\n}\n\nexport class TerminalApp {\n readonly #client: NegotiumClient;\n readonly #options: TerminalAppOptions;\n #state: AppState;\n readonly #input = new TextBuffer();\n readonly #screen = new TerminalScreenRenderer();\n #history = new InputHistory();\n #vaultDraftValue = \"\";\n #pasting = false;\n #renderQueued = false;\n #renderTimer: ReturnType<typeof setTimeout> | undefined;\n #animationTimer: ReturnType<typeof setInterval> | undefined;\n #backgroundRefreshTimer: ReturnType<typeof setInterval> | undefined;\n #backgroundRefreshRunning = false;\n #animationFrame = animationFrameAt();\n #topicsRefreshGeneration = 0;\n readonly #messageLoadGeneration = new Map<string, number>();\n readonly #messageHistory = new Map<\n string,\n { cursor?: string; hasMore: boolean; loading: boolean }\n >();\n readonly #queuedRuntimeEvents = new Map<string, RuntimeBusEvent[]>();\n #selection: ScreenSelection | null = null;\n #plainFrameLines: string[] = [];\n #lastInterruptAt = 0;\n #running = false;\n #stopRequested = false;\n #finishRun: (() => void) | null = null;\n #onData = (chunk: Buffer | string) => this.#handleInput(String(chunk));\n #onResize = () => {\n this.#selection = null;\n this.#screen.invalidate();\n this.#queueRender();\n };\n #onSignal = () => this.#requestExit();\n\n constructor(client: NegotiumClient, options: TerminalAppOptions) {\n this.#client = client;\n this.#options = options;\n this.#state = createInitialState(options.userId);\n }\n\n async run(): Promise<void> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\"terminal-adapter requires an interactive TTY\");\n }\n let clientStartAttempted = false;\n let uiActive = false;\n try {\n clientStartAttempted = true;\n await this.#client.start((event) => this.#handleRuntimeEvent(event));\n this.#history = new InputHistory(this.#client.listInputHistory?.() ?? []);\n if (this.#stopRequested) return;\n await this.#refreshTopics(this.#options.preferredTopic ?? \"General\");\n await this.#refreshBackgroundSessions();\n if (this.#options.preferredTopic) {\n const preferred = this.#state.topics.find(\n (topic) => topic.title.toLowerCase() === this.#options.preferredTopic?.toLowerCase(),\n );\n if (!preferred) {\n const created = await this.#client.createTopic(\n this.#options.preferredTopic,\n this.#options.defaultAgent,\n );\n this.#state = focusCreatedTopic(this.#state, created);\n await this.#refreshTopics(created.title);\n this.#state = selectTopic(this.#state, created.id);\n }\n }\n if (!this.#options.preferredTopic) {\n this.#state = openTopicPicker(this.#state, this.#state.notice, true);\n } else {\n await this.#loadActiveMessages();\n }\n this.#running = true;\n\n process.stdout.write(ENTER_ALT_SCREEN);\n uiActive = true;\n process.stdin.setEncoding(\"utf8\");\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", this.#onData);\n process.stdout.on(\"resize\", this.#onResize);\n process.once(\"SIGINT\", this.#onSignal);\n process.once(\"SIGTERM\", this.#onSignal);\n this.#render();\n this.#animationTimer = setInterval(() => {\n const activeRunning = Boolean(\n this.#state.activeTopicId && this.#state.activity[this.#state.activeTopicId]?.running,\n );\n const pickerRunning =\n this.#state.overlay === \"topics\" &&\n this.#state.topics.some((topic) => this.#state.activity[topic.id]?.running);\n if (!activeRunning && !pickerRunning && this.#state.backgroundSessions.length === 0) return;\n // Derive the frame from elapsed time so a delayed timer callback does\n // not make the larger topic-picker render appear to spin slowly.\n this.#animationFrame = animationFrameAt();\n this.#queueRender();\n }, WORKING_FRAME_INTERVAL_MS);\n // Keep this timer referenced. Bun heavily throttles an unref'ed timer\n // while the TUI is otherwise waiting on stdin, which makes the spinner\n // advance in regular bursts instead of at the requested frame rate.\n this.#backgroundRefreshTimer = setInterval(() => {\n void this.#refreshBackgroundSessions();\n }, 1_000);\n this.#backgroundRefreshTimer.unref?.();\n\n await new Promise<void>((resolve) => {\n this.#finishRun = resolve;\n });\n } finally {\n this.#running = false;\n await this.#cleanup(clientStartAttempted, uiActive);\n }\n }\n\n /** Request a graceful, idempotent shutdown from an embedding host. */\n stop(): void {\n this.#stopRequested = true;\n this.#requestExit();\n }\n\n #handleRuntimeEvent(event: RuntimeBusEvent): void {\n this.#selection = null;\n // Only message-order-sensitive events wait for the in-flight history load to\n // finish; ai-status (running/done) is safe to apply immediately so the\n // \"is it running\" indicator never lags behind a topic switch's network round-trip.\n if (this.#messageLoadGeneration.has(event.topicId) && runtimeEventWaitsForMessageLoad(event)) {\n const queued = this.#queuedRuntimeEvents.get(event.topicId) ?? [];\n queued.push(event);\n this.#queuedRuntimeEvents.set(event.topicId, queued);\n return;\n }\n this.#state = applyRuntimeEvent(this.#state, event);\n if (\n event.type === \"topic-created\" ||\n event.type === \"topic-updated\" ||\n event.type === \"topic-deleted\"\n ) {\n const previous = this.#state.activeTopicId;\n void this.#refreshTopicsAfterEvent(previous);\n }\n this.#queueRender();\n }\n\n async #refreshTopicsAfterEvent(previous: string | null): Promise<void> {\n try {\n await this.#refreshTopics();\n if (this.#state.activeTopicId && this.#state.activeTopicId !== previous) {\n await this.#loadActiveMessages();\n }\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: `Node connection error: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n this.#queueRender();\n }\n\n async #refreshTopics(preferredTitle?: string): Promise<void> {\n const generation = ++this.#topicsRefreshGeneration;\n const topics = await this.#client.listTopics();\n if (generation !== this.#topicsRefreshGeneration) return;\n this.#state = setTopics(this.#state, topics, preferredTitle);\n }\n\n async #refreshBackgroundSessions(): Promise<void> {\n if (!this.#client.listBackgroundSessions || this.#backgroundRefreshRunning) return;\n this.#backgroundRefreshRunning = true;\n try {\n const sessions = await this.#client.listBackgroundSessions();\n const before = JSON.stringify(this.#state.backgroundSessions);\n this.#state = setBackgroundSessions(this.#state, sessions);\n if (JSON.stringify(this.#state.backgroundSessions) !== before) this.#queueRender();\n } catch {\n // Topic conversations remain usable while the optional operational view reconnects.\n } finally {\n this.#backgroundRefreshRunning = false;\n }\n }\n\n async #loadActiveMessages(): Promise<void> {\n const topic = activeTopic(this.#state);\n if (!topic) return;\n const generation = (this.#messageLoadGeneration.get(topic.id) ?? 0) + 1;\n this.#messageLoadGeneration.set(topic.id, generation);\n let messagePage: MessageHistoryPage;\n let recentEvents: RuntimeBusEvent[];\n try {\n const messageRequest: Promise<MessageHistoryPage> = this.#client.listMessagePage\n ? Promise.resolve(\n this.#client.listMessagePage(topic.id, undefined, INITIAL_MESSAGE_HISTORY_LIMIT),\n )\n : Promise.resolve(this.#client.listMessages(topic.id)).then((messages) => ({\n messages,\n hasMore: false,\n }));\n [messagePage, recentEvents] = await Promise.all([\n messageRequest,\n this.#client.listRecentEvents?.(topic.id) ?? [],\n ]);\n } catch (error) {\n if (this.#messageLoadGeneration.get(topic.id) === generation) {\n this.#messageLoadGeneration.delete(topic.id);\n const queued = this.#queuedRuntimeEvents.get(topic.id) ?? [];\n this.#queuedRuntimeEvents.delete(topic.id);\n for (const event of queued) this.#state = applyRuntimeEvent(this.#state, event);\n }\n throw error;\n }\n if (this.#messageLoadGeneration.get(topic.id) !== generation) return;\n this.#state = setMessages(this.#state, topic.id, messagePage.messages);\n this.#messageHistory.set(topic.id, {\n cursor: messagePage.cursor,\n hasMore: messagePage.hasMore,\n loading: false,\n });\n this.#state = setMessageHistoryStatus(this.#state, topic.id, {\n hasMore: messagePage.hasMore,\n loading: false,\n });\n for (const event of recentEvents) {\n this.#state = applyRuntimeEvent(this.#state, event);\n }\n this.#messageLoadGeneration.delete(topic.id);\n const queued = this.#queuedRuntimeEvents.get(topic.id) ?? [];\n this.#queuedRuntimeEvents.delete(topic.id);\n for (const event of queued) this.#state = applyRuntimeEvent(this.#state, event);\n }\n\n async #loadOlderMessages(topicId: string, targetOffset: number): Promise<void> {\n const history = this.#messageHistory.get(topicId);\n if (!this.#client.listMessagePage || !history?.hasMore || history.loading) return;\n const cursor = history.cursor;\n if (!cursor) return;\n this.#messageHistory.set(topicId, { ...history, loading: true });\n this.#state = setMessageHistoryStatus(this.#state, topicId, {\n hasMore: history.hasMore,\n loading: true,\n });\n this.#queueRender();\n\n try {\n const page = await this.#client.listMessagePage(topicId, cursor, MESSAGE_HISTORY_PAGE_SIZE);\n const latestHistory = this.#messageHistory.get(topicId);\n if (!latestHistory || latestHistory.cursor !== cursor) return;\n\n const current = this.#state.messages[topicId] ?? [];\n const currentIds = new Set(current.map((message) => message.id));\n const older = page.messages.filter((message) => !currentIds.has(message.id));\n this.#state = setMessages(this.#state, topicId, [...older, ...current]);\n this.#messageHistory.set(topicId, {\n cursor: page.cursor,\n hasMore: page.hasMore,\n loading: false,\n });\n this.#state = setMessageHistoryStatus(this.#state, topicId, {\n hasMore: page.hasMore,\n loading: false,\n });\n if (this.#state.activeTopicId === topicId) {\n const maxOffset = maxConversationScrollOffset(\n this.#state,\n process.stdout.columns ?? 100,\n process.stdout.rows ?? 30,\n );\n this.#state = {\n ...this.#state,\n scrollOffset: Math.min(maxOffset, Math.max(0, targetOffset)),\n notice:\n older.length === 0 || !page.hasMore\n ? \"Start of conversation\"\n : `Loaded ${older.length} older messages`,\n };\n }\n } catch (error) {\n const latestHistory = this.#messageHistory.get(topicId);\n if (latestHistory?.cursor === cursor) {\n this.#messageHistory.set(topicId, { ...latestHistory, loading: false });\n this.#state = setMessageHistoryStatus(this.#state, topicId, {\n hasMore: latestHistory.hasMore,\n loading: false,\n });\n }\n this.#state = {\n ...this.#state,\n notice: `History load failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n this.#queueRender();\n }\n\n #queueRender(): void {\n if (!this.#running || this.#renderQueued) return;\n this.#renderQueued = true;\n this.#renderTimer = setTimeout(() => {\n this.#renderTimer = undefined;\n this.#renderQueued = false;\n if (this.#running) this.#render();\n }, 16);\n }\n\n #render(): void {\n const columns = process.stdout.columns ?? 100;\n const rows = process.stdout.rows ?? 30;\n const rendered = renderAppFrame(this.#state, columns, rows, this.#animationFrame);\n const baseFrame = rendered.frame;\n this.#plainFrameLines = stripAnsi(baseFrame).split(\"\\n\");\n const frame = this.#selection\n ? highlightScreenSelection(baseFrame, this.#selection)\n : baseFrame;\n const patch = this.#screen.update(frame);\n // Terminal emulators anchor IME preedit text to the hardware cursor.\n const cursor = rendered.cursor ? placeTerminalCursor(rendered.cursor) : \"\";\n if (patch || cursor) process.stdout.write(`${patch}${cursor}`);\n }\n\n #syncInput(): void {\n const count = this.#suggestionCount();\n this.#state = {\n ...this.#state,\n input: this.#input.text,\n inputCursor: this.#input.cursor,\n suggestionIndex: count === 0 ? 0 : Math.min(this.#state.suggestionIndex, count - 1),\n };\n }\n\n #replaceInput(value: string): void {\n this.#input.setText(value);\n this.#syncInput();\n this.#queueRender();\n }\n\n #handleInput(raw: string): void {\n if (!this.#running) return;\n const mouse = consumeMouseInput(raw);\n if (mouse.scrollDelta !== 0) {\n this.#selection = null;\n this.#scroll(mouse.scrollDelta);\n }\n for (const event of mouse.events) this.#handleMouseSelection(event);\n let chunk = mouse.input;\n if (!chunk) return;\n this.#selection = null;\n const pasteStart = \"\\u001b[200~\";\n const pasteEnd = \"\\u001b[201~\";\n if (this.#pasting) {\n const end = chunk.indexOf(pasteEnd);\n if (end < 0) {\n this.#input.insert(chunk);\n this.#syncInput();\n this.#queueRender();\n return;\n }\n this.#input.insert(chunk.slice(0, end));\n this.#pasting = false;\n chunk = chunk.slice(end + pasteEnd.length);\n this.#syncInput();\n if (!chunk) {\n this.#queueRender();\n return;\n }\n }\n const start = chunk.indexOf(pasteStart);\n if (start >= 0) {\n const before = chunk.slice(0, start);\n if (before) this.#handleInput(before);\n this.#pasting = true;\n this.#handleInput(chunk.slice(start + pasteStart.length));\n return;\n }\n if (chunk === \"\\u0003\") {\n this.#handleInterrupt(); // Ctrl-C\n return;\n }\n if (this.#state.overlay === \"topics\" && this.#state.topicPickerRoot) {\n this.#lastInterruptAt = 0;\n this.#handleTopicPickerInput(chunk);\n return;\n }\n this.#lastInterruptAt = 0;\n const editingVaultSecret = vaultFormBlocksOverlaySwitch(this.#state);\n if (chunk === \"\\u0018\") {\n void this.#abort(); // Ctrl-X\n return;\n }\n if (chunk === \"\\u0010\") {\n this.#cycleTopic(-1); // Ctrl-P\n return;\n }\n if (chunk === \"\\u000e\") {\n this.#cycleTopic(1); // Ctrl-N\n return;\n }\n if (chunk === \"\\u000f\") {\n // Switching overlays would render the composer as ordinary plaintext.\n // Keep secret/description entry inside the masking Vault overlay.\n if (editingVaultSecret) return;\n this.#toggleTopics();\n return;\n }\n if (chunk === \"\\u0014\") {\n if (editingVaultSecret) return;\n this.#state = {\n ...this.#state,\n overlay: this.#state.overlay === \"transcript\" ? null : \"transcript\",\n };\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u0019\") {\n void this.#copy(false); // Ctrl-Y\n return;\n }\n if (chunk === \"\\u0005\") {\n this.#loadOlderHistory(); // Ctrl-E\n return;\n }\n if (chunk === \"\\u000c\") {\n this.#screen.invalidate();\n this.#render(); // Ctrl-L\n return;\n }\n if (chunk === \"\\u0001\" || chunk === \"\\u001b[H\" || chunk === \"\\u001b[1~\") {\n this.#input.moveHome();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001b[F\" || chunk === \"\\u001b[4~\") {\n this.#input.moveEnd();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001b[D\" || chunk === \"\\u0002\") {\n this.#input.moveLeft();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001b[C\" || chunk === \"\\u0006\") {\n this.#input.moveRight();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001bb\" || chunk === \"\\u001b[1;5D\") {\n this.#input.moveWordLeft();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001bf\" || chunk === \"\\u001b[1;5C\") {\n this.#input.moveWordRight();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001b[3~\") {\n this.#input.deleteForward();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u0017\") {\n this.#input.deleteWordLeft(); // Ctrl-W\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u0015\") {\n this.#input.clearBeforeCursor(); // Ctrl-U\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u000b\") {\n this.#input.clearAfterCursor(); // Ctrl-K\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001b[5~\") {\n this.#scroll(8); // PageUp\n return;\n }\n if (chunk === \"\\u001b[6~\") {\n this.#scroll(-8); // PageDown\n return;\n }\n if (this.#state.overlay === \"confirm-delete\") {\n const key = chunk.toLowerCase();\n if (CONFIRM_KEYS.has(key)) void this.#confirmTopicDelete();\n else if (CANCEL_KEYS.has(key) || chunk === \"\\u001b\") {\n const cancelled = { ...this.#state, overlay: null, pendingDeleteTopicId: undefined };\n this.#state = this.#state.topicPickerRoot\n ? openTopicPicker(cancelled, undefined, true)\n : cancelled;\n this.#queueRender();\n }\n return;\n }\n if (this.#state.overlay === \"background-session\") {\n if (chunk === \"\\u001b\") {\n this.#state = { ...this.#state, overlay: \"topics\" };\n this.#queueRender();\n }\n return;\n }\n if (this.#state.overlay === \"topics\") {\n this.#handleTopicPickerInput(chunk);\n return;\n }\n if (this.#state.overlay === \"models\") {\n if (chunk === \"\\u001b[A\") this.#moveModelPicker(-1);\n else if (chunk === \"\\u001b[B\") this.#moveModelPicker(1);\n else if (chunk === \"\\r\") void this.#selectPickedModel();\n else if (chunk === \"\\u001b\") {\n this.#state = { ...this.#state, overlay: null };\n this.#queueRender();\n }\n return;\n }\n if (this.#state.overlay === \"effort\") {\n if (chunk === \"\\u001b[A\") this.#moveEffortPicker(-1);\n else if (chunk === \"\\u001b[B\") this.#moveEffortPicker(1);\n else if (chunk === \"\\r\") void this.#selectPickedEffort();\n else if (chunk === \"\\u001b\") {\n this.#state = { ...this.#state, overlay: null };\n this.#queueRender();\n }\n return;\n }\n if (this.#state.overlay === \"vault\") {\n if (this.#state.vaultMode === \"list\" || this.#state.vaultMode === \"confirm-delete\") {\n this.#handleVaultListInput(chunk);\n return;\n }\n if (chunk === \"\\u001b\") {\n this.#cancelVaultForm();\n return;\n }\n }\n if (chunk === \"\\u001b[A\") {\n if (activeQuestion(this.#state)) this.#moveAskChoice(-1);\n else if (this.#suggestionCount() > 0) this.#moveSuggestion(-1);\n else if (this.#input.isOnFirstLine) {\n const previous = this.#history.previous(this.#input.text);\n if (previous !== null) this.#replaceInput(previous);\n } else {\n this.#input.moveUp();\n this.#syncInput();\n this.#queueRender();\n }\n return;\n }\n if (chunk === \"\\u001b[B\") {\n if (activeQuestion(this.#state)) this.#moveAskChoice(1);\n else if (this.#suggestionCount() > 0) this.#moveSuggestion(1);\n else if (this.#input.isOnLastLine) {\n const next = this.#history.next();\n if (next !== null) this.#replaceInput(next);\n } else {\n this.#input.moveDown();\n this.#syncInput();\n this.#queueRender();\n }\n return;\n }\n if (chunk === \"\\t\" || chunk === \"\\u001b[Z\") {\n const completed = completeCommand(this.#input.text, this.#state.suggestionIndex);\n if (completed !== null) this.#replaceInput(completed);\n else this.#applyPathCompletion(true);\n return;\n }\n if (chunk === \"\\r\") {\n if (\n this.#state.overlay !== \"vault\" &&\n !activeQuestion(this.#state) &&\n commandSuggestions(this.#input.text).length === 0 &&\n this.#pathItems().length > 0\n ) {\n this.#applyPathCompletion(false);\n return;\n }\n void this.#submit();\n return;\n }\n if (chunk === \"\\u001b\\r\" || chunk === \"\\u001b\\n\") {\n this.#input.insert(\"\\n\");\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u007f\" || chunk === \"\\b\") {\n this.#input.backspace();\n this.#syncInput();\n this.#queueRender();\n return;\n }\n if (chunk === \"\\u001b\") {\n if (escapeStopsActiveTurn(this.#state)) {\n void this.#abort();\n return;\n }\n this.#input.setText(\"\");\n this.#history.reset();\n this.#syncInput();\n const cancelled = { ...this.#state, overlay: null, creatingTopic: false };\n this.#state = this.#state.topicPickerRoot\n ? openTopicPicker(cancelled, undefined, true)\n : cancelled;\n this.#queueRender();\n return;\n }\n if (chunk.startsWith(\"\\u001b\")) return;\n\n const printable = [...chunk.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").replaceAll(\"\\t\", \" \")]\n .filter((character) => {\n const code = character.charCodeAt(0);\n return code > 0x1f && code !== 0x7f;\n })\n .join(\"\");\n if (printable) {\n this.#input.insert(printable);\n this.#syncInput();\n this.#queueRender();\n }\n }\n\n async #submit(): Promise<void> {\n if (\n this.#state.overlay === \"vault\" &&\n this.#state.vaultMode !== \"list\" &&\n this.#state.vaultMode !== \"confirm-delete\"\n ) {\n await this.#submitVaultField();\n return;\n }\n const ask = activeQuestion(this.#state);\n if (ask?.askUserQuestion?.choices.length) {\n const index = Math.min(this.#state.askChoiceIndex, ask.askUserQuestion.choices.length - 1);\n const choice = ask.askUserQuestion.choices[index];\n const result = await this.#client.answerQuestion(ask.topicId, ask.id, choice.label);\n this.#state = {\n ...this.#state,\n askChoiceIndex: 0,\n notice: result.ok ? undefined : result.error,\n };\n this.#queueRender();\n return;\n }\n\n const text = this.#input.text.trim();\n if (!text) return;\n if (this.#state.creatingTopic) {\n this.#input.setText(\"\");\n this.#syncInput();\n this.#state = { ...this.#state, creatingTopic: false, notice: undefined };\n await this.#createTopic(text);\n return;\n }\n // Vault commands may contain plaintext credentials. Never persist them in\n // the terminal input history, including malformed commands that show help.\n if (!isVaultCommandLine(text)) {\n this.#history.record(text);\n this.#client.appendInputHistory?.(text);\n }\n this.#input.setText(\"\");\n this.#syncInput();\n this.#state = {\n ...this.#state,\n overlay: null,\n notice: undefined,\n };\n if (text.startsWith(\"/\")) {\n await this.#runCommand(text);\n return;\n }\n const topic = activeTopic(this.#state);\n if (!topic) {\n this.#state = { ...this.#state, notice: \"No topic selected\" };\n this.#queueRender();\n return;\n }\n const optimisticQueryId = `terminal-pending-${Date.now()}`;\n this.#state = applyRuntimeEvent(\n { ...this.#state, scrollOffset: 0 },\n {\n type: \"ai-status\",\n topicId: topic.id,\n payload: { kind: \"ai_active\", queryId: optimisticQueryId },\n },\n );\n this.#queueRender();\n try {\n const message = await this.#client.sendMessage(topic, text);\n this.#state = upsertMessage(this.#state, message);\n } catch (error) {\n if (this.#state.activity[topic.id]?.queryId === optimisticQueryId) {\n this.#state = applyRuntimeEvent(this.#state, {\n type: \"ai-status\",\n topicId: topic.id,\n payload: {\n kind: \"ai_error\",\n queryId: optimisticQueryId,\n error: \"Message could not be sent\",\n },\n });\n }\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n }\n\n async #runCommand(commandLine: string): Promise<void> {\n if (isVaultCommandLine(commandLine)) {\n if (commandLine.trim().toLowerCase() !== \"/vault\") {\n this.#state = { ...this.#state, notice: \"Use /vault to open the Vault manager.\" };\n this.#queueRender();\n return;\n }\n await this.#openVault();\n return;\n }\n const [command = \"\", ...args] = commandLine.slice(1).trim().split(/\\s+/);\n if (command === \"quit\" || command === \"exit\") {\n this.#requestExit();\n return;\n }\n if (command === \"abort\") {\n await this.#abort();\n return;\n }\n if (command === \"help\") {\n this.#state = { ...this.#state, overlay: \"help\" };\n this.#queueRender();\n return;\n }\n if (command === \"status\") {\n this.#state = { ...this.#state, overlay: \"status\" };\n this.#queueRender();\n return;\n }\n if (command === \"model\") {\n if (args.length > 0) {\n this.#state = { ...this.#state, notice: \"Usage: /model\" };\n this.#queueRender();\n return;\n }\n const topic = activeTopic(this.#state);\n if (!topic) {\n this.#state = { ...this.#state, notice: \"No topic selected\" };\n this.#queueRender();\n return;\n }\n const currentModel = topic.effectiveModel ?? topic.defaultModel;\n const currentIndex = SELECTABLE_MODELS.findIndex(\n (candidate) => candidate.model === currentModel,\n );\n this.#state = {\n ...this.#state,\n overlay: \"models\",\n modelPickerIndex: Math.max(0, currentIndex),\n };\n this.#queueRender();\n return;\n }\n if (command === \"effort\") {\n if (args.length > 0) {\n this.#state = { ...this.#state, notice: \"Usage: /effort\" };\n this.#queueRender();\n return;\n }\n const topic = activeTopic(this.#state);\n if (!topic) {\n this.#state = { ...this.#state, notice: \"No topic selected\" };\n this.#queueRender();\n return;\n }\n const currentEffort = topic.effectiveEffort ?? topic.defaultEffort;\n const currentIndex = selectableEfforts(topic).indexOf(currentEffort);\n this.#state = {\n ...this.#state,\n overlay: \"effort\",\n effortPickerIndex: Math.max(0, currentIndex),\n };\n this.#queueRender();\n return;\n }\n if (command === \"compact\") {\n const topic = activeTopic(this.#state);\n if (!topic) {\n this.#state = { ...this.#state, notice: \"No topic selected\" };\n this.#queueRender();\n return;\n }\n const queryId = `terminal-compact-${Date.now()}`;\n this.#state = applyRuntimeEvent(\n { ...this.#state, notice: \"Compacting context…\" },\n {\n type: \"ai-status\",\n topicId: topic.id,\n payload: { kind: \"ai_active\", queryId },\n },\n );\n this.#queueRender();\n try {\n const notice = await this.#client.compactTopic(topic);\n this.#state = applyRuntimeEvent(\n { ...this.#state, notice },\n {\n type: \"ai-status\",\n topicId: topic.id,\n payload: { kind: \"ai_done\", queryId },\n },\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.#state = applyRuntimeEvent(\n { ...this.#state, notice: message },\n {\n type: \"ai-status\",\n topicId: topic.id,\n payload: { kind: \"ai_error\", queryId, error: message },\n },\n );\n }\n this.#queueRender();\n return;\n }\n if (command === \"topics\") {\n this.#toggleTopics(true);\n return;\n }\n if (command === \"new\") {\n if (args.length > 0) {\n this.#state = { ...this.#state, notice: \"Usage: /new\" };\n this.#queueRender();\n return;\n }\n const topic = activeTopic(this.#state);\n if (!topic) {\n this.#state = { ...this.#state, notice: \"No topic selected\" };\n this.#queueRender();\n return;\n }\n try {\n const notice = await this.#client.resetTopic(topic);\n this.#state = { ...this.#state, notice };\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n return;\n }\n if (command === \"fork\" || command === \"spawn\") {\n const topic = activeTopic(this.#state);\n if (!topic) {\n this.#state = { ...this.#state, notice: \"No topic selected\" };\n this.#queueRender();\n return;\n }\n await this.#deriveTopic(topic, command === \"fork\", args.join(\" \") || undefined);\n return;\n }\n if (command === \"del\") {\n if (args.length > 0) {\n this.#state = { ...this.#state, notice: \"Usage: /del\" };\n this.#queueRender();\n return;\n }\n const topic = activeTopic(this.#state);\n if (!topic) {\n this.#state = { ...this.#state, notice: \"No topic selected\" };\n this.#queueRender();\n return;\n }\n this.#requestTopicDelete(topic);\n return;\n }\n if (command === \"copy\") {\n void this.#copy(args[0]?.toLowerCase() === \"all\");\n return;\n }\n this.#state = { ...this.#state, notice: `Unknown command: /${command}` };\n this.#queueRender();\n }\n\n async #activateTopic(topicId: string): Promise<void> {\n this.#state = selectTopic(this.#state, topicId);\n // Paint the switch (title, spinner from already-known state.activity, etc.)\n // immediately instead of waiting on the message-history network round-trip.\n this.#queueRender();\n try {\n await this.#loadActiveMessages();\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n }\n\n #cycleTopic(delta: number): void {\n if (this.#state.topics.length === 0) return;\n const index = this.#state.topics.findIndex((topic) => topic.id === this.#state.activeTopicId);\n const next =\n (Math.max(0, index) + delta + this.#state.topics.length) % this.#state.topics.length;\n void this.#activateTopic(this.#state.topics[next].id);\n }\n\n #toggleTopics(forceOpen = false): void {\n this.#state =\n forceOpen || this.#state.overlay !== \"topics\"\n ? openTopicPicker(this.#state)\n : { ...this.#state, overlay: null };\n this.#queueRender();\n }\n\n #handleTopicPickerInput(chunk: string): void {\n const key = chunk.toLowerCase();\n if (chunk === \"\\u001b[A\") this.#moveTopicPicker(-1);\n else if (chunk === \"\\u001b[B\") this.#moveTopicPicker(1);\n else if (chunk === \"\\r\") this.#selectPickedTopic();\n else if (NEW_TOPIC_KEYS.has(key)) {\n this.#openNewTopicComposer();\n } else if (DELETE_TOPIC_KEYS.has(key)) {\n const topic = pickedTopic(this.#state);\n if (topic) this.#requestTopicDelete(topic);\n else {\n this.#state = { ...this.#state, notice: \"Background sessions are read-only\" };\n this.#queueRender();\n }\n } else if (chunk === \"\\u001b\") {\n if (this.#state.topicPickerRoot) this.#requestExit();\n else {\n this.#state = { ...this.#state, overlay: null };\n this.#queueRender();\n }\n }\n }\n\n #openNewTopicComposer(): void {\n this.#state = startTopicCreation(this.#state);\n this.#replaceInput(\"\");\n }\n\n async #createTopic(title: string): Promise<void> {\n const topicPickerRoot = this.#state.topicPickerRoot;\n try {\n const created = await this.#client.createTopic(title, this.#options.defaultAgent);\n this.#state = focusCreatedTopic(this.#state, created);\n await this.#refreshTopics(created.title);\n this.#state = selectTopic(this.#state, created.id);\n await this.#loadActiveMessages();\n this.#state = { ...this.#state, notice: `Created ${created.title}` };\n } catch (error) {\n const failed = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n this.#state = topicPickerRoot ? openTopicPicker(failed, failed.notice, true) : failed;\n }\n this.#queueRender();\n }\n\n async #deriveTopic(topic: TopicDto, copyHistory: boolean, name?: string): Promise<void> {\n try {\n const derived = await this.#client.deriveTopic(topic, copyHistory, name);\n this.#state = focusCreatedTopic(this.#state, derived);\n await this.#refreshTopics(derived.title);\n this.#state = selectTopic(this.#state, derived.id);\n await this.#loadActiveMessages();\n this.#state = {\n ...this.#state,\n notice: copyHistory ? `forked into \"${derived.title}\"` : `spawned \"${derived.title}\"`,\n };\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n }\n\n #moveTopicPicker(delta: number): void {\n this.#state = moveTopicPickerSelection(this.#state, delta);\n this.#queueRender();\n }\n\n #selectPickedTopic(): void {\n const background = pickedBackgroundSession(this.#state);\n if (background) {\n this.#state = { ...this.#state, overlay: \"background-session\", notice: undefined };\n this.#queueRender();\n return;\n }\n const topic = pickedTopic(this.#state);\n if (topic) void this.#activateTopic(topic.id);\n }\n\n #moveModelPicker(delta: number): void {\n const count = SELECTABLE_MODELS.length;\n if (count === 0) return;\n this.#state = {\n ...this.#state,\n modelPickerIndex: (this.#state.modelPickerIndex + delta + count) % count,\n };\n this.#queueRender();\n }\n\n async #openVault(): Promise<void> {\n if (\n !this.#client.listVaultEntries ||\n !this.#client.saveVaultEntry ||\n !this.#client.deleteVaultEntry\n ) {\n this.#state = { ...this.#state, notice: \"Vault management is unavailable for this client.\" };\n this.#queueRender();\n return;\n }\n try {\n const entries = await this.#client.listVaultEntries();\n this.#vaultDraftValue = \"\";\n this.#state = {\n ...this.#state,\n overlay: \"vault\",\n notice: undefined,\n vaultEntries: entries,\n vaultPickerIndex: Math.min(this.#state.vaultPickerIndex, Math.max(0, entries.length - 1)),\n vaultMode: \"list\",\n vaultDraftKey: undefined,\n vaultDraftDescription: \"\",\n vaultEditing: false,\n vaultNotice: undefined,\n };\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n }\n\n #handleVaultListInput(chunk: string): void {\n if (this.#state.vaultMode === \"confirm-delete\") {\n const key = chunk.toLowerCase();\n if (CONFIRM_KEYS.has(key)) void this.#deleteSelectedVaultEntry();\n else if (CANCEL_KEYS.has(key) || chunk === \"\\u001b\") {\n this.#state = { ...this.#state, vaultMode: \"list\", vaultNotice: undefined };\n this.#queueRender();\n }\n return;\n }\n\n const key = chunk.toLowerCase();\n if (chunk === \"\\u001b[A\") this.#moveVaultPicker(-1);\n else if (chunk === \"\\u001b[B\") this.#moveVaultPicker(1);\n else if (key === \"n\" || key === \"a\") this.#beginVaultAdd();\n else if (chunk === \"\\r\" || key === \"e\") this.#beginVaultEdit();\n else if (key === \"d\" || chunk === \"\\u001b[3~\") this.#requestVaultDelete();\n else if (chunk === \"\\u001b\") {\n this.#vaultDraftValue = \"\";\n this.#state = { ...this.#state, overlay: null, vaultNotice: undefined };\n this.#queueRender();\n }\n }\n\n #moveVaultPicker(delta: number): void {\n const count = this.#state.vaultEntries.length;\n if (count === 0) return;\n this.#state = {\n ...this.#state,\n vaultPickerIndex: (this.#state.vaultPickerIndex + delta + count) % count,\n vaultNotice: undefined,\n };\n this.#queueRender();\n }\n\n #beginVaultAdd(): void {\n this.#vaultDraftValue = \"\";\n this.#state = {\n ...this.#state,\n vaultMode: \"key\",\n vaultDraftKey: undefined,\n vaultDraftDescription: \"\",\n vaultEditing: false,\n vaultNotice: undefined,\n };\n this.#replaceInput(\"\");\n }\n\n #beginVaultEdit(): void {\n const selected = this.#state.vaultEntries[this.#state.vaultPickerIndex];\n if (!selected) {\n this.#beginVaultAdd();\n return;\n }\n this.#vaultDraftValue = \"\";\n this.#state = {\n ...this.#state,\n vaultMode: \"value\",\n vaultDraftKey: selected.key,\n vaultDraftDescription: selected.description,\n vaultEditing: true,\n vaultNotice: undefined,\n };\n this.#replaceInput(\"\");\n }\n\n #requestVaultDelete(): void {\n if (!this.#state.vaultEntries[this.#state.vaultPickerIndex]) return;\n this.#state = { ...this.#state, vaultMode: \"confirm-delete\", vaultNotice: undefined };\n this.#queueRender();\n }\n\n #cancelVaultForm(): void {\n this.#vaultDraftValue = \"\";\n this.#input.setText(\"\");\n this.#syncInput();\n this.#state = {\n ...this.#state,\n vaultMode: \"list\",\n vaultDraftKey: undefined,\n vaultDraftDescription: \"\",\n vaultEditing: false,\n vaultNotice: undefined,\n };\n this.#queueRender();\n }\n\n async #submitVaultField(): Promise<void> {\n const raw = this.#input.text;\n if (this.#state.vaultMode === \"key\") {\n const key = normalizeVaultKey(raw);\n if (!validateVaultKey(key)) {\n this.#state = {\n ...this.#state,\n vaultNotice: \"Use A-Z, 0-9, and _. The key must start with a letter.\",\n };\n this.#queueRender();\n return;\n }\n if (this.#state.vaultEntries.some((entry) => entry.key === key)) {\n this.#state = {\n ...this.#state,\n vaultNotice: `${key} already exists. Select it to update.`,\n };\n this.#queueRender();\n return;\n }\n this.#state = {\n ...this.#state,\n vaultMode: \"value\",\n vaultDraftKey: key,\n vaultNotice: undefined,\n };\n this.#replaceInput(\"\");\n return;\n }\n\n if (this.#state.vaultMode === \"value\") {\n const valueBytes = Buffer.byteLength(raw, \"utf8\");\n if (valueBytes < VAULT_VALUE_MIN_BYTES || valueBytes > VAULT_VALUE_MAX_BYTES) {\n this.#state = {\n ...this.#state,\n vaultNotice: `Secret must be ${VAULT_VALUE_MIN_BYTES}-${VAULT_VALUE_MAX_BYTES} bytes.`,\n };\n this.#queueRender();\n return;\n }\n this.#vaultDraftValue = raw;\n this.#state = { ...this.#state, vaultMode: \"description\", vaultNotice: undefined };\n this.#replaceInput(this.#state.vaultDraftDescription);\n return;\n }\n\n if (raw.length > VAULT_DESCRIPTION_MAX_LENGTH) {\n this.#state = {\n ...this.#state,\n vaultNotice: `Description must not exceed ${VAULT_DESCRIPTION_MAX_LENGTH} characters.`,\n };\n this.#queueRender();\n return;\n }\n const key = this.#state.vaultDraftKey;\n if (!key || !this.#client.saveVaultEntry) return;\n\n this.#input.setText(\"\");\n this.#syncInput();\n try {\n const result = await this.#client.saveVaultEntry(key, this.#vaultDraftValue, raw);\n const entries = this.#client.listVaultEntries ? await this.#client.listVaultEntries() : [];\n const selectedIndex = Math.max(\n 0,\n entries.findIndex((entry) => entry.key === result.key),\n );\n this.#state = {\n ...this.#state,\n vaultEntries: entries,\n vaultPickerIndex: selectedIndex,\n vaultMode: \"list\",\n vaultDraftKey: undefined,\n vaultDraftDescription: \"\",\n vaultEditing: false,\n vaultNotice: `${result.updated ? \"Updated\" : \"Added\"} ${result.key}.`,\n };\n } catch (error) {\n this.#state = {\n ...this.#state,\n vaultMode: \"list\",\n vaultNotice: error instanceof Error ? error.message : String(error),\n };\n } finally {\n this.#vaultDraftValue = \"\";\n }\n this.#queueRender();\n }\n\n async #deleteSelectedVaultEntry(): Promise<void> {\n const selected = this.#state.vaultEntries[this.#state.vaultPickerIndex];\n if (!selected || !this.#client.deleteVaultEntry) return;\n try {\n const deleted = await this.#client.deleteVaultEntry(selected.key);\n const entries = this.#client.listVaultEntries ? await this.#client.listVaultEntries() : [];\n this.#state = {\n ...this.#state,\n vaultEntries: entries,\n vaultPickerIndex: Math.min(this.#state.vaultPickerIndex, Math.max(0, entries.length - 1)),\n vaultMode: \"list\",\n vaultNotice: deleted ? `Deleted ${selected.key}.` : `${selected.key} no longer exists.`,\n };\n } catch (error) {\n this.#state = {\n ...this.#state,\n vaultMode: \"list\",\n vaultNotice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n }\n\n async #selectPickedModel(): Promise<void> {\n const topic = activeTopic(this.#state);\n const selected = SELECTABLE_MODELS[this.#state.modelPickerIndex];\n if (!topic || !selected) return;\n this.#state = { ...this.#state, overlay: null, notice: `Switching to ${selected.model}…` };\n this.#queueRender();\n try {\n const notice = await this.#client.setModel(topic, selected.model);\n await this.#refreshTopics(topic.title);\n this.#state = { ...this.#state, notice };\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n }\n\n #moveEffortPicker(delta: number): void {\n const count = selectableEfforts(activeTopic(this.#state)).length;\n this.#state = {\n ...this.#state,\n effortPickerIndex: (this.#state.effortPickerIndex + delta + count) % count,\n };\n this.#queueRender();\n }\n\n async #selectPickedEffort(): Promise<void> {\n const topic = activeTopic(this.#state);\n const effort = selectableEfforts(topic)[this.#state.effortPickerIndex];\n if (!topic || !effort) return;\n this.#state = { ...this.#state, overlay: null, notice: `Setting effort to ${effort}…` };\n this.#queueRender();\n try {\n const notice = await this.#client.setEffort(topic, effort);\n await this.#refreshTopics(topic.title);\n this.#state = { ...this.#state, notice };\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n }\n this.#queueRender();\n }\n\n #pathItems(): PathSuggestion[] {\n const cursor = this.#input.cursor;\n const lineText = this.#input.text.split(\"\\n\")[cursor.row] ?? \"\";\n return pathSuggestions(lineText, cursor.col)?.items ?? [];\n }\n\n /** Active suggestion count: slash commands take precedence over `@` paths. */\n #suggestionCount(): number {\n const commands = commandSuggestions(this.#input.text).length;\n return commands > 0 ? commands : this.#pathItems().length;\n }\n\n #applyPathCompletion(keepTrigger: boolean): void {\n const items = this.#pathItems();\n if (items.length === 0) return;\n const cursor = this.#input.cursor;\n const lines = this.#input.text.split(\"\\n\");\n const lineText = lines[cursor.row] ?? \"\";\n const selected = items[(this.#state.suggestionIndex + items.length) % items.length];\n const result = completePathToken(lineText, cursor.col, selected, { keepTrigger });\n if (!result) return;\n lines[cursor.row] = result.line;\n this.#input.setText(lines.join(\"\\n\"), { row: cursor.row, col: result.col });\n this.#syncInput();\n this.#queueRender();\n }\n\n #moveSuggestion(delta: number): void {\n const count = this.#suggestionCount();\n if (count === 0) return;\n this.#state = {\n ...this.#state,\n suggestionIndex: (this.#state.suggestionIndex + delta + count) % count,\n };\n this.#queueRender();\n }\n\n #requestTopicDelete(topic: AppState[\"topics\"][number] | undefined): void {\n if (!topic) return;\n if (topic.kind === \"manager\") {\n const notice = \"Manager topics cannot be deleted\";\n this.#state = this.#state.topicPickerRoot\n ? openTopicPicker(this.#state, notice, true)\n : { ...this.#state, overlay: null, notice };\n this.#queueRender();\n return;\n }\n this.#state = {\n ...this.#state,\n overlay: \"confirm-delete\",\n pendingDeleteTopicId: topic.id,\n };\n this.#queueRender();\n }\n\n async #confirmTopicDelete(): Promise<void> {\n const topicPickerRoot = this.#state.topicPickerRoot;\n const topic = this.#state.topics.find(\n (candidate) => candidate.id === this.#state.pendingDeleteTopicId,\n );\n if (!topic) {\n const missing = { ...this.#state, overlay: null, pendingDeleteTopicId: undefined };\n this.#state = topicPickerRoot ? openTopicPicker(missing, undefined, true) : missing;\n this.#queueRender();\n return;\n }\n this.#state = {\n ...this.#state,\n overlay: null,\n pendingDeleteTopicId: undefined,\n notice: `Deleting ${topic.title}…`,\n };\n this.#queueRender();\n try {\n await this.#client.deleteTopic(topic);\n await this.#refreshTopics();\n this.#state = openTopicPicker(this.#state, `Deleted ${topic.title}`, topicPickerRoot);\n if (!topicPickerRoot) await this.#loadActiveMessages();\n } catch (error) {\n const failed = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n this.#state = topicPickerRoot ? openTopicPicker(failed, failed.notice, true) : failed;\n }\n this.#queueRender();\n }\n\n async #copy(all: boolean): Promise<void> {\n const text = all\n ? plainTranscript(this.#state)\n : activeMessages(this.#state)\n .slice()\n .reverse()\n .find((message) => message.authorId === \"ai\" && message.text.trim())?.text;\n if (!text) {\n this.#state = {\n ...this.#state,\n notice: all ? \"Nothing to copy\" : \"No agent response to copy\",\n };\n this.#queueRender();\n return;\n }\n try {\n const result = await copyToClipboard(text);\n this.#state = {\n ...this.#state,\n notice: `${all ? \"Transcript\" : \"Last response\"} copied via ${result.method}${result.truncated ? \" (truncated)\" : \"\"}`,\n };\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: `Copy failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n this.#queueRender();\n }\n\n #handleMouseSelection(event: TerminalMouseEvent): void {\n if ((event.button & 3) !== 0 && event.kind !== \"release\") return;\n const point: ScreenPoint = { x: event.x, y: event.y };\n if (event.kind === \"press\") {\n this.#selection = { anchor: point, focus: point };\n this.#queueRender();\n return;\n }\n if (!this.#selection) return;\n this.#selection = { ...this.#selection, focus: point };\n if (event.kind === \"drag\") {\n this.#queueRender();\n return;\n }\n\n const selection = this.#selection;\n if (selection.anchor.x === selection.focus.x && selection.anchor.y === selection.focus.y) {\n this.#selection = null;\n this.#queueRender();\n return;\n }\n const text = screenSelectionText(this.#plainFrameLines, selection);\n if (!text) {\n this.#selection = null;\n this.#queueRender();\n return;\n }\n void this.#copySelection(text);\n this.#queueRender();\n }\n\n async #copySelection(text: string): Promise<void> {\n try {\n const result = await copyToClipboard(text);\n this.#state = {\n ...this.#state,\n notice: `Selection copied via ${result.method}${result.truncated ? \" (truncated)\" : \"\"}`,\n };\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: `Copy failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n this.#queueRender();\n }\n\n #moveAskChoice(delta: number): void {\n const choices = activeQuestion(this.#state)?.askUserQuestion?.choices;\n if (!choices?.length) return;\n const next = (this.#state.askChoiceIndex + delta + choices.length) % choices.length;\n this.#state = { ...this.#state, askChoiceIndex: next };\n this.#queueRender();\n }\n\n #loadOlderHistory(): void {\n const topic = activeTopic(this.#state);\n if (!topic || !this.#client.listMessagePage) return;\n const history = this.#messageHistory.get(topic.id);\n if (!history || history.loading) return;\n if (!history.hasMore || !history.cursor) {\n this.#state = { ...this.#state, notice: \"Start of conversation\" };\n this.#queueRender();\n return;\n }\n\n const currentMax = maxConversationScrollOffset(\n this.#state,\n process.stdout.columns ?? 100,\n process.stdout.rows ?? 30,\n );\n this.#state = { ...this.#state, scrollOffset: currentMax };\n void this.#loadOlderMessages(topic.id, currentMax + 8);\n }\n\n #scroll(delta: number): void {\n const maxOffset = maxConversationScrollOffset(\n this.#state,\n process.stdout.columns ?? 100,\n process.stdout.rows ?? 30,\n );\n const desiredOffset = this.#state.scrollOffset + delta;\n this.#state = {\n ...this.#state,\n scrollOffset: Math.min(maxOffset, Math.max(0, desiredOffset)),\n };\n this.#queueRender();\n }\n\n async #abort(): Promise<void> {\n const topic = activeTopic(this.#state);\n let aborted = false;\n try {\n aborted = topic ? await this.#client.abort(topic.id) : false;\n } catch (error) {\n this.#state = {\n ...this.#state,\n notice: error instanceof Error ? error.message : String(error),\n };\n this.#queueRender();\n return;\n }\n this.#state = {\n ...this.#state,\n notice: aborted ? \"Turn aborted\" : \"Nothing is running\",\n };\n this.#queueRender();\n }\n\n #handleInterrupt(): void {\n if (ctrlCExitsTopicPicker(this.#state)) {\n this.#requestExit();\n return;\n }\n if (this.#state.topicPickerRoot && this.#state.creatingTopic) {\n this.#lastInterruptAt = 0;\n this.#input.setText(\"\");\n this.#history.reset();\n this.#syncInput();\n this.#state = openTopicPicker(this.#state, undefined, true);\n this.#queueRender();\n return;\n }\n const topic = activeTopic(this.#state);\n if (topic && this.#state.activity[topic.id]?.running) {\n this.#lastInterruptAt = 0;\n void this.#abort();\n return;\n }\n if (this.#input.text || this.#state.overlay || this.#state.creatingTopic) {\n this.#lastInterruptAt = 0;\n if (this.#state.overlay === \"vault\") this.#vaultDraftValue = \"\";\n this.#input.setText(\"\");\n this.#history.reset();\n this.#syncInput();\n this.#state = {\n ...this.#state,\n overlay: null,\n pendingDeleteTopicId: undefined,\n creatingTopic: false,\n notice: \"Input cleared\",\n };\n this.#queueRender();\n return;\n }\n\n const now = Date.now();\n if (now - this.#lastInterruptAt <= 1_500) {\n this.#requestExit();\n return;\n }\n this.#lastInterruptAt = now;\n this.#state = { ...this.#state, notice: \"Press Ctrl-C again to exit\" };\n this.#queueRender();\n }\n\n #requestExit(): void {\n if (!this.#running) return;\n this.#running = false;\n this.#finishRun?.();\n this.#finishRun = null;\n }\n\n async #cleanup(clientStartAttempted: boolean, uiActive: boolean): Promise<void> {\n if (this.#renderTimer) clearTimeout(this.#renderTimer);\n if (this.#animationTimer) clearInterval(this.#animationTimer);\n if (this.#backgroundRefreshTimer) clearInterval(this.#backgroundRefreshTimer);\n this.#renderTimer = undefined;\n this.#animationTimer = undefined;\n this.#backgroundRefreshTimer = undefined;\n this.#renderQueued = false;\n this.#screen.reset();\n if (uiActive) {\n process.stdin.off(\"data\", this.#onData);\n process.stdout.off(\"resize\", this.#onResize);\n process.off(\"SIGINT\", this.#onSignal);\n process.off(\"SIGTERM\", this.#onSignal);\n if (process.stdin.isTTY) process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdout.write(EXIT_ALT_SCREEN);\n }\n if (clientStartAttempted) await this.#client.stop();\n }\n}\n",
15
- "import { defineNegotiumAdapter, type NegotiumAdapterHandle } from \"@negotium/adapter-sdk\";\nimport { TerminalApp, type TerminalAppOptions } from \"@/app\";\nimport { type EmbeddedClientOptions, EmbeddedNegotiumClient, type NegotiumClient } from \"@/client\";\n\nexport type { TerminalAppOptions } from \"@/app\";\nexport { TerminalApp } from \"@/app\";\nexport type { EmbeddedClientOptions, NegotiumClient, RemoteClientOptions } from \"@/client\";\nexport { EmbeddedNegotiumClient, RemoteNegotiumClient } from \"@/client\";\nexport { renderApp } from \"@/render\";\nexport type { AppState } from \"@/state\";\n\nexport interface TerminalAdapterOptions extends TerminalAppOptions {\n /** Inject a remote or embedded client. Defaults to an in-process Negotium node. */\n client?: NegotiumClient;\n /** Embedded node port; zero selects an ephemeral port. Ignored with a custom client. */\n port?: EmbeddedClientOptions[\"port\"];\n /** False attaches this TUI to a node already started in the same process. */\n startNode?: EmbeddedClientOptions[\"startNode\"];\n}\n\nexport interface TerminalAdapterHandle extends NegotiumAdapterHandle<\"terminal\"> {\n /** Settles after the user exits, stop() completes, or startup fails. */\n readonly completed: Promise<void>;\n}\n\n/** Start the TUI without hiding its lifecycle from an embedding host. */\nexport function startTerminalAdapter(options: TerminalAdapterOptions): TerminalAdapterHandle {\n const client =\n options.client ??\n new EmbeddedNegotiumClient({\n userId: options.userId,\n port: options.port,\n startNode: options.startNode,\n });\n const app = new TerminalApp(client, options);\n const completed = app.run();\n return {\n name: \"terminal\",\n completed,\n async stop(): Promise<void> {\n app.stop();\n await completed;\n },\n };\n}\n\n/** Declarative form used by hosts that load adapters from a registry. */\nexport const terminalAdapter = defineNegotiumAdapter({\n name: \"terminal\",\n capabilities: {\n localUserInput: true,\n topicManagement: true,\n externalPlacedTurn: false,\n },\n projection: {\n transcript: \"full\",\n historyBackfill: true,\n externalAuthors: \"native\",\n },\n start: startTerminalAdapter,\n});\n"
16
- ],
17
- "mappings": "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",
18
- "debugId": "2E8352AA30C2ACBA64756E2164756E21",
19
- "names": []
20
- }