negotium 0.1.7 → 0.1.8

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 (256) hide show
  1. package/README.md +2 -2
  2. package/dist/chunk-0ay6cjdy.js +1331 -0
  3. package/dist/chunk-0ay6cjdy.js.map +16 -0
  4. package/dist/chunk-1k7t7bnx.js +97 -0
  5. package/dist/chunk-1k7t7bnx.js.map +10 -0
  6. package/dist/chunk-5ahkew9c.js +806 -0
  7. package/dist/chunk-5ahkew9c.js.map +17 -0
  8. package/dist/chunk-6cpn7ht2.js +287 -0
  9. package/dist/chunk-6cpn7ht2.js.map +13 -0
  10. package/dist/chunk-6kctn20e.js +3529 -0
  11. package/dist/chunk-6kctn20e.js.map +20 -0
  12. package/dist/chunk-7xqj7aex.js +77 -0
  13. package/dist/chunk-7xqj7aex.js.map +11 -0
  14. package/dist/chunk-9p0ww3tk.js +41 -0
  15. package/dist/chunk-9p0ww3tk.js.map +10 -0
  16. package/dist/chunk-a92a7nrk.js +252 -0
  17. package/dist/chunk-a92a7nrk.js.map +10 -0
  18. package/dist/chunk-c500xe9z.js +33 -0
  19. package/dist/chunk-c500xe9z.js.map +10 -0
  20. package/dist/chunk-cds1qxsf.js +1644 -0
  21. package/dist/chunk-cds1qxsf.js.map +17 -0
  22. package/dist/chunk-e4407g8x.js +274 -0
  23. package/dist/chunk-e4407g8x.js.map +10 -0
  24. package/dist/chunk-e5pbggsh.js +363 -0
  25. package/dist/chunk-e5pbggsh.js.map +11 -0
  26. package/dist/chunk-edb07sjp.js +567 -0
  27. package/dist/chunk-edb07sjp.js.map +14 -0
  28. package/dist/chunk-exd0v74a.js +3012 -0
  29. package/dist/chunk-exd0v74a.js.map +32 -0
  30. package/dist/chunk-fgrme9tr.js +4398 -0
  31. package/dist/chunk-fgrme9tr.js.map +47 -0
  32. package/dist/chunk-fka9eqe1.js +581 -0
  33. package/dist/chunk-fka9eqe1.js.map +11 -0
  34. package/dist/chunk-g82jygez.js +108 -0
  35. package/dist/chunk-g82jygez.js.map +10 -0
  36. package/dist/chunk-ghs2j1fr.js +312 -0
  37. package/dist/chunk-ghs2j1fr.js.map +10 -0
  38. package/dist/chunk-gmy11efb.js +125 -0
  39. package/dist/chunk-gmy11efb.js.map +10 -0
  40. package/dist/chunk-gxma4c70.js +110 -0
  41. package/dist/chunk-gxma4c70.js.map +10 -0
  42. package/dist/chunk-hkdqhm34.js +61 -0
  43. package/dist/chunk-hkdqhm34.js.map +10 -0
  44. package/dist/chunk-hpa0cpzh.js +134 -0
  45. package/dist/chunk-hpa0cpzh.js.map +10 -0
  46. package/dist/chunk-hwy3n31w.js +21 -0
  47. package/dist/chunk-hwy3n31w.js.map +9 -0
  48. package/dist/chunk-j2behpy7.js +214 -0
  49. package/dist/chunk-j2behpy7.js.map +10 -0
  50. package/dist/chunk-jc0at0tc.js +102 -0
  51. package/dist/chunk-jc0at0tc.js.map +10 -0
  52. package/dist/chunk-jkqq5ef6.js +243 -0
  53. package/dist/chunk-jkqq5ef6.js.map +11 -0
  54. package/dist/chunk-jzkw2f01.js +51 -0
  55. package/dist/chunk-jzkw2f01.js.map +10 -0
  56. package/dist/chunk-jzz91jwh.js +70 -0
  57. package/dist/chunk-jzz91jwh.js.map +10 -0
  58. package/dist/chunk-k9z47mab.js +247 -0
  59. package/dist/chunk-k9z47mab.js.map +12 -0
  60. package/dist/chunk-n17yxpa8.js +23 -0
  61. package/dist/chunk-n17yxpa8.js.map +10 -0
  62. package/dist/chunk-naa09ags.js +2143 -0
  63. package/dist/chunk-naa09ags.js.map +15 -0
  64. package/dist/chunk-ns3ke88n.js +142 -0
  65. package/dist/chunk-ns3ke88n.js.map +10 -0
  66. package/dist/chunk-p3cr2ejg.js +1626 -0
  67. package/dist/chunk-p3cr2ejg.js.map +15 -0
  68. package/dist/chunk-q5bcpf23.js +2925 -0
  69. package/dist/chunk-q5bcpf23.js.map +20 -0
  70. package/dist/chunk-rafc55bs.js +424 -0
  71. package/dist/chunk-rafc55bs.js.map +11 -0
  72. package/dist/chunk-rbrxjvbj.js +2830 -0
  73. package/dist/chunk-rbrxjvbj.js.map +23 -0
  74. package/dist/chunk-sa874j5c.js +9 -0
  75. package/dist/chunk-sa874j5c.js.map +10 -0
  76. package/dist/chunk-sgsz2fpq.js +289 -0
  77. package/dist/chunk-sgsz2fpq.js.map +10 -0
  78. package/dist/chunk-sm6fh5c5.js +569 -0
  79. package/dist/chunk-sm6fh5c5.js.map +14 -0
  80. package/dist/chunk-t9zcg8f1.js +499 -0
  81. package/dist/chunk-t9zcg8f1.js.map +13 -0
  82. package/dist/chunk-vp2db42d.js +121 -0
  83. package/dist/chunk-vp2db42d.js.map +10 -0
  84. package/dist/chunk-w13jjf4a.js +46 -0
  85. package/dist/chunk-w13jjf4a.js.map +10 -0
  86. package/dist/chunk-x1arr7ze.js +63 -0
  87. package/dist/chunk-x1arr7ze.js.map +10 -0
  88. package/dist/chunk-xfq68rch.js +583 -0
  89. package/dist/chunk-xfq68rch.js.map +11 -0
  90. package/dist/main.js +132 -20
  91. package/dist/main.js.map +4 -4
  92. package/dist/runtime/scripts/faster-whisper-wrapper.py +87 -0
  93. package/dist/runtime/scripts/mcp-patchright-http.mjs +349 -0
  94. package/dist/runtime/src/agents/api-topic-agent-switch.ts +178 -0
  95. package/dist/runtime/src/agents/archiver.ts +396 -0
  96. package/dist/runtime/src/agents/auth-check.ts +64 -0
  97. package/dist/runtime/src/agents/claude-provider.ts +737 -0
  98. package/dist/runtime/src/agents/claude-registry.ts +115 -0
  99. package/dist/runtime/src/agents/codex-native-multi-agent.ts +177 -0
  100. package/dist/runtime/src/agents/codex-provider.ts +785 -0
  101. package/dist/runtime/src/agents/codex-registry.ts +115 -0
  102. package/dist/runtime/src/agents/codex-tree-kill.ts +365 -0
  103. package/dist/runtime/src/agents/contracts.ts +69 -0
  104. package/dist/runtime/src/agents/deep-map.ts +13 -0
  105. package/dist/runtime/src/agents/execution-host.ts +91 -0
  106. package/dist/runtime/src/agents/fixtures/claude-attachments.jsonl +2 -0
  107. package/dist/runtime/src/agents/fixtures/codex-shell.jsonl +5 -0
  108. package/dist/runtime/src/agents/fork.ts +65 -0
  109. package/dist/runtime/src/agents/hosted-agent.ts +48 -0
  110. package/dist/runtime/src/agents/idle-archiver.ts +128 -0
  111. package/dist/runtime/src/agents/index.ts +205 -0
  112. package/dist/runtime/src/agents/maestro-provider.ts +206 -0
  113. package/dist/runtime/src/agents/maestro-registry.ts +31 -0
  114. package/dist/runtime/src/agents/mcp-tools/ask-user.ts +280 -0
  115. package/dist/runtime/src/agents/mcp-tools/common.ts +21 -0
  116. package/dist/runtime/src/agents/mcp-tools/self-config.ts +220 -0
  117. package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +525 -0
  118. package/dist/runtime/src/agents/mcp-tools/visuals.ts +88 -0
  119. package/dist/runtime/src/agents/model-catalog.ts +151 -0
  120. package/dist/runtime/src/agents/registry.ts +24 -0
  121. package/dist/runtime/src/agents/rollout/claude.ts +331 -0
  122. package/dist/runtime/src/agents/rollout/codex.ts +569 -0
  123. package/dist/runtime/src/agents/rollout/shared.ts +205 -0
  124. package/dist/runtime/src/agents/self-config-core.ts +415 -0
  125. package/dist/runtime/src/agents/task-events.ts +44 -0
  126. package/dist/runtime/src/agents/tool-format.ts +352 -0
  127. package/dist/runtime/src/agents/topic-agent-switch.ts +193 -0
  128. package/dist/runtime/src/agents/topic-cleanup.ts +231 -0
  129. package/dist/runtime/src/agents/vault-tool-policy.ts +33 -0
  130. package/dist/runtime/src/application/execute-external-user-turn.ts +23 -0
  131. package/dist/runtime/src/application/submit-user-message.ts +47 -0
  132. package/dist/runtime/src/application/switch-topic-effort.ts +48 -0
  133. package/dist/runtime/src/application/switch-topic-model.ts +79 -0
  134. package/dist/runtime/src/application/topic-service.ts +139 -0
  135. package/dist/runtime/src/application/vault-command.ts +170 -0
  136. package/dist/runtime/src/bus.ts +319 -0
  137. package/dist/runtime/src/index.ts +333 -0
  138. package/dist/runtime/src/mcp/agent-health-server.ts +309 -0
  139. package/dist/runtime/src/mcp/background-bash-server.ts +346 -0
  140. package/dist/runtime/src/mcp/canonical-bridge-config.ts +84 -0
  141. package/dist/runtime/src/mcp/canonical-proxy-server.ts +171 -0
  142. package/dist/runtime/src/mcp/dm-ipc.ts +60 -0
  143. package/dist/runtime/src/mcp/mcp-helpers.ts +40 -0
  144. package/dist/runtime/src/mcp/paddleocr-server.ts +105 -0
  145. package/dist/runtime/src/mcp/peer-bridge.ts +114 -0
  146. package/dist/runtime/src/mcp/runtime-spec.ts +134 -0
  147. package/dist/runtime/src/mcp/session-comm/bridge-ipc-config.ts +27 -0
  148. package/dist/runtime/src/mcp/session-comm/peer-forward.ts +165 -0
  149. package/dist/runtime/src/mcp/session-comm/runtime.ts +115 -0
  150. package/dist/runtime/src/mcp/session-comm/server.ts +649 -0
  151. package/dist/runtime/src/mcp/session-comm/topic-config.ts +131 -0
  152. package/dist/runtime/src/mcp/session-comm/topics.ts +229 -0
  153. package/dist/runtime/src/mcp/stdio-protect.ts +84 -0
  154. package/dist/runtime/src/mcp/system-health-server.ts +130 -0
  155. package/dist/runtime/src/mcp/task-server.ts +173 -0
  156. package/dist/runtime/src/mcp/token-stats-server.ts +98 -0
  157. package/dist/runtime/src/mcp/vault-http.ts +219 -0
  158. package/dist/runtime/src/mcp/vault-run.ts +153 -0
  159. package/dist/runtime/src/mcp/vault-server.ts +104 -0
  160. package/dist/runtime/src/mcp/wiki-server.ts +755 -0
  161. package/dist/runtime/src/media/file-events.ts +33 -0
  162. package/dist/runtime/src/media/text-extractor.ts +312 -0
  163. package/dist/runtime/src/media/video.ts +92 -0
  164. package/dist/runtime/src/outbox/file-ops.ts +210 -0
  165. package/dist/runtime/src/outbox/index.ts +8 -0
  166. package/dist/runtime/src/outbox/utils.ts +51 -0
  167. package/dist/runtime/src/platform/background-bash/manager.ts +279 -0
  168. package/dist/runtime/src/platform/config.ts +371 -0
  169. package/dist/runtime/src/platform/constants.ts +18 -0
  170. package/dist/runtime/src/platform/debug-users.ts +14 -0
  171. package/dist/runtime/src/platform/delay.ts +1 -0
  172. package/dist/runtime/src/platform/error.ts +9 -0
  173. package/dist/runtime/src/platform/file-utils.ts +16 -0
  174. package/dist/runtime/src/platform/jsonl.ts +202 -0
  175. package/dist/runtime/src/platform/lifecycle.ts +174 -0
  176. package/dist/runtime/src/platform/logger.ts +31 -0
  177. package/dist/runtime/src/platform/maestro-bootstrap-env.ts +3 -0
  178. package/dist/runtime/src/platform/mcp-config.ts +865 -0
  179. package/dist/runtime/src/platform/modules.ts +145 -0
  180. package/dist/runtime/src/platform/node-plugins.ts +46 -0
  181. package/dist/runtime/src/platform/playwright/manager.ts +1233 -0
  182. package/dist/runtime/src/prompts/agents/wiki-archiver.md +261 -0
  183. package/dist/runtime/src/prompts/builders.ts +357 -0
  184. package/dist/runtime/src/prompts/sessions/channel-system.md +48 -0
  185. package/dist/runtime/src/prompts/sessions/manager-system.md +37 -0
  186. package/dist/runtime/src/prompts/sessions/topic-system.md +47 -0
  187. package/dist/runtime/src/prompts/sessions/visual-design.md +86 -0
  188. package/dist/runtime/src/query/active-rooms.ts +532 -0
  189. package/dist/runtime/src/query/control.ts +313 -0
  190. package/dist/runtime/src/query/index.ts +24 -0
  191. package/dist/runtime/src/query/session-inbox-cleanup.ts +44 -0
  192. package/dist/runtime/src/query/session-inbox-path.ts +42 -0
  193. package/dist/runtime/src/query/state.ts +94 -0
  194. package/dist/runtime/src/query/types.ts +83 -0
  195. package/dist/runtime/src/runtime/ask-callbacks.ts +153 -0
  196. package/dist/runtime/src/runtime/attachments.ts +151 -0
  197. package/dist/runtime/src/runtime/background-sessions.ts +83 -0
  198. package/dist/runtime/src/runtime/channel-context.ts +107 -0
  199. package/dist/runtime/src/runtime/errors.ts +69 -0
  200. package/dist/runtime/src/runtime/event-heartbeat.ts +77 -0
  201. package/dist/runtime/src/runtime/file-hooks.ts +81 -0
  202. package/dist/runtime/src/runtime/footer.ts +23 -0
  203. package/dist/runtime/src/runtime/inbox.ts +946 -0
  204. package/dist/runtime/src/runtime/tasks.ts +56 -0
  205. package/dist/runtime/src/runtime/topic-config.ts +29 -0
  206. package/dist/runtime/src/runtime/turn-runner.ts +2286 -0
  207. package/dist/runtime/src/runtime/usage-alert.ts +84 -0
  208. package/dist/runtime/src/runtime/visual-html.ts +109 -0
  209. package/dist/runtime/src/runtime/visual-store.ts +430 -0
  210. package/dist/runtime/src/runtime/visuals.ts +171 -0
  211. package/dist/runtime/src/security/sanitize.ts +27 -0
  212. package/dist/runtime/src/security/sensitive-path.ts +34 -0
  213. package/dist/runtime/src/storage/activity-log.ts +152 -0
  214. package/dist/runtime/src/storage/api-messages.ts +617 -0
  215. package/dist/runtime/src/storage/api-topic-brief.ts +127 -0
  216. package/dist/runtime/src/storage/api-topic-config.ts +192 -0
  217. package/dist/runtime/src/storage/api-topics.ts +844 -0
  218. package/dist/runtime/src/storage/app-settings.ts +44 -0
  219. package/dist/runtime/src/storage/browser-profiles.ts +133 -0
  220. package/dist/runtime/src/storage/conversations.ts +268 -0
  221. package/dist/runtime/src/storage/forum/agent-settings.ts +20 -0
  222. package/dist/runtime/src/storage/forum/index.ts +4 -0
  223. package/dist/runtime/src/storage/forum/repository.ts +283 -0
  224. package/dist/runtime/src/storage/forum/schema.ts +300 -0
  225. package/dist/runtime/src/storage/forum-db.ts +23 -0
  226. package/dist/runtime/src/storage/runtime-events.ts +130 -0
  227. package/dist/runtime/src/storage/runtime-leases.ts +189 -0
  228. package/dist/runtime/src/storage/runtime-process-leases.ts +216 -0
  229. package/dist/runtime/src/storage/runtime-topic-state.ts +148 -0
  230. package/dist/runtime/src/storage/runtime-turn-requests.ts +300 -0
  231. package/dist/runtime/src/storage/self-schedules.ts +298 -0
  232. package/dist/runtime/src/storage/session-asks.ts +347 -0
  233. package/dist/runtime/src/storage/sqlite.ts +129 -0
  234. package/dist/runtime/src/storage/tasks.ts +179 -0
  235. package/dist/runtime/src/storage/token-stats.ts +144 -0
  236. package/dist/runtime/src/storage/topic-archive-state.ts +59 -0
  237. package/dist/runtime/src/storage/topic-archive.ts +74 -0
  238. package/dist/runtime/src/storage/topic-settings.ts +67 -0
  239. package/dist/runtime/src/storage/topic-transcript.ts +98 -0
  240. package/dist/runtime/src/storage/vault-crypto.ts +65 -0
  241. package/dist/runtime/src/storage/vault.ts +225 -0
  242. package/dist/runtime/src/storage/wiki-summary-names.ts +33 -0
  243. package/dist/runtime/src/storage/wiki.ts +85 -0
  244. package/dist/runtime/src/topics/create.ts +123 -0
  245. package/dist/runtime/src/topics/derive.ts +398 -0
  246. package/dist/runtime/src/topics/lifecycle.ts +311 -0
  247. package/dist/runtime/src/topics/links.ts +7 -0
  248. package/dist/runtime/src/topics/personal-general.ts +65 -0
  249. package/dist/runtime/src/topics/session.ts +381 -0
  250. package/dist/runtime/src/types/api.ts +497 -0
  251. package/dist/runtime/src/types.ts +255 -0
  252. package/dist/runtime/src/version.ts +1 -0
  253. package/dist/runtime/tsconfig.json +13 -0
  254. package/package.json +16 -3
  255. package/dist/main.d.ts +0 -3
  256. package/dist/main.d.ts.map +0 -1
@@ -0,0 +1,20 @@
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": "9DEDBF4FF90919A864756E2164756E21",
19
+ "names": []
20
+ }