sisyphi 1.1.18 → 1.1.19

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 (231) hide show
  1. package/README.md +195 -75
  2. package/dist/chunk-36VJ7ZBD.js +1898 -0
  3. package/dist/chunk-36VJ7ZBD.js.map +1 -0
  4. package/dist/{chunk-C2XKXERJ.js → chunk-M6Z3KHOH.js} +159 -46
  5. package/dist/chunk-M6Z3KHOH.js.map +1 -0
  6. package/dist/chunk-O4ZHSQ5R.js +544 -0
  7. package/dist/chunk-O4ZHSQ5R.js.map +1 -0
  8. package/dist/chunk-P2HHTIPM.js +478 -0
  9. package/dist/chunk-P2HHTIPM.js.map +1 -0
  10. package/dist/{chunk-TMBAVPHH.js → chunk-PNDCVKBN.js} +73 -1
  11. package/dist/chunk-PNDCVKBN.js.map +1 -0
  12. package/dist/chunk-SVGIQ2G4.js +1076 -0
  13. package/dist/chunk-SVGIQ2G4.js.map +1 -0
  14. package/dist/cli.js +4405 -892
  15. package/dist/cli.js.map +1 -1
  16. package/dist/daemon.js +4340 -1990
  17. package/dist/daemon.js.map +1 -1
  18. package/dist/{paths-XRDEEJ5R.js → paths-JXFLR5BN.js} +38 -2
  19. package/dist/single-ask-6G4BIVY2.js +132 -0
  20. package/dist/single-ask-6G4BIVY2.js.map +1 -0
  21. package/dist/templates/CLAUDE.md +1 -56
  22. package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -65
  23. package/dist/templates/agent-plugin/agents/debug.md +43 -6
  24. package/dist/templates/agent-plugin/agents/debug.settings.json +57 -0
  25. package/dist/templates/agent-plugin/agents/explore.md +28 -1
  26. package/dist/templates/agent-plugin/agents/explore.settings.json +57 -0
  27. package/dist/templates/agent-plugin/agents/implementor.md +94 -0
  28. package/dist/templates/agent-plugin/agents/implementor.settings.json +57 -0
  29. package/dist/templates/agent-plugin/agents/operator.md +43 -1
  30. package/dist/templates/agent-plugin/agents/operator.settings.json +57 -0
  31. package/dist/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  32. package/dist/templates/agent-plugin/agents/plan.md +176 -86
  33. package/dist/templates/agent-plugin/agents/plan.settings.json +57 -0
  34. package/dist/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  35. package/dist/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  36. package/dist/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  37. package/dist/templates/agent-plugin/agents/problem/precedent.md +25 -0
  38. package/dist/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  39. package/dist/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  40. package/dist/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  41. package/dist/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  42. package/dist/templates/agent-plugin/agents/problem.md +334 -79
  43. package/dist/templates/agent-plugin/agents/problem.settings.json +57 -0
  44. package/dist/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  45. package/dist/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  46. package/dist/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  47. package/dist/templates/agent-plugin/agents/research-lead.md +184 -0
  48. package/dist/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  49. package/dist/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  50. package/dist/templates/agent-plugin/agents/review/compliance.md +14 -3
  51. package/dist/templates/agent-plugin/agents/review/efficiency.md +15 -4
  52. package/dist/templates/agent-plugin/agents/review/quality.md +20 -6
  53. package/dist/templates/agent-plugin/agents/review/reuse.md +17 -5
  54. package/dist/templates/agent-plugin/agents/review/security.md +10 -3
  55. package/dist/templates/agent-plugin/agents/review/tests.md +58 -0
  56. package/dist/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  57. package/dist/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  58. package/dist/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  59. package/dist/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  60. package/dist/templates/agent-plugin/agents/review-plan/security.md +5 -2
  61. package/dist/templates/agent-plugin/agents/review-plan.md +52 -5
  62. package/dist/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  63. package/dist/templates/agent-plugin/agents/review.md +89 -16
  64. package/dist/templates/agent-plugin/agents/review.settings.json +57 -0
  65. package/dist/templates/agent-plugin/agents/spec/engineer.md +175 -0
  66. package/dist/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  67. package/dist/templates/agent-plugin/agents/spec.md +444 -0
  68. package/dist/templates/agent-plugin/agents/spec.settings.json +57 -0
  69. package/dist/templates/agent-plugin/agents/test-spec.md +58 -2
  70. package/dist/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  71. package/dist/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  72. package/dist/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  73. package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  74. package/dist/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  75. package/dist/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  76. package/dist/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  77. package/dist/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  78. package/dist/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  79. package/dist/templates/agent-plugin/hooks/require-submit.sh +51 -42
  80. package/dist/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  81. package/dist/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  82. package/dist/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  83. package/dist/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  84. package/dist/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  85. package/dist/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  86. package/dist/templates/agent-suffix.md +7 -4
  87. package/dist/templates/baleia.lua +42 -0
  88. package/dist/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  89. package/dist/templates/dashboard-claude.md +7 -3
  90. package/dist/templates/orchestrator-base.md +89 -52
  91. package/dist/templates/orchestrator-completion.md +47 -24
  92. package/dist/templates/orchestrator-discovery.md +183 -0
  93. package/dist/templates/orchestrator-impl.md +47 -18
  94. package/dist/templates/orchestrator-planning.md +109 -20
  95. package/dist/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  96. package/dist/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  97. package/dist/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  98. package/dist/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  99. package/dist/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  100. package/dist/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  101. package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  102. package/dist/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  103. package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  104. package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  105. package/dist/templates/orchestrator-settings.json +55 -0
  106. package/dist/templates/orchestrator-validation.md +17 -14
  107. package/dist/templates/sisyphus-init.lua +30 -0
  108. package/dist/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  109. package/dist/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  110. package/dist/templates/termrender-haiku-system.md +82 -0
  111. package/dist/templates/whip-animation.sh +345 -0
  112. package/dist/tui.js +3242 -2189
  113. package/dist/tui.js.map +1 -1
  114. package/native/SisyphusNotify/main.swift +15 -5
  115. package/package.json +8 -6
  116. package/templates/CLAUDE.md +1 -56
  117. package/templates/agent-plugin/agents/CLAUDE.md +2 -65
  118. package/templates/agent-plugin/agents/debug.md +43 -6
  119. package/templates/agent-plugin/agents/debug.settings.json +57 -0
  120. package/templates/agent-plugin/agents/explore.md +28 -1
  121. package/templates/agent-plugin/agents/explore.settings.json +57 -0
  122. package/templates/agent-plugin/agents/implementor.md +94 -0
  123. package/templates/agent-plugin/agents/implementor.settings.json +57 -0
  124. package/templates/agent-plugin/agents/operator.md +43 -1
  125. package/templates/agent-plugin/agents/operator.settings.json +57 -0
  126. package/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  127. package/templates/agent-plugin/agents/plan.md +176 -86
  128. package/templates/agent-plugin/agents/plan.settings.json +57 -0
  129. package/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  130. package/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  131. package/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  132. package/templates/agent-plugin/agents/problem/precedent.md +25 -0
  133. package/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  134. package/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  135. package/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  136. package/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  137. package/templates/agent-plugin/agents/problem.md +334 -79
  138. package/templates/agent-plugin/agents/problem.settings.json +57 -0
  139. package/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  140. package/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  141. package/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  142. package/templates/agent-plugin/agents/research-lead.md +184 -0
  143. package/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  144. package/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  145. package/templates/agent-plugin/agents/review/compliance.md +14 -3
  146. package/templates/agent-plugin/agents/review/efficiency.md +15 -4
  147. package/templates/agent-plugin/agents/review/quality.md +20 -6
  148. package/templates/agent-plugin/agents/review/reuse.md +17 -5
  149. package/templates/agent-plugin/agents/review/security.md +10 -3
  150. package/templates/agent-plugin/agents/review/tests.md +58 -0
  151. package/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  152. package/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  153. package/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  154. package/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  155. package/templates/agent-plugin/agents/review-plan/security.md +5 -2
  156. package/templates/agent-plugin/agents/review-plan.md +52 -5
  157. package/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  158. package/templates/agent-plugin/agents/review.md +89 -16
  159. package/templates/agent-plugin/agents/review.settings.json +57 -0
  160. package/templates/agent-plugin/agents/spec/engineer.md +175 -0
  161. package/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  162. package/templates/agent-plugin/agents/spec.md +444 -0
  163. package/templates/agent-plugin/agents/spec.settings.json +57 -0
  164. package/templates/agent-plugin/agents/test-spec.md +58 -2
  165. package/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  166. package/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  167. package/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  168. package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  169. package/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  170. package/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  171. package/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  172. package/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  173. package/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  174. package/templates/agent-plugin/hooks/require-submit.sh +51 -42
  175. package/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  176. package/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  177. package/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  178. package/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  179. package/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  180. package/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  181. package/templates/agent-suffix.md +7 -4
  182. package/templates/baleia.lua +42 -0
  183. package/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  184. package/templates/dashboard-claude.md +7 -3
  185. package/templates/orchestrator-base.md +89 -52
  186. package/templates/orchestrator-completion.md +47 -24
  187. package/templates/orchestrator-discovery.md +183 -0
  188. package/templates/orchestrator-impl.md +47 -18
  189. package/templates/orchestrator-planning.md +109 -20
  190. package/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  191. package/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  192. package/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  193. package/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  194. package/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  195. package/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  196. package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  197. package/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  198. package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  199. package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  200. package/templates/orchestrator-settings.json +55 -0
  201. package/templates/orchestrator-validation.md +17 -14
  202. package/templates/sisyphus-init.lua +30 -0
  203. package/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  204. package/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  205. package/templates/termrender-haiku-system.md +82 -0
  206. package/templates/whip-animation.sh +345 -0
  207. package/dist/chunk-22ZGZTGY.js +0 -67
  208. package/dist/chunk-22ZGZTGY.js.map +0 -1
  209. package/dist/chunk-6PJVJEYQ.js +0 -46
  210. package/dist/chunk-6PJVJEYQ.js.map +0 -1
  211. package/dist/chunk-C2XKXERJ.js.map +0 -1
  212. package/dist/chunk-TMBAVPHH.js.map +0 -1
  213. package/dist/chunk-V36NXMHP.js +0 -299
  214. package/dist/chunk-V36NXMHP.js.map +0 -1
  215. package/dist/templates/agent-plugin/agents/design.md +0 -134
  216. package/dist/templates/agent-plugin/agents/requirements.md +0 -138
  217. package/dist/templates/begin.md +0 -22
  218. package/dist/templates/nvim-tutorial.txt +0 -68
  219. package/dist/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  220. package/dist/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  221. package/dist/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  222. package/dist/templates/orchestrator-strategy.md +0 -238
  223. package/templates/agent-plugin/agents/design.md +0 -134
  224. package/templates/agent-plugin/agents/requirements.md +0 -138
  225. package/templates/begin.md +0 -22
  226. package/templates/nvim-tutorial.txt +0 -68
  227. package/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  228. package/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  229. package/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  230. package/templates/orchestrator-strategy.md +0 -238
  231. /package/dist/{paths-XRDEEJ5R.js.map → paths-JXFLR5BN.js.map} +0 -0
package/dist/tui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tui/terminal.ts","../src/tui/state.ts","../src/tui/app.ts","../src/tui/input.ts","../src/tui/lib/tree.ts","../src/tui/lib/format.ts","../src/tui/render.ts","../src/tui/panels/overlays.ts","../src/tui/lib/tree-render.ts","../src/tui/lib/client.ts","../src/tui/lib/tmux.ts","../src/tui/lib/clipboard.ts","../src/tui/panels/tree.ts","../src/tui/panels/detail.ts","../src/tui/panels/nvim-detail.ts","../src/tui/panels/bottom.ts","../src/tui/lib/nvim-bridge.ts","../src/tui/lib/overview-writer.ts","../src/tui/index.ts"],"sourcesContent":["export interface Key {\n upArrow: boolean;\n downArrow: boolean;\n leftArrow: boolean;\n rightArrow: boolean;\n pageUp: boolean;\n pageDown: boolean;\n return: boolean;\n escape: boolean;\n ctrl: boolean;\n shift: boolean;\n tab: boolean;\n backspace: boolean;\n delete: boolean;\n meta: boolean;\n}\n\nexport type KeypressHandler = (input: string, key: Key) => void;\n\nfunction emptyKey(): Key {\n return {\n upArrow: false,\n downArrow: false,\n leftArrow: false,\n rightArrow: false,\n pageUp: false,\n pageDown: false,\n return: false,\n escape: false,\n ctrl: false,\n shift: false,\n tab: false,\n backspace: false,\n delete: false,\n meta: false,\n };\n}\n\n// ── Terminal Setup/Teardown ──────────────────────────────────────────────────\n\nexport function setupTerminal(): () => void {\n let cleaned = false;\n\n const cleanup = (): void => {\n if (cleaned) return;\n cleaned = true;\n process.stdout.write('\\x1b[?25h\\x1b[?1049l');\n process.stdin.setRawMode(false);\n process.stdin.pause();\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf-8');\n process.stdout.write('\\x1b[?1049h\\x1b[?25l\\x1b[2J');\n\n process.on('SIGINT', () => { cleanup(); process.exit(0); });\n process.on('SIGTERM', () => { cleanup(); process.exit(0); });\n process.on('exit', cleanup);\n process.on('uncaughtException', (err) => {\n cleanup();\n console.error(err);\n process.exit(1);\n });\n\n return cleanup;\n}\n\n// ── Stdout Write Helper ──────────────────────────────────────────────────────\n\nexport function writeToStdout(data: string): void {\n process.stdout.write(data);\n}\n\n// ── Keypress Parser ──────────────────────────────────────────────────────────\n\n/**\n * Parse all complete key sequences from a buffer string.\n * Returns an array of [input, Key] pairs and the remaining unparsed buffer.\n */\nfunction parseBuffer(buf: string): { events: Array<[string, Key]>; remaining: string } {\n const events: Array<[string, Key]> = [];\n\n let i = 0;\n while (i < buf.length) {\n const ch = buf[i]!;\n\n // ESC prefix sequences\n if (ch === '\\x1b') {\n const rest = buf.slice(i + 1);\n\n // CSI sequences: \\x1b[...\n if (rest.startsWith('[')) {\n const after = rest.slice(1);\n\n // Shift+Arrow: \\x1b[1;2A/B/C/D\n const shiftArrow = after.match(/^1;2([ABCD])/);\n if (shiftArrow) {\n const key = emptyKey();\n key.shift = true;\n const dir = shiftArrow[1]!;\n if (dir === 'A') key.upArrow = true;\n else if (dir === 'B') key.downArrow = true;\n else if (dir === 'C') key.rightArrow = true;\n else if (dir === 'D') key.leftArrow = true;\n const seq = `\\x1b[1;2${dir}`;\n events.push([seq, key]);\n i += seq.length;\n continue;\n }\n\n // Arrow keys: \\x1b[A/B/C/D\n if (after.length >= 1 && 'ABCD'.includes(after[0]!)) {\n const key = emptyKey();\n const dir = after[0]!;\n if (dir === 'A') key.upArrow = true;\n else if (dir === 'B') key.downArrow = true;\n else if (dir === 'C') key.rightArrow = true;\n else if (dir === 'D') key.leftArrow = true;\n const seq = `\\x1b[${dir}`;\n events.push([seq, key]);\n i += seq.length;\n continue;\n }\n\n // Tilde sequences: \\x1b[N~\n const tildeMatch = after.match(/^(\\d+)~/);\n if (tildeMatch) {\n const num = tildeMatch[1]!;\n const key = emptyKey();\n if (num === '5') key.pageUp = true;\n else if (num === '6') key.pageDown = true;\n else if (num === '3') key.delete = true;\n const seq = `\\x1b[${num}~`;\n events.push([seq, key]);\n i += seq.length;\n continue;\n }\n\n // Incomplete CSI — need more data\n return { events, remaining: buf.slice(i) };\n }\n\n // Lone ESC — signal caller to wait (disambiguate vs CSI prefix)\n if (rest.length === 0) {\n return { events, remaining: buf.slice(i) };\n }\n\n // \\x1b + regular char → Meta key\n const metaCh = rest[0]!;\n const key = emptyKey();\n key.meta = true;\n events.push([metaCh, key]);\n i += 2;\n continue;\n }\n\n // Return\n if (ch === '\\r') {\n const key = emptyKey();\n key.return = true;\n events.push([ch, key]);\n i++;\n continue;\n }\n\n // Tab\n if (ch === '\\t') {\n const key = emptyKey();\n key.tab = true;\n events.push([ch, key]);\n i++;\n continue;\n }\n\n // Backspace (DEL or BS)\n if (ch === '\\x7f' || ch === '\\x08') {\n const key = emptyKey();\n key.backspace = true;\n events.push([ch, key]);\n i++;\n continue;\n }\n\n // Ctrl+A–Z (\\x01–\\x1a)\n const code = ch.charCodeAt(0);\n if (code >= 0x01 && code <= 0x1a) {\n const key = emptyKey();\n key.ctrl = true;\n const letter = String.fromCharCode(code + 96);\n events.push([letter, key]);\n i++;\n continue;\n }\n\n // Printable / multibyte char\n events.push([ch, emptyKey()]);\n i++;\n }\n\n return { events, remaining: '' };\n}\n\n// ── Raw Stdin Bypass (for neovim PTY forwarding) ─────────────────────────────\n\nlet rawBypassHandler: ((data: string) => boolean) | null = null;\n\nexport function setRawBypass(handler: ((data: string) => boolean) | null): void {\n rawBypassHandler = handler;\n}\n\nexport function startKeypressListener(handler: KeypressHandler): () => void {\n let buffer = '';\n let escTimer: ReturnType<typeof setTimeout> | null = null;\n\n const onData = (data: string): void => {\n // Raw bypass — forward to neovim PTY if active\n if (rawBypassHandler) {\n const handled = rawBypassHandler(data);\n if (handled) return;\n }\n\n // Cancel pending escape timer — more data arrived\n if (escTimer !== null) {\n clearTimeout(escTimer);\n escTimer = null;\n }\n\n buffer += data;\n\n const { events, remaining } = parseBuffer(buffer);\n buffer = remaining;\n\n for (const [input, key] of events) {\n handler(input, key);\n }\n\n // If buffer ends with lone ESC, start disambiguation timer\n if (buffer === '\\x1b') {\n escTimer = setTimeout(() => {\n escTimer = null;\n buffer = '';\n const key = emptyKey();\n key.escape = true;\n handler('\\x1b', key);\n }, 50);\n }\n };\n\n process.stdin.on('data', onData);\n\n return (): void => {\n process.stdin.off('data', onData);\n if (escTimer !== null) {\n clearTimeout(escTimer);\n escTimer = null;\n }\n };\n}\n\n// ── Resize Handler ───────────────────────────────────────────────────────────\n\nexport function onResize(callback: () => void): () => void {\n const onStdoutResize = (): void => callback();\n const onSigwinch = (): void => callback();\n\n process.stdout.on('resize', onStdoutResize);\n process.on('SIGWINCH', onSigwinch);\n\n return (): void => {\n process.stdout.off('resize', onStdoutResize);\n process.off('SIGWINCH', onSigwinch);\n };\n}\n","import type { Session } from '../shared/types.js';\nimport type { TreeNode } from './types/tree.js';\nimport type { ReportBlock } from './lib/reports.js';\n\n// ---------------------------------------------------------------------------\n// Polling data interfaces (moved from usePolling.ts)\n// ---------------------------------------------------------------------------\n\nexport interface SessionSummary {\n id: string;\n name?: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n tmuxWindowId?: string;\n /** Cached result of windowExists check — avoids synchronous subprocess in render */\n windowAlive?: boolean;\n}\n\nexport interface CycleLog {\n cycle: number;\n content: string;\n}\n\n// ---------------------------------------------------------------------------\n// InputMode (moved from InputBar.tsx)\n// ---------------------------------------------------------------------------\n\nexport type InputMode =\n | 'navigate'\n | 'report-detail'\n | 'leader'\n | 'copy-menu'\n | 'help'\n | 'companion-overlay'\n | 'companion-debug'\n | 'compose'\n | 'search';\n\n// ---------------------------------------------------------------------------\n// Compose mode types\n// ---------------------------------------------------------------------------\n\nexport type ComposeAction =\n | { kind: 'new-session' }\n | { kind: 'message-orchestrator'; sessionId: string }\n | { kind: 'resume'; sessionId: string }\n | { kind: 'continue'; sessionId: string }\n | { kind: 'spawn-agent'; sessionId: string }\n | { kind: 'message-agent'; sessionId: string; agentId: string };\n\n/** Actions where empty content is allowed (submit without typing) */\nexport const OPTIONAL_COMPOSE = new Set(['resume', 'continue']);\n\n/** Display labels for compose actions */\nexport const COMPOSE_HEADERS: Record<ComposeAction['kind'], string> = {\n 'new-session': 'New Session',\n 'message-orchestrator': 'Message Orchestrator',\n 'resume': 'Resume Session',\n 'continue': 'Continue Session',\n 'spawn-agent': 'Spawn Agent',\n 'message-agent': 'Message Agent',\n};\n\n// ---------------------------------------------------------------------------\n// Render scheduling\n// ---------------------------------------------------------------------------\n\nlet renderScheduled = false;\nlet renderFn: (() => void) | null = null;\n\nexport function setRenderFunction(fn: () => void): void {\n renderFn = fn;\n}\n\nexport function requestRender(): void {\n if (renderScheduled) return;\n renderScheduled = true;\n setImmediate(() => {\n renderScheduled = false;\n renderFn?.();\n });\n}\n\n// ---------------------------------------------------------------------------\n// ThrottledScroll\n// ---------------------------------------------------------------------------\n\nconst FRAME_MS = 16; // ~60fps\n\nexport class ThrottledScroll {\n offset: number = 0;\n private target: number = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private onRender: () => void;\n\n constructor(onRender: () => void, initial = 0) {\n this.onRender = onRender;\n this.offset = initial;\n this.target = initial;\n }\n\n private scheduleFlush(): void {\n if (this.timer === null) {\n this.timer = setTimeout(() => {\n this.timer = null;\n this.offset = this.target;\n this.onRender();\n }, FRAME_MS);\n }\n }\n\n scrollBy(delta: number): void {\n this.target = Math.max(0, this.target + delta);\n this.scheduleFlush();\n }\n\n scrollTo(value: number): void {\n this.target = Math.max(0, value);\n this.scheduleFlush();\n }\n\n reset(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.target = 0;\n this.offset = 0;\n }\n\n destroy(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// AppState\n// ---------------------------------------------------------------------------\n\nexport interface AppState {\n // Terminal dimensions\n rows: number;\n cols: number;\n\n // Tree navigation\n cursorIndex: number;\n expanded: Set<string>;\n mode: InputMode;\n focusPane: 'tree' | 'detail' | 'logs';\n\n // Session\n selectedSessionId: string | null;\n searchFilter: string | null;\n searchText: string;\n targetAgentId: string | null;\n\n // UI\n notification: string | null;\n notificationTimer: ReturnType<typeof setTimeout> | null;\n showCombinedView: boolean;\n\n // Scroll\n detailScroll: ThrottledScroll;\n logsScroll: ThrottledScroll;\n\n // Polling data (from daemon)\n sessions: SessionSummary[];\n selectedSession: Session | null;\n planContent: string;\n strategyContent: string;\n goalContent: string;\n logsContent: string;\n logsCycles: CycleLog[];\n paneAlive: boolean;\n contextFiles: string[];\n error: string | null;\n\n // Cursor stabilization\n cursorNodeId: string | null;\n prevNodes: TreeNode[];\n prevCycleCount: number;\n\n // Render caches\n cachedReportBlocks: Map<string, ReportBlock[]>;\n cachedTreeNodes: TreeNode[] | null;\n treeCacheKey: string;\n cachedDetailLines: import('./lib/format.js').DetailLine[] | null;\n detailCacheKey: string;\n detailRenderedCache: import('./render.js').RenderedCache;\n cachedLogsLines: import('./lib/format.js').DetailLine[] | null;\n logsCacheKey: string;\n logsRenderedCache: import('./render.js').RenderedCache;\n\n // Neovim integration\n nvimBridge: import('./lib/nvim-bridge.js').NvimBridge | null;\n nvimEnabled: boolean;\n prevNvimFile: string | null;\n nvimEditable: boolean;\n nvimOpenTabs: Map<string, { path: string; readonly: boolean }>;\n\n // Compose mode\n composeAction: ComposeAction | null;\n composeTempFile: string | null;\n composeSignalFile: string | null;\n composePollTimer: ReturnType<typeof setInterval> | null;\n composePrevNvimFile: string | null;\n\n // Config\n cwd: string;\n}\n\nexport function createAppState(cwd: string): AppState {\n const cols = process.stdout.columns ?? 80;\n const rows = process.stdout.rows ?? 24;\n\n const detailScroll = new ThrottledScroll(requestRender);\n const logsScroll = new ThrottledScroll(requestRender);\n\n return {\n rows,\n cols,\n cursorIndex: 0,\n expanded: new Set(),\n mode: 'navigate',\n focusPane: 'tree',\n selectedSessionId: null,\n searchFilter: null,\n searchText: '',\n targetAgentId: null,\n notification: null,\n notificationTimer: null,\n showCombinedView: false,\n detailScroll,\n logsScroll,\n sessions: [],\n selectedSession: null,\n planContent: '',\n strategyContent: '',\n goalContent: '',\n logsContent: '',\n logsCycles: [],\n paneAlive: true,\n contextFiles: [],\n error: null,\n cursorNodeId: null,\n prevNodes: [],\n prevCycleCount: 0,\n cachedReportBlocks: new Map(),\n cachedTreeNodes: null,\n treeCacheKey: '',\n cachedDetailLines: null,\n detailCacheKey: '',\n detailRenderedCache: { lines: [], ansi: [] },\n cachedLogsLines: null,\n logsCacheKey: '',\n logsRenderedCache: { lines: [], ansi: [] },\n nvimBridge: null,\n nvimEnabled: true,\n prevNvimFile: null,\n nvimEditable: false,\n nvimOpenTabs: new Map(),\n composeAction: null,\n composeTempFile: null,\n composeSignalFile: null,\n composePollTimer: null,\n composePrevNvimFile: null,\n cwd,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Notification helper\n// ---------------------------------------------------------------------------\n\nexport function notify(state: AppState, msg: string): void {\n state.notification = msg;\n if (state.notificationTimer !== null) {\n clearTimeout(state.notificationTimer);\n }\n state.notificationTimer = setTimeout(() => {\n state.notification = null;\n state.notificationTimer = null;\n requestRender();\n }, 3000);\n}\n\n// ---------------------------------------------------------------------------\n// Cursor stabilization\n// ---------------------------------------------------------------------------\n\nexport function stabilizeCursor(state: AppState, nodes: TreeNode[]): void {\n if (nodes.length === 0) {\n state.cursorIndex = 0;\n return;\n }\n\n const targetId = state.cursorNodeId;\n if (targetId === null) {\n state.cursorNodeId = nodes[0]?.id ?? null;\n return;\n }\n\n // If current index already points to the right node, no adjustment needed\n if (nodes[state.cursorIndex]?.id === targetId) return;\n\n // Find the tracked node in the new tree\n const newIndex = nodes.findIndex((n) => n.id === targetId);\n if (newIndex !== -1) {\n state.cursorIndex = newIndex;\n } else {\n // Node is gone (parent collapsed, session removed, etc.) — clamp\n const clamped = Math.min(state.cursorIndex, nodes.length - 1);\n state.cursorIndex = clamped;\n state.cursorNodeId = nodes[clamped]?.id ?? null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Auto-expand cycle\n// ---------------------------------------------------------------------------\n\nexport function autoExpandCycle(state: AppState): void {\n const selectedSession = state.selectedSession;\n if (!selectedSession) return;\n\n const sessionNodeId = `session:${selectedSession.id}`;\n const cycles = selectedSession.orchestratorCycles;\n\n // Only auto-manage cycle expansion if the session is already expanded by user\n if (!state.expanded.has(sessionNodeId)) {\n state.prevCycleCount = cycles.length;\n return;\n }\n\n if (cycles.length === 0) {\n state.prevCycleCount = 0;\n return;\n }\n\n const latest = cycles[cycles.length - 1]!;\n const latestId = `cycle:${selectedSession.id}:${latest.cycle}`;\n\n if (cycles.length > state.prevCycleCount && state.prevCycleCount > 0) {\n // New cycle appeared — collapse previous, expand latest\n const prevCycle = cycles[cycles.length - 2];\n if (prevCycle) {\n const prevId = `cycle:${selectedSession.id}:${prevCycle.cycle}`;\n state.expanded.delete(prevId);\n state.expanded.add(latestId);\n }\n } else if (!state.expanded.has(latestId)) {\n // Ensure latest is expanded\n state.expanded.add(latestId);\n }\n\n state.prevCycleCount = cycles.length;\n}\n","import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport {\n type AppState,\n type SessionSummary,\n type CycleLog,\n setRenderFunction,\n requestRender,\n stabilizeCursor,\n autoExpandCycle,\n notify,\n} from './state.js';\nimport { handleKeypress, type InputActions } from './input.js';\nimport { createFrameBuffer, flushFrame, writeCenter, copyRows } from './render.js';\nimport { writeToStdout, startKeypressListener, onResize } from './terminal.js';\nimport { buildTree } from './lib/tree.js';\nimport { precomputePrefixes } from './lib/tree-render.js';\nimport { resolveReports } from './lib/reports.js';\nimport { send } from './lib/client.js';\nimport {\n listAllWindowIds,\n openEditorPopup,\n editInPopup,\n openCompanionPane,\n openClaudeResumePopup,\n openClaudeResumeSession,\n selectWindow,\n selectPane,\n switchToSession,\n openLogPopup,\n openShellPopup,\n openInFileManager,\n} from './lib/tmux.js';\nimport { copyToClipboard } from './lib/clipboard.js';\nimport { buildSessionContext } from './lib/context.js';\nimport { renderTreePanel } from './panels/tree.js';\nimport { renderDetailRows, renderLogsRows, type DetailContext } from './panels/detail.js';\nimport { renderNvimDetailRows } from './panels/nvim-detail.js';\nimport { renderStatusLine } from './panels/bottom.js';\nimport { renderLeaderOverlay, renderCopyMenuOverlay, renderHelpOverlay, renderCompanionOverlay, renderCompanionDebugOverlay } from './panels/overlays.js';\nimport { companionPath } from '../shared/paths.js';\nimport type { CompanionState } from '../shared/companion-types.js';\nimport { NvimBridge } from './lib/nvim-bridge.js';\nimport { resolveNvimFile } from './lib/overview-writer.js';\nimport { loadConfig } from '../shared/config.js';\nimport { roadmapPath, goalPath, strategyPath, logsDir, contextDir } from '../shared/paths.js';\nimport { statusIndicator, formatDuration, statusColor, agentStatusIcon, agentDisplayName, truncate, ansiColor, ansiDim, ansiBold } from './lib/format.js';\nimport { COMPOSE_HEADERS } from './state.js';\nimport type { TreeNode } from './types/tree.js';\nimport type { Agent, Session } from '../shared/types.js';\n\n// ── Module-level companion cache (reloads on mtime change, ~poll interval) ────\n\nlet _cachedCompanion: CompanionState | null = null;\nlet _companionMtime = 0;\n\nfunction getCompanion(): CompanionState | null {\n try {\n const { mtimeMs } = statSync(companionPath());\n if (_cachedCompanion && mtimeMs === _companionMtime) return _cachedCompanion;\n _companionMtime = mtimeMs;\n _cachedCompanion = JSON.parse(readFileSync(companionPath(), 'utf-8')) as CompanionState;\n return _cachedCompanion;\n } catch {\n return _cachedCompanion;\n }\n}\n\n// ── Module-level cache for latest rendered nodes (needed by keypress handler) ─\n\nlet latestNodes: TreeNode[] = [];\n\n// ── Module-level cache for context file content ───────────────────────────────\n\nlet cachedContextFilePath: string | null = null;\nlet cachedContextFileContent: string | null = null;\n\n// ── Previous frame for diffing ────────────────────────────────────────────────\n\nlet prevFrame: string[] = [];\n\n// ── Panel dirty tracking ─────────────────────────────────────────────────────\n// Tracks the inputs that affect each panel. When only the scroll offset changes,\n// we can skip re-rendering panels whose inputs haven't changed.\n\nlet prevTreeInputs = '';\nlet prevBottomInputs = '';\nlet prevOverlayMode = '';\nlet cachedTreeRows: string[] = [];\n\n// ── Cycle logs cache (avoids re-reading unchanged files every poll) ───────────\n\nlet cachedLogSessionId: string | null = null;\nlet cachedLogFiles: Map<string, { mtime: number; cycle: number; content: string }> = new Map();\n\n// ── Status header constants ──────────────────────────────────────────────────\n\nconst STATUS_ROW_COUNT = 2; // Fixed height for status header (avoids nvim resize on cursor change)\n\nfunction buildStatusRows(\n cursorNode: TreeNode | undefined,\n session: Session | null,\n state: AppState,\n): string[] {\n if (!cursorNode || !session) {\n return [ansiDim(' No session selected'), ''];\n }\n\n const dur = formatDuration(session.createdAt, session.completedAt);\n const indicator = statusIndicator(session.status);\n const sColor = statusColor(session.status);\n const title = truncate(session.name ?? session.task, 40);\n\n switch (cursorNode.type) {\n case 'session': {\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true),\n ' ' + ansiDim(`${session.status} · ${session.orchestratorCycles.length} cycles · ${session.agents.length} agents · ${dur}`),\n ];\n }\n case 'cycle': {\n const cycle = session.orchestratorCycles.find(c => c.cycle === cursorNode.cycleNumber);\n if (!cycle) return [' ' + ansiColor(title, 'white', true), ''];\n const cDur = cycle.completedAt ? formatDuration(cycle.timestamp, cycle.completedAt) : 'running';\n const cStatus = cycle.completedAt ? 'completed' : 'running';\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true) + ansiDim(` · Cycle ${cycle.cycle}`),\n ' ' + ansiDim(`${cStatus} · ${cDur} · ${cycle.agentsSpawned.length} agents`),\n ];\n }\n case 'agent':\n case 'report': {\n const agentId = cursorNode.type === 'agent' ? cursorNode.agentId : cursorNode.agentId;\n const agent = session.agents.find(a => a.id === agentId);\n if (!agent) return [' ' + ansiColor(title, 'white', true), ''];\n const aIcon = agentStatusIcon(agent.status);\n const aDur = formatDuration(agent.spawnedAt, agent.completedAt);\n const aName = agentDisplayName(agent);\n return [\n ' ' + ansiColor(aIcon, statusColor(agent.status === 'running' ? 'active' : agent.status), true) + ' ' + ansiColor(`${agent.id} · ${aName}`, 'white', true),\n ' ' + ansiDim(`${agent.status} · ${agent.agentType || '—'} · ${aDur}`),\n ];\n }\n case 'context-file': {\n const name = cursorNode.filePath.split('/').pop() ?? cursorNode.filePath;\n return [\n ' ' + ansiColor('⊞', 'white') + ' ' + ansiColor(name, 'white', true),\n ' ' + ansiDim(`context file · ${session.status}`),\n ];\n }\n case 'messages':\n case 'message': {\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true),\n ' ' + ansiDim(`${session.messages.length} messages`),\n ];\n }\n default: {\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true),\n ' ' + ansiDim(`${session.status} · ${dur}`),\n ];\n }\n }\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction getAgentForNode(node: TreeNode | undefined, agents: Agent[]): Agent | null {\n if (!node) return null;\n if (node.type === 'agent' || node.type === 'report') {\n return agents.find((a) => a.id === node.agentId) ?? null;\n }\n return null;\n}\n\n// ── startApp ──────────────────────────────────────────────────────────────────\n\nexport function startApp(state: AppState, cleanup: () => void): void {\n const config = loadConfig(state.cwd);\n\n // Initialize NvimBridge\n const treeWidth = 36;\n const initialDetailW = (state.cols - treeWidth) - 4; // detail width minus borders\n const initialDetailH = (state.rows - 1) - 2 - STATUS_ROW_COUNT - 1; // content height minus borders, status, separator\n const bridge = new NvimBridge(\n Math.max(1, initialDetailW),\n Math.max(1, initialDetailH),\n requestRender,\n );\n state.nvimBridge = bridge.available ? bridge : null;\n state.nvimEnabled = bridge.available;\n\n // Track selectedSessionId to detect changes across renders (for immediate poll)\n let prevSelectedSessionId: string | null | undefined = undefined;\n let debouncedPollTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ── Polling ─────────────────────────────────────────────────────────────────\n\n async function poll(): Promise<void> {\n try {\n let selectedSession: Session | null = null;\n let planContent = '';\n let strategyContent = '';\n let goalContent = '';\n let logsContent = '';\n let logsCycles: CycleLog[] = [];\n let paneAlive = true;\n let contextFiles: string[] = [];\n\n const listPromise = send({ type: 'list', cwd: state.cwd });\n const statusPromise = state.selectedSessionId\n ? send({ type: 'status', sessionId: state.selectedSessionId, cwd: state.cwd })\n : null;\n\n const [listRes, statusRes] = await Promise.all([\n listPromise,\n statusPromise ?? Promise.resolve(null),\n ]);\n\n const sessions: SessionSummary[] = listRes.ok\n ? ((listRes.data?.sessions as SessionSummary[] | undefined) ?? [])\n : [];\n\n // Batch-check window existence in a single tmux call\n const aliveWindows = listAllWindowIds();\n for (const s of sessions) {\n if (s.status !== 'completed' && s.tmuxWindowId) {\n s.windowAlive = aliveWindows.has(s.tmuxWindowId);\n }\n }\n\n if (state.selectedSessionId) {\n if (statusRes?.ok) {\n selectedSession = (statusRes.data?.session as Session | undefined) ?? null;\n }\n\n // Use cached windowAlive from the session list scan above\n if (selectedSession?.tmuxWindowId) {\n const cached = sessions.find((s) => s.id === state.selectedSessionId);\n paneAlive = cached?.windowAlive ?? false;\n }\n\n try {\n const pp = roadmapPath(state.cwd, state.selectedSessionId);\n if (existsSync(pp)) {\n planContent = readFileSync(pp, 'utf-8');\n }\n } catch {\n // roadmap.md may not exist yet\n }\n\n try {\n const gp = goalPath(state.cwd, state.selectedSessionId);\n if (existsSync(gp)) {\n goalContent = readFileSync(gp, 'utf-8');\n }\n } catch {\n // goal.md may not exist yet\n }\n\n try {\n const sp = strategyPath(state.cwd, state.selectedSessionId);\n if (existsSync(sp)) {\n strategyContent = readFileSync(sp, 'utf-8');\n }\n } catch {\n // strategy.md may not exist yet\n }\n\n try {\n const ld = logsDir(state.cwd, state.selectedSessionId);\n if (existsSync(ld)) {\n // Reset cache when session changes\n if (state.selectedSessionId !== cachedLogSessionId) {\n cachedLogFiles = new Map();\n cachedLogSessionId = state.selectedSessionId;\n }\n\n const files = readdirSync(ld)\n .filter((f) => f.startsWith('cycle-'))\n .sort();\n\n // Remove cache entries for deleted files\n const fileSet = new Set(files);\n for (const key of cachedLogFiles.keys()) {\n if (!fileSet.has(key)) cachedLogFiles.delete(key);\n }\n\n // Only re-read files whose mtime changed\n for (const f of files) {\n const filePath = join(ld, f);\n const mtime = statSync(filePath).mtimeMs;\n const cached = cachedLogFiles.get(f);\n if (!cached || cached.mtime !== mtime) {\n const match = f.match(/cycle-(\\d+)\\.md$/);\n const cycle = match ? parseInt(match[1]!, 10) : 0;\n const content = readFileSync(filePath, 'utf-8');\n cachedLogFiles.set(f, { mtime, cycle, content });\n }\n }\n\n logsCycles = files.map((f) => {\n const entry = cachedLogFiles.get(f)!;\n return { cycle: entry.cycle, content: entry.content };\n });\n logsContent = logsCycles.map((c) => c.content).join('\\n');\n }\n } catch {\n // logs may not exist yet\n }\n\n try {\n const cd = contextDir(state.cwd, state.selectedSessionId);\n if (existsSync(cd)) {\n contextFiles = readdirSync(cd)\n .filter((f) => !f.startsWith('.'))\n .sort();\n }\n } catch {\n // context dir may not exist yet\n }\n }\n\n // Resolve report files in poll (not render) to avoid sync disk reads on keypress\n state.cachedReportBlocks.clear();\n if (selectedSession) {\n for (const agent of selectedSession.agents) {\n state.cachedReportBlocks.set(agent.id, resolveReports(agent.reports));\n }\n }\n\n state.sessions = sessions;\n state.selectedSession = selectedSession;\n state.planContent = planContent;\n state.strategyContent = strategyContent;\n state.goalContent = goalContent;\n state.logsContent = logsContent;\n state.logsCycles = logsCycles;\n state.paneAlive = paneAlive;\n state.contextFiles = contextFiles;\n state.error = null;\n\n // Merge-check editable files; falls back to checktime for readonly buffers\n if (state.nvimEnabled && state.nvimBridge?.ready && state.prevNvimFile) {\n const mergeStatus = state.nvimBridge.mergeCheckOrReload();\n if (mergeStatus === 'clean') {\n notify(state, 'Auto-merged external changes');\n } else if (mergeStatus === 'union') {\n notify(state, 'Auto-merged overlapping edits — review buffer');\n }\n }\n\n requestRender();\n } catch (err) {\n state.error = (err as Error).message;\n requestRender();\n }\n }\n\n // ── Render function ──────────────────────────────────────────────────────────\n\n function render(): void {\n const stdoutRows = process.stdout.rows;\n const stdoutCols = process.stdout.columns;\n state.rows = (typeof stdoutRows === 'number' && stdoutRows > 0) ? stdoutRows : 24;\n state.cols = (typeof stdoutCols === 'number' && stdoutCols > 0) ? stdoutCols : 80;\n\n const buf = createFrameBuffer(state.cols, state.rows);\n\n // Terminal too small\n if (state.cols < 60 || state.rows < 12) {\n writeCenter(buf, Math.floor(state.rows / 2), 'Terminal too small — resize to continue');\n const out = flushFrame(buf.lines, prevFrame);\n writeToStdout(out);\n prevFrame = buf.lines;\n return;\n }\n\n // Compute layout\n const treeWidth = 36;\n const remaining = state.cols - treeWidth;\n const detailWidth = state.showCombinedView ? Math.floor(remaining * 0.6) : remaining;\n const logsWidth = state.showCombinedView ? remaining - detailWidth : 0;\n const contentHeight = state.rows - 1;\n\n const treeRect = { x: 0, y: 0, w: treeWidth, h: contentHeight };\n const detailRect = { x: treeWidth, y: 0, w: detailWidth, h: contentHeight };\n const logsRect = state.showCombinedView\n ? { x: treeWidth + detailWidth, y: 0, w: logsWidth, h: contentHeight }\n : null;\n const bottomY = contentHeight;\n\n // Derive data\n const filteredSessions: SessionSummary[] = state.searchFilter\n ? state.sessions.filter((s) => {\n const q = state.searchFilter!.toLowerCase();\n return s.task.toLowerCase().includes(q) || s.id.toLowerCase().includes(q);\n })\n : state.sessions;\n\n const cacheKey = `${state.expanded.size}:${filteredSessions.length}:${state.selectedSession?.id}:${state.contextFiles.length}:${state.searchFilter}`;\n let nodes: TreeNode[];\n if (cacheKey === state.treeCacheKey && state.cachedTreeNodes !== null) {\n nodes = state.cachedTreeNodes;\n } else {\n nodes = buildTree(\n filteredSessions,\n state.selectedSession,\n state.expanded,\n state.cwd,\n state.contextFiles,\n );\n precomputePrefixes(nodes);\n state.cachedTreeNodes = nodes;\n state.treeCacheKey = cacheKey;\n }\n\n // Cursor stabilization\n stabilizeCursor(state, nodes);\n\n // Cache latest nodes for keypress handler\n latestNodes = nodes;\n\n // Track cursor node identity\n const cursorNode = nodes[state.cursorIndex];\n if (cursorNode) state.cursorNodeId = cursorNode.id;\n\n // Derive selectedSessionId from cursor\n const newSessionId = cursorNode?.sessionId ?? null;\n if (newSessionId !== state.selectedSessionId) {\n state.selectedSessionId = newSessionId;\n state.detailScroll.reset();\n state.logsScroll.reset();\n state.cachedDetailLines = null;\n state.detailCacheKey = '';\n state.prevNvimFile = null;\n state.cachedLogsLines = null;\n state.logsCacheKey = '';\n }\n\n // Trigger debounced poll when session changes (avoids poll storm during rapid scrolling)\n if (state.selectedSessionId !== prevSelectedSessionId) {\n prevSelectedSessionId = state.selectedSessionId;\n if (debouncedPollTimer !== null) clearTimeout(debouncedPollTimer);\n if (state.selectedSessionId !== null) {\n debouncedPollTimer = setTimeout(() => {\n debouncedPollTimer = null;\n void poll();\n }, 80);\n }\n }\n\n // Auto-expand cycle\n autoExpandCycle(state);\n\n // Resolve reports for detail panel\n const agents = state.selectedSession?.agents ?? [];\n const reportAgent =\n state.mode === 'report-detail' ? getAgentForNode(cursorNode, agents) : null;\n const reportBlocks = reportAgent ? (state.cachedReportBlocks.get(reportAgent.id) ?? []) : [];\n\n const detailAgent =\n cursorNode?.type === 'agent' || cursorNode?.type === 'report'\n ? getAgentForNode(cursorNode, agents)\n : null;\n const detailReportBlocks = detailAgent\n ? (state.cachedReportBlocks.get(detailAgent.id) ?? [])\n : [];\n\n // Load context file content (cached to avoid re-read on every render)\n let contextFileContent: string | null = null;\n if (cursorNode?.type === 'context-file') {\n if (cursorNode.filePath !== cachedContextFilePath) {\n cachedContextFilePath = cursorNode.filePath;\n try {\n if (existsSync(cursorNode.filePath)) {\n cachedContextFileContent = readFileSync(cursorNode.filePath, 'utf-8');\n } else {\n cachedContextFileContent = null;\n }\n } catch {\n cachedContextFileContent = null;\n }\n }\n contextFileContent = cachedContextFileContent;\n } else {\n // Clear cache when cursor moves away\n cachedContextFilePath = null;\n cachedContextFileContent = null;\n }\n\n // Panel dirty tracking — compute fingerprints for each panel's inputs\n const treeFocused = state.mode === 'navigate' && state.focusPane === 'tree';\n const treeInputs = `${state.treeCacheKey}:${state.cursorIndex}:${treeFocused}`;\n const bottomInputs = `${state.notification}:${state.error}:${state.mode}:${state.searchText}:${cursorNode?.type}`;\n const overlayMode = state.mode === 'leader' || state.mode === 'copy-menu' || state.mode === 'help' || state.mode === 'companion-overlay' || state.mode === 'companion-debug' ? state.mode : '';\n let companionFP = '';\n if (state.mode === 'companion-overlay' || state.mode === 'companion-debug') {\n const c = getCompanion();\n const ts = c && c.lastCommentary ? c.lastCommentary.timestamp : '';\n const xp = c ? c.xp : 0;\n const dm = c?.debugMood ? `${c.debugMood.winner}:${c.debugMood.scores[c.debugMood.winner]}` : '';\n companionFP = `${ts}:${xp}:${dm}`;\n }\n const overlayInputs = `${overlayMode}:${companionFP}`;\n\n const hasPrev = prevFrame.length === buf.height;\n const treeDirty = !hasPrev || treeInputs !== prevTreeInputs;\n const bottomDirty = !hasPrev || bottomInputs !== prevBottomInputs;\n const overlayDirty = !hasPrev || overlayInputs !== prevOverlayMode;\n\n prevTreeInputs = treeInputs;\n prevBottomInputs = bottomInputs;\n prevOverlayMode = overlayInputs;\n\n // Render tree into a narrow buffer (treeWidth-wide) so rows are the right size\n // for concatenation. Cached when clean.\n let treeRows: string[];\n if (treeDirty) {\n const treeBlank = ' '.repeat(treeWidth);\n const treeBuf: import('./render.js').FrameBuffer = {\n lines: Array.from({ length: contentHeight }, () => treeBlank),\n width: treeWidth,\n height: contentHeight,\n };\n renderTreePanel(\n treeBuf,\n { x: 0, y: 0, w: treeWidth, h: contentHeight },\n nodes,\n state.cursorIndex,\n treeFocused,\n getCompanion(),\n );\n cachedTreeRows = treeBuf.lines;\n treeRows = treeBuf.lines;\n } else {\n treeRows = cachedTreeRows;\n }\n\n // Render detail + logs as self-contained row strings, then compose by concatenation.\n // This eliminates all sliceDisplayCols calls — the main scroll bottleneck.\n const detailCtx: DetailContext = {\n nodes,\n session: state.selectedSession,\n agents,\n reportBlocks,\n detailReportBlocks,\n contextFileContent,\n };\n\n let detailRows: string[];\n const composing = state.mode === 'compose';\n\n // Auto-respawn nvim if it died (user quit while viewing goal, roadmap, etc.)\n if (state.nvimEnabled && state.nvimBridge && state.nvimBridge.wasReady && !state.nvimBridge.ready && !state.nvimBridge.respawning) {\n state.nvimBridge.respawning = true;\n state.prevNvimFile = null; // force re-resolve after respawn\n state.nvimBridge.respawn().then(() => {\n state.nvimBridge!.respawning = false;\n requestRender();\n }).catch(() => {\n state.nvimBridge!.respawning = false;\n state.nvimEnabled = false;\n requestRender();\n });\n }\n\n if (state.nvimEnabled && state.nvimBridge?.ready) {\n if (composing) {\n // In compose mode, don't resolve nvim files — nvim is showing the compose temp file\n const action = state.composeAction;\n const label = action ? COMPOSE_HEADERS[action.kind] : 'Compose';\n const statusRows = [\n ' ' + ansiColor(label, 'yellow', true),\n ' ' + ansiDim(':w to submit · Tab to cancel'),\n ];\n detailRows = renderNvimDetailRows(detailRect, state.nvimBridge, true, false, statusRows, true);\n } else {\n // Determine which file(s) neovim should display\n const result = resolveNvimFile(state, cursorNode, detailCtx, state.cwd);\n const resultKey = result ? result.files.map(f => f.path).join('|') : null;\n if (resultKey && resultKey !== state.prevNvimFile) {\n state.nvimBridge.openTabFiles(result!.files);\n state.prevNvimFile = resultKey;\n state.nvimEditable = result!.files.some(f => !f.readonly);\n } else if (!resultKey) {\n state.prevNvimFile = null;\n state.nvimEditable = false;\n }\n\n // Build status rows for the header\n const statusRows = buildStatusRows(cursorNode, state.selectedSession, state);\n detailRows = renderNvimDetailRows(detailRect, state.nvimBridge, state.focusPane === 'detail', state.nvimEditable, statusRows);\n }\n } else {\n detailRows = renderDetailRows(detailRect, state, detailCtx);\n }\n const logsRows = logsRect ? renderLogsRows(logsRect, state) : null;\n\n // Compose panel rows into buffer by concatenation (no slicing/splicing)\n for (let i = 0; i < contentHeight; i++) {\n if (logsRows) {\n buf.lines[i] = treeRows[i]! + detailRows[i]! + logsRows[i]!;\n } else {\n buf.lines[i] = treeRows[i]! + detailRows[i]!;\n }\n }\n\n // Bottom row (single status line — notifications replace keybindings transiently)\n if (bottomDirty || overlayDirty) {\n renderStatusLine(buf, bottomY, state, cursorNode?.type);\n } else {\n copyRows(buf, prevFrame, bottomY, 1);\n }\n\n // Overlays (rendered AFTER panels — overwrites panel content)\n if (overlayMode) {\n if (state.mode === 'leader') renderLeaderOverlay(buf, state.rows, state.cols);\n if (state.mode === 'copy-menu') renderCopyMenuOverlay(buf, state.rows, state.cols);\n if (state.mode === 'help') renderHelpOverlay(buf, state.rows, state.cols);\n if (state.mode === 'companion-overlay') {\n const companion = getCompanion();\n if (companion) renderCompanionOverlay(buf, state.rows, state.cols, companion);\n }\n if (state.mode === 'companion-debug') {\n const companion = getCompanion();\n if (companion) renderCompanionDebugOverlay(buf, state.rows, state.cols, companion);\n }\n }\n\n // Build cursor suffix inside synchronized output block to prevent flicker\n let cursorSuffix: string;\n if (state.focusPane === 'detail' && state.nvimBridge?.ready) {\n const cursor = state.nvimBridge.getCursorPos();\n const absX = detailRect.x + 2 + cursor.x;\n // Nvim content starts after: top border (1) + status rows (STATUS_ROW_COUNT) + separator (1)\n const absY = detailRect.y + 1 + STATUS_ROW_COUNT + 1 + cursor.y;\n cursorSuffix = `\\x1b[${state.nvimBridge.cursorStyle} q\\x1b[?25h\\x1b[${absY + 1};${absX + 1}H`;\n } else {\n cursorSuffix = '\\x1b[0 q\\x1b[?25l';\n }\n\n // Flush diff to stdout with cursor positioning inside sync block\n const out = flushFrame(buf.lines, prevFrame, cursorSuffix);\n writeToStdout(out);\n prevFrame = buf.lines;\n }\n\n // ── InputActions ─────────────────────────────────────────────────────────────\n\n const inputActions: InputActions = {\n getNodes: () => latestNodes,\n getCursorNode: () => latestNodes[state.cursorIndex],\n getAgentForNode: (node) => {\n const agents = state.selectedSession?.agents ?? [];\n return getAgentForNode(node, agents);\n },\n sendAndNotify: (request, successMsg) => {\n void send(request)\n .then((res) => {\n if (res.ok) {\n notify(state, successMsg);\n } else {\n const errMsg = res.error ? res.error : 'Unknown error';\n notify(state, `Error: ${errMsg}`);\n }\n })\n .catch((err: Error) => {\n notify(state, `Error: ${err.message}`);\n });\n },\n send,\n openEditorPopup,\n editInPopup,\n openCompanionPane,\n openClaudeResumePopup,\n openClaudeResumeSession,\n selectWindow,\n selectPane,\n switchToSession,\n openLogPopup,\n openShellPopup,\n openInFileManager,\n copyToClipboard,\n buildSessionContext,\n resolveEditor: () => {\n if (config.editor) return config.editor;\n if (process.env.EDITOR) return process.env.EDITOR;\n return 'nvim';\n },\n cleanup: () => {\n cleanup();\n process.exit(0);\n },\n };\n\n // ── Wire everything together ─────────────────────────────────────────────────\n\n setRenderFunction(render);\n\n const stopKeypress = startKeypressListener((input, key) => {\n handleKeypress(input, key, state, inputActions);\n });\n\n const stopResize = onResize(() => {\n const stdoutRows = process.stdout.rows;\n const stdoutCols = process.stdout.columns;\n state.rows = (typeof stdoutRows === 'number' && stdoutRows > 0) ? stdoutRows : 24;\n state.cols = (typeof stdoutCols === 'number' && stdoutCols > 0) ? stdoutCols : 80;\n prevFrame = []; // force full redraw\n\n // Resize nvim bridge to match new detail panel dimensions\n // Account for: borders (2), status rows (STATUS_ROW_COUNT), separator (1)\n if (state.nvimBridge) {\n const detailW = state.cols - 36; // treeWidth=36\n const contentH = state.rows - 1; // bottomBar=1\n state.nvimBridge.resize(Math.max(1, detailW - 4), Math.max(1, contentH - 2 - STATUS_ROW_COUNT - 1));\n }\n\n requestRender();\n });\n\n // Initial poll + recurring interval\n void poll();\n const pollInterval = setInterval(() => void poll(), 2500);\n\n // Register teardown so cleanup() releases all resources\n const origCleanup = inputActions.cleanup;\n inputActions.cleanup = () => {\n clearInterval(pollInterval);\n if (debouncedPollTimer !== null) clearTimeout(debouncedPollTimer);\n if (state.composePollTimer !== null) clearInterval(state.composePollTimer);\n stopKeypress();\n stopResize();\n state.detailScroll.destroy();\n state.logsScroll.destroy();\n state.nvimBridge?.destroy();\n origCleanup();\n };\n\n // Initial render\n requestRender();\n}\n","import { existsSync, readFileSync, unlinkSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { Key } from './terminal.js';\nimport { setRawBypass } from './terminal.js';\nimport {\n type AppState,\n type ComposeAction,\n OPTIONAL_COMPOSE,\n requestRender,\n notify,\n} from './state.js';\nimport type { TreeNode } from './types/tree.js';\nimport type { Agent, Session } from '../shared/types.js';\nimport type { Response } from '../shared/protocol.js';\nimport { sessionDir, goalPath, roadmapPath, strategyPath } from '../shared/paths.js';\nimport type { Request } from '../shared/protocol.js';\nimport { findParentIndex } from './lib/tree.js';\nimport { badgeGalleryLeft, badgeGalleryRight, closeBadgeGallery, companionOverlayNextPage, companionOverlayShowHelp, companionOverlayDismissHelp, getCompanionPage, badgeListScrollUp, badgeListScrollDown } from './panels/overlays.js';\n\n// ── Re-exported types (same definition, no React) ─────────────────────────────\n\nexport type LeaderAction =\n | { type: 'enter-copy-menu' }\n | { type: 'copy-path' }\n | { type: 'copy-context' }\n | { type: 'copy-logs' }\n | { type: 'copy-session-id' }\n | { type: 'delete-session' }\n | { type: 'open-logs' }\n | { type: 'open-session-dir' }\n | { type: 'search' }\n | { type: 'jump-to-session'; index: number }\n | { type: 'spawn-agent' }\n | { type: 'message-agent' }\n | { type: 'help' }\n | { type: 'companion-overlay' }\n | { type: 'companion-debug' }\n | { type: 'shell-command' }\n | { type: 'jump-to-pane' }\n | { type: 'kill' }\n | { type: 'quit' }\n | { type: 'dismiss' };\n\nexport interface KeybindingHandlers {\n onMoveUp: () => void;\n onMoveDown: () => void;\n onEnter: () => void;\n onLeft: () => void;\n onRight: () => void;\n onSpace: () => void;\n onTab: () => void;\n onMessage: () => void;\n onGoToWindow: () => void;\n onEditGoal: () => void;\n onNewSession: () => void;\n onClaude: () => void;\n onOpenPlan: () => void;\n onQuit: () => void;\n onReRun: () => void;\n onResume: () => void;\n onContinue: () => void;\n onRestartAgent: () => void;\n onRollback: () => void;\n onToggleLogs: () => void;\n onEdit: () => void;\n}\n\n// ── InputActions interface ─────────────────────────────────────────────────────\n\nexport interface InputActions {\n // Navigation context (computed by caller, passed in)\n getNodes: () => TreeNode[];\n getCursorNode: () => TreeNode | undefined;\n getAgentForNode: (node: TreeNode | undefined) => Agent | null;\n\n // Async daemon operations\n sendAndNotify: (request: Request, successMsg: string) => void;\n send: (request: Request) => Promise<Response>;\n\n // Editor/tmux operations (injected — input.ts must not import these directly)\n openEditorPopup: typeof import('./lib/tmux.js').openEditorPopup;\n editInPopup: typeof import('./lib/tmux.js').editInPopup;\n openCompanionPane: typeof import('./lib/tmux.js').openCompanionPane;\n openClaudeResumePopup: typeof import('./lib/tmux.js').openClaudeResumePopup;\n openClaudeResumeSession: typeof import('./lib/tmux.js').openClaudeResumeSession;\n selectWindow: typeof import('./lib/tmux.js').selectWindow;\n selectPane: typeof import('./lib/tmux.js').selectPane;\n switchToSession: typeof import('./lib/tmux.js').switchToSession;\n openLogPopup: typeof import('./lib/tmux.js').openLogPopup;\n openShellPopup: typeof import('./lib/tmux.js').openShellPopup;\n openInFileManager: typeof import('./lib/tmux.js').openInFileManager;\n copyToClipboard: typeof import('./lib/clipboard.js').copyToClipboard;\n buildSessionContext: typeof import('./lib/context.js').buildSessionContext;\n\n // Config\n resolveEditor: () => string;\n\n // Lifecycle\n cleanup: () => void;\n}\n\n// ── Neovim bypass helpers ─────────────────────────────────────────────────────\n\nfunction activateNvimBypass(state: AppState): void {\n setRawBypass((data: string) => {\n // If nvim died, deactivate bypass and let input fall through\n if (!state.nvimBridge?.ready) {\n deactivateNvimBypass();\n state.focusPane = 'tree';\n if (state.mode === 'compose') cancelCompose(state);\n requestRender();\n return false; // not consumed — re-process as normal input\n }\n // Tab (0x09) escapes neovim focus — in compose mode, cancels compose\n if (data === '\\t') {\n if (state.mode === 'compose') {\n cancelCompose(state);\n return true;\n }\n deactivateNvimBypass();\n state.focusPane = state.showCombinedView ? 'logs' : 'tree';\n requestRender();\n return true; // consumed, not forwarded to nvim\n }\n // Everything else → neovim\n state.nvimBridge!.write(data);\n return true;\n });\n}\n\nfunction deactivateNvimBypass(): void {\n setRawBypass(null);\n}\n\n// ── Compose mode helpers ─────────────────────────────────────────────────────\n\nconst COMPOSE_DIR = join(tmpdir(), 'sisyphus-nvim');\n\n/**\n * Enter compose mode: opens a temp file in the nvim detail pane for multi-line input.\n * Returns false if nvim is unavailable (caller should fall back to popup/inline).\n */\nfunction enterComposeMode(state: AppState, action: ComposeAction, actions: InputActions): boolean {\n if (!state.nvimEnabled || !state.nvimBridge?.ready) return false;\n\n mkdirSync(COMPOSE_DIR, { recursive: true });\n const id = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const tempFile = join(COMPOSE_DIR, `compose-${id}.md`);\n const signalFile = join(COMPOSE_DIR, `compose-signal-${id}`);\n\n // Create empty temp file\n writeFileSync(tempFile, '', 'utf-8');\n\n // Save current nvim file key so we can force re-resolution on cancel\n state.composePrevNvimFile = state.prevNvimFile;\n state.composeAction = action;\n state.composeTempFile = tempFile;\n state.composeSignalFile = signalFile;\n state.mode = 'compose';\n state.focusPane = 'detail';\n\n // Open in nvim\n state.nvimBridge.openComposeFile(tempFile, signalFile);\n\n // Activate nvim bypass so all input goes to nvim\n activateNvimBypass(state);\n\n // Start polling for signal file\n state.composePollTimer = setInterval(() => {\n checkComposeSignal(state, actions);\n }, 100);\n\n requestRender();\n return true;\n}\n\n/**\n * Cancel compose mode: clean up and restore previous state.\n */\nfunction cancelCompose(state: AppState): void {\n if (state.composePollTimer !== null) {\n clearInterval(state.composePollTimer);\n state.composePollTimer = null;\n }\n\n // Clean up temp files\n if (state.composeTempFile) {\n try { unlinkSync(state.composeTempFile); } catch { /* ignore */ }\n }\n if (state.composeSignalFile) {\n try { unlinkSync(state.composeSignalFile); } catch { /* ignore */ }\n }\n\n // Force nvim to re-resolve files on next render by nulling prevNvimFile\n state.prevNvimFile = null;\n state.composePrevNvimFile = null;\n state.composeAction = null;\n state.composeTempFile = null;\n state.composeSignalFile = null;\n state.mode = 'navigate';\n state.focusPane = 'tree';\n\n deactivateNvimBypass();\n requestRender();\n}\n\n/**\n * Poll for compose signal file. On detection, read content and dispatch action.\n */\nfunction checkComposeSignal(state: AppState, actions: InputActions): void {\n if (!state.composeSignalFile || !state.composeAction) return;\n\n // Auto-cancel if nvim died\n if (!state.nvimBridge?.ready) {\n cancelCompose(state);\n return;\n }\n\n if (!existsSync(state.composeSignalFile)) return;\n\n // Read signal type: \"1\" = submit, \"cancel\" = cancel (from :q / QuitPre)\n let signalContent = '';\n try { signalContent = readFileSync(state.composeSignalFile, 'utf-8').trim(); } catch { /* ignore */ }\n\n if (signalContent === 'cancel') {\n cancelCompose(state);\n return;\n }\n\n // Signal detected — read compose content\n let content = '';\n if (state.composeTempFile) {\n try { content = readFileSync(state.composeTempFile, 'utf-8').trim(); } catch { /* ignore */ }\n }\n\n const action = state.composeAction;\n const required = !OPTIONAL_COMPOSE.has(action.kind);\n\n if (required && !content) {\n // Delete signal file so user can try again\n try { unlinkSync(state.composeSignalFile); } catch { /* ignore */ }\n notify(state, 'Content required');\n return;\n }\n\n // Dispatch the action\n dispatchComposeAction(action, content, state, actions);\n\n // Clean up\n cancelCompose(state);\n}\n\n/**\n * Map compose action kinds to daemon requests.\n */\nfunction dispatchComposeAction(\n action: ComposeAction,\n content: string,\n state: AppState,\n actions: InputActions,\n): void {\n switch (action.kind) {\n case 'new-session':\n actions.sendAndNotify(\n { type: 'start', task: content, cwd: state.cwd },\n 'Session created',\n );\n break;\n\n case 'message-orchestrator':\n actions.sendAndNotify(\n { type: 'message', sessionId: action.sessionId, content },\n 'Message queued',\n );\n break;\n\n case 'resume':\n actions.sendAndNotify(\n { type: 'resume', sessionId: action.sessionId, cwd: state.cwd, message: content || undefined },\n 'Session resumed',\n );\n break;\n\n case 'continue':\n void (async () => {\n try {\n const contRes = await actions.send({ type: 'continue', sessionId: action.sessionId });\n if (!contRes.ok) { notify(state, `Error: ${contRes.error}`); return; }\n actions.sendAndNotify(\n { type: 'resume', sessionId: action.sessionId, cwd: state.cwd, message: content || undefined },\n 'Session continued',\n );\n } catch (err) {\n notify(state, `Error: ${(err as Error).message}`);\n }\n })();\n break;\n\n case 'spawn-agent':\n actions.sendAndNotify(\n {\n type: 'spawn',\n sessionId: action.sessionId,\n agentType: 'default',\n name: 'agent',\n instruction: content,\n },\n 'Agent spawned',\n );\n break;\n\n case 'message-agent':\n actions.sendAndNotify(\n { type: 'message', sessionId: action.sessionId, content, source: { type: 'agent', agentId: action.agentId } },\n `Message sent to ${action.agentId}`,\n );\n break;\n }\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction expandSessionLatestCycle(state: AppState, node: TreeNode): void {\n if (node.type === 'session' && state.selectedSession?.id === node.sessionId) {\n const cycles = state.selectedSession.orchestratorCycles;\n if (cycles.length > 0) {\n const latest = cycles[cycles.length - 1]!;\n state.expanded.add(`cycle:${node.sessionId}:${latest.cycle}`);\n }\n }\n}\n\n// ── handleReportDetailKey ─────────────────────────────────────────────────────\n\nfunction handleReportDetailKey(input: string, key: Key, state: AppState, _actions: InputActions): void {\n if (key.escape || key.return) {\n state.mode = 'navigate';\n requestRender();\n return;\n }\n if (key.upArrow) {\n state.detailScroll.scrollBy(-1);\n return;\n }\n if (key.downArrow) {\n state.detailScroll.scrollBy(1);\n return;\n }\n}\n\n// ── handleLeaderKey ───────────────────────────────────────────────────────────\n\nfunction handleLeaderAction(action: LeaderAction, state: AppState, actions: InputActions): void {\n const nodes = actions.getNodes();\n const cursorNode = actions.getCursorNode();\n const session = state.selectedSession;\n const selectedSessionId = state.selectedSessionId;\n const agents = session?.agents ?? [];\n\n switch (action.type) {\n case 'enter-copy-menu':\n state.mode = 'copy-menu';\n requestRender();\n return;\n\n case 'copy-path': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const path = sessionDir(state.cwd, selectedSessionId);\n try {\n actions.copyToClipboard(path);\n notify(state, `Copied path (${path})`);\n } catch {\n notify(state, 'Failed to copy to clipboard');\n }\n break;\n }\n\n case 'copy-context': {\n if (!selectedSessionId || !session) { notify(state, 'No session selected'); break; }\n try {\n const xml = actions.buildSessionContext(session, state.cwd);\n actions.copyToClipboard(xml);\n notify(state, `Copied context (${xml.length} chars)`);\n } catch {\n notify(state, 'Failed to copy context');\n }\n break;\n }\n\n case 'copy-logs': {\n if (!state.logsContent) { notify(state, 'No logs content'); break; }\n try {\n actions.copyToClipboard(state.logsContent);\n notify(state, `Copied logs (${state.logsContent.length} chars)`);\n } catch {\n notify(state, 'Failed to copy to clipboard');\n }\n break;\n }\n\n case 'copy-session-id': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n actions.copyToClipboard(selectedSessionId);\n notify(state, `Copied session ID (${selectedSessionId})`);\n } catch {\n notify(state, 'Failed to copy to clipboard');\n }\n break;\n }\n\n case 'delete-session': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const editor = actions.resolveEditor();\n try {\n const text = actions.editInPopup(state.cwd, editor);\n if (text?.trim() === 'yes') {\n actions.sendAndNotify({ type: 'delete', sessionId: selectedSessionId, cwd: state.cwd }, 'Session deleted');\n } else {\n notify(state, 'Delete cancelled (type \"yes\" to confirm)');\n }\n } catch {\n notify(state, 'Failed to open editor');\n }\n break;\n }\n\n case 'open-logs': {\n try {\n actions.openLogPopup();\n } catch {\n notify(state, 'Failed to open log popup');\n }\n break;\n }\n\n case 'open-session-dir': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n actions.openInFileManager(sessionDir(state.cwd, selectedSessionId));\n } catch {\n notify(state, 'Failed to open session directory');\n }\n break;\n }\n\n case 'search': {\n state.mode = 'search';\n state.searchText = '';\n requestRender();\n return;\n }\n\n case 'jump-to-session': {\n let count = 0;\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i]?.type === 'session') {\n count++;\n if (count === action.index) {\n state.cursorIndex = i;\n state.cursorNodeId = nodes[i]!.id;\n break;\n }\n }\n }\n break;\n }\n\n case 'spawn-agent': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n if (enterComposeMode(state, { kind: 'spawn-agent', sessionId: selectedSessionId }, actions)) return;\n // Fallback to popup\n {\n const editor = actions.resolveEditor();\n try {\n const content = actions.editInPopup(state.cwd, editor);\n if (content?.trim()) {\n actions.sendAndNotify(\n { type: 'spawn', sessionId: selectedSessionId, agentType: 'default', name: 'agent', instruction: content },\n 'Agent spawned',\n );\n }\n } catch {\n notify(state, 'Failed to open editor');\n }\n }\n break;\n }\n\n case 'message-agent': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent) { notify(state, 'Cursor must be on an agent'); break; }\n if (enterComposeMode(state, { kind: 'message-agent', sessionId: selectedSessionId!, agentId: agent.id }, actions)) return;\n // Fallback to popup\n {\n const editor = actions.resolveEditor();\n try {\n const content = actions.editInPopup(state.cwd, editor);\n if (content?.trim()) {\n actions.sendAndNotify(\n { type: 'message', sessionId: selectedSessionId!, content, source: { type: 'agent', agentId: agent.id } },\n `Message sent to ${agent.id}`,\n );\n }\n } catch {\n notify(state, 'Failed to open editor');\n }\n }\n break;\n }\n\n case 'help':\n state.mode = 'help';\n requestRender();\n return;\n\n case 'companion-overlay':\n state.mode = 'companion-overlay';\n requestRender();\n return;\n\n case 'companion-debug':\n state.mode = 'companion-debug';\n requestRender();\n return;\n\n case 'shell-command': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const editor = actions.resolveEditor();\n try {\n const text = actions.editInPopup(state.cwd, editor);\n if (text?.trim()) {\n actions.openShellPopup(state.cwd, text.trim());\n }\n } catch {\n notify(state, 'Failed to open editor');\n }\n break;\n }\n\n case 'jump-to-pane': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent?.paneId) { notify(state, 'Select an agent with an active pane'); break; }\n if (session?.tmuxSessionName) actions.switchToSession(session.tmuxSessionName);\n if (session?.tmuxWindowId) actions.selectWindow(session.tmuxWindowId);\n actions.selectPane(agent.paneId);\n break;\n }\n\n case 'kill': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const node = nodes[state.cursorIndex];\n if (node && (node.type === 'agent' || node.type === 'report')) {\n const agentId = node.agentId;\n const agent = agents.find((a) => a.id === agentId);\n if (agent?.status !== 'running') { notify(state, `Agent ${agentId} is not running`); break; }\n actions.sendAndNotify({ type: 'kill-agent', sessionId: selectedSessionId, agentId }, `Killed ${agentId}`);\n } else {\n actions.sendAndNotify({ type: 'kill', sessionId: selectedSessionId }, 'Session killed');\n }\n break;\n }\n\n case 'quit':\n actions.cleanup();\n return;\n\n case 'dismiss':\n closeBadgeGallery();\n break;\n }\n\n state.mode = 'navigate';\n requestRender();\n}\n\nfunction handleLeaderKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n if (state.mode === 'leader') {\n if (key.escape) { handleLeaderAction({ type: 'dismiss' }, state, actions); return; }\n if (input === 'y') { handleLeaderAction({ type: 'enter-copy-menu' }, state, actions); return; }\n if (input === 'd') { handleLeaderAction({ type: 'delete-session' }, state, actions); return; }\n if (input === 'l') { handleLeaderAction({ type: 'open-logs' }, state, actions); return; }\n if (input === 'o') { handleLeaderAction({ type: 'open-session-dir' }, state, actions); return; }\n if (input === '/') { handleLeaderAction({ type: 'search' }, state, actions); return; }\n if (input === 'a') { handleLeaderAction({ type: 'spawn-agent' }, state, actions); return; }\n if (input === 'm') { handleLeaderAction({ type: 'message-agent' }, state, actions); return; }\n if (input === '?') { handleLeaderAction({ type: 'help' }, state, actions); return; }\n if (input === 'c') { handleLeaderAction({ type: 'companion-overlay' }, state, actions); return; }\n if (input === 'D') { handleLeaderAction({ type: 'companion-debug' }, state, actions); return; }\n if (input === '!') { handleLeaderAction({ type: 'shell-command' }, state, actions); return; }\n if (input === 'j') { handleLeaderAction({ type: 'jump-to-pane' }, state, actions); return; }\n if (input === 'k') { handleLeaderAction({ type: 'kill' }, state, actions); return; }\n if (input === 'q') { handleLeaderAction({ type: 'quit' }, state, actions); return; }\n const digit = parseInt(input, 10);\n if (!isNaN(digit) && digit >= 1 && digit <= 9) {\n handleLeaderAction({ type: 'jump-to-session', index: digit }, state, actions);\n return;\n }\n handleLeaderAction({ type: 'dismiss' }, state, actions);\n return;\n }\n\n if (state.mode === 'copy-menu') {\n if (key.escape) { handleLeaderAction({ type: 'dismiss' }, state, actions); return; }\n if (input === 'p') { handleLeaderAction({ type: 'copy-path' }, state, actions); return; }\n if (input === 'C') { handleLeaderAction({ type: 'copy-context' }, state, actions); return; }\n if (input === 'l') { handleLeaderAction({ type: 'copy-logs' }, state, actions); return; }\n if (input === 's') { handleLeaderAction({ type: 'copy-session-id' }, state, actions); return; }\n handleLeaderAction({ type: 'dismiss' }, state, actions);\n return;\n }\n\n if (state.mode === 'help') {\n if (key.escape || input === '?') { handleLeaderAction({ type: 'dismiss' }, state, actions); return; }\n // any other key: ignore\n }\n\n if (state.mode === 'companion-overlay') {\n if (input === '?') {\n if (getCompanionPage() === 'help') companionOverlayDismissHelp();\n else companionOverlayShowHelp();\n requestRender(); return;\n }\n if (key.escape) {\n if (getCompanionPage() === 'help') { companionOverlayDismissHelp(); requestRender(); return; }\n handleLeaderAction({ type: 'dismiss' }, state, actions); return;\n }\n if (key.tab) { companionOverlayNextPage(); requestRender(); return; }\n if (getCompanionPage() === 'badges') {\n if (key.upArrow || input === 'k') { badgeGalleryLeft(); requestRender(); return; }\n if (key.downArrow || input === 'j') { badgeGalleryRight(); requestRender(); return; }\n if (key.leftArrow || input === 'h') { badgeListScrollUp(); requestRender(); return; }\n if (key.rightArrow || input === 'l') { badgeListScrollDown(); requestRender(); return; }\n }\n // any other key: ignore\n return;\n }\n\n if (state.mode === 'companion-debug') {\n handleLeaderAction({ type: 'dismiss' }, state, actions);\n }\n}\n\n// ── handleNavigateKey ─────────────────────────────────────────────────────────\n\nfunction handleNavigateKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n const nodes = actions.getNodes();\n const cursorNode = actions.getCursorNode();\n const session = state.selectedSession;\n\n // j / ↑\n if (key.upArrow || input === 'k') {\n if (state.focusPane === 'detail') {\n state.detailScroll.scrollBy(-1);\n } else if (state.focusPane === 'logs') {\n state.logsScroll.scrollBy(-1);\n } else {\n state.cursorIndex = Math.max(0, state.cursorIndex - 1);\n state.cursorNodeId = nodes[state.cursorIndex]?.id ?? state.cursorNodeId;\n requestRender();\n }\n return;\n }\n\n // j / ↓\n if (key.downArrow || input === 'j') {\n if (state.focusPane === 'detail') {\n state.detailScroll.scrollBy(1);\n } else if (state.focusPane === 'logs') {\n state.logsScroll.scrollBy(1);\n } else {\n state.cursorIndex = Math.min(nodes.length - 1, state.cursorIndex + 1);\n state.cursorNodeId = nodes[state.cursorIndex]?.id ?? state.cursorNodeId;\n requestRender();\n }\n return;\n }\n\n // h / ←\n if (key.leftArrow || input === 'h') {\n if (state.focusPane === 'logs') {\n state.focusPane = 'detail';\n if (state.nvimEnabled && state.nvimBridge?.ready) {\n activateNvimBypass(state);\n }\n requestRender();\n return;\n }\n if (state.focusPane === 'detail') {\n deactivateNvimBypass();\n state.focusPane = 'tree';\n requestRender();\n return;\n }\n const node = nodes[state.cursorIndex];\n if (!node) return;\n if (node.expanded) {\n state.expanded.delete(node.id);\n requestRender();\n } else {\n const parentIdx = findParentIndex(nodes, state.cursorIndex);\n if (parentIdx !== state.cursorIndex) {\n state.cursorIndex = parentIdx;\n state.cursorNodeId = nodes[parentIdx]?.id ?? state.cursorNodeId;\n requestRender();\n }\n }\n return;\n }\n\n // l / →\n if (key.rightArrow || input === 'l') {\n const node = nodes[state.cursorIndex];\n if (!node) return;\n if (node.expandable && !node.expanded) {\n state.expanded.add(node.id);\n expandSessionLatestCycle(state, node);\n requestRender();\n } else if (node.expandable && node.expanded) {\n // Move cursor to first child\n if (state.cursorIndex + 1 < nodes.length && nodes[state.cursorIndex + 1]!.depth > node.depth) {\n state.cursorIndex += 1;\n state.cursorNodeId = nodes[state.cursorIndex]?.id ?? state.cursorNodeId;\n requestRender();\n }\n }\n return;\n }\n\n // tab: cycle focus panes\n if (key.tab) {\n if (state.focusPane === 'tree') {\n state.focusPane = 'detail';\n if (state.nvimEnabled && state.nvimBridge?.ready) {\n activateNvimBypass(state);\n }\n } else if (state.focusPane === 'detail') {\n deactivateNvimBypass();\n state.focusPane = state.showCombinedView ? 'logs' : 'tree';\n } else {\n state.focusPane = 'tree';\n }\n requestRender();\n return;\n }\n\n // space: enter leader mode\n if (input === ' ') {\n state.mode = 'leader';\n requestRender();\n return;\n }\n\n // enter: expand / report-detail / open context file\n if (key.return) {\n const node = nodes[state.cursorIndex];\n if (!node) return;\n if (node.expandable && !node.expanded) {\n state.expanded.add(node.id);\n expandSessionLatestCycle(state, node);\n requestRender();\n } else if (node.type === 'report') {\n state.targetAgentId = node.agentId;\n state.mode = 'report-detail';\n requestRender();\n } else if (node.type === 'context-file') {\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, node.filePath);\n } catch {\n notify(state, 'Failed to open file in editor');\n }\n }\n return;\n }\n\n // m: message orchestrator\n if (input === 'm') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n if (enterComposeMode(state, { kind: 'message-orchestrator', sessionId: state.selectedSessionId }, actions)) return;\n // Fallback to popup\n const editor = actions.resolveEditor();\n try {\n const content = actions.editInPopup(state.cwd, editor);\n if (content) {\n actions.sendAndNotify(\n { type: 'message', sessionId: state.selectedSessionId, content },\n 'Message queued',\n );\n }\n } catch {\n notify(state, 'Failed to open editor');\n }\n return;\n }\n\n // w: go to tmux window (or resume orchestrator Claude session if window is dead/completed)\n if (input === 'w') {\n if (!session || !state.selectedSessionId) { notify(state, 'No session selected'); return; }\n\n // If window is alive, switch to it directly\n if (session.status !== 'completed' && state.paneAlive && session.tmuxWindowId) {\n if (session.tmuxSessionName) actions.switchToSession(session.tmuxSessionName);\n actions.selectWindow(session.tmuxWindowId);\n return;\n }\n\n // Window is dead or session is completed — resume the last orchestrator Claude session\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n const claudeSessionId = lastCycle?.claudeSessionId;\n if (!claudeSessionId) { notify(state, 'No orchestrator Claude session ID available'); return; }\n try {\n const label = session.name ?? state.selectedSessionId!.slice(0, 8);\n const sessionName = actions.openClaudeResumeSession(state.cwd, claudeSessionId, label, lastCycle.resumeEnv, lastCycle.resumeArgs);\n actions.switchToSession(sessionName);\n } catch {\n notify(state, 'Failed to open Claude session');\n }\n return;\n }\n\n // o: open/resume claude session for agent or orchestrator cycle\n if (input === 'o') {\n if (!cursorNode) { notify(state, 'No node selected'); return; }\n let claudeSessionId: string | undefined;\n let resumeEnv: string | undefined;\n let resumeArgs: string | undefined;\n if (cursorNode.type === 'agent' || cursorNode.type === 'report') {\n const agent = actions.getAgentForNode(cursorNode);\n claudeSessionId = agent?.claudeSessionId ?? undefined;\n resumeEnv = agent?.resumeEnv;\n resumeArgs = agent?.resumeArgs;\n } else if (cursorNode.type === 'cycle' && session) {\n const cycle = session.orchestratorCycles.find(c => c.cycle === cursorNode.cycleNumber);\n claudeSessionId = cycle?.claudeSessionId;\n resumeEnv = cycle?.resumeEnv;\n resumeArgs = cycle?.resumeArgs;\n }\n if (!claudeSessionId) { notify(state, 'No Claude session ID available'); return; }\n try {\n actions.openClaudeResumePopup(state.cwd, claudeSessionId, resumeEnv, resumeArgs);\n } catch {\n notify(state, 'Failed to open Claude session');\n }\n return;\n }\n\n // g: edit goal\n if (input === 'g') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n const gp = goalPath(state.cwd, state.selectedSessionId);\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, gp, { w: '80', h: '50%' });\n } catch {\n notify(state, `Failed to open goal in ${editor}`);\n }\n return;\n }\n\n // n: new session\n if (input === 'n') {\n if (enterComposeMode(state, { kind: 'new-session' }, actions)) return;\n // Fallback to popup\n const editor = actions.resolveEditor();\n try {\n const content = actions.editInPopup(state.cwd, editor);\n if (content) {\n actions.sendAndNotify(\n { type: 'start', task: content, cwd: state.cwd },\n 'Session created',\n );\n }\n } catch {\n notify(state, 'Failed to open editor');\n }\n return;\n }\n\n // c: open companion pane\n if (input === 'c') {\n try {\n actions.openCompanionPane(state.cwd);\n } catch {\n notify(state, 'Failed to open companion pane');\n }\n return;\n }\n\n // p: open plan/roadmap\n if (input === 'p') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n const pp = roadmapPath(state.cwd, state.selectedSessionId);\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, pp);\n } catch {\n notify(state, `Failed to open roadmap in ${editor}`);\n }\n return;\n }\n\n // q: quit\n if (input === 'q') {\n actions.cleanup();\n }\n\n // r: re-run agent\n if (input === 'r') {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent || !state.selectedSessionId) { notify(state, 'Select an agent to re-run'); return; }\n actions.sendAndNotify(\n {\n type: 'spawn',\n sessionId: state.selectedSessionId,\n agentType: agent.agentType,\n name: `${agent.name}-retry`,\n instruction: agent.instruction,\n },\n `Re-spawned ${agent.name}`,\n );\n return;\n }\n\n // R: resume session\n if (input === 'R') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n if (session?.status === 'active' && state.paneAlive) { notify(state, 'Session already active'); return; }\n if (enterComposeMode(state, { kind: 'resume', sessionId: state.selectedSessionId }, actions)) return;\n // Fallback to popup\n {\n const sessionId = state.selectedSessionId;\n const editor = actions.resolveEditor();\n try {\n const content = actions.editInPopup(state.cwd, editor);\n actions.sendAndNotify(\n { type: 'resume', sessionId, cwd: state.cwd, message: content?.trim() || undefined },\n 'Session resumed',\n );\n } catch {\n notify(state, 'Failed to open editor');\n }\n }\n return;\n }\n\n // C: continue session\n if (input === 'C') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n if (session?.status !== 'completed') { notify(state, 'Session not completed'); return; }\n if (enterComposeMode(state, { kind: 'continue', sessionId: state.selectedSessionId }, actions)) return;\n // Fallback to popup\n {\n const sessionId = state.selectedSessionId;\n const editor = actions.resolveEditor();\n void (async () => {\n try {\n const content = actions.editInPopup(state.cwd, editor);\n const contRes = await actions.send({ type: 'continue', sessionId });\n if (!contRes.ok) { notify(state, `Error: ${contRes.error}`); return; }\n actions.sendAndNotify(\n { type: 'resume', sessionId, cwd: state.cwd, message: content?.trim() || undefined },\n 'Session continued',\n );\n } catch (err) {\n notify(state, `Error: ${(err as Error).message}`);\n }\n })();\n }\n return;\n }\n\n // x: restart agent\n if (input === 'x') {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent || !state.selectedSessionId) { notify(state, 'Select an agent to restart'); return; }\n actions.sendAndNotify(\n { type: 'restart-agent', sessionId: state.selectedSessionId, agentId: agent.id },\n `Restarted ${agent.id}`,\n );\n return;\n }\n\n // b: rollback to cycle\n if (input === 'b') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n {\n const sessionId = state.selectedSessionId;\n const editor = actions.resolveEditor();\n try {\n const text = actions.editInPopup(state.cwd, editor);\n if (text?.trim()) {\n const toCycle = parseInt(text.trim(), 10);\n if (isNaN(toCycle) || toCycle < 1) { notify(state, 'Invalid cycle number'); return; }\n actions.sendAndNotify(\n { type: 'rollback', sessionId, cwd: state.cwd, toCycle },\n `Rolled back to cycle ${toCycle} — use [R]esume to respawn`,\n );\n }\n } catch {\n notify(state, 'Failed to open editor');\n }\n }\n return;\n }\n\n // e: edit context file\n if (input === 'e') {\n if (!cursorNode || cursorNode.type !== 'context-file') return;\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, cursorNode.filePath);\n } catch {\n notify(state, 'Failed to open file in editor');\n }\n return;\n }\n\n // S: edit strategy\n if (input === 'S') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n const sp = strategyPath(state.cwd, state.selectedSessionId);\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, sp);\n } catch {\n notify(state, `Failed to open strategy in ${editor}`);\n }\n return;\n }\n\n // /: search (vim-like, direct from navigate)\n if (input === '/') {\n state.mode = 'search';\n state.searchText = '';\n requestRender();\n return;\n }\n\n // t: toggle logs panel\n if (input === 't') {\n if (state.showCombinedView) {\n if (state.focusPane === 'logs') state.focusPane = 'detail';\n state.logsScroll.reset();\n }\n state.showCombinedView = !state.showCombinedView;\n requestRender();\n return;\n }\n}\n\n// ── handleSearchKey ──────────────────────────────────────────────────────────\n\nfunction handleSearchKey(input: string, key: Key, state: AppState): void {\n if (key.return) {\n // Lock in the current filter\n state.mode = 'navigate';\n requestRender();\n return;\n }\n\n if (key.escape) {\n // Clear filter and exit\n state.searchFilter = null;\n state.searchText = '';\n state.mode = 'navigate';\n requestRender();\n return;\n }\n\n if (key.backspace) {\n state.searchText = state.searchText.slice(0, -1);\n state.searchFilter = state.searchText || null;\n requestRender();\n return;\n }\n\n // Ignore control keys\n if (key.ctrl || key.meta || !input || input.length !== 1) return;\n\n state.searchText += input;\n state.searchFilter = state.searchText;\n requestRender();\n}\n\n// ── Main dispatch ─────────────────────────────────────────────────────────────\n\nexport function handleKeypress(input: string, key: Key, state: AppState, actions: InputActions): void {\n // Compose mode: all input goes through nvim bypass — nothing to handle here\n if (state.mode === 'compose') return;\n\n if (state.mode === 'search') {\n handleSearchKey(input, key, state);\n } else if (state.mode === 'leader' || state.mode === 'copy-menu' || state.mode === 'help' || state.mode === 'companion-overlay' || state.mode === 'companion-debug') {\n handleLeaderKey(input, key, state, actions);\n } else if (state.mode === 'report-detail') {\n handleReportDetailKey(input, key, state, actions);\n } else {\n handleNavigateKey(input, key, state, actions);\n }\n}\n","import { join } from 'node:path';\nimport { messageSourceLabel } from './format.js';\nimport type {\n TreeNode,\n SessionTreeNode,\n CycleTreeNode,\n AgentTreeNode,\n ReportTreeNode,\n MessagesTreeNode,\n MessageTreeNode,\n ContextTreeNode,\n ContextFileTreeNode,\n} from '../types/tree.js';\nimport type { Session } from '../../shared/types.js';\nimport type { SessionSummary } from '../state.js';\nimport { contextDir } from '../../shared/paths.js';\n\n/** Sort priority: active+open=0, active+closed=1, paused+open=2, paused+closed=3, completed=4 */\nfunction sessionSortKey(s: SessionSummary): number {\n if (s.status === 'completed') return 4;\n // Use cached windowAlive from polling hook (avoids execSync in render path)\n const open = s.windowAlive ?? false;\n if (s.status === 'active') return open ? 0 : 1;\n // paused\n return open ? 2 : 3;\n}\n\nexport function buildTree(\n sessions: SessionSummary[],\n selectedSession: Session | null,\n expanded: Set<string>,\n cwd: string,\n polledContextFiles: string[] = [],\n): TreeNode[] {\n const nodes: TreeNode[] = [];\n\n const sorted = [...sessions].sort((a, b) => {\n const keyDiff = sessionSortKey(a) - sessionSortKey(b);\n if (keyDiff !== 0) return keyDiff;\n // Most recent first within each group\n return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n });\n\n for (const s of sorted) {\n const sessionNodeId = `session:${s.id}`;\n const isSelected = selectedSession?.id === s.id;\n const isExpanded = expanded.has(sessionNodeId);\n\n nodes.push({\n id: sessionNodeId,\n type: 'session',\n depth: 0,\n expandable: true,\n expanded: isExpanded && isSelected,\n sessionId: s.id,\n name: s.name,\n task: s.task,\n status: s.status,\n cycleCount: isSelected ? (selectedSession?.orchestratorCycles.length ?? 0) : 0,\n agentCount: s.agentCount,\n createdAt: s.createdAt,\n completedAt: isSelected ? selectedSession?.completedAt : undefined,\n } satisfies SessionTreeNode);\n\n // Only emit children for the selected+expanded session\n if (!isExpanded || !isSelected || !selectedSession) continue;\n\n const cycles = [...selectedSession.orchestratorCycles].reverse();\n const allSpawnedIds = new Set(\n selectedSession.orchestratorCycles.flatMap((c) => c.agentsSpawned),\n );\n\n for (const cycle of cycles) {\n const cycleNodeId = `cycle:${s.id}:${cycle.cycle}`;\n const cycleExpanded = expanded.has(cycleNodeId);\n\n // Agents belonging to this cycle\n const cycleAgents = selectedSession.agents.filter((a) =>\n cycle.agentsSpawned.includes(a.id),\n );\n\n // For the latest cycle, include unassigned agents\n const isLatest = cycle === cycles[0];\n const unassigned = isLatest\n ? selectedSession.agents.filter((a) => !allSpawnedIds.has(a.id))\n : [];\n const allCycleAgents = [...cycleAgents, ...unassigned];\n\n nodes.push({\n id: cycleNodeId,\n type: 'cycle',\n depth: 1,\n expandable: allCycleAgents.length > 0,\n expanded: cycleExpanded,\n sessionId: s.id,\n cycleNumber: cycle.cycle,\n timestamp: cycle.timestamp,\n completedAt: cycle.completedAt,\n activeMs: cycle.activeMs,\n agentCount: allCycleAgents.length,\n mode: cycle.mode,\n } satisfies CycleTreeNode);\n\n if (!cycleExpanded) continue;\n\n for (const agent of allCycleAgents) {\n const agentNodeId = `agent:${s.id}:${agent.id}`;\n const hasReports = agent.reports.length > 0;\n const agentExpanded = expanded.has(agentNodeId);\n\n nodes.push({\n id: agentNodeId,\n type: 'agent',\n depth: 2,\n expandable: hasReports,\n expanded: agentExpanded && hasReports,\n sessionId: s.id,\n agentId: agent.id,\n name: agent.name,\n agentType: agent.agentType,\n status: agent.status,\n spawnedAt: agent.spawnedAt,\n completedAt: agent.completedAt,\n activeMs: agent.activeMs,\n reportCount: agent.reports.length,\n } satisfies AgentTreeNode);\n\n if (!agentExpanded || !hasReports) continue;\n\n for (let ri = 0; ri < agent.reports.length; ri++) {\n const report = agent.reports[ri]!;\n nodes.push({\n id: `report:${s.id}:${agent.id}:${ri}`,\n type: 'report',\n depth: 3,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n reportIndex: ri,\n reportType: report.type,\n timestamp: report.timestamp,\n agentId: agent.id,\n } satisfies ReportTreeNode);\n }\n }\n }\n\n // Messages group\n const messages = selectedSession.messages ?? [];\n if (messages.length > 0) {\n const msgsNodeId = `messages:${s.id}`;\n const msgsExpanded = expanded.has(msgsNodeId);\n\n nodes.push({\n id: msgsNodeId,\n type: 'messages',\n depth: 1,\n expandable: true,\n expanded: msgsExpanded,\n sessionId: s.id,\n count: messages.length,\n } satisfies MessagesTreeNode);\n\n if (msgsExpanded) {\n for (const msg of messages) {\n const agentId = msg.source.type === 'agent' ? msg.source.agentId : undefined;\n const sourceLabel = messageSourceLabel(msg.source.type, agentId);\n\n nodes.push({\n id: `message:${s.id}:${msg.id}`,\n type: 'message',\n depth: 2,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n messageId: msg.id,\n source: sourceLabel,\n summary: msg.summary || msg.content,\n timestamp: msg.timestamp,\n } satisfies MessageTreeNode);\n }\n }\n }\n\n // Context group — use polled file list for the selected session (avoids sync I/O in render)\n const contextFiles = isSelected ? polledContextFiles : [];\n\n const ctxNodeId = `context:${s.id}`;\n const ctxExpanded = expanded.has(ctxNodeId);\n\n nodes.push({\n id: ctxNodeId,\n type: 'context',\n depth: 1,\n expandable: contextFiles.length > 0,\n expanded: ctxExpanded && contextFiles.length > 0,\n sessionId: s.id,\n fileCount: contextFiles.length,\n } satisfies ContextTreeNode);\n\n if (ctxExpanded && contextFiles.length > 0) {\n for (const filename of contextFiles) {\n nodes.push({\n id: `context-file:${s.id}:${filename}`,\n type: 'context-file',\n depth: 2,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n label: filename,\n filePath: join(contextDir(cwd, s.id), filename),\n } satisfies ContextFileTreeNode);\n }\n }\n }\n\n return nodes;\n}\n\n/** Find the parent node index for a given node index */\nexport function findParentIndex(nodes: TreeNode[], index: number): number {\n const node = nodes[index];\n if (!node || node.depth === 0) return index;\n const targetDepth = node.depth - 1;\n for (let i = index - 1; i >= 0; i--) {\n if (nodes[i]!.depth === targetDepth) return i;\n if (nodes[i]!.depth < targetDepth) return i;\n }\n return 0;\n}\n","import stringWidth from 'string-width';\n\nexport { formatDuration, statusColor } from '../../shared/format.js';\n\nexport function formatTimeAgo(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n}\n\nexport function formatTime(iso: string): string {\n const d = new Date(iso);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`;\n}\n\nexport function truncate(text: string, max: number): string {\n // Collapse newlines and normalize wide emoji (see cleanMarkdown for rationale)\n const clean = text.replace(/\\n/g, ' ').replace(/✅/g, '✓').replace(/❌/g, '✗').replace(/\\p{Emoji_Presentation}/gu, '');\n if (max < 4) return clean.slice(0, max);\n const w = stringWidth(clean);\n if (w <= max) return clean;\n // Trim from the end until we fit, respecting display width\n let result = clean;\n while (stringWidth(result) > max - 1 && result.length > 0) {\n // Try to break at a word boundary\n const cut = result.lastIndexOf(' ', result.length - 2);\n if (cut > max * 0.4) {\n result = result.slice(0, cut);\n } else {\n result = result.slice(0, result.length - 1);\n }\n }\n return result + '…';\n}\n\n/** Strip markdown syntax to plain text */\nexport function stripMarkdown(text: string): string {\n return text\n .replace(/^#{1,6}\\s+/gm, '')\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/`{1,3}[^`]*`{1,3}/g, '')\n .replace(/^[-*+]\\s+/gm, '')\n .replace(/^\\d+[.)]\\s+/gm, '')\n .replace(/\\[(.+?)\\]\\(.+?\\)/g, '$1')\n .replace(/^>\\s+/gm, '')\n .replace(/---+/g, '')\n .replace(/\\n+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract the first meaningful sentence from markdown-heavy text.\n * Much better than blind truncation — finds actual content.\n */\nexport function extractFirstSentence(text: string, maxLen: number): string {\n const lines = text.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('#')) continue;\n if (trimmed.startsWith('---')) continue;\n if (trimmed.startsWith('```')) continue;\n if (trimmed.startsWith('|')) continue;\n if (trimmed.length < 5) continue;\n\n const cleaned = stripMarkdown(trimmed);\n if (cleaned.length < 5) continue;\n\n // Try to end at a sentence boundary\n const periodIdx = cleaned.indexOf('. ');\n if (periodIdx > 10 && periodIdx < maxLen) {\n return cleaned.slice(0, periodIdx + 1);\n }\n return truncate(cleaned, maxLen);\n }\n const fallback = stripMarkdown(text);\n return truncate(fallback, maxLen);\n}\n\nexport function durationColor(startOrMs: string | number, endIso?: string | null): string {\n let totalMs: number;\n if (typeof startOrMs === 'number') {\n totalMs = startOrMs;\n } else {\n const start = new Date(startOrMs).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n totalMs = end - start;\n }\n if (totalMs < 10 * 60 * 1000) return '';\n if (totalMs < 30 * 60 * 1000) return 'yellow';\n return 'red';\n}\n\nexport function statusIndicator(status: string): string {\n switch (status) {\n case 'active':\n return '▶';\n case 'completed':\n return '✓';\n case 'paused':\n return '⏸';\n default:\n return '·';\n }\n}\n\nexport function agentStatusIcon(status: string): string {\n switch (status) {\n case 'running':\n return '▶';\n case 'completed':\n return '✓';\n case 'killed':\n return '✕';\n case 'crashed':\n return '!';\n case 'lost':\n return '?';\n default:\n return '·';\n }\n}\n\nexport function agentTypeColor(agentType: string | undefined): string | undefined {\n if (!agentType) return undefined;\n const t = agentType.toLowerCase();\n if (t.includes('research')) return 'blue';\n if (t.includes('implement') || t.includes('code')) return 'green';\n if (t.includes('review') || t.includes('test')) return 'magenta';\n if (t.includes('plan')) return 'yellow';\n return undefined;\n}\n\nexport function divider(width: number, char: string = '─'): string {\n return char.repeat(Math.max(0, width));\n}\n\n/** Strip YAML frontmatter (--- ... ---) from markdown content */\nexport function stripFrontmatter(content: string): string {\n if (!content.startsWith('---')) return content;\n const end = content.indexOf('\\n---', 3);\n if (end === -1) return content;\n return content.slice(end + 4).trimStart();\n}\n\n/** Clean inline markdown syntax for terminal display */\nexport function cleanMarkdown(line: string): string {\n return line\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/`(.+?)`/g, '$1')\n .replace(/\\[(.+?)\\]\\(.+?\\)/g, '$1')\n // Normalize wide emoji → single-width alternatives.\n // Ink's @alcalzone/ansi-tokenize treats emoji as width=1, but terminals\n // render them as width=2. This mismatch causes lines to overflow by 1\n // column, wrapping the right border to the next row (phantom blank lines).\n .replace(/✅/g, '✓')\n .replace(/❌/g, '✗')\n .replace(/\\p{Emoji_Presentation}/gu, '');\n}\n\n// Shared line types for scrollable panels\n\nexport type Seg = {\n text: string;\n color?: string;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n inverse?: boolean;\n};\n\nexport type DetailLine = Seg[];\n\nexport function seg(text: string, opts?: Partial<Omit<Seg, 'text'>>): Seg {\n return { text, ...opts };\n}\n\n/** Create a single-segment DetailLine */\nexport function singleLine(text: string, opts?: Partial<Omit<Seg, 'text'>>): DetailLine {\n return [seg(text, opts)];\n}\n\nexport function messageSourceLabel(source: string, agentId?: string): string {\n if (source === 'user') return 'You';\n if (source === 'agent') {\n if (!agentId) throw new Error('agentId required when source is agent');\n return agentId;\n }\n return 'system';\n}\n\nexport function messageSourceColor(source: string): string {\n if (source === 'user') return 'yellow';\n if (source === 'agent') return 'cyan';\n return 'gray';\n}\n\nexport function reportBadge(type: string): { label: string; color: string } {\n return type === 'final'\n ? { label: 'FINAL', color: 'cyan' }\n : { label: 'UPDATE', color: 'yellow' };\n}\n\nexport function agentDisplayName(agent: { name: string; id: string; agentType: string }): string {\n return agent.name !== agent.id ? agent.name : agent.agentType;\n}\n\nexport function abbreviateMode(mode: string | undefined | null): string {\n if (!mode) return '';\n if (mode === 'implementation') return 'impl';\n if (mode === 'planning') return 'plan';\n if (mode === 'strategy') return 'strat';\n if (mode === 'validation') return 'valid';\n return mode;\n}\n\nexport function ansiBold(text: string): string {\n return `\\x1b[1m${text}\\x1b[0m`;\n}\n\nexport function ansiDim(text: string): string {\n return `\\x1b[2m${text}\\x1b[0m`;\n}\n\nexport function ansiColor(text: string, color: string, bold = false): string {\n const COLOR_MAP: Record<string, number> = { black: 30, red: 31, green: 32, yellow: 33, blue: 34, magenta: 35, cyan: 36, white: 37, gray: 90 };\n const codes: number[] = [];\n if (bold) codes.push(1);\n const sgr = COLOR_MAP[color];\n if (sgr !== undefined) codes.push(sgr);\n if (codes.length === 0) return text;\n return `\\x1b[${codes.join(';')}m${text}\\x1b[0m`;\n}\n\nexport function modeColor(mode?: string): string {\n if (mode === 'planning') return 'blue';\n if (mode === 'implementation') return 'green';\n if (mode === 'strategy') return 'yellow';\n if (mode === 'validation') return 'magenta';\n return 'cyan';\n}\n\nexport function mergeStatusDisplay(status: string): { icon: string; label: string; color: string } | null {\n switch (status) {\n case 'merged': return { icon: '⊕', label: 'merged', color: 'green' };\n case 'pending': return { icon: '◌', label: 'pending', color: 'yellow' };\n case 'no-changes': return { icon: '∅', label: 'no changes', color: 'gray' };\n case 'conflict': return { icon: '⚠', label: 'conflict', color: 'red' };\n default: return null;\n }\n}\n\nexport function wrapText(text: string, width: number): string[] {\n const cleaned = cleanMarkdown(text);\n if (width <= 0) return cleaned.split('\\n');\n const result: string[] = [];\n for (const rawLine of cleaned.split('\\n')) {\n if (stringWidth(rawLine) <= width) {\n result.push(rawLine);\n continue;\n }\n\n // Single-pass: walk characters tracking cumulative display width\n let lineStart = 0;\n let lastSpace = -1;\n let displayWidth = 0;\n\n for (let i = 0; i < rawLine.length; i++) {\n const charWidth = stringWidth(rawLine[i]!);\n displayWidth += charWidth;\n\n if (rawLine[i] === ' ') lastSpace = i;\n\n if (displayWidth > width) {\n let breakAt: number;\n if (lastSpace > lineStart) {\n // Break at last space that fits\n breakAt = lastSpace;\n result.push(rawLine.slice(lineStart, breakAt));\n // Skip past the space and any leading spaces\n lineStart = breakAt + 1;\n while (lineStart < rawLine.length && rawLine[lineStart] === ' ') lineStart++;\n } else {\n // No space — hard break at previous char\n breakAt = Math.max(lineStart + 1, i);\n result.push(rawLine.slice(lineStart, breakAt));\n lineStart = breakAt;\n }\n\n // Recalculate display width for the carried-over portion\n displayWidth = stringWidth(rawLine.slice(lineStart, i + 1));\n lastSpace = -1;\n }\n }\n\n if (lineStart < rawLine.length) {\n result.push(rawLine.slice(lineStart));\n }\n }\n return result;\n}\n","import stringWidth from 'string-width';\nimport type { Seg, DetailLine } from './lib/format.js';\n\nexport type { Seg, DetailLine };\n\n// ─── Color mapping ────────────────────────────────────────────────────────────\n\nexport const COLOR_SGR: Record<string, number> = {\n black: 30,\n red: 31,\n green: 32,\n yellow: 33,\n blue: 34,\n magenta: 35,\n cyan: 36,\n white: 37,\n gray: 90,\n};\n\nexport function colorToSGR(color: string): number {\n const code = COLOR_SGR[color];\n if (code === undefined) throw new Error(`Unknown color: ${color}`);\n return code;\n}\n\n// ─── Seg → ANSI conversion (§1.1) ────────────────────────────────────────────\n\nexport function renderLine(segs: Seg[]): string {\n let out = '';\n for (const s of segs) {\n const codes: number[] = [];\n if (s.bold) codes.push(1);\n if (s.dim) codes.push(2);\n if (s.italic) codes.push(3);\n if (s.inverse) codes.push(7);\n if (s.color) codes.push(colorToSGR(s.color));\n if (codes.length > 0) {\n out += `\\x1b[${codes.join(';')}m${s.text}\\x1b[0m`;\n } else {\n out += s.text;\n }\n }\n return out;\n}\n\n// ─── Frame Buffer (§1.2) ──────────────────────────────────────────────────────\n\nexport interface FrameBuffer {\n lines: string[];\n width: number;\n height: number;\n}\n\nlet cachedBlank = '';\nlet cachedBlankWidth = 0;\n\nexport function createFrameBuffer(width: number, height: number): FrameBuffer {\n if (width !== cachedBlankWidth) {\n cachedBlank = ' '.repeat(width);\n cachedBlankWidth = width;\n }\n const lines = new Array<string>(height);\n for (let i = 0; i < height; i++) lines[i] = cachedBlank;\n return { lines, width, height };\n}\n\n/**\n * Copy rows from a previous frame into the buffer (skip re-render for clean panels).\n */\nexport function copyRows(buf: FrameBuffer, src: string[], startRow: number, count: number): void {\n for (let i = 0; i < count && startRow + i < buf.height; i++) {\n buf.lines[startRow + i] = src[startRow + i]!;\n }\n}\n\n// ─── Frame Diffing (§1.3) ────────────────────────────────────────────────────\n\nexport function flushFrame(frame: string[], prevFrame: string[], suffix?: string): string {\n let out = '\\x1b[?2026h'; // begin synchronized output\n for (let i = 0; i < frame.length; i++) {\n if (frame[i] !== prevFrame[i]) {\n out += `\\x1b[${i + 1};1H`; // cursor to row i+1, col 1\n out += '\\x1b[2K'; // clear entire line\n out += frame[i];\n }\n }\n if (suffix) out += suffix;\n out += '\\x1b[?2026l'; // end synchronized output\n return out;\n}\n\n// ─── ANSI escape sequence regex ───────────────────────────────────────────────\n\nconst ANSI_RE = /\\x1b\\[[0-9;]*[a-zA-Z]/g;\n\n// ─── Clip ANSI string to display width (no buffer interaction) ──────────────\n\n/**\n * Clip an ANSI string to exactly `maxWidth` display columns, padding with spaces.\n * Pure function — no buffer splicing.\n */\nexport function clipAnsi(content: string, maxWidth: number): string {\n let out = '';\n let displayWidth = 0;\n let i = 0;\n\n while (i < content.length) {\n if (content[i] === '\\x1b' && content[i + 1] === '[') {\n const seqLen = ansiLen(content, i);\n if (seqLen > 0) {\n out += content.substring(i, i + seqLen);\n i += seqLen;\n continue;\n }\n }\n const cp = content.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const chWidth = cp < 128 ? 1 : stringWidth(ch);\n if (displayWidth + chWidth > maxWidth) break;\n out += ch;\n displayWidth += chWidth;\n i += ch.length;\n }\n\n if (out.includes('\\x1b[') && !out.endsWith('\\x1b[0m')) {\n out += '\\x1b[0m';\n }\n\n const remaining = maxWidth - displayWidth;\n if (remaining > 0) out += ' '.repeat(remaining);\n return out;\n}\n\n/**\n * Fast display-width calculation that skips ANSI escapes without regex allocation.\n */\nfunction displayWidthFast(s: string): number {\n let w = 0;\n let i = 0;\n while (i < s.length) {\n if (s[i] === '\\x1b' && s[i + 1] === '[') {\n const len = ansiLen(s, i);\n if (len > 0) { i += len; continue; }\n }\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n w += cp < 128 ? 1 : stringWidth(ch);\n i += ch.length;\n }\n return w;\n}\n\n/**\n * Parse ANSI escape sequence at position i. Returns length of sequence or 0.\n * Avoids s.slice(i).match(regex) which allocates a new string each call.\n */\nfunction ansiLen(s: string, i: number): number {\n // Caller already verified s[i] === '\\x1b' && s[i+1] === '['\n let j = i + 2;\n const len = s.length;\n // Consume parameter bytes: digits 0-9 and semicolons\n while (j < len) {\n const c = s.charCodeAt(j);\n if ((c >= 0x30 && c <= 0x39) || c === 0x3b) { // '0'-'9' or ';'\n j++;\n } else {\n break;\n }\n }\n // Must end with a letter (final byte)\n if (j < len) {\n const c = s.charCodeAt(j);\n if ((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a)) { // A-Z or a-z\n return j + 1 - i;\n }\n }\n return 0;\n}\n\n// ─── Write functions ──────────────────────────────────────────────────────────\n\n/**\n * Write content into frame buffer at position (x, y).\n *\n * Strategy: rebuild the target line by splitting into display columns,\n * inserting the new content, then reassembling. Since we build the frame\n * fresh each render, we can treat the existing line as plain chars + ANSI.\n *\n * This implementation replaces display columns [x, x+displayWidth(content))\n * in the buffer line with the new content.\n */\nexport function writeAt(buf: FrameBuffer, x: number, y: number, content: string): void {\n if (y < 0 || y >= buf.height) return;\n if (x < 0 || x >= buf.width) return;\n\n const existing = buf.lines[y]!;\n const contentDisplayWidth = stringWidth(content.replace(ANSI_RE, ''));\n\n // Split the existing line into prefix (0..x) and suffix (x+contentDisplayWidth..)\n // We need to walk the existing line respecting display widths.\n // suffix uses restoreState=true to preserve ANSI bg/fg from before the splice point.\n const prefix = sliceDisplayCols(existing, 0, x);\n const suffix = sliceDisplayCols(existing, x + contentDisplayWidth, buf.width, true);\n\n // Pad prefix if it's shorter than expected (can happen at end of line)\n const prefixWidth = stringWidth(prefix.replace(ANSI_RE, ''));\n const paddedPrefix = prefix + ' '.repeat(Math.max(0, x - prefixWidth));\n\n buf.lines[y] = paddedPrefix + content + suffix;\n}\n\n/**\n * Write ANSI string into buffer at (x, y), truncating to maxWidth display columns.\n * Pads remaining width with spaces.\n */\nexport function writeClipped(\n buf: FrameBuffer,\n x: number,\n y: number,\n content: string,\n maxWidth: number,\n): void {\n if (y < 0 || y >= buf.height) return;\n if (x < 0 || x >= buf.width) return;\n\n let out = '';\n let displayWidth = 0;\n let i = 0;\n\n while (i < content.length) {\n // Check for ANSI escape sequence — pass through without counting width\n if (content[i] === '\\x1b' && content[i + 1] === '[') {\n const seqLen = ansiLen(content, i);\n if (seqLen > 0) {\n out += content.substring(i, i + seqLen);\n i += seqLen;\n continue;\n }\n }\n\n // Get the next character (handle surrogate pairs)\n const cp = content.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const chWidth = cp < 128 ? 1 : stringWidth(ch);\n\n if (displayWidth + chWidth > maxWidth) break;\n\n out += ch;\n displayWidth += chWidth;\n i += ch.length;\n }\n\n // Ensure any open SGR sequences are reset\n if (out.includes('\\x1b[') && !out.endsWith('\\x1b[0m')) {\n out += '\\x1b[0m';\n }\n\n // Pad to maxWidth\n const remaining = maxWidth - displayWidth;\n if (remaining > 0) {\n out += ' '.repeat(remaining);\n }\n\n // Splice directly into buffer line — we already know exact display width is maxWidth,\n // so skip writeAt's redundant stringWidth + double sliceDisplayCols re-parse.\n const existing = buf.lines[y]!;\n const prefix = sliceDisplayCols(existing, 0, x);\n const suffix = sliceDisplayCols(existing, x + maxWidth, buf.width, true);\n const prefixDisplayW = displayWidthFast(prefix);\n const paddedPrefix = prefixDisplayW < x ? prefix + ' '.repeat(x - prefixDisplayW) : prefix;\n buf.lines[y] = paddedPrefix + out + suffix;\n}\n\n/**\n * Write centered text at the given row.\n */\nexport function writeCenter(buf: FrameBuffer, row: number, content: string): void {\n const textWidth = stringWidth(content.replace(ANSI_RE, ''));\n const x = Math.max(0, Math.floor((buf.width - textWidth) / 2));\n writeAt(buf, x, row, content);\n}\n\n// ─── Border Drawing (§1.5) ────────────────────────────────────────────────────\n\nexport function drawBorder(\n buf: FrameBuffer,\n x: number,\n y: number,\n w: number,\n h: number,\n color: string,\n): void {\n const sgr = `\\x1b[${colorToSGR(color)}m`;\n const reset = '\\x1b[0m';\n\n // Top: ╭────╮\n writeAt(buf, x, y, sgr + '╭' + '─'.repeat(w - 2) + '╮' + reset);\n // Bottom: ╰────╯\n writeAt(buf, x, y + h - 1, sgr + '╰' + '─'.repeat(w - 2) + '╯' + reset);\n // Sides\n for (let row = y + 1; row < y + h - 1; row++) {\n writeAt(buf, x, row, sgr + '│' + reset);\n writeAt(buf, x + w - 1, row, sgr + '│' + reset);\n }\n}\n\n// ─── Panel Rendering (§4.2) ───────────────────────────────────────────────────\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/**\n * Cache for pre-rendered ANSI strings. Keyed by the DetailLine[] identity —\n * when the caller provides a `renderedCache`, renderPanel will populate it\n * on first render and reuse on subsequent frames (avoiding renderLine per line).\n */\nexport interface RenderedCache {\n lines: DetailLine[];\n ansi: string[];\n}\n\nexport function renderPanel(\n buf: FrameBuffer,\n rect: Rect,\n lines: DetailLine[],\n scrollOffset: number,\n focused: boolean,\n borderColor: string,\n renderedCache?: RenderedCache | null,\n): void {\n const { x, y, w, h } = rect;\n\n // 1. Draw border\n drawBorder(buf, x, y, w, h, focused ? 'blue' : borderColor);\n\n // 2. Inner dimensions (border + 1 padding each side, matching Ink's paddingX={1})\n const innerX = x + 2;\n const innerW = w - 4;\n const innerY = y + 1;\n const innerH = h - 2;\n\n if (innerW <= 0 || innerH <= 0) return;\n\n // 3. Pre-render ANSI strings (cached across frames)\n let ansiLines: string[];\n if (renderedCache && renderedCache.lines === lines) {\n ansiLines = renderedCache.ansi;\n } else {\n ansiLines = new Array<string>(lines.length);\n for (let i = 0; i < lines.length; i++) {\n ansiLines[i] = renderLine(lines[i]!);\n }\n if (renderedCache) {\n renderedCache.lines = lines;\n renderedCache.ansi = ansiLines;\n }\n }\n\n // 4. Windowed slice\n const hasOverflow = lines.length > innerH;\n const viewableH = hasOverflow ? innerH - 1 : innerH;\n const maxScroll = Math.max(0, lines.length - viewableH);\n const effectiveOffset = Math.min(scrollOffset, maxScroll);\n\n // 5. Render visible lines\n for (let i = 0; i < viewableH && effectiveOffset + i < ansiLines.length; i++) {\n writeClipped(buf, innerX, innerY + i, ansiLines[effectiveOffset + i]!, innerW);\n }\n\n // 6. Scroll indicator\n if (hasOverflow) {\n const scrollPct = maxScroll > 0 ? Math.round((effectiveOffset / maxScroll) * 100) : 100;\n const indicator = ` ↕ ${scrollPct}% · ${lines.length} lines`;\n writeClipped(buf, innerX, innerY + viewableH, `\\x1b[2m${indicator}\\x1b[0m`, innerW);\n }\n}\n\n/**\n * Build panel as self-contained row strings (w display-columns each, including borders).\n * Returns h strings. No buffer interaction — avoids sliceDisplayCols entirely.\n */\nexport function buildPanelRows(\n rect: Rect,\n lines: DetailLine[],\n scrollOffset: number,\n focused: boolean,\n borderColor: string,\n renderedCache?: RenderedCache | null,\n): string[] {\n const { w, h } = rect;\n const rows = new Array<string>(h);\n\n const color = focused ? 'blue' : borderColor;\n const sgr = `\\x1b[${colorToSGR(color)}m`;\n const reset = '\\x1b[0m';\n const innerW = w - 4;\n const innerH = h - 2;\n const blankInner = ' '.repeat(innerW);\n\n // Top border\n rows[0] = sgr + '╭' + '─'.repeat(w - 2) + '╮' + reset;\n // Bottom border\n rows[h - 1] = sgr + '╰' + '─'.repeat(w - 2) + '╯' + reset;\n\n // Pre-fill interior rows with empty content\n const borderL = sgr + '│' + reset + ' ';\n const borderR = ' ' + sgr + '│' + reset;\n const emptyRow = borderL + blankInner + borderR;\n for (let i = 1; i < h - 1; i++) rows[i] = emptyRow;\n\n if (innerW <= 0 || innerH <= 0) return rows;\n\n // Pre-render ANSI strings (cached across frames)\n let ansiLines: string[];\n if (renderedCache && renderedCache.lines === lines) {\n ansiLines = renderedCache.ansi;\n } else {\n ansiLines = new Array<string>(lines.length);\n for (let i = 0; i < lines.length; i++) {\n ansiLines[i] = renderLine(lines[i]!);\n }\n if (renderedCache) {\n renderedCache.lines = lines;\n renderedCache.ansi = ansiLines;\n }\n }\n\n // Windowed slice\n const hasOverflow = lines.length > innerH;\n const viewableH = hasOverflow ? innerH - 1 : innerH;\n const maxScroll = Math.max(0, lines.length - viewableH);\n const effectiveOffset = Math.min(scrollOffset, maxScroll);\n\n // Content rows — clip and compose without buffer splicing\n for (let i = 0; i < viewableH && effectiveOffset + i < ansiLines.length; i++) {\n const clipped = clipAnsi(ansiLines[effectiveOffset + i]!, innerW);\n rows[1 + i] = borderL + clipped + borderR;\n }\n\n // Scroll indicator\n if (hasOverflow) {\n const scrollPct = maxScroll > 0 ? Math.round((effectiveOffset / maxScroll) * 100) : 100;\n const indicator = ` ↕ ${scrollPct}% · ${lines.length} lines`;\n const clipped = clipAnsi(`\\x1b[2m${indicator}\\x1b[0m`, innerW);\n rows[1 + viewableH] = borderL + clipped + borderR;\n }\n\n return rows;\n}\n\n/**\n * Build empty panel rows (border only, no content).\n */\nexport function buildEmptyPanelRows(\n rect: Rect,\n focused: boolean,\n borderColor: string,\n centerText?: string,\n): string[] {\n const { w, h } = rect;\n const rows = new Array<string>(h);\n const color = focused ? 'blue' : borderColor;\n const sgr = `\\x1b[${colorToSGR(color)}m`;\n const reset = '\\x1b[0m';\n const innerW = w - 4;\n const borderL = sgr + '│' + reset + ' ';\n const borderR = ' ' + sgr + '│' + reset;\n const emptyRow = borderL + ' '.repeat(innerW) + borderR;\n\n rows[0] = sgr + '╭' + '─'.repeat(w - 2) + '╮' + reset;\n rows[h - 1] = sgr + '╰' + '─'.repeat(w - 2) + '╯' + reset;\n for (let i = 1; i < h - 1; i++) rows[i] = emptyRow;\n\n if (centerText) {\n const midRow = Math.floor(h / 2);\n if (midRow > 0 && midRow < h - 1) {\n const clipped = clipAnsi(centerText, innerW);\n // Center within panel\n const textW = displayWidthFast(centerText);\n const pad = Math.max(0, Math.floor((innerW - textW) / 2));\n const centered = ' '.repeat(pad) + clipped;\n rows[midRow] = borderL + clipAnsi(centered, innerW) + borderR;\n }\n }\n\n return rows;\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\n/**\n * Slice a string (which may contain ANSI escapes) to display columns [start, end).\n * ANSI sequences are passed through only within the slice range.\n */\nfunction sliceDisplayCols(s: string, start: number, end: number, restoreState = false): string {\n let out = '';\n let col = 0;\n let i = 0;\n let inSlice = false;\n let hasOpenSGR = false;\n\n // When restoreState is true, track the last ANSI state before the slice\n // so it can be prepended — restores bg/fg colors that were set earlier in the line.\n let pendingSGR = '';\n\n while (i < s.length && col < end) {\n // ANSI escape: pass through if we're in the slice\n if (s[i] === '\\x1b' && s[i + 1] === '[') {\n const seqLen = ansiLen(s, i);\n if (seqLen > 0) {\n const seq = s.substring(i, i + seqLen);\n if (col >= start) {\n out += seq;\n // Track if we have open SGR (non-reset)\n hasOpenSGR = seq !== '\\x1b[0m' && seq !== '\\x1b[m';\n } else if (restoreState) {\n // Accumulate ANSI state from before the slice\n if (seq === '\\x1b[0m' || seq === '\\x1b[m') {\n pendingSGR = '';\n } else {\n pendingSGR += seq;\n }\n }\n i += seqLen;\n continue;\n }\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const chWidth = cp < 128 ? 1 : stringWidth(ch);\n\n if (col >= start) {\n inSlice = true;\n // Don't emit char that would overflow end\n if (col + chWidth > end) break;\n out += ch;\n }\n\n col += chWidth;\n i += ch.length;\n }\n\n // Close any open SGR\n if (inSlice && hasOpenSGR) {\n out += '\\x1b[0m';\n }\n\n // Prepend accumulated state so suffix inherits the correct colors\n if (restoreState && pendingSGR) {\n out = pendingSGR + out;\n }\n\n return out;\n}\n","import { drawBorder, writeClipped, type FrameBuffer } from '../render.js';\nimport { ansiColor, ansiDim, ansiBold } from '../lib/format.js';\nimport type { CompanionState, AchievementDef, Mood } from '../../shared/companion-types.js';\nimport { getMoodFace } from '../../shared/companion-render.js';\nimport { ACHIEVEMENTS } from '../../shared/companion-types.js';\nimport {\n createBadgeGallery,\n renderBadgeCard,\n galleryNext,\n galleryPrev,\n CARD_WIDTH,\n type BadgeGallery,\n} from '../../shared/companion-badges.js';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst LEADER_WIDTH = 26;\nconst LEADER_HEIGHT = 20; // 18 content lines + 2 border lines\nconst COPY_HEIGHT = 9; // 7 content lines + 2 border lines\nconst HELP_WIDTH = 62;\nconst COMPANION_WIDTH = 52;\nconst DEBUG_WIDTH = 50;\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction helpRow(left: string, right: string, innerWidth: number): string {\n const col = Math.floor(innerWidth / 2);\n return (left.padEnd(col) + right).padEnd(innerWidth);\n}\n\n// ─── Overlays ─────────────────────────────────────────────────────────────────\n\nexport function renderLeaderOverlay(buf: FrameBuffer, rows: number, cols: number): void {\n const x = cols - LEADER_WIDTH - 1;\n const y = rows - LEADER_HEIGHT - 2;\n const innerWidth = LEADER_WIDTH - 2;\n\n drawBorder(buf, x, y, LEADER_WIDTH, LEADER_HEIGHT, 'magenta');\n\n const lines: string[] = [\n ansiColor(' LEADER'.padEnd(innerWidth), 'magenta', true),\n ' '.padEnd(innerWidth),\n ' y copy menu'.padEnd(innerWidth),\n ' d delete session'.padEnd(innerWidth),\n ' l daemon logs'.padEnd(innerWidth),\n ' o open session dir'.padEnd(innerWidth),\n ' a spawn agent'.padEnd(innerWidth),\n ' m message agent'.padEnd(innerWidth),\n ' / search'.padEnd(innerWidth),\n ' ! shell command'.padEnd(innerWidth),\n ' j jump to pane'.padEnd(innerWidth),\n ' k kill session/agent'.padEnd(innerWidth),\n ' c companion overlay'.padEnd(innerWidth),\n ' q quit'.padEnd(innerWidth),\n ' ? help'.padEnd(innerWidth),\n ' 1-9 jump to session'.padEnd(innerWidth),\n ' '.padEnd(innerWidth),\n ansiDim(' esc dismiss'.padEnd(innerWidth)),\n ];\n\n for (let i = 0; i < lines.length; i++) {\n writeClipped(buf, x + 1, y + 1 + i, lines[i]!, innerWidth);\n }\n}\n\nexport function renderCopyMenuOverlay(buf: FrameBuffer, rows: number, cols: number): void {\n const x = cols - LEADER_WIDTH - 1;\n const y = rows - COPY_HEIGHT - 2;\n const innerWidth = LEADER_WIDTH - 2;\n\n drawBorder(buf, x, y, LEADER_WIDTH, COPY_HEIGHT, 'cyan');\n\n const lines: string[] = [\n ansiColor(' COPY'.padEnd(innerWidth), 'cyan', true),\n ' '.padEnd(innerWidth),\n ' p session path'.padEnd(innerWidth),\n ' C LLM context'.padEnd(innerWidth),\n ' l logs content'.padEnd(innerWidth),\n ' s session ID'.padEnd(innerWidth),\n ansiDim(' esc cancel'.padEnd(innerWidth)),\n ];\n\n for (let i = 0; i < lines.length; i++) {\n writeClipped(buf, x + 1, y + 1 + i, lines[i]!, innerWidth);\n }\n}\n\nexport function renderHelpOverlay(buf: FrameBuffer, rows: number, cols: number): void {\n const innerWidth = HELP_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - HELP_WIDTH) / 2));\n\n const contentLines: string[] = [\n helpRow(' hjkl/↑↓←→ navigate', ' tab switch pane', innerWidth),\n helpRow(' enter expand/open', ' t toggle logs', innerWidth),\n ' '.padEnd(innerWidth),\n helpRow(' n new session', ' m message orch.', innerWidth),\n helpRow(' R resume session', ' C continue session', innerWidth),\n helpRow(' b rollback cycle', ' x restart agent', innerWidth),\n helpRow(' r re-run agent', ' g edit goal', innerWidth),\n helpRow(' p open roadmap', ' s toggle strategy', innerWidth),\n helpRow(' S edit strategy', ' w go to window', innerWidth),\n helpRow(' o resume claude session', ' c claude companion', innerWidth),\n helpRow(' q quit', '', innerWidth),\n ' '.padEnd(innerWidth),\n helpRow(' space → y copy submenu', ' space → d delete session', innerWidth),\n helpRow(' space → j jump to pane', ' space → k kill', innerWidth),\n helpRow(' space → q quit', ' space → o open dir', innerWidth),\n helpRow(' space → l tail logs', ' space → / search', innerWidth),\n helpRow(' space → a spawn agent', ' space → m msg agent', innerWidth),\n helpRow(' space → ? help', ' space → 1-9 jump', innerWidth),\n ' '.padEnd(innerWidth),\n helpRow(' y → p session path', ' y → C LLM context', innerWidth),\n helpRow(' y → l logs content', ' y → s session ID', innerWidth),\n ];\n\n // title + blank + contentLines + blank = contentLines.length + 3 inner rows, + 2 border\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, HELP_WIDTH, height, 'yellow');\n\n // Title row\n writeClipped(buf, x + 1, y + 1, ansiColor(' KEYBINDINGS (esc or ? to close)'.padEnd(innerWidth), 'yellow', true), innerWidth);\n // Blank row after title\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n // Content rows (clamp to available height: height - 4 rows for title+blank+trailing_blank+borders)\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n\n // Trailing blank (only if there's room)\n const trailingBlankRow = y + 3 + Math.min(contentLines.length, availableContentRows);\n if (trailingBlankRow < y + height - 1) {\n writeClipped(buf, x + 1, trailingBlankRow, ' '.padEnd(innerWidth), innerWidth);\n }\n}\n\n// ─── Companion Overlay State (module-level, reset on close) ──────────────────\n\ntype CompanionPage = 'profile' | 'badges' | 'help';\n\nlet _page: CompanionPage = 'profile';\nlet _prevPage: 'profile' | 'badges' = 'profile';\nlet _gallery: BadgeGallery | null = null;\n\nexport function companionOverlayNextPage(): void {\n if (_page === 'help') { _page = _prevPage; return; }\n _page = _page === 'profile' ? 'badges' : 'profile';\n}\n\nexport function companionOverlayShowHelp(): void {\n if (_page !== 'help') _prevPage = _page as 'profile' | 'badges';\n _page = 'help';\n}\n\nexport function companionOverlayDismissHelp(): void {\n _page = _prevPage;\n}\n\nexport function badgeGalleryLeft(): void {\n if (_gallery) _gallery.currentIndex = galleryPrev(_gallery);\n}\n\nexport function badgeGalleryRight(): void {\n if (_gallery) _gallery.currentIndex = galleryNext(_gallery);\n}\n\nexport function closeBadgeGallery(): void {\n _page = 'profile';\n _gallery = null;\n _badgeScroll = 0;\n}\n\nexport function getCompanionPage(): CompanionPage {\n return _page;\n}\n\n// ─── Companion Profile Page ──────────────────────────────────────────────────\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nconst MOOD_ICONS: Record<Mood, string> = {\n happy: '◉', grinding: '◈', frustrated: '◆', zen: '◎', sleepy: '◌', excited: '✦', existential: '◉',\n};\n\nconst MOOD_COLORS: Record<Mood, string> = {\n happy: 'green', grinding: 'yellow', frustrated: 'red', zen: 'cyan', sleepy: 'gray', excited: 'white', existential: 'magenta',\n};\n\nfunction statBar(value: number, max: number, width: number, color: string): string {\n const filled = max > 0 ? Math.min(width, Math.round((value / max) * width)) : 0;\n const bar = ansiColor('▓'.repeat(filled), color) + ansiDim('░'.repeat(width - filled));\n return bar;\n}\n\nfunction wrapText(text: string, maxWidth: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n for (const word of words) {\n if (current.length + word.length + 1 > maxWidth && current.length > 0) {\n lines.push(current);\n current = word;\n } else {\n current = current.length > 0 ? `${current} ${word}` : word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\nfunction renderProfilePage(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n const innerWidth = COMPANION_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - COMPANION_WIDTH) / 2));\n\n const unlockedCount = companion.achievements.length;\n const totalAchievements = ACHIEVEMENTS.length;\n\n const endH = Math.floor(companion.stats.endurance / 3_600_000);\n\n const face = getMoodFace(companion.mood);\n const moodColor = MOOD_COLORS[companion.mood];\n const moodIcon = MOOD_ICONS[companion.mood];\n const faceColored = ansiColor(`(${face})`, moodColor, true);\n\n const repoNicknames = Object.values(companion.repos)\n .map(r => r.nickname)\n .filter((n): n is string => n !== null);\n const repoDisplay = repoNicknames.length > 0 ? ansiDim(` \"${repoNicknames[0]}\"`) : '';\n\n const barW = 18;\n\n // XP progress within level (approximate — 50xp per level)\n const xpInLevel = companion.xp % 50;\n const xpBar = statBar(xpInLevel, 50, 20, 'cyan');\n\n // Most recent achievement\n const lastAchievement = companion.achievements.length > 0\n ? companion.achievements[companion.achievements.length - 1]\n : null;\n const lastDef = lastAchievement\n ? ACHIEVEMENTS.find(a => a.id === lastAchievement.id)\n : null;\n\n const contentLines: string[] = [];\n\n // Face + mood\n contentLines.push(` ${faceColored} .${repoDisplay}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Level + title\n contentLines.push(` ${ansiColor(`Lv ${companion.level}`, 'cyan', true)} ${ansiBold(companion.title)}`.padEnd(innerWidth));\n contentLines.push(` ${xpBar} ${ansiDim(`${companion.xp} xp`)}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Mood\n contentLines.push(` ${ansiColor(moodIcon, moodColor)} ${ansiColor(companion.mood, moodColor)}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Stats with colored bars\n contentLines.push(` ${ansiColor('STR', 'red')} ${String(companion.stats.strength).padStart(4)} ${statBar(companion.stats.strength, 100, barW, 'red')}`.padEnd(innerWidth));\n contentLines.push(` ${ansiColor('END', 'yellow')} ${String(endH + 'h').padStart(4)} ${statBar(endH, 500, barW, 'yellow')}`.padEnd(innerWidth));\n contentLines.push(` ${ansiColor('WIS', 'blue')} ${String(companion.stats.wisdom).padStart(4)} ${statBar(companion.stats.wisdom, 50, barW, 'blue')}`.padEnd(innerWidth));\n contentLines.push(` ${ansiColor('PAT', 'magenta')} ${String(companion.stats.patience).padStart(4)} ${statBar(companion.stats.patience, 200, barW, 'magenta')}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Achievement\n if (lastDef) {\n contentLines.push(` ${ansiColor('★', 'yellow')} ${lastDef.name} ${ansiDim(`${unlockedCount}/${totalAchievements}`)}`.padEnd(innerWidth));\n } else {\n contentLines.push(` ${ansiDim(`◇ ${unlockedCount}/${totalAchievements} achievements`)}`.padEnd(innerWidth));\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n\n // Commentary — word-wrapped, styled\n if (companion.lastCommentary) {\n const raw = companion.lastCommentary.text;\n const wrapped = wrapText(raw, innerWidth - 6);\n contentLines.push(` ${ansiDim('┊')} ${ansiColor(wrapped[0] ?? '', 'white')}`.padEnd(innerWidth));\n for (let i = 1; i < wrapped.length; i++) {\n contentLines.push(` ${ansiDim('┊')} ${ansiColor(wrapped[i] ?? '', 'white')}`.padEnd(innerWidth));\n }\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n contentLines.push(` ${ansiDim('tab → badges ? → stat guide')}`.padEnd(innerWidth));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, COMPANION_WIDTH, height, 'cyan');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' COMPANION (esc to close)'.padEnd(innerWidth), 'cyan', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n}\n\n// ─── Badge Gallery Page ──────────────────────────────────────────────────────\n\nconst GALLERY_WIDTH = 50;\n\nlet _badgeScroll = 0;\n\nexport function badgeListScrollUp(): void { _badgeScroll = Math.max(0, _badgeScroll - 1); }\nexport function badgeListScrollDown(): void { _badgeScroll++; }\n\nfunction renderBadgesPage(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n if (!_gallery) _gallery = createBadgeGallery(companion.achievements);\n const gallery = _gallery;\n\n const innerWidth = GALLERY_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - GALLERY_WIDTH) / 2));\n\n const unlockedCount = companion.achievements.length;\n const totalAchievements = ACHIEVEMENTS.length;\n\n // Render current badge card\n const currentDef = gallery.achievements[gallery.currentIndex]!;\n const currentUnlock = gallery.unlocked.get(currentDef.id) ?? null;\n const card = renderBadgeCard(currentDef, currentUnlock);\n\n const contentLines: string[] = [];\n\n // Badge card (centered within overlay)\n for (const cardLine of card.lines) {\n const stripped = cardLine.replace(/\\x1b\\[[0-9;]*m/g, '');\n const pad = Math.max(0, Math.floor((innerWidth - stripped.length) / 2));\n const padded = ' '.repeat(pad) + cardLine + ' '.repeat(Math.max(0, innerWidth - stripped.length - pad));\n contentLines.push(padded);\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n\n // Navigation footer\n const navIdx = gallery.currentIndex + 1;\n const navTotal = gallery.total;\n const unlockLabel = currentUnlock !== null ? ' ✓ unlocked' : ' · locked';\n const navLine = ` ← ${navIdx}/${navTotal} → ${unlockedCount}/${totalAchievements} earned${unlockLabel}`;\n contentLines.push(navLine.padEnd(innerWidth));\n\n contentLines.push(' '.padEnd(innerWidth));\n\n // Achievement checklist — scrollable, current badge highlighted\n const listStartIdx = contentLines.length;\n const maxListRows = Math.min(6, Math.max(4, (rows - 2) - 4 - listStartIdx - 2));\n const maxScroll = Math.max(0, gallery.total - maxListRows + 1);\n if (_badgeScroll > maxScroll) _badgeScroll = maxScroll;\n\n // Auto-scroll to keep current badge visible (iterative: indicators steal rows)\n if (gallery.currentIndex < _badgeScroll) _badgeScroll = gallery.currentIndex;\n for (let pass = 0; pass < 3; pass++) {\n const a = _badgeScroll > 0 ? 1 : 0;\n const b = _badgeScroll + maxListRows < gallery.total ? 1 : 0;\n const vis = maxListRows - a - b;\n if (gallery.currentIndex >= _badgeScroll + vis) {\n _badgeScroll = gallery.currentIndex - vis + 1;\n } else break;\n }\n if (_badgeScroll > maxScroll) _badgeScroll = maxScroll;\n\n const hasMoreAbove = _badgeScroll > 0;\n const hasMoreBelow = _badgeScroll + maxListRows < gallery.total;\n const itemRows = maxListRows - (hasMoreAbove ? 1 : 0) - (hasMoreBelow ? 1 : 0);\n\n if (hasMoreAbove) {\n contentLines.push(ansiDim(` ↑ ${_badgeScroll} more`.padEnd(innerWidth)));\n }\n\n for (let i = 0; i < itemRows && (_badgeScroll + i) < gallery.total; i++) {\n const idx = _badgeScroll + i;\n const def = gallery.achievements[idx]!;\n const u = gallery.unlocked.has(def.id);\n const icon = u ? '✓' : '·';\n const isCurrent = idx === gallery.currentIndex;\n let line = ` ${icon} ${def.name}`.padEnd(innerWidth);\n if (isCurrent) line = ansiColor(line, 'cyan', false);\n else if (!u) line = ansiDim(line);\n contentLines.push(line);\n }\n\n if (hasMoreBelow) {\n const below = gallery.total - _badgeScroll - itemRows;\n contentLines.push(ansiDim(` ↓ ${below} more`.padEnd(innerWidth)));\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n contentLines.push(ansiDim(' tab → profile ? → stat guide'.padEnd(innerWidth)));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, GALLERY_WIDTH, height, 'cyan');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' BADGES (↑↓ navigate, esc close)'.padEnd(innerWidth), 'cyan', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n}\n\n// ─── Stat Guide Page ─────────────────────────────────────────────────────────\n\nfunction renderHelpPage(buf: FrameBuffer, rows: number, cols: number): void {\n const innerWidth = COMPANION_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - COMPANION_WIDTH) / 2));\n\n const divider = (label: string, color: string) => {\n const rest = innerWidth - label.length - 5;\n return ` ${ansiColor(label, color, true)} ${ansiDim('─'.repeat(Math.max(0, rest)))}`;\n };\n\n const contentLines: string[] = [];\n\n contentLines.push(divider('STR (Strength)', 'red'));\n contentLines.push(' +1 per completed session'.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('END (Endurance)', 'yellow'));\n contentLines.push(' Total active time across sessions'.padEnd(innerWidth));\n contentLines.push(' (displayed in hours)'.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('WIS (Wisdom)', 'blue'));\n contentLines.push(' +1 per efficient session'.padEnd(innerWidth));\n contentLines.push(ansiDim(' agents have <30% stddev in active').padEnd(innerWidth));\n contentLines.push(ansiDim(' time, 2+ agents required').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('PAT (Patience)', 'magenta'));\n contentLines.push(' +cycles per completed session'.padEnd(innerWidth));\n contentLines.push(ansiDim(' +3 if validation mode').padEnd(innerWidth));\n contentLines.push(ansiDim(' +2 if completion mode').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('XP & Level', 'cyan'));\n contentLines.push(' STR×80 + END/h×15 + WIS×40'.padEnd(innerWidth));\n contentLines.push(' + PAT×5'.padEnd(innerWidth));\n contentLines.push(ansiDim(' level: 150 base xp, ×1.35/lvl').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('Mood', 'white'));\n contentLines.push(' Real-time scoring from signals:'.padEnd(innerWidth));\n contentLines.push(ansiDim(' time of day, idle time, crashes,').padEnd(innerWidth));\n contentLines.push(ansiDim(' streaks, session length, agents').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('Badges', 'yellow'));\n contentLines.push(' Milestones, session feats, time'.padEnd(innerWidth));\n contentLines.push(' patterns, and behavioral checks'.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(ansiDim(' tab → back ? → close'.padEnd(innerWidth)));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, COMPANION_WIDTH, height, 'cyan');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' STAT GUIDE (? or esc to close)'.padEnd(innerWidth), 'cyan', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n\n const trailingBlankRow = y + 3 + Math.min(contentLines.length, availableContentRows);\n if (trailingBlankRow < y + height - 1) {\n writeClipped(buf, x + 1, trailingBlankRow, ' '.padEnd(innerWidth), innerWidth);\n }\n}\n\n// ─── Companion Overlay Dispatcher ────────────────────────────────────────────\n\nexport function renderCompanionOverlay(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n if (_page === 'help') {\n renderHelpPage(buf, rows, cols);\n } else if (_page === 'badges') {\n renderBadgesPage(buf, rows, cols, companion);\n } else {\n renderProfilePage(buf, rows, cols, companion);\n }\n}\n\nexport function renderCompanionDebugOverlay(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n const innerWidth = DEBUG_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - DEBUG_WIDTH) / 2));\n\n const face = getMoodFace(companion.mood);\n const debug = companion.debugMood;\n\n const contentLines: string[] = [\n ` (${face}) mood: ${companion.mood}`.padEnd(innerWidth),\n ' '.padEnd(innerWidth),\n ];\n\n if (debug) {\n const { signals, scores } = debug;\n\n contentLines.push(ansiDim(' ── Signals ──'.padEnd(innerWidth)));\n contentLines.push(` hourOfDay: ${signals.hourOfDay}`.padEnd(innerWidth));\n contentLines.push(` sessionLengthMs: ${signals.sessionLengthMs} (${Math.round(signals.sessionLengthMs / 60_000)}min)`.padEnd(innerWidth));\n contentLines.push(` idleDurationMs: ${signals.idleDurationMs} (${Math.round(signals.idleDurationMs / 60_000)}min)`.padEnd(innerWidth));\n contentLines.push(` recentCrashes: ${signals.recentCrashes}`.padEnd(innerWidth));\n contentLines.push(` cleanStreak: ${signals.cleanStreak}`.padEnd(innerWidth));\n contentLines.push(` justCompleted: ${signals.justCompleted}`.padEnd(innerWidth));\n contentLines.push(` justCrashed: ${signals.justCrashed}`.padEnd(innerWidth));\n contentLines.push(` justLeveledUp: ${signals.justLeveledUp}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(ansiDim(' ── Scores ──'.padEnd(innerWidth)));\n const moodOrder: Mood[] = ['happy', 'grinding', 'frustrated', 'zen', 'sleepy', 'excited', 'existential'];\n for (const mood of moodOrder) {\n const score = scores[mood] ?? 0;\n const bar = score > 0 ? ansiDim('█'.repeat(Math.min(Math.round(score / 5), 12))) : '';\n const marker = mood === debug.winner ? ' ◀' : '';\n contentLines.push(` ${mood.padEnd(12)} ${String(score).padStart(3)} ${bar}${marker}`.padEnd(innerWidth));\n }\n } else {\n contentLines.push(ansiDim(' No mood signals yet'.padEnd(innerWidth)));\n contentLines.push(ansiDim(' (mood is time-of-day only)'.padEnd(innerWidth)));\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, DEBUG_WIDTH, height, 'yellow');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' COMPANION DEBUG (esc to close)'.padEnd(innerWidth), 'yellow', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n\n const trailingRow = y + 3 + Math.min(contentLines.length, availableContentRows);\n if (trailingRow < y + height - 1) {\n writeClipped(buf, x + 1, trailingRow, ' '.padEnd(innerWidth), innerWidth);\n }\n}\n","import type { TreeNode } from '../types/tree.js';\n\n/**\n * Render box-drawing prefix for a tree node.\n * Produces connectors like: │ ├─ ▸ or └─ ▼\n */\nexport function renderTreePrefix(node: TreeNode, nodes: TreeNode[], index: number): string {\n if (node.depth === 0) {\n return node.expandable ? (node.expanded ? '▼ ' : '▸ ') : ' ';\n }\n\n const parts: string[] = [];\n\n // For each ancestor depth level (1..depth-1), draw │ or space\n for (let d = 1; d < node.depth; d++) {\n parts.push(isAncestorLastSibling(nodes, index, d) ? ' ' : '│ ');\n }\n\n // Connector for this node\n parts.push(isLastSibling(nodes, index) ? '└─' : '├─');\n\n // Expand indicator\n if (node.expandable) {\n parts.push(node.expanded ? '▼ ' : '▸ ');\n } else {\n parts.push(' ');\n }\n\n return parts.join('');\n}\n\n/** Check if the node at `index` is the last among its siblings (same depth, same parent) */\nfunction isLastSibling(nodes: TreeNode[], index: number): boolean {\n const depth = nodes[index]!.depth;\n for (let i = index + 1; i < nodes.length; i++) {\n if (nodes[i]!.depth === depth) return false;\n if (nodes[i]!.depth < depth) return true;\n }\n return true;\n}\n\n/** Check if the ancestor at `depth` for the node at `index` is the last among its siblings */\nfunction isAncestorLastSibling(nodes: TreeNode[], index: number, depth: number): boolean {\n // Find the ancestor at this depth by scanning backward\n for (let i = index - 1; i >= 0; i--) {\n if (nodes[i]!.depth === depth) {\n return isLastSibling(nodes, i);\n }\n if (nodes[i]!.depth < depth) return true;\n }\n return true;\n}\n\n/**\n * Pre-compute prefix strings for all tree nodes in O(n).\n * Avoids per-node O(n) scans during rendering.\n */\nexport function precomputePrefixes(nodes: TreeNode[]): void {\n const len = nodes.length;\n if (len === 0) return;\n\n // Step 1: Compute isLastSibling for each node in a single backward pass.\n // A node is \"last sibling\" if no later node at the same depth appears before\n // a node at a shallower depth (or end of array).\n const isLast = new Array<boolean>(len);\n // Track the last-seen index for each depth level\n const lastSeenAtDepth = new Map<number, number>();\n\n for (let i = len - 1; i >= 0; i--) {\n const depth = nodes[i]!.depth;\n // This node is last sibling if no node at same depth was seen after it\n // before a shallower node\n isLast[i] = !lastSeenAtDepth.has(depth);\n lastSeenAtDepth.set(depth, i);\n // Clear deeper depths (they belong to a different parent scope)\n for (const [d] of lastSeenAtDepth) {\n if (d > depth) lastSeenAtDepth.delete(d);\n }\n }\n\n // Step 2: Build prefix strings using pre-computed isLast data.\n // For ancestor connector lines, we need to know if the ancestor at each depth\n // is a last sibling. We maintain a stack of isLast values per depth.\n const ancestorIsLast: boolean[] = [];\n\n for (let i = 0; i < len; i++) {\n const node = nodes[i]!;\n\n if (node.depth === 0) {\n node.prefix = node.expandable ? (node.expanded ? '▼ ' : '▸ ') : ' ';\n ancestorIsLast[0] = isLast[i]!;\n continue;\n }\n\n // Update ancestor tracking\n ancestorIsLast[node.depth] = isLast[i]!;\n\n const parts: string[] = [];\n\n // Ancestor connectors (depth 1 to depth-1)\n for (let d = 1; d < node.depth; d++) {\n parts.push(ancestorIsLast[d] ? ' ' : '│ ');\n }\n\n // This node's connector\n parts.push(isLast[i] ? '└─' : '├─');\n\n // Expand indicator\n if (node.expandable) {\n parts.push(node.expanded ? '▼ ' : '▸ ');\n } else {\n parts.push(' ');\n }\n\n node.prefix = parts.join('');\n }\n}\n","import { rawSend } from '../../shared/client.js';\nimport type { Request, Response } from '../../shared/protocol.js';\n\nexport function send(request: Request): Promise<Response> {\n return rawSend(request, 5_000);\n}\n","import { execSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport { readFileSync, writeFileSync, mkdtempSync, rmSync, cpSync, existsSync, mkdirSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { globalDir, tmuxSessionName } from '../../shared/paths.js';\nimport { augmentedPath } from '../../shared/env.js';\nimport { shellQuote } from '../../shared/shell.js';\nimport { exec, execSafe, EXEC_ENV } from '../../shared/exec.js';\n\n\nexport function getWindowId(): string {\n return exec('tmux display-message -p \"#{window_id}\"');\n}\n\nexport function selectWindow(windowId: string): void {\n execSafe(`tmux select-window -t \"${windowId}\"`);\n}\n\nexport function selectPane(paneId: string): void {\n execSafe(`tmux select-pane -t \"${paneId}\"`);\n}\n\nexport function windowExists(windowId: string): boolean {\n return execSafe(`tmux display-message -t \"${windowId}\" -p \"#{window_id}\"`) !== null;\n}\n\nexport function listAllWindowIds(): Set<string> {\n try {\n const output = execSync('tmux list-windows -a -F \"#{window_id}\"', { encoding: 'utf-8', env: EXEC_ENV });\n return new Set(output.trim().split('\\n').filter(Boolean));\n } catch {\n return new Set();\n }\n}\n\n/**\n * Register this TUI window as the dashboard for the current tmux session.\n * Called on TUI startup so M-S (sisyphus-home) can find the dashboard window.\n */\nexport function registerDashboardWindow(): void {\n execSafe(`tmux set-option @sisyphus_dashboard ${getWindowId()}`);\n}\n\nlet companionPaneId: string | null = null;\n\nfunction setupCompanionPlugin(): string {\n const srcDir = join(import.meta.dirname, 'templates', 'companion-plugin');\n const destDir = join(globalDir(), 'companion-plugin');\n if (!existsSync(destDir)) mkdirSync(destDir, { recursive: true });\n cpSync(srcDir, destDir, { recursive: true });\n return destDir;\n}\n\nfunction isPaneAlive(paneId: string): boolean {\n return execSafe(`tmux display-message -t ${shellQuote(paneId)} -p \"#{pane_id}\"`) !== null;\n}\n\nexport function openCompanionPane(cwd: string): void {\n // If companion pane is alive, focus it\n if (companionPaneId && isPaneAlive(companionPaneId)) {\n execSafe(`tmux select-pane -t ${shellQuote(companionPaneId)}`);\n return;\n }\n\n const pluginDir = setupCompanionPlugin();\n\n const templatePath = join(import.meta.dirname, 'templates', 'dashboard-claude.md');\n let template: string;\n try {\n template = readFileSync(templatePath, 'utf-8');\n } catch {\n template = `You are a Sisyphus dashboard companion. Help the user manage multi-agent sessions.\\nProject: ${cwd}\\nRun \\`sisyphus list\\` and \\`sisyphus status\\` to see current state.`;\n }\n\n const rendered = template.replace(/\\{\\{CWD\\}\\}/g, cwd);\n const promptPath = join(globalDir(), 'dashboard-companion-prompt.md');\n writeFileSync(promptPath, rendered, 'utf-8');\n\n const pathEnv = augmentedPath();\n\n const claudeCmd = `SISYPHUS_COMPANION_CWD=${shellQuote(cwd)} PATH=${shellQuote(pathEnv)} claude --dangerously-skip-permissions --plugin-dir ${shellQuote(pluginDir)} --append-system-prompt \"$(cat ${shellQuote(promptPath)})\"`;\n\n const result = exec(\n `tmux split-window -h -d -l 33% -P -F \"#{pane_id}\" -c ${shellQuote(cwd)} ${shellQuote(claudeCmd)}`,\n );\n companionPaneId = result.trim() || null;\n}\n\nconst TERMINAL_EDITORS = new Set(['nvim', 'vim', 'vi', 'nano', 'emacs', 'micro', 'helix', 'hx', 'joe', 'ne', 'kak']);\n\nexport function switchToSession(sessionName: string): void {\n execSafe(`tmux switch-client -t \"${sessionName}\"`);\n}\n\nexport function editInPopup(cwd: string, editor: string, opts?: { content?: string; size?: { w: string; h: string } }): string | null {\n const tmpDir = mkdtempSync(join(tmpdir(), 'sisyphus-'));\n const filePath = join(tmpDir, 'input.md');\n try {\n writeFileSync(filePath, opts?.content ? opts.content : '', 'utf-8');\n openEditorPopup(cwd, editor, filePath, opts?.size);\n const result = readFileSync(filePath, 'utf-8').trim();\n return result || null;\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\nexport function openLogPopup(): void {\n execSync(\n `tmux display-popup -E -w 90% -h 80% ${shellQuote('tail -f ~/.sisyphus/daemon.log')}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openShellPopup(cwd: string, command: string): void {\n execSync(\n `tmux display-popup -E -w 90% -h 80% -d ${shellQuote(cwd)} ${shellQuote(`sh -c '${command.replace(/'/g, \"'\\\\''\")}; echo; echo \"Press enter to close\"; read'`)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openInFileManager(path: string): void {\n execSync(`open ${shellQuote(path)}`, { stdio: 'inherit', env: EXEC_ENV });\n}\n\nexport function openClaudeResumePopup(cwd: string, claudeSessionId: string, resumeEnv?: string, resumeArgs?: string): void {\n const pathEnv = augmentedPath();\n const envPrefix = resumeEnv ? `${resumeEnv} && ` : '';\n const args = resumeArgs\n ? `${resumeArgs} --resume ${shellQuote(claudeSessionId)}`\n : `--resume ${shellQuote(claudeSessionId)}`;\n const cmd = `${envPrefix}PATH=${shellQuote(pathEnv)} claude ${args}`;\n execSync(\n `tmux display-popup -E -w 90% -h 80% -d ${shellQuote(cwd)} ${shellQuote(cmd)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openClaudeResumeSession(cwd: string, claudeSessionId: string, sessionLabel: string, resumeEnv?: string, resumeArgs?: string): string {\n const pathEnv = augmentedPath();\n const envPrefix = resumeEnv ? `${resumeEnv} && ` : '';\n const args = resumeArgs\n ? `${resumeArgs} --resume ${shellQuote(claudeSessionId)}`\n : `--resume ${shellQuote(claudeSessionId)}`;\n const cmd = `${envPrefix}PATH=${shellQuote(pathEnv)} claude ${args}`;\n const sessionName = tmuxSessionName(cwd, `${sessionLabel}-resume`);\n exec(`tmux new-session -d -s ${shellQuote(sessionName)} -c ${shellQuote(cwd)} ${shellQuote(cmd)}`);\n execSafe(`tmux set-option -t ${shellQuote(sessionName)} @sisyphus_cwd ${shellQuote(cwd.replace(/\\/+$/, ''))}`);\n // Match session defaults from daemon tmux.ts configureSessionDefaults\n const paneTarget = `${sessionName}:`;\n execSafe(`tmux set -w -t ${shellQuote(paneTarget)} pane-border-status top`);\n execSafe(`tmux set -w -t ${shellQuote(paneTarget)} allow-rename off`);\n execSafe(`tmux set -w -t ${shellQuote(paneTarget)} automatic-rename off`);\n execSafe(`tmux select-pane -t ${shellQuote(paneTarget)} -T ${shellQuote(`ssph:resume ${sessionLabel}`)}`);\n return sessionName;\n}\n\nexport function openEditorPopup(cwd: string, editor: string, filePath: string, size?: { w: string; h: string }): void {\n const { w = '90%', h = '90%' } = size ?? {};\n const editorBin = editor.split(/\\s+/)[0]!.split('/').pop()!;\n if (TERMINAL_EDITORS.has(editorBin)) {\n execSync(\n `tmux display-popup -E -w ${w} -h ${h} -d ${shellQuote(cwd)} ${shellQuote(`${editor} ${shellQuote(filePath)}`)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n } else {\n execSync(`${editor} ${shellQuote(filePath)}`, { stdio: 'inherit', cwd, env: EXEC_ENV });\n }\n}\n","import { execSync } from 'node:child_process';\n\nexport function copyToClipboard(text: string): void {\n execSync('pbcopy', { input: text });\n}\n","import type { FrameBuffer, Rect } from '../render.js';\nimport { drawBorder, writeClipped, colorToSGR } from '../render.js';\nimport { renderCompanion } from '../../shared/companion-render.js';\nimport type { CompanionState } from '../../shared/companion-types.js';\nimport type { TreeNode } from '../types/tree.js';\nimport { renderTreePrefix } from '../lib/tree-render.js';\nimport {\n statusColor,\n statusIndicator,\n agentStatusIcon,\n truncate,\n formatDuration,\n formatTime,\n formatTimeAgo,\n durationColor,\n agentDisplayName,\n modeColor,\n abbreviateMode,\n} from '../lib/format.js';\n\n// ─── Node content renderer ────────────────────────────────────────────────────\n\ninterface NodeContent {\n icon: string;\n label: string;\n meta: string;\n color: string;\n dim: boolean;\n metaColor?: string;\n suffix?: string;\n suffixColor?: string;\n}\n\nfunction renderNodeContent(node: TreeNode, maxWidth: number): NodeContent {\n switch (node.type) {\n case 'session': {\n const icon = statusIndicator(node.status);\n const color = statusColor(node.status);\n const dim = node.status === 'completed';\n const cyclePart = node.cycleCount > 0 ? `C${node.cycleCount}` : '';\n const dur = formatDuration(node.createdAt, node.completedAt);\n const agopart =\n node.status === 'completed' && node.completedAt ? formatTimeAgo(node.completedAt) : '';\n const meta = [cyclePart, dur, agopart].filter(Boolean).join(' ');\n const displayText = node.name ?? node.task;\n const maxLabel = Math.max(8, maxWidth - meta.length - 4);\n return { icon, label: truncate(displayText, maxLabel), meta, color, dim };\n }\n case 'cycle': {\n const isRunning = !node.completedAt;\n const dur = isRunning ? 'running' : formatDuration(node.activeMs);\n const agents = `${node.agentCount} agent${node.agentCount !== 1 ? 's' : ''}`;\n const modeShort = abbreviateMode(node.mode);\n const mode = modeShort ? ` · ${modeShort}` : '';\n return {\n icon: isRunning ? '●' : '○',\n label: `C${node.cycleNumber}`,\n meta: `${dur} · ${agents}${mode}`,\n color: isRunning ? 'green' : 'gray',\n dim: !isRunning,\n };\n }\n case 'agent': {\n const icon = agentStatusIcon(node.status);\n const color = statusColor(node.status);\n const dur = formatDuration(node.activeMs);\n const durClr = durationColor(node.activeMs) || undefined;\n const dim = node.status === 'completed';\n const displayName = agentDisplayName({\n name: node.name,\n id: node.agentId,\n agentType: node.agentType,\n });\n\n const maxLabel = Math.max(8, maxWidth - dur.length - 4);\n return {\n icon,\n label: truncate(displayName, maxLabel),\n meta: dur,\n color,\n dim,\n metaColor: durClr,\n };\n }\n case 'report': {\n const badge = node.reportType === 'final' ? 'FINAL' : 'UPDATE';\n const time = formatTime(node.timestamp);\n return {\n icon: node.reportType === 'final' ? '◆' : '◇',\n label: `${badge} ${time}`,\n meta: '',\n color: node.reportType === 'final' ? 'cyan' : 'yellow',\n dim: false,\n };\n }\n case 'messages':\n return {\n icon: '✉',\n label: `Messages (${node.count})`,\n meta: '',\n color: 'yellow',\n dim: false,\n };\n case 'message': {\n const maxLabel = Math.max(8, maxWidth - 8);\n return {\n icon: '·',\n label: truncate(`${node.source}: ${node.summary}`, maxLabel),\n meta: formatTime(node.timestamp),\n color: 'gray',\n dim: true,\n };\n }\n case 'context':\n return {\n icon: '⊞',\n label: `Context (${node.fileCount})`,\n meta: '',\n color: 'white',\n dim: node.fileCount === 0,\n };\n case 'context-file': {\n const maxLabel = Math.max(8, maxWidth - 4);\n return {\n icon: '·',\n label: truncate(node.label, maxLabel),\n meta: '',\n color: 'gray',\n dim: false,\n };\n }\n }\n}\n\n// ─── Tree panel renderer ──────────────────────────────────────────────────────\n\nexport function renderTreePanel(\n buf: FrameBuffer,\n rect: Rect,\n nodes: TreeNode[],\n cursorIndex: number,\n focused: boolean,\n companion?: CompanionState | null,\n): void {\n const { x, y, w, h } = rect;\n\n // 1. Border — yellow when focused\n drawBorder(buf, x, y, w, h, focused ? 'yellow' : 'gray');\n\n // 2. Inner dimensions\n const innerX = x + 2;\n const innerW = w - 4;\n const innerY = y + 1;\n const innerH = h - 2;\n\n if (innerW <= 0 || innerH <= 0) return;\n\n // 3. Empty state\n if (nodes.length === 0) {\n writeClipped(buf, innerX, innerY, '\\x1b[1m Sessions \\x1b[0m', innerW);\n writeClipped(buf, innerX, innerY + 1, '\\x1b[2mNo sessions found.\\x1b[0m', innerW);\n writeClipped(buf, innerX, innerY + 2, '\\x1b[2mPress [n] to create one.\\x1b[0m', innerW);\n writeClipped(buf, innerX, innerY + 3, '\\x1b[2mPress [?] for all keybindings.\\x1b[0m', innerW);\n return;\n }\n\n // 4. Scroll logic — reserve rows at bottom for companion (blank + face + wrapped commentary)\n let companionRows = 0;\n let _companionCommentaryLines: string[] = [];\n if (companion) {\n const commentaryText = companion.lastCommentary?.text;\n if (commentaryText) {\n const words = commentaryText.split(' ');\n let current = '';\n for (const word of words) {\n if (current.length + word.length + 1 > innerW && current.length > 0) {\n _companionCommentaryLines.push(current);\n current = word;\n } else {\n current = current.length > 0 ? `${current} ${word}` : word;\n }\n }\n if (current.length > 0) _companionCommentaryLines.push(current);\n }\n companionRows = 1 + 1 + _companionCommentaryLines.length; // blank + face + commentary lines\n }\n const maxVisible = Math.max(1, innerH - companionRows);\n const halfVisible = Math.floor(maxVisible / 2);\n const scrollOffset = Math.max(\n 0,\n Math.min(cursorIndex - halfVisible, nodes.length - maxVisible),\n );\n\n // 5. Scroll indicator adjustments\n const hasTopIndicator = scrollOffset > 0;\n const hasBottomIndicator = scrollOffset + maxVisible < nodes.length;\n\n let rowStart = innerY;\n let availRows = maxVisible;\n\n if (hasTopIndicator) {\n const topMore = scrollOffset;\n writeClipped(buf, innerX, rowStart, `\\x1b[2m↑ ${topMore} more\\x1b[0m`, innerW);\n rowStart++;\n availRows--;\n }\n\n if (hasBottomIndicator) {\n availRows--;\n }\n\n // 6. Render visible nodes\n const visible = nodes.slice(scrollOffset, scrollOffset + availRows + (hasBottomIndicator ? 1 : 0));\n const renderCount = Math.min(visible.length, availRows);\n\n for (let i = 0; i < renderCount; i++) {\n const node = visible[i]!;\n const realIdx = scrollOffset + i;\n const isSelected = realIdx === cursorIndex;\n const prefix = node.prefix ?? renderTreePrefix(node, nodes, realIdx);\n const contentWidth = innerW;\n const { icon, label, meta, color, dim, metaColor, suffix, suffixColor } = renderNodeContent(\n node,\n contentWidth - prefix.length,\n );\n\n // Build ANSI string\n let content = '';\n\n // icon with color\n if (icon) {\n if (dim) content += `\\x1b[2;${colorToSGR(color)}m${icon}\\x1b[0m `;\n else content += `\\x1b[${colorToSGR(color)}m${icon}\\x1b[0m `;\n }\n\n // label\n if (dim) content += `\\x1b[2m${label}\\x1b[0m`;\n else content += label;\n\n // meta\n if (meta) {\n if (metaColor) content += ` \\x1b[${colorToSGR(metaColor)}m${meta}\\x1b[0m`;\n else content += ` \\x1b[2m${meta}\\x1b[0m`;\n }\n\n // suffix\n if (suffix && suffixColor) {\n content += ` \\x1b[${colorToSGR(suffixColor)}m${suffix}\\x1b[0m`;\n }\n\n let line = prefix;\n if (isSelected) {\n const bold = '\\x1b[1m';\n const inverse = focused ? '\\x1b[7m' : '';\n line += `${inverse}${bold}${content}\\x1b[0m`;\n } else {\n line += content;\n }\n\n writeClipped(buf, innerX, rowStart + i, line, innerW);\n }\n\n // 7. Bottom scroll indicator\n if (hasBottomIndicator) {\n const bottomMore = nodes.length - scrollOffset - maxVisible;\n const bottomRow = rowStart + availRows;\n writeClipped(buf, innerX, bottomRow, `\\x1b[2m↓ ${bottomMore} more\\x1b[0m`, innerW);\n }\n\n // 8. Companion pinned to bottom (blank + face + wrapped commentary)\n if (companion) {\n const commentaryCount = _companionCommentaryLines.length;\n const faceRow = y + h - 2 - commentaryCount;\n const faceLine = renderCompanion(companion, ['face', 'boulder'], { maxWidth: innerW, color: true });\n writeClipped(buf, innerX, faceRow, faceLine, innerW);\n\n for (let i = 0; i < commentaryCount; i++) {\n writeClipped(buf, innerX, faceRow + 1 + i, `\\x1b[2m${_companionCommentaryLines[i]}\\x1b[0m`, innerW);\n }\n }\n}\n","import {\n buildPanelRows,\n buildEmptyPanelRows,\n type Rect,\n} from '../render.js';\nimport type { AppState, CycleLog } from '../state.js';\nimport type {\n TreeNode,\n CycleTreeNode,\n AgentTreeNode,\n ReportTreeNode,\n MessageTreeNode,\n ContextFileTreeNode,\n} from '../types/tree.js';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\nimport { computeActiveTimeMs } from '../../shared/utils.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport {\n statusColor,\n formatDuration,\n formatTime,\n truncate,\n wrapText,\n stripFrontmatter,\n cleanMarkdown,\n seg,\n singleLine,\n agentDisplayName,\n reportBadge,\n agentStatusIcon,\n agentTypeColor,\n durationColor,\n modeColor,\n messageSourceLabel,\n messageSourceColor,\n extractFirstSentence,\n divider,\n abbreviateMode,\n type DetailLine,\n} from '../lib/format.js';\n\n// ---------------------------------------------------------------------------\n// Public interface\n// ---------------------------------------------------------------------------\n\nexport interface DetailContext {\n nodes: TreeNode[];\n session: Session | null;\n agents: Agent[];\n reportBlocks: ReportBlock[];\n detailReportBlocks: ReportBlock[];\n contextFileContent: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// PlanLine (copied from PlanView.tsx — no React dependency)\n// ---------------------------------------------------------------------------\n\ninterface PlanLine {\n text: string;\n bold?: boolean;\n dim?: boolean;\n color?: string;\n}\n\nfunction buildPlanLines(content: string, maxLines: number, width: number): PlanLine[] {\n const clean = stripFrontmatter(content);\n if (!clean.trim()) return [];\n\n const contentWidth = width - 4;\n const lines: PlanLine[] = [];\n const rawLines = clean.split('\\n');\n\n for (const rawLine of rawLines) {\n if (lines.length >= maxLines) break;\n\n const trimmed = rawLine.trim();\n\n // Skip frontmatter artifacts\n if (trimmed === '---') continue;\n\n // Headers — bold, with level-based indentation\n const headerMatch = rawLine.match(/^(#{1,6})\\s+(.+)/);\n if (headerMatch) {\n const level = headerMatch[1]!.length;\n const headerText = cleanMarkdown(headerMatch[2]!);\n const indent = ' '.repeat(Math.max(0, level - 1));\n if (lines.length > 0) lines.push({ text: ' ' });\n lines.push({\n text: ` ${indent}${headerText}`,\n bold: true,\n color: level <= 2 ? 'white' : undefined,\n });\n continue;\n }\n\n // Empty lines — pass through (but collapse multiples)\n if (!trimmed) {\n if (lines.length > 0 && lines[lines.length - 1]!.text !== '') {\n lines.push({ text: ' ' });\n }\n continue;\n }\n\n // Numbered list items\n const listMatch = trimmed.match(/^(\\d+)[.)]\\s+(.+)/);\n if (listMatch) {\n const cleaned = `${listMatch[1]}. ${cleanMarkdown(listMatch[2]!)}`;\n const wrapped = wrapText(cleaned, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n continue;\n }\n\n // Checkbox items — must come before bullet match\n const checkboxMatch = trimmed.match(/^- \\[( |x|X)\\] (.+)/);\n if (checkboxMatch) {\n const checked = checkboxMatch[1] !== ' ';\n const checkboxText = cleanMarkdown(checkboxMatch[2]!);\n const icon = checked ? '☑' : '☐';\n const wrapped = wrapText(`${icon} ${checkboxText}`, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true, color: checked ? 'green' : undefined });\n }\n continue;\n }\n\n // Bullet items\n const bulletMatch = trimmed.match(/^[-*+]\\s+(.+)/);\n if (bulletMatch) {\n const cleaned = `· ${cleanMarkdown(bulletMatch[1]!)}`;\n const wrapped = wrapText(cleaned, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n continue;\n }\n\n // Regular content — clean and wrap\n const cleaned = cleanMarkdown(trimmed);\n const wrapped = wrapText(cleaned, contentWidth - 4);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n }\n\n // Truncation indicator\n const totalContentLines = rawLines.filter((l) => l.trim()).length;\n if (lines.length >= maxLines && totalContentLines > maxLines) {\n lines[lines.length - 1] = { text: ' … [p] open in editor', dim: true };\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildSessionLines (ported from SessionDetail.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildSessionLines(\n session: Session,\n planContent: string,\n goalContent: string | undefined,\n width: number,\n paneAlive: boolean,\n strategyContent: string = '',\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const agents = session.agents;\n const cycles = session.orchestratorCycles;\n const messages = session.messages;\n const isDead = session.status === 'active' && !paneAlive;\n // Goal text\n const goalText = goalContent\n ? cleanMarkdown(stripFrontmatter(goalContent).trim())\n : session.task;\n goalText\n .split('\\n')\n .flatMap((l) => wrapText(l, contentWidth - 2))\n .forEach((line, i) => {\n lines.push(singleLine(`${i === 0 ? ' ' : ' '}${line}`, { bold: true }));\n });\n\n // Status bar\n const lastCycle = cycles.length > 0 ? cycles[cycles.length - 1]! : null;\n const cycleNum = lastCycle !== null ? lastCycle.cycle : 0;\n const mode = lastCycle !== null && lastCycle.mode !== undefined ? lastCycle.mode : '';\n const runningAgents = agents.filter((a) => a.status === 'running').length;\n const completedAgents = agents.filter((a) => a.status === 'completed').length;\n const elapsed = formatDuration(session.createdAt, session.completedAt);\n const activeMs = computeActiveTimeMs(session);\n const activeTime = formatDuration(activeMs);\n const modeLabelColor = modeColor(mode);\n lines.push([\n seg(' '),\n seg(isDead ? '✕ dead' : session.status, {\n color: statusColor(isDead ? 'crashed' : session.status),\n }),\n seg(` · cycle ${cycleNum}`, { dim: true }),\n ...(mode ? [seg(' (', { dim: true }), seg(mode, { color: modeLabelColor }), seg(')', { dim: true })] : []),\n seg(` · ${elapsed} · `, { dim: true }),\n seg(`${runningAgents} running`, { color: 'green' }),\n seg(' · ', { dim: true }),\n seg(`${completedAgents} done`, { color: 'cyan' }),\n seg(` · ${activeTime} active`, { dim: true }),\n ]);\n\n // Dead session warning\n if (isDead) {\n lines.push([\n seg(' '),\n seg(' ✕ DEAD ', { color: 'red', bold: true }),\n seg(' tmux window closed — [w] reopen [R] resume', { color: 'red' }),\n ]);\n }\n\n // Plan / Strategy section\n lines.push(singleLine(' '));\n if (strategyContent) {\n lines.push([seg(' ▎ ◈ STRATEGY', { color: 'yellow', bold: true })]);\n const stratLines = buildPlanLines(strategyContent, 99999, width);\n if (stratLines.length === 0) {\n lines.push(singleLine(' (empty)', { dim: true, italic: true }));\n } else {\n for (const pl of stratLines) {\n lines.push(singleLine(pl.text, { bold: pl.bold, dim: pl.dim, color: pl.color }));\n }\n }\n } else {\n lines.push([seg(' ▎ ◈ PLAN', { color: 'yellow', bold: true })]);\n const planLines = buildPlanLines(planContent, 99999, width);\n if (planLines.length === 0) {\n lines.push(singleLine(' orchestrator will create one', { dim: true, italic: true }));\n } else {\n for (const pl of planLines) {\n lines.push(singleLine(pl.text, { bold: pl.bold, dim: pl.dim, color: pl.color }));\n }\n }\n }\n\n // Completion report\n if (session.status === 'completed' && session.completionReport) {\n lines.push(singleLine(' '));\n lines.push([seg(' ▎ ✓ COMPLETION', { color: 'cyan', bold: true })]);\n wrapText(session.completionReport, contentWidth - 6).forEach((l) => {\n lines.push(singleLine(` ${l}`, { dim: true }));\n });\n }\n\n // Cycles section — newest first\n lines.push(singleLine(' '));\n lines.push([\n seg(' ▎ ⟳ CYCLES', { color: 'blue', bold: true }),\n seg(` (${cycles.length})`, { dim: true }),\n ]);\n\n const pushMsgLine = (msg: (typeof messages)[number], connector: '└▸' | '├▸') => {\n const time = formatTime(msg.timestamp);\n const agentId = msg.source.type === 'agent' ? msg.source.agentId : undefined;\n const label = messageSourceLabel(msg.source.type, agentId);\n const labelColor = messageSourceColor(msg.source.type);\n const maxContent = Math.max(10, contentWidth - label.length - 18);\n lines.push([\n seg(` ${connector} `, { dim: true }),\n seg(`[${time}] `, { dim: true }),\n seg(`${label} `, { color: labelColor, bold: true }),\n seg(truncate(msg.summary.length > 0 ? msg.summary : msg.content, maxContent), { dim: true }),\n ]);\n };\n\n if (cycles.length === 0) {\n lines.push(singleLine(' waiting for orchestrator…', { dim: true, italic: true }));\n } else {\n const sortedMsgs = [...messages].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n const reversedCycles = [...cycles].reverse();\n\n const shortType = (t: string) => {\n const colonIdx = t.indexOf(':');\n return colonIdx >= 0 ? t.slice(colonIdx + 1) : t;\n };\n\n for (let i = 0; i < reversedCycles.length; i++) {\n const cycle = reversedCycles[i]!;\n const olderCycle = reversedCycles[i + 1];\n\n const isRunning = !cycle.completedAt;\n const isNewest = i === 0;\n const isSecond = i === 1;\n const dot = isRunning ? '●' : '○';\n const dotColor = isRunning ? 'green' : isNewest ? 'white' : 'gray';\n const rowDim = !isRunning && !isNewest && !isSecond;\n const duration = isRunning ? 'running' : formatDuration(cycle.activeMs);\n const n = cycle.agentsSpawned.length;\n const startTime = formatTime(cycle.timestamp);\n\n const modeLabel = abbreviateMode(cycle.mode);\n const cycModeColor = modeColor(cycle.mode);\n\n const cycleAgents = agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n\n const cyclePad = `C${cycle.cycle}`.padEnd(4);\n const durPad = (isRunning ? 'running' : duration).padEnd(9);\n\n const headerRow: DetailLine = [\n seg(` ${dot} `, { color: dotColor }),\n seg(cyclePad, { bold: isRunning || isNewest, dim: rowDim }),\n ...(isRunning\n ? [seg(durPad, { color: 'green', bold: true })]\n : [seg(durPad, { dim: rowDim })]),\n seg(startTime, { dim: true }),\n ...(modeLabel ? [seg(' ', {}), seg(modeLabel, { color: cycModeColor })] : []),\n ];\n lines.push(headerRow);\n\n if (cycleAgents.length > 0) {\n const typeGroups = new Map<string, number>();\n for (const a of cycleAgents) {\n const t = shortType(a.agentType !== '' ? a.agentType : a.name !== '' ? a.name : a.id);\n const prev = typeGroups.get(t);\n typeGroups.set(t, prev !== undefined ? prev + 1 : 1);\n }\n const agentNames = [...typeGroups.entries()]\n .map(([t, count]) => count > 1 ? `${count}× ${t}` : t)\n .join(', ');\n lines.push([\n seg(' ', {}),\n seg(truncate(agentNames, contentWidth - 6), { dim: rowDim }),\n ]);\n } else if (n > 0) {\n lines.push([\n seg(' ', {}),\n seg(`${n} agent${n !== 1 ? 's' : ''}`, { dim: rowDim }),\n ]);\n }\n\n const cycleTime = new Date(cycle.timestamp).getTime();\n const olderCycleTime = olderCycle ? new Date(olderCycle.timestamp).getTime() : 0;\n const cycleMsgs = sortedMsgs.filter((m) => {\n const t = new Date(m.timestamp).getTime();\n return t < cycleTime && t >= olderCycleTime;\n });\n cycleMsgs.forEach((msg, mi) => {\n pushMsgLine(msg, mi < cycleMsgs.length - 1 ? '├▸' : '└▸');\n });\n }\n\n // Messages predating all cycles\n const firstCycleTime = new Date(reversedCycles[reversedCycles.length - 1]!.timestamp).getTime();\n const preMsgs = sortedMsgs.filter((m) => new Date(m.timestamp).getTime() < firstCycleTime);\n preMsgs.forEach((msg, mi) => {\n pushMsgLine(msg, mi < preMsgs.length - 1 ? '├▸' : '└▸');\n });\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildCycleLines (ported from CycleDetail.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildCycleLines(cycle: OrchestratorCycle, agents: Agent[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const isRunning = !cycle.completedAt;\n const dur = isRunning ? 'running' : formatDuration(cycle.activeMs);\n const cycleAgents = agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n\n lines.push(singleLine(` Cycle ${cycle.cycle}`, { bold: true }));\n lines.push([\n seg(' '),\n seg(isRunning ? 'running' : 'completed', { color: isRunning ? 'green' : 'gray' }),\n seg(` · ${dur} · ${cycleAgents.length} agent${cycleAgents.length !== 1 ? 's' : ''}`, { dim: true }),\n ...(cycle.mode\n ? [seg(' · ', { dim: true }), seg(cycle.mode, { color: modeColor(cycle.mode) })]\n : []),\n ]);\n lines.push(singleLine(\n ` ${formatTime(cycle.timestamp)}${cycle.completedAt ? ` → ${formatTime(cycle.completedAt)}` : ''}`,\n { dim: true },\n ));\n if (cycle.claudeSessionId) {\n lines.push(singleLine(` Session: ${cycle.claudeSessionId}`, { dim: true }));\n }\n\n lines.push(singleLine(' '));\n lines.push([seg(' ▎ ⊞ AGENTS', { color: 'green', bold: true })]);\n\n if (cycleAgents.length === 0) {\n lines.push(singleLine(' orchestrator spawning agents…', { dim: true, italic: true }));\n } else {\n for (const agent of cycleAgents) {\n const nameLabel = agentDisplayName(agent);\n const instrPreview = agent.instruction.split('\\n')[0]!;\n const latestReport = agent.reports.length > 0 ? agent.reports[agent.reports.length - 1]! : null;\n const reportSummary = latestReport !== null && agent.status === 'completed'\n ? extractFirstSentence(latestReport.summary, contentWidth - 14)\n : null;\n const agentDur = formatDuration(agent.activeMs);\n const durClrRaw = durationColor(agent.activeMs);\n const durClr = durClrRaw !== '' ? durClrRaw : undefined;\n const typeClrRaw = agentTypeColor(agent.agentType);\n const typeClr = typeClrRaw !== undefined ? typeClrRaw : undefined;\n\n lines.push([\n seg(' '),\n seg(agentStatusIcon(agent.status), { color: statusColor(agent.status) }),\n seg(` ${agent.id}`, { bold: true }),\n seg(` ${truncate(nameLabel, contentWidth - 30)}`, {\n color: typeClr,\n dim: typeClr === undefined,\n }),\n seg(` · ${agent.status} · `, { dim: true }),\n seg(agentDur, { color: durClr, dim: !durClr }),\n ]);\n\n if (instrPreview) {\n lines.push(singleLine(` ${truncate(instrPreview, contentWidth - 10)}`, { dim: true }));\n }\n\n if (reportSummary) {\n lines.push([\n seg(' '),\n seg('↳', { color: 'cyan' }),\n seg(` ${reportSummary}`, { dim: true }),\n ]);\n }\n }\n }\n\n if (cycle.nextPrompt) {\n lines.push(singleLine(' '));\n lines.push([seg(' ▎ ▷ NEXT PROMPT', { color: 'yellow', bold: true })]);\n for (const wl of wrapText(cycle.nextPrompt, contentWidth - 6)) {\n lines.push(singleLine(` ${wl}`, { dim: true }));\n }\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildAgentLines (ported from AgentDetail.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildAgentLines(agent: Agent, reportBlocks: ReportBlock[] | undefined, width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const dur = formatDuration(agent.activeMs);\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const nameLabel = agentDisplayName(agent);\n lines.push([\n seg(' '),\n seg(icon, { color }),\n seg(` ${agent.id} · ${nameLabel}`, { bold: true }),\n ]);\n\n lines.push([\n seg(' '),\n seg(agent.status, { color }),\n seg(` · ${dur} · ${agent.agentType}`, { dim: true }),\n ]);\n\n if (agent.killedReason) {\n lines.push(singleLine(` ⚠ ${agent.killedReason}`, { color: 'red' }));\n }\n\n lines.push(singleLine(' '));\n lines.push(singleLine(' ▎ ▷ INSTRUCTION', { color: 'white', bold: true }));\n for (const wl of wrapText(agent.instruction, contentWidth - 6)) {\n lines.push(singleLine(` ${wl}`, { dim: true }));\n }\n\n if (agent.reports.length > 0) {\n const hasResolved = reportBlocks && reportBlocks.length > 0;\n lines.push(singleLine(' '));\n lines.push([seg(` ▎ ◇ REPORTS (${agent.reports.length})`, { color: 'cyan', bold: true })]);\n\n if (hasResolved) {\n for (let i = 0; i < reportBlocks.length; i++) {\n const block = reportBlocks[i]!;\n const { label: badge, color: badgeColor } = reportBadge(block.type);\n\n if (i > 0) lines.push(singleLine(' '));\n lines.push([\n seg(' '),\n seg(badge, { color: badgeColor, bold: block.type === 'final' }),\n seg(` ${formatTime(block.timestamp)}`, { dim: true }),\n ]);\n for (const wl of wrapText(block.content.trim(), contentWidth - 10)) {\n lines.push(singleLine(` ${wl}`, { dim: true }));\n }\n }\n } else {\n for (const report of agent.reports) {\n const { label: badge, color: badgeColor } = reportBadge(report.type);\n lines.push([\n seg(' '),\n seg(badge, { color: badgeColor, bold: report.type === 'final' }),\n seg(` ${formatTime(report.timestamp)} ${report.summary.split('\\n')[0]}`, { dim: true }),\n ]);\n }\n }\n }\n\n lines.push(singleLine(' '));\n lines.push(singleLine(' ▎ ◦ META', { color: 'gray', bold: true }));\n lines.push(singleLine(` Spawned: ${formatTime(agent.spawnedAt)}`, { dim: true }));\n if (agent.completedAt) {\n lines.push(singleLine(` Completed: ${formatTime(agent.completedAt)}`, { dim: true }));\n }\n if (agent.claudeSessionId) {\n lines.push(singleLine(` Session: ${agent.claudeSessionId}`, { dim: true }));\n }\n if (agent.paneId) {\n lines.push(singleLine(` Pane: ${agent.paneId}`, { dim: true }));\n }\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildReportViewLines (ported from ReportView.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildReportViewLines(agent: Agent, reportBlocks: ReportBlock[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 6;\n const dur = formatDuration(agent.activeMs);\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const totalReports = agent.reports.length;\n const nameLabel = agentDisplayName(agent);\n\n lines.push([\n seg(' '),\n seg(icon, { color }),\n seg(' '),\n seg(agent.id, { bold: true }),\n seg(' ', { dim: true }),\n seg('·', { dim: true }),\n seg(' '),\n seg(nameLabel, { bold: true }),\n ]);\n\n lines.push(singleLine(\n ` ${agent.status} · ${dur} · ${agent.agentType} · ${totalReports} report${totalReports !== 1 ? 's' : ''}`,\n { dim: true },\n ));\n\n lines.push(singleLine(' ' + divider(contentWidth - 2), { dim: true }));\n\n if (reportBlocks.length === 0) {\n lines.push(singleLine(''));\n lines.push(singleLine(' No reports submitted yet.', { dim: true }));\n lines.push(singleLine(''));\n return lines;\n }\n\n for (let i = 0; i < reportBlocks.length; i++) {\n const report = reportBlocks[i]!;\n const time = formatTime(report.timestamp);\n\n if (i > 0) {\n lines.push(singleLine(''));\n lines.push(singleLine(` ${divider(contentWidth - 2, '·')}`, { dim: true }));\n lines.push(singleLine(''));\n }\n\n const { label: badge, color: badgeColor } = reportBadge(report.type);\n lines.push([\n seg(` ${badge}`, { color: badgeColor, bold: report.type === 'final' }),\n seg(` ${time}`, { color: badgeColor }),\n ]);\n\n lines.push(singleLine(''));\n\n const wrapped = wrapText(report.content.trim(), contentWidth - 4);\n for (const line of wrapped) {\n lines.push(singleLine(` ${line}`));\n }\n }\n\n lines.push(singleLine(''));\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildLogsLines (ported from LogsPanel.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildLogsLines(cycleLogs: CycleLog[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n\n if (cycleLogs.length === 0) {\n return lines;\n }\n\n const sorted = [...cycleLogs].sort((a, b) => b.cycle - a.cycle);\n\n for (const { cycle, content } of sorted) {\n lines.push([seg(` Cycle ${cycle}`, { color: 'blue', bold: true })]);\n\n const cleaned = cleanMarkdown(stripFrontmatter(content)).trim();\n if (cleaned) {\n for (const rawLine of cleaned.split('\\n')) {\n const wrapped = wrapText(rawLine, contentWidth - 2);\n for (const wl of wrapped) {\n lines.push([seg(` ${wl}`, { dim: true })]);\n }\n }\n }\n\n lines.push([seg(' ')]);\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Main entry points\n// ---------------------------------------------------------------------------\n\nexport function renderDetailRows(\n rect: Rect,\n state: AppState,\n detailCtx: DetailContext,\n): string[] {\n const { session, agents, reportBlocks, detailReportBlocks, contextFileContent } = detailCtx;\n const scrollOffset = state.detailScroll.offset;\n const focused = state.focusPane === 'detail';\n\n // Report detail mode — full panel\n if (state.mode === 'report-detail') {\n const reportAgent = agents.find((a) => a.id === state.targetAgentId);\n if (reportAgent) {\n const lines = buildReportViewLines(reportAgent, reportBlocks, rect.w);\n return buildPanelRows(rect, lines, scrollOffset, focused, 'cyan');\n }\n }\n\n // No cursor / no session → empty state\n const cursorNode: TreeNode | undefined = detailCtx.nodes[state.cursorIndex];\n if (!cursorNode || !session) {\n return buildEmptyPanelRows(rect, false, 'gray', '\\x1b[2mSelect a session to view details\\x1b[0m');\n }\n\n // Session data hasn't arrived yet (poll debounced during rapid scrolling)\n if (cursorNode.sessionId !== session.id) {\n return buildEmptyPanelRows(rect, false, 'gray');\n }\n\n // Compute cache key from all inputs that affect line building\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n const cacheKey = [\n cursorNode.id,\n cursorNode.type,\n state.mode,\n state.targetAgentId,\n rect.w,\n session.id,\n session.agents.length,\n session.orchestratorCycles.length,\n lastCycle?.completedAt ?? '',\n lastCycle?.agentsSpawned.length ?? 0,\n state.planContent.length,\n state.goalContent.length,\n state.strategyContent.length,\n state.paneAlive,\n detailReportBlocks.length,\n session.messages.length,\n state.contextFiles.length,\n contextFileContent?.length ?? -1,\n ].join(':');\n\n let lines: DetailLine[];\n let borderColor = 'gray';\n\n if (cacheKey === state.detailCacheKey && state.cachedDetailLines !== null) {\n lines = state.cachedDetailLines;\n } else {\n switch (cursorNode.type) {\n case 'session': {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent);\n break;\n }\n\n case 'cycle': {\n const cycleNode = cursorNode as CycleTreeNode;\n const cycle = session.orchestratorCycles.find((c) => c.cycle === cycleNode.cycleNumber);\n if (!cycle) {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent);\n } else {\n lines = buildCycleLines(cycle, session.agents, rect.w);\n }\n break;\n }\n\n case 'agent': {\n const agentNode = cursorNode as AgentTreeNode;\n const agent = agents.find((a) => a.id === agentNode.agentId);\n if (!agent) {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent);\n } else {\n lines = buildAgentLines(agent, detailReportBlocks, rect.w);\n }\n break;\n }\n\n case 'report': {\n const reportNode = cursorNode as ReportTreeNode;\n const agent = agents.find((a) => a.id === reportNode.agentId);\n if (!agent) {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent);\n break;\n }\n const reportIdx = reportNode.reportIndex;\n const specificBlock = detailReportBlocks.find((_b, i) => {\n const originalIdx = agent.reports.length - 1 - i;\n return originalIdx === reportIdx;\n });\n if (specificBlock) {\n const { label: badge, color: badgeColor } = reportBadge(specificBlock.type);\n lines = [\n [seg(' '), seg(badge, { color: badgeColor }), seg(` ${agent.id} · ${agentDisplayName(agent)}`, { bold: true })],\n singleLine(` ${formatTime(specificBlock.timestamp)}`, { dim: true }),\n singleLine(' '),\n [seg(' ▎ CONTENT', { color: badgeColor, bold: true })],\n ...wrapText(specificBlock.content.trim(), rect.w - 8).map((l) => singleLine(` ${l}`)),\n ];\n borderColor = badgeColor;\n } else {\n lines = buildAgentLines(agent, detailReportBlocks, rect.w);\n }\n break;\n }\n\n case 'messages': {\n lines = [singleLine(` Messages (${session.messages.length})`, { bold: true })];\n if (session.messages.length === 0) {\n lines.push(singleLine(' No messages', { dim: true, italic: true }));\n } else {\n for (const msg of session.messages) {\n const time = formatTime(msg.timestamp);\n const agentId = msg.source.type === 'agent' ? msg.source.agentId : undefined;\n const label = messageSourceLabel(msg.source.type, agentId);\n const labelColor = messageSourceColor(msg.source.type);\n const maxContent = Math.max(10, rect.w - label.length - 20);\n lines.push([\n seg(` [${time}] `, { dim: true }),\n seg(`${label}: `, { color: labelColor, bold: true }),\n seg(wrapText(msg.summary.length > 0 ? msg.summary : msg.content, maxContent)[0]!, {}),\n ]);\n }\n }\n break;\n }\n\n case 'message': {\n const msgNode = cursorNode as MessageTreeNode;\n const msg = session.messages.find((m) => m.id === msgNode.messageId);\n lines = [singleLine(' Message', { bold: true })];\n if (msg) {\n lines.push(singleLine(` ${msgNode.source} · ${msgNode.timestamp}`, { dim: true }));\n for (const l of wrapText(msg.content, rect.w - 8)) {\n lines.push(singleLine(` ${l}`));\n }\n } else {\n lines.push(singleLine(' Message not found', { dim: true }));\n }\n break;\n }\n\n case 'context': {\n lines = [\n [seg(' '), seg('⊞', { color: 'white' }), seg(` Context (${state.contextFiles.length})`, { bold: true })],\n ];\n if (state.contextFiles.length === 0) {\n lines.push(singleLine(' No context files found.', { dim: true }));\n } else {\n for (const f of state.contextFiles) {\n lines.push(singleLine(` · ${f}`, { dim: true }));\n }\n }\n break;\n }\n\n case 'context-file': {\n const ctxFileNode = cursorNode as ContextFileTreeNode;\n lines = [\n [seg(' '), seg('⊞', { color: 'white' }), seg(` ${ctxFileNode.label}`, { bold: true })],\n singleLine(' '),\n ];\n if (contextFileContent == null) {\n lines.push(singleLine(' File not found or unreadable.', { dim: true }));\n } else {\n const wrapped = wrapText(stripFrontmatter(contextFileContent), rect.w - 8);\n if (wrapped.length === 0) {\n lines.push(singleLine(' (empty)', { dim: true }));\n } else {\n for (const l of wrapped) {\n lines.push(singleLine(` ${l}`));\n }\n }\n }\n borderColor = 'white';\n break;\n }\n\n default: {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent);\n break;\n }\n }\n\n state.cachedDetailLines = lines;\n state.detailCacheKey = cacheKey;\n }\n\n // Compute borderColor from node type (cheap, no need to cache)\n if (cursorNode.type === 'context-file') {\n borderColor = 'white';\n } else if (cursorNode.type === 'report') {\n const reportNode = cursorNode as ReportTreeNode;\n const agent = agents.find((a) => a.id === reportNode.agentId);\n if (agent) {\n const reportIdx = reportNode.reportIndex;\n const specificBlock = detailReportBlocks.find((_b, i) => {\n const originalIdx = agent.reports.length - 1 - i;\n return originalIdx === reportIdx;\n });\n if (specificBlock) borderColor = reportBadge(specificBlock.type).color;\n }\n }\n\n return buildPanelRows(rect, lines, scrollOffset, focused, borderColor, state.detailRenderedCache);\n}\n\nexport function renderLogsRows(\n rect: Rect,\n state: AppState,\n): string[] {\n const focused = state.focusPane === 'logs';\n const scrollOffset = state.logsScroll.offset;\n\n if (state.logsCycles.length === 0) {\n return buildEmptyPanelRows(rect, focused, 'gray', '\\x1b[2mNo logs\\x1b[0m');\n }\n\n const logsCacheKey = `${state.logsCycles.length}:${rect.w}:${state.logsCycles.map((c) => c.cycle).join(',')}`;\n let lines: DetailLine[];\n if (logsCacheKey === state.logsCacheKey && state.cachedLogsLines !== null) {\n lines = state.cachedLogsLines;\n } else {\n lines = buildLogsLines(state.logsCycles, rect.w);\n state.cachedLogsLines = lines;\n state.logsCacheKey = logsCacheKey;\n }\n\n return buildPanelRows(rect, lines, scrollOffset, focused, 'gray', state.logsRenderedCache);\n}\n","import { clipAnsi, colorToSGR, type Rect } from '../render.js';\nimport type { NvimBridge } from '../lib/nvim-bridge.js';\n\n/**\n * Render the neovim detail panel with a status header as self-contained row strings.\n * Produces exactly rect.h strings, each rect.w display columns wide.\n * Compatible with the row-based panel composition in app.ts.\n */\nexport function renderNvimDetailRows(\n rect: Rect,\n bridge: NvimBridge,\n focused: boolean,\n editable: boolean,\n statusRows: string[],\n composing: boolean = false,\n): string[] {\n const { w, h } = rect;\n const rows = new Array<string>(h);\n\n // Border styling — cyan when focused to distinguish nvim mode, gray otherwise\n const borderColor = focused ? 'cyan' : 'gray';\n const sgr = `\\x1b[${colorToSGR(borderColor)}m`;\n const reset = '\\x1b[0m';\n const innerW = w - 4; // border + padding on each side\n\n // Top border — insert badge when focused\n if (focused) {\n const badgeText = composing ? ' COMPOSE ' : editable ? ' EDIT ' : ' NVIM ';\n const badgeLen = badgeText.length;\n const dashesLeft = 2;\n const dashesRight = Math.max(0, w - 2 - dashesLeft - badgeLen);\n rows[0] =\n sgr + '╭' + '─'.repeat(dashesLeft) + reset +\n `\\x1b[${colorToSGR('cyan')};1m` + badgeText + reset +\n sgr + '─'.repeat(dashesRight) + '╮' + reset;\n } else {\n rows[0] = sgr + '╭' + '─'.repeat(w - 2) + '╮' + reset;\n }\n\n // Bottom border\n rows[h - 1] = sgr + '╰' + '─'.repeat(w - 2) + '╯' + reset;\n\n // Border pieces for interior rows\n const borderL = sgr + '│' + reset + ' ';\n const borderR = ' ' + sgr + '│' + reset;\n const blankInner = ' '.repeat(innerW);\n const emptyRow = borderL + blankInner + borderR;\n\n // Pre-fill interior rows with empty content\n for (let i = 1; i < h - 1; i++) rows[i] = emptyRow;\n\n if (innerW <= 0 || h <= 2) return rows;\n\n // Render status rows (ANSI, not nvim)\n const statusCount = statusRows.length;\n for (let i = 0; i < statusCount && i < h - 3; i++) {\n const clipped = clipAnsi(statusRows[i]!, innerW);\n rows[1 + i] = borderL + clipped + borderR;\n }\n\n // Separator between status and nvim content\n const separatorRow = 1 + statusCount;\n if (separatorRow < h - 1) {\n rows[separatorRow] = sgr + '├' + '─'.repeat(w - 2) + '┤' + reset;\n }\n\n // Get neovim screen rows and fill the remaining interior\n const nvimStartRow = separatorRow + 1;\n const nvimRows = bridge.getRows();\n for (let i = nvimStartRow; i < h - 1; i++) {\n const nvimIdx = i - nvimStartRow;\n const nvimRow = nvimRows[nvimIdx];\n if (nvimRow !== undefined) {\n const clipped = clipAnsi(nvimRow, innerW);\n rows[i] = borderL + clipped + borderR;\n }\n }\n\n return rows;\n}\n","import { writeClipped, type FrameBuffer } from '../render.js';\nimport { ansiBold, ansiDim } from '../lib/format.js';\nimport type { AppState } from '../state.js';\nimport type { TreeNodeType } from '../types/tree.js';\n\n// ─── Status Line ──────────────────────────────────────────────────────────────\n\nconst B = ansiBold;\nconst D = ansiDim;\nconst SEP = D('│ ');\n\nexport function renderStatusLine(\n buf: FrameBuffer,\n y: number,\n state: AppState,\n cursorNodeType: TreeNodeType | undefined,\n): void {\n const { mode, focusPane, notification, error } = state;\n\n if (mode === 'report-detail') return;\n if (mode === 'compose') return;\n\n let content: string;\n\n // Notifications/errors take over the status line transiently\n if (notification !== null) {\n const icon = /error|failed/i.test(notification)\n ? '✕'\n : /success|created|killed|sent|copied|deleted/i.test(notification)\n ? '✓'\n : 'ℹ';\n content = `\\x1b[1;33m${icon} ${notification}\\x1b[0m`;\n } else if (error !== null) {\n content = `\\x1b[31m⚠ ${error}\\x1b[0m`;\n } else if (mode === 'search') {\n const cursor = `\\x1b[7m \\x1b[0m`;\n content = `\\x1b[1;34m/\\x1b[0m${state.searchText}${cursor}` + D(' enter to apply · esc to clear');\n } else if (mode === 'leader') {\n content = `\\x1b[1;35mLEADER\\x1b[0m` + D(' press a command key or [esc] to cancel');\n } else if (mode === 'copy-menu') {\n content = `\\x1b[1;36mCOPY\\x1b[0m` + D(' [p] path [C] context [l] logs [s] session ID [esc] cancel');\n } else if (mode === 'help') {\n content = `\\x1b[1;33mHELP\\x1b[0m` + D(' [esc] or [?] to dismiss');\n } else if (focusPane === 'logs' || focusPane === 'detail') {\n content =\n B('[jk/↑↓]') + D(' scroll ') +\n B('[h/←/tab]') + D(' back ') +\n B('[t]') + D('oggle view ') +\n SEP +\n B('[m]') + D('sg ') +\n B('[g]') + D('oal ') +\n B('[n]') + D('ew ') +\n B('[p]') + D('lan ') +\n B('[w]') + D('indow ') +\n B('[R]') + D('esume ') +\n B('[q]') + D('uit');\n } else {\n // tree focused\n let contextFilePart = '';\n if (cursorNodeType === 'context-file') {\n contextFilePart = B('[e]') + D('dit ') + B('[⏎]') + D(' open ');\n }\n content =\n B('[hjkl]') + D(' navigate ') +\n SEP +\n contextFilePart +\n B('[space]') + D(' leader ') +\n B('[tab]') + D(' detail ') +\n B('[t]') + D('oggle view ') +\n SEP +\n B('[m]') + D('sg ') +\n B('[n]') + D('ew ') +\n B('[R]') + D('esume ') +\n B('[q]') + D('uit');\n }\n\n writeClipped(buf, 1, y, content, buf.width - 2);\n}\n","import { execSync } from 'node:child_process';\nimport { writeFileSync, mkdirSync, unlinkSync, readFileSync, statSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\n\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash) + str.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString(36);\n}\n\nexport class NvimBridge {\n private pty: import('node-pty').IPty | null = null;\n private xterm: import('@xterm/headless').Terminal | null = null;\n private _cols: number;\n private _rows: number;\n private onRender: () => void;\n private renderTimer: ReturnType<typeof setTimeout> | null = null;\n\n currentFile: string | null = null;\n ready: boolean = false;\n dirty: boolean = true;\n available: boolean = false;\n respawning: boolean = false;\n /** Set true once nvim has been ready at least once — prevents respawn during initial startup */\n wasReady: boolean = false;\n /** DECSCUSR cursor style: 0=default, 1=blinking block, 2=steady block, 3=blinking underline, 4=steady underline, 5=blinking bar, 6=steady bar */\n cursorStyle: number = 0;\n private cachedRows: string[] | null = null;\n private nvimPath: string = 'nvim';\n private pendingFiles: { files: { path: string; readonly: boolean }[]; key: string } | null = null;\n private fileDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n private cmdDir: string;\n private cmdFile: string;\n /** Tracked editable files: path → { basePath (snapshot), mtimeMs } */\n private editableFiles: Map<string, { basePath: string; mtimeMs: number }> = new Map();\n private mergeStatusFile: string;\n\n constructor(cols: number, rows: number, onRender: () => void) {\n this._cols = cols;\n this._rows = rows;\n this.onRender = onRender;\n\n // Temp file for passing lua commands to nvim without command-line flash\n this.cmdDir = join(tmpdir(), 'sisyphus-nvim');\n mkdirSync(this.cmdDir, { recursive: true });\n this.cmdFile = join(this.cmdDir, `cmd-${process.pid}.lua`);\n this.mergeStatusFile = join(this.cmdDir, `merge-status-${process.pid}.txt`);\n\n try {\n this.nvimPath = execSync('which nvim', { stdio: 'pipe' }).toString().trim();\n this.available = true;\n } catch {\n this.available = false;\n return;\n }\n\n this.spawn().catch(() => {\n this.available = false;\n this.ready = false;\n });\n }\n\n private spawn(): Promise<void> {\n return Promise.all([\n import('node-pty'),\n import('@xterm/headless'),\n ]).then(([nodePty, xtermModule]) => new Promise<void>((resolve) => {\n const { spawn } = nodePty;\n // @xterm/headless is CJS — Terminal lives on the default export when imported from ESM\n const { Terminal } = xtermModule.default as typeof import('@xterm/headless');\n\n this.xterm = new Terminal({\n cols: this._cols,\n rows: this._rows,\n allowProposedApi: true,\n });\n\n const nvimArgs = [\n // Pre-init: only settings needed before user config loads\n '--cmd',\n [\n 'set noswapfile',\n 'set nobackup',\n 'set nowritebackup',\n 'set hidden',\n 'set autoread',\n ].join(' | '),\n // Post-init: cosmetic overrides applied AFTER user config (LazyVim, etc.)\n '-c',\n [\n 'set laststatus=0',\n 'set showtabline=2',\n 'set signcolumn=no',\n 'set nonumber',\n 'set noruler',\n 'set noshowcmd',\n 'set noshowmode',\n 'set shortmess+=F',\n 'set fillchars=eob:\\\\ ',\n 'set scrolloff=3',\n ].join(' | '),\n // Suppress LSP — prevent servers from ever starting (avoids exit warnings)\n '--cmd',\n 'lua vim.lsp.start = function() end',\n // Poll-based command executor: reads lua from temp file — no command-line flash\n '-c',\n `lua local _t = vim.loop.new_timer(); _t:start(100, 50, vim.schedule_wrap(function() local f = io.open('${this.cmdFile.replace(/'/g, \"\\\\'\")}', 'r'); if not f then return end; local c = f:read('*a'); f:close(); os.remove('${this.cmdFile.replace(/'/g, \"\\\\'\")}'); if c and #c > 0 then local fn = loadstring(c); if fn then pcall(fn) end end end))`,\n ];\n\n this.pty = spawn(this.nvimPath, nvimArgs, {\n name: 'xterm-256color',\n cols: this._cols,\n rows: this._rows,\n env: { ...process.env, TERM: 'xterm-256color' } as Record<string, string>,\n });\n\n let settled = false;\n\n this.pty.onData((data: string) => {\n // Track DECSCUSR cursor shape sequences (\\x1b[N q) so we can\n // forward them to the real terminal alongside cursor positioning\n const csMatch = data.match(/\\x1b\\[(\\d+) q/);\n if (csMatch) this.cursorStyle = parseInt(csMatch[1], 10);\n\n this.xterm!.write(data);\n this.dirty = true;\n this.cachedRows = null;\n this.debouncedRender();\n });\n\n this.pty.onExit(() => {\n this.ready = false;\n this.dirty = true;\n this.cachedRows = null;\n this.onRender();\n // Resolve if nvim dies before settling (prevents hanging promise)\n if (!settled) { settled = true; resolve(); }\n });\n\n // Mark ready after nvim + user config have settled\n setTimeout(() => {\n if (this.pty) {\n this.ready = true;\n this.wasReady = true;\n this.dirty = true;\n this.cachedRows = null;\n this.onRender();\n }\n if (!settled) { settled = true; resolve(); }\n }, 500);\n }));\n }\n\n /**\n * Respawn nvim after it exited (e.g. user quit during compose).\n * Cleans up dead instances and re-runs spawn().\n */\n async respawn(): Promise<void> {\n if (!this.available) return;\n if (this.xterm) { this.xterm.dispose(); this.xterm = null; }\n if (this.pty) { try { this.pty.kill(); } catch { /* already dead */ } this.pty = null; }\n this.ready = false;\n this.dirty = true;\n this.cachedRows = null;\n this.currentFile = null;\n await this.spawn();\n }\n\n private debouncedRender(): void {\n if (this.renderTimer !== null) return;\n this.renderTimer = setTimeout(() => {\n this.renderTimer = null;\n this.onRender();\n }, 16); // ~60fps\n }\n\n /**\n * Execute lua in nvim without flashing the command line.\n * Writes lua to a temp file — a libuv timer in nvim polls and executes it.\n */\n private execLua(lua: string): void {\n writeFileSync(this.cmdFile, lua);\n }\n\n openFile(path: string, readonly: boolean = true): void {\n if (!this.pty || !this.ready) return;\n this.currentFile = path;\n const escapeLua = (s: string) => s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n const ro = readonly ? 'vim.bo.readonly = true; vim.bo.modifiable = false' : 'vim.bo.readonly = false; vim.bo.modifiable = true';\n this.execLua(`vim.cmd('edit! ${escapeLua(path)}'); ${ro}`);\n }\n\n openTabFiles(files: { path: string; readonly: boolean }[]): void {\n if (!this.pty || !this.ready || files.length === 0) return;\n const key = files.map(f => f.path).join('|');\n // Debounce — only execute after 150ms of no new calls (prevents LSP churn during scroll)\n this.pendingFiles = { files, key };\n if (this.fileDebounceTimer !== null) clearTimeout(this.fileDebounceTimer);\n this.fileDebounceTimer = setTimeout(() => {\n this.fileDebounceTimer = null;\n if (this.pendingFiles) {\n this.executeOpenFiles(this.pendingFiles.files);\n this.currentFile = this.pendingFiles.key;\n this.pendingFiles = null;\n }\n }, 150);\n }\n\n private executeOpenFiles(files: { path: string; readonly: boolean }[]): void {\n if (!this.pty || !this.ready) return;\n\n // Snapshot editable files for 3-way merge tracking\n this.trackEditableFiles(files);\n\n const escapeLua = (s: string) => s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n const stmts: string[] = [\n 'for _, b in ipairs(vim.api.nvim_list_bufs()) do pcall(vim.api.nvim_buf_delete, b, {force=true}) end',\n ];\n for (let i = 0; i < files.length; i++) {\n const path = escapeLua(files[i]!.path);\n stmts.push(i === 0\n ? `vim.cmd('edit! ${path}')`\n : `vim.cmd('edit ${path}')`);\n if (files[i]!.readonly) {\n stmts.push('vim.bo.readonly = true', 'vim.bo.modifiable = false');\n } else {\n stmts.push('vim.bo.readonly = false', 'vim.bo.modifiable = true');\n }\n }\n stmts.push(\"vim.cmd('bfirst')\");\n this.execLua(`(function() ${stmts.join('; ')} end)()`);\n }\n\n openTabFile(path: string, readonly: boolean): void {\n if (!this.pty || !this.ready) return;\n this.pty.write(`:tabedit ${path}\\r`);\n if (readonly) {\n this.pty.write(':setlocal readonly nomodifiable\\r');\n } else {\n this.pty.write(':setlocal noreadonly modifiable\\r');\n }\n }\n\n /**\n * Open a temp file for compose mode: clears buffers, opens writable,\n * installs BufWritePost autocmd that writes a signal file on :w,\n * and enters insert mode.\n */\n openComposeFile(tempPath: string, signalPath: string): void {\n if (!this.pty || !this.ready) return;\n\n // Cancel any pending file debounce (prevents queued openTabFiles from overwriting)\n if (this.fileDebounceTimer !== null) {\n clearTimeout(this.fileDebounceTimer);\n this.fileDebounceTimer = null;\n this.pendingFiles = null;\n }\n\n const escapeLua = (s: string) => s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n const eSig = escapeLua(signalPath);\n const lua = [\n // Clear all existing buffers\n 'for _, b in ipairs(vim.api.nvim_list_bufs()) do pcall(vim.api.nvim_buf_delete, b, {force=true}) end',\n // Open temp file as writable\n `vim.cmd('edit! ${escapeLua(tempPath)}')`,\n 'vim.bo.readonly = false',\n 'vim.bo.modifiable = true',\n // Install BufWritePost autocmd — writes submit signal on :w\n `vim.api.nvim_create_autocmd('BufWritePost', { buffer = 0, callback = function() local f = io.open('${eSig}', 'w'); if f then f:write('1'); f:close() end end })`,\n // Install QuitPre autocmd — writes cancel signal if no submit signal exists (quit proceeds, nvim may exit)\n `vim.api.nvim_create_autocmd('QuitPre', { buffer = 0, callback = function() local sf = io.open('${eSig}', 'r'); if sf then sf:close() else local f = io.open('${eSig}', 'w'); if f then f:write('cancel'); f:close() end end end })`,\n // Enter insert mode\n \"vim.cmd('startinsert')\",\n ].join('; ');\n this.execLua(`(function() ${lua} end)()`);\n this.currentFile = tempPath;\n }\n\n closeAllTabs(): void {\n if (!this.pty || !this.ready) return;\n this.execLua('for _, b in ipairs(vim.api.nvim_list_bufs()) do pcall(vim.api.nvim_buf_delete, b, {force=true}) end; vim.cmd(\"enew!\")');\n this.currentFile = null;\n }\n\n resize(cols: number, rows: number): void {\n this._cols = cols;\n this._rows = rows;\n this.cachedRows = null;\n this.dirty = true;\n if (this.pty) this.pty.resize(cols, rows);\n if (this.xterm) this.xterm.resize(cols, rows);\n }\n\n write(data: string): void {\n if (this.pty) this.pty.write(data);\n }\n\n getRows(): string[] {\n if (!this.dirty && this.cachedRows) return this.cachedRows;\n if (!this.xterm) return Array.from({ length: this._rows }, () => ' '.repeat(this._cols));\n\n const rows: string[] = [];\n const buffer = this.xterm.buffer.active;\n // Reusable cell to avoid per-cell allocation\n const reusableCell = buffer.getNullCell();\n\n for (let y = 0; y < this._rows; y++) {\n const line = buffer.getLine(y);\n if (!line) {\n rows.push(' '.repeat(this._cols));\n continue;\n }\n\n let row = '';\n let prevFg: number | undefined = undefined;\n let prevBg: number | undefined = undefined;\n let prevFgMode: 'default' | 'palette' | 'rgb' = 'default';\n let prevBgMode: 'default' | 'palette' | 'rgb' = 'default';\n let prevBold = false;\n let prevDim = false;\n let prevItalic = false;\n let prevUnderline = false;\n let prevInverse = false;\n let hasOpenSGR = false;\n\n for (let x = 0; x < this._cols; x++) {\n const cell = line.getCell(x, reusableCell);\n if (!cell) {\n row += ' ';\n continue;\n }\n\n const char = cell.getChars() || ' ';\n\n const fgDefault = cell.isFgDefault();\n const fgPalette = cell.isFgPalette();\n const fgRGB = cell.isFgRGB();\n const fg = fgDefault ? undefined : cell.getFgColor();\n let fgMode: 'default' | 'palette' | 'rgb';\n if (fgDefault) fgMode = 'default';\n else if (fgPalette) fgMode = 'palette';\n else if (fgRGB) fgMode = 'rgb';\n else throw new Error(`Unknown fg color mode at cell (${x}, ${y})`);\n\n const bgDefault = cell.isBgDefault();\n const bgPalette = cell.isBgPalette();\n const bgRGB = cell.isBgRGB();\n const bg = bgDefault ? undefined : cell.getBgColor();\n let bgMode: 'default' | 'palette' | 'rgb';\n if (bgDefault) bgMode = 'default';\n else if (bgPalette) bgMode = 'palette';\n else if (bgRGB) bgMode = 'rgb';\n else throw new Error(`Unknown bg color mode at cell (${x}, ${y})`);\n\n const bold = cell.isBold() !== 0;\n const dim = cell.isDim() !== 0;\n const italic = cell.isItalic() !== 0;\n const underline = cell.isUnderline() !== 0;\n const inverse = cell.isInverse() !== 0;\n\n const attrChanged =\n fg !== prevFg ||\n bg !== prevBg ||\n fgMode !== prevFgMode ||\n bgMode !== prevBgMode ||\n bold !== prevBold ||\n dim !== prevDim ||\n italic !== prevItalic ||\n underline !== prevUnderline ||\n inverse !== prevInverse;\n\n if (attrChanged) {\n if (hasOpenSGR) {\n row += '\\x1b[0m';\n hasOpenSGR = false;\n }\n\n const codes: string[] = [];\n if (bold) codes.push('1');\n if (dim) codes.push('2');\n if (italic) codes.push('3');\n if (underline) codes.push('4');\n if (inverse) codes.push('7');\n\n if (fg !== undefined) {\n if (fgMode === 'palette') {\n codes.push(`38;5;${fg}`);\n } else if (fgMode === 'rgb') {\n const r = (fg >> 16) & 0xff;\n const g = (fg >> 8) & 0xff;\n const b = fg & 0xff;\n codes.push(`38;2;${r};${g};${b}`);\n }\n }\n\n if (bg !== undefined) {\n if (bgMode === 'palette') {\n codes.push(`48;5;${bg}`);\n } else if (bgMode === 'rgb') {\n const r = (bg >> 16) & 0xff;\n const g = (bg >> 8) & 0xff;\n const b = bg & 0xff;\n codes.push(`48;2;${r};${g};${b}`);\n }\n }\n\n if (codes.length > 0) {\n row += `\\x1b[${codes.join(';')}m`;\n hasOpenSGR = true;\n }\n\n prevFg = fg;\n prevBg = bg;\n prevFgMode = fgMode;\n prevBgMode = bgMode;\n prevBold = bold;\n prevDim = dim;\n prevItalic = italic;\n prevUnderline = underline;\n prevInverse = inverse;\n }\n\n row += char;\n }\n\n if (hasOpenSGR) {\n row += '\\x1b[0m';\n }\n\n rows.push(row);\n }\n\n this.cachedRows = rows;\n this.dirty = false;\n return rows;\n }\n\n getCursorPos(): { x: number; y: number } {\n if (!this.xterm) return { x: 0, y: 0 };\n return {\n x: this.xterm.buffer.active.cursorX,\n y: this.xterm.buffer.active.cursorY,\n };\n }\n\n /**\n * Snapshot editable files on disk so we have a base for 3-way merge.\n * Called when files are opened in nvim tabs.\n */\n private trackEditableFiles(files: { path: string; readonly: boolean }[]): void {\n // Clean up old snapshots\n for (const [, info] of this.editableFiles) {\n try { unlinkSync(info.basePath); } catch { /* ignore */ }\n }\n this.editableFiles.clear();\n\n for (const file of files) {\n if (file.readonly) continue;\n try {\n const content = readFileSync(file.path, 'utf-8');\n const mtime = statSync(file.path).mtimeMs;\n const basePath = join(this.cmdDir, `base-${simpleHash(file.path)}.md`);\n writeFileSync(basePath, content, 'utf-8');\n this.editableFiles.set(file.path, { basePath, mtimeMs: mtime });\n } catch { /* file may not exist yet */ }\n }\n }\n\n /**\n * Check editable files for external changes and 3-way merge if the buffer\n * is dirty. Falls back to regular checktime for clean/readonly buffers.\n *\n * Returns a merge status string from the *previous* cycle ('clean' or 'union')\n * if a merge completed, or null.\n */\n mergeCheckOrReload(): string | null {\n if (!this.pty || !this.ready) return null;\n\n // Read merge status from previous cycle\n let mergeResult: string | null = null;\n try {\n if (existsSync(this.mergeStatusFile)) {\n const content = readFileSync(this.mergeStatusFile, 'utf-8').trim();\n unlinkSync(this.mergeStatusFile);\n if (content) {\n const lines = content.split('\\n');\n mergeResult = lines.some(l => l === 'union') ? 'union' : 'clean';\n }\n }\n } catch { /* ignore */ }\n\n // If a merge just completed, refresh stored mtimes (merge wrote to disk)\n if (mergeResult) {\n for (const [filePath, info] of this.editableFiles) {\n try { info.mtimeMs = statSync(filePath).mtimeMs; } catch { /* ignore */ }\n }\n this.execLua('vim.cmd(\"checktime\")');\n return mergeResult;\n }\n\n // Check which editable files changed on disk\n const changedFiles: { filePath: string; basePath: string }[] = [];\n for (const [filePath, info] of this.editableFiles) {\n try {\n const currentMtime = statSync(filePath).mtimeMs;\n if (currentMtime !== info.mtimeMs) {\n changedFiles.push({ filePath, basePath: info.basePath });\n info.mtimeMs = currentMtime;\n }\n } catch { /* file gone */ }\n }\n\n // No editable files changed — regular checktime handles readonly buffers\n if (changedFiles.length === 0) {\n this.execLua('vim.cmd(\"checktime\")');\n return null;\n }\n\n // Generate Lua: run checktime first (reloads clean buffers), then merge dirty ones\n const esc = (s: string) => s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n\n const mergeBlocks = changedFiles.map(({ filePath, basePath }) => `\n do\n local bufnr = vim.fn.bufnr('${esc(filePath)}')\n if bufnr ~= -1 and vim.api.nvim_buf_is_loaded(bufnr) then\n if vim.bo[bufnr].modified then\n local buf_lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)\n local buf_content = table.concat(buf_lines, '\\\\n') .. '\\\\n'\n local tmp = '${esc(this.cmdDir)}/merge-current-${process.pid}.md'\n local f = io.open(tmp, 'w')\n if f then f:write(buf_content); f:close() end\n local result = vim.fn.system({'git', 'merge-file', '-p', '--union', tmp, '${esc(basePath)}', '${esc(filePath)}'})\n local merged_lines = vim.split(result, '\\\\n', {trimempty = false})\n if #merged_lines > 0 and merged_lines[#merged_lines] == '' then\n table.remove(merged_lines)\n end\n vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, merged_lines)\n local out = io.open('${esc(filePath)}', 'w')\n if out then out:write(result); out:close() end\n vim.bo[bufnr].modified = false\n local bf = io.open('${esc(basePath)}', 'w')\n if bf then bf:write(result); bf:close() end\n local sf = io.open('${esc(this.mergeStatusFile)}', 'a')\n if sf then sf:write(vim.v.shell_error == 0 and 'clean' or 'union'); sf:write('\\\\n'); sf:close() end\n else\n local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)\n local bf = io.open('${esc(basePath)}', 'w')\n if bf then bf:write(table.concat(lines, '\\\\n') .. '\\\\n'); bf:close() end\n end\n end\n end`).join('\\n');\n\n this.execLua(`(function()\n pcall(function() vim.cmd('checktime') end)\n ${mergeBlocks}\n end)()`);\n\n return null;\n }\n\n checktime(): void {\n if (this.pty && this.ready) {\n this.execLua('vim.cmd(\"checktime\")');\n }\n }\n\n destroy(): void {\n if (this.renderTimer !== null) {\n clearTimeout(this.renderTimer);\n this.renderTimer = null;\n }\n if (this.fileDebounceTimer !== null) {\n clearTimeout(this.fileDebounceTimer);\n this.fileDebounceTimer = null;\n }\n try {\n if (this.pty) {\n this.pty.kill();\n this.pty = null;\n }\n } catch {\n // ignore kill errors\n }\n if (this.xterm) {\n this.xterm.dispose();\n this.xterm = null;\n }\n this.ready = false;\n try { unlinkSync(this.cmdFile); } catch { /* ignore */ }\n try { unlinkSync(this.mergeStatusFile); } catch { /* ignore */ }\n for (const [, info] of this.editableFiles) {\n try { unlinkSync(info.basePath); } catch { /* ignore */ }\n }\n this.editableFiles.clear();\n }\n}\n","import { writeFileSync, mkdirSync, renameSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tuiScratchDir, goalPath, roadmapPath, strategyPath } from '../../shared/paths.js';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\nimport type { TreeNode } from '../types/tree.js';\nimport type { DetailContext } from '../panels/detail.js';\nimport type { AppState } from '../state.js';\nimport type { ReportBlock } from '../lib/reports.js';\n\n// ---------------------------------------------------------------------------\n// Return type\n// ---------------------------------------------------------------------------\n\nexport interface NvimFileResult {\n files: { path: string; readonly: boolean }[];\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction atomicWrite(filePath: string, content: string): void {\n const tmp = filePath + '.tmp.' + process.pid;\n writeFileSync(tmp, content, 'utf-8');\n renameSync(tmp, filePath);\n}\n\nfunction ensureTuiDir(cwd: string, sessionId: string): string {\n const dir = tuiScratchDir(cwd, sessionId);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction formatTimestamp(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n });\n } catch {\n return iso;\n }\n}\n\nfunction formatDurationMs(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const rem = s % 60;\n if (m < 60) return rem > 0 ? `${m}m ${rem}s` : `${m}m`;\n const h = Math.floor(m / 60);\n const remM = m % 60;\n return remM > 0 ? `${h}h ${remM}m` : `${h}h`;\n}\n\nfunction elapsedSince(start: string, end?: string): string {\n const startMs = new Date(start).getTime();\n const endMs = end ? new Date(end).getTime() : Date.now();\n return formatDurationMs(endMs - startMs);\n}\n\n// ---------------------------------------------------------------------------\n// Compose functions\n// ---------------------------------------------------------------------------\n\nfunction sectionBreak(): string[] {\n return ['', '', '---', '', ''];\n}\n\nfunction composeCycleDetail(session: Session, cycle: OrchestratorCycle): string {\n const isRunning = !cycle.completedAt;\n const dur = isRunning ? 'running' : formatDurationMs(cycle.activeMs);\n const cycleAgents = session.agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n const lines: string[] = [];\n\n lines.push(`# Cycle ${cycle.cycle}`);\n lines.push('');\n lines.push(`**Status:** ${isRunning ? 'running' : 'completed'} | **Duration:** ${dur}`);\n lines.push(`**Started:** ${formatTimestamp(cycle.timestamp)}`);\n if (cycle.completedAt) {\n lines.push(`**Completed:** ${formatTimestamp(cycle.completedAt)}`);\n }\n if (cycle.mode) {\n lines.push(`**Mode:** ${cycle.mode}`);\n }\n if (cycle.claudeSessionId) {\n lines.push(`**Claude Session:** ${cycle.claudeSessionId}`);\n }\n\n // Agents\n lines.push(...sectionBreak());\n lines.push('## Agents');\n lines.push('');\n if (cycleAgents.length === 0) {\n lines.push('_No agents spawned yet._');\n } else {\n for (const agent of cycleAgents) {\n const agentDur = formatDurationMs(agent.activeMs);\n lines.push(`### ${agent.id} — ${agent.name || agent.agentType || agent.id}`);\n lines.push(`- **Status:** ${agent.status} | **Duration:** ${agentDur}`);\n lines.push(`- **Type:** ${agent.agentType || '—'}`);\n if (agent.killedReason) {\n lines.push(`- **Killed reason:** ${agent.killedReason}`);\n }\n lines.push('');\n lines.push('**Instruction:**');\n lines.push('');\n lines.push(agent.instruction);\n const latestReport =\n agent.reports.length > 0 ? agent.reports[agent.reports.length - 1]! : null;\n if (latestReport) {\n lines.push('');\n lines.push(`**Latest report** (${latestReport.type}, ${formatTimestamp(latestReport.timestamp)}):**`);\n lines.push('');\n lines.push(latestReport.summary);\n }\n lines.push('');\n }\n }\n\n // Next prompt\n if (cycle.nextPrompt) {\n lines.push(...sectionBreak());\n lines.push('## Next Prompt');\n lines.push('');\n lines.push(cycle.nextPrompt.trim());\n lines.push('');\n }\n\n return lines.join('\\n') + '\\n';\n}\n\nfunction composeAgentDetail(agent: Agent, reportBlocks: ReportBlock[]): string {\n const dur = formatDurationMs(agent.activeMs);\n const lines: string[] = [];\n\n lines.push(`# ${agent.id} — ${agent.name || agent.agentType || agent.id}`);\n lines.push('');\n lines.push(\n `**Status:** ${agent.status} | **Duration:** ${dur} | **Type:** ${agent.agentType || '—'}`,\n );\n lines.push(`**Spawned:** ${formatTimestamp(agent.spawnedAt)}`);\n if (agent.completedAt) {\n lines.push(`**Completed:** ${formatTimestamp(agent.completedAt)}`);\n }\n if (agent.killedReason) {\n lines.push(`**Killed reason:** ${agent.killedReason}`);\n }\n if (agent.claudeSessionId) {\n lines.push(`**Claude Session:** ${agent.claudeSessionId}`);\n }\n\n lines.push(...sectionBreak());\n lines.push('## Instruction');\n lines.push('');\n lines.push(agent.instruction.trim());\n\n if (reportBlocks.length > 0) {\n lines.push(...sectionBreak());\n lines.push(`## Reports (${reportBlocks.length})`);\n for (const block of reportBlocks) {\n lines.push('');\n const badge = block.type === 'final' ? 'FINAL' : 'UPDATE';\n lines.push(`### ${badge} — ${formatTimestamp(block.timestamp)}`);\n lines.push('');\n lines.push(block.content.trim());\n }\n } else if (agent.reports.length > 0) {\n lines.push(...sectionBreak());\n lines.push(`## Reports (${agent.reports.length})`);\n for (const report of agent.reports) {\n const badge = report.type === 'final' ? 'FINAL' : 'UPDATE';\n lines.push('');\n lines.push(`### ${badge} — ${formatTimestamp(report.timestamp)}`);\n lines.push('');\n lines.push(report.summary);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\nfunction composeMessages(session: Session): string {\n const lines: string[] = [];\n\n lines.push('# Messages');\n lines.push('');\n lines.push(`**Session:** ${session.name ?? session.task.slice(0, 60)}`);\n lines.push(`**Total messages:** ${session.messages.length}`);\n\n if (session.messages.length === 0) {\n lines.push('');\n lines.push('_No messages yet._');\n return lines.join('\\n') + '\\n';\n }\n\n const sorted = [...session.messages].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n for (const msg of sorted) {\n lines.push('');\n lines.push('---');\n lines.push('');\n const src = msg.source;\n let sourceLabel: string;\n if (src.type === 'agent') {\n sourceLabel = src.agentId;\n } else if (src.type === 'user') {\n sourceLabel = 'You';\n } else {\n sourceLabel = src.detail ? `system (${src.detail})` : 'system';\n }\n lines.push(`**From:** ${sourceLabel} | **Time:** ${formatTimestamp(msg.timestamp)}`);\n if (msg.summary && msg.summary !== msg.content) {\n lines.push(`**Summary:** ${msg.summary}`);\n }\n lines.push('');\n lines.push(msg.content.trim());\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Determine which file(s) neovim should display based on the current cursor node.\n * Returns a NvimFileResult with file paths and editability, or null.\n *\n * For session nodes, opens the real files (goal.md, roadmap.md, strategy.md) in splits.\n * For other node types, composes a markdown file in the .tui/ scratch directory.\n */\nexport function resolveNvimFile(\n state: AppState,\n cursorNode: TreeNode | undefined,\n detailCtx: DetailContext,\n cwd: string,\n): NvimFileResult | null {\n if (!cursorNode) return null;\n const sessionId = cursorNode.sessionId;\n if (!sessionId) return null;\n const session = detailCtx.session;\n\n switch (cursorNode.type) {\n case 'session': {\n if (!session) return null;\n const files: { path: string; readonly: boolean }[] = [];\n const gp = goalPath(cwd, sessionId);\n if (existsSync(gp)) files.push({ path: gp, readonly: false });\n const rp = roadmapPath(cwd, sessionId);\n if (existsSync(rp)) files.push({ path: rp, readonly: false });\n const sp = strategyPath(cwd, sessionId);\n if (existsSync(sp)) files.push({ path: sp, readonly: false });\n if (files.length === 0) return null;\n return { files };\n }\n\n case 'cycle': {\n if (!session) return null;\n const cycle = session.orchestratorCycles.find(\n (c) => c.cycle === cursorNode.cycleNumber,\n );\n if (!cycle) return null;\n const dir = ensureTuiDir(cwd, sessionId);\n const filePath = join(dir, `cycle-${cursorNode.cycleNumber}.md`);\n atomicWrite(filePath, composeCycleDetail(session, cycle));\n return { files: [{ path: filePath, readonly: true }] };\n }\n\n case 'agent': {\n if (!session) return null;\n const agent = session.agents.find((a) => a.id === cursorNode.agentId);\n if (!agent) return null;\n const dir = ensureTuiDir(cwd, sessionId);\n const filePath = join(dir, `${agent.id}.md`);\n atomicWrite(filePath, composeAgentDetail(agent, state.cachedReportBlocks.get(agent.id) ?? []));\n return { files: [{ path: filePath, readonly: true }] };\n }\n\n case 'report': {\n const agent = session?.agents.find((a) => a.id === cursorNode.agentId);\n if (agent && agent.reports.length > 0) {\n const report = agent.reports[cursorNode.reportIndex];\n if (report?.filePath && existsSync(report.filePath)) {\n return { files: [{ path: report.filePath, readonly: true }] };\n }\n }\n return null;\n }\n\n case 'context-file': {\n if (cursorNode.filePath && existsSync(cursorNode.filePath)) {\n return { files: [{ path: cursorNode.filePath, readonly: false }] };\n }\n return null;\n }\n\n case 'messages':\n case 'message': {\n if (!session || session.messages.length === 0) return null;\n const dir = ensureTuiDir(cwd, sessionId);\n const filePath = join(dir, 'messages.md');\n atomicWrite(filePath, composeMessages(session));\n return { files: [{ path: filePath, readonly: true }] };\n }\n\n case 'context': {\n return null;\n }\n\n default:\n return null;\n }\n}\n","import { setupTerminal } from './terminal.js';\nimport { createAppState } from './state.js';\nimport { startApp } from './app.js';\nimport { registerDashboardWindow } from './lib/tmux.js';\n\nconst args = process.argv.slice(2);\n\nfunction getArg(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n if (idx !== -1 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n return undefined;\n}\n\nconst cwd = getArg('cwd') ?? process.cwd();\nregisterDashboardWindow();\nconst cleanup = setupTerminal();\nconst state = createAppState(cwd);\nstartApp(state, cleanup);\n"],"mappings":"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","names":["cleanup","key","cwd","state","readFileSync","existsSync","statSync","join","join","cwd","stringWidth","prevFrame","stringWidth","wrapText","divider","state","join","join","readFileSync","writeFileSync","existsSync","mkdirSync","tmpdir","join","existsSync","mkdirSync","cwd","readFileSync","writeFileSync","tmpdir","args","execSync","cleaned","wrapped","state","lines","state","execSync","writeFileSync","mkdirSync","unlinkSync","readFileSync","existsSync","join","tmpdir","writeFileSync","mkdirSync","existsSync","join","writeFileSync","cwd","mkdirSync","state","cwd","existsSync","join","statSync","readFileSync","state","cleanup","existsSync","join","out","treeWidth"]}
1
+ {"version":3,"sources":["../src/tui/state.ts","../src/tui/app.ts","../src/tui/input.ts","../src/tui/lib/tree.ts","../src/tui/lib/format.ts","../src/tui/panels/overlays.ts","../src/tui/panels/mounted-humanloop.ts","../src/tui/lib/tree-render.ts","../src/tui/lib/client.ts","../src/tui/lib/tmux.ts","../src/tui/lib/clipboard.ts","../src/tui/panels/tree.ts","../src/tui/panels/cycle-flow.ts","../src/shared/inbox-types.ts","../src/tui/panels/detail.ts","../src/tui/lib/markdown-highlight.ts","../src/tui/lib/gloam.ts","../src/tui/panels/stacked-detail.ts","../src/tui/panels/bottom.ts","../src/tui/panels/cross-session-inbox.ts","../src/tui/lib/popup-compose.ts","../src/tui/index.ts"],"sourcesContent":["import type { Session } from '../shared/types.js';\nimport type { AggregateInboxItem } from '../shared/inbox-types.js';\nimport type { TreeNode } from './types/tree.js';\nimport type { ReportBlock } from './lib/reports.js';\n\n// ---------------------------------------------------------------------------\n// Polling data interfaces (moved from usePolling.ts)\n// ---------------------------------------------------------------------------\n\nexport interface SessionSummary {\n id: string;\n name?: string;\n task: string;\n status: string;\n agentCount: number;\n runningAgentCount: number;\n createdAt: string;\n activeMs: number;\n tmuxSessionName?: string;\n tmuxSessionId?: string;\n tmuxWindowId?: string;\n /** Cached result of windowExists check — avoids synchronous subprocess in render */\n windowAlive?: boolean;\n orphaned?: boolean;\n}\n\nexport interface CycleLog {\n cycle: number;\n content: string;\n}\n\n// ---------------------------------------------------------------------------\n// InputMode (moved from InputBar.tsx)\n// ---------------------------------------------------------------------------\n\nexport type InputMode =\n | 'navigate'\n | 'report-detail'\n | 'leader'\n | 'copy-menu'\n | 'open-menu'\n | 'agent-menu'\n | 'session-menu'\n | 'go-menu'\n | 'help'\n | 'companion-overlay'\n | 'companion-debug'\n | 'search';\n\n// ---------------------------------------------------------------------------\n// Compose mode types\n// ---------------------------------------------------------------------------\n\nexport type ComposeAction =\n | { kind: 'new-session' }\n | { kind: 'message-orchestrator'; sessionId: string }\n | { kind: 'resume'; sessionId: string }\n | { kind: 'continue'; sessionId: string }\n | { kind: 'spawn-agent'; sessionId: string }\n | { kind: 'message-agent'; sessionId: string; agentId: string };\n\n/** Actions where empty content is allowed (submit without typing) */\nexport const OPTIONAL_COMPOSE = new Set(['resume', 'continue']);\n\n// ---------------------------------------------------------------------------\n// Render scheduling\n// ---------------------------------------------------------------------------\n\nlet renderScheduled = false;\nlet renderFn: (() => void) | null = null;\n\nexport function setRenderFunction(fn: () => void): void {\n renderFn = fn;\n}\n\nexport function requestRender(): void {\n if (renderScheduled) return;\n renderScheduled = true;\n setImmediate(() => {\n renderScheduled = false;\n renderFn?.();\n });\n}\n\n// ---------------------------------------------------------------------------\n// ThrottledScroll\n// ---------------------------------------------------------------------------\n\nconst FRAME_MS = 16; // ~60fps\n\nexport class ThrottledScroll {\n offset: number = 0;\n private target: number = 0;\n private max: number = Infinity;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private onRender: () => void;\n\n constructor(onRender: () => void, initial = 0) {\n this.onRender = onRender;\n this.offset = initial;\n this.target = initial;\n }\n\n private scheduleFlush(): void {\n if (this.timer === null) {\n this.timer = setTimeout(() => {\n this.timer = null;\n this.offset = this.target;\n this.onRender();\n }, FRAME_MS);\n }\n }\n\n private clamp(value: number): number {\n if (value < 0) return 0;\n if (value > this.max) return this.max;\n return value;\n }\n\n scrollBy(delta: number): void {\n this.target = this.clamp(this.target + delta);\n this.scheduleFlush();\n }\n\n scrollTo(value: number): void {\n this.target = this.clamp(value);\n this.scheduleFlush();\n }\n\n // Renderer pushes the current content's max scroll each frame so scrollBy\n // can't accumulate past the bottom. Without this, over-scroll inflates\n // `target` invisibly and reverse scrolls have to burn through the buffer\n // before any visual movement resumes.\n setMax(max: number): void {\n this.max = Math.max(0, max);\n if (this.target > this.max) this.target = this.max;\n if (this.offset > this.max) this.offset = this.max;\n }\n\n reset(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.target = 0;\n this.offset = 0;\n }\n\n destroy(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// AppState\n// ---------------------------------------------------------------------------\n\nexport interface AppState {\n // Terminal dimensions\n rows: number;\n cols: number;\n\n // Tree navigation\n cursorIndex: number;\n expanded: Set<string>;\n mode: InputMode;\n focusPane: 'tree' | 'detail' | 'logs';\n\n // Session\n selectedSessionId: string | null;\n searchFilter: string | null;\n searchText: string;\n targetAgentId: string | null;\n\n // UI\n notification: string | null;\n notificationTimer: ReturnType<typeof setTimeout> | null;\n\n // Scroll\n detailScroll: ThrottledScroll;\n digestScroll: ThrottledScroll;\n\n // Aggregate inbox — fetched from daemon on each poll\n aggregateInbox: AggregateInboxItem[];\n crossSessionInboxScroll: ThrottledScroll;\n cachedInboxLines: import('./lib/format.js').DetailLine[] | null;\n inboxCacheKey: string;\n inboxRenderedCache: import('./render.js').RenderedCache;\n\n // Stacked detail (3b) — cachedStackedLines + stackedCacheKey must be cleared together (cache pair invariant)\n useStackedDetail: boolean;\n detailMode: 'gsr' | 'cycle-log' | 'cross-session-inbox';\n focusedStrip: 'goal' | 'strategy' | 'roadmap';\n goalScroll: ThrottledScroll;\n strategyScroll: ThrottledScroll;\n roadmapScroll: ThrottledScroll;\n cachedStackedLines: {\n goal: import('./lib/format.js').DetailLine[];\n strategy: import('./lib/format.js').DetailLine[];\n roadmap: import('./lib/format.js').DetailLine[];\n cycleLog: import('./lib/format.js').DetailLine[];\n } | null;\n stackedCacheKey: string;\n stackedRenderedCache: import('./render.js').RenderedCache;\n\n // Polling data (from daemon)\n sessions: SessionSummary[];\n selectedSession: Session | null;\n planContent: string;\n strategyContent: string;\n goalContent: string;\n completionSummaryContent: string;\n logsContent: string;\n logsCycles: CycleLog[];\n digestData: import('../shared/types.js').StatusDigest | null;\n paneAlive: boolean;\n contextFiles: string[];\n error: string | null;\n\n // Cursor stabilization\n cursorNodeId: string | null;\n prevNodes: TreeNode[];\n prevCycleCount: number;\n\n // Render caches\n cachedReportBlocks: Map<string, ReportBlock[]>;\n cachedTreeNodes: TreeNode[] | null;\n treeCacheKey: string;\n cachedDetailLines: import('./lib/format.js').DetailLine[] | null;\n detailCacheKey: string;\n detailRenderedCache: import('./render.js').RenderedCache;\n cachedDigestLines: import('./lib/format.js').DetailLine[] | null;\n digestCacheKey: string;\n digestRenderedCache: import('./render.js').RenderedCache;\n\n // Cycle flow\n flowExpanded: boolean;\n\n // Resolution mode (3e)\n resolutionActive: boolean;\n resolutionHandle: import('./panels/mounted-humanloop.js').MountedResolutionHandle | null;\n visuals: Map<string, import('./panels/mounted-humanloop.js').VisualEntry>;\n\n // Config\n cwd: string;\n}\n\nexport function createAppState(cwd: string): AppState {\n const cols = process.stdout.columns ?? 80;\n const rows = process.stdout.rows ?? 24;\n\n const detailScroll = new ThrottledScroll(requestRender);\n const digestScroll = new ThrottledScroll(requestRender);\n const crossSessionInboxScroll = new ThrottledScroll(requestRender);\n const goalScroll = new ThrottledScroll(requestRender);\n const strategyScroll = new ThrottledScroll(requestRender);\n const roadmapScroll = new ThrottledScroll(requestRender);\n\n // Seed default-expanded sections (done stays collapsed)\n const expanded = new Set<string>();\n expanded.add('section:needs-you');\n expanded.add('section:running');\n\n return {\n rows,\n cols,\n cursorIndex: 0,\n expanded,\n mode: 'navigate',\n focusPane: 'tree',\n selectedSessionId: null,\n searchFilter: null,\n searchText: '',\n targetAgentId: null,\n notification: null,\n notificationTimer: null,\n detailScroll,\n digestScroll,\n aggregateInbox: [],\n crossSessionInboxScroll,\n cachedInboxLines: null,\n inboxCacheKey: '',\n inboxRenderedCache: { lines: [], ansi: [] },\n useStackedDetail: process.env.SISYPHUS_USE_STACKED_DETAIL !== '0',\n detailMode: 'gsr',\n focusedStrip: 'roadmap',\n goalScroll,\n strategyScroll,\n roadmapScroll,\n cachedStackedLines: null,\n stackedCacheKey: '',\n stackedRenderedCache: { lines: [], ansi: [] },\n sessions: [],\n selectedSession: null,\n planContent: '',\n strategyContent: '',\n goalContent: '',\n completionSummaryContent: '',\n logsContent: '',\n logsCycles: [],\n digestData: null,\n paneAlive: true,\n contextFiles: [],\n error: null,\n cursorNodeId: null,\n prevNodes: [],\n prevCycleCount: 0,\n cachedReportBlocks: new Map(),\n cachedTreeNodes: null,\n treeCacheKey: '',\n cachedDetailLines: null,\n detailCacheKey: '',\n detailRenderedCache: { lines: [], ansi: [] },\n cachedDigestLines: null,\n digestCacheKey: '',\n digestRenderedCache: { lines: [], ansi: [] },\n flowExpanded: false,\n resolutionActive: false,\n resolutionHandle: null,\n visuals: new Map(),\n cwd,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Notification helper\n// ---------------------------------------------------------------------------\n\nexport function notify(state: AppState, msg: string): void {\n state.notification = msg;\n if (state.notificationTimer !== null) {\n clearTimeout(state.notificationTimer);\n }\n state.notificationTimer = setTimeout(() => {\n state.notification = null;\n state.notificationTimer = null;\n requestRender();\n }, 30_000);\n}\n\n// ---------------------------------------------------------------------------\n// Cursor stabilization\n// ---------------------------------------------------------------------------\n\nexport function stabilizeCursor(state: AppState, nodes: TreeNode[]): void {\n if (nodes.length === 0) {\n state.cursorIndex = 0;\n return;\n }\n\n const targetId = state.cursorNodeId;\n if (targetId === null) {\n state.cursorNodeId = nodes[0]?.id ?? null;\n return;\n }\n\n // If current index already points to the right node, no adjustment needed\n if (nodes[state.cursorIndex]?.id === targetId) return;\n\n // Find the tracked node in the new tree\n const newIndex = nodes.findIndex((n) => n.id === targetId);\n if (newIndex !== -1) {\n state.cursorIndex = newIndex;\n } else {\n // Node is gone (parent collapsed, session removed, etc.) — clamp\n const clamped = Math.min(state.cursorIndex, nodes.length - 1);\n state.cursorIndex = clamped;\n state.cursorNodeId = nodes[clamped]?.id ?? null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Auto-expand cycle\n// ---------------------------------------------------------------------------\n\nexport function autoExpandCycle(state: AppState): void {\n const selectedSession = state.selectedSession;\n if (!selectedSession) return;\n\n const sessionNodeId = `session:${selectedSession.id}`;\n const cycles = selectedSession.orchestratorCycles;\n\n // Only auto-manage cycle expansion if the session is already expanded by user\n if (!state.expanded.has(sessionNodeId)) {\n state.prevCycleCount = cycles.length;\n return;\n }\n\n if (cycles.length === 0) {\n state.prevCycleCount = 0;\n return;\n }\n\n const latest = cycles[cycles.length - 1]!;\n const latestId = `cycle:${selectedSession.id}:${latest.cycle}`;\n\n if (cycles.length > state.prevCycleCount && state.prevCycleCount > 0) {\n // New cycle appeared — collapse previous, expand latest\n const prevCycle = cycles[cycles.length - 2];\n if (prevCycle) {\n const prevId = `cycle:${selectedSession.id}:${prevCycle.cycle}`;\n state.expanded.delete(prevId);\n state.expanded.add(latestId);\n }\n } else if (!state.expanded.has(latestId)) {\n // Ensure latest is expanded\n state.expanded.add(latestId);\n }\n\n state.prevCycleCount = cycles.length;\n}\n","import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport {\n type AppState,\n type SessionSummary,\n type CycleLog,\n setRenderFunction,\n requestRender,\n stabilizeCursor,\n autoExpandCycle,\n notify,\n} from './state.js';\nimport { handleKeypress, type InputActions } from './input.js';\nimport { createFrameBuffer, flushFrame, writeCenter, copyRows } from './render.js';\nimport { writeToStdout, startKeypressListener, onResize } from './terminal.js';\nimport { buildTree } from './lib/tree.js';\nimport { precomputePrefixes } from './lib/tree-render.js';\nimport { resolveReports } from './lib/reports.js';\nimport { send, inboxList } from './lib/client.js';\nimport {\n listAllWindowIds,\n openEditorPopup,\n editInPopup,\n openCompanionPane,\n openClaudeResumePopup,\n openClaudeResumeSession,\n selectWindow,\n selectPane,\n switchToSession,\n paneExists,\n openLogPopup,\n openShellPopup,\n openInFileManager,\n promptInPopup,\n} from './lib/tmux.js';\nimport { copyToClipboard } from './lib/clipboard.js';\nimport { buildSessionContext } from './lib/context.js';\nimport { renderTreePanel } from './panels/tree.js';\nimport { renderDetailRows, renderDigestRows, type DetailContext } from './panels/detail.js';\nimport { renderStackedDetailRows } from './panels/stacked-detail.js';\nimport { renderStatusLine } from './panels/bottom.js';\nimport { renderCrossSessionInboxRows } from './panels/cross-session-inbox.js';\nimport { renderSubmenuOverlay, renderHelpOverlay, renderCompanionOverlay, renderCompanionDebugOverlay } from './panels/overlays.js';\nimport { KEYMAP, MENU_FOR_MODE } from '../shared/keymap.js';\nimport { companionPath } from '../shared/paths.js';\nimport type { CompanionState } from '../shared/companion-types.js';\nimport { composeViaPopup, ensureSisyphusInitLua } from './lib/popup-compose.js';\nimport { loadConfig } from '../shared/config.js';\nimport { roadmapPath, goalPath, strategyPath, logsDir, contextDir, digestPath } from '../shared/paths.js';\nimport { statusIndicator, formatDuration, statusColor, agentStatusIcon, agentDisplayName, truncate, ansiColor, ansiDim, ansiBold } from './lib/format.js';\nimport type { TreeNode } from './types/tree.js';\nimport type { Agent, Session, StatusDigest } from '../shared/types.js';\n\n// ── Module-level companion cache (reloads on mtime change, ~poll interval) ────\n\nlet _cachedCompanion: CompanionState | null = null;\nlet _companionMtime = 0;\n\nfunction getCompanion(): CompanionState | null {\n try {\n const { mtimeMs } = statSync(companionPath());\n if (_cachedCompanion && mtimeMs === _companionMtime) return _cachedCompanion;\n _companionMtime = mtimeMs;\n _cachedCompanion = JSON.parse(readFileSync(companionPath(), 'utf-8')) as CompanionState;\n return _cachedCompanion;\n } catch {\n return _cachedCompanion;\n }\n}\n\n// ── Module-level cache for latest rendered nodes (needed by keypress handler) ─\n\nlet latestNodes: TreeNode[] = [];\n\n// ── Module-level cache for context file content ───────────────────────────────\n\nlet cachedContextFilePath: string | null = null;\nlet cachedContextFileContent: string | null = null;\n\n// ── Previous frame for diffing ────────────────────────────────────────────────\n\nlet prevFrame: string[] = [];\n// Tracks last known resolution state so render() can reset prevFrame on transition\nlet prevResolutionActive = false;\n\n// ── Panel dirty tracking ─────────────────────────────────────────────────────\n// Tracks the inputs that affect each panel. When only the scroll offset changes,\n// we can skip re-rendering panels whose inputs haven't changed.\n\nlet prevTreeInputs = '';\nlet prevBottomInputs = '';\n\n// ── Dynamic tree width ──────────────────────────────────────────────────────\n// Scale tree panel with terminal width so session names aren't aggressively\n// truncated on wide terminals. Min 36 (fits 80-col), max 70.\n\nfunction computeTreeWidth(cols: number): number {\n return Math.min(70, Math.max(36, Math.floor(cols * 0.25)));\n}\nlet prevOverlayMode = '';\nlet cachedTreeRows: string[] = [];\n\n// ── Cycle logs cache (avoids re-reading unchanged files every poll) ───────────\n\nlet cachedLogSessionId: string | null = null;\nlet cachedLogFiles: Map<string, { mtime: number; cycle: number; content: string }> = new Map();\n\n// ── Resolution frame renderer (3e) ───────────────────────────────────────────\n\nfunction renderResolutionFrame(buf: import('./render.js').FrameBuffer, state: AppState): void {\n const handle = state.resolutionHandle!;\n const info = handle.getHeaderInfo();\n const now = new Date().toISOString();\n\n // Build header strip (row 0)\n // Format: [esc] back ●●●○○ N of M sessionName/title ⏱ blocked Xm\n const escPart = ansiDim(' [esc] back');\n\n // Queue dots (max 12)\n const dotLimit = 12;\n const qLen = info.queueLength;\n let dotsPart = '';\n if (qLen <= dotLimit) {\n for (let i = 0; i < qLen; i++) {\n dotsPart += i < info.currentIndex ? '●' : '○';\n }\n } else {\n for (let i = 0; i < dotLimit; i++) {\n dotsPart += i < info.currentIndex ? '●' : '○';\n }\n const trailing = qLen - dotLimit;\n dotsPart += ` +${trailing}`;\n }\n const posLabel = ` ${info.currentIndex + 1} of ${info.queueLength}`;\n\n const sourcePart = info.sessionName\n ? ansiBold(info.sessionName) + (info.askTitle ? `/${truncate(info.askTitle, 32)}` : '')\n : '';\n\n const blocked = formatDuration(info.blockedSince, now);\n const timePart = ansiDim(`⏱ blocked ${blocked}`);\n\n const parts = [escPart, ' ', dotsPart, posLabel, ' ', sourcePart, ' ', timePart];\n let header = parts.join('');\n // Truncate if over width (drop source first, then truncate)\n if (header.replace(/\\x1b\\[[0-9;]*m/g, '').length > state.cols) {\n const shortened = [escPart, ' ', dotsPart, posLabel, ' ', timePart].join('');\n header = shortened;\n }\n buf.lines[0] = header + ' '.repeat(Math.max(0, state.cols - header.replace(/\\x1b\\[[0-9;]*m/g, '').length));\n\n // Rows 1..h-1: humanloop body OR visual (v0 toggle)\n const qid = handle.getCurrentQid();\n const visualEntry = qid ? state.visuals.get(qid) : undefined;\n\n const bodyH = state.rows - 1;\n\n if (visualEntry?.visible && visualEntry.status === 'ready') {\n // v0 toggle: visual replaces humanloop body entirely\n const visualLines = visualEntry.content.split('\\n');\n for (let i = 0; i < bodyH; i++) {\n buf.lines[i + 1] = i < visualLines.length ? visualLines[i]! : '';\n }\n } else {\n // Show humanloop content (with optional loading/error overlay on center row)\n const humanloopLines = handle.render();\n const midRow = Math.floor(bodyH / 2);\n for (let i = 0; i < bodyH; i++) {\n if (visualEntry?.visible && visualEntry.status === 'loading' && i === midRow) {\n const placeholderText = '[generating visual… ~30s]';\n const placeholder = ansiDim(placeholderText);\n const padL = Math.floor((state.cols - placeholderText.length) / 2);\n buf.lines[i + 1] = ' '.repeat(Math.max(0, padL)) + placeholder;\n } else if (visualEntry?.visible && visualEntry.status === 'error' && i === midRow) {\n const errText = visualEntry.error ? visualEntry.error : 'unknown';\n buf.lines[i + 1] = ansiColor(`[visual error: ${errText}]`, 'red') + ansiDim(' [R] retry');\n } else {\n buf.lines[i + 1] = i < humanloopLines.length ? humanloopLines[i]! : '';\n }\n }\n }\n}\n\n// ── Status header constants ──────────────────────────────────────────────────\n\nconst STATUS_ROW_COUNT = 2; // Fixed height for status header (avoids nvim resize on cursor change)\n\nfunction buildStatusRows(\n cursorNode: TreeNode | undefined,\n session: Session | null,\n state: AppState,\n): string[] {\n if (cursorNode?.type === 'needs-you-virtual') {\n const count = state.aggregateInbox.length;\n return [\n ' ' + ansiColor('⚑', 'red', true) + ' ' + ansiColor('Fleet Inbox', 'white', true),\n ' ' + ansiDim(`${count} pending ask${count !== 1 ? 's' : ''} across the fleet`),\n ];\n }\n\n if (cursorNode?.type === 'section') {\n const label = cursorNode.section === 'needs-you' ? 'Needs You' :\n cursorNode.section === 'running' ? 'Running' : 'Done';\n return [ansiDim(` ${label} section`), ''];\n }\n\n if (!cursorNode || !session) {\n return [ansiDim(' No session selected'), ''];\n }\n\n const dur = formatDuration(session.createdAt, session.completedAt);\n const indicator = statusIndicator(session.status);\n const sColor = statusColor(session.status);\n const title = truncate(session.name ?? session.task, 40);\n\n switch (cursorNode.type) {\n case 'session': {\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true),\n ' ' + ansiDim(`${session.status} · ${session.orchestratorCycles.length} cycles · ${session.agents.length} agents · ${dur}`),\n ];\n }\n case 'cycle': {\n const cycle = session.orchestratorCycles.find(c => c.cycle === cursorNode.cycleNumber);\n if (!cycle) return [' ' + ansiColor(title, 'white', true), ''];\n const cDur = cycle.completedAt ? formatDuration(cycle.timestamp, cycle.completedAt) : 'running';\n const cStatus = cycle.completedAt ? 'completed' : 'running';\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true) + ansiDim(` · Cycle ${cycle.cycle}`),\n ' ' + ansiDim(`${cStatus} · ${cDur} · ${cycle.agentsSpawned.length} agents`),\n ];\n }\n case 'agent':\n case 'report': {\n const agentId = cursorNode.type === 'agent' ? cursorNode.agentId : cursorNode.agentId;\n const agent = session.agents.find(a => a.id === agentId);\n if (!agent) return [' ' + ansiColor(title, 'white', true), ''];\n const aIcon = agentStatusIcon(agent.status);\n const aDur = formatDuration(agent.spawnedAt, agent.completedAt);\n const aName = agentDisplayName(agent);\n return [\n ' ' + ansiColor(aIcon, statusColor(agent.status === 'running' ? 'active' : agent.status), true) + ' ' + ansiColor(`${agent.id} · ${aName}`, 'white', true),\n ' ' + ansiDim(`${agent.status} · ${agent.agentType || '—'} · ${aDur}`),\n ];\n }\n case 'context-file': {\n const name = cursorNode.filePath.split('/').pop() ?? cursorNode.filePath;\n return [\n ' ' + ansiColor('⊞', 'white') + ' ' + ansiColor(name, 'white', true),\n ' ' + ansiDim(`context file · ${session.status}`),\n ];\n }\n case 'messages':\n case 'message': {\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true),\n ' ' + ansiDim(`${session.messages.length} messages`),\n ];\n }\n default: {\n return [\n ' ' + ansiColor(indicator, sColor, true) + ' ' + ansiColor(title, 'white', true),\n ' ' + ansiDim(`${session.status} · ${dur}`),\n ];\n }\n }\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction getAgentForNode(node: TreeNode | undefined, agents: Agent[]): Agent | null {\n if (!node) return null;\n if (node.type === 'agent' || node.type === 'report') {\n return agents.find((a) => a.id === node.agentId) ?? null;\n }\n return null;\n}\n\n// ── startApp ──────────────────────────────────────────────────────────────────\n\nexport function startApp(state: AppState, cleanup: () => void): void {\n const config = loadConfig(state.cwd);\n\n // Materialize ~/.config/sisyphus/init.lua if missing (idempotent)\n ensureSisyphusInitLua();\n\n // Track selectedSessionId to detect changes across renders (for immediate poll)\n let prevSelectedSessionId: string | null | undefined = undefined;\n let debouncedPollTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ── Polling ─────────────────────────────────────────────────────────────────\n\n async function poll(): Promise<void> {\n try {\n let selectedSession: Session | null = null;\n let planContent = '';\n let strategyContent = '';\n let goalContent = '';\n let completionSummaryContent = '';\n let logsContent = '';\n let logsCycles: CycleLog[] = [];\n let digestData: StatusDigest | null = null;\n let paneAlive = true;\n let contextFiles: string[] = [];\n\n const listPromise = send({ type: 'list', cwd: state.cwd });\n const statusPromise = state.selectedSessionId\n ? send({ type: 'status', sessionId: state.selectedSessionId, cwd: state.cwd })\n : null;\n const inboxPromise = inboxList();\n\n const [listRes, statusRes, aggregateInbox] = await Promise.all([\n listPromise,\n statusPromise ?? Promise.resolve(null),\n inboxPromise,\n ]);\n state.aggregateInbox = aggregateInbox;\n\n const sessions: SessionSummary[] = listRes.ok\n ? ((listRes.data?.sessions as SessionSummary[] | undefined) ?? [])\n : [];\n\n // Skip expensive sync I/O when resolution mode is active — panels are hidden,\n // data won't be rendered, and blocking here delays keystroke rendering.\n if (!state.resolutionActive) {\n\n // Batch-check window existence in a single tmux call\n const aliveWindows = listAllWindowIds();\n for (const s of sessions) {\n if (s.status !== 'completed' && s.tmuxWindowId) {\n s.windowAlive = aliveWindows.has(s.tmuxWindowId);\n }\n }\n\n if (state.selectedSessionId) {\n if (statusRes?.ok) {\n selectedSession = (statusRes.data?.session as Session | undefined) ?? null;\n }\n\n // Use cached windowAlive from the session list scan above\n if (selectedSession?.tmuxWindowId) {\n const cached = sessions.find((s) => s.id === state.selectedSessionId);\n paneAlive = cached?.windowAlive ?? false;\n }\n\n try {\n const pp = roadmapPath(state.cwd, state.selectedSessionId);\n if (existsSync(pp)) {\n planContent = readFileSync(pp, 'utf-8');\n }\n } catch {\n // roadmap.md may not exist yet\n }\n\n try {\n const gp = goalPath(state.cwd, state.selectedSessionId);\n if (existsSync(gp)) {\n goalContent = readFileSync(gp, 'utf-8');\n }\n } catch {\n // goal.md may not exist yet\n }\n\n try {\n const sp = strategyPath(state.cwd, state.selectedSessionId);\n if (existsSync(sp)) {\n strategyContent = readFileSync(sp, 'utf-8');\n }\n } catch {\n // strategy.md may not exist yet\n }\n\n try {\n const cp = join(contextDir(state.cwd, state.selectedSessionId), 'completion-summary.md');\n if (existsSync(cp)) {\n completionSummaryContent = readFileSync(cp, 'utf-8');\n }\n } catch {\n // completion-summary.md may not exist (only written on done)\n }\n\n try {\n const ld = logsDir(state.cwd, state.selectedSessionId);\n if (existsSync(ld)) {\n // Reset cache when session changes\n if (state.selectedSessionId !== cachedLogSessionId) {\n cachedLogFiles = new Map();\n cachedLogSessionId = state.selectedSessionId;\n }\n\n const files = readdirSync(ld)\n .filter((f) => f.startsWith('cycle-'))\n .sort();\n\n // Remove cache entries for deleted files\n const fileSet = new Set(files);\n for (const key of cachedLogFiles.keys()) {\n if (!fileSet.has(key)) cachedLogFiles.delete(key);\n }\n\n // Only re-read files whose mtime changed\n for (const f of files) {\n const filePath = join(ld, f);\n const mtime = statSync(filePath).mtimeMs;\n const cached = cachedLogFiles.get(f);\n if (!cached || cached.mtime !== mtime) {\n const match = f.match(/cycle-(\\d+)\\.md$/);\n const cycle = match ? parseInt(match[1]!, 10) : 0;\n const content = readFileSync(filePath, 'utf-8');\n cachedLogFiles.set(f, { mtime, cycle, content });\n }\n }\n\n logsCycles = files.map((f) => {\n const entry = cachedLogFiles.get(f)!;\n return { cycle: entry.cycle, content: entry.content };\n });\n logsContent = logsCycles.map((c) => c.content).join('\\n');\n }\n } catch {\n // logs may not exist yet\n }\n\n try {\n const cd = contextDir(state.cwd, state.selectedSessionId);\n if (existsSync(cd)) {\n const entries = readdirSync(cd, { withFileTypes: true })\n .filter((e) => !e.name.startsWith('.'));\n const flat: string[] = [];\n for (const e of entries) {\n if (e.isDirectory()) {\n try {\n const sub = readdirSync(join(cd, e.name))\n .filter((f) => !f.startsWith('.'))\n .map((f) => `${e.name}/${f}`);\n flat.push(...sub);\n } catch {\n // subdir may be unreadable\n }\n } else {\n flat.push(e.name);\n }\n }\n contextFiles = flat.sort();\n }\n } catch {\n // context dir may not exist yet\n }\n\n try {\n const dp = digestPath(state.cwd, state.selectedSessionId);\n if (existsSync(dp)) {\n const raw = JSON.parse(readFileSync(dp, 'utf-8'));\n if (\n raw &&\n typeof raw.recentWork === 'string' &&\n typeof raw.currentActivity === 'string' &&\n typeof raw.whatsNext === 'string' &&\n Array.isArray(raw.unusualEvents)\n ) {\n digestData = raw as StatusDigest;\n }\n }\n } catch {\n // digest.json may not exist or be malformed\n }\n }\n\n // Resolve report files in poll (not render) to avoid sync disk reads on keypress\n state.cachedReportBlocks.clear();\n if (selectedSession) {\n for (const agent of selectedSession.agents) {\n state.cachedReportBlocks.set(agent.id, resolveReports(agent.reports));\n }\n }\n\n } // end !state.resolutionActive\n\n state.sessions = sessions;\n state.selectedSession = selectedSession;\n state.planContent = planContent;\n state.strategyContent = strategyContent;\n state.goalContent = goalContent;\n state.completionSummaryContent = completionSummaryContent;\n state.logsContent = logsContent;\n state.logsCycles = logsCycles;\n state.digestData = digestData;\n state.paneAlive = paneAlive;\n state.contextFiles = contextFiles;\n state.error = null;\n\n requestRender();\n } catch (err) {\n const wasError = state.error !== null;\n state.error = (err as Error).message;\n if (!wasError) prevFrame = []; // force full redraw on error transition\n requestRender();\n }\n }\n\n // ── Render function ──────────────────────────────────────────────────────────\n\n function render(): void {\n const stdoutRows = process.stdout.rows;\n const stdoutCols = process.stdout.columns;\n state.rows = (typeof stdoutRows === 'number' && stdoutRows > 0) ? stdoutRows : 24;\n state.cols = (typeof stdoutCols === 'number' && stdoutCols > 0) ? stdoutCols : 80;\n\n const buf = createFrameBuffer(state.cols, state.rows);\n\n // Terminal too small\n if (state.cols < 60 || state.rows < 12) {\n writeCenter(buf, Math.floor(state.rows / 2), 'Terminal too small — resize to continue');\n const out = flushFrame(buf.lines, prevFrame);\n writeToStdout(out);\n prevFrame = buf.lines;\n return;\n }\n\n // Detect resolution mode transition → force full redraw (CLAUDE.md cache-pair invariant)\n if (state.resolutionActive !== prevResolutionActive) {\n prevFrame = [];\n prevResolutionActive = state.resolutionActive;\n }\n\n // Resolution mode full-screen takeover (3e)\n if (state.resolutionActive && state.resolutionHandle) {\n renderResolutionFrame(buf, state);\n const out = flushFrame(buf.lines, prevFrame, '\\x1b[0 q\\x1b[?25l');\n writeToStdout(out);\n prevFrame = buf.lines;\n return;\n }\n\n // Compute layout\n const treeWidth = computeTreeWidth(state.cols);\n const remaining = state.cols - treeWidth;\n const detailWidth = Math.floor(remaining * 0.6);\n const digestWidth = remaining - detailWidth;\n const contentHeight = state.rows - 1;\n\n const treeRect = { x: 0, y: 0, w: treeWidth, h: contentHeight };\n const detailRect = { x: treeWidth, y: 0, w: detailWidth, h: contentHeight };\n const digestRect = { x: treeWidth + detailWidth, y: 0, w: digestWidth, h: contentHeight };\n const bottomY = contentHeight;\n\n // Derive data\n const filteredSessions: SessionSummary[] = state.searchFilter\n ? state.sessions.filter((s) => {\n const q = state.searchFilter!.toLowerCase();\n return s.task.toLowerCase().includes(q) || s.id.toLowerCase().includes(q);\n })\n : state.sessions;\n\n const statusFP = filteredSessions.map(s => `${s.status}:${s.windowAlive}:${s.runningAgentCount}:${s.orphaned ?? false}`).join(',');\n const inboxFP = `${state.aggregateInbox.length}:${state.aggregateInbox.map(i => i.askId).join(',')}`;\n const cacheKey = `${state.expanded.size}:${filteredSessions.length}:${state.selectedSession?.id}:${state.contextFiles.length}:${state.searchFilter}:${statusFP}:${inboxFP}`;\n let nodes: TreeNode[];\n if (cacheKey === state.treeCacheKey && state.cachedTreeNodes !== null) {\n nodes = state.cachedTreeNodes;\n } else {\n nodes = buildTree(\n filteredSessions,\n state.selectedSession,\n state.expanded,\n state.cwd,\n state.contextFiles,\n state.aggregateInbox,\n );\n precomputePrefixes(nodes);\n state.cachedTreeNodes = nodes;\n state.treeCacheKey = cacheKey;\n }\n\n // Cursor stabilization\n stabilizeCursor(state, nodes);\n\n // Cache latest nodes for keypress handler\n latestNodes = nodes;\n\n // Track cursor node identity\n const cursorNode = nodes[state.cursorIndex];\n if (cursorNode) state.cursorNodeId = cursorNode.id;\n\n // Derive selectedSessionId from cursor\n // section and needs-you-virtual nodes have sessionId === '' — treat as null\n const rawSessionId = cursorNode?.sessionId;\n const newSessionId = rawSessionId ? rawSessionId : null;\n if (newSessionId !== state.selectedSessionId) {\n state.selectedSessionId = newSessionId;\n state.detailScroll.reset();\n state.digestScroll.reset();\n state.cachedDetailLines = null;\n state.detailCacheKey = '';\n state.cachedDigestLines = null;\n state.digestCacheKey = '';\n state.cachedInboxLines = null;\n state.inboxCacheKey = '';\n state.crossSessionInboxScroll.reset();\n state.flowExpanded = false;\n state.goalScroll.reset();\n state.strategyScroll.reset();\n state.roadmapScroll.reset();\n state.cachedStackedLines = null;\n state.stackedCacheKey = '';\n state.detailMode = 'gsr';\n state.focusedStrip = 'roadmap';\n }\n\n // Override detailMode when cursor is on the virtual fleet-inbox node\n if (cursorNode?.type === 'needs-you-virtual') {\n state.detailMode = 'cross-session-inbox';\n } else if (state.detailMode === 'cross-session-inbox') {\n state.detailMode = 'gsr';\n }\n\n // Trigger debounced poll when session changes (avoids poll storm during rapid scrolling)\n if (state.selectedSessionId !== prevSelectedSessionId) {\n prevSelectedSessionId = state.selectedSessionId;\n if (debouncedPollTimer !== null) clearTimeout(debouncedPollTimer);\n if (state.selectedSessionId !== null) {\n debouncedPollTimer = setTimeout(() => {\n debouncedPollTimer = null;\n void poll();\n }, 80);\n }\n }\n\n // Auto-expand cycle\n autoExpandCycle(state);\n\n // Resolve reports for detail panel\n const agents = state.selectedSession?.agents ?? [];\n const reportAgent =\n state.mode === 'report-detail' ? getAgentForNode(cursorNode, agents) : null;\n const reportBlocks = reportAgent ? (state.cachedReportBlocks.get(reportAgent.id) ?? []) : [];\n\n const detailAgent =\n cursorNode?.type === 'agent' || cursorNode?.type === 'report'\n ? getAgentForNode(cursorNode, agents)\n : null;\n const detailReportBlocks = detailAgent\n ? (state.cachedReportBlocks.get(detailAgent.id) ?? [])\n : [];\n\n // Load context file content (cached to avoid re-read on every render)\n let contextFileContent: string | null = null;\n if (cursorNode?.type === 'context-file') {\n if (cursorNode.filePath !== cachedContextFilePath) {\n cachedContextFilePath = cursorNode.filePath;\n try {\n if (existsSync(cursorNode.filePath)) {\n cachedContextFileContent = readFileSync(cursorNode.filePath, 'utf-8');\n } else {\n cachedContextFileContent = null;\n }\n } catch {\n cachedContextFileContent = null;\n }\n }\n contextFileContent = cachedContextFileContent;\n } else {\n // Clear cache when cursor moves away\n cachedContextFilePath = null;\n cachedContextFileContent = null;\n }\n\n // Panel dirty tracking — compute fingerprints for each panel's inputs\n const treeFocused = state.mode === 'navigate' && state.focusPane === 'tree';\n const treeInputs = `${state.treeCacheKey}:${state.cursorIndex}:${treeFocused}`;\n const bottomInputs = `${state.notification}:${state.error}:${state.mode}:${state.searchText}:${cursorNode?.type}`;\n const overlayMode = (state.mode === 'leader' || state.mode === 'copy-menu' || state.mode === 'open-menu' || state.mode === 'agent-menu' || state.mode === 'session-menu' || state.mode === 'go-menu' || state.mode === 'help' || state.mode === 'companion-overlay' || state.mode === 'companion-debug') ? state.mode : '';\n let companionFP = '';\n if (state.mode === 'companion-overlay' || state.mode === 'companion-debug') {\n const c = getCompanion();\n const ts = c && c.lastCommentary ? c.lastCommentary.timestamp : '';\n const xp = c ? c.xp : 0;\n const dm = c?.debugMood ? `${c.debugMood.winner}:${c.debugMood.scores[c.debugMood.winner]}` : '';\n companionFP = `${ts}:${xp}:${dm}`;\n }\n const overlayInputs = `${overlayMode}:${companionFP}`;\n\n const hasPrev = prevFrame.length === buf.height;\n const treeDirty = !hasPrev || treeInputs !== prevTreeInputs;\n const bottomDirty = !hasPrev || bottomInputs !== prevBottomInputs;\n const overlayDirty = !hasPrev || overlayInputs !== prevOverlayMode;\n\n prevTreeInputs = treeInputs;\n prevBottomInputs = bottomInputs;\n prevOverlayMode = overlayInputs;\n\n // Render tree into a narrow buffer (treeWidth-wide) so rows are the right size\n // for concatenation. Cached when clean.\n let treeRows: string[];\n if (treeDirty) {\n const treeBlank = ' '.repeat(treeWidth);\n const treeBuf: import('./render.js').FrameBuffer = {\n lines: Array.from({ length: contentHeight }, () => treeBlank),\n width: treeWidth,\n height: contentHeight,\n };\n renderTreePanel(\n treeBuf,\n { x: 0, y: 0, w: treeWidth, h: contentHeight },\n nodes,\n state.cursorIndex,\n treeFocused,\n getCompanion(),\n );\n cachedTreeRows = treeBuf.lines;\n treeRows = treeBuf.lines;\n } else {\n treeRows = cachedTreeRows;\n }\n\n // Render detail + logs as self-contained row strings, then compose by concatenation.\n // This eliminates all sliceDisplayCols calls — the main scroll bottleneck.\n const detailCtx: DetailContext = {\n nodes,\n session: state.selectedSession,\n agents,\n reportBlocks,\n detailReportBlocks,\n contextFileContent,\n };\n\n let detailRows: string[];\n if (cursorNode?.type === 'needs-you-virtual') {\n detailRows = renderCrossSessionInboxRows(detailRect, state);\n } else if (state.useStackedDetail) {\n detailRows = renderStackedDetailRows(detailRect, state, detailCtx);\n } else {\n detailRows = renderDetailRows(detailRect, state, detailCtx);\n }\n const rightPanelRows = renderDigestRows(digestRect, state);\n\n // Compose panel rows into buffer by concatenation (no slicing/splicing)\n for (let i = 0; i < contentHeight; i++) {\n buf.lines[i] = treeRows[i]! + detailRows[i]! + rightPanelRows[i]!;\n }\n\n // Bottom row (single status line — notifications replace keybindings transiently)\n if (bottomDirty || overlayDirty) {\n renderStatusLine(buf, bottomY, state, cursorNode?.type);\n } else {\n copyRows(buf, prevFrame, bottomY, 1);\n }\n\n // Overlays (rendered AFTER panels — overwrites panel content)\n if (overlayMode) {\n const ACCENT: Record<string, string> = {\n topLevel: 'magenta',\n copy: 'cyan',\n open: 'green',\n agent: 'blue',\n session: 'red',\n go: 'yellow',\n };\n const menuId = MENU_FOR_MODE[state.mode];\n if (menuId) {\n const menu = menuId === 'topLevel' ? KEYMAP.topLevel : KEYMAP.submenus[menuId]!;\n const accent = ACCENT[menuId];\n renderSubmenuOverlay(buf, state.rows, state.cols, menu, accent !== undefined ? accent : 'white');\n }\n if (state.mode === 'help') renderHelpOverlay(buf, state.rows, state.cols);\n if (state.mode === 'companion-overlay') {\n const companion = getCompanion();\n if (companion) renderCompanionOverlay(buf, state.rows, state.cols, companion);\n }\n if (state.mode === 'companion-debug') {\n const companion = getCompanion();\n if (companion) renderCompanionDebugOverlay(buf, state.rows, state.cols, companion);\n }\n }\n\n // Build cursor suffix inside synchronized output block to prevent flicker\n const cursorSuffix = '\\x1b[0 q\\x1b[?25l';\n\n // Flush diff to stdout with cursor positioning inside sync block\n const out = flushFrame(buf.lines, prevFrame, cursorSuffix);\n writeToStdout(out);\n prevFrame = buf.lines;\n }\n\n // ── InputActions ─────────────────────────────────────────────────────────────\n\n const inputActions: InputActions = {\n getNodes: () => latestNodes,\n getCursorNode: () => latestNodes[state.cursorIndex],\n getAgentForNode: (node) => {\n const agents = state.selectedSession?.agents ?? [];\n return getAgentForNode(node, agents);\n },\n sendAndNotify: (request, successMsg) => {\n void send(request)\n .then((res) => {\n if (res.ok) {\n notify(state, successMsg);\n } else {\n const errMsg = res.error ? res.error : 'Unknown error';\n notify(state, `Error: ${errMsg}`);\n }\n })\n .catch((err: Error) => {\n notify(state, `Error: ${err.message}`);\n });\n },\n send,\n composeViaPopup,\n openEditorPopup,\n editInPopup,\n promptInPopup,\n openCompanionPane,\n openClaudeResumePopup,\n openClaudeResumeSession,\n selectWindow,\n selectPane,\n switchToSession,\n paneExists,\n openLogPopup,\n openShellPopup,\n openInFileManager,\n copyToClipboard,\n buildSessionContext,\n resolveEditor: () => {\n if (config.editor) return config.editor;\n if (process.env.EDITOR) return process.env.EDITOR;\n return 'nvim';\n },\n cleanup: () => {\n cleanup();\n process.exit(0);\n },\n };\n\n // ── Wire everything together ─────────────────────────────────────────────────\n\n setRenderFunction(render);\n\n const stopKeypress = startKeypressListener((input, key) => {\n handleKeypress(input, key, state, inputActions);\n });\n\n const stopResize = onResize(() => {\n const stdoutRows = process.stdout.rows;\n const stdoutCols = process.stdout.columns;\n state.rows = (typeof stdoutRows === 'number' && stdoutRows > 0) ? stdoutRows : 24;\n state.cols = (typeof stdoutCols === 'number' && stdoutCols > 0) ? stdoutCols : 80;\n prevFrame = []; // force full redraw\n if (state.resolutionActive && state.resolutionHandle) {\n state.resolutionHandle.handleResize(state.cols, state.rows - 1);\n }\n requestRender();\n });\n\n // Initial poll + recurring interval\n void poll();\n const pollInterval = setInterval(() => void poll(), 2500);\n\n // Register teardown so cleanup() releases all resources\n const origCleanup = inputActions.cleanup;\n inputActions.cleanup = () => {\n clearInterval(pollInterval);\n if (debouncedPollTimer !== null) clearTimeout(debouncedPollTimer);\n stopKeypress();\n stopResize();\n state.resolutionHandle?.unmount();\n state.detailScroll.destroy();\n state.digestScroll.destroy();\n state.goalScroll.destroy();\n state.strategyScroll.destroy();\n state.roadmapScroll.destroy();\n origCleanup();\n };\n\n // Initial render\n requestRender();\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { exportSessionToZip } from '../shared/session-export.js';\nimport type { Key } from './terminal.js';\nimport {\n type AppState,\n type ComposeAction,\n OPTIONAL_COMPOSE,\n requestRender,\n notify,\n} from './state.js';\nimport type { TreeNode } from './types/tree.js';\nimport type { Agent, Session } from '../shared/types.js';\nimport type { Response } from '../shared/protocol.js';\nimport { sessionDir, goalPath, roadmapPath, strategyPath, reportsDir } from '../shared/paths.js';\nimport type { Request } from '../shared/protocol.js';\nimport { findParentIndex } from './lib/tree.js';\nimport { badgeGalleryLeft, badgeGalleryRight, closeBadgeGallery, companionOverlayNextPage, companionOverlayShowHelp, companionOverlayDismissHelp, getCompanionPage, badgeListScrollUp, badgeListScrollDown } from './panels/overlays.js';\nimport { enterResolutionMode } from './panels/mounted-humanloop.js';\nimport { KEYMAP, MENU_FOR_MODE } from '../shared/keymap.js';\nimport type { MenuItem } from '../shared/keymap.js';\n\n// ── Re-exported types (same definition, no React) ─────────────────────────────\n\nexport type LeaderAction =\n // already present\n | { type: 'enter-copy-menu' }\n | { type: 'copy-path' }\n | { type: 'copy-context' }\n | { type: 'copy-logs' }\n | { type: 'copy-session-id' }\n | { type: 'delete-session' }\n | { type: 'open-logs' }\n | { type: 'open-session-dir' }\n | { type: 'open-strategy' }\n | { type: 'open-roadmap' }\n | { type: 'search' }\n | { type: 'jump-to-session'; index: number }\n | { type: 'spawn-agent' }\n | { type: 'message-agent' }\n | { type: 'help' }\n | { type: 'companion-overlay' }\n | { type: 'companion-debug' }\n | { type: 'shell-command' }\n | { type: 'jump-to-pane' }\n | { type: 'export-session' }\n | { type: 'kill' }\n | { type: 'quit' }\n | { type: 'dismiss' }\n // new submenu enters\n | { type: 'enter-open-menu' }\n | { type: 'enter-agent-menu' }\n | { type: 'enter-session-menu' }\n | { type: 'enter-go-menu' }\n // new copy variants\n | { type: 'copy-latest-report' }\n | { type: 'copy-agent-id' }\n // new open variants\n | { type: 'open-goal' }\n | { type: 'open-latest-report' }\n | { type: 'open-scratch' }\n | { type: 'edit-context-file' }\n // new agent variants\n | { type: 'restart-agent' }\n | { type: 'rerun-agent' }\n | { type: 'open-claude-agent' }\n | { type: 'tail-agent-logs' }\n | { type: 'kill-agent' }\n | { type: 'quick-spawn-explore' }\n | { type: 'quick-spawn-debug' }\n // new session variants\n | { type: 'new-session' }\n | { type: 'resume-session' }\n | { type: 'continue-session' }\n | { type: 'rollback' }\n | { type: 'kill-session' }\n | { type: 'go-to-window' }\n | { type: 'clone-session' }\n | { type: 'history' }\n // new go variants\n | { type: 'pick-session' }\n | { type: 'cycle-session' }\n | { type: 'reconnect' }\n // messaging / status\n | { type: 'message-orchestrator' }\n | { type: 'show-status' };\n\nexport interface KeybindingHandlers {\n onMoveUp: () => void;\n onMoveDown: () => void;\n onEnter: () => void;\n onLeft: () => void;\n onRight: () => void;\n onSpace: () => void;\n onTab: () => void;\n onMessage: () => void;\n onGoToWindow: () => void;\n onEditGoal: () => void;\n onNewSession: () => void;\n onClaude: () => void;\n onOpenPlan: () => void;\n onQuit: () => void;\n onReRun: () => void;\n onResume: () => void;\n onContinue: () => void;\n onRestartAgent: () => void;\n onRollback: () => void;\n onToggleLogs: () => void;\n onEdit: () => void;\n}\n\n// ── InputActions interface ─────────────────────────────────────────────────────\n\nexport interface InputActions {\n // Navigation context (computed by caller, passed in)\n getNodes: () => TreeNode[];\n getCursorNode: () => TreeNode | undefined;\n getAgentForNode: (node: TreeNode | undefined) => Agent | null;\n\n // Async daemon operations\n sendAndNotify: (request: Request, successMsg: string) => void;\n send: (request: Request) => Promise<Response>;\n\n // Editor/tmux operations (injected — input.ts must not import these directly)\n openEditorPopup: typeof import('./lib/tmux.js').openEditorPopup;\n editInPopup: typeof import('./lib/tmux.js').editInPopup;\n promptInPopup: typeof import('./lib/tmux.js').promptInPopup;\n openCompanionPane: typeof import('./lib/tmux.js').openCompanionPane;\n openClaudeResumePopup: typeof import('./lib/tmux.js').openClaudeResumePopup;\n openClaudeResumeSession: typeof import('./lib/tmux.js').openClaudeResumeSession;\n selectWindow: typeof import('./lib/tmux.js').selectWindow;\n selectPane: typeof import('./lib/tmux.js').selectPane;\n switchToSession: typeof import('./lib/tmux.js').switchToSession;\n paneExists: typeof import('./lib/tmux.js').paneExists;\n openLogPopup: typeof import('./lib/tmux.js').openLogPopup;\n openShellPopup: typeof import('./lib/tmux.js').openShellPopup;\n openInFileManager: typeof import('./lib/tmux.js').openInFileManager;\n copyToClipboard: typeof import('./lib/clipboard.js').copyToClipboard;\n buildSessionContext: typeof import('./lib/context.js').buildSessionContext;\n\n // Compose via tmux popup\n composeViaPopup: typeof import('./lib/popup-compose.js').composeViaPopup;\n\n // Config\n resolveEditor: () => string;\n\n // Lifecycle\n cleanup: () => void;\n}\n\n/**\n * Map compose action kinds to daemon requests.\n */\nexport function dispatchComposeAction(\n action: ComposeAction,\n content: string,\n state: AppState,\n actions: InputActions,\n): void {\n switch (action.kind) {\n case 'new-session':\n actions.sendAndNotify(\n { type: 'start', task: content, cwd: state.cwd },\n 'Session created',\n );\n break;\n\n case 'message-orchestrator':\n actions.sendAndNotify(\n { type: 'message', sessionId: action.sessionId, content },\n 'Message queued',\n );\n break;\n\n case 'resume':\n actions.sendAndNotify(\n { type: 'resume', sessionId: action.sessionId, cwd: state.cwd, message: content || undefined },\n 'Session resumed',\n );\n break;\n\n case 'continue':\n void (async () => {\n try {\n const contRes = await actions.send({ type: 'continue', sessionId: action.sessionId });\n if (!contRes.ok) { notify(state, `Error: ${contRes.error}`); return; }\n actions.sendAndNotify(\n { type: 'resume', sessionId: action.sessionId, cwd: state.cwd, message: content || undefined },\n 'Session continued',\n );\n } catch (err) {\n notify(state, `Error: ${(err as Error).message}`);\n }\n })();\n break;\n\n case 'spawn-agent':\n actions.sendAndNotify(\n {\n type: 'spawn',\n sessionId: action.sessionId,\n agentType: 'default',\n name: 'agent',\n instruction: content,\n },\n 'Agent spawned',\n );\n break;\n\n case 'message-agent':\n actions.sendAndNotify(\n { type: 'message', sessionId: action.sessionId, content, source: { type: 'agent', agentId: action.agentId } },\n `Message sent to ${action.agentId}`,\n );\n break;\n }\n}\n\n// ── Descriptor-driven dispatcher ──────────────────────────────────────────────\n\n// Maps submenu ref → the LeaderAction type that enters it\nconst ENTER_FOR_REF: Record<string, LeaderAction['type']> = {\n copy: 'enter-copy-menu',\n open: 'enter-open-menu',\n agent: 'enter-agent-menu',\n session: 'enter-session-menu',\n go: 'enter-go-menu',\n};\n\n// Maps tuiAction strings (from MenuItem.tuiAction) to LeaderAction types\nconst TUI_ACTION_FOR_NAME: Record<string, LeaderAction['type']> = {\n 'search': 'search',\n 'edit-context-file':'edit-context-file',\n 'show-leader': 'help',\n};\n\n// Hand-maintained mapping from script/popup name → LeaderAction type.\n// The `satisfies` clause is the compile-time gate: any value not in LeaderAction['type']\n// fails the build immediately. Add a row here when a new descriptor item must\n// be handled in-process by the dashboard.\nconst TUI_HANDLERS = {\n 'sisyphus-copy-path': 'copy-path',\n 'sisyphus-copy-id': 'copy-session-id',\n 'sisyphus-copy-context': 'copy-context',\n 'sisyphus-copy-logs': 'copy-logs',\n 'sisyphus-copy-latest-report': 'copy-latest-report',\n 'sisyphus-copy-agent-id': 'copy-agent-id',\n 'sisyphus-open-goal': 'open-goal',\n 'sisyphus-open-roadmap': 'open-roadmap',\n 'sisyphus-open-strategy': 'open-strategy',\n 'sisyphus-open-logs': 'open-logs',\n 'sisyphus-open-dir': 'open-session-dir',\n 'sisyphus-open-latest-report': 'open-latest-report',\n 'sisyphus-open-scratch': 'open-scratch',\n 'sisyphus-spawn-agent': 'spawn-agent',\n 'sisyphus-msg-agent': 'message-agent',\n 'sisyphus-restart-agent-popup': 'restart-agent',\n 'sisyphus-rerun-agent': 'rerun-agent',\n 'sisyphus-jump-to-pane': 'jump-to-pane',\n 'sisyphus-open-claude-agent': 'open-claude-agent',\n 'sisyphus-tail-agent-logs': 'tail-agent-logs',\n 'sisyphus-kill-agent': 'kill-agent',\n 'sisyphus-quick-spawn-explore': 'quick-spawn-explore',\n 'sisyphus-quick-spawn-debug': 'quick-spawn-debug',\n 'sisyphus-new': 'new-session',\n 'sisyphus-resume-session': 'resume-session',\n 'sisyphus-continue-session': 'continue-session',\n 'sisyphus-rollback-session': 'rollback',\n 'sisyphus-kill-session': 'kill-session',\n 'sisyphus-delete-session': 'delete-session',\n 'sisyphus-export-session': 'export-session',\n 'sisyphus-go-to-window': 'go-to-window',\n 'sisyphus-clone-session': 'clone-session',\n 'sisyphus-history': 'history',\n 'sisyphus-pick-session': 'pick-session',\n 'sisyphus-cycle': 'cycle-session',\n 'sisyphus-reconnect': 'reconnect',\n 'sisyphus-help': 'help',\n 'sisyphus-home': 'cycle-session',\n 'sisyphus-msg': 'message-orchestrator',\n 'sisyphus-status-popup': 'show-status',\n 'sisyphus-kill-pane': 'kill',\n} as const satisfies Record<string, LeaderAction['type']>;\n\nfunction findLatestReport(cwd: string, sessionId: string): string | null {\n const dir = reportsDir(cwd, sessionId);\n try {\n const files = readdirSync(dir);\n if (files.length === 0) return null;\n let latestFile = files[0]!;\n let latestMtime = statSync(join(dir, latestFile)).mtimeMs;\n for (let i = 1; i < files.length; i++) {\n const m = statSync(join(dir, files[i]!)).mtimeMs;\n if (m > latestMtime) { latestMtime = m; latestFile = files[i]!; }\n }\n return join(dir, latestFile);\n } catch { return null; }\n}\n\nfunction goToSessionWindow(state: AppState, actions: InputActions): void {\n const session = state.selectedSession;\n if (!session || !state.selectedSessionId) { notify(state, 'No session selected'); return; }\n\n if (session.status !== 'completed' && state.paneAlive && session.tmuxWindowId) {\n const switchTarget = session.tmuxSessionId ?? session.tmuxSessionName;\n if (switchTarget) actions.switchToSession(switchTarget);\n actions.selectWindow(session.tmuxWindowId);\n return;\n }\n\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n const claudeSessionId = lastCycle?.claudeSessionId;\n if (!claudeSessionId) { notify(state, 'No orchestrator Claude session ID available'); return; }\n try {\n const label = session.name ?? state.selectedSessionId!.slice(0, 8);\n const sessionName = actions.openClaudeResumeSession(state.cwd, state.selectedSessionId!, claudeSessionId, label, lastCycle.resumeEnv, lastCycle.resumeArgs, lastCycle.cycle, lastCycle.mode);\n actions.switchToSession(sessionName);\n } catch {\n notify(state, 'Failed to open Claude session');\n }\n}\n\nfunction dispatchItem(item: MenuItem, state: AppState, actions: InputActions): void {\n if (item.action.type === 'submenu') {\n const t = ENTER_FOR_REF[item.action.ref];\n if (!t) return handleLeaderAction({ type: 'dismiss' }, state, actions);\n return handleLeaderAction({ type: t } as LeaderAction, state, actions);\n }\n if (item.tuiAction) {\n const t = TUI_ACTION_FOR_NAME[item.tuiAction];\n if (t) return handleLeaderAction({ type: t } as LeaderAction, state, actions);\n }\n if (item.action.type === 'tui') {\n const t = TUI_ACTION_FOR_NAME[item.action.action];\n if (t) return handleLeaderAction({ type: t } as LeaderAction, state, actions);\n notify(state, `No tui-action handler for ${item.action.action}`);\n return handleLeaderAction({ type: 'dismiss' }, state, actions);\n }\n if (item.action.type === 'script' || item.action.type === 'popup') {\n const t = TUI_HANDLERS[item.action.name as keyof typeof TUI_HANDLERS];\n if (t) return handleLeaderAction({ type: t } as LeaderAction, state, actions);\n notify(state, `No dashboard handler for ${item.action.name}`);\n return handleLeaderAction({ type: 'dismiss' }, state, actions);\n }\n // tmux-only items silently dismissed on dashboard\n handleLeaderAction({ type: 'dismiss' }, state, actions);\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction expandSessionLatestCycle(state: AppState, node: TreeNode): void {\n if (node.type === 'session' && state.selectedSession?.id === node.sessionId) {\n const cycles = state.selectedSession.orchestratorCycles;\n if (cycles.length > 0) {\n const latest = cycles[cycles.length - 1]!;\n state.expanded.add(`cycle:${node.sessionId}:${latest.cycle}`);\n }\n }\n}\n\n// ── handleReportDetailKey ─────────────────────────────────────────────────────\n\nfunction handleReportDetailKey(input: string, key: Key, state: AppState, _actions: InputActions): void {\n if (key.escape || key.return) {\n state.mode = 'navigate';\n requestRender();\n return;\n }\n if (key.upArrow) {\n state.detailScroll.scrollBy(-1);\n return;\n }\n if (key.downArrow) {\n state.detailScroll.scrollBy(1);\n return;\n }\n}\n\n// ── handleLeaderKey ───────────────────────────────────────────────────────────\n\nfunction handleLeaderAction(action: LeaderAction, state: AppState, actions: InputActions): void {\n const nodes = actions.getNodes();\n const cursorNode = actions.getCursorNode();\n const session = state.selectedSession;\n const selectedSessionId = state.selectedSessionId;\n const agents = session?.agents ?? [];\n\n switch (action.type) {\n case 'enter-copy-menu':\n state.mode = 'copy-menu';\n requestRender();\n return;\n\n case 'copy-path': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const path = sessionDir(state.cwd, selectedSessionId);\n try {\n actions.copyToClipboard(path);\n notify(state, `Copied path (${path})`);\n } catch {\n notify(state, 'Failed to copy to clipboard');\n }\n break;\n }\n\n case 'copy-context': {\n if (!selectedSessionId || !session) { notify(state, 'No session selected'); break; }\n try {\n const xml = actions.buildSessionContext(session, state.cwd);\n actions.copyToClipboard(xml);\n notify(state, `Copied context (${xml.length} chars)`);\n } catch {\n notify(state, 'Failed to copy context');\n }\n break;\n }\n\n case 'copy-logs': {\n if (!state.logsContent) { notify(state, 'No logs content'); break; }\n try {\n actions.copyToClipboard(state.logsContent);\n notify(state, `Copied logs (${state.logsContent.length} chars)`);\n } catch {\n notify(state, 'Failed to copy to clipboard');\n }\n break;\n }\n\n case 'copy-session-id': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n actions.copyToClipboard(selectedSessionId);\n notify(state, `Copied session ID (${selectedSessionId})`);\n } catch {\n notify(state, 'Failed to copy to clipboard');\n }\n break;\n }\n\n case 'delete-session': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n const text = actions.promptInPopup('Delete session? (yes/no):');\n if (text?.trim() === 'yes') {\n actions.sendAndNotify({ type: 'delete', sessionId: selectedSessionId, cwd: state.cwd }, 'Session deleted');\n } else {\n notify(state, 'Delete cancelled');\n }\n } catch {\n notify(state, 'Failed to open prompt');\n }\n break;\n }\n\n case 'open-logs': {\n try {\n actions.openLogPopup();\n } catch {\n notify(state, 'Failed to open log popup');\n }\n break;\n }\n\n case 'open-session-dir': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n actions.openInFileManager(sessionDir(state.cwd, selectedSessionId));\n } catch {\n notify(state, 'Failed to open session directory');\n }\n break;\n }\n\n case 'open-strategy': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, strategyPath(state.cwd, selectedSessionId));\n } catch {\n notify(state, 'Failed to open strategy');\n }\n break;\n }\n\n case 'open-roadmap': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, roadmapPath(state.cwd, selectedSessionId));\n } catch {\n notify(state, 'Failed to open roadmap');\n }\n break;\n }\n\n case 'search': {\n state.mode = 'search';\n state.searchText = '';\n requestRender();\n return;\n }\n\n case 'jump-to-session': {\n let count = 0;\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i]?.type === 'session') {\n count++;\n if (count === action.index) {\n state.cursorIndex = i;\n state.cursorNodeId = nodes[i]!.id;\n break;\n }\n }\n }\n break;\n }\n\n case 'spawn-agent': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n actions.composeViaPopup({ kind: 'spawn-agent', sessionId: selectedSessionId }, state, actions);\n break;\n }\n\n case 'message-agent': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent) { notify(state, 'Cursor must be on an agent'); break; }\n actions.composeViaPopup({ kind: 'message-agent', sessionId: selectedSessionId!, agentId: agent.id }, state, actions);\n break;\n }\n\n case 'help':\n state.mode = 'help';\n requestRender();\n return;\n\n case 'companion-overlay':\n state.mode = 'companion-overlay';\n requestRender();\n return;\n\n case 'companion-debug':\n state.mode = 'companion-debug';\n requestRender();\n return;\n\n case 'shell-command': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n const text = actions.promptInPopup('$', { w: '80%' });\n if (text?.trim()) {\n actions.openShellPopup(state.cwd, text.trim());\n }\n } catch {\n notify(state, 'Failed to open prompt');\n }\n break;\n }\n\n case 'jump-to-pane': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent?.paneId) { notify(state, 'Select an agent with an active pane'); break; }\n if (session?.tmuxSessionName) actions.switchToSession(session.tmuxSessionName);\n if (session?.tmuxWindowId) actions.selectWindow(session.tmuxWindowId);\n actions.selectPane(agent.paneId);\n break;\n }\n\n case 'export-session': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n exportSessionToZip(selectedSessionId, state.cwd)\n .then(outputPath => notify(state, `Exported to ${outputPath}`))\n .catch(err => notify(state, `Export failed: ${(err as Error).message}`));\n break;\n }\n\n case 'kill': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const node = nodes[state.cursorIndex];\n if (node && (node.type === 'agent' || node.type === 'report')) {\n const agentId = node.agentId;\n const agent = agents.find((a) => a.id === agentId);\n if (agent?.status !== 'running') { notify(state, `Agent ${agentId} is not running`); break; }\n actions.sendAndNotify({ type: 'kill-agent', sessionId: selectedSessionId, agentId }, `Killed ${agentId}`);\n } else {\n actions.sendAndNotify({ type: 'kill', sessionId: selectedSessionId }, 'Session killed');\n }\n break;\n }\n\n case 'quit':\n actions.cleanup();\n return;\n\n case 'enter-open-menu':\n state.mode = 'open-menu';\n requestRender();\n return;\n\n case 'enter-agent-menu':\n state.mode = 'agent-menu';\n requestRender();\n return;\n\n case 'enter-session-menu':\n state.mode = 'session-menu';\n requestRender();\n return;\n\n case 'enter-go-menu':\n state.mode = 'go-menu';\n requestRender();\n return;\n\n case 'copy-latest-report': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const latest = findLatestReport(state.cwd, selectedSessionId);\n if (!latest) { notify(state, 'No reports found'); break; }\n try {\n const content = readFileSync(latest, 'utf-8');\n actions.copyToClipboard(content);\n notify(state, `Copied latest report (${content.length} chars)`);\n } catch {\n notify(state, 'Failed to copy report');\n }\n break;\n }\n\n case 'copy-agent-id': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent) { notify(state, 'Cursor must be on an agent'); break; }\n try {\n actions.copyToClipboard(agent.id);\n notify(state, `Copied agent ID (${agent.id})`);\n } catch {\n notify(state, 'Failed to copy to clipboard');\n }\n break;\n }\n\n case 'open-goal': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, goalPath(state.cwd, selectedSessionId));\n } catch {\n notify(state, 'Failed to open goal');\n }\n break;\n }\n\n case 'open-latest-report': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const latest = findLatestReport(state.cwd, selectedSessionId);\n if (!latest) { notify(state, 'No reports found'); break; }\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, latest);\n } catch {\n notify(state, 'Failed to open report');\n }\n break;\n }\n\n case 'open-scratch': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, join(sessionDir(state.cwd, selectedSessionId), 'scratch.md'));\n } catch {\n notify(state, 'Failed to open scratch');\n }\n break;\n }\n\n case 'edit-context-file': {\n if (!cursorNode || cursorNode.type !== 'context-file') { notify(state, 'Cursor must be on a context file'); break; }\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, cursorNode.filePath);\n } catch {\n notify(state, 'Failed to open file in editor');\n }\n break;\n }\n\n case 'restart-agent': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent || !selectedSessionId) { notify(state, 'Select an agent to restart'); break; }\n actions.sendAndNotify(\n { type: 'restart-agent', sessionId: selectedSessionId, agentId: agent.id },\n `Restarted ${agent.id}`,\n );\n break;\n }\n\n case 'rerun-agent': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent || !selectedSessionId) { notify(state, 'Select an agent to re-run'); break; }\n actions.sendAndNotify(\n {\n type: 'spawn',\n sessionId: selectedSessionId,\n agentType: agent.agentType,\n name: `${agent.name}-retry`,\n instruction: agent.instruction,\n },\n `Re-spawned ${agent.name}`,\n );\n break;\n }\n\n case 'open-claude-agent': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent) { notify(state, 'Cursor must be on an agent'); break; }\n if (!agent.claudeSessionId) { notify(state, 'No Claude session ID available'); break; }\n try {\n actions.openClaudeResumePopup(state.cwd, agent.claudeSessionId, agent.resumeEnv, agent.resumeArgs);\n } catch {\n notify(state, 'Failed to open Claude session');\n }\n break;\n }\n\n case 'tail-agent-logs': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent) { notify(state, 'Cursor must be on an agent'); break; }\n if (!agent.paneId) { notify(state, 'Agent has no active pane'); break; }\n try {\n actions.openShellPopup(state.cwd, `tmux capture-pane -t ${agent.paneId} -p -S -2000 | less +G`);\n } catch {\n notify(state, 'Failed to open logs');\n }\n break;\n }\n\n case 'kill-agent': {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent || !selectedSessionId) { notify(state, 'Select an agent to kill'); break; }\n if (agent.status !== 'running') { notify(state, `Agent ${agent.id} is not running`); break; }\n actions.sendAndNotify({ type: 'kill-agent', sessionId: selectedSessionId, agentId: agent.id }, `Killed ${agent.id}`);\n break;\n }\n\n case 'quick-spawn-explore': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n let exploreInstruction: string;\n try {\n exploreInstruction = execSync('pbpaste', { stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim();\n } catch {\n notify(state, 'pbpaste not available — macOS only');\n break;\n }\n if (exploreInstruction.length < 20) {\n notify(state, `Clipboard too short (${exploreInstruction.length} chars; need 20+)`);\n break;\n }\n actions.sendAndNotify(\n { type: 'spawn', sessionId: selectedSessionId, agentType: 'sisyphus:explore', name: `explore-${Date.now()}`, instruction: exploreInstruction },\n 'Explore agent spawned',\n );\n break;\n }\n\n case 'quick-spawn-debug': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n let debugInstruction: string;\n try {\n debugInstruction = execSync('pbpaste', { stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim();\n } catch {\n notify(state, 'pbpaste not available — macOS only');\n break;\n }\n if (debugInstruction.length < 20) {\n notify(state, `Clipboard too short (${debugInstruction.length} chars; need 20+)`);\n break;\n }\n actions.sendAndNotify(\n { type: 'spawn', sessionId: selectedSessionId, agentType: 'sisyphus:debug', name: `debug-${Date.now()}`, instruction: debugInstruction },\n 'Debug agent spawned',\n );\n break;\n }\n\n case 'new-session': {\n actions.composeViaPopup({ kind: 'new-session' }, state, actions);\n break;\n }\n\n case 'resume-session': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n if (session?.status === 'active' && state.paneAlive) { notify(state, 'Session already active'); break; }\n actions.composeViaPopup({ kind: 'resume', sessionId: selectedSessionId }, state, actions);\n break;\n }\n\n case 'continue-session': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n if (session?.status !== 'completed') { notify(state, 'Session not completed'); break; }\n actions.composeViaPopup({ kind: 'continue', sessionId: selectedSessionId }, state, actions);\n break;\n }\n\n case 'rollback': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n const text = actions.promptInPopup('Rollback to cycle:');\n if (text?.trim()) {\n const toCycle = parseInt(text.trim(), 10);\n if (isNaN(toCycle) || toCycle < 1) { notify(state, 'Invalid cycle number'); break; }\n actions.sendAndNotify(\n { type: 'rollback', sessionId: selectedSessionId, cwd: state.cwd, toCycle },\n `Rolled back to cycle ${toCycle} — use [R]esume to respawn`,\n );\n }\n } catch {\n notify(state, 'Failed to open prompt');\n }\n break;\n }\n\n case 'kill-session': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n actions.sendAndNotify({ type: 'kill', sessionId: selectedSessionId }, 'Session killed');\n break;\n }\n\n case 'go-to-window': {\n goToSessionWindow(state, actions);\n break;\n }\n\n case 'clone-session': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n try {\n actions.openShellPopup(state.cwd, `sisyphus session clone ${selectedSessionId}`);\n } catch {\n notify(state, 'Failed to open shell');\n }\n break;\n }\n\n case 'history': {\n try {\n actions.openShellPopup(state.cwd, 'sisyphus admin history');\n } catch {\n notify(state, 'Failed to open shell');\n }\n break;\n }\n\n case 'pick-session': {\n try {\n actions.openShellPopup(state.cwd, 'sisyphus pick-session');\n } catch {\n notify(state, 'Failed to open shell');\n }\n break;\n }\n\n case 'cycle-session': {\n try {\n actions.openShellPopup(state.cwd, 'sisyphus cycle');\n } catch {\n notify(state, 'Failed to open shell');\n }\n break;\n }\n\n case 'reconnect': {\n try {\n actions.openShellPopup(state.cwd, 'sisyphus session reconnect');\n } catch {\n notify(state, 'Failed to open shell');\n }\n break;\n }\n\n case 'message-orchestrator': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n actions.composeViaPopup({ kind: 'message-orchestrator', sessionId: selectedSessionId }, state, actions);\n break;\n }\n\n case 'show-status': {\n try {\n actions.openShellPopup(state.cwd, `sisyphus status${selectedSessionId ? ` ${selectedSessionId}` : ''}`);\n } catch {\n notify(state, 'Failed to open status');\n }\n break;\n }\n\n case 'dismiss':\n closeBadgeGallery();\n break;\n }\n\n state.mode = 'navigate';\n requestRender();\n}\n\nfunction handleOverlayKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n if (state.mode === 'help') {\n if (key.escape || input === '?') { handleLeaderAction({ type: 'dismiss' }, state, actions); }\n // any other key: ignore\n return;\n }\n\n if (state.mode === 'companion-overlay') {\n if (input === '?') {\n if (getCompanionPage() === 'help') companionOverlayDismissHelp();\n else companionOverlayShowHelp();\n requestRender(); return;\n }\n if (key.escape) {\n if (getCompanionPage() === 'help') { companionOverlayDismissHelp(); requestRender(); return; }\n handleLeaderAction({ type: 'dismiss' }, state, actions); return;\n }\n if (key.tab) { companionOverlayNextPage(); requestRender(); return; }\n if (getCompanionPage() === 'badges') {\n if (key.upArrow || input === 'k') { badgeGalleryLeft(); requestRender(); return; }\n if (key.downArrow || input === 'j') { badgeGalleryRight(); requestRender(); return; }\n if (key.leftArrow || input === 'h') { badgeListScrollUp(); requestRender(); return; }\n if (key.rightArrow || input === 'l') { badgeListScrollDown(); requestRender(); return; }\n }\n // any other key: ignore\n return;\n }\n\n if (state.mode === 'companion-debug') {\n handleLeaderAction({ type: 'dismiss' }, state, actions);\n }\n}\n\nfunction handleLeaderKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n // Overlay modes (help, companion-overlay, companion-debug) are not in KEYMAP\n if (state.mode === 'help' || state.mode === 'companion-overlay' || state.mode === 'companion-debug') {\n return handleOverlayKey(input, key, state, actions);\n }\n\n if (key.escape) { handleLeaderAction({ type: 'dismiss' }, state, actions); return; }\n\n const menuId = MENU_FOR_MODE[state.mode];\n if (!menuId) return;\n\n const menu = menuId === 'topLevel' ? KEYMAP.topLevel : KEYMAP.submenus[menuId]!;\n const item = menu.items.find(i => i.key === input);\n if (!item) {\n // Digit 1-9: jump to session — only at top level\n if (state.mode === 'leader') {\n const digit = parseInt(input, 10);\n if (digit >= 1 && digit <= 9) {\n handleLeaderAction({ type: 'jump-to-session', index: digit }, state, actions);\n return;\n }\n }\n handleLeaderAction({ type: 'dismiss' }, state, actions);\n return;\n }\n dispatchItem(item, state, actions);\n}\n\n// Returns the scroll object that j/k should drive when detail pane is focused in stacked mode,\n// or null when the caller should fall through to normal tree/logs scroll logic.\nfunction getActiveDetailScroll(state: AppState) {\n if (state.focusPane !== 'detail' || !state.useStackedDetail) return null;\n if (state.detailMode === 'cycle-log') return state.detailScroll;\n return state.focusedStrip === 'goal' ? state.goalScroll\n : state.focusedStrip === 'strategy' ? state.strategyScroll\n : state.roadmapScroll;\n}\n\n// ── handleResolutionKey ───────────────────────────────────────────────────────\n// Layered-key precedence (load-bearing — see src/tui/CLAUDE.md):\n// 1. esc always wins (even mid comment-buffer)\n// 2. Shift+J/K queue walk, gated by canAcceptHostKeys\n// 3. space/R visual gen/toggle, gated by canAcceptHostKeys\n// 4. fall-through to humanloop\n\nfunction handleResolutionKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n const handle = state.resolutionHandle;\n if (!handle) return;\n\n // 1. esc → exit resolution mode (always wins)\n if (key.escape) {\n handle.unmount();\n return;\n }\n\n // 2. Shift+J / Shift+K → queue walk (only when humanloop can accept host keys)\n if (input === 'J' && handle.canAcceptHostKeys()) {\n handle.advanceQueue(+1);\n return;\n }\n if (input === 'K' && handle.canAcceptHostKeys()) {\n handle.advanceQueue(-1);\n return;\n }\n\n // 3. space → toggle visual / fire generation (gated)\n if (input === ' ' && handle.canAcceptHostKeys()) {\n handle.spaceVisualToggle();\n return;\n }\n\n // 4. R → force regenerate visual (gated)\n if (input === 'R' && handle.canAcceptHostKeys()) {\n handle.regenerateVisual();\n return;\n }\n\n // 5. Fall-through to humanloop\n handle.handleKey(input, key);\n requestRender();\n}\n\n// ── Focus cycle ───────────────────────────────────────────────────────────────\n// Tab / Shift-Tab walks an ordered list of focus stops. In stacked gsr mode,\n// the detail pane expands into three strip stops (goal/strategy/roadmap).\n\ntype FocusStop = {\n pane: AppState['focusPane'];\n strip?: AppState['focusedStrip'];\n};\n\nfunction focusCycle(state: AppState): FocusStop[] {\n const stops: FocusStop[] = [{ pane: 'tree' }];\n if (state.useStackedDetail && state.detailMode === 'gsr') {\n stops.push({ pane: 'detail', strip: 'goal' });\n stops.push({ pane: 'detail', strip: 'strategy' });\n stops.push({ pane: 'detail', strip: 'roadmap' });\n } else {\n stops.push({ pane: 'detail', ...(state.useStackedDetail ? { strip: 'goal' as const } : {}) });\n }\n stops.push({ pane: 'logs' });\n return stops;\n}\n\nfunction currentFocusIndex(stops: FocusStop[], state: AppState): number {\n const exact = stops.findIndex(\n (s) => s.pane === state.focusPane && (s.strip === undefined || s.strip === state.focusedStrip),\n );\n if (exact !== -1) return exact;\n const fuzzy = stops.findIndex((s) => s.pane === state.focusPane);\n return fuzzy === -1 ? 0 : fuzzy;\n}\n\n// ── handleNavigateKey ─────────────────────────────────────────────────────────\n\nfunction handleNavigateKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n const nodes = actions.getNodes();\n const cursorNode = actions.getCursorNode();\n const session = state.selectedSession;\n\n // k / ↑\n if (key.upArrow || input === 'k') {\n const upScroll = getActiveDetailScroll(state);\n if (upScroll) {\n upScroll.scrollBy(-1);\n } else if (state.focusPane === 'detail') {\n state.detailScroll.scrollBy(-1);\n } else if (state.focusPane === 'logs') {\n state.digestScroll.scrollBy(-1);\n } else {\n state.cursorIndex = Math.max(0, state.cursorIndex - 1);\n state.cursorNodeId = nodes[state.cursorIndex]?.id ?? state.cursorNodeId;\n requestRender();\n }\n return;\n }\n\n // j / ↓\n if (key.downArrow || input === 'j') {\n const downScroll = getActiveDetailScroll(state);\n if (downScroll) {\n downScroll.scrollBy(1);\n } else if (state.focusPane === 'detail') {\n state.detailScroll.scrollBy(1);\n } else if (state.focusPane === 'logs') {\n state.digestScroll.scrollBy(1);\n } else {\n state.cursorIndex = Math.min(nodes.length - 1, state.cursorIndex + 1);\n state.cursorNodeId = nodes[state.cursorIndex]?.id ?? state.cursorNodeId;\n requestRender();\n }\n return;\n }\n\n // u / d — fast scroll (vim-style ½-page) for detail/log strips. Tree focus\n // intentionally ignores these so cursor navigation stays single-step (j/k).\n // Roughly half the visible terminal height, clamped to a sensible band so a\n // tiny terminal still moves and a tall one doesn't leap past the strip.\n if (input === 'u' || input === 'd') {\n const direction = input === 'u' ? -1 : 1;\n const fastStep = Math.max(5, Math.min(20, Math.floor(state.rows / 4))) * direction;\n const fastScroll = getActiveDetailScroll(state);\n if (fastScroll) {\n fastScroll.scrollBy(fastStep);\n return;\n }\n if (state.focusPane === 'detail') {\n state.detailScroll.scrollBy(fastStep);\n return;\n }\n if (state.focusPane === 'logs') {\n state.digestScroll.scrollBy(fastStep);\n return;\n }\n return;\n }\n\n // h / ←\n if (key.leftArrow || input === 'h') {\n if (state.focusPane === 'logs') {\n state.focusPane = 'detail';\n requestRender();\n return;\n }\n if (state.focusPane === 'detail') {\n state.focusPane = 'tree';\n requestRender();\n return;\n }\n const node = nodes[state.cursorIndex];\n if (!node) return;\n if (node.expanded) {\n state.expanded.delete(node.id);\n requestRender();\n } else {\n const parentIdx = findParentIndex(nodes, state.cursorIndex);\n if (parentIdx !== state.cursorIndex) {\n state.cursorIndex = parentIdx;\n state.cursorNodeId = nodes[parentIdx]?.id ?? state.cursorNodeId;\n requestRender();\n }\n }\n return;\n }\n\n // l / →\n if (key.rightArrow || input === 'l') {\n const node = nodes[state.cursorIndex];\n if (!node) return;\n // When stacked detail active and cursor is on an already-expanded session in tree focus,\n // toggle between gsr and cycle-log detail mode instead of moving into child.\n if (\n state.useStackedDetail &&\n state.focusPane === 'tree' &&\n node.type === 'session' &&\n node.expanded\n ) {\n state.detailMode = state.detailMode === 'gsr' ? 'cycle-log' : 'gsr';\n state.cachedStackedLines = null;\n state.stackedCacheKey = '';\n requestRender();\n return;\n }\n if (node.expandable && !node.expanded) {\n state.expanded.add(node.id);\n expandSessionLatestCycle(state, node);\n requestRender();\n } else if (node.expandable && node.expanded) {\n // Move cursor to first child\n if (state.cursorIndex + 1 < nodes.length && nodes[state.cursorIndex + 1]!.depth > node.depth) {\n state.cursorIndex += 1;\n state.cursorNodeId = nodes[state.cursorIndex]?.id ?? state.cursorNodeId;\n requestRender();\n }\n }\n return;\n }\n\n // tab / shift+tab: walk the focus cycle forward / backward\n if (key.tab) {\n const stops = focusCycle(state);\n const idx = currentFocusIndex(stops, state);\n const next = stops[(idx + (key.shift ? -1 : 1) + stops.length) % stops.length]!;\n state.focusPane = next.pane;\n if (next.strip) state.focusedStrip = next.strip;\n requestRender();\n return;\n }\n\n // space: enter leader mode\n if (input === ' ') {\n state.mode = 'leader';\n requestRender();\n return;\n }\n\n // enter: expand / report-detail / open context file / resolution mode\n if (key.return) {\n const node = nodes[state.cursorIndex];\n if (!node) return;\n if (node.type === 'needs-you-virtual') {\n const firstItem = state.aggregateInbox[0];\n if (firstItem) {\n enterResolutionMode(state, firstItem.askId, actions.send, async ({ sessionId, agentId, paneId }) => {\n const res = await actions.send({ type: 'status', sessionId });\n const sess = res.ok ? (res.data?.session as Session | undefined) : undefined;\n if (!sess) { notify(state, 'Session not found'); return; }\n if (paneId && actions.paneExists(paneId)) {\n if (sess.tmuxSessionName) actions.switchToSession(sess.tmuxSessionName);\n if (sess.tmuxWindowId) actions.selectWindow(sess.tmuxWindowId);\n actions.selectPane(paneId);\n return;\n }\n if (sess.tmuxSessionName) actions.switchToSession(sess.tmuxSessionName);\n notify(state, `Pane ${paneId ? paneId : '?'} is gone — agent ${agentId} cannot be taken over.`);\n });\n } else {\n notify(state, 'No pending asks');\n }\n } else if (node.expandable && !node.expanded) {\n state.expanded.add(node.id);\n expandSessionLatestCycle(state, node);\n requestRender();\n } else if (node.type === 'report') {\n state.targetAgentId = node.agentId;\n state.mode = 'report-detail';\n requestRender();\n } else if (node.type === 'context-file') {\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, node.filePath);\n } catch {\n notify(state, 'Failed to open file in editor');\n }\n }\n return;\n }\n\n // m: message orchestrator\n if (input === 'm') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n actions.composeViaPopup({ kind: 'message-orchestrator', sessionId: state.selectedSessionId }, state, actions);\n return;\n }\n\n // w: go to tmux window (or resume orchestrator Claude session if window is dead/completed)\n if (input === 'w') {\n goToSessionWindow(state, actions);\n return;\n }\n\n // o: open/resume claude session for agent or orchestrator cycle\n if (input === 'o') {\n if (!cursorNode) { notify(state, 'No node selected'); return; }\n let claudeSessionId: string | undefined;\n let resumeEnv: string | undefined;\n let resumeArgs: string | undefined;\n if (cursorNode.type === 'agent' || cursorNode.type === 'report') {\n const agent = actions.getAgentForNode(cursorNode);\n claudeSessionId = agent?.claudeSessionId ?? undefined;\n resumeEnv = agent?.resumeEnv;\n resumeArgs = agent?.resumeArgs;\n } else if (cursorNode.type === 'cycle' && session) {\n const cycle = session.orchestratorCycles.find(c => c.cycle === cursorNode.cycleNumber);\n claudeSessionId = cycle?.claudeSessionId;\n resumeEnv = cycle?.resumeEnv;\n resumeArgs = cycle?.resumeArgs;\n }\n if (!claudeSessionId) { notify(state, 'No Claude session ID available'); return; }\n try {\n actions.openClaudeResumePopup(state.cwd, claudeSessionId, resumeEnv, resumeArgs);\n } catch {\n notify(state, 'Failed to open Claude session');\n }\n return;\n }\n\n // g: edit goal\n if (input === 'g') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n const gp = goalPath(state.cwd, state.selectedSessionId);\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, gp, { w: '80', h: '50%' });\n } catch {\n notify(state, `Failed to open goal in ${editor}`);\n }\n return;\n }\n\n // n: new session\n if (input === 'n') {\n actions.composeViaPopup({ kind: 'new-session' }, state, actions);\n return;\n }\n\n // c: open companion pane\n if (input === 'c') {\n try {\n actions.openCompanionPane(state.cwd);\n } catch {\n notify(state, 'Failed to open companion pane');\n }\n return;\n }\n\n // p: open plan/roadmap\n if (input === 'p') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n const pp = roadmapPath(state.cwd, state.selectedSessionId);\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, pp);\n } catch {\n notify(state, `Failed to open roadmap in ${editor}`);\n }\n return;\n }\n\n // q: quit\n if (input === 'q') {\n actions.cleanup();\n }\n\n // r: re-run agent\n if (input === 'r') {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent || !state.selectedSessionId) { notify(state, 'Select an agent to re-run'); return; }\n actions.sendAndNotify(\n {\n type: 'spawn',\n sessionId: state.selectedSessionId,\n agentType: agent.agentType,\n name: `${agent.name}-retry`,\n instruction: agent.instruction,\n },\n `Re-spawned ${agent.name}`,\n );\n return;\n }\n\n // R: resume session\n if (input === 'R') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n if (session?.status === 'active' && state.paneAlive) { notify(state, 'Session already active'); return; }\n actions.composeViaPopup({ kind: 'resume', sessionId: state.selectedSessionId }, state, actions);\n return;\n }\n\n // C: continue session\n if (input === 'C') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n if (session?.status !== 'completed') { notify(state, 'Session not completed'); return; }\n actions.composeViaPopup({ kind: 'continue', sessionId: state.selectedSessionId }, state, actions);\n return;\n }\n\n // x: restart agent\n if (input === 'x') {\n const agent = actions.getAgentForNode(cursorNode);\n if (!agent || !state.selectedSessionId) { notify(state, 'Select an agent to restart'); return; }\n actions.sendAndNotify(\n { type: 'restart-agent', sessionId: state.selectedSessionId, agentId: agent.id },\n `Restarted ${agent.id}`,\n );\n return;\n }\n\n // b: rollback to cycle\n if (input === 'b') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n {\n const sessionId = state.selectedSessionId;\n try {\n const text = actions.promptInPopup('Rollback to cycle:');\n if (text?.trim()) {\n const toCycle = parseInt(text.trim(), 10);\n if (isNaN(toCycle) || toCycle < 1) { notify(state, 'Invalid cycle number'); return; }\n actions.sendAndNotify(\n { type: 'rollback', sessionId, cwd: state.cwd, toCycle },\n `Rolled back to cycle ${toCycle} — use [R]esume to respawn`,\n );\n }\n } catch {\n notify(state, 'Failed to open prompt');\n }\n }\n return;\n }\n\n // e: edit context file\n if (input === 'e') {\n if (!cursorNode || cursorNode.type !== 'context-file') return;\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, cursorNode.filePath);\n } catch {\n notify(state, 'Failed to open file in editor');\n }\n return;\n }\n\n // S: edit strategy\n if (input === 'S') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n const sp = strategyPath(state.cwd, state.selectedSessionId);\n const editor = actions.resolveEditor();\n try {\n actions.openEditorPopup(state.cwd, editor, sp);\n } catch {\n notify(state, `Failed to open strategy in ${editor}`);\n }\n return;\n }\n\n // F: toggle cycle flow expanded/collapsed\n if (input === 'F') {\n state.flowExpanded = !state.flowExpanded;\n state.cachedDetailLines = null;\n state.cachedDigestLines = null;\n state.cachedStackedLines = null;\n state.stackedCacheKey = '';\n requestRender();\n return;\n }\n\n // /: search (vim-like, direct from navigate)\n if (input === '/') {\n state.mode = 'search';\n state.searchText = '';\n requestRender();\n return;\n }\n\n}\n\n// ── handleSearchKey ──────────────────────────────────────────────────────────\n\nfunction handleSearchKey(input: string, key: Key, state: AppState): void {\n if (key.return) {\n // Lock in the current filter\n state.mode = 'navigate';\n requestRender();\n return;\n }\n\n if (key.escape) {\n // Clear filter and exit\n state.searchFilter = null;\n state.searchText = '';\n state.mode = 'navigate';\n requestRender();\n return;\n }\n\n if (key.backspace) {\n state.searchText = state.searchText.slice(0, -1);\n state.searchFilter = state.searchText || null;\n requestRender();\n return;\n }\n\n // Ignore control keys\n if (key.ctrl || key.meta || !input || input.length !== 1) return;\n\n state.searchText += input;\n state.searchFilter = state.searchText;\n requestRender();\n}\n\n// ── Main dispatch ─────────────────────────────────────────────────────────────\n\nexport function handleKeypress(input: string, key: Key, state: AppState, actions: InputActions): void {\n // Resolution mode intercepts all keys (before mode checks — esc always exits)\n if (state.resolutionActive) {\n handleResolutionKey(input, key, state, actions);\n return;\n }\n if (state.mode === 'search') {\n handleSearchKey(input, key, state);\n } else if (state.mode === 'leader' || state.mode === 'copy-menu' || state.mode === 'open-menu' || state.mode === 'agent-menu' || state.mode === 'session-menu' || state.mode === 'go-menu' || state.mode === 'help' || state.mode === 'companion-overlay' || state.mode === 'companion-debug') {\n handleLeaderKey(input, key, state, actions);\n } else if (state.mode === 'report-detail') {\n handleReportDetailKey(input, key, state, actions);\n } else {\n handleNavigateKey(input, key, state, actions);\n }\n}\n","import { join } from 'node:path';\nimport { messageSourceLabel } from './format.js';\nimport type {\n TreeNode,\n SectionTreeNode,\n NeedsYouVirtualTreeNode,\n SessionTreeNode,\n CycleTreeNode,\n AgentTreeNode,\n ReportTreeNode,\n MessagesTreeNode,\n MessageTreeNode,\n ContextTreeNode,\n ContextFileTreeNode,\n SectionKey,\n} from '../types/tree.js';\nimport type { Session } from '../../shared/types.js';\nimport type { SessionSummary } from '../state.js';\nimport type { AggregateInboxItem } from '../../shared/inbox-types.js';\nimport { contextDir } from '../../shared/paths.js';\n\n/** Sort priority: active+open=0, active+closed=1, paused+open=2, paused+closed=3, completed=4 */\nfunction sessionSortKey(s: SessionSummary): number {\n if (s.status === 'completed') return 4;\n // Use cached windowAlive from polling hook (avoids execSync in render path)\n const open = s.windowAlive ?? false;\n if (s.status === 'active') return open ? 0 : 1;\n // paused — goes in Running section (not Done)\n return open ? 2 : 3;\n}\n\nexport function buildTree(\n sessions: SessionSummary[],\n selectedSession: Session | null,\n expanded: Set<string>,\n cwd: string,\n polledContextFiles: string[] = [],\n aggregateInbox: AggregateInboxItem[] = [],\n): TreeNode[] {\n const nodes: TreeNode[] = [];\n\n // Build per-session inbox index\n const inboxBySession = new Map<string, AggregateInboxItem[]>();\n for (const item of aggregateInbox) {\n const arr = inboxBySession.get(item.sessionId) ?? [];\n arr.push(item);\n inboxBySession.set(item.sessionId, arr);\n }\n\n // Bucket sessions\n const needsYou: SessionSummary[] = [];\n const running: SessionSummary[] = [];\n const done: SessionSummary[] = [];\n for (const s of sessions) {\n if (inboxBySession.has(s.id)) needsYou.push(s);\n else if (s.status === 'completed') done.push(s);\n else running.push(s); // active + paused both land here\n }\n\n // Sort within each bucket\n needsYou.sort((a, b) => {\n const aItems = inboxBySession.get(a.id)!;\n const bItems = inboxBySession.get(b.id)!;\n const aOldest = Math.min(...aItems.map(i => Date.parse(i.blockedSince)));\n const bOldest = Math.min(...bItems.map(i => Date.parse(i.blockedSince)));\n return aOldest - bOldest;\n });\n running.sort((a, b) => {\n const k = sessionSortKey(a) - sessionSortKey(b);\n if (k !== 0) return k;\n return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n });\n // SessionSummary has no completedAt — sort done by createdAt descending\n done.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt));\n\n // Emit helpers\n function sectionExpanded(key: SectionKey): boolean {\n return expanded.has(`section:${key}`);\n }\n\n function emitSection(key: SectionKey, count: number): void {\n const exp = sectionExpanded(key);\n nodes.push({\n id: `section:${key}`,\n type: 'section',\n depth: 0,\n section: key,\n count,\n expandable: true,\n expanded: exp,\n sessionId: '',\n prefix: '',\n } satisfies SectionTreeNode);\n }\n\n function emitSessionChildren(s: SessionSummary): void {\n if (!selectedSession || selectedSession.id !== s.id) return;\n\n const cycles = [...selectedSession.orchestratorCycles].reverse();\n const allSpawnedIds = new Set(\n selectedSession.orchestratorCycles.flatMap((c) => c.agentsSpawned),\n );\n\n for (const cycle of cycles) {\n const cycleNodeId = `cycle:${s.id}:${cycle.cycle}`;\n const cycleExpanded = expanded.has(cycleNodeId);\n\n const cycleAgents = selectedSession.agents.filter((a) =>\n cycle.agentsSpawned.includes(a.id),\n );\n const isLatest = cycle === cycles[0];\n const unassigned = isLatest\n ? selectedSession.agents.filter((a) => !allSpawnedIds.has(a.id))\n : [];\n const allCycleAgents = [...cycleAgents, ...unassigned];\n\n nodes.push({\n id: cycleNodeId,\n type: 'cycle',\n depth: 2,\n expandable: allCycleAgents.length > 0,\n expanded: cycleExpanded,\n sessionId: s.id,\n cycleNumber: cycle.cycle,\n timestamp: cycle.timestamp,\n completedAt: cycle.completedAt,\n activeMs: cycle.activeMs,\n agentCount: allCycleAgents.length,\n mode: cycle.mode,\n } satisfies CycleTreeNode);\n\n if (!cycleExpanded) continue;\n\n for (const agent of allCycleAgents) {\n const agentNodeId = `agent:${s.id}:${agent.id}`;\n const hasReports = agent.reports.length > 0;\n const agentExpanded = expanded.has(agentNodeId);\n\n nodes.push({\n id: agentNodeId,\n type: 'agent',\n depth: 3,\n expandable: hasReports,\n expanded: agentExpanded && hasReports,\n sessionId: s.id,\n agentId: agent.id,\n name: agent.name,\n agentType: agent.agentType,\n status: agent.status,\n spawnedAt: agent.spawnedAt,\n completedAt: agent.completedAt,\n activeMs: agent.activeMs,\n reportCount: agent.reports.length,\n orphaned: agent.orphaned ?? false,\n } satisfies AgentTreeNode);\n\n if (!agentExpanded || !hasReports) continue;\n\n for (let ri = 0; ri < agent.reports.length; ri++) {\n const report = agent.reports[ri]!;\n nodes.push({\n id: `report:${s.id}:${agent.id}:${ri}`,\n type: 'report',\n depth: 4,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n reportIndex: ri,\n reportType: report.type,\n timestamp: report.timestamp,\n agentId: agent.id,\n } satisfies ReportTreeNode);\n }\n }\n }\n\n // Messages group\n const messages = selectedSession.messages ?? [];\n if (messages.length > 0) {\n const msgsNodeId = `messages:${s.id}`;\n const msgsExpanded = expanded.has(msgsNodeId);\n\n nodes.push({\n id: msgsNodeId,\n type: 'messages',\n depth: 2,\n expandable: true,\n expanded: msgsExpanded,\n sessionId: s.id,\n count: messages.length,\n } satisfies MessagesTreeNode);\n\n if (msgsExpanded) {\n for (const msg of messages) {\n const agentId = msg.source.type === 'agent' ? msg.source.agentId : undefined;\n const sourceLabel = messageSourceLabel(msg.source.type, agentId);\n\n nodes.push({\n id: `message:${s.id}:${msg.id}`,\n type: 'message',\n depth: 3,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n messageId: msg.id,\n source: sourceLabel,\n summary: msg.summary || msg.content,\n timestamp: msg.timestamp,\n } satisfies MessageTreeNode);\n }\n }\n }\n\n // Context group\n const isSelected = selectedSession?.id === s.id;\n const contextFiles = isSelected ? polledContextFiles : [];\n\n const ctxNodeId = `context:${s.id}`;\n const ctxExpanded = expanded.has(ctxNodeId);\n\n nodes.push({\n id: ctxNodeId,\n type: 'context',\n depth: 2,\n expandable: contextFiles.length > 0,\n expanded: ctxExpanded && contextFiles.length > 0,\n sessionId: s.id,\n fileCount: contextFiles.length,\n } satisfies ContextTreeNode);\n\n if (ctxExpanded && contextFiles.length > 0) {\n for (const filename of contextFiles) {\n nodes.push({\n id: `context-file:${s.id}:${filename}`,\n type: 'context-file',\n depth: 3,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n label: filename,\n filePath: join(contextDir(cwd, s.id), filename),\n } satisfies ContextFileTreeNode);\n }\n }\n }\n\n function emitSessionRow(s: SessionSummary, askCount: number): void {\n const sessionNodeId = `session:${s.id}`;\n const isSelected = selectedSession?.id === s.id;\n const isExpanded = expanded.has(sessionNodeId);\n\n nodes.push({\n id: sessionNodeId,\n type: 'session',\n depth: 1,\n expandable: true,\n expanded: isExpanded && isSelected,\n sessionId: s.id,\n name: s.name,\n task: s.task,\n status: s.status,\n cycleCount: isSelected ? (selectedSession?.orchestratorCycles.length ?? 0) : 0,\n agentCount: s.agentCount,\n runningAgentCount: s.runningAgentCount,\n createdAt: s.createdAt,\n completedAt: isSelected ? selectedSession?.completedAt : undefined,\n activeMs: isSelected ? (selectedSession?.activeMs ?? s.activeMs) : s.activeMs,\n askCount: askCount > 0 ? askCount : undefined,\n orphaned: s.orphaned ?? false,\n } satisfies SessionTreeNode);\n\n if (isExpanded && isSelected) {\n emitSessionChildren(s);\n }\n }\n\n // Emit Needs You section\n emitSection('needs-you', needsYou.length);\n if (sectionExpanded('needs-you')) {\n nodes.push({\n id: 'needs-you-virtual',\n type: 'needs-you-virtual',\n depth: 1,\n expandable: false,\n expanded: false,\n sessionId: '',\n pendingCount: aggregateInbox.length,\n } satisfies NeedsYouVirtualTreeNode);\n for (const s of needsYou) {\n emitSessionRow(s, inboxBySession.get(s.id)?.length ?? 0);\n }\n }\n\n // Emit Running section\n emitSection('running', running.length);\n if (sectionExpanded('running')) {\n for (const s of running) {\n emitSessionRow(s, 0);\n }\n }\n\n // Emit Done section\n emitSection('done', done.length);\n if (sectionExpanded('done')) {\n for (const s of done) {\n emitSessionRow(s, 0);\n }\n }\n\n return nodes;\n}\n\n/** Find the parent node index for a given node index */\nexport function findParentIndex(nodes: TreeNode[], index: number): number {\n const node = nodes[index];\n if (!node || node.depth === 0) return index;\n const targetDepth = node.depth - 1;\n for (let i = index - 1; i >= 0; i--) {\n if (nodes[i]!.depth === targetDepth) return i;\n if (nodes[i]!.depth < targetDepth) return i;\n }\n return 0;\n}\n","import stringWidth from 'string-width';\n\nexport { formatDuration, statusColor } from '../../shared/format.js';\n\nexport function formatTimeAgo(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n}\n\nexport function formatTime(iso: string): string {\n const d = new Date(iso);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`;\n}\n\nexport function truncate(text: string, max: number): string {\n // Collapse newlines and normalize wide emoji (see cleanMarkdown for rationale)\n const clean = text.replace(/\\n/g, ' ').replace(/✅/g, '✓').replace(/❌/g, '✗').replace(/\\p{Emoji_Presentation}/gu, '');\n if (max < 4) return clean.slice(0, max);\n const w = stringWidth(clean);\n if (w <= max) return clean;\n // Trim from the end until we fit, respecting display width\n let result = clean;\n while (stringWidth(result) > max - 1 && result.length > 0) {\n // Try to break at a word boundary\n const cut = result.lastIndexOf(' ', result.length - 2);\n if (cut > max * 0.4) {\n result = result.slice(0, cut);\n } else {\n result = result.slice(0, result.length - 1);\n }\n }\n return result + '…';\n}\n\n/** Strip markdown syntax to plain text */\nexport function stripMarkdown(text: string): string {\n return text\n .replace(/^#{1,6}\\s+/gm, '')\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/`{1,3}[^`]*`{1,3}/g, '')\n .replace(/^[-*+]\\s+/gm, '')\n .replace(/^\\d+[.)]\\s+/gm, '')\n .replace(/\\[(.+?)\\]\\(.+?\\)/g, '$1')\n .replace(/^>\\s+/gm, '')\n .replace(/---+/g, '')\n .replace(/\\n+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract the first meaningful sentence from markdown-heavy text.\n * Much better than blind truncation — finds actual content.\n */\nexport function extractFirstSentence(text: string, maxLen: number): string {\n const lines = text.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('#')) continue;\n if (trimmed.startsWith('---')) continue;\n if (trimmed.startsWith('```')) continue;\n if (trimmed.startsWith('|')) continue;\n if (trimmed.length < 5) continue;\n\n const cleaned = stripMarkdown(trimmed);\n if (cleaned.length < 5) continue;\n\n // Try to end at a sentence boundary\n const periodIdx = cleaned.indexOf('. ');\n if (periodIdx > 10 && periodIdx < maxLen) {\n return cleaned.slice(0, periodIdx + 1);\n }\n return truncate(cleaned, maxLen);\n }\n const fallback = stripMarkdown(text);\n return truncate(fallback, maxLen);\n}\n\nexport function durationColor(startOrMs: string | number, endIso?: string | null): string {\n let totalMs: number;\n if (typeof startOrMs === 'number') {\n totalMs = startOrMs;\n } else {\n const start = new Date(startOrMs).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n totalMs = end - start;\n }\n if (totalMs < 10 * 60 * 1000) return '';\n if (totalMs < 30 * 60 * 1000) return 'yellow';\n return 'red';\n}\n\nexport function statusIndicator(status: string): string {\n switch (status) {\n case 'active':\n return '▶';\n case 'completed':\n return '✓';\n case 'paused':\n return '⏸';\n default:\n return '·';\n }\n}\n\nexport function agentStatusIcon(status: string): string {\n switch (status) {\n case 'running':\n return '▶';\n case 'completed':\n return '✓';\n case 'killed':\n return '✕';\n case 'crashed':\n return '!';\n case 'lost':\n return '?';\n default:\n return '·';\n }\n}\n\nexport function agentTypeColor(agentType: string | undefined): string | undefined {\n if (!agentType) return undefined;\n const t = agentType.toLowerCase();\n if (t.includes('research')) return 'blue';\n if (t.includes('implement') || t.includes('code')) return 'green';\n if (t.includes('review') || t.includes('test')) return 'magenta';\n if (t.includes('plan')) return 'yellow';\n return undefined;\n}\n\nexport function divider(width: number, char: string = '─'): string {\n return char.repeat(Math.max(0, width));\n}\n\n/** Strip YAML frontmatter (--- ... ---) from markdown content */\nexport function stripFrontmatter(content: string): string {\n if (!content.startsWith('---')) return content;\n const end = content.indexOf('\\n---', 3);\n if (end === -1) return content;\n return content.slice(end + 4).trimStart();\n}\n\n/** Clean inline markdown syntax for terminal display */\nexport function cleanMarkdown(line: string): string {\n return line\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/`(.+?)`/g, '$1')\n .replace(/\\[(.+?)\\]\\(.+?\\)/g, '$1')\n // Normalize wide emoji → single-width alternatives.\n // Ink's @alcalzone/ansi-tokenize treats emoji as width=1, but terminals\n // render them as width=2. This mismatch causes lines to overflow by 1\n // column, wrapping the right border to the next row (phantom blank lines).\n .replace(/✅/g, '✓')\n .replace(/❌/g, '✗')\n .replace(/\\p{Emoji_Presentation}/gu, '');\n}\n\n// Shared line types for scrollable panels\n\nexport type Seg = {\n text: string;\n color?: string;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n inverse?: boolean;\n strikethrough?: boolean;\n /** ANSI 38;2;R;G;B foreground tint (e.g. '38;2;226;217;198'). Wins over `color` when set. */\n fg?: string;\n /** ANSI 48;2;R;G;B background tint (e.g. '48;2;40;35;20') */\n bg?: string;\n};\n\nexport type DetailLine = Seg[];\n\nexport function seg(text: string, opts?: Partial<Omit<Seg, 'text'>>): Seg {\n return { text, ...opts };\n}\n\n/** Create a single-segment DetailLine */\nexport function singleLine(text: string, opts?: Partial<Omit<Seg, 'text'>>): DetailLine {\n return [seg(text, opts)];\n}\n\nexport function messageSourceLabel(source: string, agentId?: string): string {\n if (source === 'user') return 'You';\n if (source === 'agent') {\n if (!agentId) throw new Error('agentId required when source is agent');\n return agentId;\n }\n return 'system';\n}\n\nexport function messageSourceColor(source: string): string {\n if (source === 'user') return 'yellow';\n if (source === 'agent') return 'cyan';\n return 'gray';\n}\n\nexport function reportBadge(type: string): { label: string; color: string } {\n return type === 'final'\n ? { label: 'FINAL', color: 'cyan' }\n : { label: 'UPDATE', color: 'yellow' };\n}\n\nexport function agentDisplayName(agent: { name: string; id: string; agentType: string }): string {\n return agent.name !== agent.id ? agent.name : agent.agentType;\n}\n\nexport function abbreviateMode(mode: string | undefined | null): string {\n if (!mode) return '';\n if (mode === 'implementation') return 'impl';\n if (mode === 'planning') return 'plan';\n if (mode === 'discovery') return 'disc';\n if (mode === 'validation') return 'valid';\n return mode;\n}\n\nexport function ansiBold(text: string): string {\n return `\\x1b[1m${text}\\x1b[0m`;\n}\n\nexport function ansiDim(text: string): string {\n return `\\x1b[2m${text}\\x1b[0m`;\n}\n\nexport function ansiColor(text: string, color: string, bold = false): string {\n const COLOR_MAP: Record<string, number> = { black: 30, red: 31, green: 32, yellow: 33, blue: 34, magenta: 35, cyan: 36, white: 37, gray: 90 };\n const codes: number[] = [];\n if (bold) codes.push(1);\n const sgr = COLOR_MAP[color];\n if (sgr !== undefined) codes.push(sgr);\n if (codes.length === 0) return text;\n return `\\x1b[${codes.join(';')}m${text}\\x1b[0m`;\n}\n\nexport function modeColor(mode?: string): string {\n if (mode === 'planning') return 'blue';\n if (mode === 'implementation') return 'green';\n if (mode === 'discovery') return 'yellow';\n if (mode === 'validation') return 'magenta';\n return 'cyan';\n}\n\nexport function mergeStatusDisplay(status: string): { icon: string; label: string; color: string } | null {\n switch (status) {\n case 'merged': return { icon: '⊕', label: 'merged', color: 'green' };\n case 'pending': return { icon: '◌', label: 'pending', color: 'yellow' };\n case 'no-changes': return { icon: '∅', label: 'no changes', color: 'gray' };\n case 'conflict': return { icon: '⚠', label: 'conflict', color: 'red' };\n default: return null;\n }\n}\n\nexport function wrapText(text: string, width: number): string[] {\n const cleaned = cleanMarkdown(text);\n if (width <= 0) return cleaned.split('\\n');\n const result: string[] = [];\n for (const rawLine of cleaned.split('\\n')) {\n if (stringWidth(rawLine) <= width) {\n result.push(rawLine);\n continue;\n }\n\n // Single-pass: walk characters tracking cumulative display width\n let lineStart = 0;\n let lastSpace = -1;\n let displayWidth = 0;\n\n for (let i = 0; i < rawLine.length; i++) {\n const charWidth = stringWidth(rawLine[i]!);\n displayWidth += charWidth;\n\n if (rawLine[i] === ' ') lastSpace = i;\n\n if (displayWidth > width) {\n let breakAt: number;\n if (lastSpace > lineStart) {\n // Break at last space that fits\n breakAt = lastSpace;\n result.push(rawLine.slice(lineStart, breakAt));\n // Skip past the space and any leading spaces\n lineStart = breakAt + 1;\n while (lineStart < rawLine.length && rawLine[lineStart] === ' ') lineStart++;\n } else {\n // No space — hard break at previous char\n breakAt = Math.max(lineStart + 1, i);\n result.push(rawLine.slice(lineStart, breakAt));\n lineStart = breakAt;\n }\n\n // Recalculate display width for the carried-over portion\n displayWidth = stringWidth(rawLine.slice(lineStart, i + 1));\n lastSpace = -1;\n }\n }\n\n if (lineStart < rawLine.length) {\n result.push(rawLine.slice(lineStart));\n }\n }\n return result;\n}\n","import { drawBorder, writeClipped, type FrameBuffer } from '../render.js';\nimport { ansiColor, ansiDim, ansiBold } from '../lib/format.js';\nimport type { MenuDef } from '../../shared/keymap.js';\nimport type { CompanionState, AchievementDef, Mood } from '../../shared/companion-types.js';\nimport { getMoodFace } from '../../shared/companion-render.js';\nimport { computeLevelProgress } from '../../daemon/companion.js';\nimport { ACHIEVEMENTS } from '../../shared/companion-types.js';\nimport {\n createBadgeGallery,\n renderBadgeCard,\n galleryNext,\n galleryPrev,\n CARD_WIDTH,\n type BadgeGallery,\n} from '../../shared/companion-badges.js';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst HELP_WIDTH = 62;\nconst COMPANION_WIDTH = 52;\nconst DEBUG_WIDTH = 50;\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction helpRow(left: string, right: string, innerWidth: number): string {\n const col = Math.floor(innerWidth / 2);\n return (left.padEnd(col) + right).padEnd(innerWidth);\n}\n\n// ─── Overlays ─────────────────────────────────────────────────────────────────\n\nexport function renderSubmenuOverlay(\n buf: FrameBuffer,\n rows: number,\n cols: number,\n menu: MenuDef,\n accentColor: string,\n): void {\n const visibleItems = menu.items.filter(i => !i.hidden && i.action.type !== 'tmux');\n const title = menu.title.trim();\n\n // Width: max of title+padding, each item line, and the esc footer\n const maxLabelLen = Math.max(\n title.length + 2,\n ...visibleItems.map(i => i.label.trim().length + 5), // ' k trimmed-label'\n 13, // ' esc cancel'\n );\n const innerWidth = Math.min(maxLabelLen, 32);\n const totalWidth = innerWidth + 2;\n\n // Height: title + blank + items (clamped) + esc\n const contentCount = visibleItems.length;\n const totalHeight = contentCount + 4; // title + blank + items + esc + 2 borders = +4 inner rows\n const clampedHeight = Math.min(totalHeight, rows - 2);\n\n const x = cols - totalWidth - 1;\n const y = rows - clampedHeight - 2;\n\n drawBorder(buf, x, y, totalWidth, clampedHeight, accentColor);\n\n let row = 0;\n writeClipped(buf, x + 1, y + 1 + row, ansiColor(` ${title}`.padEnd(innerWidth), accentColor, true), innerWidth);\n row++;\n writeClipped(buf, x + 1, y + 1 + row, ' '.padEnd(innerWidth), innerWidth);\n row++;\n\n for (const item of visibleItems) {\n if (row >= clampedHeight - 2) break;\n const line = ` ${item.key} ${item.label.trim()}`.padEnd(innerWidth);\n writeClipped(buf, x + 1, y + 1 + row, line, innerWidth);\n row++;\n }\n\n if (row < clampedHeight - 1) {\n writeClipped(buf, x + 1, y + 1 + row, ansiDim(' esc cancel'.padEnd(innerWidth)), innerWidth);\n }\n}\n\nexport function renderHelpOverlay(buf: FrameBuffer, rows: number, cols: number): void {\n const innerWidth = HELP_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - HELP_WIDTH) / 2));\n\n const contentLines: string[] = [\n // Nav-mode keys\n helpRow(' hjkl/↑↓←→ navigate', ' tab switch pane', innerWidth),\n helpRow(' enter expand/open', ' F toggle flow', innerWidth),\n helpRow(' n new session', ' m message orch.', innerWidth),\n helpRow(' R resume session', ' C continue session', innerWidth),\n helpRow(' b rollback cycle', ' x restart agent', innerWidth),\n helpRow(' r re-run agent', ' g edit goal', innerWidth),\n helpRow(' p open roadmap', ' S edit strategy', innerWidth),\n helpRow(' w go to window', ' o resume claude', innerWidth),\n helpRow(' c claude companion', ' q quit', innerWidth),\n ' '.padEnd(innerWidth),\n // Leader direct keys (top-level space-key)\n helpRow(' space s cycle session', ' space h home/dashboard', innerWidth),\n helpRow(' space n new session', ' space m message orch.', innerWidth),\n helpRow(' space t status popup', ' space l session picker', innerWidth),\n helpRow(' space x kill pane', ' space / search', innerWidth),\n helpRow(' space ? help', ' space 1-9 jump to session', innerWidth),\n ' '.padEnd(innerWidth),\n // Submenu prefixes\n helpRow(' space c › Copy', ' space o › Open', innerWidth),\n helpRow(' space a › Agent', ' space S › Session', innerWidth),\n helpRow(' space g › Go', '', innerWidth),\n ' '.padEnd(innerWidth),\n ansiDim(' Changed: space a → space a s (spawn agent)'.padEnd(innerWidth)),\n ];\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, HELP_WIDTH, height, 'yellow');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' KEYBINDINGS (esc or ? to close)'.padEnd(innerWidth), 'yellow', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n\n const trailingBlankRow = y + 3 + Math.min(contentLines.length, availableContentRows);\n if (trailingBlankRow < y + height - 1) {\n writeClipped(buf, x + 1, trailingBlankRow, ' '.padEnd(innerWidth), innerWidth);\n }\n}\n\n// ─── Companion Overlay State (module-level, reset on close) ──────────────────\n\ntype CompanionPage = 'profile' | 'badges' | 'help';\n\nlet _page: CompanionPage = 'profile';\nlet _prevPage: 'profile' | 'badges' = 'profile';\nlet _gallery: BadgeGallery | null = null;\n\nexport function companionOverlayNextPage(): void {\n if (_page === 'help') { _page = _prevPage; return; }\n _page = _page === 'profile' ? 'badges' : 'profile';\n}\n\nexport function companionOverlayShowHelp(): void {\n if (_page !== 'help') _prevPage = _page as 'profile' | 'badges';\n _page = 'help';\n}\n\nexport function companionOverlayDismissHelp(): void {\n _page = _prevPage;\n}\n\nexport function badgeGalleryLeft(): void {\n if (_gallery) _gallery.currentIndex = galleryPrev(_gallery);\n}\n\nexport function badgeGalleryRight(): void {\n if (_gallery) _gallery.currentIndex = galleryNext(_gallery);\n}\n\nexport function closeBadgeGallery(): void {\n _page = 'profile';\n _gallery = null;\n _badgeScroll = 0;\n}\n\nexport function getCompanionPage(): CompanionPage {\n return _page;\n}\n\n// ─── Companion Profile Page ──────────────────────────────────────────────────\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nconst MOOD_ICONS: Record<Mood, string> = {\n happy: '◉', grinding: '◈', frustrated: '◆', zen: '◎', sleepy: '◌', excited: '✦', existential: '◉',\n};\n\nconst MOOD_COLORS: Record<Mood, string> = {\n happy: 'green', grinding: 'yellow', frustrated: 'red', zen: 'cyan', sleepy: 'gray', excited: 'white', existential: 'magenta',\n};\n\nfunction statBar(value: number, max: number, width: number, color: string): string {\n const filled = max > 0 ? Math.min(width, Math.round((value / max) * width)) : 0;\n const bar = ansiColor('▓'.repeat(filled), color) + ansiDim('░'.repeat(width - filled));\n return bar;\n}\n\nfunction wrapText(text: string, maxWidth: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n for (const word of words) {\n if (current.length + word.length + 1 > maxWidth && current.length > 0) {\n lines.push(current);\n current = word;\n } else {\n current = current.length > 0 ? `${current} ${word}` : word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\nfunction renderProfilePage(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n const innerWidth = COMPANION_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - COMPANION_WIDTH) / 2));\n\n const unlockedCount = companion.achievements.length;\n const totalAchievements = ACHIEVEMENTS.length;\n\n const endH = Math.floor(companion.stats.endurance / 3_600_000);\n\n const intensity = companion.debugMood?.scores[companion.mood] ?? 0;\n const face = getMoodFace(companion.mood, intensity);\n const moodColor = MOOD_COLORS[companion.mood];\n const moodIcon = MOOD_ICONS[companion.mood];\n const faceColored = ansiColor(`(${face})`, moodColor, true);\n\n const repoNicknames = Object.values(companion.repos)\n .map(r => r.nickname)\n .filter((n): n is string => n !== null);\n const repoDisplay = repoNicknames.length > 0 ? ansiDim(` \"${repoNicknames[0]}\"`) : '';\n\n const barW = 18;\n\n // XP progress within current level\n const { xpIntoLevel, xpForNextLevel } = computeLevelProgress(companion.xp);\n const xpBar = statBar(xpIntoLevel, xpForNextLevel, 20, 'cyan');\n\n // Most recent achievement\n const lastAchievement = companion.achievements.length > 0\n ? companion.achievements[companion.achievements.length - 1]\n : null;\n const lastDef = lastAchievement\n ? ACHIEVEMENTS.find(a => a.id === lastAchievement.id)\n : null;\n\n const contentLines: string[] = [];\n\n // Face + mood\n contentLines.push(` ${faceColored} .${repoDisplay}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Level + title\n contentLines.push(` ${ansiColor(`Lv ${companion.level}`, 'cyan', true)} ${ansiBold(companion.title)}`.padEnd(innerWidth));\n contentLines.push(` ${xpBar} ${ansiDim(`${companion.xp} xp`)}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Mood\n contentLines.push(` ${ansiColor(moodIcon, moodColor)} ${ansiColor(companion.mood, moodColor)}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Stats with colored bars\n contentLines.push(` ${ansiColor('STR', 'red')} ${String(companion.stats.strength).padStart(4)} ${statBar(companion.stats.strength, 100, barW, 'red')}`.padEnd(innerWidth));\n contentLines.push(` ${ansiColor('END', 'yellow')} ${String(endH + 'h').padStart(4)} ${statBar(endH, 500, barW, 'yellow')}`.padEnd(innerWidth));\n contentLines.push(` ${ansiColor('WIS', 'blue')} ${String(companion.stats.wisdom).padStart(4)} ${statBar(companion.stats.wisdom, 50, barW, 'blue')}`.padEnd(innerWidth));\n contentLines.push(` ${ansiColor('PAT', 'magenta')} ${String(companion.stats.patience).padStart(4)} ${statBar(companion.stats.patience, 200, barW, 'magenta')}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n // Achievement\n if (lastDef) {\n contentLines.push(` ${ansiColor('★', 'yellow')} ${lastDef.name} ${ansiDim(`${unlockedCount}/${totalAchievements}`)}`.padEnd(innerWidth));\n } else {\n contentLines.push(` ${ansiDim(`◇ ${unlockedCount}/${totalAchievements} achievements`)}`.padEnd(innerWidth));\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n\n // Commentary — word-wrapped, styled\n if (companion.lastCommentary) {\n const raw = companion.lastCommentary.text;\n const wrapped = wrapText(raw, innerWidth - 6);\n contentLines.push(` ${ansiDim('┊')} ${ansiColor(wrapped[0] ?? '', 'white')}`.padEnd(innerWidth));\n for (let i = 1; i < wrapped.length; i++) {\n contentLines.push(` ${ansiDim('┊')} ${ansiColor(wrapped[i] ?? '', 'white')}`.padEnd(innerWidth));\n }\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n contentLines.push(` ${ansiDim('tab → badges ? → stat guide')}`.padEnd(innerWidth));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, COMPANION_WIDTH, height, 'cyan');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' COMPANION (esc to close)'.padEnd(innerWidth), 'cyan', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n}\n\n// ─── Badge Gallery Page ──────────────────────────────────────────────────────\n\nconst GALLERY_WIDTH = 50;\n\nlet _badgeScroll = 0;\n\nexport function badgeListScrollUp(): void { _badgeScroll = Math.max(0, _badgeScroll - 1); }\nexport function badgeListScrollDown(): void { _badgeScroll++; }\n\nfunction renderBadgesPage(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n if (!_gallery) _gallery = createBadgeGallery(companion.achievements);\n const gallery = _gallery;\n\n const innerWidth = GALLERY_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - GALLERY_WIDTH) / 2));\n\n const unlockedCount = companion.achievements.length;\n const totalAchievements = ACHIEVEMENTS.length;\n\n // Render current badge card\n const currentDef = gallery.achievements[gallery.currentIndex]!;\n const currentUnlock = gallery.unlocked.get(currentDef.id) ?? null;\n const card = renderBadgeCard(currentDef, currentUnlock);\n\n const contentLines: string[] = [];\n\n // Badge card (centered within overlay)\n for (const cardLine of card.lines) {\n const stripped = cardLine.replace(/\\x1b\\[[0-9;]*m/g, '');\n const pad = Math.max(0, Math.floor((innerWidth - stripped.length) / 2));\n const padded = ' '.repeat(pad) + cardLine + ' '.repeat(Math.max(0, innerWidth - stripped.length - pad));\n contentLines.push(padded);\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n\n // Navigation footer\n const navIdx = gallery.currentIndex + 1;\n const navTotal = gallery.total;\n const unlockLabel = currentUnlock !== null ? ' ✓ unlocked' : ' · locked';\n const navLine = ` ← ${navIdx}/${navTotal} → ${unlockedCount}/${totalAchievements} earned${unlockLabel}`;\n contentLines.push(navLine.padEnd(innerWidth));\n\n contentLines.push(' '.padEnd(innerWidth));\n\n // Achievement checklist — scrollable, current badge highlighted\n const listStartIdx = contentLines.length;\n const maxListRows = Math.min(6, Math.max(4, (rows - 2) - 4 - listStartIdx - 2));\n const maxScroll = Math.max(0, gallery.total - maxListRows + 1);\n if (_badgeScroll > maxScroll) _badgeScroll = maxScroll;\n\n // Auto-scroll to keep current badge visible (iterative: indicators steal rows)\n if (gallery.currentIndex < _badgeScroll) _badgeScroll = gallery.currentIndex;\n for (let pass = 0; pass < 3; pass++) {\n const a = _badgeScroll > 0 ? 1 : 0;\n const b = _badgeScroll + maxListRows < gallery.total ? 1 : 0;\n const vis = maxListRows - a - b;\n if (gallery.currentIndex >= _badgeScroll + vis) {\n _badgeScroll = gallery.currentIndex - vis + 1;\n } else break;\n }\n if (_badgeScroll > maxScroll) _badgeScroll = maxScroll;\n\n const hasMoreAbove = _badgeScroll > 0;\n const hasMoreBelow = _badgeScroll + maxListRows < gallery.total;\n const itemRows = maxListRows - (hasMoreAbove ? 1 : 0) - (hasMoreBelow ? 1 : 0);\n\n if (hasMoreAbove) {\n contentLines.push(ansiDim(` ↑ ${_badgeScroll} more`.padEnd(innerWidth)));\n }\n\n for (let i = 0; i < itemRows && (_badgeScroll + i) < gallery.total; i++) {\n const idx = _badgeScroll + i;\n const def = gallery.achievements[idx]!;\n const u = gallery.unlocked.has(def.id);\n const icon = u ? '✓' : '·';\n const isCurrent = idx === gallery.currentIndex;\n let line = ` ${icon} ${def.name}`.padEnd(innerWidth);\n if (isCurrent) line = ansiColor(line, 'cyan', false);\n else if (!u) line = ansiDim(line);\n contentLines.push(line);\n }\n\n if (hasMoreBelow) {\n const below = gallery.total - _badgeScroll - itemRows;\n contentLines.push(ansiDim(` ↓ ${below} more`.padEnd(innerWidth)));\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n contentLines.push(ansiDim(' tab → profile ? → stat guide'.padEnd(innerWidth)));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, GALLERY_WIDTH, height, 'cyan');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' BADGES (↑↓ navigate, esc close)'.padEnd(innerWidth), 'cyan', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n}\n\n// ─── Stat Guide Page ─────────────────────────────────────────────────────────\n\nfunction renderHelpPage(buf: FrameBuffer, rows: number, cols: number): void {\n const innerWidth = COMPANION_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - COMPANION_WIDTH) / 2));\n\n const divider = (label: string, color: string) => {\n const rest = innerWidth - label.length - 5;\n return ` ${ansiColor(label, color, true)} ${ansiDim('─'.repeat(Math.max(0, rest)))}`;\n };\n\n const contentLines: string[] = [];\n\n contentLines.push(divider('STR (Strength)', 'red'));\n contentLines.push(' +1 per completed session'.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('END (Endurance)', 'yellow'));\n contentLines.push(' Total active time across sessions'.padEnd(innerWidth));\n contentLines.push(' (displayed in hours)'.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('WIS (Wisdom)', 'blue'));\n contentLines.push(' +1 per efficient session'.padEnd(innerWidth));\n contentLines.push(ansiDim(' agents have <30% stddev in active').padEnd(innerWidth));\n contentLines.push(ansiDim(' time, 2+ agents required').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('PAT (Patience)', 'magenta'));\n contentLines.push(' +√cycles per completed session'.padEnd(innerWidth));\n contentLines.push(ansiDim(' +1 if validation mode').padEnd(innerWidth));\n contentLines.push(ansiDim(' +1 if completion mode').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('XP & Level', 'cyan'));\n contentLines.push(' STR×80 + END/h×15 + WIS×40'.padEnd(innerWidth));\n contentLines.push(' + PAT×5'.padEnd(innerWidth));\n contentLines.push(ansiDim(' level: 150 base xp, ×1.35/lvl').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('Mood', 'white'));\n contentLines.push(' Real-time scoring from signals:'.padEnd(innerWidth));\n contentLines.push(ansiDim(' time of day, idle time, crashes,').padEnd(innerWidth));\n contentLines.push(ansiDim(' streaks, session length, agents').padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(divider('Badges', 'yellow'));\n contentLines.push(' Milestones, session feats, time'.padEnd(innerWidth));\n contentLines.push(' patterns, and behavioral checks'.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(ansiDim(' tab → back ? → close'.padEnd(innerWidth)));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, COMPANION_WIDTH, height, 'cyan');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' STAT GUIDE (? or esc to close)'.padEnd(innerWidth), 'cyan', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n\n const trailingBlankRow = y + 3 + Math.min(contentLines.length, availableContentRows);\n if (trailingBlankRow < y + height - 1) {\n writeClipped(buf, x + 1, trailingBlankRow, ' '.padEnd(innerWidth), innerWidth);\n }\n}\n\n// ─── Companion Overlay Dispatcher ────────────────────────────────────────────\n\nexport function renderCompanionOverlay(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n if (_page === 'help') {\n renderHelpPage(buf, rows, cols);\n } else if (_page === 'badges') {\n renderBadgesPage(buf, rows, cols, companion);\n } else {\n renderProfilePage(buf, rows, cols, companion);\n }\n}\n\nexport function renderCompanionDebugOverlay(buf: FrameBuffer, rows: number, cols: number, companion: CompanionState): void {\n const innerWidth = DEBUG_WIDTH - 2;\n const x = Math.max(0, Math.floor((cols - DEBUG_WIDTH) / 2));\n\n const intensity = companion.debugMood?.scores[companion.mood] ?? 0;\n const face = getMoodFace(companion.mood, intensity);\n const debug = companion.debugMood;\n\n const contentLines: string[] = [\n ` (${face}) mood: ${companion.mood}`.padEnd(innerWidth),\n ' '.padEnd(innerWidth),\n ];\n\n if (debug) {\n const { signals, scores } = debug;\n\n contentLines.push(ansiDim(' ── Signals ──'.padEnd(innerWidth)));\n contentLines.push(` hourOfDay: ${signals.hourOfDay}`.padEnd(innerWidth));\n contentLines.push(` sessionLengthMs: ${signals.sessionLengthMs} (${Math.round(signals.sessionLengthMs / 60_000)}min)`.padEnd(innerWidth));\n contentLines.push(` idleDurationMs: ${signals.idleDurationMs} (${Math.round(signals.idleDurationMs / 60_000)}min)`.padEnd(innerWidth));\n contentLines.push(` recentCrashes: ${signals.recentCrashes}`.padEnd(innerWidth));\n contentLines.push(` cleanStreak: ${signals.cleanStreak}`.padEnd(innerWidth));\n contentLines.push(` justCompleted: ${signals.justCompleted}`.padEnd(innerWidth));\n contentLines.push(` justCrashed: ${signals.justCrashed}`.padEnd(innerWidth));\n contentLines.push(` justLeveledUp: ${signals.justLeveledUp}`.padEnd(innerWidth));\n contentLines.push(' '.padEnd(innerWidth));\n\n contentLines.push(ansiDim(' ── Scores ──'.padEnd(innerWidth)));\n const moodOrder: Mood[] = ['happy', 'grinding', 'frustrated', 'zen', 'sleepy', 'excited', 'existential'];\n for (const mood of moodOrder) {\n const score = scores[mood] ?? 0;\n const bar = score > 0 ? ansiDim('█'.repeat(Math.min(Math.round(score / 5), 12))) : '';\n const marker = mood === debug.winner ? ' ◀' : '';\n contentLines.push(` ${mood.padEnd(12)} ${String(score).padStart(3)} ${bar}${marker}`.padEnd(innerWidth));\n }\n } else {\n contentLines.push(ansiDim(' No mood signals yet'.padEnd(innerWidth)));\n contentLines.push(ansiDim(' (mood is time-of-day only)'.padEnd(innerWidth)));\n }\n\n contentLines.push(' '.padEnd(innerWidth));\n\n const height = Math.min(contentLines.length + 4, rows - 2);\n const y = Math.max(0, Math.floor((rows - height) / 2));\n\n drawBorder(buf, x, y, DEBUG_WIDTH, height, 'yellow');\n\n writeClipped(buf, x + 1, y + 1, ansiColor(' COMPANION DEBUG (esc to close)'.padEnd(innerWidth), 'yellow', true), innerWidth);\n writeClipped(buf, x + 1, y + 2, ' '.padEnd(innerWidth), innerWidth);\n\n const availableContentRows = height - 4;\n for (let i = 0; i < Math.min(contentLines.length, availableContentRows); i++) {\n writeClipped(buf, x + 1, y + 3 + i, contentLines[i]!, innerWidth);\n }\n\n const trailingRow = y + 3 + Math.min(contentLines.length, availableContentRows);\n if (trailingRow < y + height - 1) {\n writeClipped(buf, x + 1, trailingRow, ' '.padEnd(innerWidth), innerWidth);\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { mountPanel, type Deck } from '@crouton-kit/humanloop';\nimport type { InteractionResponse, MountedPanel } from '@crouton-kit/humanloop';\nimport { readDecisions, readProgress, readMeta, updateMeta, writeOutput } from '../../daemon/ask-store.js';\nimport { askProgressPath } from '../../shared/paths.js';\nimport type { AppState } from '../state.js';\nimport { requestRender } from '../state.js';\nimport type { AggregateInboxItem } from '../../shared/inbox-types.js';\nimport type { Request, Response } from '../../shared/protocol.js';\nimport { rawSend } from '../../shared/client.js';\nimport type { Key } from '../terminal.js';\nimport type { AskMeta } from '../../shared/types.js';\n\n// ── Orphan dispatch ───────────────────────────────────────────────────────────\n\nexport type OrphanTakeoverFn = (target: { sessionId: string; agentId: string; paneId?: string }) => Promise<void>;\n\nexport interface DispatchOrphanDeps {\n daemonSend: (request: Request) => Promise<Response>;\n onOrphanTakeover?: OrphanTakeoverFn;\n sessionId: string;\n cwd: string;\n}\n\n/**\n * Pure dispatch for orphan resolution choices. Extracted so tests can drive it\n * directly without mounting the full panel.\n */\nexport async function dispatchOrphanResolution(\n orphanTarget: NonNullable<AskMeta['orphanTarget']>,\n selectedOptionId: string,\n deps: DispatchOrphanDeps,\n): Promise<void> {\n if (selectedOptionId === 'takeover' && orphanTarget.kind === 'agent') {\n await deps.onOrphanTakeover?.({\n sessionId: deps.sessionId,\n agentId: orphanTarget.agentId,\n paneId: orphanTarget.paneId,\n });\n } else if (selectedOptionId === 'restart' && orphanTarget.kind === 'agent') {\n await deps.daemonSend({ type: 'restart-agent', sessionId: deps.sessionId, agentId: orphanTarget.agentId });\n } else if (selectedOptionId === 'resume' && orphanTarget.kind === 'orchestrator') {\n await deps.daemonSend({ type: 'resume', sessionId: deps.sessionId, cwd: deps.cwd });\n } else if (selectedOptionId === 'dismiss' && orphanTarget.kind === 'orchestrator') {\n // Clear the sticky orphan flag without spawning a new orchestrator — for cases\n // where the user has handled the situation manually (e.g. the tmux pane is still\n // alive) and just wants the \"Needs You\" badge gone.\n await deps.daemonSend({ type: 'clear-orphan', sessionId: deps.sessionId, cwd: deps.cwd });\n }\n}\n\n// ── Visual entry ──────────────────────────────────────────────────────────────\n\nexport interface VisualEntry {\n status: 'loading' | 'ready' | 'error';\n content: string;\n visible: boolean;\n error?: string;\n}\n\n// ── Public handle interface ───────────────────────────────────────────────────\n\nexport interface MountedResolutionHandle {\n handleKey(input: string, key: Key): void;\n render(): string[];\n handleResize(cols: number, rows: number): void;\n unmount(): void;\n canAcceptHostKeys(): boolean;\n advanceQueue(delta: number): void;\n spaceVisualToggle(): void;\n regenerateVisual(): void;\n /** Header info for the sisyphus header strip row 0. */\n getHeaderInfo(): {\n currentIndex: number;\n queueLength: number;\n sessionName: string | undefined;\n askTitle: string | undefined;\n blockedSince: string;\n kind: string | undefined;\n };\n /** Returns the id of the current (first unanswered) interaction, or undefined. */\n getCurrentQid(): string | undefined;\n}\n\n// ── Mount options ─────────────────────────────────────────────────────────────\n\nexport interface MountResolutionOpts {\n aggregateInbox: AggregateInboxItem[];\n startIndex: number;\n cols: number;\n rows: number;\n daemonSend: (request: Request) => Promise<Response>;\n onUnmount: () => void;\n onOrphanTakeover?: OrphanTakeoverFn;\n}\n\n// ── Panel factory ─────────────────────────────────────────────────────────────\n\nexport function mountResolutionPanel(\n opts: MountResolutionOpts,\n state: AppState,\n): MountedResolutionHandle | null {\n let queue = [...opts.aggregateInbox];\n let currentIndex = opts.startIndex;\n let bodyCols = opts.cols;\n\n const item = () => queue[currentIndex]!;\n\n function buildDeck(idx: number): Deck | null {\n const it = queue[idx];\n if (!it) return null;\n const deck = readDecisions(it.cwd, it.sessionId, it.askId);\n if (!deck) return null;\n deck.source = {\n sessionName: it.sessionName,\n askedBy: it.askedBy,\n blockedSince: it.blockedSince,\n };\n return deck;\n }\n\n // Initial deck — if missing (file gone, stale inbox, etc.) return null so the caller\n // never enters resolution mode. Returning a live no-op handle traps the user with no\n // way to escape because handleKey is unbound.\n const initialDeck = buildDeck(currentIndex);\n if (!initialDeck) return null;\n\n // Track answered count for current-qid derivation (Gap 2 option a)\n let currentDeck = initialDeck;\n const initialProgress = readProgress(item().cwd, item().sessionId, item().askId);\n let answeredCount = initialProgress?.responses.length ?? 0;\n\n function getCurrentQid(): string | undefined {\n return currentDeck.interactions[answeredCount]?.id ?? currentDeck.interactions[0]?.id;\n }\n\n function fireVisualGen(force: boolean): void {\n const qid = getCurrentQid();\n if (!qid) return;\n const it = item();\n state.visuals.set(qid, { status: 'loading', content: '', visible: true });\n requestRender();\n void (async () => {\n const res = await rawSend({\n type: 'ask-generate-visual',\n sessionId: it.sessionId,\n askId: it.askId,\n qid,\n cols: bodyCols,\n force,\n }, 60_000);\n if (res.ok) {\n const ansiPath = (res.data as { ansiPath: string }).ansiPath;\n const ansi = readFileSync(ansiPath, 'utf-8');\n state.visuals.set(qid, { status: 'ready', content: ansi, visible: true });\n } else {\n state.visuals.set(qid, { status: 'error', content: '', visible: true, error: res.error });\n }\n requestRender();\n })();\n }\n\n // Mirror humanloop's standalone launchTui pattern: track latest responses\n // so onExit (incomplete submit via final-phase Enter) can submit partials.\n let lastResponses: InteractionResponse[] = [];\n\n const submitResponses = (responses: InteractionResponse[]): void => {\n void (async () => {\n const it = item();\n const completedAt = new Date().toISOString();\n\n // Orphan disposition: dispatch before writeOutput so action lands first\n const meta = readMeta(it.cwd, it.sessionId, it.askId);\n if (meta?.orphanTarget && responses.length > 0) {\n const sel = responses[0]!.selectedOptionId;\n if (sel) {\n await dispatchOrphanResolution(meta.orphanTarget, sel, {\n daemonSend: opts.daemonSend,\n onOrphanTakeover: opts.onOrphanTakeover,\n sessionId: it.sessionId,\n cwd: it.cwd,\n });\n }\n }\n\n // Write output first (before inbox-list so daemon sees answered status)\n writeOutput(it.cwd, it.sessionId, it.askId, responses, completedAt);\n await updateMeta(it.cwd, it.sessionId, it.askId, { status: 'answered', completedAt });\n\n const refreshRes = await opts.daemonSend({ type: 'inbox-list' });\n const newQueue: AggregateInboxItem[] = refreshRes.ok\n ? ((refreshRes.data?.items as AggregateInboxItem[]) ?? [])\n : [];\n\n if (newQueue.length === 0) {\n opts.onUnmount();\n return;\n }\n\n queue = newQueue;\n currentIndex = 0;\n const nextItem = queue[0]!;\n const nextDeck = buildDeck(0);\n if (!nextDeck) {\n opts.onUnmount();\n return;\n }\n\n currentDeck = nextDeck;\n const nextProgress = readProgress(nextItem.cwd, nextItem.sessionId, nextItem.askId);\n answeredCount = nextProgress?.responses.length ?? 0;\n lastResponses = [];\n\n state.visuals.clear();\n\n panel.loadDeck(nextDeck, {\n progressPath: askProgressPath(nextItem.cwd, nextItem.sessionId, nextItem.askId),\n });\n requestRender();\n })();\n };\n\n const panel: MountedPanel = mountPanel({\n deck: initialDeck,\n cols: opts.cols,\n rows: opts.rows,\n progressPath: askProgressPath(item().cwd, item().sessionId, item().askId),\n onProgress: (responses: InteractionResponse[]) => {\n answeredCount = responses.length;\n lastResponses = responses;\n requestRender();\n const it = item();\n const cur = readMeta(it.cwd, it.sessionId, it.askId);\n if (cur?.status === 'pending') {\n void updateMeta(it.cwd, it.sessionId, it.askId, { status: 'in-progress', startedAt: new Date().toISOString() });\n }\n },\n onComplete: (responses: InteractionResponse[]) => {\n submitResponses(responses);\n },\n // Final-phase Enter on an incomplete deck routes here (humanloop only fires\n // onComplete when responses === interactions). The 'final' UI prompts\n // \"enter submit\", so honor that by submitting whatever was answered.\n onExit: () => {\n submitResponses(lastResponses);\n },\n });\n\n return {\n handleKey(input: string, key: Key) {\n // Key from sisyphus is a structural superset of humanloop Key — no cast needed\n panel.handleKey(input, key);\n },\n\n render() {\n return panel.render();\n },\n\n handleResize(cols: number, rows: number) {\n bodyCols = cols;\n panel.handleResize(cols, rows);\n },\n\n unmount() {\n panel.unmount();\n opts.onUnmount();\n },\n\n canAcceptHostKeys() {\n return panel.canAcceptHostKeys();\n },\n\n advanceQueue(delta: number) {\n const newIndex = Math.max(0, Math.min(queue.length - 1, currentIndex + delta));\n if (newIndex === currentIndex) return;\n currentIndex = newIndex;\n const nextDeck = buildDeck(currentIndex);\n if (!nextDeck) return;\n currentDeck = nextDeck;\n const it = item();\n const progress = readProgress(it.cwd, it.sessionId, it.askId);\n answeredCount = progress?.responses.length ?? 0;\n panel.loadDeck(nextDeck, {\n progressPath: askProgressPath(it.cwd, it.sessionId, it.askId),\n });\n requestRender();\n },\n\n spaceVisualToggle() {\n const qid = getCurrentQid();\n if (!qid) return;\n const entry = state.visuals.get(qid);\n if (!entry) {\n fireVisualGen(false);\n } else if (entry.status === 'ready') {\n state.visuals.set(qid, { ...entry, visible: !entry.visible });\n requestRender();\n } else if (entry.status === 'loading') {\n // debounce — no-op\n } else {\n // error → retry\n fireVisualGen(false);\n }\n },\n\n regenerateVisual() {\n const qid = getCurrentQid();\n if (!qid) return;\n state.visuals.set(qid, { status: 'loading', content: '', visible: true });\n requestRender();\n fireVisualGen(true);\n },\n\n getHeaderInfo() {\n const it = item();\n const askTitle = currentDeck.title ?? currentDeck.interactions[0]?.title;\n return {\n currentIndex,\n queueLength: queue.length,\n sessionName: it.sessionName,\n askTitle: askTitle ? askTitle.slice(0, 32) : undefined,\n blockedSince: it.blockedSince,\n kind: it.kind,\n };\n },\n\n getCurrentQid,\n };\n}\n\n// ── enterResolutionMode ───────────────────────────────────────────────────────\n\nexport function enterResolutionMode(\n state: AppState,\n askId: string,\n daemonSend: (request: Request) => Promise<Response>,\n onOrphanTakeover?: MountResolutionOpts['onOrphanTakeover'],\n): void {\n const queue = state.aggregateInbox;\n const startIdx = queue.findIndex((item) => item.askId === askId);\n if (startIdx < 0) {\n // Ask not in current inbox — use the first item as fallback\n if (queue.length === 0) return;\n enterResolutionMode(state, queue[0]!.askId, daemonSend, onOrphanTakeover);\n return;\n }\n\n const handle = mountResolutionPanel(\n {\n aggregateInbox: queue,\n startIndex: startIdx,\n cols: state.cols,\n rows: state.rows - 1,\n daemonSend,\n onUnmount: () => {\n state.resolutionActive = false;\n state.resolutionHandle = null;\n state.visuals.clear();\n requestRender();\n },\n onOrphanTakeover,\n },\n state,\n );\n\n if (!handle) {\n // Deck missing or unreadable — don't enter resolution mode. Leaving resolutionActive\n // false means the user stays in the session list and can keep navigating.\n requestRender();\n return;\n }\n\n state.resolutionHandle = handle;\n state.resolutionActive = true;\n requestRender();\n}\n","import type { TreeNode } from '../types/tree.js';\n\n/**\n * Render box-drawing prefix for a tree node.\n * Produces connectors like: │ ├─ ▸ or └─ ▼\n */\nexport function renderTreePrefix(node: TreeNode, nodes: TreeNode[], index: number): string {\n if (node.depth === 0) {\n return node.expandable ? (node.expanded ? '▼ ' : '▸ ') : ' ';\n }\n\n const parts: string[] = [];\n\n // For each ancestor depth level (1..depth-1), draw │ or space\n for (let d = 1; d < node.depth; d++) {\n parts.push(isAncestorLastSibling(nodes, index, d) ? ' ' : '│ ');\n }\n\n // Connector for this node\n parts.push(isLastSibling(nodes, index) ? '└─' : '├─');\n\n // Expand indicator\n if (node.expandable) {\n parts.push(node.expanded ? '▼ ' : '▸ ');\n } else {\n parts.push(' ');\n }\n\n return parts.join('');\n}\n\n/** Check if the node at `index` is the last among its siblings (same depth, same parent) */\nfunction isLastSibling(nodes: TreeNode[], index: number): boolean {\n const depth = nodes[index]!.depth;\n for (let i = index + 1; i < nodes.length; i++) {\n if (nodes[i]!.depth === depth) return false;\n if (nodes[i]!.depth < depth) return true;\n }\n return true;\n}\n\n/** Check if the ancestor at `depth` for the node at `index` is the last among its siblings */\nfunction isAncestorLastSibling(nodes: TreeNode[], index: number, depth: number): boolean {\n // Find the ancestor at this depth by scanning backward\n for (let i = index - 1; i >= 0; i--) {\n if (nodes[i]!.depth === depth) {\n return isLastSibling(nodes, i);\n }\n if (nodes[i]!.depth < depth) return true;\n }\n return true;\n}\n\n/**\n * Pre-compute prefix strings for all tree nodes in O(n).\n * Avoids per-node O(n) scans during rendering.\n */\nexport function precomputePrefixes(nodes: TreeNode[]): void {\n const len = nodes.length;\n if (len === 0) return;\n\n // Step 1: Compute isLastSibling for each node in a single backward pass.\n // A node is \"last sibling\" if no later node at the same depth appears before\n // a node at a shallower depth (or end of array).\n const isLast = new Array<boolean>(len);\n // Track the last-seen index for each depth level\n const lastSeenAtDepth = new Map<number, number>();\n\n for (let i = len - 1; i >= 0; i--) {\n const depth = nodes[i]!.depth;\n // This node is last sibling if no node at same depth was seen after it\n // before a shallower node\n isLast[i] = !lastSeenAtDepth.has(depth);\n lastSeenAtDepth.set(depth, i);\n // Clear deeper depths (they belong to a different parent scope)\n for (const [d] of lastSeenAtDepth) {\n if (d > depth) lastSeenAtDepth.delete(d);\n }\n }\n\n // Step 2: Build prefix strings using pre-computed isLast data.\n // For ancestor connector lines, we need to know if the ancestor at each depth\n // is a last sibling. We maintain a stack of isLast values per depth.\n const ancestorIsLast: boolean[] = [];\n\n for (let i = 0; i < len; i++) {\n const node = nodes[i]!;\n\n if (node.depth === 0) {\n node.prefix = node.expandable ? (node.expanded ? '▼ ' : '▸ ') : ' ';\n ancestorIsLast[0] = isLast[i]!;\n continue;\n }\n\n // Update ancestor tracking\n ancestorIsLast[node.depth] = isLast[i]!;\n\n const parts: string[] = [];\n\n // Ancestor connectors (depth 1 to depth-1)\n for (let d = 1; d < node.depth; d++) {\n parts.push(ancestorIsLast[d] ? ' ' : '│ ');\n }\n\n // This node's connector\n parts.push(isLast[i] ? '└─' : '├─');\n\n // Expand indicator\n if (node.expandable) {\n parts.push(node.expanded ? '▼ ' : '▸ ');\n } else {\n parts.push(' ');\n }\n\n node.prefix = parts.join('');\n }\n}\n","import { rawSend } from '../../shared/client.js';\nimport type { Request, Response } from '../../shared/protocol.js';\nimport type { AggregateInboxItem } from '../../shared/inbox-types.js';\n\nexport function send(request: Request): Promise<Response> {\n return rawSend(request, 8_000);\n}\n\nexport async function inboxList(): Promise<AggregateInboxItem[]> {\n const res = await send({ type: 'inbox-list' });\n if (!res.ok) return [];\n return (res.data?.items as AggregateInboxItem[] | undefined) ?? [];\n}\n","import { execSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport { readFileSync, writeFileSync, mkdtempSync, rmSync, cpSync, existsSync, mkdirSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { globalDir, tmuxSessionName } from '../../shared/paths.js';\nimport { augmentedPath } from '../../shared/env.js';\nimport { shellQuote } from '../../shared/shell.js';\nimport { exec, execSafe, EXEC_ENV } from '../../shared/exec.js';\n\n\nexport function getWindowId(): string {\n const pane = process.env['TMUX_PANE'];\n if (pane) {\n return exec(`tmux display-message -t ${shellQuote(pane)} -p \"#{window_id}\"`);\n }\n return exec('tmux display-message -p \"#{window_id}\"');\n}\n\nexport function selectWindow(windowId: string): void {\n execSafe(`tmux select-window -t ${shellQuote(windowId)}`);\n}\n\nexport function selectPane(paneId: string): void {\n execSafe(`tmux select-pane -t ${shellQuote(paneId)}`);\n}\n\nexport function windowExists(windowId: string): boolean {\n return execSafe(`tmux display-message -t ${shellQuote(windowId)} -p \"#{window_id}\"`) !== null;\n}\n\nexport function listAllWindowIds(): Set<string> {\n try {\n const output = execSync('tmux list-windows -a -F \"#{window_id}\"', { encoding: 'utf-8', env: EXEC_ENV });\n return new Set(output.trim().split('\\n').filter(Boolean));\n } catch {\n return new Set();\n }\n}\n\n/**\n * Register this TUI window as the dashboard for the current tmux session.\n * Called on TUI startup so M-S (sisyphus-home) can find the dashboard window.\n */\nexport function registerDashboardWindow(): void {\n const wid = getWindowId();\n const pane = process.env['TMUX_PANE'];\n if (pane) {\n const session = execSafe(`tmux display-message -t ${shellQuote(pane)} -p \"#{session_id}\"`);\n if (session) {\n execSafe(`tmux set-option -t ${shellQuote(session)} @sisyphus_dashboard ${wid}`);\n return;\n }\n }\n execSafe(`tmux set-option @sisyphus_dashboard ${wid}`);\n}\n\nlet companionPaneId: string | null = null;\n\nfunction setupCompanionPlugin(): string {\n const srcDir = join(import.meta.dirname, 'templates', 'companion-plugin');\n const destDir = join(globalDir(), 'companion-plugin');\n if (!existsSync(destDir)) mkdirSync(destDir, { recursive: true });\n cpSync(srcDir, destDir, { recursive: true });\n return destDir;\n}\n\nexport function paneExists(paneId: string): boolean {\n return execSafe(`tmux display-message -t ${shellQuote(paneId)} -p \"#{pane_id}\"`) !== null;\n}\n\nexport function openCompanionPane(cwd: string): void {\n // If companion pane is alive, focus it\n if (companionPaneId && paneExists(companionPaneId)) {\n execSafe(`tmux select-pane -t ${shellQuote(companionPaneId)}`);\n return;\n }\n\n const pluginDir = setupCompanionPlugin();\n\n const templatePath = join(import.meta.dirname, 'templates', 'dashboard-claude.md');\n let template: string;\n try {\n template = readFileSync(templatePath, 'utf-8');\n } catch {\n template = `You are a Sisyphus dashboard companion. Help the user manage multi-agent sessions.\\nProject: ${cwd}\\nRun \\`sisyphus list\\` and \\`sisyphus status\\` to see current state.`;\n }\n\n const rendered = template.replace(/\\{\\{CWD\\}\\}/g, cwd);\n const promptPath = join(globalDir(), 'dashboard-companion-prompt.md');\n writeFileSync(promptPath, rendered, 'utf-8');\n\n const pathEnv = augmentedPath();\n\n const claudeCmd = `SISYPHUS_COMPANION_CWD=${shellQuote(cwd)} PATH=${shellQuote(pathEnv)} claude --dangerously-skip-permissions --plugin-dir ${shellQuote(pluginDir)} --append-system-prompt \"$(cat ${shellQuote(promptPath)})\"`;\n\n const result = exec(\n `tmux split-window -h -d -l 33% -P -F \"#{pane_id}\" -c ${shellQuote(cwd)} ${shellQuote(claudeCmd)}`,\n );\n companionPaneId = result.trim() || null;\n}\n\nconst TERMINAL_EDITORS = new Set(['nvim', 'vim', 'vi', 'nano', 'emacs', 'micro', 'helix', 'hx', 'joe', 'ne', 'kak']);\n\nexport function switchToSession(sessionName: string): void {\n execSafe(`tmux switch-client -t ${shellQuote(sessionName)}`);\n}\n\nexport function editInPopup(cwd: string, editor: string, opts?: { content?: string; size?: { w: string; h: string } }): string | null {\n const tmpDir = mkdtempSync(join(tmpdir(), 'sisyphus-'));\n const filePath = join(tmpDir, 'input.md');\n try {\n writeFileSync(filePath, opts?.content ? opts.content : '', 'utf-8');\n openEditorPopup(cwd, editor, filePath, opts?.size);\n const result = readFileSync(filePath, 'utf-8').trim();\n return result || null;\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Small centered tmux popup that prompts for a single line of input.\n * Returns the trimmed input or null if empty/cancelled (Ctrl-C / Escape).\n */\nexport function promptInPopup(prompt: string, opts?: { w?: string; h?: string }): string | null {\n const { w = '50%', h = '3' } = opts ?? {};\n const tmpDir = mkdtempSync(join(tmpdir(), 'sisyphus-'));\n const outFile = join(tmpDir, 'result');\n try {\n const script = `printf ${shellQuote(prompt + ' ')} && read -r line && printf '%s' \"$line\" > ${shellQuote(outFile)}`;\n execSync(\n `tmux display-popup -E -w ${w} -h ${h} ${shellQuote(`bash -c ${shellQuote(script)}`)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n if (!existsSync(outFile)) return null;\n const result = readFileSync(outFile, 'utf-8').trim();\n return result || null;\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\nexport function openLogPopup(): void {\n execSync(\n `tmux display-popup -E -w 90% -h 80% ${shellQuote('tail -f ~/.sisyphus/daemon.log')}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openShellPopup(cwd: string, command: string): void {\n execSync(\n `tmux display-popup -E -w 90% -h 80% -d ${shellQuote(cwd)} ${shellQuote(`sh -c '${command.replace(/'/g, \"'\\\\''\")}; echo; echo \"Press enter to close\"; read'`)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openInFileManager(path: string): void {\n execSync(`open ${shellQuote(path)}`, { stdio: 'inherit', env: EXEC_ENV });\n}\n\nexport function openClaudeResumePopup(cwd: string, claudeSessionId: string, resumeEnv?: string, resumeArgs?: string): void {\n const pathEnv = augmentedPath();\n const envPrefix = resumeEnv ? `${resumeEnv} && ` : '';\n const args = resumeArgs\n ? `${resumeArgs} --resume ${shellQuote(claudeSessionId)}`\n : `--resume ${shellQuote(claudeSessionId)}`;\n const cmd = `${envPrefix}PATH=${shellQuote(pathEnv)} claude ${args}`;\n execSync(\n `tmux display-popup -E -w 90% -h 80% -d ${shellQuote(cwd)} ${shellQuote(cmd)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openClaudeResumeSession(cwd: string, sessionId: string, claudeSessionId: string, sessionLabel: string, resumeEnv?: string, resumeArgs?: string, cycleNum?: number, mode?: string): string {\n const sessionName = tmuxSessionName(cwd, sessionLabel);\n const cycleLabel = cycleNum != null ? `c${cycleNum}` : '';\n const paneTitle = cycleLabel ? `ssph:orch ${sessionLabel} ${cycleLabel}` : `ssph:orch ${sessionLabel}`;\n\n // Resolve name → $N id for subsequent -t ops. tmux -t <name> can\n // substring-match the wrong session under sparse env; $N is unambiguous.\n const existing = execSafe('tmux list-sessions -F \"#{session_id}|#{session_name}\"');\n const existingLine = existing?.split('\\n').find(line => line.slice(line.indexOf('|') + 1) === sessionName);\n if (existingLine) {\n const existingSessId = existingLine.slice(0, existingLine.indexOf('|'));\n execSafe(`tmux set-option -t ${shellQuote(existingSessId)} @sisyphus_cwd ${shellQuote(cwd.replace(/\\/+$/, ''))}`);\n execSafe(`tmux set-option -t ${shellQuote(existingSessId)} @sisyphus_session_id ${shellQuote(sessionId)}`);\n const firstPaneId = execSafe(`tmux list-panes -t ${shellQuote(existingSessId)} -F '#{pane_id}'`)?.split('\\n')[0];\n if (firstPaneId) applyOrchestratorPaneStyle(firstPaneId, paneTitle, sessionLabel, cycleLabel, mode);\n return sessionName;\n }\n\n const pathEnv = augmentedPath();\n const envPrefix = resumeEnv ? `${resumeEnv} && ` : '';\n const args = resumeArgs\n ? `${resumeArgs} --resume ${shellQuote(claudeSessionId)}`\n : `--resume ${shellQuote(claudeSessionId)}`;\n const cmd = `${envPrefix}PATH=${shellQuote(pathEnv)} claude ${args}`;\n // -P -F captures the new session's $N id + first pane id for unambiguous targeting.\n const createOut = exec(`tmux new-session -d -s ${shellQuote(sessionName)} -n main -c ${shellQuote(cwd)} -P -F '#{session_id}|#{pane_id}' ${shellQuote(cmd)}`).trim();\n const pipeIdx = createOut.indexOf('|');\n const newSessId = createOut.slice(0, pipeIdx);\n const firstPaneId = createOut.slice(pipeIdx + 1);\n execSafe(`tmux set-option -t ${shellQuote(newSessId)} @sisyphus_cwd ${shellQuote(cwd.replace(/\\/+$/, ''))}`);\n execSafe(`tmux set-option -t ${shellQuote(newSessId)} @sisyphus_session_id ${shellQuote(sessionId)}`);\n // Match session defaults from daemon tmux.ts configureSessionDefaults\n execSafe(`tmux set -w -t ${shellQuote(newSessId + ':')} pane-border-status top`);\n execSafe(`tmux set -w -t ${shellQuote(newSessId + ':')} allow-rename off`);\n execSafe(`tmux set -w -t ${shellQuote(newSessId + ':')} automatic-rename off`);\n if (firstPaneId) applyOrchestratorPaneStyle(firstPaneId, paneTitle, sessionLabel, cycleLabel, mode);\n return sessionName;\n}\n\n/**\n * Mirror daemon's setPaneStyle for an orchestrator pane — sets pane title,\n * per-pane metadata vars (@pane_role/session/cycle/mode), and pane-border-format\n * so the new tmux session shows the same badge as a live orchestrator pane.\n */\nfunction applyOrchestratorPaneStyle(paneId: string, title: string, sessionLabel: string, cycleLabel: string, mode?: string): void {\n const color = 'yellow'; // matches daemon/colors.ts ORCHESTRATOR_COLOR\n execSafe(`tmux select-pane -t ${shellQuote(paneId)} -T ${shellQuote(title)}`);\n execSafe(`tmux set -p -t ${shellQuote(paneId)} @pane_role ${shellQuote('orch')}`);\n execSafe(`tmux set -p -t ${shellQuote(paneId)} @pane_session ${shellQuote(sessionLabel)}`);\n if (cycleLabel) execSafe(`tmux set -p -t ${shellQuote(paneId)} @pane_cycle ${shellQuote(cycleLabel)}`);\n if (mode) execSafe(`tmux set -p -t ${shellQuote(paneId)} @pane_mode ${shellQuote(mode)}`);\n const gitBranch = `#(cd #{pane_current_path} && git branch --show-current 2>/dev/null)`;\n const branchSuffix = `#(cd #{pane_current_path} && git branch --show-current 2>/dev/null | grep -q . && echo ' |') ${gitBranch}`;\n const homePath = `#(echo '#{pane_current_path}' | sed \"s|^$HOME|~|\")`;\n const modeSegment = `#{?#{@pane_mode}, #[fg=${color}\\\\,italics]#{@pane_mode}#[default],}`;\n const fmt = [\n `#[bg=${color},fg=black,bold] #{@pane_role} #[default]`,\n ` #[fg=${color},bold]#{@pane_session}`,\n modeSegment,\n ` #[default,dim]#{@pane_cycle}`,\n ` ${homePath}${branchSuffix}`,\n `#[default]`,\n ].join('');\n execSafe(`tmux set -p -t ${shellQuote(paneId)} pane-border-format ${shellQuote(fmt)}`);\n}\n\nexport function openEditorPopup(cwd: string, editor: string, filePath: string, size?: { w: string; h: string }): void {\n const { w = '90%', h = '90%' } = size ?? {};\n const editorBin = editor.split(/\\s+/)[0]!.split('/').pop()!;\n if (TERMINAL_EDITORS.has(editorBin)) {\n execSync(\n `tmux display-popup -E -w ${w} -h ${h} -d ${shellQuote(cwd)} ${shellQuote(`${editor} ${shellQuote(filePath)}`)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n } else {\n execSync(`${editor} ${shellQuote(filePath)}`, { stdio: 'inherit', cwd, env: EXEC_ENV });\n }\n}\n","import { execSync } from 'node:child_process';\n\nexport function copyToClipboard(text: string): void {\n execSync('pbcopy', { input: text });\n}\n","import stringWidth from 'string-width';\nimport type { FrameBuffer, Rect } from '../render.js';\nimport { drawBorder, writeClipped, colorToSGR } from '../render.js';\nimport { renderCompanion, getMoodAnsiCode } from '../../shared/companion-render.js';\nimport type { CompanionField, CompanionState } from '../../shared/companion-types.js';\nimport type { TreeNode } from '../types/tree.js';\nimport { renderTreePrefix } from '../lib/tree-render.js';\nimport {\n statusColor,\n statusIndicator,\n agentStatusIcon,\n truncate,\n formatDuration,\n formatTime,\n formatTimeAgo,\n durationColor,\n agentDisplayName,\n modeColor,\n abbreviateMode,\n} from '../lib/format.js';\n\n// ─── Node content renderer ────────────────────────────────────────────────────\n\ninterface NodeContent {\n icon: string;\n label: string;\n meta: string;\n color: string;\n dim: boolean;\n metaColor?: string;\n suffix?: string;\n suffixColor?: string;\n}\n\nfunction renderNodeContent(node: TreeNode, maxWidth: number): NodeContent {\n switch (node.type) {\n case 'section': {\n switch (node.section) {\n case 'needs-you':\n return {\n icon: '',\n label: 'Needs You',\n meta: node.count > 0 ? `${node.count}` : '',\n color: node.count > 0 ? 'red' : 'gray',\n dim: false,\n metaColor: 'red',\n };\n case 'running':\n return {\n icon: '',\n label: 'Running',\n meta: node.count > 0 ? `${node.count}` : '',\n color: 'green',\n dim: false,\n metaColor: 'gray',\n };\n case 'done':\n return {\n icon: '',\n label: `Done (${node.count})`,\n meta: '',\n color: 'gray',\n dim: true,\n };\n }\n }\n case 'needs-you-virtual': {\n const hasPending = node.pendingCount > 0;\n return {\n icon: '⚑',\n label: 'Needs You',\n meta: hasPending ? `${node.pendingCount} pending` : '',\n color: hasPending ? 'red' : 'gray',\n dim: !hasPending,\n metaColor: hasPending ? 'red' : undefined,\n };\n }\n case 'session': {\n const icon = statusIndicator(node.status);\n const color = statusColor(node.status);\n const dim = node.status === 'completed' || node.orphaned === true;\n const cyclePart = node.cycleCount > 0 ? `C${node.cycleCount}` : '';\n // Use tracked active time (matches detail panel), not wall-clock elapsed.\n const dur = formatDuration(node.activeMs);\n const agopart =\n node.status === 'completed' && node.completedAt ? formatTimeAgo(node.completedAt) : '';\n const askBadge = node.askCount ? `!${node.askCount}` : '';\n const meta = [askBadge, cyclePart, dur, agopart].filter(Boolean).join(' ');\n const metaColor = node.askCount ? 'red' : undefined;\n const suffix = node.orphaned ? '⚠ orphan' : undefined;\n const suffixColor = node.orphaned ? 'red' : undefined;\n const displayText = node.name ?? node.task;\n const suffixWidth = suffix ? suffix.length + 1 : 0;\n const maxLabel = Math.max(8, maxWidth - meta.length - 4 - suffixWidth);\n return { icon, label: truncate(displayText, maxLabel), meta, color, dim, metaColor, suffix, suffixColor };\n }\n case 'cycle': {\n const isRunning = !node.completedAt;\n const dur = isRunning ? 'running' : formatDuration(node.activeMs);\n const agents = `${node.agentCount} agent${node.agentCount !== 1 ? 's' : ''}`;\n const modeShort = abbreviateMode(node.mode);\n const mode = modeShort ? ` · ${modeShort}` : '';\n return {\n icon: isRunning ? '●' : '○',\n label: `C${node.cycleNumber}`,\n meta: `${dur} · ${agents}${mode}`,\n color: isRunning ? 'green' : 'gray',\n dim: !isRunning,\n };\n }\n case 'agent': {\n const icon = agentStatusIcon(node.status);\n const color = statusColor(node.status);\n const dur = formatDuration(node.activeMs);\n const durClr = durationColor(node.activeMs) || undefined;\n const dim = node.status === 'completed' || node.orphaned === true;\n const displayName = agentDisplayName({\n name: node.name,\n id: node.agentId,\n agentType: node.agentType,\n });\n const suffix = node.orphaned ? '⚠ orphan' : undefined;\n const suffixColor = node.orphaned ? 'red' : undefined;\n const suffixWidth = suffix ? suffix.length + 1 : 0;\n const maxLabel = Math.max(8, maxWidth - dur.length - 4 - suffixWidth);\n return {\n icon,\n label: truncate(displayName, maxLabel),\n meta: dur,\n color,\n dim,\n metaColor: durClr,\n suffix,\n suffixColor,\n };\n }\n case 'report': {\n const badge = node.reportType === 'final' ? 'FINAL' : 'UPDATE';\n const time = formatTime(node.timestamp);\n return {\n icon: node.reportType === 'final' ? '◆' : '◇',\n label: `${badge} ${time}`,\n meta: '',\n color: node.reportType === 'final' ? 'cyan' : 'yellow',\n dim: false,\n };\n }\n case 'messages':\n return {\n icon: '✉',\n label: `Messages (${node.count})`,\n meta: '',\n color: 'yellow',\n dim: false,\n };\n case 'message': {\n const maxLabel = Math.max(8, maxWidth - 8);\n return {\n icon: '·',\n label: truncate(`${node.source}: ${node.summary}`, maxLabel),\n meta: formatTime(node.timestamp),\n color: 'gray',\n dim: true,\n };\n }\n case 'context':\n return {\n icon: '⊞',\n label: `Context (${node.fileCount})`,\n meta: '',\n color: 'white',\n dim: node.fileCount === 0,\n };\n case 'context-file': {\n const maxLabel = Math.max(8, maxWidth - 4);\n return {\n icon: '·',\n label: truncate(node.label, maxLabel),\n meta: '',\n color: 'gray',\n dim: false,\n };\n }\n }\n}\n\n// ─── Tree panel renderer ──────────────────────────────────────────────────────\n\nexport function renderTreePanel(\n buf: FrameBuffer,\n rect: Rect,\n nodes: TreeNode[],\n cursorIndex: number,\n focused: boolean,\n companion?: CompanionState | null,\n): void {\n const { x, y, w, h } = rect;\n\n // 1. Border — yellow when focused\n drawBorder(buf, x, y, w, h, focused ? 'cyan' : 'gray');\n\n // 2. Inner dimensions\n const innerX = x + 2;\n const innerW = w - 4;\n const innerY = y + 1;\n const innerH = h - 2;\n\n if (innerW <= 0 || innerH <= 0) return;\n\n // 3. Empty state\n if (nodes.length === 0) {\n writeClipped(buf, innerX, innerY, '\\x1b[1m Sessions \\x1b[0m', innerW);\n writeClipped(buf, innerX, innerY + 1, '\\x1b[2mNo sessions found.\\x1b[0m', innerW);\n writeClipped(buf, innerX, innerY + 2, '\\x1b[2mPress [n] to create one.\\x1b[0m', innerW);\n writeClipped(buf, innerX, innerY + 3, '\\x1b[2mPress [?] for all keybindings.\\x1b[0m', innerW);\n return;\n }\n\n // 4. Scroll logic — reserve rows at bottom for companion (blank + face + wrapped commentary)\n let companionRows = 0;\n let _companionCommentaryLines: string[] = [];\n if (companion) {\n const commentaryText = companion.lastCommentary?.text;\n if (commentaryText) {\n const words = commentaryText.split(' ');\n let current = '';\n let currentWidth = 0;\n for (const word of words) {\n const wordWidth = stringWidth(word);\n if (currentWidth + wordWidth + 1 > innerW && currentWidth > 0) {\n _companionCommentaryLines.push(current);\n current = word;\n currentWidth = wordWidth;\n } else if (currentWidth === 0) {\n current = word;\n currentWidth = wordWidth;\n } else {\n current = `${current} ${word}`;\n currentWidth += 1 + wordWidth;\n }\n }\n if (current.length > 0) _companionCommentaryLines.push(current);\n }\n companionRows = 1 + 1 + _companionCommentaryLines.length; // blank + face + commentary lines\n }\n const maxVisible = Math.max(1, innerH - companionRows);\n const halfVisible = Math.floor(maxVisible / 2);\n const scrollOffset = Math.max(\n 0,\n Math.min(cursorIndex - halfVisible, nodes.length - maxVisible),\n );\n\n // 5. Scroll indicator adjustments\n const hasTopIndicator = scrollOffset > 0;\n const hasBottomIndicator = scrollOffset + maxVisible < nodes.length;\n\n let rowStart = innerY;\n let availRows = maxVisible;\n\n if (hasTopIndicator) {\n const topMore = scrollOffset;\n writeClipped(buf, innerX, rowStart, `\\x1b[2m↑ ${topMore} more\\x1b[0m`, innerW);\n rowStart++;\n availRows--;\n }\n\n if (hasBottomIndicator) {\n availRows--;\n }\n\n // 6. Render visible nodes\n const visible = nodes.slice(scrollOffset, scrollOffset + availRows + (hasBottomIndicator ? 1 : 0));\n const renderCount = Math.min(visible.length, availRows);\n\n for (let i = 0; i < renderCount; i++) {\n const node = visible[i]!;\n const realIdx = scrollOffset + i;\n const isSelected = realIdx === cursorIndex;\n const prefix = node.prefix ?? renderTreePrefix(node, nodes, realIdx);\n const contentWidth = innerW;\n const { icon, label, meta, color, dim, metaColor, suffix, suffixColor } = renderNodeContent(\n node,\n contentWidth - prefix.length,\n );\n\n // Build ANSI string\n let content = '';\n\n // icon with color\n if (icon) {\n if (dim) content += `\\x1b[2;${colorToSGR(color)}m${icon}\\x1b[0m `;\n else content += `\\x1b[${colorToSGR(color)}m${icon}\\x1b[0m `;\n }\n\n // label\n if (dim) content += `\\x1b[2m${label}\\x1b[0m`;\n else content += label;\n\n // meta\n if (meta) {\n if (metaColor) content += ` \\x1b[${colorToSGR(metaColor)}m${meta}\\x1b[0m`;\n else content += ` \\x1b[2m${meta}\\x1b[0m`;\n }\n\n // suffix\n if (suffix && suffixColor) {\n content += ` \\x1b[${colorToSGR(suffixColor)}m${suffix}\\x1b[0m`;\n }\n\n let line = prefix;\n if (isSelected) {\n const bold = '\\x1b[1m';\n const inverse = focused ? '\\x1b[7m' : '';\n line += `${inverse}${bold}${content}\\x1b[0m`;\n } else {\n line += content;\n }\n\n writeClipped(buf, innerX, rowStart + i, line, innerW);\n }\n\n // 7. Bottom scroll indicator\n if (hasBottomIndicator) {\n const bottomMore = nodes.length - scrollOffset - maxVisible;\n const bottomRow = rowStart + availRows;\n writeClipped(buf, innerX, bottomRow, `\\x1b[2m↓ ${bottomMore} more\\x1b[0m`, innerW);\n }\n\n // 8. Companion pinned to bottom (blank + face + wrapped commentary)\n if (companion) {\n const commentaryCount = _companionCommentaryLines.length;\n const faceRow = y + h - 2 - commentaryCount;\n const hasActive = nodes.some((n) => n.type === 'session' && n.status === 'active');\n const fields: CompanionField[] = hasActive\n ? ['face', 'boulder', 'verb']\n : ['face', 'boulder', 'hobby'];\n // Don't use renderCompanion's internal color — applyColor's string replace\n // breaks when maxWidth truncates the result. Apply mood color externally.\n const faceLine = renderCompanion(companion, fields, {\n maxWidth: innerW,\n agentCount: companion.recentActiveAgents ?? 0,\n verbIndex: companion.spinnerVerbIndex,\n });\n const moodCode = getMoodAnsiCode(companion.mood);\n writeClipped(buf, innerX, faceRow, `\\x1b[${moodCode}m${faceLine}\\x1b[0m`, innerW);\n\n for (let i = 0; i < commentaryCount; i++) {\n writeClipped(buf, innerX, faceRow + 1 + i, `\\x1b[${moodCode}m${_companionCommentaryLines[i]}\\x1b[0m`, innerW);\n }\n }\n}\n","import stringWidth from 'string-width';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\nimport { formatDuration } from '../../shared/format.js';\nimport {\n seg,\n singleLine,\n agentDisplayName,\n agentStatusIcon,\n statusColor,\n durationColor,\n modeColor,\n abbreviateMode,\n truncate,\n wrapText,\n formatTime,\n type DetailLine,\n type Seg,\n} from '../lib/format.js';\n\n// ---------------------------------------------------------------------------\n// Background tints (dark ANSI 24-bit backgrounds)\n// ---------------------------------------------------------------------------\n\nconst BG_TINTS: Record<string, string> = {\n yellow: '48;2;40;35;20',\n blue: '48;2;20;25;45',\n green: '48;2;20;35;20',\n magenta: '48;2;30;22;40',\n cyan: '48;2;18;30;38',\n red: '48;2;40;20;22',\n gray: '48;2;25;26;32',\n white: '48;2;30;30;30',\n};\n\n// Map tmux/extended color names to standard ANSI color names for seg()\nconst TMUX_TO_ANSI: Record<string, string> = {\n colour208: 'yellow', // orange\n colour6: 'cyan', // teal\n orange: 'yellow',\n teal: 'cyan',\n};\n\n/** Resolve a color name (possibly tmux-extended) to a valid ANSI color name */\nfunction resolveColor(color: string): string {\n return TMUX_TO_ANSI[color] ?? color;\n}\n\n// ---------------------------------------------------------------------------\n// Phase detection\n// ---------------------------------------------------------------------------\n\ntype Phase = 'orchestrator' | 'agents' | 'between' | 'complete';\n\nfunction getCurrentPhase(session: Session): Phase {\n if (session.status === 'completed') return 'complete';\n const cycles = session.orchestratorCycles;\n if (cycles.length === 0) return 'orchestrator';\n const lastCycle = cycles[cycles.length - 1]!;\n const cycleAgents = session.agents.filter(a => lastCycle.agentsSpawned.includes(a.id));\n\n if (!lastCycle.completedAt) {\n return cycleAgents.length > 0 ? 'agents' : 'orchestrator';\n }\n\n const allDone = cycleAgents.every(a => a.status !== 'running');\n if (cycleAgents.length > 0 && !allDone) return 'agents';\n if (cycleAgents.length > 0 && allDone && lastCycle.nextPrompt) return 'between';\n return 'orchestrator';\n}\n\n// ---------------------------------------------------------------------------\n// Box rendering primitives\n// ---------------------------------------------------------------------------\n\n/** Pad or truncate text to exactly `w` display columns */\nfunction padTo(text: string, w: number): string {\n const tw = stringWidth(text);\n if (tw >= w) return truncate(text, w);\n return text + ' '.repeat(w - tw);\n}\n\n/** Build a full-width orchestrator box */\nfunction buildOrchestratorNode(\n cycle: OrchestratorCycle,\n agents: Agent[],\n width: number,\n bright: boolean,\n showConnectorBottom: boolean,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const inner = width - 2; // inside borders\n const bg = BG_TINTS.yellow;\n const dim = !bright;\n const isRunning = !cycle.completedAt;\n const icon = isRunning ? '●' : '○';\n const cycleLabel = `C${cycle.cycle}`;\n const modeLabel = abbreviateMode(cycle.mode);\n const mColor = modeColor(cycle.mode);\n\n let rightText: string;\n if (isRunning) {\n rightText = 'running';\n } else {\n const dur = formatDuration(cycle.activeMs);\n const time = formatTime(cycle.timestamp);\n rightText = `${dur} ${time}`;\n }\n\n const leftContent = `${icon} ${cycleLabel} ${modeLabel}`;\n const leftW = stringWidth(leftContent);\n const rightW = stringWidth(rightText);\n const gap = Math.max(1, inner - 2 - leftW - rightW);\n\n // Top border\n lines.push([seg('╭' + '─'.repeat(inner) + '╮', { color: 'yellow', dim })]);\n\n // Content row with bg tint\n const contentSegs: Seg[] = [\n seg('│', { color: 'yellow', dim }),\n seg(' ' + icon + ' ', { bg, color: isRunning ? 'green' : undefined, dim: !isRunning && dim, bold: bright }),\n seg(cycleLabel, { bg, dim, bold: bright }),\n seg(' ', { bg }),\n seg(modeLabel, { bg, color: mColor, dim }),\n seg(' '.repeat(gap), { bg }),\n ];\n if (isRunning && bright) {\n contentSegs.push(seg(rightText, { bg, color: 'green', bold: true }));\n } else {\n contentSegs.push(seg(rightText, { bg, dim }));\n }\n contentSegs.push(seg(' ', { bg }));\n // Pad remaining to fill inner width\n const usedWidth = 1 + 1 + 1 + 1 + stringWidth(cycleLabel) + 2 + stringWidth(modeLabel) + gap + stringWidth(rightText) + 1;\n if (usedWidth < inner) {\n contentSegs.push(seg(' '.repeat(inner - usedWidth), { bg }));\n }\n contentSegs.push(seg('│', { color: 'yellow', dim }));\n lines.push(contentSegs);\n\n // Agent summary row\n if (agents.length > 0) {\n const running = agents.filter(a => a.status === 'running').length;\n const done = agents.filter(a => a.status === 'completed').length;\n const failed = agents.filter(a => a.status === 'killed' || a.status === 'crashed').length;\n const parts: Seg[] = [\n seg('│', { color: 'yellow', dim }),\n seg(` ${agents.length} agent${agents.length !== 1 ? 's' : ''}: `, { bg, dim: true }),\n ];\n if (running > 0) parts.push(seg(`${running}▶ `, { bg, color: 'green', dim }));\n if (done > 0) parts.push(seg(`${done}✓ `, { bg, color: 'cyan', dim }));\n if (failed > 0) parts.push(seg(`${failed}✕ `, { bg, color: 'red', dim }));\n // Compute used width for padding\n const labelLen = ` ${agents.length} agent${agents.length !== 1 ? 's' : ''}: `.length;\n const countLen = (running > 0 ? `${running}▶ `.length : 0) + (done > 0 ? `${done}✓ `.length : 0) + (failed > 0 ? `${failed}✕ `.length : 0);\n const remaining = Math.max(0, inner - labelLen - countLen);\n parts.push(seg(' '.repeat(remaining), { bg }));\n parts.push(seg('│', { color: 'yellow', dim }));\n lines.push(parts);\n }\n\n // Bottom border — with or without connector\n if (showConnectorBottom) {\n const mid = Math.floor(inner / 2);\n const left = mid;\n const right = inner - mid - 1;\n lines.push([seg('╰' + '─'.repeat(left) + '┬' + '─'.repeat(right) + '╯', { color: 'yellow', dim })]);\n } else {\n lines.push([seg('╰' + '─'.repeat(inner) + '╯', { color: 'yellow', dim })]);\n }\n\n return lines;\n}\n\n/** Canonical stem column — all vertical connectors use this */\nfunction stemCol(width: number): number {\n return Math.floor(width / 2);\n}\n\n/** Build the vertical connector line between orchestrator and agent branch */\nfunction buildVerticalConnector(width: number, dim: boolean): DetailLine {\n const col = stemCol(width);\n return [\n seg(' '.repeat(col)),\n seg('│', { dim }),\n ];\n}\n\n/** Build horizontal branch connector: ┌────┼────┐ */\nfunction buildBranchConnector(\n boxWidth: number,\n count: number,\n totalWidth: number,\n direction: 'down' | 'up',\n): DetailLine[] {\n if (count === 0) return [];\n const centers = boxCenters(boxWidth, count, totalWidth);\n const mid = stemCol(totalWidth);\n const lineStart = centers[0]!;\n const lineEnd = centers[centers.length - 1]!;\n\n if (count === 1) {\n // Single agent — just a vertical line at center\n return [buildVerticalConnector(totalWidth, false)];\n }\n\n // Build the horizontal branch line\n const row = new Array(totalWidth).fill(' ');\n const upChar = direction === 'down' ? '┬' : '┴';\n const leftCorner = direction === 'down' ? '┌' : '└';\n const rightCorner = direction === 'down' ? '┐' : '┘';\n\n row[lineStart] = leftCorner;\n row[lineEnd] = rightCorner;\n for (let i = lineStart + 1; i < lineEnd; i++) {\n row[i] = '─';\n }\n // Place T-junctions at each box center (overwrite ─)\n row[mid] = '┼';\n for (const c of centers) {\n if (c !== mid && c !== lineStart && c !== lineEnd) {\n row[c] = upChar;\n }\n }\n\n return [[seg(row.join(''), { dim: false })]];\n}\n\n/** Get a short summary for an agent: report excerpt or instruction preview */\nfunction agentSummary(a: Agent, maxW: number): string {\n // Prefer final report summary\n if (a.reports.length > 0) {\n const last = a.reports[a.reports.length - 1]!;\n const prefix = last.type === 'final' ? '↳ ' : '… ';\n return prefix + truncate(last.summary.split('\\n')[0]!, maxW - 2);\n }\n // Fall back to instruction preview\n return truncate(a.instruction.split('\\n')[0]!, maxW);\n}\n\n/**\n * Compute leftPad so the center box's ┴/┬ aligns with stemCol.\n * For odd counts the middle box aligns exactly; for even counts\n * we fall back to simple centering (no single \"middle\" box).\n */\nfunction alignedLeftPad(boxWidth: number, count: number, totalWidth: number): number {\n if (count === 0) return 0;\n const stem = stemCol(totalWidth);\n const midIdx = Math.floor((count - 1) / 2);\n const idealPad = stem - midIdx * boxWidth - Math.floor(boxWidth / 2);\n return Math.max(0, idealPad);\n}\n\n/** Compute box center positions for a row of `count` boxes */\nfunction boxCenters(boxWidth: number, count: number, totalWidth: number): number[] {\n const leftPad = alignedLeftPad(boxWidth, count, totalWidth);\n const centers: number[] = [];\n for (let i = 0; i < count; i++) {\n centers.push(leftPad + i * boxWidth + Math.floor(boxWidth / 2));\n }\n return centers;\n}\n\n/** Build a fan-in line from multiple box-bottom ┬ to a single stem center */\nfunction buildInterRowFanIn(\n prevCenters: number[],\n totalWidth: number,\n): DetailLine[] {\n const mid = stemCol(totalWidth);\n if (prevCenters.length <= 1) {\n // Single box — just vertical at the box center (might differ from stem)\n const col = prevCenters[0] ?? mid;\n if (col === mid) return [buildVerticalConnector(totalWidth, false)];\n // Connect box center to stem\n const row = new Array(totalWidth).fill(' ');\n const left = Math.min(col, mid);\n const right = Math.max(col, mid);\n row[left] = '└';\n row[right] = '┘';\n for (let i = left + 1; i < right; i++) row[i] = '─';\n if (col === left) row[col] = '┴';\n if (col === right) row[col] = '┴';\n row[mid] = mid === left || mid === right ? '┼' : '┼';\n // Overwrite corners that are the stem\n return [[seg(row.join(''))], buildVerticalConnector(totalWidth, false)];\n }\n const lineStart = Math.min(prevCenters[0]!, mid);\n const lineEnd = Math.max(prevCenters[prevCenters.length - 1]!, mid);\n const row = new Array(totalWidth).fill(' ');\n row[lineStart] = '└';\n row[lineEnd] = '┘';\n for (let i = lineStart + 1; i < lineEnd; i++) row[i] = '─';\n row[mid] = '┼';\n for (const c of prevCenters) {\n if (c !== lineStart && c !== lineEnd && c !== mid) row[c] = '┴';\n if (c === lineStart && c !== mid) row[c] = '┴';\n if (c === lineEnd && c !== mid) row[c] = '┴';\n }\n return [[seg(row.join(''))], buildVerticalConnector(totalWidth, false)];\n}\n\n/** Build agent box rows (4 lines per box, max 3 per row) */\nfunction buildAgentBoxRows(\n agents: Agent[],\n boxWidth: number,\n totalWidth: number,\n bright: boolean,\n maxPerRow: number,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const innerW = boxWidth - 2; // inside left/right border chars\n\n for (let rowStart = 0; rowStart < agents.length; rowStart += maxPerRow) {\n const rowAgents = agents.slice(rowStart, rowStart + maxPerRow);\n const count = rowAgents.length;\n const leftPad = alignedLeftPad(boxWidth, count, totalWidth);\n const isFirstRow = rowStart === 0;\n\n // Inter-row connector: fan-in from previous row → stem → fan-out to this row\n if (!isFirstRow) {\n const prevCount = Math.min(agents.length - (rowStart - maxPerRow), maxPerRow);\n const prevCents = boxCenters(boxWidth, prevCount, totalWidth);\n lines.push(...buildInterRowFanIn(prevCents, totalWidth));\n // Fan-out from stem to this row's boxes\n if (count > 1) {\n lines.push(...buildBranchConnector(boxWidth, count, totalWidth, 'down'));\n } else {\n lines.push(buildVerticalConnector(totalWidth, false));\n }\n }\n\n // Top borders with ┴ connector (first row gets ┴ from branch above, subsequent rows from inter-row fan-out)\n const topSegs: Seg[] = [];\n if (leftPad > 0) topSegs.push(seg(' '.repeat(leftPad)));\n for (let i = 0; i < count; i++) {\n const a = rowAgents[i]!;\n const isError = a.status === 'killed' || a.status === 'crashed';\n const borderColor = isError ? 'red' : resolveColor(a.color);\n const dim = !bright;\n\n const mid = Math.floor(innerW / 2);\n topSegs.push(seg('╭' + '─'.repeat(mid) + '┴' + '─'.repeat(innerW - mid - 1) + '╮', { color: borderColor, dim }));\n }\n lines.push(topSegs);\n\n // Line 1: colored icon + agent id\n const line1Segs: Seg[] = [];\n if (leftPad > 0) line1Segs.push(seg(' '.repeat(leftPad)));\n for (const a of rowAgents) {\n const isError = a.status === 'killed' || a.status === 'crashed';\n const borderColor = isError ? 'red' : resolveColor(a.color);\n const agentBg = BG_TINTS[isError ? 'red' : resolveColor(a.color)] ?? BG_TINTS.gray;\n const dim = !bright;\n const icon = agentStatusIcon(a.status);\n const iconColor = statusColor(a.status);\n const idPadded = padTo(` ${a.id}`, innerW - stringWidth(icon));\n line1Segs.push(seg('│', { color: borderColor, dim }));\n line1Segs.push(seg(icon, { bg: agentBg, color: iconColor, bold: bright }));\n line1Segs.push(seg(idPadded, { bg: agentBg, dim, bold: bright && a.status === 'running' }));\n line1Segs.push(seg('│', { color: borderColor, dim }));\n }\n lines.push(line1Segs);\n\n // Line 2: agent display name\n const line2Segs: Seg[] = [];\n if (leftPad > 0) line2Segs.push(seg(' '.repeat(leftPad)));\n for (const a of rowAgents) {\n const isError = a.status === 'killed' || a.status === 'crashed';\n const borderColor = isError ? 'red' : resolveColor(a.color);\n const agentBg = BG_TINTS[isError ? 'red' : resolveColor(a.color)] ?? BG_TINTS.gray;\n const dim = !bright;\n const name = padTo(agentDisplayName(a), innerW);\n line2Segs.push(seg('│', { color: borderColor, dim }));\n line2Segs.push(seg(name, { bg: agentBg, dim }));\n line2Segs.push(seg('│', { color: borderColor, dim }));\n }\n lines.push(line2Segs);\n\n // Line 3: colored duration + status tag for errors\n const line3Segs: Seg[] = [];\n if (leftPad > 0) line3Segs.push(seg(' '.repeat(leftPad)));\n for (const a of rowAgents) {\n const isError = a.status === 'killed' || a.status === 'crashed';\n const borderColor = isError ? 'red' : resolveColor(a.color);\n const agentBg = BG_TINTS[isError ? 'red' : resolveColor(a.color)] ?? BG_TINTS.gray;\n const dim = !bright;\n const dur = formatDuration(a.activeMs);\n const durClr = isError ? 'red' : (durationColor(a.activeMs) || undefined);\n let durText: string;\n if (isError) {\n const tag = a.status === 'killed' ? '✕ kill' : '✕ crash';\n durText = padTo(`${dur} ${tag}`, innerW);\n } else if (a.status === 'completed') {\n durText = padTo(`${dur} ✓`, innerW);\n } else {\n durText = padTo(dur, innerW);\n }\n line3Segs.push(seg('│', { color: borderColor, dim }));\n line3Segs.push(seg(durText, { bg: agentBg, dim, color: durClr }));\n line3Segs.push(seg('│', { color: borderColor, dim }));\n }\n lines.push(line3Segs);\n\n // Line 4: instruction preview or report summary (dim)\n const line4Segs: Seg[] = [];\n if (leftPad > 0) line4Segs.push(seg(' '.repeat(leftPad)));\n for (const a of rowAgents) {\n const isError = a.status === 'killed' || a.status === 'crashed';\n const borderColor = isError ? 'red' : resolveColor(a.color);\n const agentBg = BG_TINTS[isError ? 'red' : resolveColor(a.color)] ?? BG_TINTS.gray;\n const dim = !bright;\n const summary = padTo(agentSummary(a, innerW), innerW);\n line4Segs.push(seg('│', { color: borderColor, dim }));\n line4Segs.push(seg(summary, { bg: agentBg, dim: true }));\n line4Segs.push(seg('│', { color: borderColor, dim }));\n }\n lines.push(line4Segs);\n\n // Bottom borders with ┬ connector\n const botSegs: Seg[] = [];\n if (leftPad > 0) botSegs.push(seg(' '.repeat(leftPad)));\n for (const a of rowAgents) {\n const isError = a.status === 'killed' || a.status === 'crashed';\n const borderColor = isError ? 'red' : resolveColor(a.color);\n const dim = !bright;\n const mid = Math.floor(innerW / 2);\n const left = mid;\n const right = innerW - mid - 1;\n botSegs.push(seg('╰' + '─'.repeat(left) + '┬' + '─'.repeat(right) + '╯', { color: borderColor, dim }));\n }\n lines.push(botSegs);\n }\n\n return lines;\n}\n\n/** Build fan-in merge connector below agent boxes */\nfunction buildFanInConnector(\n boxWidth: number,\n count: number,\n totalWidth: number,\n): DetailLine[] {\n if (count <= 1) {\n // Single agent — just vertical line\n return [buildVerticalConnector(totalWidth, false)];\n }\n\n const centers = boxCenters(boxWidth, count, totalWidth);\n const lineStart = centers[0]!;\n const lineEnd = centers[centers.length - 1]!;\n const mid = stemCol(totalWidth);\n\n const row = new Array(totalWidth).fill(' ');\n // Extend horizontal line to include stem if it's outside the box cluster\n const hStart = Math.min(lineStart, mid);\n const hEnd = Math.max(lineEnd, mid);\n row[hStart] = '└';\n row[hEnd] = '┘';\n for (let i = hStart + 1; i < hEnd; i++) {\n row[i] = '─';\n }\n row[mid] = '┼';\n // Box centers become ┴\n for (const c of centers) {\n if (c !== mid && c !== hStart && c !== hEnd) {\n row[c] = '┴';\n }\n // Corner chars that coincide with a box center\n if (c === hStart && c !== mid) row[c] = '┴';\n if (c === hEnd && c !== mid) row[c] = '┴';\n }\n\n const result: DetailLine[] = [];\n result.push([seg(row.join(''))]);\n // Vertical line down from merge point\n const vRow = new Array(totalWidth).fill(' ');\n vRow[mid] = '│';\n result.push([seg(vRow.join(''))]);\n\n return result;\n}\n\n/** Build yield prompt node (solid when known, dashed when unknown) */\nfunction buildYieldNode(\n prompt: string | undefined,\n width: number,\n bright: boolean,\n known: boolean,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const inner = width - 2;\n const bg = BG_TINTS.gray;\n const dim = !bright;\n\n if (known && prompt) {\n // Solid border, yellow\n lines.push([seg('╭' + '─'.repeat(inner) + '╮', { color: 'yellow', dim })]);\n const wrapped = wrapText(prompt, inner - 2);\n for (const wl of wrapped) {\n const padded = padTo(' ' + wl, inner);\n lines.push([\n seg('│', { color: 'yellow', dim }),\n seg(padded, { bg, dim: true }),\n seg('│', { color: 'yellow', dim }),\n ]);\n }\n lines.push([seg('╰' + '─'.repeat(inner) + '╯', { color: 'yellow', dim })]);\n } else {\n // Dim placeholder with solid borders\n lines.push([seg('╭' + '─'.repeat(inner) + '╮', { dim: true })]);\n const placeholder = padTo(' awaiting agents…', inner);\n lines.push([seg('│', { dim: true }), seg(placeholder, { bg, dim: true }), seg('│', { dim: true })]);\n lines.push([seg('╰' + '─'.repeat(inner) + '╯', { dim: true })]);\n }\n\n return lines;\n}\n\n/** Build the complete node (terminal state) */\nfunction buildCompleteNode(session: Session, width: number): DetailLine[] {\n const inner = width - 2;\n const dur = formatDuration(session.activeMs);\n const totalAgents = session.agents.length;\n const completed = session.agents.filter(a => a.status === 'completed').length;\n const crashed = session.agents.filter(a => a.status === 'crashed' || a.status === 'killed').length;\n const cycles = session.orchestratorCycles.length;\n\n const leftText = '◉ complete';\n const rightText = `${dur} total`;\n const gap = Math.max(1, inner - 2 - stringWidth(leftText) - stringWidth(rightText));\n\n // Summary line: \"6 cycles · 12 agents (10 ok, 2 failed)\"\n let summaryParts = `${cycles} cycle${cycles !== 1 ? 's' : ''} · ${totalAgents} agent${totalAgents !== 1 ? 's' : ''}`;\n if (totalAgents > 0) {\n const parts: string[] = [];\n if (completed > 0) parts.push(`${completed} ok`);\n if (crashed > 0) parts.push(`${crashed} failed`);\n if (parts.length > 0) summaryParts += ` (${parts.join(', ')})`;\n }\n const summaryLine = padTo(' ' + summaryParts, inner);\n\n return [\n [seg('╭' + '─'.repeat(inner) + '╮', { color: 'cyan', bold: true })],\n [\n seg('│', { color: 'cyan', bold: true }),\n seg(' ' + leftText, { bold: true }),\n seg(' '.repeat(gap)),\n seg(rightText, { dim: true }),\n seg(' ', {}),\n seg('│', { color: 'cyan', bold: true }),\n ],\n [\n seg('│', { color: 'cyan', bold: true }),\n seg(summaryLine, { dim: true }),\n seg('│', { color: 'cyan', bold: true }),\n ],\n [seg('╰' + '─'.repeat(inner) + '╯', { color: 'cyan', bold: true })],\n ];\n}\n\n/** Build a dim placeholder orchestrator (next phase) */\nfunction buildDottedOrchestratorPlaceholder(width: number): DetailLine[] {\n const inner = width - 2;\n const placeholder = padTo(' spawning orchestrator…', inner);\n return [\n [seg('╭' + '─'.repeat(inner) + '╮', { dim: true })],\n [seg('│', { dim: true }), seg(placeholder, { bg: BG_TINTS.yellow, dim: true }), seg('│', { dim: true })],\n [seg('╰' + '─'.repeat(inner) + '╯', { dim: true })],\n ];\n}\n\n/** Build a dim placeholder agent box row */\nfunction buildDottedAgentPlaceholder(width: number): DetailLine[] {\n const inner = width - 2;\n const placeholder = padTo(' awaiting orchestrator…', inner);\n return [\n [seg('╭' + '─'.repeat(inner) + '╮', { dim: true })],\n [seg('│', { dim: true }), seg(placeholder, { bg: BG_TINTS.blue, dim: true }), seg('│', { dim: true })],\n [seg('╰' + '─'.repeat(inner) + '╯', { dim: true })],\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Render a single cycle's flow (orchestrator → agents → yield)\n// ---------------------------------------------------------------------------\n\nfunction renderCycleFlow(\n session: Session,\n cycle: OrchestratorCycle,\n prevCycle: OrchestratorCycle | undefined,\n width: number,\n phase: Phase,\n isCurrentCycle: boolean,\n isPrevCycle: boolean,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const cycleAgents = session.agents.filter(a => cycle.agentsSpawned.includes(a.id));\n const maxPerRow = 3;\n const boxWidth = Math.max(12, Math.floor((width - 4) / maxPerRow));\n const firstRowCount = Math.min(cycleAgents.length, maxPerRow);\n const lastRowCount = cycleAgents.length > 0 ? ((cycleAgents.length - 1) % maxPerRow) + 1 : 0;\n\n // Determine brightness for each section\n let orchBright = false;\n let agentsBright = false;\n let yieldBright = false;\n\n if (isCurrentCycle) {\n if (phase === 'orchestrator') orchBright = true;\n else if (phase === 'agents') agentsBright = true;\n else if (phase === 'between') yieldBright = true;\n }\n // Previous cycle: everything dim (default false is fine)\n\n const showAgents = cycleAgents.length > 0;\n const hasConnectorFromOrch = showAgents;\n\n // Orchestrator node\n lines.push(...buildOrchestratorNode(cycle, cycleAgents, width, orchBright, hasConnectorFromOrch));\n\n if (showAgents) {\n // Vertical connector\n lines.push(buildVerticalConnector(width, !agentsBright));\n\n // Fan-out branch\n if (firstRowCount > 1) {\n lines.push(...buildBranchConnector(boxWidth, firstRowCount, width, 'down'));\n }\n\n // Agent boxes\n lines.push(...buildAgentBoxRows(cycleAgents, boxWidth, width, agentsBright, maxPerRow));\n\n // Fan-in merge (from last row's boxes)\n lines.push(...buildFanInConnector(boxWidth, lastRowCount, width));\n } else if (hasConnectorFromOrch) {\n lines.push(buildVerticalConnector(width, true));\n }\n\n // Yield prompt\n const yieldKnown = !!cycle.nextPrompt;\n if (yieldKnown || isCurrentCycle) {\n lines.push(...buildYieldNode(\n cycle.nextPrompt,\n width,\n yieldBright,\n yieldKnown,\n ));\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport function buildCycleFlowLines(\n session: Session,\n width: number,\n expanded: boolean,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const cycles = session.orchestratorCycles;\n const phase = getCurrentPhase(session);\n const maxPerRow = 3;\n const boxWidth = Math.max(12, Math.floor((width - 4) / maxPerRow));\n const firstRowAgentCount = (c: OrchestratorCycle) => {\n const agents = session.agents.filter(a => c.agentsSpawned.includes(a.id));\n return Math.min(agents.length, maxPerRow);\n };\n const lastRowAgentCount = (c: OrchestratorCycle) => {\n const count = session.agents.filter(a => c.agentsSpawned.includes(a.id)).length;\n return count > 0 ? ((count - 1) % maxPerRow) + 1 : 0;\n };\n\n // Header\n lines.push([\n seg(' ▎ ◈ CYCLE FLOW', { color: 'blue', bold: true }),\n seg(expanded ? ' [F] collapse' : ' [F] full', { dim: true }),\n ]);\n lines.push(singleLine(' '));\n\n if (cycles.length === 0) {\n // First cycle, orchestrator hasn't started yet\n lines.push(singleLine(' waiting for orchestrator…', { dim: true, italic: true }));\n return lines;\n }\n\n if (expanded) {\n // Show all cycles, older ones dimmer\n for (let i = 0; i < cycles.length; i++) {\n const cycle = cycles[i]!;\n const prevCycle = i > 0 ? cycles[i - 1] : undefined;\n const isLast = i === cycles.length - 1;\n\n const cycleLines = renderCycleFlow(\n session, cycle, prevCycle, width, phase, isLast, !isLast,\n );\n\n // Apply extra dim to older cycles\n if (!isLast) {\n for (const line of cycleLines) {\n for (const s of line) {\n s.dim = true;\n }\n }\n }\n\n lines.push(...cycleLines);\n\n if (!isLast) {\n lines.push(singleLine(' '));\n }\n }\n } else {\n // 3-phase sliding window\n const currentCycle = cycles[cycles.length - 1]!;\n const prevCycle = cycles.length >= 2 ? cycles[cycles.length - 2] : undefined;\n const currentAgents = session.agents.filter(a => currentCycle.agentsSpawned.includes(a.id));\n\n // Previous phase (dim)\n if (phase === 'agents' && currentCycle) {\n // Previous = orchestrator (dim)\n lines.push(...buildOrchestratorNode(currentCycle, currentAgents, width, false, true));\n lines.push(buildVerticalConnector(width, true));\n if (firstRowAgentCount(currentCycle) > 1) {\n const dimBranch = buildBranchConnector(boxWidth, firstRowAgentCount(currentCycle), width, 'down');\n for (const line of dimBranch) {\n for (const s of line) s.dim = true;\n }\n lines.push(...dimBranch);\n }\n } else if (phase === 'orchestrator' && prevCycle) {\n // Previous = yield prompt from prev cycle (dim)\n if (prevCycle.nextPrompt) {\n lines.push(...buildYieldNode(prevCycle.nextPrompt, width, false, true));\n lines.push(singleLine(' '));\n }\n } else if (phase === 'between') {\n // Previous = agent boxes (slightly dim)\n if (currentAgents.length > 0) {\n lines.push(...buildAgentBoxRows(currentAgents, boxWidth, width, false, maxPerRow));\n lines.push(...buildFanInConnector(boxWidth, lastRowAgentCount(currentCycle), width));\n }\n }\n\n // Current phase (bright)\n if (phase === 'orchestrator') {\n lines.push(...buildOrchestratorNode(currentCycle, currentAgents, width, true, false));\n } else if (phase === 'agents') {\n // Agent boxes bright\n lines.push(...buildAgentBoxRows(currentAgents, boxWidth, width, true, maxPerRow));\n lines.push(...buildFanInConnector(boxWidth, lastRowAgentCount(currentCycle), width));\n } else if (phase === 'between') {\n // Yield prompt bright\n lines.push(...buildYieldNode(currentCycle.nextPrompt, width, true, true));\n } else if (phase === 'complete') {\n // Previous = last agents dim\n if (currentAgents.length > 0) {\n lines.push(...buildAgentBoxRows(currentAgents, boxWidth, width, false, maxPerRow));\n lines.push(...buildFanInConnector(boxWidth, lastRowAgentCount(currentCycle), width));\n }\n // Complete node bright\n lines.push(...buildCompleteNode(session, width));\n }\n\n // Next phase (dotted/planned)\n if (phase === 'agents') {\n lines.push(...buildYieldNode(undefined, width, false, false));\n } else if (phase === 'orchestrator') {\n lines.push(singleLine(' '));\n lines.push(...buildDottedAgentPlaceholder(width));\n } else if (phase === 'between') {\n lines.push(singleLine(' '));\n lines.push(...buildDottedOrchestratorPlaceholder(width));\n }\n // 'complete' has no next phase\n }\n\n return lines;\n}\n","import type { AskStatus, InteractionKind } from './types.js';\n\nexport type { InteractionKind as InboxItemKind };\n\nexport function coerceKind(k: InteractionKind | undefined): InteractionKind {\n if (k !== undefined) return k;\n return 'validation';\n}\n\nexport interface AggregateInboxItem {\n sessionId: string;\n sessionName?: string;\n cwd: string;\n askId: string;\n askedBy: string;\n askedAt: string;\n status: AskStatus;\n blocking: boolean;\n orphaned?: boolean;\n title?: string;\n subtitle?: string;\n blockedSince: string;\n kind?: InteractionKind;\n}\n","import {\n buildPanelRows,\n buildEmptyPanelRows,\n type Rect,\n} from '../render.js';\nimport type { AppState, CycleLog } from '../state.js';\nimport type {\n TreeNode,\n CycleTreeNode,\n AgentTreeNode,\n ReportTreeNode,\n MessageTreeNode,\n ContextFileTreeNode,\n} from '../types/tree.js';\nimport type { Session, Agent, OrchestratorCycle, StatusDigest } from '../../shared/types.js';\nimport { computeActiveTimeMs } from '../../shared/utils.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport {\n statusColor,\n formatDuration,\n formatTime,\n truncate,\n wrapText,\n stripFrontmatter,\n cleanMarkdown,\n seg,\n singleLine,\n agentDisplayName,\n reportBadge,\n agentStatusIcon,\n agentTypeColor,\n durationColor,\n modeColor,\n messageSourceLabel,\n messageSourceColor,\n extractFirstSentence,\n divider,\n type DetailLine,\n} from '../lib/format.js';\nimport { buildCycleFlowLines } from './cycle-flow.js';\nimport { coerceKind } from '../../shared/inbox-types.js';\n\n// ---------------------------------------------------------------------------\n// Public interface\n// ---------------------------------------------------------------------------\n\nexport interface DetailContext {\n nodes: TreeNode[];\n session: Session | null;\n agents: Agent[];\n reportBlocks: ReportBlock[];\n detailReportBlocks: ReportBlock[];\n contextFileContent: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// PlanLine (copied from PlanView.tsx — no React dependency)\n// ---------------------------------------------------------------------------\n\ninterface PlanLine {\n text: string;\n bold?: boolean;\n dim?: boolean;\n color?: string;\n}\n\nfunction buildPlanLines(content: string, maxLines: number, width: number): PlanLine[] {\n const clean = stripFrontmatter(content);\n if (!clean.trim()) return [];\n\n const contentWidth = width - 4;\n const lines: PlanLine[] = [];\n const rawLines = clean.split('\\n');\n\n for (const rawLine of rawLines) {\n if (lines.length >= maxLines) break;\n\n const trimmed = rawLine.trim();\n\n // Skip frontmatter artifacts\n if (trimmed === '---') continue;\n\n // Headers — bold, with level-based indentation\n const headerMatch = rawLine.match(/^(#{1,6})\\s+(.+)/);\n if (headerMatch) {\n const level = headerMatch[1]!.length;\n const headerText = cleanMarkdown(headerMatch[2]!);\n const indent = ' '.repeat(Math.max(0, level - 1));\n if (lines.length > 0) lines.push({ text: ' ' });\n lines.push({\n text: ` ${indent}${headerText}`,\n bold: true,\n color: level <= 2 ? 'white' : undefined,\n });\n continue;\n }\n\n // Empty lines — pass through (but collapse multiples)\n if (!trimmed) {\n if (lines.length > 0 && lines[lines.length - 1]!.text !== '') {\n lines.push({ text: ' ' });\n }\n continue;\n }\n\n // Numbered list items\n const listMatch = trimmed.match(/^(\\d+)[.)]\\s+(.+)/);\n if (listMatch) {\n const cleaned = `${listMatch[1]}. ${cleanMarkdown(listMatch[2]!)}`;\n const wrapped = wrapText(cleaned, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n continue;\n }\n\n // Checkbox items — must come before bullet match\n const checkboxMatch = trimmed.match(/^- \\[( |x|X)\\] (.+)/);\n if (checkboxMatch) {\n const checked = checkboxMatch[1] !== ' ';\n const checkboxText = cleanMarkdown(checkboxMatch[2]!);\n const icon = checked ? '☑' : '☐';\n const wrapped = wrapText(`${icon} ${checkboxText}`, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true, color: checked ? 'green' : undefined });\n }\n continue;\n }\n\n // Bullet items\n const bulletMatch = trimmed.match(/^[-*+]\\s+(.+)/);\n if (bulletMatch) {\n const cleaned = `· ${cleanMarkdown(bulletMatch[1]!)}`;\n const wrapped = wrapText(cleaned, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n continue;\n }\n\n // Regular content — clean and wrap\n const cleaned = cleanMarkdown(trimmed);\n const wrapped = wrapText(cleaned, contentWidth - 4);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n }\n\n // Truncation indicator\n const totalContentLines = rawLines.filter((l) => l.trim()).length;\n if (lines.length >= maxLines && totalContentLines > maxLines) {\n lines[lines.length - 1] = { text: ' … [p] open in editor', dim: true };\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildSessionLines (ported from SessionDetail.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildSessionLines(\n session: Session,\n planContent: string,\n goalContent: string | undefined,\n width: number,\n paneAlive: boolean,\n strategyContent: string = '',\n flowExpanded: boolean = false,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const agents = session.agents;\n const cycles = session.orchestratorCycles;\n const isDead = session.status === 'active' && !paneAlive;\n // Goal text\n const goalText = goalContent\n ? cleanMarkdown(stripFrontmatter(goalContent).trim())\n : session.task;\n goalText\n .split('\\n')\n .flatMap((l) => wrapText(l, contentWidth - 2))\n .forEach((line, i) => {\n lines.push(singleLine(`${i === 0 ? ' ' : ' '}${line}`, { bold: true }));\n });\n\n // Status bar\n const lastCycle = cycles.length > 0 ? cycles[cycles.length - 1]! : null;\n const cycleNum = lastCycle !== null ? lastCycle.cycle : 0;\n const mode = lastCycle !== null && lastCycle.mode !== undefined ? lastCycle.mode : '';\n const runningAgents = agents.filter((a) => a.status === 'running').length;\n const completedAgents = agents.filter((a) => a.status === 'completed').length;\n const elapsed = formatDuration(session.createdAt, session.completedAt);\n const activeMs = computeActiveTimeMs(session);\n const activeTime = formatDuration(activeMs);\n const modeLabelColor = modeColor(mode);\n lines.push([\n seg(' '),\n seg(isDead ? '✕ dead' : session.status, {\n color: statusColor(isDead ? 'crashed' : session.status),\n }),\n seg(` · cycle ${cycleNum}`, { dim: true }),\n ...(mode ? [seg(' (', { dim: true }), seg(mode, { color: modeLabelColor }), seg(')', { dim: true })] : []),\n seg(` · ${elapsed} · `, { dim: true }),\n seg(`${runningAgents} running`, { color: 'green' }),\n seg(' · ', { dim: true }),\n seg(`${completedAgents} done`, { color: 'cyan' }),\n seg(` · ${activeTime} active`, { dim: true }),\n ]);\n\n // Dead session warning\n if (isDead) {\n lines.push([\n seg(' '),\n seg(' ✕ DEAD ', { color: 'red', bold: true }),\n seg(' tmux window closed — [w] reopen [R] resume', { color: 'red' }),\n ]);\n }\n\n // Orphan tag\n if (session.orphaned) {\n lines.push([\n seg(' '),\n seg('⚠ orphan', { color: 'red', bold: true }),\n seg(' — orchestrator process lost', { color: 'red' }),\n ]);\n }\n\n // Plan / Strategy section\n lines.push(singleLine(' '));\n if (strategyContent) {\n lines.push([seg(' ▎ ◈ STRATEGY', { color: 'yellow', bold: true })]);\n const stratLines = buildPlanLines(strategyContent, 99999, width);\n if (stratLines.length === 0) {\n lines.push(singleLine(' (empty)', { dim: true, italic: true }));\n } else {\n for (const pl of stratLines) {\n lines.push(singleLine(pl.text, { bold: pl.bold, dim: pl.dim, color: pl.color }));\n }\n }\n } else {\n lines.push([seg(' ▎ ◈ PLAN', { color: 'yellow', bold: true })]);\n const planLines = buildPlanLines(planContent, 99999, width);\n if (planLines.length === 0) {\n lines.push(singleLine(' orchestrator will create one', { dim: true, italic: true }));\n } else {\n for (const pl of planLines) {\n lines.push(singleLine(pl.text, { bold: pl.bold, dim: pl.dim, color: pl.color }));\n }\n }\n }\n\n // Completion report\n if (session.status === 'completed' && session.completionReport) {\n lines.push(singleLine(' '));\n lines.push([seg(' ▎ ✓ COMPLETION', { color: 'cyan', bold: true })]);\n wrapText(session.completionReport, contentWidth - 6).forEach((l) => {\n lines.push(singleLine(` ${l}`, { dim: true }));\n });\n }\n\n // Cycle flow visualization\n lines.push(singleLine(' '));\n lines.push(...buildCycleFlowLines(session, contentWidth, flowExpanded));\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildCycleLines (ported from CycleDetail.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildCycleLines(cycle: OrchestratorCycle, agents: Agent[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const isRunning = !cycle.completedAt;\n const dur = isRunning ? 'running' : formatDuration(cycle.activeMs);\n const cycleAgents = agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n\n lines.push(singleLine(` Cycle ${cycle.cycle}`, { bold: true }));\n lines.push([\n seg(' '),\n seg(isRunning ? 'running' : 'completed', { color: isRunning ? 'green' : 'gray' }),\n seg(` · ${dur} · ${cycleAgents.length} agent${cycleAgents.length !== 1 ? 's' : ''}`, { dim: true }),\n ...(cycle.mode\n ? [seg(' · ', { dim: true }), seg(cycle.mode, { color: modeColor(cycle.mode) })]\n : []),\n ]);\n lines.push(singleLine(\n ` ${formatTime(cycle.timestamp)}${cycle.completedAt ? ` → ${formatTime(cycle.completedAt)}` : ''}`,\n { dim: true },\n ));\n if (cycle.claudeSessionId) {\n lines.push(singleLine(` Session: ${cycle.claudeSessionId}`, { dim: true }));\n }\n\n lines.push(singleLine(' '));\n lines.push([seg(' ▎ ⊞ AGENTS', { color: 'green', bold: true })]);\n\n if (cycleAgents.length === 0) {\n lines.push(singleLine(' orchestrator spawning agents…', { dim: true, italic: true }));\n } else {\n for (const agent of cycleAgents) {\n const nameLabel = agentDisplayName(agent);\n const instrPreview = agent.instruction.split('\\n')[0]!;\n const latestReport = agent.reports.length > 0 ? agent.reports[agent.reports.length - 1]! : null;\n const reportSummary = latestReport !== null && agent.status === 'completed'\n ? extractFirstSentence(latestReport.summary, contentWidth - 14)\n : null;\n const agentDur = formatDuration(agent.activeMs);\n const durClrRaw = durationColor(agent.activeMs);\n const durClr = durClrRaw !== '' ? durClrRaw : undefined;\n const typeClrRaw = agentTypeColor(agent.agentType);\n const typeClr = typeClrRaw !== undefined ? typeClrRaw : undefined;\n\n lines.push([\n seg(' '),\n seg(agentStatusIcon(agent.status), { color: statusColor(agent.status) }),\n seg(` ${agent.id}`, { bold: true }),\n seg(` ${truncate(nameLabel, contentWidth - 30)}`, {\n color: typeClr,\n dim: typeClr === undefined,\n }),\n seg(` · ${agent.status} · `, { dim: true }),\n seg(agentDur, { color: durClr, dim: !durClr }),\n ]);\n\n if (instrPreview) {\n lines.push(singleLine(` ${truncate(instrPreview, contentWidth - 10)}`, { dim: true }));\n }\n\n if (reportSummary) {\n lines.push([\n seg(' '),\n seg('↳', { color: 'cyan' }),\n seg(` ${reportSummary}`, { dim: true }),\n ]);\n }\n }\n }\n\n if (cycle.nextPrompt) {\n lines.push(singleLine(' '));\n lines.push([seg(' ▎ ▷ NEXT PROMPT', { color: 'yellow', bold: true })]);\n for (const wl of wrapText(cycle.nextPrompt, contentWidth - 6)) {\n lines.push(singleLine(` ${wl}`, { dim: true }));\n }\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildAgentLines (ported from AgentDetail.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildAgentLines(agent: Agent, reportBlocks: ReportBlock[] | undefined, width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const dur = formatDuration(agent.activeMs);\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const nameLabel = agentDisplayName(agent);\n lines.push([\n seg(' '),\n seg(icon, { color }),\n seg(` ${agent.id} · ${nameLabel}`, { bold: true }),\n ]);\n\n lines.push([\n seg(' '),\n seg(agent.status, { color }),\n seg(` · ${dur} · ${agent.agentType}`, { dim: true }),\n ]);\n\n if (agent.killedReason) {\n lines.push(singleLine(` ⚠ ${agent.killedReason}`, { color: 'red' }));\n }\n\n lines.push(singleLine(' '));\n lines.push(singleLine(' ▎ ▷ INSTRUCTION', { color: 'white', bold: true }));\n for (const wl of wrapText(agent.instruction, contentWidth - 6)) {\n lines.push(singleLine(` ${wl}`, { dim: true }));\n }\n\n if (agent.reports.length > 0) {\n const hasResolved = reportBlocks && reportBlocks.length > 0;\n lines.push(singleLine(' '));\n lines.push([seg(` ▎ ◇ REPORTS (${agent.reports.length})`, { color: 'cyan', bold: true })]);\n\n if (hasResolved) {\n for (let i = 0; i < reportBlocks.length; i++) {\n const block = reportBlocks[i]!;\n const { label: badge, color: badgeColor } = reportBadge(block.type);\n\n if (i > 0) lines.push(singleLine(' '));\n lines.push([\n seg(' '),\n seg(badge, { color: badgeColor, bold: block.type === 'final' }),\n seg(` ${formatTime(block.timestamp)}`, { dim: true }),\n ]);\n for (const wl of wrapText(block.content.trim(), contentWidth - 10)) {\n lines.push(singleLine(` ${wl}`, { dim: true }));\n }\n }\n } else {\n for (const report of agent.reports) {\n const { label: badge, color: badgeColor } = reportBadge(report.type);\n lines.push([\n seg(' '),\n seg(badge, { color: badgeColor, bold: report.type === 'final' }),\n seg(` ${formatTime(report.timestamp)} ${report.summary.split('\\n')[0]}`, { dim: true }),\n ]);\n }\n }\n }\n\n lines.push(singleLine(' '));\n lines.push(singleLine(' ▎ ◦ META', { color: 'gray', bold: true }));\n lines.push(singleLine(` Spawned: ${formatTime(agent.spawnedAt)}`, { dim: true }));\n if (agent.completedAt) {\n lines.push(singleLine(` Completed: ${formatTime(agent.completedAt)}`, { dim: true }));\n }\n if (agent.claudeSessionId) {\n lines.push(singleLine(` Session: ${agent.claudeSessionId}`, { dim: true }));\n }\n if (agent.paneId) {\n lines.push(singleLine(` Pane: ${agent.paneId}`, { dim: true }));\n }\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildReportViewLines (ported from ReportView.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nfunction buildReportViewLines(agent: Agent, reportBlocks: ReportBlock[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 6;\n const dur = formatDuration(agent.activeMs);\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const totalReports = agent.reports.length;\n const nameLabel = agentDisplayName(agent);\n\n lines.push([\n seg(' '),\n seg(icon, { color }),\n seg(' '),\n seg(agent.id, { bold: true }),\n seg(' ', { dim: true }),\n seg('·', { dim: true }),\n seg(' '),\n seg(nameLabel, { bold: true }),\n ]);\n\n lines.push(singleLine(\n ` ${agent.status} · ${dur} · ${agent.agentType} · ${totalReports} report${totalReports !== 1 ? 's' : ''}`,\n { dim: true },\n ));\n\n lines.push(singleLine(' ' + divider(contentWidth - 2), { dim: true }));\n\n if (reportBlocks.length === 0) {\n lines.push(singleLine(''));\n lines.push(singleLine(' No reports submitted yet.', { dim: true }));\n lines.push(singleLine(''));\n return lines;\n }\n\n for (let i = 0; i < reportBlocks.length; i++) {\n const report = reportBlocks[i]!;\n const time = formatTime(report.timestamp);\n\n if (i > 0) {\n lines.push(singleLine(''));\n lines.push(singleLine(` ${divider(contentWidth - 2, '·')}`, { dim: true }));\n lines.push(singleLine(''));\n }\n\n const { label: badge, color: badgeColor } = reportBadge(report.type);\n lines.push([\n seg(` ${badge}`, { color: badgeColor, bold: report.type === 'final' }),\n seg(` ${time}`, { color: badgeColor }),\n ]);\n\n lines.push(singleLine(''));\n\n const wrapped = wrapText(report.content.trim(), contentWidth - 4);\n for (const line of wrapped) {\n lines.push(singleLine(` ${line}`));\n }\n }\n\n lines.push(singleLine(''));\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// buildLogsLines (ported from LogsPanel.tsx buildLines)\n// ---------------------------------------------------------------------------\n\nexport function buildLogsLines(cycleLogs: CycleLog[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n\n if (cycleLogs.length === 0) {\n return lines;\n }\n\n const sorted = [...cycleLogs].sort((a, b) => b.cycle - a.cycle);\n\n for (const { cycle, content } of sorted) {\n lines.push([seg(` Cycle ${cycle}`, { color: 'blue', bold: true })]);\n\n const cleaned = cleanMarkdown(stripFrontmatter(content)).trim();\n if (cleaned) {\n for (const rawLine of cleaned.split('\\n')) {\n const wrapped = wrapText(rawLine, contentWidth - 2);\n for (const wl of wrapped) {\n lines.push([seg(` ${wl}`, { dim: true })]);\n }\n }\n }\n\n lines.push([seg(' ')]);\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Main entry points\n// ---------------------------------------------------------------------------\n\nexport function renderDetailRows(\n rect: Rect,\n state: AppState,\n detailCtx: DetailContext,\n): string[] {\n const { session, agents, reportBlocks, detailReportBlocks, contextFileContent } = detailCtx;\n const focused = state.focusPane === 'detail';\n\n // Report detail mode — full panel\n if (state.mode === 'report-detail') {\n const reportAgent = agents.find((a) => a.id === state.targetAgentId);\n if (reportAgent) {\n const lines = buildReportViewLines(reportAgent, reportBlocks, rect.w);\n return buildPanelRows(rect, lines, state.detailScroll, focused, 'cyan');\n }\n }\n\n // No cursor / no session → empty state\n const cursorNode: TreeNode | undefined = detailCtx.nodes[state.cursorIndex];\n if (!cursorNode || !session) {\n return buildEmptyPanelRows(rect, false, 'gray', '\\x1b[2mSelect a session to view details\\x1b[0m');\n }\n\n // Session data hasn't arrived yet (poll debounced during rapid scrolling)\n if (cursorNode.sessionId !== session.id) {\n return buildEmptyPanelRows(rect, false, 'gray');\n }\n\n // Compute cache key from all inputs that affect line building\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n const cacheKey = [\n cursorNode.id,\n cursorNode.type,\n state.mode,\n state.targetAgentId,\n rect.w,\n session.id,\n session.agents.length,\n session.orchestratorCycles.length,\n lastCycle?.completedAt ?? '',\n lastCycle?.agentsSpawned.length ?? 0,\n state.planContent.length,\n state.goalContent.length,\n state.strategyContent.length,\n state.paneAlive,\n detailReportBlocks.length,\n session.messages.length,\n state.contextFiles.length,\n contextFileContent?.length ?? -1,\n state.flowExpanded,\n ].join(':');\n\n let lines: DetailLine[];\n let borderColor = 'gray';\n\n if (cacheKey === state.detailCacheKey && state.cachedDetailLines !== null) {\n lines = state.cachedDetailLines;\n } else {\n switch (cursorNode.type) {\n case 'session': {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent, state.flowExpanded);\n break;\n }\n\n case 'cycle': {\n const cycleNode = cursorNode as CycleTreeNode;\n const cycle = session.orchestratorCycles.find((c) => c.cycle === cycleNode.cycleNumber);\n if (!cycle) {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent, state.flowExpanded);\n } else {\n lines = buildCycleLines(cycle, session.agents, rect.w);\n }\n break;\n }\n\n case 'agent': {\n const agentNode = cursorNode as AgentTreeNode;\n const agent = agents.find((a) => a.id === agentNode.agentId);\n if (!agent) {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent, state.flowExpanded);\n } else {\n lines = buildAgentLines(agent, detailReportBlocks, rect.w);\n }\n break;\n }\n\n case 'report': {\n const reportNode = cursorNode as ReportTreeNode;\n const agent = agents.find((a) => a.id === reportNode.agentId);\n if (!agent) {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent, state.flowExpanded);\n break;\n }\n const reportIdx = reportNode.reportIndex;\n const specificBlock = detailReportBlocks.find((_b, i) => {\n const originalIdx = agent.reports.length - 1 - i;\n return originalIdx === reportIdx;\n });\n if (specificBlock) {\n const { label: badge, color: badgeColor } = reportBadge(specificBlock.type);\n lines = [\n [seg(' '), seg(badge, { color: badgeColor }), seg(` ${agent.id} · ${agentDisplayName(agent)}`, { bold: true })],\n singleLine(` ${formatTime(specificBlock.timestamp)}`, { dim: true }),\n singleLine(' '),\n [seg(' ▎ CONTENT', { color: badgeColor, bold: true })],\n ...wrapText(specificBlock.content.trim(), rect.w - 8).map((l) => singleLine(` ${l}`)),\n ];\n borderColor = badgeColor;\n } else {\n lines = buildAgentLines(agent, detailReportBlocks, rect.w);\n }\n break;\n }\n\n case 'messages': {\n lines = [singleLine(` Messages (${session.messages.length})`, { bold: true })];\n if (session.messages.length === 0) {\n lines.push(singleLine(' No messages', { dim: true, italic: true }));\n } else {\n for (const msg of session.messages) {\n const time = formatTime(msg.timestamp);\n const agentId = msg.source.type === 'agent' ? msg.source.agentId : undefined;\n const label = messageSourceLabel(msg.source.type, agentId);\n const labelColor = messageSourceColor(msg.source.type);\n const maxContent = Math.max(10, rect.w - label.length - 20);\n lines.push([\n seg(` [${time}] `, { dim: true }),\n seg(`${label}: `, { color: labelColor, bold: true }),\n seg(wrapText(msg.summary.length > 0 ? msg.summary : msg.content, maxContent)[0]!, {}),\n ]);\n }\n }\n break;\n }\n\n case 'message': {\n const msgNode = cursorNode as MessageTreeNode;\n const msg = session.messages.find((m) => m.id === msgNode.messageId);\n lines = [singleLine(' Message', { bold: true })];\n if (msg) {\n lines.push(singleLine(` ${msgNode.source} · ${msgNode.timestamp}`, { dim: true }));\n for (const l of wrapText(msg.content, rect.w - 8)) {\n lines.push(singleLine(` ${l}`));\n }\n } else {\n lines.push(singleLine(' Message not found', { dim: true }));\n }\n break;\n }\n\n case 'context': {\n lines = [\n [seg(' '), seg('⊞', { color: 'white' }), seg(` Context (${state.contextFiles.length})`, { bold: true })],\n ];\n if (state.contextFiles.length === 0) {\n lines.push(singleLine(' No context files found.', { dim: true }));\n } else {\n for (const f of state.contextFiles) {\n lines.push(singleLine(` · ${f}`, { dim: true }));\n }\n }\n break;\n }\n\n case 'context-file': {\n const ctxFileNode = cursorNode as ContextFileTreeNode;\n lines = [\n [seg(' '), seg('⊞', { color: 'white' }), seg(` ${ctxFileNode.label}`, { bold: true })],\n singleLine(' '),\n ];\n if (contextFileContent == null) {\n lines.push(singleLine(' File not found or unreadable.', { dim: true }));\n } else {\n const wrapped = wrapText(stripFrontmatter(contextFileContent), rect.w - 8);\n if (wrapped.length === 0) {\n lines.push(singleLine(' (empty)', { dim: true }));\n } else {\n for (const l of wrapped) {\n lines.push(singleLine(` ${l}`));\n }\n }\n }\n borderColor = 'white';\n break;\n }\n\n default: {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive, state.strategyContent, state.flowExpanded);\n break;\n }\n }\n\n state.cachedDetailLines = lines;\n state.detailCacheKey = cacheKey;\n }\n\n // Compute borderColor from node type (cheap, no need to cache)\n if (cursorNode.type === 'context-file') {\n borderColor = 'white';\n } else if (cursorNode.type === 'report') {\n const reportNode = cursorNode as ReportTreeNode;\n const agent = agents.find((a) => a.id === reportNode.agentId);\n if (agent) {\n const reportIdx = reportNode.reportIndex;\n const specificBlock = detailReportBlocks.find((_b, i) => {\n const originalIdx = agent.reports.length - 1 - i;\n return originalIdx === reportIdx;\n });\n if (specificBlock) borderColor = reportBadge(specificBlock.type).color;\n }\n }\n\n return buildPanelRows(rect, lines, state.detailScroll, focused, borderColor, state.detailRenderedCache);\n}\n\n// ---------------------------------------------------------------------------\n// buildDigestLines / renderDigestRows\n// ---------------------------------------------------------------------------\n\nfunction buildDigestLines(digest: StatusDigest, width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n\n // Recent Work\n lines.push([seg(' Recent Work', { color: 'cyan', bold: true })]);\n for (const wl of wrapText(digest.recentWork, contentWidth - 4)) {\n lines.push(singleLine(` ${wl}`));\n }\n lines.push(singleLine(''));\n\n // Current Activity\n lines.push([seg(' Now', { color: 'white', bold: true })]);\n for (const wl of wrapText(digest.currentActivity, contentWidth - 4)) {\n lines.push(singleLine(` ${wl}`));\n }\n lines.push(singleLine(''));\n\n // What's Next\n lines.push([seg(' Up Next', { color: 'white', bold: true })]);\n for (const wl of wrapText(digest.whatsNext, contentWidth - 4)) {\n lines.push([seg(` ${wl}`, { dim: true })]);\n }\n lines.push(singleLine(''));\n\n // Unusual Events\n if (digest.unusualEvents.length > 0) {\n lines.push([seg(' Unusual', { color: 'yellow', bold: true })]);\n for (const event of digest.unusualEvents) {\n for (const wl of wrapText(`· ${event}`, contentWidth - 4)) {\n lines.push([seg(` ${wl}`, { color: 'yellow' })]);\n }\n }\n }\n\n return lines;\n}\n\nfunction buildDoneDigestLines(session: Session, digest: StatusDigest | null, width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n\n // KPI band — most-asked stats first\n const kpiCycles = session.orchestratorCycles.length;\n const kpiAgents = session.agents.length;\n const kpiWall = session.wallClockMs\n ? formatMs(session.wallClockMs)\n : (session.completedAt ? formatDuration(session.createdAt, session.completedAt) : '—');\n const kpiActive = formatMs(computeActiveTimeMs(session));\n\n lines.push([seg(' Stats', { color: 'cyan', bold: true })]);\n lines.push([\n seg(' cycles ', { dim: true }),\n seg(String(kpiCycles), { color: 'white', bold: true }),\n seg(' · agents ', { dim: true }),\n seg(String(kpiAgents), { color: 'white', bold: true }),\n ]);\n lines.push([\n seg(' wall ', { dim: true }),\n seg(kpiWall, { color: 'white', bold: true }),\n seg(' · active ', { dim: true }),\n seg(kpiActive, { color: 'white', bold: true }),\n ]);\n lines.push(singleLine(''));\n\n // What shipped (recapped from digest if present)\n if (digest?.recentWork) {\n lines.push([seg(' What shipped', { color: 'cyan', bold: true })]);\n for (const wl of wrapText(digest.recentWork, contentWidth - 4)) {\n lines.push(singleLine(` ${wl}`));\n }\n lines.push(singleLine(''));\n }\n\n // Final state — replaces Now/Up Next\n lines.push([seg(' Final', { color: 'white', bold: true })]);\n if (session.completedAt) {\n lines.push([seg(` completed ${formatTimestampShort(session.completedAt)}`, { dim: true })]);\n }\n if (digest?.currentActivity) {\n for (const wl of wrapText(digest.currentActivity, contentWidth - 4)) {\n lines.push([seg(` ${wl}`, { dim: true })]);\n }\n }\n lines.push(singleLine(''));\n\n // Notable — preserved from Unusual; still useful post-hoc\n if (digest && digest.unusualEvents.length > 0) {\n lines.push([seg(' Notable', { color: 'yellow', bold: true })]);\n for (const event of digest.unusualEvents) {\n for (const wl of wrapText(`· ${event}`, contentWidth - 4)) {\n lines.push([seg(` ${wl}`, { color: 'yellow' })]);\n }\n }\n }\n\n return lines;\n}\n\nfunction formatMs(ms: number): string {\n if (!ms || ms < 0) return '—';\n const sec = Math.floor(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m${sec % 60 ? ` ${sec % 60}s` : ''}`;\n const hr = Math.floor(min / 60);\n return `${hr}h${min % 60 ? ` ${min % 60}m` : ''}`;\n}\n\nfunction formatTimestampShort(iso: string): string {\n try {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return iso;\n return d.toLocaleString();\n } catch {\n return iso;\n }\n}\n\nfunction renderFleetRollup(rect: Rect, state: AppState, focused: boolean): string[] {\n const items = state.aggregateInbox;\n const sessions = state.sessions;\n const cacheKey = `rollup:${items.length}:${sessions.length}:${items.map(i => `${i.askId}:${i.status}`).join(',')}:${rect.w}`;\n let lines: DetailLine[];\n if (cacheKey === state.digestCacheKey && state.cachedDigestLines !== null) {\n lines = state.cachedDigestLines;\n } else {\n const byKind = new Map<string, number>();\n for (const i of items) {\n const k = coerceKind(i.kind);\n byKind.set(k, (byKind.get(k) ?? 0) + 1);\n }\n const byStatus = new Map<string, number>();\n for (const s of sessions) {\n byStatus.set(s.status, (byStatus.get(s.status) ?? 0) + 1);\n }\n const uniqueSessions = new Set(items.map(i => i.sessionId)).size;\n lines = [];\n lines.push([seg(' Fleet Inbox', { color: 'red', bold: true })]);\n lines.push(singleLine(` ${items.length} pending across ${uniqueSessions} sessions`, { dim: true }));\n lines.push(singleLine(' '));\n lines.push([seg(' By Type', { color: 'cyan', bold: true })]);\n for (const [kind, count] of byKind) {\n lines.push(singleLine(` · ${kind}: ${count}`, { dim: true }));\n }\n lines.push(singleLine(' '));\n lines.push([seg(' Sessions', { color: 'white', bold: true })]);\n for (const [status, count] of byStatus) {\n lines.push(singleLine(` · ${status}: ${count}`, { dim: true }));\n }\n state.cachedDigestLines = lines;\n state.digestCacheKey = cacheKey;\n }\n return buildPanelRows(rect, lines, state.digestScroll, focused, 'red', state.digestRenderedCache);\n}\n\nexport function renderDigestRows(\n rect: Rect,\n state: AppState,\n): string[] {\n const focused = state.focusPane === 'logs';\n const digest = state.digestData;\n const session = state.selectedSession;\n\n if (state.detailMode === 'cross-session-inbox') {\n return renderFleetRollup(rect, state, focused);\n }\n\n if (!digest && !session) {\n return buildEmptyPanelRows(rect, focused, 'cyan', '\\x1b[2mAwaiting digest...\\x1b[0m');\n }\n\n // Combined cache key: digest + flow inputs\n const lastCycle = session?.orchestratorCycles[session.orchestratorCycles.length - 1];\n const agentStatuses = session?.agents.map(a => `${a.id}:${a.status}`).join(',') ?? '';\n const isDone = session?.status === 'completed';\n const cacheKey = [\n JSON.stringify(digest),\n session?.id ?? '',\n session?.status ?? '',\n session?.orchestratorCycles.length ?? 0,\n lastCycle?.completedAt ?? '',\n lastCycle?.agentsSpawned.length ?? 0,\n lastCycle?.nextPrompt?.length ?? 0,\n agentStatuses,\n state.flowExpanded,\n rect.w,\n ].join(':');\n\n let lines: DetailLine[];\n if (cacheKey === state.digestCacheKey && state.cachedDigestLines !== null) {\n lines = state.cachedDigestLines;\n } else {\n lines = [];\n if (isDone && session) {\n lines.push(...buildDoneDigestLines(session, digest, rect.w));\n } else if (digest) {\n lines.push(...buildDigestLines(digest, rect.w));\n }\n if (session) {\n lines.push(singleLine(''));\n lines.push(...buildCycleFlowLines(session, rect.w - 4, state.flowExpanded));\n }\n state.cachedDigestLines = lines;\n state.digestCacheKey = cacheKey;\n }\n\n return buildPanelRows(rect, lines, state.digestScroll, focused, 'cyan', state.digestRenderedCache);\n}\n\n\n","/**\n * Gloam-themed markdown highlighter for goal/strategy/roadmap strips.\n *\n * Pure-JS pass that converts markdown text into `DetailLine[]` ready for\n * `renderLine`. Headings get full-width tinted backgrounds (h1 orange →\n * h6 surface gray) with brighter foregrounds; lists, checkboxes, code,\n * blockquotes, and inline emphasis (bold/italic/code/link/strikethrough)\n * get their own styling.\n *\n * The output is sized to `innerW`: heading lines are padded with bg-painted\n * spaces so the tint fills the full strip width when rendered.\n */\n\nimport stringWidth from 'string-width';\nimport { GLOAM } from './gloam.js';\nimport { cleanMarkdown, stripFrontmatter, type DetailLine, type Seg } from './format.js';\n\n// ─── Heading styles by level ───────────────────────────────────────────────\n\ninterface HeadingStyle {\n /** Heading text foreground (the title itself) */\n textFg: string;\n /** Marker (`#…`) foreground — slightly muted vs. text */\n markerFg: string;\n /** Tinted background painted across the full row */\n bg: string;\n}\n\nconst HEADING_STYLES: HeadingStyle[] = [\n { textFg: GLOAM.bright_orange, markerFg: GLOAM.orange, bg: GLOAM.bg_dim_orange }, // h1\n { textFg: GLOAM.bright_yellow, markerFg: GLOAM.yellow, bg: GLOAM.bg_dim_yellow }, // h2\n { textFg: GLOAM.bright_green, markerFg: GLOAM.green, bg: GLOAM.bg_dim_green }, // h3\n { textFg: GLOAM.bright_blue, markerFg: GLOAM.blue, bg: GLOAM.bg_dim_blue }, // h4\n { textFg: GLOAM.bright_purple, markerFg: GLOAM.purple, bg: GLOAM.bg_dim_purple }, // h5\n { textFg: GLOAM.fg2, markerFg: GLOAM.fg3, bg: GLOAM.bg_bg1 }, // h6\n];\n\n// ─── Display-hazard cleanup ────────────────────────────────────────────────\n// Mirrors `cleanMarkdown`'s emoji-handling without touching markdown syntax.\n\nfunction stripDisplayHazards(s: string): string {\n return s\n .replace(/✅/g, '✓')\n .replace(/❌/g, '✗')\n .replace(/\\p{Emoji_Presentation}/gu, '');\n}\n\n// ─── Inline emphasis tokenizer ─────────────────────────────────────────────\n\ninterface InlineSpan {\n start: number;\n end: number;\n kind: 'bold' | 'italic' | 'code' | 'strike' | 'link';\n /** rendered display text for the span (markers stripped) */\n text: string;\n}\n\nconst INLINE_RE =\n /\\*\\*([^*\\n]+)\\*\\*|__([^_\\n]+)__|\\*([^*\\n]+)\\*|_([^_\\n]+)_|`([^`\\n]+)`|~~([^~\\n]+)~~|\\[([^\\]\\n]+)\\]\\(([^)\\n]+)\\)/g;\n\nfunction tokenizeInline(line: string, baseFg: string, baseStyle?: Partial<Seg>): Seg[] {\n const out: Seg[] = [];\n const baseSeg = (text: string): Seg => ({ text, fg: baseFg, ...baseStyle });\n\n let cursor = 0;\n for (const m of line.matchAll(INLINE_RE)) {\n const idx = m.index!;\n if (idx > cursor) out.push(baseSeg(line.slice(cursor, idx)));\n\n if (m[1] !== undefined) {\n out.push({ text: m[1], fg: GLOAM.fg0, bold: true, bg: baseStyle?.bg });\n } else if (m[2] !== undefined) {\n out.push({ text: m[2], fg: GLOAM.fg0, bold: true, bg: baseStyle?.bg });\n } else if (m[3] !== undefined) {\n out.push({ text: m[3], fg: GLOAM.fg0, italic: true, bg: baseStyle?.bg });\n } else if (m[4] !== undefined) {\n out.push({ text: m[4], fg: GLOAM.fg0, italic: true, bg: baseStyle?.bg });\n } else if (m[5] !== undefined) {\n // Inline code — aqua fg, subtle bg1 tint (skip when inside heading bg)\n out.push({\n text: m[5],\n fg: GLOAM.aqua,\n bg: baseStyle?.bg ?? GLOAM.bg_bg1,\n });\n } else if (m[6] !== undefined) {\n out.push({ text: m[6], fg: GLOAM.fg3, strikethrough: true, bg: baseStyle?.bg });\n } else if (m[7] !== undefined && m[8] !== undefined) {\n out.push({ text: m[7], fg: GLOAM.blue, bold: true, bg: baseStyle?.bg });\n }\n\n cursor = idx + m[0].length;\n }\n if (cursor < line.length) out.push(baseSeg(line.slice(cursor)));\n if (out.length === 0) out.push(baseSeg(''));\n return out;\n}\n\n// ─── Plain-text width (sums Seg.text display widths) ───────────────────────\n\nfunction segsDisplayWidth(segs: Seg[]): number {\n let w = 0;\n for (const s of segs) w += stringWidth(s.text);\n return w;\n}\n\n// ─── Soft-wrap a pre-tokenized line to width ───────────────────────────────\n// Tokenizes input segs into word/space atoms (preserving each char's style),\n// then greedy-packs atoms onto lines. Word boundaries are respected even when\n// they straddle segment boundaries (e.g. \" guard around\" spilling out of a\n// preceding inline-code span). Continuation lines get a plain-space indent.\n\ninterface Atom {\n text: string;\n width: number;\n style: Omit<Seg, 'text'>;\n /** true → atom is a run of spaces (collapsible at line boundaries) */\n space: boolean;\n}\n\nfunction segsToAtoms(segs: Seg[]): Atom[] {\n const atoms: Atom[] = [];\n for (const s of segs) {\n if (!s.text) continue;\n const { text, ...style } = s;\n // Split on whitespace boundaries: every run of spaces becomes a `space`\n // atom; every non-space run becomes a word atom.\n const re = /(\\s+|\\S+)/g;\n for (const m of text.matchAll(re)) {\n const piece = m[0];\n atoms.push({\n text: piece,\n width: stringWidth(piece),\n style,\n space: /^\\s+$/.test(piece),\n });\n }\n }\n return atoms;\n}\n\nfunction wrapSegs(segs: Seg[], width: number, contIndent: string): DetailLine[] {\n if (width <= 0) return [segs];\n const atoms = segsToAtoms(segs);\n if (atoms.length === 0) return [[{ text: '' }]];\n\n const lines: DetailLine[] = [];\n let current: Seg[] = [];\n let currentWidth = 0;\n\n const pushAtom = (a: Atom) => {\n current.push({ ...a.style, text: a.text });\n currentWidth += a.width;\n };\n const flushLine = () => {\n // Trim trailing pure-space segs (cosmetic: tinted/colored trailing space\n // can leak across the right border when bg-painted, so prefer cleaner\n // breaks). Heading lines never reach here — they bypass wrapping.\n while (current.length > 0) {\n const last = current[current.length - 1]!;\n if (/^\\s+$/.test(last.text) && !last.bg) {\n currentWidth -= stringWidth(last.text);\n current.pop();\n } else break;\n }\n lines.push(current.length > 0 ? current : [{ text: '' }]);\n current = [];\n currentWidth = 0;\n };\n\n for (let i = 0; i < atoms.length; i++) {\n const atom = atoms[i]!;\n\n if (atom.space) {\n // Spaces that overflow the right edge are dropped at the wrap boundary\n // — flushLine() will trim non-bg trailing whitespace anyway. Leading\n // spaces (line-start indent on the first body line) are preserved.\n if (currentWidth + atom.width <= width) pushAtom(atom);\n continue;\n }\n\n // Word atom\n if (atom.width > width) {\n // Word wider than full line → hard-break it on character boundaries.\n let remaining = atom.text;\n while (remaining.length > 0) {\n const spaceLeft = width - currentWidth;\n if (spaceLeft <= 0) {\n flushLine();\n if (contIndent) {\n current.push({ text: contIndent });\n currentWidth = stringWidth(contIndent);\n }\n continue;\n }\n let cut = 0;\n let cutW = 0;\n for (let k = 0; k < remaining.length; k++) {\n const cw = stringWidth(remaining[k]!);\n if (cutW + cw > spaceLeft) break;\n cutW += cw;\n cut = k + 1;\n }\n if (cut === 0) {\n flushLine();\n if (contIndent) {\n current.push({ text: contIndent });\n currentWidth = stringWidth(contIndent);\n }\n continue;\n }\n current.push({ ...atom.style, text: remaining.slice(0, cut) });\n currentWidth += cutW;\n remaining = remaining.slice(cut);\n if (remaining.length > 0) {\n flushLine();\n if (contIndent) {\n current.push({ text: contIndent });\n currentWidth = stringWidth(contIndent);\n }\n }\n }\n continue;\n }\n\n if (currentWidth + atom.width > width) {\n flushLine();\n if (contIndent) {\n current.push({ text: contIndent });\n currentWidth = stringWidth(contIndent);\n }\n }\n pushAtom(atom);\n }\n flushLine();\n return lines.length > 0 ? lines : [[{ text: '' }]];\n}\n\n// ─── Heading rendering — full-width bg-padded ──────────────────────────────\n\nfunction buildHeadingLine(\n level: number,\n rawText: string,\n innerW: number,\n): DetailLine {\n const style = HEADING_STYLES[Math.min(level - 1, HEADING_STYLES.length - 1)]!;\n const cleanedText = stripDisplayHazards(rawText).trim();\n const marker = '#'.repeat(level);\n const prefix = ' '; // matches the standard 2-space content margin\n const sep = ' ';\n\n const headerSegs: Seg[] = [\n { text: prefix, bg: style.bg },\n { text: marker, fg: style.markerFg, bg: style.bg, bold: true },\n { text: sep, bg: style.bg },\n { text: cleanedText, fg: style.textFg, bg: style.bg, bold: true },\n ];\n const used = segsDisplayWidth(headerSegs);\n const padW = Math.max(0, innerW - used);\n if (padW > 0) {\n headerSegs.push({ text: ' '.repeat(padW), bg: style.bg });\n }\n return headerSegs;\n}\n\n// ─── Bullet/numbered list ──────────────────────────────────────────────────\n\nfunction buildListLine(\n marker: string,\n body: string,\n innerW: number,\n prefixIndent: string,\n markerFg: string,\n): DetailLine[] {\n const indent = `${prefixIndent} `; // continuation aligns under text\n const head: Seg[] = [\n { text: prefixIndent, fg: GLOAM.fg2 },\n { text: marker, fg: markerFg, bold: true },\n { text: ' ', fg: GLOAM.fg2 },\n ];\n const headW = segsDisplayWidth(head);\n const bodySegs = tokenizeInline(stripDisplayHazards(body), GLOAM.fg1);\n const wrapped = wrapSegs([...head, ...bodySegs], innerW, indent);\n // wrapSegs treats the indent+head as part of segs — but we want first-line\n // to start with our colored head and continuations to use plain indent.\n // To keep things simple, we already wrap with contIndent set.\n return wrapped;\n // Note: contIndent is plain (no fg) to keep continuation rows readable;\n // wrapSegs prepends a single indent seg for each new line — good enough.\n}\n\n// ─── Checkbox ──────────────────────────────────────────────────────────────\n\nfunction buildCheckboxLine(\n checked: boolean,\n body: string,\n innerW: number,\n): DetailLine[] {\n const icon = checked ? '☑' : '☐';\n const iconFg = checked ? GLOAM.green : GLOAM.fg4;\n const head: Seg[] = [\n { text: ' ', fg: GLOAM.fg2 },\n { text: icon, fg: iconFg, bold: true },\n { text: ' ', fg: GLOAM.fg2 },\n ];\n const bodyFg = checked ? GLOAM.fg3 : GLOAM.fg1;\n const bodyStyle = checked ? { strikethrough: true } : {};\n const bodySegs = tokenizeInline(stripDisplayHazards(body), bodyFg, bodyStyle);\n return wrapSegs([...head, ...bodySegs], innerW, ' ');\n}\n\n// ─── Blockquote ────────────────────────────────────────────────────────────\n\nfunction buildQuoteLine(body: string, innerW: number): DetailLine[] {\n const head: Seg[] = [\n { text: ' ', fg: GLOAM.fg2 },\n { text: '▎ ', fg: GLOAM.fg3 },\n ];\n const bodySegs = tokenizeInline(stripDisplayHazards(body), GLOAM.fg2, { italic: true });\n return wrapSegs([...head, ...bodySegs], innerW, ' ');\n}\n\n// ─── Horizontal rule ───────────────────────────────────────────────────────\n\nfunction buildHrLine(innerW: number): DetailLine {\n const w = Math.max(2, innerW - 4);\n return [\n { text: ' ', fg: GLOAM.fg4 },\n { text: '─'.repeat(w), fg: GLOAM.fg4 },\n ];\n}\n\n// ─── Code block content ────────────────────────────────────────────────────\n\nfunction buildCodeFenceLine(fence: string, innerW: number): DetailLine {\n return [\n { text: ' ', fg: GLOAM.fg4 },\n {\n text: fence + ' '.repeat(Math.max(0, innerW - 2 - stringWidth(fence))),\n fg: GLOAM.fg4,\n bg: GLOAM.bg_bg1,\n },\n ];\n}\n\nfunction buildCodeLine(content: string, innerW: number): DetailLine {\n const cleaned = stripDisplayHazards(content);\n const cw = stringWidth(cleaned);\n const padW = Math.max(0, innerW - 2 - cw);\n return [\n { text: ' ', bg: GLOAM.bg_bg1 },\n { text: cleaned, fg: GLOAM.aqua, bg: GLOAM.bg_bg1 },\n ...(padW > 0 ? [{ text: ' '.repeat(padW), bg: GLOAM.bg_bg1 }] : []),\n ];\n}\n\n// ─── Plain paragraph ───────────────────────────────────────────────────────\n\nfunction buildParagraphLines(body: string, innerW: number): DetailLine[] {\n const head: Seg[] = [{ text: ' ', fg: GLOAM.fg1 }];\n const bodySegs = tokenizeInline(stripDisplayHazards(body), GLOAM.fg1);\n return wrapSegs([...head, ...bodySegs], innerW, ' ');\n}\n\n// ─── GFM tables ────────────────────────────────────────────────────────────\n\ntype TableAlign = 'left' | 'center' | 'right';\n\nfunction parseTableCells(line: string): string[] {\n let s = line.trim();\n if (s.startsWith('|')) s = s.slice(1);\n if (s.endsWith('|') && !s.endsWith('\\\\|')) s = s.slice(0, -1);\n const cells: string[] = [];\n let cur = '';\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]!;\n if (ch === '\\\\' && s[i + 1] === '|') {\n cur += '|';\n i++;\n } else if (ch === '|') {\n cells.push(cur.trim());\n cur = '';\n } else {\n cur += ch;\n }\n }\n cells.push(cur.trim());\n return cells;\n}\n\nfunction parseTableSeparator(line: string): TableAlign[] | null {\n if (!line.includes('|') && !/^[\\s:|+-]+$/.test(line)) return null;\n const cells = parseTableCells(line);\n if (cells.length === 0) return null;\n const aligns: TableAlign[] = [];\n for (const c of cells) {\n const m = c.match(/^(:?)\\s*-{2,}\\s*(:?)$/);\n if (!m) return null;\n if (m[1] === ':' && m[2] === ':') aligns.push('center');\n else if (m[2] === ':') aligns.push('right');\n else aligns.push('left');\n }\n return aligns;\n}\n\nfunction padCell(text: string, width: number, align: TableAlign): string {\n const w = stringWidth(text);\n const pad = Math.max(0, width - w);\n let left = 0;\n let right = 0;\n if (align === 'right') left = pad;\n else if (align === 'center') {\n left = Math.floor(pad / 2);\n right = pad - left;\n } else right = pad;\n return ' '.repeat(left) + text + ' '.repeat(right);\n}\n\n/**\n * Soft-wrap cell text to `width` columns, returning each visual line padded\n * (and aligned) to exactly `width` display columns. Words longer than the\n * column hard-break on character boundaries.\n */\nfunction wrapCell(text: string, width: number, align: TableAlign): string[] {\n if (width <= 0) return [''];\n const cleaned = cleanMarkdown(text);\n if (cleaned === '') return [padCell('', width, align)];\n\n const out: string[] = [];\n let cur = '';\n let curW = 0;\n const flush = () => {\n out.push(padCell(cur.replace(/\\s+$/, ''), width, align));\n cur = '';\n curW = 0;\n };\n\n for (const piece of cleaned.match(/\\s+|\\S+/g) ?? []) {\n const isSpace = /^\\s+$/.test(piece);\n const pw = stringWidth(piece);\n\n if (isSpace) {\n if (curW === 0) continue; // drop leading whitespace on a wrapped line\n if (curW + pw > width) flush();\n else {\n cur += piece;\n curW += pw;\n }\n continue;\n }\n\n if (curW + pw <= width) {\n cur += piece;\n curW += pw;\n continue;\n }\n\n if (curW > 0) flush();\n\n if (pw > width) {\n // Hard-break a word wider than the column.\n let rem = piece;\n while (rem.length > 0) {\n let cut = 0;\n let cutW = 0;\n for (let k = 0; k < rem.length; k++) {\n const cw = stringWidth(rem[k]!);\n if (cutW + cw > width) break;\n cutW += cw;\n cut = k + 1;\n }\n if (cut === 0) cut = 1;\n const slice = rem.slice(0, cut);\n if (cut === rem.length) {\n cur = slice;\n curW = stringWidth(slice);\n } else {\n out.push(padCell(slice, width, align));\n }\n rem = rem.slice(cut);\n }\n continue;\n }\n\n cur = piece;\n curW = pw;\n }\n\n if (curW > 0 || out.length === 0) flush();\n return out;\n}\n\nfunction buildTableLines(\n headers: string[],\n alignsIn: TableAlign[],\n rowsIn: string[][],\n innerW: number,\n): DetailLine[] {\n const ncols = headers.length;\n if (ncols === 0) return [];\n\n // Normalize aligns and rows to exactly ncols entries so downstream indexing\n // is total. Missing entries default to left-align / empty string.\n const aligns: TableAlign[] = [];\n for (let i = 0; i < ncols; i++) {\n const a = alignsIn[i];\n aligns.push(a === undefined ? 'left' : a);\n }\n\n const rows: string[][] = rowsIn.map((r) => {\n const out: string[] = [];\n for (let i = 0; i < ncols; i++) {\n const c = r[i];\n out.push(c === undefined ? '' : c);\n }\n return out;\n });\n\n // Natural widths from cleaned cell text\n const naturalW: number[] = new Array(ncols).fill(0);\n const measure = (cells: string[]) => {\n for (let i = 0; i < ncols; i++) {\n const w = stringWidth(cleanMarkdown(cells[i]!));\n if (w > naturalW[i]!) naturalW[i] = w;\n }\n };\n measure(headers);\n for (const r of rows) measure(r);\n\n // Layout: 2-char margin + left border + (cell + right-border) per column.\n // Each cell is \" <content> \" (2 chars padding) so per-column overhead is 3\n // (one separator + two pad spaces). Plus 1 for the leading border.\n const margin = 2;\n const overhead = 1 + ncols * 3;\n const available = innerW - margin - overhead;\n const minColW = 3;\n\n if (available < ncols * minColW) {\n return [[{ text: ' (table too narrow to render)', fg: GLOAM.fg4, italic: true }]];\n }\n\n const colW: number[] = [...naturalW];\n for (let i = 0; i < ncols; i++) if (colW[i]! < minColW) colW[i] = minColW;\n let total = colW.reduce((a, b) => a + b, 0);\n\n if (total > available) {\n // Shrink the widest column repeatedly until it fits.\n while (total > available) {\n let widest = 0;\n for (let i = 1; i < ncols; i++) if (colW[i]! > colW[widest]!) widest = i;\n if (colW[widest]! <= minColW) break;\n colW[widest]!--;\n total--;\n }\n } else if (total < available) {\n // Grow the widest column to absorb the slack so the right border aligns.\n while (total < available) {\n let widest = 0;\n for (let i = 1; i < ncols; i++) if (colW[i]! > colW[widest]!) widest = i;\n colW[widest]!++;\n total++;\n }\n }\n\n const borderFg = GLOAM.fg3;\n const headerFg = GLOAM.fg0;\n const headerBg = GLOAM.bg_bg1;\n const cellFg = GLOAM.fg1;\n const marginText = ' ';\n\n const buildBorder = (left: string, mid: string, right: string): DetailLine => {\n let s = left;\n for (let i = 0; i < ncols; i++) {\n s += '─'.repeat(colW[i]! + 2);\n s += i === ncols - 1 ? right : mid;\n }\n return [{ text: marginText }, { text: s, fg: borderFg }];\n };\n\n const buildDataRow = (cells: string[], header: boolean): DetailLine[] => {\n const wrapped: string[][] = [];\n for (let i = 0; i < ncols; i++) {\n const cell = cells[i];\n wrapped.push(wrapCell(cell === undefined ? '' : cell, colW[i]!, aligns[i]!));\n }\n let height = 1;\n for (const w of wrapped) if (w.length > height) height = w.length;\n // Pad shorter columns with blank lines so the row has a uniform height.\n for (let i = 0; i < ncols; i++) {\n const blank = ' '.repeat(colW[i]!);\n while (wrapped[i]!.length < height) wrapped[i]!.push(blank);\n }\n\n const out: DetailLine[] = [];\n for (let row = 0; row < height; row++) {\n const segs: Seg[] = [\n { text: marginText },\n { text: '│', fg: borderFg },\n ];\n for (let i = 0; i < ncols; i++) {\n const padded = ' ' + wrapped[i]![row]! + ' ';\n segs.push(\n header\n ? { text: padded, fg: headerFg, bg: headerBg, bold: true }\n : { text: padded, fg: cellFg },\n );\n segs.push({ text: '│', fg: borderFg });\n }\n out.push(segs);\n }\n return out;\n };\n\n const out: DetailLine[] = [];\n out.push(buildBorder('┌', '┬', '┐'));\n for (const dl of buildDataRow(headers, true)) out.push(dl);\n out.push(buildBorder('├', '┼', '┤'));\n for (const r of rows) for (const dl of buildDataRow(r, false)) out.push(dl);\n out.push(buildBorder('└', '┴', '┘'));\n return out;\n}\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/**\n * Convert a markdown document into a stream of styled DetailLine[] sized to\n * `innerW` columns. Trailing/leading blank lines are normalized; YAML\n * frontmatter is stripped via the shared helper.\n */\nexport function buildHighlightedMarkdownLines(\n content: string,\n innerW: number,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const clean = stripFrontmatter(content);\n if (!clean.trim()) {\n lines.push([{ text: ' (empty)', fg: GLOAM.fg4, italic: true }]);\n return lines;\n }\n\n const rawLines = clean.split('\\n');\n let inCodeBlock = false;\n\n for (let li = 0; li < rawLines.length; li++) {\n const raw = rawLines[li]!;\n const trimmed = raw.trim();\n\n // Code fence — toggles block state, rendered as a dim line\n if (/^```/.test(trimmed)) {\n inCodeBlock = !inCodeBlock;\n lines.push(buildCodeFenceLine(trimmed, innerW));\n continue;\n }\n\n if (inCodeBlock) {\n lines.push(buildCodeLine(raw.replace(/\\t/g, ' '), innerW));\n continue;\n }\n\n // GFM table: current line has a pipe and next line is an alignment row.\n if (trimmed.includes('|') && li + 1 < rawLines.length) {\n const sepLine = rawLines[li + 1]!;\n const sepAligns = parseTableSeparator(sepLine);\n if (sepAligns) {\n const headers = parseTableCells(raw);\n const tRows: string[][] = [];\n let j = li + 2;\n while (j < rawLines.length) {\n const next = rawLines[j]!;\n if (next.trim() === '') break;\n if (!next.includes('|')) break;\n if (/^```/.test(next.trim())) break;\n tRows.push(parseTableCells(next));\n j++;\n }\n for (const tl of buildTableLines(headers, sepAligns, tRows, innerW)) lines.push(tl);\n li = j - 1; // resume after consumed rows; loop ++ moves past them\n continue;\n }\n }\n\n // Empty line\n if (trimmed === '') {\n // Collapse multi-blanks into a single blank\n const last = lines[lines.length - 1];\n if (last && last.length === 1 && last[0]!.text === '') continue;\n lines.push([{ text: '' }]);\n continue;\n }\n\n // Frontmatter delimiter inside body (already stripped above, but defensive)\n if (trimmed === '---') {\n lines.push(buildHrLine(innerW));\n continue;\n }\n\n // Heading\n const headMatch = raw.match(/^(\\s*)(#{1,6})\\s+(.+?)\\s*#*\\s*$/);\n if (headMatch) {\n const level = headMatch[2]!.length;\n lines.push(buildHeadingLine(level, headMatch[3]!, innerW));\n continue;\n }\n\n // Horizontal rule\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(raw)) {\n lines.push(buildHrLine(innerW));\n continue;\n }\n\n // Checkbox (must come before bullet match)\n const cbMatch = raw.match(/^\\s*[-*+]\\s+\\[( |x|X)\\]\\s+(.+)$/);\n if (cbMatch) {\n const checked = cbMatch[1] !== ' ';\n for (const wl of buildCheckboxLine(checked, cbMatch[2]!, innerW)) lines.push(wl);\n continue;\n }\n\n // Numbered list\n const numMatch = raw.match(/^(\\s*)(\\d+)([.)])\\s+(.+)$/);\n if (numMatch) {\n const indent = numMatch[1]!.length > 0 ? ' ' : ' ';\n const marker = `${numMatch[2]}${numMatch[3]}`;\n for (const wl of buildListLine(marker, numMatch[4]!, innerW, indent, GLOAM.purple)) {\n lines.push(wl);\n }\n continue;\n }\n\n // Bullet list\n const bulMatch = raw.match(/^(\\s*)([-*+])\\s+(.+)$/);\n if (bulMatch) {\n const depth = Math.floor(bulMatch[1]!.length / 2);\n const indent = ' ' + ' '.repeat(Math.min(depth, 4));\n const bullet = depth === 0 ? '·' : '◦';\n for (const wl of buildListLine(bullet, bulMatch[3]!, innerW, indent, GLOAM.orange)) {\n lines.push(wl);\n }\n continue;\n }\n\n // Blockquote\n const qMatch = raw.match(/^\\s*>\\s?(.*)$/);\n if (qMatch) {\n for (const wl of buildQuoteLine(qMatch[1]!, innerW)) lines.push(wl);\n continue;\n }\n\n // Paragraph\n for (const wl of buildParagraphLines(trimmed, innerW)) lines.push(wl);\n }\n\n // Trim trailing blank\n while (lines.length > 0) {\n const last = lines[lines.length - 1]!;\n if (last.length === 1 && last[0]!.text === '') lines.pop();\n else break;\n }\n\n return lines;\n}\n","/**\n * Gloam palette — true-color ANSI SGR codes mirroring the Neovim gloam theme.\n *\n * Each constant is a partial SGR sequence (no leading `\\x1b[`, no trailing `m`)\n * suitable for `Seg.fg` and `Seg.bg` fields. Foreground codes use the `38;2;…`\n * 24-bit form; background codes use `48;2;…`.\n *\n * Source palette: ~/.config/nvim/lua/gloam/palette.lua\n */\n\nfunction fg(r: number, g: number, b: number): string {\n return `38;2;${r};${g};${b}`;\n}\n\nfunction bg(r: number, g: number, b: number): string {\n return `48;2;${r};${g};${b}`;\n}\n\nexport const GLOAM = {\n // Foregrounds — warm off-whites\n fg0: fg(226, 217, 198), // brightest\n fg1: fg(212, 203, 184), // primary\n fg2: fg(176, 168, 152), // secondary\n fg3: fg(135, 127, 111), // tertiary (comments, quotes)\n fg4: fg(94, 88, 78), // quaternary (line numbers, concealed)\n\n // Accents\n red: fg(212, 116, 102),\n orange: fg(216, 151, 104),\n yellow: fg(212, 173, 106),\n green: fg(169, 177, 110),\n aqua: fg(130, 173, 138),\n blue: fg(124, 168, 160),\n purple: fg(196, 138, 158),\n\n // Bright accents — heading text, emphasis\n bright_red: fg(232, 138, 126),\n bright_orange: fg(236, 173, 128),\n bright_yellow: fg(232, 196, 132),\n bright_green: fg(188, 197, 126),\n bright_blue: fg(144, 190, 182),\n bright_purple: fg(216, 160, 180),\n\n // Dim backgrounds — heading/code-block tints\n bg_dim_red: bg(58, 28, 24),\n bg_dim_orange: bg(58, 40, 18),\n bg_dim_yellow: bg(51, 46, 18),\n bg_dim_green: bg(31, 48, 24),\n bg_dim_aqua: bg(20, 46, 36),\n bg_dim_blue: bg(21, 40, 56),\n bg_dim_purple: bg(50, 24, 40),\n\n // Surface backgrounds\n bg_bg1: bg(37, 38, 41), // cursorline / inline-code tint\n bg_bg2: bg(45, 47, 51), // float/popup\n bg_sel_yellow: bg(61, 50, 37), // active selection\n} as const;\n\nexport type GloamKey = keyof typeof GLOAM;\n","/**\n * Stacked g/s/r detail panel (3b).\n *\n * Renders goal/strategy/roadmap content as three vertically-stacked strips,\n * or a single cycle-log strip when state.detailMode === 'cycle-log'.\n *\n * Extension point (3d): when cursor is on the virtual `Needs You` tree node,\n * extend `state.detailMode` to `'gsr' | 'cycle-log' | 'inbox'` and dispatch\n * to an inbox view from `renderStackedDetailRows`.\n *\n * Extension point (deferred Q5): wire [/] in `renderCycleLogMode` to walk\n * state.logsCycles by index instead of always showing the latest.\n */\n\nimport {\n buildEmptyPanelRows,\n buildPanelRows,\n clipAnsi,\n colorToSGR,\n renderLine,\n type Rect,\n} from '../render.js';\nimport type { AppState, ThrottledScroll } from '../state.js';\nimport type { DetailContext } from './detail.js';\nimport { buildLogsLines } from './detail.js';\nimport {\n type DetailLine,\n} from '../lib/format.js';\nimport { buildHighlightedMarkdownLines } from '../lib/markdown-highlight.js';\n\nconst HEADERS_ACTIVE = {\n top: 'GOAL',\n middle: 'STRATEGY',\n bottom: 'ROADMAP',\n};\n\nconst HEADERS_DONE = {\n top: 'GOAL',\n middle: 'COMPLETION',\n bottom: 'SUMMARY',\n};\n\nexport function renderStackedDetailRows(\n rect: Rect,\n state: AppState,\n detailCtx: DetailContext,\n): string[] {\n const focused = state.focusPane === 'detail';\n const { w, h } = rect;\n const innerW = w - 4;\n\n const cursorNode = detailCtx.nodes[state.cursorIndex];\n if (!cursorNode || !state.selectedSession || cursorNode.sessionId !== state.selectedSession.id) {\n return buildEmptyPanelRows(rect, focused, 'gray', '\\x1b[2mSelect a session\\x1b[0m');\n }\n\n if (state.detailMode === 'cycle-log') {\n return renderCycleLogMode(rect, state, focused);\n }\n\n const session = state.selectedSession;\n const isDone = session.status === 'completed';\n const headers = isDone ? HEADERS_DONE : HEADERS_ACTIVE;\n\n const middleContent = isDone\n ? buildCompletionContent(session)\n : state.strategyContent;\n const bottomContent = isDone\n ? pickSummaryContent(state)\n : state.planContent;\n\n const cacheKey = [\n cursorNode.sessionId,\n rect.w,\n isDone ? 'done' : 'active',\n state.goalContent.length,\n middleContent.length,\n bottomContent.length,\n ].join(':');\n\n let lines = state.cachedStackedLines;\n if (cacheKey !== state.stackedCacheKey || lines === null) {\n lines = {\n goal: buildSectionLines(state.goalContent, innerW),\n strategy: buildSectionLines(middleContent, innerW),\n roadmap: buildSectionLines(bottomContent, innerW),\n cycleLog: [],\n };\n state.cachedStackedLines = lines;\n state.stackedCacheKey = cacheKey;\n }\n\n const heights = allocateStripHeights(h, lines.goal.length, lines.strategy.length, lines.roadmap.length);\n\n const rows = new Array<string>(h);\n const focusColor = focused ? 'cyan' : 'gray';\n const sgr = `\\x1b[${colorToSGR(focusColor)}m`;\n const reset = '\\x1b[0m';\n rows[0] = sgr + '╭' + '─'.repeat(w - 2) + '╮' + reset;\n rows[h - 1] = sgr + '╰' + '─'.repeat(w - 2) + '╯' + reset;\n\n let cursor = 1;\n cursor = paintStrip(rows, cursor, w, sgr, reset, headers.top, lines.goal,\n state.goalScroll, heights.goalHeight, state.focusedStrip === 'goal' && focused);\n rows[cursor++] = sgr + '├' + '─'.repeat(w - 2) + '┤' + reset;\n cursor = paintStrip(rows, cursor, w, sgr, reset, headers.middle, lines.strategy,\n state.strategyScroll, heights.stratHeight, state.focusedStrip === 'strategy' && focused);\n rows[cursor++] = sgr + '├' + '─'.repeat(w - 2) + '┤' + reset;\n paintStrip(rows, cursor, w, sgr, reset, headers.bottom, lines.roadmap,\n state.roadmapScroll, heights.roadHeight, state.focusedStrip === 'roadmap' && focused);\n\n return rows;\n}\n\nfunction buildCompletionContent(session: import('../../shared/types.js').Session): string {\n const parts: string[] = [];\n if (session.completedAt) {\n parts.push(`*completed ${formatTimestamp(session.completedAt)}*`);\n parts.push('');\n }\n if (session.completionReport && session.completionReport.trim()) {\n parts.push(session.completionReport.trim());\n } else {\n parts.push('_No completion report written._');\n }\n return parts.join('\\n');\n}\n\nfunction pickSummaryContent(state: AppState): string {\n if (state.completionSummaryContent.trim()) return state.completionSummaryContent;\n if (state.logsCycles.length > 0) {\n const last = state.logsCycles[state.logsCycles.length - 1]!;\n return `# Cycle ${last.cycle} log\\n\\n${last.content}`;\n }\n if (state.strategyContent.trim()) return state.strategyContent;\n return '_No completion artifacts. Try expanding context/ in the tree for raw files._';\n}\n\nfunction formatTimestamp(iso: string): string {\n try {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return iso;\n return d.toLocaleString();\n } catch {\n return iso;\n }\n}\n\n// --- helpers ---\n\nfunction buildSectionLines(content: string, innerW: number): DetailLine[] {\n return buildHighlightedMarkdownLines(content, innerW);\n}\n\nfunction allocateStripHeights(rectH: number, gN: number, sN: number, _rN: number) {\n const innerH = rectH - 2;\n const stripsAvail = innerH - 2; // two separator rows\n const goalCap = Math.floor(stripsAvail * 0.20);\n const stratCap = Math.floor(stripsAvail * 0.40);\n const roadCap = stripsAvail - goalCap - stratCap;\n const goalNeed = Math.min(gN + 1, goalCap);\n const stratNeed = Math.min(sN + 1, stratCap);\n const slack = (goalCap - goalNeed) + (stratCap - stratNeed);\n return {\n goalHeight: Math.max(2, goalNeed),\n stratHeight: Math.max(2, stratNeed),\n roadHeight: Math.max(2, roadCap + slack),\n };\n}\n\nfunction paintStrip(\n rows: string[], startRow: number, w: number, sgr: string, reset: string,\n label: string,\n lines: DetailLine[], scroll: ThrottledScroll, height: number, focused: boolean,\n): number {\n const innerW = w - 4;\n const borderL = sgr + '│' + reset + ' ';\n const borderR = ' ' + sgr + '│' + reset;\n\n const headerSeg = `\\x1b[${colorToSGR('yellow')};1m ▎ ${label}\\x1b[0m`;\n const headerClipped = clipAnsi(headerSeg + (focused ? ' ◀' : ''), innerW);\n rows[startRow] = borderL + headerClipped + borderR;\n\n const contentH = height - 1;\n const hasOverflow = lines.length > contentH;\n const viewableH = hasOverflow ? contentH - 1 : contentH;\n const maxScroll = Math.max(0, lines.length - viewableH);\n scroll.setMax(maxScroll);\n const effOffset = scroll.offset;\n\n for (let i = 0; i < viewableH; i++) {\n const li = effOffset + i;\n const ansi = li < lines.length ? renderLine(lines[li]!) : '';\n rows[startRow + 1 + i] = borderL + clipAnsi(ansi, innerW) + borderR;\n }\n if (hasOverflow) {\n const pct = maxScroll > 0 ? Math.round((effOffset / maxScroll) * 100) : 100;\n const indicator = `\\x1b[2m ↕ ${pct}% · ${lines.length} lines\\x1b[0m`;\n rows[startRow + 1 + viewableH] = borderL + clipAnsi(indicator, innerW) + borderR;\n }\n return startRow + height;\n}\n\nfunction renderCycleLogMode(rect: Rect, state: AppState, focused: boolean): string[] {\n // Extension point (deferred Q5): wire [/] to walk state.logsCycles by index instead of latest.\n if (state.logsCycles.length === 0) {\n return buildEmptyPanelRows(rect, focused, 'gray', '\\x1b[2mNo cycle logs yet\\x1b[0m');\n }\n const cacheKey = `cycleLog:${state.logsCycles.length}:${rect.w}`;\n let lines: DetailLine[];\n if (cacheKey === state.stackedCacheKey && state.cachedStackedLines !== null) {\n lines = state.cachedStackedLines.cycleLog;\n } else {\n lines = buildLogsLines(state.logsCycles, rect.w);\n const existing = state.cachedStackedLines ?? { goal: [], strategy: [], roadmap: [], cycleLog: [] };\n state.cachedStackedLines = { ...existing, cycleLog: lines };\n state.stackedCacheKey = cacheKey;\n }\n return buildPanelRows(rect, lines, state.detailScroll, focused, 'cyan', state.stackedRenderedCache);\n}\n","import { writeClipped, type FrameBuffer } from '../render.js';\nimport { ansiBold, ansiDim } from '../lib/format.js';\nimport type { AppState } from '../state.js';\nimport type { TreeNodeType } from '../types/tree.js';\n\n// ─── Status Line ──────────────────────────────────────────────────────────────\n\nconst B = ansiBold;\nconst D = ansiDim;\nconst SEP = D('│ ');\n\nexport function renderStatusLine(\n buf: FrameBuffer,\n y: number,\n state: AppState,\n cursorNodeType: TreeNodeType | undefined,\n): void {\n const { mode, focusPane, notification, error } = state;\n\n if (mode === 'report-detail') return;\n\n let content: string;\n\n // Notifications/errors take over the status line transiently\n if (notification !== null) {\n const icon = /error|failed/i.test(notification)\n ? '✕'\n : /success|created|killed|sent|copied|deleted/i.test(notification)\n ? '✓'\n : 'ℹ';\n content = `\\x1b[1;33m${icon} ${notification}\\x1b[0m`;\n } else if (error !== null) {\n content = `\\x1b[31m⚠ ${error}\\x1b[0m`;\n } else if (mode === 'search') {\n const cursor = `\\x1b[7m \\x1b[0m`;\n content = `\\x1b[1;34m/\\x1b[0m${state.searchText}${cursor}` + D(' enter to apply · esc to clear');\n } else if (mode === 'leader') {\n content = `\\x1b[1;35mLEADER\\x1b[0m` + D(' [c]opy [o]pen [a]gent [S]ession [g]o or [s]cycle [h]ome [n]ew [m]sg [t]status [l]picker [x]kill [/]search [?]help [esc] cancel');\n } else if (mode === 'copy-menu') {\n content = `\\x1b[1;36mCOPY\\x1b[0m` + D(' [p]ath [i]d [c] context [l]ogs [r]eport [a]gent ID [esc] cancel');\n } else if (mode === 'open-menu') {\n content = `\\x1b[1;32mOPEN\\x1b[0m` + D(' [g]oal [r]oadmap [s]trategy [l]ogs [d]ir [R]eport [c]scratch [e]dit context [esc] cancel');\n } else if (mode === 'agent-menu') {\n content = `\\x1b[1;34mAGENT\\x1b[0m` + D(' [s]pawn [m]sg [r]estart [R]erun [j]ump [o]pen-claude [t]ail [k]ill [e]xplore [d]ebug [esc] cancel');\n } else if (mode === 'session-menu') {\n content = `\\x1b[1;31mSESSION\\x1b[0m` + D(' [n]ew [r]esume [c]ontinue [b]ollback [k]ill [d]elete [e]xport [w]indow [C]lone [i]history [esc] cancel');\n } else if (mode === 'go-menu') {\n content = `\\x1b[1;33mGO\\x1b[0m` + D(' [w]indow [p]ane [s]ession [n]ext [r]econnect [esc] cancel');\n } else if (mode === 'help') {\n content = `\\x1b[1;33mHELP\\x1b[0m` + D(' [esc] or [?] to dismiss');\n } else if (focusPane === 'logs' || focusPane === 'detail') {\n content =\n B('[jk/↑↓]') + D(' scroll ') +\n B('[h/←/tab]') + D(' back ') +\n B('[t]') + D('oggle view ') +\n B('[F]') + D('low ± ') +\n SEP +\n B('[m]') + D('sg ') +\n B('[g]') + D('oal ') +\n B('[n]') + D('ew ') +\n B('[p]') + D('lan ') +\n B('[w]') + D('indow ') +\n B('[R]') + D('esume ') +\n B('[q]') + D('uit');\n } else if (cursorNodeType === 'needs-you-virtual') {\n content =\n B('[enter]') + D(' open ask ') +\n B('[esc]') + D(' back ') +\n SEP +\n B('[q]') + D('uit');\n } else {\n // tree focused\n let contextFilePart = '';\n if (cursorNodeType === 'context-file') {\n contextFilePart = B('[e]') + D('dit ') + B('[⏎]') + D(' open ');\n }\n content =\n contextFilePart +\n B('[enter]') + D(' select ') +\n B('[m]') + D('essage ') +\n B('[n]') + D('ew ') +\n B('[w]') + D(' tmux ') +\n SEP +\n B('[q]') + D('uit');\n }\n\n writeClipped(buf, 1, y, content, buf.width - 2);\n}\n","import { buildPanelRows, buildEmptyPanelRows, type Rect } from '../render.js';\nimport type { AppState } from '../state.js';\nimport {\n seg, singleLine, formatTimeAgo, truncate, type DetailLine,\n} from '../lib/format.js';\nimport { coerceKind, type AggregateInboxItem } from '../../shared/inbox-types.js';\n\nconst KIND_ICON: Record<string, string> = {\n notify: '✉',\n validation: '✓',\n decision: '◆',\n context: '✎',\n error: '⚠',\n};\nconst KIND_COLOR: Record<string, string> = {\n notify: 'gray',\n validation: 'cyan',\n decision: 'cyan',\n context: 'cyan',\n error: 'red',\n};\n\nfunction buildInboxLines(items: AggregateInboxItem[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n if (items.length === 0) {\n lines.push(singleLine(' No pending asks across the fleet', { dim: true, italic: true }));\n return lines;\n }\n lines.push(singleLine(` ${items.length} pending`, { bold: true }));\n lines.push(singleLine(' '));\n const contentWidth = width - 4;\n for (const item of items) {\n const kindKey = coerceKind(item.kind);\n const icon = kindKey in KIND_ICON ? KIND_ICON[kindKey]! : '·';\n const iconColor = kindKey in KIND_COLOR ? KIND_COLOR[kindKey]! : 'cyan';\n const source = item.sessionName ? item.sessionName : item.sessionId.slice(0, 8);\n const titleText = item.title ? item.title : `(${item.askId.slice(0, 8)})`;\n const blocked = formatTimeAgo(item.blockedSince);\n const maxTitle = Math.max(10, contentWidth - source.length - blocked.length - 8);\n lines.push([\n seg(' '),\n seg(icon, { color: iconColor }),\n seg(` ${source}`, { color: 'yellow' }),\n seg(' · ', { dim: true }),\n seg(truncate(titleText, maxTitle), { bold: true }),\n seg(` ${blocked}`, { dim: true }),\n ]);\n if (item.subtitle) {\n lines.push(singleLine(` ${truncate(item.subtitle, contentWidth - 6)}`, { dim: true }));\n }\n }\n return lines;\n}\n\nexport function renderCrossSessionInboxRows(rect: Rect, state: AppState): string[] {\n if (rect.w <= 0 || rect.h <= 0) {\n return buildEmptyPanelRows(rect, state.focusPane === 'detail', 'red', '');\n }\n const focused = state.focusPane === 'detail';\n const items = state.aggregateInbox;\n const fingerprint = items.map(i => `${i.askId}:${i.status}`).join(',');\n const cacheKey = `${items.length}:${fingerprint}:${rect.w}`;\n let lines: DetailLine[];\n if (cacheKey === state.inboxCacheKey && state.cachedInboxLines !== null) {\n lines = state.cachedInboxLines;\n } else {\n lines = buildInboxLines(items, rect.w);\n state.cachedInboxLines = lines;\n state.inboxCacheKey = cacheKey;\n }\n return buildPanelRows(rect, lines, state.crossSessionInboxScroll, focused, 'red', state.inboxRenderedCache);\n}\n","import { execSync } from 'node:child_process';\nimport { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync, existsSync, cpSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir, homedir } from 'node:os';\nimport { shellQuote } from '../../shared/shell.js';\nimport { EXEC_ENV } from '../../shared/exec.js';\nimport { type AppState, type ComposeAction, OPTIONAL_COMPOSE, notify } from '../state.js';\nimport type { InputActions } from '../input.js';\nimport { dispatchComposeAction } from '../input.js';\n\nlet initLuaEnsured = false;\n\n/**\n * Idempotent: copies templates/sisyphus-init.lua to ~/.config/sisyphus/init.lua\n * if and only if the destination doesn't exist. Safe to call repeatedly.\n */\nexport function ensureSisyphusInitLua(): void {\n if (initLuaEnsured) return;\n initLuaEnsured = true;\n try {\n const destDir = join(homedir(), '.config', 'sisyphus');\n const destPath = join(destDir, 'init.lua');\n if (existsSync(destPath)) return;\n mkdirSync(destDir, { recursive: true });\n const srcPath = join(import.meta.dirname, 'templates', 'sisyphus-init.lua');\n cpSync(srcPath, destPath);\n } catch {\n // Non-fatal: popup will still open nvim, just without sisyphus init customization.\n }\n}\n\n/**\n * Open a tmux popup running `NVIM_APPNAME=sisyphus nvim <tempfile>`, await close,\n * read content, dispatch action. Empty file = cancel (no submission).\n * Synchronous; blocks the TUI render loop until popup exits.\n */\nexport function composeViaPopup(\n action: ComposeAction,\n state: AppState,\n actions: InputActions,\n): void {\n const tmpDir = mkdtempSync(join(tmpdir(), 'sisyphus-popup-'));\n const tempFile = join(tmpDir, 'compose.md');\n try {\n writeFileSync(tempFile, '', 'utf-8');\n const cmd = `NVIM_APPNAME=sisyphus nvim ${shellQuote(tempFile)}`;\n execSync(\n `tmux display-popup -E -w 90% -h 90% -d ${shellQuote(state.cwd)} ${shellQuote(cmd)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n\n let rawContent = '';\n try { rawContent = readFileSync(tempFile, 'utf-8'); } catch { /* ignore */ }\n\n const required = !OPTIONAL_COMPOSE.has(action.kind);\n if (!rawContent.trim() && required) {\n // Cancel: silent. Match editInPopup semantics — no notification on cancel.\n return;\n }\n // Dispatch original untrimmed content — trim is only for cancel detection above.\n dispatchComposeAction(action, rawContent, state, actions);\n } catch (err) {\n notify(state, `Failed to open compose popup: ${(err as Error).message}`);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n","import { setupTerminal } from './terminal.js';\nimport { createAppState } from './state.js';\nimport { startApp } from './app.js';\nimport { registerDashboardWindow } from './lib/tmux.js';\n\nconst args = process.argv.slice(2);\n\nfunction getArg(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n if (idx !== -1 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n return undefined;\n}\n\nconst cwd = getArg('cwd') ?? process.cwd();\n\nconst askId = getArg('ask');\nconst sessionId = getArg('session-id');\nif (askId && sessionId) {\n // Single-ask mode — used by the parallel ask-pane spawned from `sisyphus ask`.\n // Skips the dashboard inbox and renders only the deck for this one ask.\n // Must NOT call registerDashboardWindow() — would clobber the real dashboard.\n const { runSingleAsk } = await import('./single-ask.js');\n await runSingleAsk({ cwd, sessionId, askId });\n process.exit(0);\n}\n\nregisterDashboardWindow();\nconst cleanup = setupTerminal();\nconst state = createAppState(cwd);\nstartApp(state, cleanup);\n"],"mappings":"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","names":["cwd","state","readFileSync","existsSync","readdirSync","statSync","join","readFileSync","join","cwd","wrapText","divider","state","askId","state","cwd","sessionId","join","readFileSync","execSync","join","readFileSync","execSync","join","cwd","readFileSync","args","sessionId","firstPaneId","execSync","stringWidth","stringWidth","stringWidth","stringWidth","bg","row","cleaned","wrapped","state","lines","stringWidth","stringWidth","out","state","state","state","execSync","mkdtempSync","mkdirSync","writeFileSync","readFileSync","rmSync","existsSync","cpSync","join","tmpdir","join","existsSync","mkdirSync","cpSync","state","mkdtempSync","tmpdir","writeFileSync","execSync","readFileSync","rmSync","statSync","readFileSync","state","state","cleanup","existsSync","readFileSync","join","readdirSync","statSync","out"]}