sisyphi 1.0.13 → 1.0.14
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.
- package/dist/{chunk-LWWRGQWM.js → chunk-MMA43N67.js} +2 -2
- package/dist/chunk-MMA43N67.js.map +1 -0
- package/dist/{chunk-T7ETTIQK.js → chunk-Q6VQOUN3.js} +2 -2
- package/dist/{chunk-JXKUI4P6.js → chunk-YGBGKMTF.js} +1 -28
- package/dist/{chunk-JXKUI4P6.js.map → chunk-YGBGKMTF.js.map} +1 -1
- package/dist/cli.js +51 -23
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +245 -97
- package/dist/daemon.js.map +1 -1
- package/dist/{paths-NUUALUVP.js → paths-FYYSBD27.js} +2 -2
- package/dist/templates/agent-plugin/agents/spec-draft.md +1 -1
- package/dist/templates/agent-plugin/agents/test-spec.md +1 -1
- package/dist/templates/agent-plugin/hooks/require-submit.sh +1 -1
- package/dist/templates/orchestrator-base.md +6 -4
- package/dist/templates/orchestrator-planning.md +1 -1
- package/dist/tui.js +2671 -2908
- package/dist/tui.js.map +1 -1
- package/package.json +2 -4
- package/templates/agent-plugin/agents/spec-draft.md +1 -1
- package/templates/agent-plugin/agents/test-spec.md +1 -1
- package/templates/agent-plugin/hooks/require-submit.sh +1 -1
- package/templates/orchestrator-base.md +6 -4
- package/templates/orchestrator-planning.md +1 -1
- package/dist/chunk-LWWRGQWM.js.map +0 -1
- /package/dist/{chunk-T7ETTIQK.js.map → chunk-Q6VQOUN3.js.map} +0 -0
- /package/dist/{paths-NUUALUVP.js.map → paths-FYYSBD27.js.map} +0 -0
package/dist/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/eastasianwidth/eastasianwidth.js","../node_modules/emoji-regex/index.js","../src/tui/index.tsx","../src/tui/App.tsx","../src/tui/components/SessionTree.tsx","../src/tui/lib/tree-render.ts","../node_modules/ansi-regex/index.js","../node_modules/strip-ansi/index.js","../node_modules/string-width/index.js","../src/tui/lib/format.ts","../src/tui/components/SessionDetail.tsx","../src/tui/components/PlanView.tsx","../src/tui/components/ScrollablePanel.tsx","../src/tui/components/LogsPanel.tsx","../src/tui/components/CycleDetail.tsx","../src/tui/components/AgentDetail.tsx","../src/tui/components/ReportView.tsx","../src/tui/components/InputBar.tsx","../src/tui/components/StatusLine.tsx","../src/tui/components/LeaderOverlay.tsx","../src/tui/components/HelpOverlay.tsx","../src/tui/hooks/usePolling.ts","../src/tui/lib/client.ts","../src/tui/lib/tmux.ts","../src/tui/hooks/useKeybindings.ts","../src/tui/hooks/useLeaderKey.ts","../src/tui/lib/clipboard.ts","../src/tui/lib/tree.ts"],"sourcesContent":["var eaw = {};\n\nif ('undefined' == typeof module) {\n window.eastasianwidth = eaw;\n} else {\n module.exports = eaw;\n}\n\neaw.eastAsianWidth = function(character) {\n var x = character.charCodeAt(0);\n var y = (character.length == 2) ? character.charCodeAt(1) : 0;\n var codePoint = x;\n if ((0xD800 <= x && x <= 0xDBFF) && (0xDC00 <= y && y <= 0xDFFF)) {\n x &= 0x3FF;\n y &= 0x3FF;\n codePoint = (x << 10) | y;\n codePoint += 0x10000;\n }\n\n if ((0x3000 == codePoint) ||\n (0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n (0xFFE0 <= codePoint && codePoint <= 0xFFE6)) {\n return 'F';\n }\n if ((0x20A9 == codePoint) ||\n (0xFF61 <= codePoint && codePoint <= 0xFFBE) ||\n (0xFFC2 <= codePoint && codePoint <= 0xFFC7) ||\n (0xFFCA <= codePoint && codePoint <= 0xFFCF) ||\n (0xFFD2 <= codePoint && codePoint <= 0xFFD7) ||\n (0xFFDA <= codePoint && codePoint <= 0xFFDC) ||\n (0xFFE8 <= codePoint && codePoint <= 0xFFEE)) {\n return 'H';\n }\n if ((0x1100 <= codePoint && codePoint <= 0x115F) ||\n (0x11A3 <= codePoint && codePoint <= 0x11A7) ||\n (0x11FA <= codePoint && codePoint <= 0x11FF) ||\n (0x2329 <= codePoint && codePoint <= 0x232A) ||\n (0x2E80 <= codePoint && codePoint <= 0x2E99) ||\n (0x2E9B <= codePoint && codePoint <= 0x2EF3) ||\n (0x2F00 <= codePoint && codePoint <= 0x2FD5) ||\n (0x2FF0 <= codePoint && codePoint <= 0x2FFB) ||\n (0x3001 <= codePoint && codePoint <= 0x303E) ||\n (0x3041 <= codePoint && codePoint <= 0x3096) ||\n (0x3099 <= codePoint && codePoint <= 0x30FF) ||\n (0x3105 <= codePoint && codePoint <= 0x312D) ||\n (0x3131 <= codePoint && codePoint <= 0x318E) ||\n (0x3190 <= codePoint && codePoint <= 0x31BA) ||\n (0x31C0 <= codePoint && codePoint <= 0x31E3) ||\n (0x31F0 <= codePoint && codePoint <= 0x321E) ||\n (0x3220 <= codePoint && codePoint <= 0x3247) ||\n (0x3250 <= codePoint && codePoint <= 0x32FE) ||\n (0x3300 <= codePoint && codePoint <= 0x4DBF) ||\n (0x4E00 <= codePoint && codePoint <= 0xA48C) ||\n (0xA490 <= codePoint && codePoint <= 0xA4C6) ||\n (0xA960 <= codePoint && codePoint <= 0xA97C) ||\n (0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n (0xD7B0 <= codePoint && codePoint <= 0xD7C6) ||\n (0xD7CB <= codePoint && codePoint <= 0xD7FB) ||\n (0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n (0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n (0xFE30 <= codePoint && codePoint <= 0xFE52) ||\n (0xFE54 <= codePoint && codePoint <= 0xFE66) ||\n (0xFE68 <= codePoint && codePoint <= 0xFE6B) ||\n (0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n (0x1F200 <= codePoint && codePoint <= 0x1F202) ||\n (0x1F210 <= codePoint && codePoint <= 0x1F23A) ||\n (0x1F240 <= codePoint && codePoint <= 0x1F248) ||\n (0x1F250 <= codePoint && codePoint <= 0x1F251) ||\n (0x20000 <= codePoint && codePoint <= 0x2F73F) ||\n (0x2B740 <= codePoint && codePoint <= 0x2FFFD) ||\n (0x30000 <= codePoint && codePoint <= 0x3FFFD)) {\n return 'W';\n }\n if ((0x0020 <= codePoint && codePoint <= 0x007E) ||\n (0x00A2 <= codePoint && codePoint <= 0x00A3) ||\n (0x00A5 <= codePoint && codePoint <= 0x00A6) ||\n (0x00AC == codePoint) ||\n (0x00AF == codePoint) ||\n (0x27E6 <= codePoint && codePoint <= 0x27ED) ||\n (0x2985 <= codePoint && codePoint <= 0x2986)) {\n return 'Na';\n }\n if ((0x00A1 == codePoint) ||\n (0x00A4 == codePoint) ||\n (0x00A7 <= codePoint && codePoint <= 0x00A8) ||\n (0x00AA == codePoint) ||\n (0x00AD <= codePoint && codePoint <= 0x00AE) ||\n (0x00B0 <= codePoint && codePoint <= 0x00B4) ||\n (0x00B6 <= codePoint && codePoint <= 0x00BA) ||\n (0x00BC <= codePoint && codePoint <= 0x00BF) ||\n (0x00C6 == codePoint) ||\n (0x00D0 == codePoint) ||\n (0x00D7 <= codePoint && codePoint <= 0x00D8) ||\n (0x00DE <= codePoint && codePoint <= 0x00E1) ||\n (0x00E6 == codePoint) ||\n (0x00E8 <= codePoint && codePoint <= 0x00EA) ||\n (0x00EC <= codePoint && codePoint <= 0x00ED) ||\n (0x00F0 == codePoint) ||\n (0x00F2 <= codePoint && codePoint <= 0x00F3) ||\n (0x00F7 <= codePoint && codePoint <= 0x00FA) ||\n (0x00FC == codePoint) ||\n (0x00FE == codePoint) ||\n (0x0101 == codePoint) ||\n (0x0111 == codePoint) ||\n (0x0113 == codePoint) ||\n (0x011B == codePoint) ||\n (0x0126 <= codePoint && codePoint <= 0x0127) ||\n (0x012B == codePoint) ||\n (0x0131 <= codePoint && codePoint <= 0x0133) ||\n (0x0138 == codePoint) ||\n (0x013F <= codePoint && codePoint <= 0x0142) ||\n (0x0144 == codePoint) ||\n (0x0148 <= codePoint && codePoint <= 0x014B) ||\n (0x014D == codePoint) ||\n (0x0152 <= codePoint && codePoint <= 0x0153) ||\n (0x0166 <= codePoint && codePoint <= 0x0167) ||\n (0x016B == codePoint) ||\n (0x01CE == codePoint) ||\n (0x01D0 == codePoint) ||\n (0x01D2 == codePoint) ||\n (0x01D4 == codePoint) ||\n (0x01D6 == codePoint) ||\n (0x01D8 == codePoint) ||\n (0x01DA == codePoint) ||\n (0x01DC == codePoint) ||\n (0x0251 == codePoint) ||\n (0x0261 == codePoint) ||\n (0x02C4 == codePoint) ||\n (0x02C7 == codePoint) ||\n (0x02C9 <= codePoint && codePoint <= 0x02CB) ||\n (0x02CD == codePoint) ||\n (0x02D0 == codePoint) ||\n (0x02D8 <= codePoint && codePoint <= 0x02DB) ||\n (0x02DD == codePoint) ||\n (0x02DF == codePoint) ||\n (0x0300 <= codePoint && codePoint <= 0x036F) ||\n (0x0391 <= codePoint && codePoint <= 0x03A1) ||\n (0x03A3 <= codePoint && codePoint <= 0x03A9) ||\n (0x03B1 <= codePoint && codePoint <= 0x03C1) ||\n (0x03C3 <= codePoint && codePoint <= 0x03C9) ||\n (0x0401 == codePoint) ||\n (0x0410 <= codePoint && codePoint <= 0x044F) ||\n (0x0451 == codePoint) ||\n (0x2010 == codePoint) ||\n (0x2013 <= codePoint && codePoint <= 0x2016) ||\n (0x2018 <= codePoint && codePoint <= 0x2019) ||\n (0x201C <= codePoint && codePoint <= 0x201D) ||\n (0x2020 <= codePoint && codePoint <= 0x2022) ||\n (0x2024 <= codePoint && codePoint <= 0x2027) ||\n (0x2030 == codePoint) ||\n (0x2032 <= codePoint && codePoint <= 0x2033) ||\n (0x2035 == codePoint) ||\n (0x203B == codePoint) ||\n (0x203E == codePoint) ||\n (0x2074 == codePoint) ||\n (0x207F == codePoint) ||\n (0x2081 <= codePoint && codePoint <= 0x2084) ||\n (0x20AC == codePoint) ||\n (0x2103 == codePoint) ||\n (0x2105 == codePoint) ||\n (0x2109 == codePoint) ||\n (0x2113 == codePoint) ||\n (0x2116 == codePoint) ||\n (0x2121 <= codePoint && codePoint <= 0x2122) ||\n (0x2126 == codePoint) ||\n (0x212B == codePoint) ||\n (0x2153 <= codePoint && codePoint <= 0x2154) ||\n (0x215B <= codePoint && codePoint <= 0x215E) ||\n (0x2160 <= codePoint && codePoint <= 0x216B) ||\n (0x2170 <= codePoint && codePoint <= 0x2179) ||\n (0x2189 == codePoint) ||\n (0x2190 <= codePoint && codePoint <= 0x2199) ||\n (0x21B8 <= codePoint && codePoint <= 0x21B9) ||\n (0x21D2 == codePoint) ||\n (0x21D4 == codePoint) ||\n (0x21E7 == codePoint) ||\n (0x2200 == codePoint) ||\n (0x2202 <= codePoint && codePoint <= 0x2203) ||\n (0x2207 <= codePoint && codePoint <= 0x2208) ||\n (0x220B == codePoint) ||\n (0x220F == codePoint) ||\n (0x2211 == codePoint) ||\n (0x2215 == codePoint) ||\n (0x221A == codePoint) ||\n (0x221D <= codePoint && codePoint <= 0x2220) ||\n (0x2223 == codePoint) ||\n (0x2225 == codePoint) ||\n (0x2227 <= codePoint && codePoint <= 0x222C) ||\n (0x222E == codePoint) ||\n (0x2234 <= codePoint && codePoint <= 0x2237) ||\n (0x223C <= codePoint && codePoint <= 0x223D) ||\n (0x2248 == codePoint) ||\n (0x224C == codePoint) ||\n (0x2252 == codePoint) ||\n (0x2260 <= codePoint && codePoint <= 0x2261) ||\n (0x2264 <= codePoint && codePoint <= 0x2267) ||\n (0x226A <= codePoint && codePoint <= 0x226B) ||\n (0x226E <= codePoint && codePoint <= 0x226F) ||\n (0x2282 <= codePoint && codePoint <= 0x2283) ||\n (0x2286 <= codePoint && codePoint <= 0x2287) ||\n (0x2295 == codePoint) ||\n (0x2299 == codePoint) ||\n (0x22A5 == codePoint) ||\n (0x22BF == codePoint) ||\n (0x2312 == codePoint) ||\n (0x2460 <= codePoint && codePoint <= 0x24E9) ||\n (0x24EB <= codePoint && codePoint <= 0x254B) ||\n (0x2550 <= codePoint && codePoint <= 0x2573) ||\n (0x2580 <= codePoint && codePoint <= 0x258F) ||\n (0x2592 <= codePoint && codePoint <= 0x2595) ||\n (0x25A0 <= codePoint && codePoint <= 0x25A1) ||\n (0x25A3 <= codePoint && codePoint <= 0x25A9) ||\n (0x25B2 <= codePoint && codePoint <= 0x25B3) ||\n (0x25B6 <= codePoint && codePoint <= 0x25B7) ||\n (0x25BC <= codePoint && codePoint <= 0x25BD) ||\n (0x25C0 <= codePoint && codePoint <= 0x25C1) ||\n (0x25C6 <= codePoint && codePoint <= 0x25C8) ||\n (0x25CB == codePoint) ||\n (0x25CE <= codePoint && codePoint <= 0x25D1) ||\n (0x25E2 <= codePoint && codePoint <= 0x25E5) ||\n (0x25EF == codePoint) ||\n (0x2605 <= codePoint && codePoint <= 0x2606) ||\n (0x2609 == codePoint) ||\n (0x260E <= codePoint && codePoint <= 0x260F) ||\n (0x2614 <= codePoint && codePoint <= 0x2615) ||\n (0x261C == codePoint) ||\n (0x261E == codePoint) ||\n (0x2640 == codePoint) ||\n (0x2642 == codePoint) ||\n (0x2660 <= codePoint && codePoint <= 0x2661) ||\n (0x2663 <= codePoint && codePoint <= 0x2665) ||\n (0x2667 <= codePoint && codePoint <= 0x266A) ||\n (0x266C <= codePoint && codePoint <= 0x266D) ||\n (0x266F == codePoint) ||\n (0x269E <= codePoint && codePoint <= 0x269F) ||\n (0x26BE <= codePoint && codePoint <= 0x26BF) ||\n (0x26C4 <= codePoint && codePoint <= 0x26CD) ||\n (0x26CF <= codePoint && codePoint <= 0x26E1) ||\n (0x26E3 == codePoint) ||\n (0x26E8 <= codePoint && codePoint <= 0x26FF) ||\n (0x273D == codePoint) ||\n (0x2757 == codePoint) ||\n (0x2776 <= codePoint && codePoint <= 0x277F) ||\n (0x2B55 <= codePoint && codePoint <= 0x2B59) ||\n (0x3248 <= codePoint && codePoint <= 0x324F) ||\n (0xE000 <= codePoint && codePoint <= 0xF8FF) ||\n (0xFE00 <= codePoint && codePoint <= 0xFE0F) ||\n (0xFFFD == codePoint) ||\n (0x1F100 <= codePoint && codePoint <= 0x1F10A) ||\n (0x1F110 <= codePoint && codePoint <= 0x1F12D) ||\n (0x1F130 <= codePoint && codePoint <= 0x1F169) ||\n (0x1F170 <= codePoint && codePoint <= 0x1F19A) ||\n (0xE0100 <= codePoint && codePoint <= 0xE01EF) ||\n (0xF0000 <= codePoint && codePoint <= 0xFFFFD) ||\n (0x100000 <= codePoint && codePoint <= 0x10FFFD)) {\n return 'A';\n }\n\n return 'N';\n};\n\neaw.characterLength = function(character) {\n var code = this.eastAsianWidth(character);\n if (code == 'F' || code == 'W' || code == 'A') {\n return 2;\n } else {\n return 1;\n }\n};\n\n// Split a string considering surrogate-pairs.\nfunction stringToArray(string) {\n return string.match(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\uD800-\\uDFFF]/g) || [];\n}\n\neaw.length = function(string) {\n var characters = stringToArray(string);\n var len = 0;\n for (var i = 0; i < characters.length; i++) {\n len = len + this.characterLength(characters[i]);\n }\n return len;\n};\n\neaw.slice = function(text, start, end) {\n textLen = eaw.length(text)\n start = start ? start : 0;\n end = end ? end : 1;\n if (start < 0) {\n start = textLen + start;\n }\n if (end < 0) {\n end = textLen + end;\n }\n var result = '';\n var eawLen = 0;\n var chars = stringToArray(text);\n for (var i = 0; i < chars.length; i++) {\n var char = chars[i];\n var charLen = eaw.length(char);\n if (eawLen >= start - (charLen == 2 ? 1 : 0)) {\n if (eawLen + charLen <= end) {\n result += char;\n } else {\n break;\n }\n }\n eawLen += charLen;\n }\n return result;\n};\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67)\\uDB40\\uDC7F|(?:\\uD83E\\uDDD1\\uD83C\\uDFFF\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83D\\uDC68(?:\\uD83C\\uDFFB(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF]))|\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))?|(?:\\uD83C[\\uDFFC-\\uDFFF])\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF]))|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\u200D(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFFF|\\uD83C\\uDFFE|\\uD83C\\uDFFD|\\uD83C\\uDFFC)?|(?:\\uD83D\\uDC69(?:\\uD83C\\uDFFB\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|(?:\\uD83C[\\uDFFC-\\uDFFF])\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69]))|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC69(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83E\\uDDD1(?:\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|\\uD83D\\uDE36\\u200D\\uD83C\\uDF2B|\\uD83C\\uDFF3\\uFE0F\\u200D\\u26A7|\\uD83D\\uDC3B\\u200D\\u2744|(?:(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\uD83C\\uDFF4\\u200D\\u2620|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD])\\u200D[\\u2640\\u2642]|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u2600-\\u2604\\u260E\\u2611\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26B0\\u26B1\\u26C8\\u26CF\\u26D1\\u26D3\\u26E9\\u26F0\\u26F1\\u26F4\\u26F7\\u26F8\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]|\\uD83D[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3])\\uFE0F|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDE35\\u200D\\uD83D\\uDCAB|\\uD83D\\uDE2E\\u200D\\uD83D\\uDCA8|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF|\\uD83C\\uDFFE|\\uD83C\\uDFFD|\\uD83C\\uDFFC|\\uD83C\\uDFFB)?|\\uD83D\\uDC69(?:\\uD83C\\uDFFF|\\uD83C\\uDFFE|\\uD83C\\uDFFD|\\uD83C\\uDFFC|\\uD83C\\uDFFB)?|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF6\\uD83C\\uDDE6|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83D\\uDC08\\u200D\\u2B1B|\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79)|\\uD83D\\uDC41\\uFE0F|\\uD83C\\uDFF3\\uFE0F|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|[#\\*0-9]\\uFE0F\\u20E3|\\u2764\\uFE0F|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDFF4|(?:[\\u270A\\u270B]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270C\\u270D]|\\uD83D[\\uDD74\\uDD90])(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])|[\\u270A\\u270B]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC08\\uDC15\\uDC3B\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE2E\\uDE35\\uDE36\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5]|\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD]|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF]|[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD1D\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78\\uDD7A-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCB\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6]|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD78\\uDD7A-\\uDDCB\\uDDCD-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26A7\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5-\\uDED7\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD78\\uDD7A-\\uDDCB\\uDDCD-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDD77\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","import React from 'react';\nimport { render } from 'ink';\nimport { App } from './App.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\nrender(<App cwd={cwd} />);\n","import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { Box, Text, useApp, useStdout, useInput } from 'ink';\nimport { SessionTree } from './components/SessionTree.js';\nimport { SessionDetail } from './components/SessionDetail.js';\nimport { LogsPanel } from './components/LogsPanel.js';\nimport { CycleDetail } from './components/CycleDetail.js';\nimport { AgentDetail } from './components/AgentDetail.js';\nimport { ReportView } from './components/ReportView.js';\nimport { InputBar, type InputMode } from './components/InputBar.js';\nimport { StatusLine } from './components/StatusLine.js';\nimport { LeaderOverlay } from './components/LeaderOverlay.js';\nimport { HelpOverlay } from './components/HelpOverlay.js';\nimport { usePolling } from './hooks/usePolling.js';\nimport { useKeybindings } from './hooks/useKeybindings.js';\nimport { useLeaderKey } from './hooks/useLeaderKey.js';\nimport { send } from './lib/client.js';\nimport { resolveReports } from './lib/reports.js';\nimport { copyToClipboard } from './lib/clipboard.js';\nimport { buildSessionContext } from './lib/context.js';\nimport { buildTree, findParentIndex } from './lib/tree.js';\nimport {\n openCompanionPane,\n openEditorPopup,\n editInPopup,\n selectWindow,\n selectPane,\n switchToSession,\n openLogPopup,\n openShellPopup,\n openInFileManager,\n} from './lib/tmux.js';\nimport { ScrollablePanel } from './components/ScrollablePanel.js';\nimport { wrapText, formatTime, stripFrontmatter, seg, singleLine, agentDisplayName, reportBadge, messageSourceLabel, messageSourceColor, type DetailLine } from './lib/format.js';\nimport { goalPath, roadmapPath, sessionDir } from '../shared/paths.js';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { loadConfig } from '../shared/config.js';\nimport type { Request } from '../shared/protocol.js';\nimport type { TreeNode } from './types/tree.js';\n\ninterface Props {\n cwd: string;\n}\n\nfunction resolveEditor(configEditor: string | undefined): string {\n if (configEditor) return configEditor;\n if (process.env.EDITOR) return process.env.EDITOR;\n return 'nvim';\n}\n\nexport function App({ cwd }: Props) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const rows = stdout.rows || 24;\n const cols = stdout.columns || 80;\n const config = loadConfig(cwd);\n\n // Tree state\n const [cursorIndex, setCursorIndex] = useState(0);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [mode, setMode] = useState<InputMode>('navigate');\n const [notification, setNotification] = useState<string | null>(null);\n const [selectedSessionId, setSelectedSessionId] = useState<string | null>(null);\n const [detailScrollOffset, setDetailScrollOffset] = useState(0);\n const [logsScrollOffset, setLogsScrollOffset] = useState(0);\n const [showLogs, setShowLogs] = useState(false);\n const [focusPane, setFocusPane] = useState<'tree' | 'detail' | 'logs'>('tree');\n const [searchFilter, setSearchFilter] = useState<string | null>(null);\n const [targetAgentId, setTargetAgentId] = useState<string | null>(null);\n const cursorNodeIdRef = useRef<string | null>(null);\n const prevNodesRef = useRef<TreeNode[]>([]);\n\n // Polling\n const { sessions, selectedSession, planContent, goalContent, logsContent, logsCycles, paneAlive, contextFiles, error } = usePolling(cwd, selectedSessionId);\n\n // Filter sessions for search\n const filteredSessions = useMemo(() => {\n if (!searchFilter) return sessions;\n const q = searchFilter.toLowerCase();\n return sessions.filter(\n (s) => s.task.toLowerCase().includes(q) || s.id.toLowerCase().includes(q),\n );\n }, [sessions, searchFilter]);\n\n // Build tree from current state\n const nodes = useMemo(\n () => buildTree(filteredSessions, selectedSession, expanded, cwd, contextFiles),\n [filteredSessions, selectedSession, expanded, cwd, contextFiles],\n );\n\n // Track cursor node identity: update ref only when cursor moved (nodes stable),\n // not when tree rebuilt (nodes changed underneath)\n if (nodes === prevNodesRef.current) {\n const node = nodes[cursorIndex];\n if (node) cursorNodeIdRef.current = node.id;\n } else if (cursorNodeIdRef.current === null && nodes.length > 0) {\n cursorNodeIdRef.current = nodes[0]?.id ?? null;\n }\n prevNodesRef.current = nodes;\n\n // Derive selectedSessionId from cursor position\n useEffect(() => {\n const node = nodes[cursorIndex];\n const id = node?.sessionId ?? null;\n if (id !== selectedSessionId) {\n setSelectedSessionId(id);\n }\n }, [nodes, cursorIndex, selectedSessionId]);\n\n // Reset scroll offsets when cursor changes\n useEffect(() => {\n setDetailScrollOffset(0);\n setLogsScrollOffset(0);\n }, [cursorIndex]);\n\n // Stabilize cursor position when tree structure changes\n useEffect(() => {\n if (nodes.length === 0) {\n setCursorIndex(0);\n return;\n }\n const targetId = cursorNodeIdRef.current;\n if (!targetId) {\n cursorNodeIdRef.current = nodes[0]?.id ?? null;\n return;\n }\n // If current index already points to the right node, no adjustment needed\n if (nodes[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 setCursorIndex(newIndex);\n } else {\n // Node is gone (parent collapsed, session removed, etc.) — clamp\n const clamped = Math.min(cursorIndex, nodes.length - 1);\n setCursorIndex(clamped);\n cursorNodeIdRef.current = nodes[clamped]?.id ?? null;\n }\n }, [nodes]);\n\n // Auto-expand latest cycle when session data loads (only if session already expanded)\n const prevCycleCountRef = useRef<number>(0);\n useEffect(() => {\n if (!selectedSession) return;\n const sessionNodeId = `session:${selectedSession.id}`;\n const cycles = selectedSession.orchestratorCycles;\n\n setExpanded((prev) => {\n // Only auto-manage cycle expansion if the session is already expanded by user\n if (!prev.has(sessionNodeId)) {\n prevCycleCountRef.current = cycles.length;\n return prev;\n }\n if (cycles.length === 0) {\n prevCycleCountRef.current = 0;\n return prev;\n }\n\n const latest = cycles[cycles.length - 1]!;\n const latestId = `cycle:${selectedSession.id}:${latest.cycle}`;\n\n let next = prev;\n if (cycles.length > prevCycleCountRef.current && prevCycleCountRef.current > 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 next = new Set(prev);\n next.delete(prevId);\n next.add(latestId);\n }\n } else if (!prev.has(latestId)) {\n // Ensure latest is expanded\n next = new Set(prev);\n next.add(latestId);\n }\n\n prevCycleCountRef.current = cycles.length;\n return next;\n });\n }, [selectedSession?.orchestratorCycles.length, selectedSession?.id]);\n\n // Clear notification\n useEffect(() => {\n if (!notification) return;\n const t = setTimeout(() => setNotification(null), 3000);\n return () => clearTimeout(t);\n }, [notification]);\n\n const notify = useCallback((msg: string) => setNotification(msg), []);\n\n const session = selectedSession;\n const agents = session?.agents ?? [];\n\n // Helper: get the current cursor node\n const cursorNode: TreeNode | undefined = nodes[cursorIndex];\n\n // Helper: find agent object for agent/report nodes\n const getAgentForNode = useCallback(\n (node: TreeNode | undefined) => {\n if (!node || !session) return null;\n if (node.type === 'agent') return agents.find((a) => a.id === node.agentId) ?? null;\n if (node.type === 'report') return agents.find((a) => a.id === node.agentId) ?? null;\n return null;\n },\n [session, agents],\n );\n\n // Send request and notify result\n const sendAndNotify = useCallback(\n async (request: Request, successMsg: string) => {\n try {\n const res = await send(request);\n notify(res.ok ? successMsg : `Error: ${res.error}`);\n } catch (err) {\n notify(`Error: ${(err as Error).message}`);\n }\n },\n [notify],\n );\n\n // Expand/collapse helpers\n const toggleExpand = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n return next;\n });\n },\n [],\n );\n\n const expandNode = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n if (prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.add(nodeId);\n return next;\n });\n },\n [],\n );\n\n const collapseNode = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.delete(nodeId);\n return next;\n });\n },\n [],\n );\n\n // Layout — fixed-width tree panel (computed early for keybinding handlers)\n const treeWidth = 36;\n const remainingWidth = cols - treeWidth;\n const detailWidth = showLogs ? Math.floor(remainingWidth * 0.6) : remainingWidth;\n const logsWidth = showLogs ? remainingWidth - detailWidth : 0;\n const contentHeight = rows - 3;\n\n const expandSessionLatestCycle = (node: TreeNode) => {\n if (node.type === 'session' && selectedSession?.id === node.sessionId) {\n const cycles = selectedSession.orchestratorCycles;\n if (cycles.length > 0) {\n const latest = cycles[cycles.length - 1]!;\n expandNode(`cycle:${node.sessionId}:${latest.cycle}`);\n }\n }\n };\n\n // Keybindings (only active in navigate mode)\n useKeybindings(\n {\n onMoveUp: () => {\n if (focusPane === 'detail') {\n setDetailScrollOffset((o) => Math.max(0, o - 1));\n } else if (focusPane === 'logs') {\n setLogsScrollOffset((o) => Math.max(0, o - 1));\n } else {\n setCursorIndex((i) => Math.max(0, i - 1));\n }\n },\n onMoveDown: () => {\n if (focusPane === 'detail') {\n setDetailScrollOffset((o) => o + 1);\n } else if (focusPane === 'logs') {\n setLogsScrollOffset((o) => o + 1);\n } else {\n setCursorIndex((i) => Math.min(nodes.length - 1, i + 1));\n }\n },\n onLeft: () => {\n if (focusPane === 'logs') {\n setFocusPane('detail');\n return;\n }\n if (focusPane === 'detail') {\n setFocusPane('tree');\n return;\n }\n const node = nodes[cursorIndex];\n if (!node) return;\n if (node.expanded) {\n collapseNode(node.id);\n } else {\n // Jump to parent\n const parentIdx = findParentIndex(nodes, cursorIndex);\n if (parentIdx !== cursorIndex) setCursorIndex(parentIdx);\n }\n },\n onRight: () => {\n const node = nodes[cursorIndex];\n if (!node) return;\n if (node.expandable && !node.expanded) {\n expandNode(node.id);\n // Convenience: expanding a session also expands its latest cycle\n expandSessionLatestCycle(node);\n } else if (node.expandable && node.expanded) {\n // Move cursor to first child\n if (cursorIndex + 1 < nodes.length && nodes[cursorIndex + 1]!.depth > node.depth) {\n setCursorIndex(cursorIndex + 1);\n }\n }\n },\n onTab: () => {\n setFocusPane((f) => {\n if (f === 'tree') return 'detail';\n if (f === 'detail') return showLogs ? 'logs' : 'tree';\n return 'tree';\n });\n },\n onToggleLogs: () => {\n setShowLogs((prev) => {\n if (prev) {\n // Hiding: move focus away from logs if needed\n setFocusPane((f) => (f === 'logs' ? 'detail' : f));\n setLogsScrollOffset(0);\n }\n return !prev;\n });\n },\n onSpace: () => {\n setMode('leader');\n },\n onEnter: () => {\n const node = nodes[cursorIndex];\n if (!node) return;\n if (node.expandable && !node.expanded) {\n expandNode(node.id);\n // Convenience: expanding a session also expands its latest cycle\n expandSessionLatestCycle(node);\n } else if (node.type === 'report') {\n setMode('report-detail');\n } else if (node.type === 'context-file') {\n const editor = resolveEditor(config.editor);\n try {\n openEditorPopup(cwd, editor, node.filePath);\n } catch {\n notify('Failed to open file in editor');\n }\n }\n },\n onMessage: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n const editor = resolveEditor(config.editor);\n try {\n const content = editInPopup(cwd, editor);\n if (content) {\n void sendAndNotify(\n { type: 'message', sessionId: selectedSessionId, content },\n 'Message queued',\n );\n }\n } catch {\n notify('Failed to open editor');\n }\n },\n // kill moved to leader menu (space k)\n onGoToWindow: () => {\n if (!session || !selectedSessionId) { notify('No session selected'); return; }\n\n if (paneAlive && session.tmuxWindowId) {\n // Window is alive — just switch to it\n if (session.tmuxSessionName) switchToSession(session.tmuxSessionName);\n selectWindow(session.tmuxWindowId);\n return;\n }\n\n // Window is dead — reopen via daemon\n void (async () => {\n try {\n const res = await send({ type: 'reopen-window', sessionId: selectedSessionId, cwd });\n if (!res.ok) { notify(`Error: ${res.error}`); return; }\n const data = res.data as { tmuxSessionName: string; tmuxWindowId: string };\n switchToSession(data.tmuxSessionName);\n selectWindow(data.tmuxWindowId);\n } catch (err) {\n notify(`Error: ${(err as Error).message}`);\n }\n })();\n },\n onEditGoal: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n const gp = goalPath(cwd, selectedSessionId);\n const editor = resolveEditor(config.editor);\n try {\n openEditorPopup(cwd, editor, gp, { w: '80', h: '50%' });\n } catch {\n notify(`Failed to open goal in ${editor}`);\n }\n },\n onNewSession: () => {\n const editor = resolveEditor(config.editor);\n try {\n const content = editInPopup(cwd, editor);\n if (content) {\n void sendAndNotify(\n { type: 'start', task: content, cwd },\n 'Session created',\n );\n }\n } catch {\n notify('Failed to open editor');\n }\n },\n onClaude: () => {\n try {\n openCompanionPane(cwd);\n } catch {\n notify('Failed to open companion pane');\n }\n },\n onOpenPlan: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n const pp = roadmapPath(cwd, selectedSessionId);\n const editor = resolveEditor(config.editor);\n try {\n openEditorPopup(cwd, editor, pp);\n } catch {\n notify(`Failed to open roadmap in ${editor}`);\n }\n },\n onQuit: () => exit(),\n onReRun: () => {\n const agent = getAgentForNode(cursorNode);\n if (!agent || !selectedSessionId) { notify('Select an agent to re-run'); return; }\n sendAndNotify({\n type: 'spawn',\n sessionId: selectedSessionId,\n agentType: agent.agentType,\n name: `${agent.name}-retry`,\n instruction: agent.instruction,\n }, `Re-spawned ${agent.name}`);\n },\n // jump-to-pane moved to leader menu (space j)\n onResume: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n if (session?.status === 'active' && paneAlive) { notify('Session already active'); return; }\n setMode('resume');\n },\n onContinue: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n if (session?.status !== 'completed') { notify('Session not completed'); return; }\n setMode('continue');\n },\n onRestartAgent: () => {\n const agent = getAgentForNode(cursorNode);\n if (!agent || !selectedSessionId) { notify('Select an agent to restart'); return; }\n sendAndNotify(\n { type: 'restart-agent', sessionId: selectedSessionId, agentId: agent.id },\n `Restarted ${agent.id}`,\n );\n },\n onRollback: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n setMode('rollback');\n },\n onEdit: () => {\n if (!cursorNode || cursorNode.type !== 'context-file') return;\n const editor = resolveEditor(config.editor);\n try {\n openEditorPopup(cwd, editor, cursorNode.filePath);\n } catch {\n notify('Failed to open file in editor');\n }\n },\n },\n mode === 'navigate',\n );\n\n // Report detail scroll + dismiss\n useInput(\n (input, key) => {\n if (key.escape || key.return) { handleCancel(); return; }\n if (key.upArrow) { setDetailScrollOffset((o) => Math.max(0, o - 1)); return; }\n if (key.downArrow) { setDetailScrollOffset((o) => o + 1); return; }\n },\n { isActive: mode === 'report-detail' },\n );\n\n // Leader key state machine\n useLeaderKey(mode, (action) => {\n switch (action.type) {\n case 'enter-copy-menu':\n setMode('copy-menu');\n break;\n\n case 'copy-path': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n const path = sessionDir(cwd, selectedSessionId);\n try {\n copyToClipboard(path);\n notify(`Copied path (${path})`);\n } catch {\n notify('Failed to copy to clipboard');\n }\n setMode('navigate');\n break;\n }\n\n case 'copy-context': {\n if (!selectedSessionId || !session) { notify('No session selected'); setMode('navigate'); break; }\n try {\n const xml = buildSessionContext(session, cwd);\n copyToClipboard(xml);\n notify(`Copied context (${xml.length} chars)`);\n } catch {\n notify('Failed to copy context');\n }\n setMode('navigate');\n break;\n }\n\n case 'copy-logs': {\n if (!logsContent) { notify('No logs content'); setMode('navigate'); break; }\n try {\n copyToClipboard(logsContent);\n notify(`Copied logs (${logsContent.length} chars)`);\n } catch {\n notify('Failed to copy to clipboard');\n }\n setMode('navigate');\n break;\n }\n\n case 'copy-session-id': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n try {\n copyToClipboard(selectedSessionId);\n notify(`Copied session ID (${selectedSessionId})`);\n } catch {\n notify('Failed to copy to clipboard');\n }\n setMode('navigate');\n break;\n }\n\n case 'delete-session': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n setMode('delete-confirm');\n break;\n }\n\n case 'open-logs': {\n try {\n openLogPopup();\n } catch {\n notify('Failed to open log popup');\n }\n setMode('navigate');\n break;\n }\n\n case 'open-session-dir': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n try {\n openInFileManager(sessionDir(cwd, selectedSessionId));\n } catch {\n notify('Failed to open session directory');\n }\n setMode('navigate');\n break;\n }\n\n case 'search':\n setMode('search');\n break;\n\n case 'jump-to-session': {\n // Find the Nth session-type node (1-indexed)\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 setCursorIndex(i);\n break;\n }\n }\n }\n setMode('navigate');\n break;\n }\n\n case 'spawn-agent': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n setMode('spawn-agent');\n break;\n }\n\n case 'message-agent': {\n const agent = getAgentForNode(cursorNode);\n if (!agent) { notify('Cursor must be on an agent'); setMode('navigate'); break; }\n setTargetAgentId(agent.id);\n setMode('message-agent');\n break;\n }\n\n case 'help':\n setMode('help');\n break;\n\n case 'shell-command': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n setMode('shell-command');\n break;\n }\n\n case 'jump-to-pane': {\n const agent = getAgentForNode(cursorNode);\n if (!agent?.paneId) { notify('Select an agent with an active pane'); setMode('navigate'); break; }\n if (session?.tmuxSessionName) switchToSession(session.tmuxSessionName);\n if (session?.tmuxWindowId) selectWindow(session.tmuxWindowId);\n selectPane(agent.paneId);\n setMode('navigate');\n break;\n }\n\n case 'kill': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n const node = nodes[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(`Agent ${agentId} is not running`); setMode('navigate'); break; }\n sendAndNotify({ type: 'kill-agent', sessionId: selectedSessionId, agentId }, `Killed ${agentId}`);\n } else {\n sendAndNotify({ type: 'kill', sessionId: selectedSessionId }, 'Session killed');\n }\n setMode('navigate');\n break;\n }\n\n case 'quit':\n exit();\n break;\n\n case 'dismiss':\n setMode('navigate');\n break;\n }\n });\n\n // Submit handler — dispatches by input mode\n const handleSubmit = useCallback(\n async (text: string) => {\n switch (mode) {\n case 'resume': {\n if (!selectedSessionId) break;\n await sendAndNotify(\n { type: 'resume', sessionId: selectedSessionId, cwd, message: text || undefined },\n 'Session resumed',\n );\n break;\n }\n case 'continue': {\n if (!selectedSessionId) break;\n try {\n const contRes = await send({ type: 'continue', sessionId: selectedSessionId });\n if (!contRes.ok) { notify(`Error: ${contRes.error}`); break; }\n await sendAndNotify(\n { type: 'resume', sessionId: selectedSessionId, cwd, message: text || undefined },\n 'Session continued',\n );\n } catch (err) {\n notify(`Error: ${(err as Error).message}`);\n }\n break;\n }\n case 'rollback': {\n if (!selectedSessionId) break;\n const toCycle = parseInt(text, 10);\n if (isNaN(toCycle) || toCycle < 1) { notify('Invalid cycle number'); break; }\n await sendAndNotify(\n { type: 'rollback', sessionId: selectedSessionId, cwd, toCycle },\n `Rolled back to cycle ${toCycle} — use [R]esume to respawn`,\n );\n break;\n }\n case 'delete-confirm': {\n if (!selectedSessionId) break;\n if (text !== 'yes') { notify('Delete cancelled (type \"yes\" to confirm)'); break; }\n await sendAndNotify(\n { type: 'delete', sessionId: selectedSessionId, cwd },\n 'Session deleted',\n );\n break;\n }\n case 'spawn-agent': {\n if (!selectedSessionId) break;\n if (!text.trim()) { notify('Instruction required'); break; }\n await sendAndNotify(\n {\n type: 'spawn',\n sessionId: selectedSessionId,\n agentType: 'default',\n name: 'agent',\n instruction: text,\n },\n 'Agent spawned',\n );\n break;\n }\n case 'search': {\n setSearchFilter(text.trim() || null);\n break;\n }\n case 'message-agent': {\n if (!selectedSessionId || !targetAgentId) break;\n await sendAndNotify(\n { type: 'message', sessionId: selectedSessionId, content: text, source: { type: 'agent', agentId: targetAgentId } },\n `Message sent to ${targetAgentId}`,\n );\n setTargetAgentId(null);\n break;\n }\n case 'shell-command': {\n if (!text.trim()) break;\n try {\n openShellPopup(cwd, text);\n } catch {\n notify('Failed to run shell command');\n }\n break;\n }\n }\n setMode('navigate');\n },\n [mode, selectedSessionId, targetAgentId, cwd, notify, sendAndNotify],\n );\n\n const handleCancel = useCallback(() => {\n setMode('navigate');\n setFocusPane('tree');\n setTargetAgentId(null);\n }, []);\n\n // Resolve report content for ReportView and AgentDetail\n const reportAgent = useMemo(() => {\n if (mode === 'report-detail') return getAgentForNode(cursorNode);\n return null;\n }, [mode, cursorNode, getAgentForNode]);\n\n const reportBlocks = useMemo(\n () => (reportAgent ? resolveReports(reportAgent.reports) : []),\n [reportAgent],\n );\n\n // Resolve reports for agent/report detail panels\n const detailAgent = useMemo(() => {\n if (!cursorNode) return null;\n if (cursorNode.type === 'agent' || cursorNode.type === 'report') {\n return getAgentForNode(cursorNode);\n }\n return null;\n }, [cursorNode, getAgentForNode]);\n\n const detailReportBlocks = useMemo(\n () => (detailAgent ? resolveReports(detailAgent.reports) : []),\n [detailAgent],\n );\n\n // Load context file content when cursor is on a context-file node\n const contextFileContent = useMemo(() => {\n if (!cursorNode || cursorNode.type !== 'context-file') return null;\n try {\n if (existsSync(cursorNode.filePath)) {\n return readFileSync(cursorNode.filePath, 'utf-8');\n }\n } catch {\n // file may be unreadable\n }\n return null;\n }, [cursorNode]);\n\n // Right panel content — determined by cursor node type\n const renderDetailPanel = useCallback(\n (detailWidth: number, contentHeight: number) => {\n // Report detail mode takes full panel\n if (mode === 'report-detail' && reportAgent) {\n return (\n <ReportView\n agent={reportAgent}\n reportBlocks={reportBlocks}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={true}\n />\n );\n }\n\n if (!cursorNode || !session) {\n return (\n <SessionDetail\n session={null}\n planContent=\"\"\n goalContent=\"\"\n logsContent=\"\"\n width={detailWidth}\n height={contentHeight}\n paneAlive={true}\n />\n );\n }\n\n switch (cursorNode.type) {\n case 'session':\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n goalContent={goalContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n\n case 'cycle': {\n const cycle = session.orchestratorCycles.find(\n (c) => c.cycle === cursorNode.cycleNumber,\n );\n if (!cycle) {\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n return (\n <CycleDetail\n cycle={cycle}\n agents={session.agents}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n\n case 'agent': {\n const agent = agents.find((a) => a.id === cursorNode.agentId);\n if (!agent) {\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n return (\n <AgentDetail\n agent={agent}\n reportBlocks={detailReportBlocks}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n\n case 'report': {\n const agent = agents.find((a) => a.id === cursorNode.agentId);\n if (!agent) {\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n // Find the specific report for this node and show it inline\n const reportIdx = cursorNode.reportIndex;\n const specificBlock = detailReportBlocks.find((_b, i) => {\n // detailReportBlocks is reversed (newest first), match by index from original reports\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 const reportContentLines: DetailLine[] = [\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(), detailWidth - 8).map(l => singleLine(` ${l}`)),\n ];\n return (\n <ScrollablePanel\n lines={reportContentLines}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n borderColor={badgeColor}\n />\n );\n }\n return (\n <AgentDetail\n agent={agent}\n reportBlocks={detailReportBlocks}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n\n case 'messages': {\n const msgsLines: DetailLine[] = [\n singleLine(` Messages (${session.messages.length})`, { bold: true }),\n ];\n if (session.messages.length === 0) {\n msgsLines.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, detailWidth - label.length - 20);\n msgsLines.push([\n seg(` [${time}] `, { dim: true }),\n seg(`${label}: `, { color: labelColor, bold: true }),\n seg(wrapText(msg.summary || msg.content, maxContent)[0] || '', {}),\n ]);\n }\n }\n return (\n <ScrollablePanel\n lines={msgsLines}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n\n case 'message': {\n const msg = session.messages.find((m) => m.id === cursorNode.messageId);\n const msgContentLines: DetailLine[] = [\n singleLine(' Message', { bold: true }),\n ];\n if (msg) {\n msgContentLines.push(singleLine(` ${cursorNode.source} · ${cursorNode.timestamp}`, { dim: true }));\n for (const l of wrapText(msg.content, detailWidth - 8)) {\n msgContentLines.push(singleLine(` ${l}`));\n }\n } else {\n msgContentLines.push(singleLine(' Message not found', { dim: true }));\n }\n return (\n <ScrollablePanel\n lines={msgContentLines}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n\n case 'context': {\n const ctxLines: DetailLine[] = [\n [seg(' '), seg('⊞', { color: 'white' }), seg(` Context (${contextFiles.length})`, { bold: true })],\n ];\n if (contextFiles.length === 0) {\n ctxLines.push(singleLine(' No context files found.', { dim: true }));\n } else {\n for (const f of contextFiles) {\n ctxLines.push(singleLine(` · ${f}`, { dim: true }));\n }\n }\n return (\n <ScrollablePanel\n lines={ctxLines}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n\n case 'context-file': {\n const ctxFileLines: DetailLine[] = [\n [seg(' '), seg('⊞', { color: 'white' }), seg(` ${cursorNode.label}`, { bold: true })],\n singleLine(' '),\n ];\n if (contextFileContent == null) {\n ctxFileLines.push(singleLine(' File not found or unreadable.', { dim: true }));\n } else {\n const wrapped = wrapText(stripFrontmatter(contextFileContent), detailWidth - 8);\n if (wrapped.length === 0) {\n ctxFileLines.push(singleLine(' (empty)', { dim: true }));\n } else {\n for (const l of wrapped) {\n ctxFileLines.push(singleLine(` ${l}`));\n }\n }\n }\n return (\n <ScrollablePanel\n lines={ctxFileLines}\n width={detailWidth}\n height={contentHeight}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n borderColor=\"white\"\n />\n );\n }\n\n default:\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n goalContent={goalContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n }\n },\n [cursorNode, session, planContent, goalContent, logsContent, paneAlive, agents, mode, reportAgent, reportBlocks, detailReportBlocks, handleCancel, detailScrollOffset, focusPane, contextFiles, contextFileContent],\n );\n\n if (cols < 60 || rows < 12) {\n return (\n <Box flexDirection=\"column\" width={cols} height={rows} justifyContent=\"center\" alignItems=\"center\">\n <Text color=\"yellow\" bold>Terminal too small</Text>\n <Text dimColor>Minimum: 60×12 (current: {cols}×{rows})</Text>\n <Text dimColor>Resize your terminal and try again.</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" width={cols} height={rows}>\n <Box flexDirection=\"row\" height={contentHeight}>\n <SessionTree\n nodes={nodes}\n cursorIndex={cursorIndex}\n width={treeWidth}\n height={contentHeight}\n focused={mode === 'navigate' && focusPane === 'tree'}\n />\n\n {renderDetailPanel(detailWidth, contentHeight)}\n {showLogs && (\n <LogsPanel\n cycleLogs={selectedSession ? logsCycles : []}\n width={logsWidth}\n height={contentHeight}\n scrollOffset={logsScrollOffset}\n focused={mode === 'navigate' && focusPane === 'logs'}\n />\n )}\n </Box>\n\n {notification && (\n <Box paddingX={1}>\n <Text color=\"yellow\" bold>\n {/error|failed/i.test(notification)\n ? `✕ ${notification}`\n : /success|created|killed|sent|copied|deleted/i.test(notification)\n ? `✓ ${notification}`\n : `ℹ ${notification}`}\n </Text>\n </Box>\n )}\n\n {error && !notification && (\n <Box paddingX={1}>\n <Text color=\"red\">⚠ {error}</Text>\n </Box>\n )}\n\n <InputBar\n mode={mode}\n defaultText={mode === 'rollback' && cursorNode?.type === 'cycle' ? String(cursorNode.cycleNumber) : undefined}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n />\n\n <StatusLine\n mode={mode}\n detailFocused={focusPane === 'detail'}\n logsFocused={focusPane === 'logs'}\n showLogs={showLogs}\n cursorNodeType={cursorNode?.type}\n />\n\n <LeaderOverlay mode={mode} rows={rows} cols={cols} />\n <HelpOverlay mode={mode} rows={rows} cols={cols} />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\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} from '../lib/format.js';\n\ninterface Props {\n nodes: TreeNode[];\n cursorIndex: number;\n width: number;\n height: number;\n focused: boolean;\n}\n\nexport function SessionTree({ nodes, cursorIndex, width, height, focused }: Props) {\n if (nodes.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'yellow' : 'gray'}\n paddingX={1}\n >\n <Text bold> Sessions </Text>\n <Text dimColor>No sessions found.</Text>\n <Text dimColor>Press [n] to create one.</Text>\n <Text dimColor>Press [?] for all keybindings.</Text>\n </Box>\n );\n }\n\n const maxVisible = Math.max(1, height - 4);\n const halfVisible = Math.floor(maxVisible / 2);\n const scrollOffset = Math.max(\n 0,\n Math.min(cursorIndex - halfVisible, nodes.length - maxVisible),\n );\n const visible = nodes.slice(scrollOffset, scrollOffset + maxVisible);\n const contentWidth = width - 4; // border + padding\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'yellow' : 'gray'}\n paddingX={1}\n >\n {scrollOffset > 0 && <Text dimColor> ↑ {scrollOffset} more</Text>}\n\n {visible.map((node, i) => {\n const realIdx = scrollOffset + i;\n const isSelected = realIdx === cursorIndex;\n const prefix = renderTreePrefix(node, nodes, realIdx);\n const { icon, label, meta, color, dim, metaColor } = renderNodeContent(\n node,\n contentWidth - prefix.length,\n );\n\n return (\n <Text key={node.id} inverse={isSelected && focused} bold={isSelected}>\n {prefix}\n <Text color={color} dimColor={dim}>\n {icon}\n </Text>\n {icon ? ' ' : ''}\n <Text dimColor={dim}>{label}</Text>\n {meta ? <Text color={metaColor} dimColor={!metaColor}> {meta}</Text> : null}\n </Text>\n );\n })}\n\n {scrollOffset + maxVisible < nodes.length && (\n <Text dimColor> ↓ {nodes.length - scrollOffset - maxVisible} more</Text>\n )}\n </Box>\n );\n}\n\nfunction renderNodeContent(\n node: TreeNode,\n maxWidth: number,\n): { icon: string; label: string; meta: string; color: string; dim: boolean; metaColor?: string } {\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 = node.status === 'completed' && node.completedAt ? formatTimeAgo(node.completedAt) : '';\n const meta = [cyclePart, dur, agopart].filter(Boolean).join(' ');\n const maxTask = Math.max(8, maxWidth - meta.length - 4);\n return { icon, label: truncate(node.task, maxTask), meta, color, dim };\n }\n case 'cycle': {\n const isRunning = !node.completedAt;\n const dur = node.completedAt\n ? formatDuration(node.timestamp, node.completedAt)\n : 'running';\n const agents = `${node.agentCount} agent${node.agentCount !== 1 ? 's' : ''}`;\n const modeShort = node.mode === 'implementation' ? 'impl' : node.mode === 'planning' ? 'plan' : 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.spawnedAt, node.completedAt);\n const durClr = durationColor(node.spawnedAt, node.completedAt) || undefined;\n const dim = node.status === 'completed';\n const displayName = agentDisplayName({ name: node.name, id: node.agentId, agentType: node.agentType });\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","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","export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Fast path: ANSI codes require ESC (7-bit) or CSI (8-bit) introducer\n\tif (!string.includes('\\u001B') && !string.includes('\\u009B')) {\n\t\treturn string;\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","import stripAnsi from 'strip-ansi';\nimport eastAsianWidth from 'eastasianwidth';\nimport emojiRegex from 'emoji-regex';\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\toptions = {\n\t\tambiguousIsNarrow: true,\n\t\t...options\n\t};\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tconst ambiguousCharacterWidth = options.ambiguousIsNarrow ? 1 : 2;\n\tlet width = 0;\n\n\tfor (const character of string) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (codePoint >= 0x300 && codePoint <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst code = eastAsianWidth.eastAsianWidth(character);\n\t\tswitch (code) {\n\t\t\tcase 'F':\n\t\t\tcase 'W':\n\t\t\t\twidth += 2;\n\t\t\t\tbreak;\n\t\t\tcase 'A':\n\t\t\t\twidth += ambiguousCharacterWidth;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\twidth += 1;\n\t\t}\n\t}\n\n\treturn width;\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};\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 modeColor(mode?: string): string {\n if (mode === 'planning') return 'blue';\n if (mode === 'implementation') return 'green';\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 let remaining = rawLine;\n while (stringWidth(remaining) > width) {\n // Find a break point that fits within display width\n let breakAt = -1;\n // Start from an estimated position and scan for a space\n let estimate = Math.min(remaining.length, width);\n for (let i = estimate; i >= 0; i--) {\n if (remaining[i] === ' ' && stringWidth(remaining.slice(0, i)) <= width) {\n breakAt = i;\n break;\n }\n }\n if (breakAt <= 0) {\n // No space found — find the max chars that fit\n breakAt = remaining.length;\n for (let i = 1; i <= remaining.length; i++) {\n if (stringWidth(remaining.slice(0, i)) > width) {\n breakAt = i - 1;\n break;\n }\n }\n if (breakAt <= 0) breakAt = 1; // always make progress\n }\n result.push(remaining.slice(0, breakAt));\n remaining = remaining.slice(breakAt).trimStart();\n }\n if (remaining) result.push(remaining);\n }\n return result;\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { Session } from '../../shared/types.js';\nimport { computeActiveTimeMs } from '../../shared/utils.js';\nimport { buildPlanLines } from './PlanView.js';\nimport { ScrollablePanel } from './ScrollablePanel.js';\nimport {\n statusColor,\n formatDuration,\n formatTime,\n truncate,\n wrapText,\n stripFrontmatter,\n cleanMarkdown,\n seg,\n singleLine,\n messageSourceLabel,\n messageSourceColor,\n modeColor,\n type DetailLine,\n} from '../lib/format.js';\n\ninterface Props {\n session: Session | null;\n planContent: string;\n goalContent?: string;\n logsContent?: string;\n width: number;\n height: number;\n paneAlive: boolean;\n scrollOffset?: number;\n focused?: boolean;\n}\n\nfunction buildLines(\n session: Session,\n planContent: string,\n goalContent: string | undefined,\n _logsContent: string | undefined,\n width: number,\n paneAlive: boolean,\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 const conflicts = agents.filter((a) => a.mergeStatus === 'conflict');\n\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 (mixed colors)\n const lastCycle = cycles.length > 0 ? cycles[cycles.length - 1]! : null;\n const cycleNum = lastCycle?.cycle ?? 0;\n const mode = 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 // Conflict banner\n if (conflicts.length > 0) {\n lines.push(\n singleLine(\n ` ⚠ ${conflicts.length} merge conflict${conflicts.length > 1 ? 's' : ''}`,\n { color: 'red', bold: true },\n ),\n );\n lines.push(\n singleLine(\n ' resolve in worktree, then [x] restart agent',\n { color: 'red', dim: true },\n ),\n );\n }\n\n // Plan section\n lines.push(singleLine(' '));\n lines.push([\n seg(' ▎ ◈ PLAN', { color: 'yellow', bold: true }),\n ]);\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 // 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(\n (l) => {\n lines.push(singleLine(` ${l}`, { dim: true }));\n },\n );\n }\n\n // Cycles section — newest first, messages nested below the cycle they fed into\n lines.push(singleLine(' '));\n lines.push([\n seg(' ▎ ⟳ CYCLES', { color: 'blue', bold: true }),\n seg(` (${cycles.length})`, { dim: true }),\n ]);\n\n // Render one message as an indented sub-row under its cycle\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 || 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(); // newest first in display\n\n // Strip namespace prefix for compact display (e.g., \"devcore:programmer\" → \"programmer\")\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]; // chronologically prior\n\n const isRunning = !cycle.completedAt;\n // Visual recency: newest completed = white, second = gray, rest = dim gray\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.timestamp, cycle.completedAt);\n const n = cycle.agentsSpawned.length;\n const startTime = formatTime(cycle.timestamp);\n\n // Compact mode label\n const modeLabel = cycle.mode\n ? cycle.mode === 'implementation' ? 'impl'\n : cycle.mode === 'planning' ? 'plan'\n : cycle.mode\n : '';\n const cycModeColor = modeColor(cycle.mode);\n\n const cycleAgents = agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n\n // Padded fields for column alignment\n const cyclePad = `C${cycle.cycle}`.padEnd(4);\n const durPad = (isRunning ? 'running' : duration).padEnd(9);\n\n // Line 1: cycle metadata\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 // Line 2: agent detail — full names, grouped by type\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.name || a.id);\n typeGroups.set(t, (typeGroups.get(t) ?? 0) + 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 // Messages that fed into this cycle: sent after the prior cycle started, before this one\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 (before the first cycle started)\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\nexport function SessionDetail({\n session,\n planContent,\n goalContent,\n logsContent,\n width,\n height,\n paneAlive,\n scrollOffset = 0,\n focused = false,\n}: Props) {\n if (!session) {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Text dimColor>Select a session to view details</Text>\n </Box>\n );\n }\n\n const allLines = useMemo(\n () => buildLines(session, planContent, goalContent, logsContent, width, paneAlive),\n [session, planContent, goalContent, logsContent, width, paneAlive],\n );\n\n return (\n <ScrollablePanel\n lines={allLines}\n width={width}\n height={height}\n scrollOffset={scrollOffset}\n focused={focused}\n />\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { truncate, wrapText, stripFrontmatter, cleanMarkdown } from '../lib/format.js';\n\ninterface Props {\n content: string;\n maxLines: number;\n width: number;\n}\n\nexport interface PlanLine {\n text: string;\n bold?: boolean;\n dim?: boolean;\n color?: string;\n}\n\nexport function 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: ' ' }); // breathing room before headers\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 — clean markdown, preserve numbering\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\nexport function PlanView({ content, maxLines, width }: Props) {\n const lines = buildPlanLines(content, maxLines, width);\n\n if (lines.length === 0) {\n return (\n <Box>\n <Text dimColor italic> No roadmap yet</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i} bold={line.bold} dimColor={line.dim} color={line.color}>\n {line.text}\n </Text>\n ))}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { DetailLine } from '../lib/format.js';\n\ninterface Props {\n lines: DetailLine[];\n width: number;\n height: number;\n scrollOffset?: number;\n focused?: boolean;\n borderColor?: string;\n}\n\n/**\n * Generic scrollable panel that renders DetailLine[] with windowed scrolling.\n *\n * Key design choices:\n * - Uses positional keys (key={i}) so React reuses nodes during scroll\n * - Clamps scroll offset to valid range\n * - Shows scroll indicator when content overflows\n * - Pads short content to fill available height (prevents layout shift)\n */\nexport function ScrollablePanel({\n lines,\n width,\n height,\n scrollOffset = 0,\n focused = false,\n borderColor = 'gray',\n}: Props) {\n const innerHeight = height - 2; // top + bottom border\n const hasOverflow = lines.length > innerHeight;\n const viewableHeight = hasOverflow ? innerHeight - 1 : innerHeight; // reserve 1 for indicator\n const maxScroll = Math.max(0, lines.length - viewableHeight);\n const effectiveOffset = Math.min(scrollOffset, maxScroll);\n const visible = lines.slice(effectiveOffset, effectiveOffset + viewableHeight);\n const padCount = Math.max(0, viewableHeight - visible.length);\n const scrollPct = maxScroll > 0 ? Math.round((effectiveOffset / maxScroll) * 100) : 100;\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n overflow=\"hidden\"\n borderStyle=\"round\"\n borderColor={focused ? 'blue' : borderColor}\n paddingX={1}\n >\n {visible.map((segs, i) => (\n <Text key={i}>\n {segs.map((s, j) => (\n <Text key={j} color={s.color} bold={s.bold} dimColor={s.dim} italic={s.italic}>\n {s.text}\n </Text>\n ))}\n </Text>\n ))}\n {padCount > 0 &&\n Array.from({ length: padCount }, (_, i) => (\n <Text key={`p${i}`}>{' '}</Text>\n ))}\n {hasOverflow && (\n <Text dimColor>\n {' '}↕ {scrollPct}% · {lines.length} lines\n </Text>\n )}\n </Box>\n );\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { CycleLog } from '../hooks/usePolling.js';\nimport { ScrollablePanel } from './ScrollablePanel.js';\nimport {\n stripFrontmatter,\n cleanMarkdown,\n wrapText,\n seg,\n type DetailLine,\n} from '../lib/format.js';\n\ninterface Props {\n cycleLogs: CycleLog[];\n width: number;\n height: number;\n scrollOffset?: number;\n focused?: boolean;\n}\n\nfunction buildLines(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 // Most recent first\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\nexport function LogsPanel({\n cycleLogs,\n width,\n height,\n scrollOffset = 0,\n focused = false,\n}: Props) {\n if (cycleLogs.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'blue' : 'gray'}\n paddingX={1}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Text dimColor>No logs</Text>\n </Box>\n );\n }\n\n const allLines = useMemo(\n () => buildLines(cycleLogs, width),\n [cycleLogs, width],\n );\n\n return (\n <ScrollablePanel\n lines={allLines}\n width={width}\n height={height}\n scrollOffset={scrollOffset}\n focused={focused}\n />\n );\n}\n","import React, { useMemo } from 'react';\nimport type { OrchestratorCycle, Agent } from '../../shared/types.js';\nimport { ScrollablePanel } from './ScrollablePanel.js';\nimport {\n formatDuration,\n formatTime,\n statusColor,\n agentStatusIcon,\n truncate,\n extractFirstSentence,\n wrapText,\n durationColor,\n agentTypeColor,\n seg,\n singleLine,\n agentDisplayName,\n modeColor,\n type DetailLine,\n} from '../lib/format.js';\n\ninterface Props {\n cycle: OrchestratorCycle;\n agents: Agent[];\n width: number;\n height: number;\n scrollOffset?: number;\n focused?: boolean;\n}\n\nfunction buildLines(cycle: OrchestratorCycle, agents: Agent[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const isRunning = !cycle.completedAt;\n const dur = cycle.completedAt\n ? formatDuration(cycle.timestamp, cycle.completedAt)\n : 'running';\n const cycleAgents = agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n\n // Title\n lines.push(singleLine(` Cycle ${cycle.cycle}`, { bold: true }));\n\n // Status\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 ? [\n seg(' · ', { dim: true }),\n seg(cycle.mode, {\n color: modeColor(cycle.mode),\n }),\n ]\n : []),\n ]);\n\n // Time\n lines.push(singleLine(\n ` ${formatTime(cycle.timestamp)}${cycle.completedAt ? ` → ${formatTime(cycle.completedAt)}` : ''}`,\n { dim: true },\n ));\n\n // Agents section\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 && agent.status === 'completed'\n ? extractFirstSentence(latestReport.summary, contentWidth - 14)\n : null;\n const agentDur = formatDuration(agent.spawnedAt, agent.completedAt);\n const durClr = durationColor(agent.spawnedAt, agent.completedAt) || 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: agentTypeColor(agent.agentType) || undefined,\n dim: !agentTypeColor(agent.agentType),\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 // Next Prompt\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\nexport function CycleDetail({ cycle, agents, width, height, scrollOffset = 0, focused = false }: Props) {\n const allLines = useMemo(\n () => buildLines(cycle, agents, width),\n [cycle, agents, width],\n );\n\n return (\n <ScrollablePanel\n lines={allLines}\n width={width}\n height={height}\n scrollOffset={scrollOffset}\n focused={focused}\n />\n );\n}\n","import React, { useMemo } from 'react';\nimport type { Agent } from '../../shared/types.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport { ScrollablePanel } from './ScrollablePanel.js';\nimport {\n formatDuration,\n formatTime,\n statusColor,\n agentStatusIcon,\n wrapText,\n seg,\n singleLine,\n agentDisplayName,\n reportBadge,\n mergeStatusDisplay,\n type DetailLine,\n} from '../lib/format.js';\n\ninterface Props {\n agent: Agent;\n reportBlocks?: ReportBlock[];\n width: number;\n height: number;\n scrollOffset?: number;\n focused?: boolean;\n}\n\nfunction buildLines(agent: Agent, reportBlocks: ReportBlock[] | undefined, width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const dur = formatDuration(agent.spawnedAt, agent.completedAt);\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const nameLabel = agentDisplayName(agent);\n const maxMergeLines = 3;\n\n // Header\n lines.push([\n seg(' '),\n seg(icon, { color }),\n seg(` ${agent.id} · ${nameLabel}`, { bold: true }),\n ]);\n\n // Status line\n const merge = agent.mergeStatus ? mergeStatusDisplay(agent.mergeStatus) : null;\n lines.push([\n seg(' '),\n seg(agent.status, { color }),\n seg(` · ${dur} · ${agent.agentType}`, { dim: true }),\n ...(merge\n ? [seg(' · ', { dim: true }), seg(`${merge.icon} ${merge.label}`, { color: merge.color })]\n : agent.mergeStatus\n ? [seg(' · ', { dim: true }), seg(agent.mergeStatus, { dim: true })]\n : []),\n ]);\n\n // Alerts\n if (agent.killedReason) {\n lines.push(singleLine(` ⚠ ${agent.killedReason}`, { color: 'red' }));\n }\n\n if (agent.mergeStatus === 'conflict' && agent.mergeDetails) {\n for (const ml of wrapText(agent.mergeDetails, contentWidth - 6).slice(0, maxMergeLines)) {\n lines.push(singleLine(` ⚠ ${ml}`, { color: 'red' }));\n }\n }\n\n if (agent.mergeStatus === 'conflict') {\n lines.push(singleLine(' resolve conflicts in worktree dir, then restart', { color: 'red', dim: true }));\n }\n\n // Instruction\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 // Reports\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 // Metadata\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.paneId) {\n lines.push(singleLine(` Pane: ${agent.paneId}`, { dim: true }));\n }\n if (agent.worktreePath) {\n lines.push(singleLine(` Worktree: ${agent.worktreePath}`, { dim: true }));\n }\n if (agent.branchName) {\n lines.push(singleLine(` Branch: ${agent.branchName}`, { dim: true }));\n }\n\n return lines;\n}\n\nexport function AgentDetail({ agent, reportBlocks, width, height, scrollOffset = 0, focused = false }: Props) {\n const allLines = useMemo(\n () => buildLines(agent, reportBlocks, width),\n [agent, reportBlocks, width],\n );\n\n return (\n <ScrollablePanel\n lines={allLines}\n width={width}\n height={height}\n scrollOffset={scrollOffset}\n focused={focused}\n />\n );\n}\n","import React, { useMemo } from 'react';\nimport type { Agent } from '../../shared/types.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport { ScrollablePanel } from './ScrollablePanel.js';\nimport {\n formatDuration,\n formatTime,\n divider,\n statusColor,\n agentStatusIcon,\n wrapText,\n seg,\n singleLine,\n agentDisplayName,\n reportBadge,\n type DetailLine,\n} from '../lib/format.js';\n\ninterface Props {\n agent: Agent;\n reportBlocks: ReportBlock[];\n width: number;\n height: number;\n scrollOffset?: number;\n focused?: boolean;\n}\n\nfunction buildLines(agent: Agent, reportBlocks: ReportBlock[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 6; // border + padding + gutter\n const dur = formatDuration(agent.spawnedAt, agent.completedAt);\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 // Header\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 // Status line\n lines.push(singleLine(\n ` ${agent.status} · ${dur} · ${agent.agentType} · ${totalReports} report${totalReports !== 1 ? 's' : ''}`,\n { dim: true },\n ));\n\n // Divider\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 // Report header badge\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 // Report content — wrapped to fit\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\nexport function ReportView({ agent, reportBlocks, width, height, scrollOffset = 0, focused = false }: Props) {\n const lines = useMemo(\n () => buildLines(agent, reportBlocks, width),\n [agent, reportBlocks, width],\n );\n\n return (\n <ScrollablePanel\n lines={lines}\n width={width}\n height={height}\n scrollOffset={scrollOffset}\n focused={focused}\n borderColor=\"cyan\"\n />\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport type InputMode =\n | 'navigate'\n | 'message'\n | 'new-session'\n | 'report-detail'\n | 'resume'\n | 'continue'\n | 'rollback'\n | 'leader'\n | 'copy-menu'\n | 'delete-confirm'\n | 'spawn-agent'\n | 'search'\n | 'message-agent'\n | 'shell-command'\n | 'help';\n\ninterface Props {\n mode: InputMode;\n defaultText?: string;\n onSubmit: (text: string) => void;\n onCancel: () => void;\n}\n\nconst INPUT_MODES = new Set<InputMode>([\n 'resume',\n 'continue',\n 'rollback',\n 'delete-confirm',\n 'spawn-agent',\n 'search',\n 'message-agent',\n 'shell-command',\n]);\n\nconst PROMPTS: Partial<Record<InputMode, string>> = {\n resume: 'resume instructions (optional)',\n continue: 'new direction (optional)',\n rollback: 'cycle number',\n 'delete-confirm': \"type 'yes' to confirm delete:\",\n 'spawn-agent': 'agent instruction:',\n search: 'filter:',\n 'message-agent': 'message:',\n 'shell-command': '$ ',\n};\n\nconst OPTIONAL_INPUT = new Set<InputMode>(['resume', 'continue', 'search']);\n\nexport function InputBar({ mode, defaultText, onSubmit, onCancel }: Props) {\n const [text, setText] = useState('');\n const [cursorPos, setCursorPos] = useState(0);\n const prevMode = useRef(mode);\n\n // Pre-fill text when entering a mode with defaultText; reset cursor on mode change\n useEffect(() => {\n if (mode !== prevMode.current) {\n if (INPUT_MODES.has(mode) && defaultText) {\n setText(defaultText);\n setCursorPos(defaultText.length);\n } else {\n setText('');\n setCursorPos(0);\n }\n }\n prevMode.current = mode;\n }, [mode, defaultText]);\n\n useInput(\n (input, key) => {\n if (key.return) {\n if (OPTIONAL_INPUT.has(mode) || text.trim()) {\n onSubmit(text.trim());\n setText('');\n setCursorPos(0);\n }\n return;\n }\n if (key.escape) {\n setText('');\n setCursorPos(0);\n onCancel();\n return;\n }\n if (key.leftArrow) {\n setCursorPos((p) => Math.max(0, p - 1));\n return;\n }\n if (key.rightArrow) {\n setCursorPos((p) => Math.min(text.length, p + 1));\n return;\n }\n if (key.ctrl && input === 'a') {\n setCursorPos(0);\n return;\n }\n if (key.ctrl && input === 'e') {\n setCursorPos(text.length);\n return;\n }\n if (key.ctrl && input === 'k') {\n setText((t) => t.slice(0, cursorPos));\n // cursorPos stays the same (now at end)\n return;\n }\n if (key.ctrl && input === 'u') {\n setText((t) => t.slice(cursorPos));\n setCursorPos(0);\n return;\n }\n if (key.backspace || key.delete) {\n if (cursorPos > 0) {\n setText((t) => t.slice(0, cursorPos - 1) + t.slice(cursorPos));\n setCursorPos((p) => p - 1);\n }\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setText((t) => t.slice(0, cursorPos) + input + t.slice(cursorPos));\n setCursorPos((p) => p + input.length);\n }\n },\n { isActive: INPUT_MODES.has(mode) },\n );\n\n if (mode === 'navigate') {\n return (\n <Box paddingX={1}>\n <Text dimColor>Press [m] to message orchestrator, [n] for new session</Text>\n </Box>\n );\n }\n\n if (mode === 'report-detail' || mode === 'leader' || mode === 'copy-menu' || mode === 'help' || !INPUT_MODES.has(mode)) {\n return null;\n }\n\n const prompt = PROMPTS[mode] ?? mode;\n\n return (\n <Box paddingX={1}>\n <Text color=\"yellow\">{prompt} > </Text>\n <Text>{text.slice(0, cursorPos)}</Text>\n <Text inverse>{cursorPos < text.length ? text[cursorPos] : ' '}</Text>\n <Text>{text.slice(cursorPos + 1)}</Text>\n <Text dimColor> (enter to send, esc to cancel)</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { InputMode } from './InputBar.js';\nimport type { TreeNodeType } from '../types/tree.js';\n\ninterface Props {\n mode: InputMode;\n detailFocused?: boolean;\n logsFocused?: boolean;\n showLogs?: boolean;\n cursorNodeType?: TreeNodeType;\n}\n\nexport function StatusLine({ mode, detailFocused = false, logsFocused = false, showLogs = false, cursorNodeType }: Props) {\n if (mode === 'report-detail') {\n return null;\n }\n\n if (mode === 'leader') {\n return (\n <Box paddingX={1}>\n <Text color=\"magenta\" bold>LEADER</Text>\n <Text dimColor> press a command key or [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'copy-menu') {\n return (\n <Box paddingX={1}>\n <Text color=\"cyan\" bold>COPY</Text>\n <Text dimColor> [p] path [C] context [l] logs [s] session ID [esc] cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'help') {\n return (\n <Box paddingX={1}>\n <Text color=\"yellow\" bold>HELP</Text>\n <Text dimColor> [esc] or [?] to dismiss</Text>\n </Box>\n );\n }\n\n if (mode === 'delete-confirm') {\n return (\n <Box paddingX={1}>\n <Text color=\"red\" bold>DELETE</Text>\n <Text dimColor> type 'yes' to confirm, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'spawn-agent') {\n return (\n <Box paddingX={1}>\n <Text color=\"green\" bold>SPAWN</Text>\n <Text dimColor> enter agent instruction, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'search') {\n return (\n <Box paddingX={1}>\n <Text color=\"blue\" bold>SEARCH</Text>\n <Text dimColor> type to filter, enter to apply, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'message-agent') {\n return (\n <Box paddingX={1}>\n <Text color=\"cyan\" bold>MESSAGE</Text>\n <Text dimColor> enter message for agent, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'shell-command') {\n return (\n <Box paddingX={1}>\n <Text color=\"magenta\" bold>SHELL</Text>\n <Text dimColor> enter command, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode !== 'navigate') {\n return (\n <Box paddingX={1}>\n <Text dimColor>[enter] send [esc] cancel</Text>\n </Box>\n );\n }\n\n if (logsFocused) {\n return (\n <Box paddingX={1}>\n <Text bold>[jk/↑↓]</Text><Text dimColor> scroll </Text>\n <Text bold>[h/←/tab]</Text><Text dimColor> back </Text>\n <Text bold>[t]</Text><Text dimColor>oggle logs </Text>\n <Text dimColor>│ </Text>\n <Text bold>[m]</Text><Text dimColor>sg </Text>\n <Text bold>[g]</Text><Text dimColor>oal </Text>\n <Text bold>[n]</Text><Text dimColor>ew </Text>\n <Text bold>[p]</Text><Text dimColor>lan </Text>\n <Text bold>[w]</Text><Text dimColor>indow </Text>\n <Text bold>[R]</Text><Text dimColor>esume </Text>\n <Text bold>[q]</Text><Text dimColor>uit</Text>\n </Box>\n );\n }\n\n if (detailFocused) {\n return (\n <Box paddingX={1}>\n <Text bold>[jk/↑↓]</Text><Text dimColor> scroll </Text>\n <Text bold>[h/←/tab]</Text><Text dimColor> back </Text>\n <Text bold>[t]</Text><Text dimColor>oggle logs </Text>\n <Text dimColor>│ </Text>\n <Text bold>[m]</Text><Text dimColor>sg </Text>\n <Text bold>[g]</Text><Text dimColor>oal </Text>\n <Text bold>[n]</Text><Text dimColor>ew </Text>\n <Text bold>[p]</Text><Text dimColor>lan </Text>\n <Text bold>[w]</Text><Text dimColor>indow </Text>\n <Text bold>[R]</Text><Text dimColor>esume </Text>\n <Text bold>[q]</Text><Text dimColor>uit</Text>\n </Box>\n );\n }\n\n return (\n <Box paddingX={1}>\n <Text bold>[hjkl]</Text><Text dimColor> navigate </Text>\n <Text dimColor>│ </Text>\n {cursorNodeType === 'context-file' && <><Text bold>[e]</Text><Text dimColor>dit </Text><Text bold>[⏎]</Text><Text dimColor> open </Text></>}\n <Text bold>[space]</Text><Text dimColor> leader </Text>\n <Text bold>[tab]</Text><Text dimColor> detail </Text>\n <Text bold>[t]</Text><Text dimColor>oggle logs </Text>\n <Text dimColor>│ </Text>\n <Text bold>[m]</Text><Text dimColor>sg </Text>\n <Text bold>[n]</Text><Text dimColor>ew </Text>\n <Text bold>[R]</Text><Text dimColor>esume </Text>\n <Text bold>[q]</Text><Text dimColor>uit</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { InputMode } from './InputBar.js';\n\ninterface Props {\n mode: InputMode;\n rows: number;\n cols: number;\n}\n\nconst LEADER_WIDTH = 26;\nconst LEADER_HEIGHT = 19; // 17 lines + 2 border\nconst COPY_HEIGHT = 9; // 7 lines + 2 border\n// Full inner width between left and right border chars\nconst INNER = LEADER_WIDTH - 2;\n\n/** Pad a string to fill the full width between borders so no background chars leak. */\nfunction pad(s: string): string {\n return s.padEnd(INNER);\n}\n\nexport function LeaderOverlay({ mode, rows, cols }: Props) {\n if (mode === 'leader') {\n return (\n <Box\n position=\"absolute\"\n marginTop={rows - LEADER_HEIGHT - 2}\n marginLeft={cols - LEADER_WIDTH - 1}\n width={LEADER_WIDTH}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"magenta\"\n >\n <Text bold color=\"magenta\">{pad(' LEADER')}</Text>\n <Text>{pad(' ')}</Text>\n <Text>{pad(' y copy menu')}</Text>\n <Text>{pad(' d delete session')}</Text>\n <Text>{pad(' l daemon logs')}</Text>\n <Text>{pad(' o open session dir')}</Text>\n <Text>{pad(' a spawn agent')}</Text>\n <Text>{pad(' m message agent')}</Text>\n <Text>{pad(' / search')}</Text>\n <Text>{pad(' ! shell command')}</Text>\n <Text>{pad(' j jump to pane')}</Text>\n <Text>{pad(' k kill session/agent')}</Text>\n <Text>{pad(' q quit')}</Text>\n <Text>{pad(' ? help')}</Text>\n <Text>{pad(' 1-9 jump to session')}</Text>\n <Text>{pad(' ')}</Text>\n <Text dimColor>{pad(' esc dismiss')}</Text>\n </Box>\n );\n }\n\n if (mode === 'copy-menu') {\n return (\n <Box\n position=\"absolute\"\n marginTop={rows - COPY_HEIGHT - 2}\n marginLeft={cols - LEADER_WIDTH - 1}\n width={LEADER_WIDTH}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n >\n <Text bold color=\"cyan\">{pad(' COPY')}</Text>\n <Text>{pad(' ')}</Text>\n <Text>{pad(' p session path')}</Text>\n <Text>{pad(' C LLM context')}</Text>\n <Text>{pad(' l logs content')}</Text>\n <Text>{pad(' s session ID')}</Text>\n <Text dimColor>{pad(' esc cancel')}</Text>\n </Box>\n );\n }\n\n return null;\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { InputMode } from './InputBar.js';\n\ninterface Props {\n mode: InputMode;\n rows: number;\n cols: number;\n}\n\nconst HELP_WIDTH = 62;\nconst INNER = HELP_WIDTH - 2;\n\nfunction pad(s: string): string {\n return s.padEnd(INNER);\n}\n\nfunction header(label: string): string {\n return pad(` ── ${label} ──`);\n}\n\nfunction row(left: string, right: string): string {\n const col = Math.floor(INNER / 2);\n return (left.padEnd(col) + right).padEnd(INNER);\n}\n\nexport function HelpOverlay({ mode, rows, cols }: Props) {\n if (mode !== 'help') return null;\n\n const marginLeft = Math.max(0, Math.floor((cols - HELP_WIDTH) / 2));\n const lines = [\n row(' hjkl/↑↓←→ navigate', ' tab switch pane'),\n row(' enter expand/open', ' t toggle logs'),\n '',\n row(' n new session', ' m message orch.'),\n row(' R resume session', ' C continue session'),\n row(' b rollback cycle', ' x restart agent'),\n row(' r re-run agent', ' g edit goal'),\n row(' p open roadmap', ' w go to window'),\n row(' c claude companion', ' q quit'),\n '',\n row(' space → y copy submenu', ' space → d delete session'),\n row(' space → j jump to pane', ' space → k kill'),\n row(' space → q quit', ' space → o open dir'),\n row(' space → l tail logs', ' space → / search'),\n row(' space → a spawn agent', ' space → m msg agent'),\n row(' space → ? help', ' space → 1-9 jump'),\n '',\n row(' y → p session path', ' y → C LLM context'),\n row(' y → l logs content', ' y → s session ID'),\n ];\n\n // Clamp overlay height to terminal height\n const overlayHeight = Math.min(lines.length + 4, rows - 2);\n\n return (\n <Box\n position=\"absolute\"\n marginTop={Math.max(0, Math.floor((rows - overlayHeight) / 2))}\n marginLeft={marginLeft}\n width={HELP_WIDTH}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n >\n <Text bold color=\"yellow\">{pad(' KEYBINDINGS (esc or ? to close)')}</Text>\n <Text>{pad(' ')}</Text>\n {lines.map((line, i) => {\n if (line === '') return <Text key={i}>{pad(' ')}</Text>;\n return <Text key={i}>{pad(line)}</Text>;\n })}\n <Text>{pad(' ')}</Text>\n </Box>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { send } from '../lib/client.js';\nimport { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { goalPath, logsDir, roadmapPath, contextDir } from '../../shared/paths.js';\nimport { windowExists } from '../lib/tmux.js';\nimport type { Session } from '../../shared/types.js';\n\nexport interface SessionSummary {\n id: 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\nexport interface PollingState {\n sessions: SessionSummary[];\n selectedSession: Session | null;\n planContent: string;\n goalContent: string;\n logsContent: string;\n logsCycles: CycleLog[];\n paneAlive: boolean;\n contextFiles: string[];\n error: string | null;\n}\n\nexport function usePolling(\n cwd: string,\n selectedSessionId: string | null,\n intervalMs: number = 2500,\n): PollingState {\n const [state, setState] = useState<PollingState>({\n sessions: [],\n selectedSession: null,\n planContent: '',\n goalContent: '',\n logsContent: '',\n logsCycles: [],\n paneAlive: true,\n contextFiles: [],\n error: null,\n });\n\n const selectedIdRef = useRef(selectedSessionId);\n selectedIdRef.current = selectedSessionId;\n const mountedRef = useRef(true);\n\n const poll = useCallback(async () => {\n try {\n const listRes = await send({ type: 'list', cwd });\n if (!mountedRef.current) return;\n\n const sessions = listRes.ok\n ? ((listRes.data?.sessions as SessionSummary[] | undefined) ?? [])\n : [];\n\n // Cache window existence for non-completed sessions (avoids execSync in render path)\n for (const s of sessions) {\n if (s.status !== 'completed' && s.tmuxWindowId) {\n try {\n s.windowAlive = windowExists(s.tmuxWindowId);\n } catch {\n s.windowAlive = false;\n }\n }\n }\n\n let selectedSession: Session | null = null;\n let planContent = '';\n let goalContent = '';\n let logsContent = '';\n let logsCycles: CycleLog[] = [];\n let paneAlive = true;\n let contextFiles: string[] = [];\n\n if (selectedIdRef.current) {\n const statusRes = await send({ type: 'status', sessionId: selectedIdRef.current, cwd });\n if (mountedRef.current && 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 === selectedIdRef.current);\n paneAlive = cached?.windowAlive ?? false;\n }\n\n try {\n const pp = roadmapPath(cwd, selectedIdRef.current);\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(cwd, selectedIdRef.current);\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 ld = logsDir(cwd, selectedIdRef.current);\n if (existsSync(ld)) {\n const files = readdirSync(ld).filter(f => f.startsWith('cycle-')).sort();\n logsCycles = files.map(f => {\n const match = f.match(/cycle-(\\d+)\\.md$/);\n const cycle = match ? parseInt(match[1]!, 10) : 0;\n const content = readFileSync(join(ld, f), 'utf-8');\n return { cycle, 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(cwd, selectedIdRef.current);\n if (existsSync(cd)) {\n contextFiles = readdirSync(cd).filter(f => !f.startsWith('.')).sort();\n }\n } catch {\n // context dir may not exist yet\n }\n }\n\n if (mountedRef.current) {\n const next = { sessions, selectedSession, planContent, goalContent, logsContent, logsCycles, paneAlive, contextFiles, error: null };\n // Skip re-render if data hasn't changed (avoids full tree rebuild every poll cycle)\n setState((prev) => {\n if (JSON.stringify(prev) === JSON.stringify(next)) return prev;\n return next;\n });\n }\n } catch (err) {\n if (mountedRef.current) {\n setState((prev) => ({ ...prev, error: (err as Error).message }));\n }\n }\n }, [cwd]);\n\n // Regular polling interval\n useEffect(() => {\n mountedRef.current = true;\n poll();\n const interval = setInterval(poll, intervalMs);\n return () => {\n mountedRef.current = false;\n clearInterval(interval);\n };\n }, [cwd, intervalMs, poll]);\n\n // Immediate fetch when selected session changes\n useEffect(() => {\n if (selectedSessionId != null) {\n poll();\n }\n }, [selectedSessionId, poll]);\n\n return state;\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 } 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\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 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 { useInput } from 'ink';\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\nexport function useKeybindings(handlers: KeybindingHandlers, isActive: boolean): void {\n useInput(\n (input, key) => {\n if (key.upArrow) { handlers.onMoveUp(); return; }\n if (key.downArrow) { handlers.onMoveDown(); return; }\n if (key.leftArrow) { handlers.onLeft(); return; }\n if (key.rightArrow) { handlers.onRight(); return; }\n if (key.return) { handlers.onEnter(); return; }\n if (key.tab) { handlers.onTab(); return; }\n if (input === ' ') { handlers.onSpace(); return; }\n // vim-style tree navigation\n if (input === 'h') { handlers.onLeft(); return; }\n if (input === 'j') { handlers.onMoveDown(); return; }\n if (input === 'k') { handlers.onMoveUp(); return; }\n if (input === 'l') { handlers.onRight(); return; }\n if (input === 't') { handlers.onToggleLogs(); return; }\n if (input === 'm') { handlers.onMessage(); return; }\n if (input === 'w') { handlers.onGoToWindow(); return; }\n if (input === 'g') { handlers.onEditGoal(); return; }\n if (input === 'n') { handlers.onNewSession(); return; }\n if (input === 'c') { handlers.onClaude(); return; }\n if (input === 'p') { handlers.onOpenPlan(); return; }\n if (input === 'q') { handlers.onQuit(); return; }\n if (input === 'r') { handlers.onReRun(); return; }\n if (input === 'R') { handlers.onResume(); return; }\n if (input === 'C') { handlers.onContinue(); return; }\n if (input === 'x') { handlers.onRestartAgent(); return; }\n if (input === 'b') { handlers.onRollback(); return; }\n if (input === 'e') { handlers.onEdit(); return; }\n },\n { isActive },\n );\n}\n","import { useInput } from 'ink';\nimport type { InputMode } from '../components/InputBar.js';\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: 'shell-command' }\n | { type: 'jump-to-pane' }\n | { type: 'kill' }\n | { type: 'quit' }\n | { type: 'dismiss' };\n\nexport function useLeaderKey(mode: InputMode, onAction: (action: LeaderAction) => void): void {\n useInput(\n (input, key) => {\n if (key.escape) { onAction({ type: 'dismiss' }); return; }\n if (input === 'y') { onAction({ type: 'enter-copy-menu' }); return; }\n if (input === 'd') { onAction({ type: 'delete-session' }); return; }\n if (input === 'l') { onAction({ type: 'open-logs' }); return; }\n if (input === 'o') { onAction({ type: 'open-session-dir' }); return; }\n if (input === '/') { onAction({ type: 'search' }); return; }\n if (input === 'a') { onAction({ type: 'spawn-agent' }); return; }\n if (input === 'm') { onAction({ type: 'message-agent' }); return; }\n if (input === '?') { onAction({ type: 'help' }); return; }\n if (input === '!') { onAction({ type: 'shell-command' }); return; }\n if (input === 'j') { onAction({ type: 'jump-to-pane' }); return; }\n if (input === 'k') { onAction({ type: 'kill' }); return; }\n if (input === 'q') { onAction({ type: 'quit' }); return; }\n const digit = parseInt(input, 10);\n if (!isNaN(digit) && digit >= 1 && digit <= 9) {\n onAction({ type: 'jump-to-session', index: digit });\n return;\n }\n onAction({ type: 'dismiss' });\n },\n { isActive: mode === 'leader' },\n );\n\n useInput(\n (input, key) => {\n if (key.escape) { onAction({ type: 'dismiss' }); return; }\n if (input === 'p') { onAction({ type: 'copy-path' }); return; }\n if (input === 'C') { onAction({ type: 'copy-context' }); return; }\n if (input === 'l') { onAction({ type: 'copy-logs' }); return; }\n if (input === 's') { onAction({ type: 'copy-session-id' }); return; }\n onAction({ type: 'dismiss' });\n },\n { isActive: mode === 'copy-menu' },\n );\n\n useInput(\n (input, key) => {\n if (key.escape || input === '?') { onAction({ type: 'dismiss' }); return; }\n },\n { isActive: mode === 'help' },\n );\n}\n","import { execSync } from 'node:child_process';\n\nexport function copyToClipboard(text: string): void {\n execSync('pbcopy', { input: text });\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 '../hooks/usePolling.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 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 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 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"],"mappings":"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a,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa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","names":["useState","useEffect","useCallback","useMemo","useRef","Box","Text","useInput","emojiRegex","eastAsianWidth","Box","Text","Box","Text","jsx","cleaned","wrapped","Box","Text","jsx","jsxs","jsx","Box","Text","useMemo","Box","Text","jsx","buildLines","Box","Text","useMemo","useMemo","jsx","buildLines","useMemo","useMemo","jsx","buildLines","useMemo","useMemo","jsx","buildLines","useMemo","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","INNER","pad","INNER","jsxs","Box","jsx","Text","pad","useState","useEffect","useRef","readFileSync","existsSync","join","cwd","cwd","useState","useRef","existsSync","readFileSync","join","useEffect","useInput","useInput","execSync","join","cwd","join","readFileSync","existsSync","jsx","jsxs","cwd","useState","useRef","useMemo","useEffect","useCallback","useInput","existsSync","readFileSync","detailWidth","contentHeight","Box","Text","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/tui/terminal.ts","../src/tui/state.ts","../src/tui/app.ts","../src/tui/lib/tree.ts","../src/tui/lib/format.ts","../src/tui/input.ts","../src/tui/render.ts","../src/tui/lib/client.ts","../src/tui/lib/tmux.ts","../src/tui/lib/clipboard.ts","../src/tui/lib/tree-render.ts","../src/tui/panels/tree.ts","../src/tui/panels/detail.ts","../src/tui/panels/bottom.ts","../src/tui/panels/overlays.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\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 // 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 | 'resume'\n | 'continue'\n | 'rollback'\n | 'leader'\n | 'copy-menu'\n | 'delete-confirm'\n | 'spawn-agent'\n | 'search'\n | 'message-agent'\n | 'shell-command'\n | 'help';\n\nexport const INPUT_MODES = new Set<InputMode>([\n 'resume',\n 'continue',\n 'rollback',\n 'delete-confirm',\n 'spawn-agent',\n 'search',\n 'message-agent',\n 'shell-command',\n]);\n\nexport const OPTIONAL_INPUT = new Set<InputMode>(['resume', 'continue', 'search']);\n\nexport const PROMPTS: Partial<Record<InputMode, string>> = {\n resume: 'resume instructions (optional)',\n continue: 'new direction (optional)',\n rollback: 'cycle number',\n 'delete-confirm': \"type 'yes' to confirm delete:\",\n 'spawn-agent': 'agent instruction:',\n search: 'filter:',\n 'message-agent': 'message:',\n 'shell-command': '$ ',\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 targetAgentId: string | null;\n\n // UI\n notification: string | null;\n notificationTimer: ReturnType<typeof setTimeout> | null;\n showLogs: boolean;\n\n // Input bar\n inputText: string;\n inputCursorPos: number;\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 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\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 targetAgentId: null,\n notification: null,\n notificationTimer: null,\n showLogs: false,\n inputText: '',\n inputCursorPos: 0,\n detailScroll,\n logsScroll,\n sessions: [],\n selectedSession: null,\n planContent: '',\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 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 } 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 } from './render.js';\nimport { writeToStdout, startKeypressListener, onResize } from './terminal.js';\nimport { buildTree } from './lib/tree.js';\nimport { resolveReports } from './lib/reports.js';\nimport { send } from './lib/client.js';\nimport {\n windowExists,\n openEditorPopup,\n editInPopup,\n openCompanionPane,\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 { renderDetailContent, renderLogsContent, type DetailContext } from './panels/detail.js';\nimport { renderNotificationRow, renderInputBar, renderStatusLine } from './panels/bottom.js';\nimport { renderLeaderOverlay, renderCopyMenuOverlay, renderHelpOverlay } from './panels/overlays.js';\nimport { loadConfig } from '../shared/config.js';\nimport { roadmapPath, goalPath, logsDir, contextDir } from '../shared/paths.js';\nimport type { TreeNode } from './types/tree.js';\nimport type { Agent, Session } from '../shared/types.js';\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// ── 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 // Track selectedSessionId to detect changes across renders (for immediate poll)\n let prevSelectedSessionId: string | null | undefined = undefined;\n\n // ── Polling ─────────────────────────────────────────────────────────────────\n\n async function poll(): Promise<void> {\n try {\n let selectedSession: Session | null = null;\n let planContent = '';\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 // Cache window existence for non-completed sessions (avoids execSync in render path)\n for (const s of sessions) {\n if (s.status !== 'completed' && s.tmuxWindowId) {\n try {\n s.windowAlive = windowExists(s.tmuxWindowId);\n } catch {\n s.windowAlive = false;\n }\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 ld = logsDir(state.cwd, state.selectedSessionId);\n if (existsSync(ld)) {\n const files = readdirSync(ld)\n .filter((f) => f.startsWith('cycle-'))\n .sort();\n logsCycles = files.map((f) => {\n const match = f.match(/cycle-(\\d+)\\.md$/);\n const cycle = match ? parseInt(match[1]!, 10) : 0;\n const content = readFileSync(join(ld, f), 'utf-8');\n return { cycle, 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.goalContent = goalContent;\n state.logsContent = logsContent;\n state.logsCycles = logsCycles;\n state.paneAlive = paneAlive;\n state.contextFiles = contextFiles;\n state.error = null;\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.showLogs ? Math.floor(remaining * 0.6) : remaining;\n const logsWidth = state.showLogs ? remaining - detailWidth : 0;\n const contentHeight = state.rows - 3;\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.showLogs\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 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 }\n\n // Trigger immediate poll when session changes\n if (state.selectedSessionId !== prevSelectedSessionId) {\n prevSelectedSessionId = state.selectedSessionId;\n if (state.selectedSessionId !== null) {\n void poll();\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 // Render panels\n renderTreePanel(\n buf,\n treeRect,\n nodes,\n state.cursorIndex,\n state.mode === 'navigate' && state.focusPane === 'tree',\n );\n\n const detailCtx: DetailContext = {\n nodes,\n session: state.selectedSession,\n agents,\n reportBlocks,\n detailReportBlocks,\n contextFileContent,\n };\n renderDetailContent(buf, detailRect, state, detailCtx);\n\n if (logsRect) {\n renderLogsContent(buf, logsRect, state);\n }\n\n // Bottom rows\n renderNotificationRow(buf, bottomY, state.notification, state.error);\n renderInputBar(buf, bottomY + 1, state);\n renderStatusLine(buf, bottomY + 2, state, cursorNode?.type);\n\n // Overlays (rendered AFTER panels — overwrites panel content)\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\n // Flush diff to stdout\n const out = flushFrame(buf.lines, prevFrame);\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 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 startKeypressListener((input, key) => {\n handleKeypress(input, key, state, inputActions);\n });\n\n 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 requestRender();\n });\n\n // Initial poll + recurring interval\n void poll();\n setInterval(() => void poll(), 2500);\n\n // Initial render\n requestRender();\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 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 reportCount: agent.reports.length,\n mergeStatus: agent.mergeStatus,\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 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 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 let remaining = rawLine;\n while (stringWidth(remaining) > width) {\n // Find a break point that fits within display width\n let breakAt = -1;\n // Start from an estimated position and scan for a space\n let estimate = Math.min(remaining.length, width);\n for (let i = estimate; i >= 0; i--) {\n if (remaining[i] === ' ' && stringWidth(remaining.slice(0, i)) <= width) {\n breakAt = i;\n break;\n }\n }\n if (breakAt <= 0) {\n // No space found — find the max chars that fit\n breakAt = remaining.length;\n for (let i = 1; i <= remaining.length; i++) {\n if (stringWidth(remaining.slice(0, i)) > width) {\n breakAt = i - 1;\n break;\n }\n }\n if (breakAt <= 0) breakAt = 1; // always make progress\n }\n result.push(remaining.slice(0, breakAt));\n remaining = remaining.slice(breakAt).trimStart();\n }\n if (remaining) result.push(remaining);\n }\n return result;\n}\n","import type { Key } from './terminal.js';\nimport {\n type AppState,\n INPUT_MODES,\n OPTIONAL_INPUT,\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 } from '../shared/paths.js';\nimport type { Request } from '../shared/protocol.js';\nimport { findParentIndex } from './lib/tree.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: '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 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// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction handleCancel(state: AppState): void {\n state.mode = 'navigate';\n state.targetAgentId = null;\n state.inputText = '';\n state.inputCursorPos = 0;\n requestRender();\n}\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// ── handleSubmit ──────────────────────────────────────────────────────────────\n\nasync function handleSubmit(text: string, state: AppState, actions: InputActions): Promise<void> {\n const selectedSessionId = state.selectedSessionId;\n\n switch (state.mode) {\n case 'resume': {\n if (!selectedSessionId) break;\n actions.sendAndNotify(\n { type: 'resume', sessionId: selectedSessionId, cwd: state.cwd, message: text || undefined },\n 'Session resumed',\n );\n break;\n }\n\n case 'continue': {\n if (!selectedSessionId) break;\n try {\n const contRes = await actions.send({ type: 'continue', sessionId: selectedSessionId });\n if (!contRes.ok) { notify(state, `Error: ${contRes.error}`); break; }\n actions.sendAndNotify(\n { type: 'resume', sessionId: selectedSessionId, cwd: state.cwd, message: text || undefined },\n 'Session continued',\n );\n } catch (err) {\n notify(state, `Error: ${(err as Error).message}`);\n }\n break;\n }\n\n case 'rollback': {\n if (!selectedSessionId) break;\n const toCycle = parseInt(text, 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 break;\n }\n\n case 'delete-confirm': {\n if (!selectedSessionId) break;\n if (text !== 'yes') { notify(state, 'Delete cancelled (type \"yes\" to confirm)'); break; }\n actions.sendAndNotify(\n { type: 'delete', sessionId: selectedSessionId, cwd: state.cwd },\n 'Session deleted',\n );\n break;\n }\n\n case 'spawn-agent': {\n if (!selectedSessionId) break;\n if (!text.trim()) { notify(state, 'Instruction required'); break; }\n actions.sendAndNotify(\n {\n type: 'spawn',\n sessionId: selectedSessionId,\n agentType: 'default',\n name: 'agent',\n instruction: text,\n },\n 'Agent spawned',\n );\n break;\n }\n\n case 'search': {\n state.searchFilter = text.trim() || null;\n break;\n }\n\n case 'message-agent': {\n if (!selectedSessionId || !state.targetAgentId) break;\n actions.sendAndNotify(\n { type: 'message', sessionId: selectedSessionId, content: text, source: { type: 'agent', agentId: state.targetAgentId } },\n `Message sent to ${state.targetAgentId}`,\n );\n state.targetAgentId = null;\n break;\n }\n\n case 'shell-command': {\n if (!text.trim()) break;\n try {\n actions.openShellPopup(state.cwd, text);\n } catch {\n notify(state, 'Failed to run shell command');\n }\n break;\n }\n }\n\n state.mode = 'navigate';\n state.inputText = '';\n state.inputCursorPos = 0;\n requestRender();\n}\n\n// ── handleInputBarKey ─────────────────────────────────────────────────────────\n\nfunction handleInputBarKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n if (key.return) {\n if (OPTIONAL_INPUT.has(state.mode) || state.inputText.trim()) {\n void handleSubmit(state.inputText.trim(), state, actions);\n }\n return;\n }\n\n if (key.escape) {\n handleCancel(state);\n return;\n }\n\n if (key.leftArrow) {\n state.inputCursorPos = Math.max(0, state.inputCursorPos - 1);\n requestRender();\n return;\n }\n\n if (key.rightArrow) {\n state.inputCursorPos = Math.min(state.inputText.length, state.inputCursorPos + 1);\n requestRender();\n return;\n }\n\n if (key.ctrl && input === 'a') {\n state.inputCursorPos = 0;\n requestRender();\n return;\n }\n\n if (key.ctrl && input === 'e') {\n state.inputCursorPos = state.inputText.length;\n requestRender();\n return;\n }\n\n if (key.ctrl && input === 'k') {\n state.inputText = state.inputText.slice(0, state.inputCursorPos);\n // cursorPos stays the same (now at end)\n requestRender();\n return;\n }\n\n if (key.ctrl && input === 'u') {\n state.inputText = state.inputText.slice(state.inputCursorPos);\n state.inputCursorPos = 0;\n requestRender();\n return;\n }\n\n if (key.backspace) {\n if (state.inputCursorPos > 0) {\n state.inputText =\n state.inputText.slice(0, state.inputCursorPos - 1) +\n state.inputText.slice(state.inputCursorPos);\n state.inputCursorPos -= 1;\n requestRender();\n }\n return;\n }\n\n if (key.delete) {\n if (state.inputCursorPos < state.inputText.length) {\n state.inputText =\n state.inputText.slice(0, state.inputCursorPos) +\n state.inputText.slice(state.inputCursorPos + 1);\n requestRender();\n }\n return;\n }\n\n if (input && !key.ctrl && !key.meta) {\n state.inputText =\n state.inputText.slice(0, state.inputCursorPos) +\n input +\n state.inputText.slice(state.inputCursorPos);\n state.inputCursorPos += input.length;\n requestRender();\n }\n}\n\n// ── handleReportDetailKey ─────────────────────────────────────────────────────\n\nfunction handleReportDetailKey(input: string, key: Key, state: AppState, actions: InputActions): void {\n if (key.escape || key.return) {\n handleCancel(state);\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 state.mode = 'delete-confirm';\n requestRender();\n return;\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 requestRender();\n return;\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 state.mode = 'spawn-agent';\n requestRender();\n return;\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 state.targetAgentId = agent.id;\n state.mode = 'message-agent';\n requestRender();\n return;\n }\n\n case 'help':\n state.mode = 'help';\n requestRender();\n return;\n\n case 'shell-command': {\n if (!selectedSessionId) { notify(state, 'No session selected'); break; }\n state.mode = 'shell-command';\n requestRender();\n return;\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 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 === '!') { 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\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 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 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 } else if (state.focusPane === 'detail') {\n state.focusPane = state.showLogs ? '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 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\n if (input === 'w') {\n if (!session || !state.selectedSessionId) { notify(state, 'No session selected'); return; }\n\n if (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 — reopen via daemon\n void (async () => {\n try {\n const res = await actions.send({ type: 'reopen-window', sessionId: state.selectedSessionId!, cwd: state.cwd });\n if (!res.ok) { notify(state, `Error: ${res.error}`); return; }\n const data = res.data as { tmuxSessionName: string; tmuxWindowId: string };\n actions.switchToSession(data.tmuxSessionName);\n actions.selectWindow(data.tmuxWindowId);\n } catch (err) {\n notify(state, `Error: ${(err as Error).message}`);\n }\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 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: enter resume mode\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 state.mode = 'resume';\n state.inputText = '';\n state.inputCursorPos = 0;\n requestRender();\n return;\n }\n\n // C: enter continue mode\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 state.mode = 'continue';\n state.inputText = '';\n state.inputCursorPos = 0;\n requestRender();\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: enter rollback mode — pre-fill with cycle number if cursor is on a cycle node\n if (input === 'b') {\n if (!state.selectedSessionId) { notify(state, 'No session selected'); return; }\n const defaultText = cursorNode?.type === 'cycle' ? String(cursorNode.cycleNumber) : undefined;\n state.mode = 'rollback';\n if (defaultText) {\n state.inputText = defaultText;\n state.inputCursorPos = defaultText.length;\n } else {\n state.inputText = '';\n state.inputCursorPos = 0;\n }\n requestRender();\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 // t: toggle logs panel\n if (input === 't') {\n if (state.showLogs) {\n if (state.focusPane === 'logs') state.focusPane = 'detail';\n state.logsScroll.reset();\n }\n state.showLogs = !state.showLogs;\n requestRender();\n return;\n }\n}\n\n// ── Main dispatch ─────────────────────────────────────────────────────────────\n\nexport function handleKeypress(input: string, key: Key, state: AppState, actions: InputActions): void {\n if (INPUT_MODES.has(state.mode)) {\n handleInputBarKey(input, key, state, actions);\n } else if (state.mode === 'leader' || state.mode === 'copy-menu' || state.mode === 'help') {\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 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\nexport function createFrameBuffer(width: number, height: number): FrameBuffer {\n const blank = ' '.repeat(width);\n return {\n lines: Array.from({ length: height }, () => blank),\n width,\n height,\n };\n}\n\n// ─── Frame Diffing (§1.3) ────────────────────────────────────────────────────\n\nexport function flushFrame(frame: string[], prevFrame: 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 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// ─── 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 const prefix = sliceDisplayCols(existing, 0, x);\n const suffix = sliceDisplayCols(existing, x + contentDisplayWidth, buf.width);\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 match = content.slice(i).match(/^\\x1b\\[[0-9;]*[a-zA-Z]/);\n if (match) {\n out += match[0];\n i += match[0].length;\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 = 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 writeAt(buf, x, y, out);\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\nexport function renderPanel(\n buf: FrameBuffer,\n rect: Rect,\n lines: DetailLine[],\n scrollOffset: number,\n focused: boolean,\n borderColor: string,\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. Windowed slice (same logic as ScrollablePanel.tsx:31-38)\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 const visible = lines.slice(effectiveOffset, effectiveOffset + viewableH);\n\n // 4. Render visible lines\n for (let i = 0; i < visible.length; i++) {\n const ansi = renderLine(visible[i]!);\n writeClipped(buf, innerX, innerY + i, ansi, innerW);\n }\n\n // 5. 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// ─── 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): string {\n let out = '';\n let col = 0;\n let i = 0;\n let inSlice = false;\n let hasOpenSGR = false;\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 match = s.slice(i).match(/^\\x1b\\[[0-9;]*[a-zA-Z]/);\n if (match) {\n if (col >= start) {\n out += match[0];\n // Track if we have open SGR (non-reset)\n hasOpenSGR = match[0] !== '\\x1b[0m' && match[0] !== '\\x1b[m';\n }\n i += match[0].length;\n continue;\n }\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const chWidth = 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 return out;\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 } 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\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 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 { 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","import type { FrameBuffer, Rect } from '../render.js';\nimport { drawBorder, writeClipped, colorToSGR } from '../render.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 mergeStatusDisplay,\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 = node.completedAt\n ? formatDuration(node.timestamp, node.completedAt)\n : 'running';\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.spawnedAt, node.completedAt);\n const durClr = durationColor(node.spawnedAt, node.completedAt) || 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 // Worktree indicator: ⎇ while running/pending, merge status icon when done\n let suffix: string | undefined;\n let suffixColor: string | undefined;\n if (node.mergeStatus) {\n const ms = node.mergeStatus === 'pending'\n ? { icon: '⎇', color: 'yellow' }\n : mergeStatusDisplay(node.mergeStatus);\n if (ms) {\n suffix = ms.icon;\n suffixColor = ms.color;\n }\n }\n\n const suffixLen = suffix ? 2 : 0; // icon + space\n const maxLabel = Math.max(8, maxWidth - dur.length - suffixLen - 4);\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): 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\n const maxVisible = Math.max(1, innerH);\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 = 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 // worktree 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","import {\n renderPanel,\n drawBorder,\n writeCenter,\n type FrameBuffer,\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 mergeStatusDisplay,\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): 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 const conflicts = agents.filter((a) => a.mergeStatus === 'conflict');\n\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 // Conflict banner\n if (conflicts.length > 0) {\n lines.push(\n singleLine(\n ` ⚠ ${conflicts.length} merge conflict${conflicts.length > 1 ? 's' : ''}`,\n { color: 'red', bold: true },\n ),\n );\n lines.push(\n singleLine(\n ' resolve in worktree, then [x] restart agent',\n { color: 'red', dim: true },\n ),\n );\n }\n\n // Plan section\n lines.push(singleLine(' '));\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 // 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.timestamp, cycle.completedAt);\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 = cycle.completedAt\n ? formatDuration(cycle.timestamp, cycle.completedAt)\n : 'running';\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\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.spawnedAt, agent.completedAt);\n const durClrRaw = durationColor(agent.spawnedAt, agent.completedAt);\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.spawnedAt, agent.completedAt);\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const nameLabel = agentDisplayName(agent);\n const maxMergeLines = 3;\n\n lines.push([\n seg(' '),\n seg(icon, { color }),\n seg(` ${agent.id} · ${nameLabel}`, { bold: true }),\n ]);\n\n const merge = agent.mergeStatus ? mergeStatusDisplay(agent.mergeStatus) : null;\n lines.push([\n seg(' '),\n seg(agent.status, { color }),\n seg(` · ${dur} · ${agent.agentType}`, { dim: true }),\n ...(merge\n ? [seg(' · ', { dim: true }), seg(`${merge.icon} ${merge.label}`, { color: merge.color })]\n : agent.mergeStatus\n ? [seg(' · ', { dim: true }), seg(agent.mergeStatus, { dim: true })]\n : []),\n ]);\n\n if (agent.killedReason) {\n lines.push(singleLine(` ⚠ ${agent.killedReason}`, { color: 'red' }));\n }\n\n if (agent.mergeStatus === 'conflict' && agent.mergeDetails) {\n for (const ml of wrapText(agent.mergeDetails, contentWidth - 6).slice(0, maxMergeLines)) {\n lines.push(singleLine(` ⚠ ${ml}`, { color: 'red' }));\n }\n }\n\n if (agent.mergeStatus === 'conflict') {\n lines.push(singleLine(' resolve conflicts in worktree dir, then restart', { color: 'red', dim: true }));\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.paneId) {\n lines.push(singleLine(` Pane: ${agent.paneId}`, { dim: true }));\n }\n if (agent.worktreePath) {\n lines.push(singleLine(` Worktree: ${agent.worktreePath}`, { dim: true }));\n }\n if (agent.branchName) {\n lines.push(singleLine(` Branch: ${agent.branchName}`, { dim: true }));\n }\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.spawnedAt, agent.completedAt);\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 renderDetailContent(\n buf: FrameBuffer,\n rect: Rect,\n state: AppState,\n detailCtx: DetailContext,\n): void {\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 renderPanel(buf, rect, lines, scrollOffset, focused, 'cyan');\n return;\n }\n }\n\n // No cursor / no session → empty state\n const cursorNode: TreeNode | undefined = detailCtx.nodes[state.cursorIndex];\n if (!cursorNode || !session) {\n drawBorder(buf, rect.x, rect.y, rect.w, rect.h, 'gray');\n const midRow = rect.y + Math.floor(rect.h / 2);\n writeCenter(buf, midRow, '\\x1b[2mSelect a session to view details\\x1b[0m');\n return;\n }\n\n let lines: DetailLine[];\n let borderColor = 'gray';\n\n switch (cursorNode.type) {\n case 'session': {\n lines = buildSessionLines(session, state.planContent, state.goalContent, rect.w, state.paneAlive);\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);\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);\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);\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);\n break;\n }\n }\n\n renderPanel(buf, rect, lines, scrollOffset, focused, borderColor);\n}\n\nexport function renderLogsContent(\n buf: FrameBuffer,\n rect: Rect,\n state: AppState,\n): void {\n const focused = state.focusPane === 'logs';\n const scrollOffset = state.logsScroll.offset;\n\n if (state.logsCycles.length === 0) {\n drawBorder(buf, rect.x, rect.y, rect.w, rect.h, focused ? 'blue' : 'gray');\n const midRow = rect.y + Math.floor(rect.h / 2);\n writeCenter(buf, midRow, '\\x1b[2mNo logs\\x1b[0m');\n return;\n }\n\n const lines = buildLogsLines(state.logsCycles, rect.w);\n renderPanel(buf, rect, lines, scrollOffset, focused, 'gray');\n}\n","import { writeClipped, type FrameBuffer } from '../render.js';\nimport { ansiBold, ansiDim } from '../lib/format.js';\nimport type { AppState } from '../state.js';\nimport { INPUT_MODES, PROMPTS } from '../state.js';\nimport type { TreeNodeType } from '../types/tree.js';\n\n// ─── Notification Row ─────────────────────────────────────────────────────────\n\nexport function renderNotificationRow(\n buf: FrameBuffer,\n y: number,\n notification: string | null,\n error: string | null,\n): void {\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 const content = `\\x1b[1;33m${icon} ${notification}\\x1b[0m`;\n writeClipped(buf, 1, y, content, buf.width - 2);\n } else if (error !== null) {\n const content = `\\x1b[31m⚠ ${error}\\x1b[0m`;\n writeClipped(buf, 1, y, content, buf.width - 2);\n }\n}\n\n// ─── Input Bar ────────────────────────────────────────────────────────────────\n\nexport function renderInputBar(\n buf: FrameBuffer,\n y: number,\n state: AppState,\n): void {\n const { mode, inputText, inputCursorPos } = state;\n\n if (mode === 'navigate') {\n const content = `\\x1b[2mPress [m] to message orchestrator, [n] for new session\\x1b[0m`;\n writeClipped(buf, 1, y, content, buf.width - 2);\n return;\n }\n\n if (\n mode === 'report-detail' ||\n mode === 'leader' ||\n mode === 'copy-menu' ||\n mode === 'help' ||\n !INPUT_MODES.has(mode)\n ) {\n return;\n }\n\n const prompt = PROMPTS[mode] ?? mode;\n const cursorChar = inputCursorPos < inputText.length ? inputText[inputCursorPos]! : ' ';\n const before = inputText.slice(0, inputCursorPos);\n const after = inputText.slice(inputCursorPos + 1);\n\n const content =\n `\\x1b[33m${prompt} > \\x1b[0m` +\n before +\n `\\x1b[7m${cursorChar}\\x1b[0m` +\n after +\n `\\x1b[2m (enter to send, esc to cancel)\\x1b[0m`;\n\n writeClipped(buf, 1, y, content, buf.width - 2);\n}\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 } = state;\n\n if (mode === 'report-detail') return;\n\n let content: string;\n\n 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 (mode === 'delete-confirm') {\n content = `\\x1b[1;31mDELETE\\x1b[0m` + D(\" type 'yes' to confirm, [esc] to cancel\");\n } else if (mode === 'spawn-agent') {\n content = `\\x1b[1;32mSPAWN\\x1b[0m` + D(' enter agent instruction, [esc] to cancel');\n } else if (mode === 'search') {\n content = `\\x1b[1;34mSEARCH\\x1b[0m` + D(' type to filter, enter to apply, [esc] to cancel');\n } else if (mode === 'message-agent') {\n content = `\\x1b[1;36mMESSAGE\\x1b[0m` + D(' enter message for agent, [esc] to cancel');\n } else if (mode === 'shell-command') {\n content = `\\x1b[1;35mSHELL\\x1b[0m` + D(' enter command, [esc] to cancel');\n } else if (mode !== 'navigate') {\n content = D('[enter] send [esc] cancel');\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 logs ') +\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 logs ') +\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 { drawBorder, writeClipped, type FrameBuffer } from '../render.js';\nimport { ansiColor, ansiDim } from '../lib/format.js';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst LEADER_WIDTH = 26;\nconst LEADER_HEIGHT = 19; // 17 content lines + 2 border lines\nconst COPY_HEIGHT = 9; // 7 content lines + 2 border lines\nconst HELP_WIDTH = 62;\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 ' 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', ' w go to window', innerWidth),\n helpRow(' c claude companion', ' 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","import { setupTerminal } from './terminal.js';\nimport { createAppState } from './state.js';\nimport { startApp } from './app.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();\nconst cleanup = setupTerminal();\nconst state = createAppState(cwd);\nstartApp(state, cleanup);\n"],"mappings":"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","names":["cleanup","key","cwd","state","readFileSync","existsSync","join","cwd","state","stringWidth","prevFrame","join","join","cwd","execSync","cleaned","wrapped","state","lines","state","content","state","cleanup","existsSync","readFileSync","join","out"]}
|