sisyphi 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 } 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, cleanMarkdown, stripFrontmatter, seg, singleLine, 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 // 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 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 } 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 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 } 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?.tmuxWindowId) { notify('No tmux window'); return; }\n if (session.tmuxSessionName) switchToSession(session.tmuxSessionName);\n selectWindow(session.tmuxWindowId);\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 // 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 onClose={handleCancel}\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 badge = specificBlock.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = specificBlock.type === 'final' ? 'cyan' : 'yellow';\n const reportContentLines: DetailLine[] = [\n [seg(' '), seg(badge, { color: badgeColor }), seg(` ${agent.id} · ${agent.name !== agent.id ? agent.name : agent.agentType}`, { 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 label = msg.source.type === 'user' ? 'You' : msg.source.type === 'agent' ? msg.source.agentId : 'system';\n const labelColor = msg.source.type === 'user' ? 'yellow' : msg.source.type === 'agent' ? 'cyan' : 'gray';\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(cleanMarkdown(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} 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 = node.name !== node.agentId ? node.name : 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 wrapText(text: string, width: number): string[] {\n if (width <= 0) return text.split('\\n');\n const result: string[] = [];\n for (const rawLine of text.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 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 modeColor = mode === 'planning' ? 'blue' : mode === 'implementation' ? 'green' : 'cyan';\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: modeColor }), 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 — kill or 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(cleanMarkdown(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 label =\n msg.source.type === 'user'\n ? 'You'\n : msg.source.type === 'agent'\n ? msg.source.agentId\n : '⚙ system';\n const labelColor =\n msg.source.type === 'user' ? 'yellow' : msg.source.type === 'agent' ? 'cyan' : 'gray';\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 = cycle.mode === 'planning' ? 'blue' : cycle.mode === 'implementation' ? 'green' : 'cyan';\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 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: cycle.mode === 'planning' ? 'blue' : cycle.mode === 'implementation' ? 'green' : 'cyan',\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 = agent.name !== agent.id ? agent.name : agent.agentType;\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 cleanMarkdown,\n seg,\n singleLine,\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 = agent.name !== agent.id ? agent.name : agent.agentType;\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 mergeSegs: ReturnType<typeof seg>[] = [];\n if (agent.mergeStatus) {\n mergeSegs.push(seg(' · ', { dim: true }));\n switch (agent.mergeStatus) {\n case 'merged':\n mergeSegs.push(seg('⊕ merged', { color: 'green' }));\n break;\n case 'pending':\n mergeSegs.push(seg('◌ pending', { color: 'yellow' }));\n break;\n case 'no-changes':\n mergeSegs.push(seg('∅ no changes', { color: 'gray' }));\n break;\n case 'conflict':\n mergeSegs.push(seg('⚠ conflict', { color: 'red' }));\n break;\n default:\n mergeSegs.push(seg(agent.mergeStatus, { dim: true }));\n }\n }\n lines.push([\n seg(' '),\n seg(agent.status, { color }),\n seg(` · ${dur} · ${agent.agentType}`, { dim: true }),\n ...mergeSegs,\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 badge = block.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = block.type === 'final' ? 'cyan' : 'yellow';\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(cleanMarkdown(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 badge = report.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = report.type === 'final' ? 'cyan' : 'yellow';\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, { useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { Agent } from '../../shared/types.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport { formatDuration, formatTime, divider, statusColor, agentStatusIcon, wrapText } from '../lib/format.js';\n\ninterface Props {\n agent: Agent;\n reportBlocks: ReportBlock[];\n width: number;\n height: number;\n onClose: () => void;\n}\n\nexport function ReportView({ agent, reportBlocks, width, height, onClose }: Props) {\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const contentWidth = width - 6; // border + padding + gutter\n\n // Build the rendered lines (memoized since report content is static)\n const lines = useMemo(() => {\n const lines: Array<{ text: string; color?: string; bold?: boolean; dim?: boolean }> = [];\n\n if (reportBlocks.length === 0) {\n lines.push({ text: '', dim: true });\n lines.push({ text: ' No reports submitted yet.', dim: true });\n lines.push({ text: '', dim: true });\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({ text: '' });\n lines.push({ text: ` ${divider(contentWidth - 2, '·')}`, dim: true });\n lines.push({ text: '' });\n }\n\n // Report header\n const badge = report.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = report.type === 'final' ? 'cyan' : 'yellow';\n lines.push({\n text: ` ${badge} ${time}`,\n color: badgeColor,\n bold: report.type === 'final',\n });\n lines.push({ text: '' });\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({ text: ` ${line}` });\n }\n }\n\n lines.push({ text: '' });\n return lines;\n }, [reportBlocks, contentWidth]);\n\n // Scroll bounds\n const viewableHeight = height - 7; // header (4) + footer (2) + border\n const maxScroll = Math.max(0, lines.length - viewableHeight);\n\n useInput((input, key) => {\n if (key.escape || key.return) {\n onClose();\n return;\n }\n if (key.upArrow) {\n setScrollOffset((o) => Math.max(0, o - 1));\n return;\n }\n if (key.downArrow) {\n setScrollOffset((o) => Math.min(maxScroll, o + 1));\n return;\n }\n // Page up/down with shift or brackets\n if (input === '[' || (key.upArrow && key.shift)) {\n setScrollOffset((o) => Math.max(0, o - Math.floor(viewableHeight / 2)));\n return;\n }\n if (input === ']' || (key.downArrow && key.shift)) {\n setScrollOffset((o) => Math.min(maxScroll, o + Math.floor(viewableHeight / 2)));\n return;\n }\n });\n\n // Visible slice\n const visible = lines.slice(scrollOffset, scrollOffset + viewableHeight);\n\n // Scroll position indicator\n const scrollPct = maxScroll > 0 ? Math.round((scrollOffset / maxScroll) * 100) : 100;\n const totalReports = agent.reports.length;\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const dur = formatDuration(agent.spawnedAt, agent.completedAt);\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n height={height}\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n >\n {/* Header */}\n <Text bold>\n {' '}\n <Text color={color}>{icon}</Text>\n {' '}\n {agent.id}\n {' '}\n <Text dimColor>·</Text>\n {' '}\n {agent.name !== agent.id ? agent.name : agent.agentType}\n </Text>\n <Text dimColor>\n {' '}{agent.status} · {dur} · {agent.agentType} · {totalReports} report{totalReports !== 1 ? 's' : ''}\n </Text>\n <Text dimColor>{' ' + divider(contentWidth - 2)}</Text>\n\n {/* Scrollable content */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {visible.map((line, i) => (\n <Text\n key={i}\n color={line.color}\n bold={line.bold}\n dimColor={line.dim}\n >\n {line.text}\n </Text>\n ))}\n </Box>\n\n {/* Footer */}\n <Text dimColor>{' ' + divider(contentWidth - 2)}</Text>\n <Text dimColor>\n {' '}[esc] back [↑↓] scroll [{ }] page\n {' '}\n <Text>{scrollPct}%</Text>\n {maxScroll > 0 && <Text dimColor> · {lines.length} lines</Text>}\n </Text>\n </Box>\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} &gt; </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 &apos;yes&apos; 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 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 sourceLabel =\n msg.source.type === 'user'\n ? 'You'\n : msg.source.type === 'agent'\n ? msg.source.agentId\n : 'system';\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,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,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,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aACV,QAAU,aAAa,aAAa,QACpC,SAAU,aACV,SAAU,aACV,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aACV,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,WACrC,WAAY,aAAa,aAAa,SAAW;AACpD,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,SAAS,WAAW;AACxC,UAAI,OAAO,KAAK,eAAe,SAAS;AACxC,UAAI,QAAQ,OAAO,QAAQ,OAAO,QAAQ,KAAK;AAC7C,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAGA,aAAS,cAAc,QAAQ;AAC7B,aAAO,OAAO,MAAM,kDAAkD,KAAK,CAAC;AAAA,IAC9E;AAEA,QAAI,SAAS,SAAS,QAAQ;AAC5B,UAAI,aAAa,cAAc,MAAM;AACrC,UAAI,MAAM;AACV,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,MAAM,KAAK,gBAAgB,WAAW,CAAC,CAAC;AAAA,MAChD;AACA,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,SAAS,MAAM,OAAO,KAAK;AACrC,gBAAU,IAAI,OAAO,IAAI;AACzB,cAAQ,QAAQ,QAAQ;AACxB,YAAM,MAAM,MAAM;AAClB,UAAI,QAAQ,GAAG;AACX,gBAAQ,UAAU;AAAA,MACtB;AACA,UAAI,MAAM,GAAG;AACT,cAAM,UAAU;AAAA,MACpB;AACA,UAAI,SAAS;AACb,UAAI,SAAS;AACb,UAAI,QAAQ,cAAc,IAAI;AAC9B,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAI,OAAO,MAAM,CAAC;AAClB,YAAI,UAAU,IAAI,OAAO,IAAI;AAC7B,YAAI,UAAU,SAAS,WAAW,IAAI,IAAI,IAAI;AAC1C,cAAI,SAAS,WAAW,KAAK;AACzB,sBAAU;AAAA,UACd,OAAO;AACH;AAAA,UACJ;AAAA,QACJ;AACA,kBAAU;AAAA,MACZ;AACA,aAAO;AAAA,IACT;AAAA;AAAA;;;ACtTA;AAAA;AAAA;AAEA,WAAO,UAAU,WAAY;AAE3B,aAAO;AAAA,IACT;AAAA;AAAA;;;ACJA,SAAS,cAAc;;;ACDvB,SAAgB,YAAAA,WAAU,aAAAC,YAAW,eAAAC,cAAa,WAAAC,UAAS,UAAAC,eAAc;AACzE,SAAS,OAAAC,OAAK,QAAAC,QAAM,QAAQ,iBAAiB;;;ACA7C,SAAS,KAAK,YAAY;;;ACKnB,SAAS,iBAAiB,MAAgB,OAAmB,OAAuB;AACzF,MAAI,KAAK,UAAU,GAAG;AACpB,WAAO,KAAK,aAAc,KAAK,WAAW,YAAO,YAAQ;AAAA,EAC3D;AAEA,QAAM,QAAkB,CAAC;AAGzB,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACnC,UAAM,KAAK,sBAAsB,OAAO,OAAO,CAAC,IAAI,OAAO,SAAI;AAAA,EACjE;AAGA,QAAM,KAAK,cAAc,OAAO,KAAK,IAAI,iBAAO,cAAI;AAGpD,MAAI,KAAK,YAAY;AACnB,UAAM,KAAK,KAAK,WAAW,YAAO,SAAI;AAAA,EACxC,OAAO;AACL,UAAM,KAAK,GAAG;AAAA,EAChB;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;AAGA,SAAS,cAAc,OAAmB,OAAwB;AAChE,QAAM,QAAQ,MAAM,KAAK,EAAG;AAC5B,WAAS,IAAI,QAAQ,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC7C,QAAI,MAAM,CAAC,EAAG,UAAU,MAAO,QAAO;AACtC,QAAI,MAAM,CAAC,EAAG,QAAQ,MAAO,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAGA,SAAS,sBAAsB,OAAmB,OAAe,OAAwB;AAEvF,WAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;AACnC,QAAI,MAAM,CAAC,EAAG,UAAU,OAAO;AAC7B,aAAO,cAAc,OAAO,CAAC;AAAA,IAC/B;AACA,QAAI,MAAM,CAAC,EAAG,QAAQ,MAAO,QAAO;AAAA,EACtC;AACA,SAAO;AACT;;;ACnDe,SAAR,UAA2B,EAAC,YAAY,MAAK,IAAI,CAAC,GAAG;AAE3D,QAAM,KAAK;AAGX,QAAM,MAAM,0BAA0B,EAAE;AAGxC,QAAM,MAAM;AAEZ,QAAM,UAAU,GAAG,GAAG,IAAI,GAAG;AAE7B,SAAO,IAAI,OAAO,SAAS,YAAY,SAAY,GAAG;AACvD;;;ACXA,IAAM,QAAQ,UAAU;AAET,SAAR,UAA2B,QAAQ;AACzC,MAAI,OAAO,WAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,gCAAgC,OAAO,MAAM,IAAI;AAAA,EACtE;AAGA,MAAI,CAAC,OAAO,SAAS,MAAQ,KAAK,CAAC,OAAO,SAAS,MAAQ,GAAG;AAC7D,WAAO;AAAA,EACR;AAKA,SAAO,OAAO,QAAQ,OAAO,EAAE;AAChC;;;ACjBA,4BAA2B;AAC3B,yBAAuB;AAER,SAAR,YAA6B,QAAQ,UAAU,CAAC,GAAG;AACzD,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG;AACtD,WAAO;AAAA,EACR;AAEA,YAAU;AAAA,IACT,mBAAmB;AAAA,IACnB,GAAG;AAAA,EACJ;AAEA,WAAS,UAAU,MAAM;AAEzB,MAAI,OAAO,WAAW,GAAG;AACxB,WAAO;AAAA,EACR;AAEA,WAAS,OAAO,YAAQ,mBAAAC,SAAW,GAAG,IAAI;AAE1C,QAAM,0BAA0B,QAAQ,oBAAoB,IAAI;AAChE,MAAI,QAAQ;AAEZ,aAAW,aAAa,QAAQ;AAC/B,UAAM,YAAY,UAAU,YAAY,CAAC;AAGzC,QAAI,aAAa,MAAS,aAAa,OAAQ,aAAa,KAAO;AAClE;AAAA,IACD;AAGA,QAAI,aAAa,OAAS,aAAa,KAAO;AAC7C;AAAA,IACD;AAEA,UAAM,OAAO,sBAAAC,QAAe,eAAe,SAAS;AACpD,YAAQ,MAAM;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACJ,iBAAS;AACT;AAAA,MACD,KAAK;AACJ,iBAAS;AACT;AAAA,MACD;AACC,iBAAS;AAAA,IACX;AAAA,EACD;AAEA,SAAO;AACR;;;ACjDO,SAAS,cAAc,KAAqB;AACjD,QAAM,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,QAAQ;AAChD,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,MAAI,QAAQ,EAAG,QAAO,GAAG,KAAK;AAC9B,MAAI,UAAU,EAAG,QAAO,GAAG,OAAO;AAClC,SAAO;AACT;AAEO,SAAS,WAAW,KAAqB;AAC9C,QAAM,IAAI,IAAI,KAAK,GAAG;AACtB,SAAO,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAClG;AAEO,SAAS,SAAS,MAAc,KAAqB;AAE1D,QAAM,QAAQ,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,QAAG,EAAE,QAAQ,MAAM,QAAG,EAAE,QAAQ,WAAC,2BAAuB,IAAE,GAAE,EAAE;AACnH,MAAI,MAAM,EAAG,QAAO,MAAM,MAAM,GAAG,GAAG;AACtC,QAAM,IAAI,YAAY,KAAK;AAC3B,MAAI,KAAK,IAAK,QAAO;AAErB,MAAI,SAAS;AACb,SAAO,YAAY,MAAM,IAAI,MAAM,KAAK,OAAO,SAAS,GAAG;AAEzD,UAAM,MAAM,OAAO,YAAY,KAAK,OAAO,SAAS,CAAC;AACrD,QAAI,MAAM,MAAM,KAAK;AACnB,eAAS,OAAO,MAAM,GAAG,GAAG;AAAA,IAC9B,OAAO;AACL,eAAS,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AACA,SAAO,SAAS;AAClB;AAGO,SAAS,cAAc,MAAsB;AAClD,SAAO,KACJ,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,kBAAkB,IAAI,EAC9B,QAAQ,cAAc,IAAI,EAC1B,QAAQ,cAAc,IAAI,EAC1B,QAAQ,sBAAsB,EAAE,EAChC,QAAQ,eAAe,EAAE,EACzB,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,qBAAqB,IAAI,EACjC,QAAQ,WAAW,EAAE,EACrB,QAAQ,SAAS,EAAE,EACnB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAMO,SAAS,qBAAqB,MAAc,QAAwB;AACzE,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,QAAI,QAAQ,WAAW,GAAG,EAAG;AAC7B,QAAI,QAAQ,WAAW,KAAK,EAAG;AAC/B,QAAI,QAAQ,WAAW,KAAK,EAAG;AAC/B,QAAI,QAAQ,WAAW,GAAG,EAAG;AAC7B,QAAI,QAAQ,SAAS,EAAG;AAExB,UAAM,UAAU,cAAc,OAAO;AACrC,QAAI,QAAQ,SAAS,EAAG;AAGxB,UAAM,YAAY,QAAQ,QAAQ,IAAI;AACtC,QAAI,YAAY,MAAM,YAAY,QAAQ;AACxC,aAAO,QAAQ,MAAM,GAAG,YAAY,CAAC;AAAA,IACvC;AACA,WAAO,SAAS,SAAS,MAAM;AAAA,EACjC;AACA,QAAM,WAAW,cAAc,IAAI;AACnC,SAAO,SAAS,UAAU,MAAM;AAClC;AAEO,SAAS,cAAc,WAA4B,QAAgC;AACxF,MAAI;AACJ,MAAI,OAAO,cAAc,UAAU;AACjC,cAAU;AAAA,EACZ,OAAO;AACL,UAAM,QAAQ,IAAI,KAAK,SAAS,EAAE,QAAQ;AAC1C,UAAM,MAAM,SAAS,IAAI,KAAK,MAAM,EAAE,QAAQ,IAAI,KAAK,IAAI;AAC3D,cAAU,MAAM;AAAA,EAClB;AACA,MAAI,UAAU,KAAK,KAAK,IAAM,QAAO;AACrC,MAAI,UAAU,KAAK,KAAK,IAAM,QAAO;AACrC,SAAO;AACT;AAEO,SAAS,gBAAgB,QAAwB;AACtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,gBAAgB,QAAwB;AACtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,eAAe,WAAmD;AAChF,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,IAAI,UAAU,YAAY;AAChC,MAAI,EAAE,SAAS,UAAU,EAAG,QAAO;AACnC,MAAI,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,MAAM,EAAG,QAAO;AAC1D,MAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,MAAM,EAAG,QAAO;AACvD,MAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAC/B,SAAO;AACT;AAEO,SAAS,QAAQ,OAAe,OAAe,UAAa;AACjE,SAAO,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAGO,SAAS,iBAAiB,SAAyB;AACxD,MAAI,CAAC,QAAQ,WAAW,KAAK,EAAG,QAAO;AACvC,QAAM,MAAM,QAAQ,QAAQ,SAAS,CAAC;AACtC,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,QAAQ,MAAM,MAAM,CAAC,EAAE,UAAU;AAC1C;AAGO,SAAS,cAAc,MAAsB;AAClD,SAAO,KACJ,QAAQ,kBAAkB,IAAI,EAC9B,QAAQ,cAAc,IAAI,EAC1B,QAAQ,cAAc,IAAI,EAC1B,QAAQ,YAAY,IAAI,EACxB,QAAQ,qBAAqB,IAAI,EAKjC,QAAQ,MAAM,QAAG,EACjB,QAAQ,MAAM,QAAG,EACjB,QAAQ,WAAC,2BAAuB,IAAE,GAAE,EAAE;AAC3C;AAcO,SAAS,IAAI,MAAc,MAAwC;AACxE,SAAO,EAAE,MAAM,GAAG,KAAK;AACzB;AAGO,SAAS,WAAW,MAAc,MAA+C;AACtF,SAAO,CAAC,IAAI,MAAM,IAAI,CAAC;AACzB;AAEO,SAAS,SAAS,MAAc,OAAyB;AAC9D,MAAI,SAAS,EAAG,QAAO,KAAK,MAAM,IAAI;AACtC,QAAM,SAAmB,CAAC;AAC1B,aAAW,WAAW,KAAK,MAAM,IAAI,GAAG;AACtC,QAAI,YAAY,OAAO,KAAK,OAAO;AACjC,aAAO,KAAK,OAAO;AACnB;AAAA,IACF;AACA,QAAI,YAAY;AAChB,WAAO,YAAY,SAAS,IAAI,OAAO;AAErC,UAAI,UAAU;AAEd,UAAI,WAAW,KAAK,IAAI,UAAU,QAAQ,KAAK;AAC/C,eAAS,IAAI,UAAU,KAAK,GAAG,KAAK;AAClC,YAAI,UAAU,CAAC,MAAM,OAAO,YAAY,UAAU,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO;AACvE,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAW,GAAG;AAEhB,kBAAU,UAAU;AACpB,iBAAS,IAAI,GAAG,KAAK,UAAU,QAAQ,KAAK;AAC1C,cAAI,YAAY,UAAU,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO;AAC9C,sBAAU,IAAI;AACd;AAAA,UACF;AAAA,QACF;AACA,YAAI,WAAW,EAAG,WAAU;AAAA,MAC9B;AACA,aAAO,KAAK,UAAU,MAAM,GAAG,OAAO,CAAC;AACvC,kBAAY,UAAU,MAAM,OAAO,EAAE,UAAU;AAAA,IACjD;AACA,QAAI,UAAW,QAAO,KAAK,SAAS;AAAA,EACtC;AACA,SAAO;AACT;;;ALxMM,SAOE,KAPF;AAHC,SAAS,YAAY,EAAE,OAAO,aAAa,OAAO,QAAQ,QAAQ,GAAU;AACjF,MAAI,MAAM,WAAW,GAAG;AACtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd;AAAA,QACA,aAAY;AAAA,QACZ,aAAa,UAAU,WAAW;AAAA,QAClC,UAAU;AAAA,QAEV;AAAA,8BAAC,QAAK,MAAI,MAAC,wBAAU;AAAA,UACrB,oBAAC,QAAK,UAAQ,MAAC,gCAAkB;AAAA,UACjC,oBAAC,QAAK,UAAQ,MAAC,sCAAwB;AAAA,UACvC,oBAAC,QAAK,UAAQ,MAAC,4CAA8B;AAAA;AAAA;AAAA,IAC/C;AAAA,EAEJ;AAEA,QAAM,aAAa,KAAK,IAAI,GAAG,SAAS,CAAC;AACzC,QAAM,cAAc,KAAK,MAAM,aAAa,CAAC;AAC7C,QAAM,eAAe,KAAK;AAAA,IACxB;AAAA,IACA,KAAK,IAAI,cAAc,aAAa,MAAM,SAAS,UAAU;AAAA,EAC/D;AACA,QAAM,UAAU,MAAM,MAAM,cAAc,eAAe,UAAU;AACnE,QAAM,eAAe,QAAQ;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd;AAAA,MACA,aAAY;AAAA,MACZ,aAAa,UAAU,WAAW;AAAA,MAClC,UAAU;AAAA,MAET;AAAA,uBAAe,KAAK,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,UAAK;AAAA,UAAa;AAAA,WAAK;AAAA,QAE1D,QAAQ,IAAI,CAAC,MAAM,MAAM;AACxB,gBAAM,UAAU,eAAe;AAC/B,gBAAM,aAAa,YAAY;AAC/B,gBAAM,SAAS,iBAAiB,MAAM,OAAO,OAAO;AACpD,gBAAM,EAAE,MAAM,OAAO,MAAM,OAAO,KAAK,UAAU,IAAI;AAAA,YACnD;AAAA,YACA,eAAe,OAAO;AAAA,UACxB;AAEA,iBACE,qBAAC,QAAmB,SAAS,cAAc,SAAS,MAAM,YACvD;AAAA;AAAA,YACD,oBAAC,QAAK,OAAc,UAAU,KAC3B,gBACH;AAAA,YACC,OAAO,MAAM;AAAA,YACd,oBAAC,QAAK,UAAU,KAAM,iBAAM;AAAA,YAC3B,OAAO,qBAAC,QAAK,OAAO,WAAW,UAAU,CAAC,WAAW;AAAA;AAAA,cAAE;AAAA,eAAK,IAAU;AAAA,eAP9D,KAAK,EAQhB;AAAA,QAEJ,CAAC;AAAA,QAEA,eAAe,aAAa,MAAM,UACjC,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,UAAK,MAAM,SAAS,eAAe;AAAA,UAAW;AAAA,WAAK;AAAA;AAAA;AAAA,EAEtE;AAEJ;AAEA,SAAS,kBACP,MACA,UACgG;AAChG,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,WAAW;AACd,YAAM,OAAO,gBAAgB,KAAK,MAAM;AACxC,YAAM,QAAQ,YAAY,KAAK,MAAM;AACrC,YAAM,MAAM,KAAK,WAAW;AAC5B,YAAM,YAAY,KAAK,aAAa,IAAI,IAAI,KAAK,UAAU,KAAK;AAChE,YAAM,MAAM,eAAe,KAAK,WAAW,KAAK,WAAW;AAC3D,YAAM,UAAU,KAAK,WAAW,eAAe,KAAK,cAAc,cAAc,KAAK,WAAW,IAAI;AACpG,YAAM,OAAO,CAAC,WAAW,KAAK,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC/D,YAAM,UAAU,KAAK,IAAI,GAAG,WAAW,KAAK,SAAS,CAAC;AACtD,aAAO,EAAE,MAAM,OAAO,SAAS,KAAK,MAAM,OAAO,GAAG,MAAM,OAAO,IAAI;AAAA,IACvE;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,YAAY,CAAC,KAAK;AACxB,YAAM,MAAM,KAAK,cACb,eAAe,KAAK,WAAW,KAAK,WAAW,IAC/C;AACJ,YAAM,SAAS,GAAG,KAAK,UAAU,SAAS,KAAK,eAAe,IAAI,MAAM,EAAE;AAC1E,YAAM,YAAY,KAAK,SAAS,mBAAmB,SAAS,KAAK,SAAS,aAAa,SAAS,KAAK;AACrG,YAAM,OAAO,YAAY,SAAM,SAAS,KAAK;AAC7C,aAAO;AAAA,QACL,MAAM,YAAY,WAAM;AAAA,QACxB,OAAO,IAAI,KAAK,WAAW;AAAA,QAC3B,MAAM,GAAG,GAAG,SAAM,MAAM,GAAG,IAAI;AAAA,QAC/B,OAAO,YAAY,UAAU;AAAA,QAC7B,KAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,OAAO,gBAAgB,KAAK,MAAM;AACxC,YAAM,QAAQ,YAAY,KAAK,MAAM;AACrC,YAAM,MAAM,eAAe,KAAK,WAAW,KAAK,WAAW;AAC3D,YAAM,SAAS,cAAc,KAAK,WAAW,KAAK,WAAW,KAAK;AAClE,YAAM,MAAM,KAAK,WAAW;AAC5B,YAAM,cAAc,KAAK,SAAS,KAAK,UAAU,KAAK,OAAO,KAAK;AAClE,YAAM,WAAW,KAAK,IAAI,GAAG,WAAW,IAAI,SAAS,CAAC;AACtD,aAAO;AAAA,QACL;AAAA,QACA,OAAO,SAAS,aAAa,QAAQ;AAAA,QACrC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,QAAQ,KAAK,eAAe,UAAU,UAAU;AACtD,YAAM,OAAO,WAAW,KAAK,SAAS;AACtC,aAAO;AAAA,QACL,MAAM,KAAK,eAAe,UAAU,WAAM;AAAA,QAC1C,OAAO,GAAG,KAAK,IAAI,IAAI;AAAA,QACvB,MAAM;AAAA,QACN,OAAO,KAAK,eAAe,UAAU,SAAS;AAAA,QAC9C,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,aAAa,KAAK,KAAK;AAAA,QAC9B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAAA,IACF,KAAK,WAAW;AACd,YAAM,WAAW,KAAK,IAAI,GAAG,WAAW,CAAC;AACzC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,SAAS,GAAG,KAAK,MAAM,KAAK,KAAK,OAAO,IAAI,QAAQ;AAAA,QAC3D,MAAM,WAAW,KAAK,SAAS;AAAA,QAC/B,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,YAAY,KAAK,SAAS;AAAA,QACjC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK,KAAK,cAAc;AAAA,MAC1B;AAAA,IACF,KAAK,gBAAgB;AACnB,YAAM,WAAW,KAAK,IAAI,GAAG,WAAW,CAAC;AACzC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,SAAS,KAAK,OAAO,QAAQ;AAAA,QACpC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;;;AM1LA,SAAgB,eAAe;AAC/B,SAAS,OAAAC,MAAK,QAAAC,aAAY;;;ACA1B,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAqHlB,gBAAAC,YAAA;AArGD,SAAS,eAAe,SAAiB,UAAkB,OAA2B;AAC3F,QAAM,QAAQ,iBAAiB,OAAO;AACtC,MAAI,CAAC,MAAM,KAAK,EAAG,QAAO,CAAC;AAE3B,QAAM,eAAe,QAAQ;AAC7B,QAAM,QAAoB,CAAC;AAC3B,QAAM,WAAW,MAAM,MAAM,IAAI;AAEjC,aAAW,WAAW,UAAU;AAC9B,QAAI,MAAM,UAAU,SAAU;AAE9B,UAAM,UAAU,QAAQ,KAAK;AAG7B,QAAI,YAAY,MAAO;AAGvB,UAAM,cAAc,QAAQ,MAAM,kBAAkB;AACpD,QAAI,aAAa;AACf,YAAM,QAAQ,YAAY,CAAC,EAAG;AAC9B,YAAM,aAAa,cAAc,YAAY,CAAC,CAAE;AAChD,YAAM,SAAS,KAAK,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACjD,UAAI,MAAM,SAAS,EAAG,OAAM,KAAK,EAAE,MAAM,IAAI,CAAC;AAC9C,YAAM,KAAK;AAAA,QACT,MAAM,OAAO,MAAM,GAAG,UAAU;AAAA,QAChC,MAAM;AAAA,QACN,OAAO,SAAS,IAAI,UAAU;AAAA,MAChC,CAAC;AACD;AAAA,IACF;AAGA,QAAI,CAAC,SAAS;AACZ,UAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAG,SAAS,IAAI;AAC5D,cAAM,KAAK,EAAE,MAAM,IAAI,CAAC;AAAA,MAC1B;AACA;AAAA,IACF;AAGA,UAAM,YAAY,QAAQ,MAAM,mBAAmB;AACnD,QAAI,WAAW;AACb,YAAMC,WAAU,GAAG,UAAU,CAAC,CAAC,KAAK,cAAc,UAAU,CAAC,CAAE,CAAC;AAChE,YAAMC,WAAU,SAASD,UAAS,eAAe,CAAC;AAClD,iBAAW,MAAMC,UAAS;AACxB,YAAI,MAAM,UAAU,SAAU;AAC9B,cAAM,KAAK,EAAE,MAAM,OAAO,EAAE,IAAI,KAAK,KAAK,CAAC;AAAA,MAC7C;AACA;AAAA,IACF;AAGA,UAAM,gBAAgB,QAAQ,MAAM,qBAAqB;AACzD,QAAI,eAAe;AACjB,YAAM,UAAU,cAAc,CAAC,MAAM;AACrC,YAAM,eAAe,cAAc,cAAc,CAAC,CAAE;AACpD,YAAM,OAAO,UAAU,WAAM;AAC7B,YAAMA,WAAU,SAAS,GAAG,IAAI,IAAI,YAAY,IAAI,eAAe,CAAC;AACpE,iBAAW,MAAMA,UAAS;AACxB,YAAI,MAAM,UAAU,SAAU;AAC9B,cAAM,KAAK,EAAE,MAAM,OAAO,EAAE,IAAI,KAAK,MAAM,OAAO,UAAU,UAAU,OAAU,CAAC;AAAA,MACnF;AACA;AAAA,IACF;AAGA,UAAM,cAAc,QAAQ,MAAM,eAAe;AACjD,QAAI,aAAa;AACf,YAAMD,WAAU,QAAK,cAAc,YAAY,CAAC,CAAE,CAAC;AACnD,YAAMC,WAAU,SAASD,UAAS,eAAe,CAAC;AAClD,iBAAW,MAAMC,UAAS;AACxB,YAAI,MAAM,UAAU,SAAU;AAC9B,cAAM,KAAK,EAAE,MAAM,OAAO,EAAE,IAAI,KAAK,KAAK,CAAC;AAAA,MAC7C;AACA;AAAA,IACF;AAGA,UAAM,UAAU,cAAc,OAAO;AACrC,UAAM,UAAU,SAAS,SAAS,eAAe,CAAC;AAClD,eAAW,MAAM,SAAS;AACxB,UAAI,MAAM,UAAU,SAAU;AAC9B,YAAM,KAAK,EAAE,MAAM,OAAO,EAAE,IAAI,KAAK,KAAK,CAAC;AAAA,IAC7C;AAAA,EACF;AAGA,QAAM,oBAAoB,SAAS,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AAC3D,MAAI,MAAM,UAAU,YAAY,oBAAoB,UAAU;AAC5D,UAAM,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,iCAA4B,KAAK,KAAK;AAAA,EAC1E;AAEA,SAAO;AACT;;;AC7GA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAkDd,gBAAAC,MAWJ,QAAAC,aAXI;AA7BL,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AAAA,EACV,cAAc;AAChB,GAAU;AACR,QAAM,cAAc,SAAS;AAC7B,QAAM,cAAc,MAAM,SAAS;AACnC,QAAM,iBAAiB,cAAc,cAAc,IAAI;AACvD,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,SAAS,cAAc;AAC3D,QAAM,kBAAkB,KAAK,IAAI,cAAc,SAAS;AACxD,QAAM,UAAU,MAAM,MAAM,iBAAiB,kBAAkB,cAAc;AAC7E,QAAM,WAAW,KAAK,IAAI,GAAG,iBAAiB,QAAQ,MAAM;AAC5D,QAAM,YAAY,YAAY,IAAI,KAAK,MAAO,kBAAkB,YAAa,GAAG,IAAI;AAEpF,SACE,gBAAAA;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd;AAAA,MACA,UAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,UAAU,SAAS;AAAA,MAChC,UAAU;AAAA,MAET;AAAA,gBAAQ,IAAI,CAAC,MAAM,MAClB,gBAAAE,KAACD,OAAA,EACE,eAAK,IAAI,CAAC,GAAG,MACZ,gBAAAC,KAACD,OAAA,EAAa,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,UAAU,EAAE,KAAK,QAAQ,EAAE,QACpE,YAAE,QADM,CAEX,CACD,KALQ,CAMX,CACD;AAAA,QACA,WAAW,KACV,MAAM,KAAK,EAAE,QAAQ,SAAS,GAAG,CAAC,GAAG,MACnC,gBAAAC,KAACD,OAAA,EAAoB,iBAAV,IAAI,CAAC,EAAS,CAC1B;AAAA,QACF,eACC,gBAAAE,MAACF,OAAA,EAAK,UAAQ,MACX;AAAA;AAAA,UAAK;AAAA,UAAG;AAAA,UAAU;AAAA,UAAK,MAAM;AAAA,UAAO;AAAA,WACvC;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AFoNQ,gBAAAG,YAAA;AAzPR,SAAS,WACP,SACA,aACA,aACA,cACA,OACA,WACc;AACd,QAAM,QAAsB,CAAC;AAC7B,QAAM,eAAe,QAAQ;AAC7B,QAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,QAAM,SAAS,QAAQ,sBAAsB,CAAC;AAC9C,QAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,QAAM,SAAS,QAAQ,WAAW,YAAY,CAAC;AAC/C,QAAM,YAAY,OAAO,OAAO,CAAC,MAAM,EAAE,gBAAgB,UAAU;AAGnE,QAAM,WAAW,cACb,cAAc,iBAAiB,WAAW,EAAE,KAAK,CAAC,IAClD,QAAQ;AACZ,WACG,MAAM,IAAI,EACV,QAAQ,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,EAC5C,QAAQ,CAAC,MAAM,MAAM;AACpB,UAAM,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,EACzE,CAAC;AAGH,QAAM,YAAY,OAAO,SAAS,IAAI,OAAO,OAAO,SAAS,CAAC,IAAK;AACnE,QAAM,WAAW,WAAW,SAAS;AACrC,QAAM,OAAO,WAAW,QAAQ;AAChC,QAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AACnE,QAAM,kBAAkB,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AACvE,QAAM,UAAU,eAAe,QAAQ,WAAW,QAAQ,WAAW;AACrE,QAAM,WAAW,oBAAoB,OAAO;AAC5C,QAAM,aAAa,eAAe,QAAQ;AAC1C,QAAM,YAAY,SAAS,aAAa,SAAS,SAAS,mBAAmB,UAAU;AACvF,QAAM,KAAK;AAAA,IACT,IAAI,IAAI;AAAA,IACR,IAAI,SAAS,gBAAW,QAAQ,QAAQ;AAAA,MACtC,OAAO,YAAY,SAAS,YAAY,QAAQ,MAAM;AAAA,IACxD,CAAC;AAAA,IACD,IAAI,eAAY,QAAQ,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,IACzC,GAAI,OAAO,CAAC,IAAI,MAAM,EAAE,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,EAAE,OAAO,UAAU,CAAC,GAAG,IAAI,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC;AAAA,IACnG,IAAI,SAAM,OAAO,UAAO,EAAE,KAAK,KAAK,CAAC;AAAA,IACrC,IAAI,GAAG,aAAa,YAAY,EAAE,OAAO,QAAQ,CAAC;AAAA,IAClD,IAAI,UAAO,EAAE,KAAK,KAAK,CAAC;AAAA,IACxB,IAAI,GAAG,eAAe,SAAS,EAAE,OAAO,OAAO,CAAC;AAAA,IAChD,IAAI,SAAM,UAAU,WAAW,EAAE,KAAK,KAAK,CAAC;AAAA,EAC9C,CAAC;AAGD,MAAI,QAAQ;AACV,UAAM,KAAK;AAAA,MACT,IAAI,IAAI;AAAA,MACR,IAAI,iBAAY,EAAE,OAAO,OAAO,MAAM,KAAK,CAAC;AAAA,MAC5C,IAAI,6CAAwC,EAAE,OAAO,MAAM,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM;AAAA,MACJ;AAAA,QACE,YAAO,UAAU,MAAM,kBAAkB,UAAU,SAAS,IAAI,MAAM,EAAE;AAAA,QACxE,EAAE,OAAO,OAAO,MAAM,KAAK;AAAA,MAC7B;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,QACE;AAAA,QACA,EAAE,OAAO,OAAO,KAAK,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,QAAM,KAAK;AAAA,IACT,IAAI,wBAAc,EAAE,OAAO,UAAU,MAAM,KAAK,CAAC;AAAA,EACnD,CAAC;AACD,QAAM,YAAY,eAAe,aAAa,OAAO,KAAK;AAC1D,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,KAAK,WAAW,oCAAoC,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EACxF,OAAO;AACL,eAAW,MAAM,WAAW;AAC1B,YAAM,KAAK,WAAW,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,KAAK,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,IACjF;AAAA,EACF;AAGA,MAAI,QAAQ,WAAW,eAAe,QAAQ,kBAAkB;AAC9D,UAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,UAAM,KAAK,CAAC,IAAI,8BAAoB,EAAE,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;AACnE,aAAS,cAAc,QAAQ,gBAAgB,GAAG,eAAe,CAAC,EAAE;AAAA,MAClE,CAAC,MAAM;AACL,cAAM,KAAK,WAAW,OAAO,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,QAAM,KAAK;AAAA,IACT,IAAI,0BAAgB,EAAE,OAAO,QAAQ,MAAM,KAAK,CAAC;AAAA,IACjD,IAAI,KAAK,OAAO,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,EAC1C,CAAC;AAGD,QAAM,cAAc,CAAC,KAAgC,cAA2B;AAC9E,UAAM,OAAO,WAAW,IAAI,SAAS;AACrC,UAAM,QACJ,IAAI,OAAO,SAAS,SAChB,QACA,IAAI,OAAO,SAAS,UAClB,IAAI,OAAO,UACX;AACR,UAAM,aACJ,IAAI,OAAO,SAAS,SAAS,WAAW,IAAI,OAAO,SAAS,UAAU,SAAS;AACjF,UAAM,aAAa,KAAK,IAAI,IAAI,eAAe,MAAM,SAAS,EAAE;AAChE,UAAM,KAAK;AAAA,MACT,IAAI,OAAO,SAAS,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,MACtC,IAAI,IAAI,IAAI,MAAM,EAAE,KAAK,KAAK,CAAC;AAAA,MAC/B,IAAI,GAAG,KAAK,KAAK,EAAE,OAAO,YAAY,MAAM,KAAK,CAAC;AAAA,MAClD,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,UAAU,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,KAAK,WAAW,sCAAiC,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EACrF,OAAO;AACL,UAAM,aAAa,CAAC,GAAG,QAAQ,EAAE;AAAA,MAC/B,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5E;AACA,UAAM,iBAAiB,CAAC,GAAG,MAAM,EAAE,QAAQ;AAG3C,UAAM,YAAY,CAAC,MAAc;AAC/B,YAAM,WAAW,EAAE,QAAQ,GAAG;AAC9B,aAAO,YAAY,IAAI,EAAE,MAAM,WAAW,CAAC,IAAI;AAAA,IACjD;AAEA,aAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,YAAM,QAAQ,eAAe,CAAC;AAC9B,YAAM,aAAa,eAAe,IAAI,CAAC;AAEvC,YAAM,YAAY,CAAC,MAAM;AAEzB,YAAM,WAAW,MAAM;AACvB,YAAM,WAAW,MAAM;AACvB,YAAM,MAAM,YAAY,WAAM;AAC9B,YAAM,WAAW,YAAY,UAAU,WAAW,UAAU;AAC5D,YAAM,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC;AAC3C,YAAM,WAAW,YAAY,YAAY,eAAe,MAAM,WAAW,MAAM,WAAW;AAC1F,YAAM,IAAI,MAAM,cAAc;AAC9B,YAAM,YAAY,WAAW,MAAM,SAAS;AAG5C,YAAM,YAAY,MAAM,OACpB,MAAM,SAAS,mBAAmB,SAChC,MAAM,SAAS,aAAa,SAC5B,MAAM,OACR;AACJ,YAAM,eAAe,MAAM,SAAS,aAAa,SAAS,MAAM,SAAS,mBAAmB,UAAU;AAEtG,YAAM,cAAc,OAAO,OAAO,CAAC,MAAM,MAAM,cAAc,SAAS,EAAE,EAAE,CAAC;AAG3E,YAAM,WAAW,IAAI,MAAM,KAAK,GAAG,OAAO,CAAC;AAC3C,YAAM,UAAU,YAAY,YAAY,UAAU,OAAO,CAAC;AAG1D,YAAM,YAAwB;AAAA,QAC5B,IAAI,KAAK,GAAG,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,QACpC,IAAI,UAAU,EAAE,MAAM,aAAa,UAAU,KAAK,OAAO,CAAC;AAAA,QAC1D,GAAI,YACA,CAAC,IAAI,QAAQ,EAAE,OAAO,SAAS,MAAM,KAAK,CAAC,CAAC,IAC5C,CAAC,IAAI,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC;AAAA,QACjC,IAAI,WAAW,EAAE,KAAK,KAAK,CAAC;AAAA,QAC5B,GAAI,YAAY,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,WAAW,EAAE,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC;AAAA,MAC9E;AACA,YAAM,KAAK,SAAS;AAGpB,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,aAAa,oBAAI,IAAoB;AAC3C,mBAAW,KAAK,aAAa;AAC3B,gBAAM,IAAI,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE;AACjD,qBAAW,IAAI,IAAI,WAAW,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,QAChD;AACA,cAAM,aAAa,CAAC,GAAG,WAAW,QAAQ,CAAC,EACxC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,QAAQ,IAAI,GAAG,KAAK,QAAK,CAAC,KAAK,CAAC,EACpD,KAAK,IAAI;AACZ,cAAM,KAAK;AAAA,UACT,IAAI,UAAU,CAAC,CAAC;AAAA,UAChB,IAAI,SAAS,YAAY,eAAe,CAAC,GAAG,EAAE,KAAK,OAAO,CAAC;AAAA,QAC7D,CAAC;AAAA,MACH,WAAW,IAAI,GAAG;AAChB,cAAM,KAAK;AAAA,UACT,IAAI,UAAU,CAAC,CAAC;AAAA,UAChB,IAAI,GAAG,CAAC,SAAS,MAAM,IAAI,MAAM,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC;AAAA,QACxD,CAAC;AAAA,MACH;AAGA,YAAM,YAAY,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AACpD,YAAM,iBAAiB,aAAa,IAAI,KAAK,WAAW,SAAS,EAAE,QAAQ,IAAI;AAC/E,YAAM,YAAY,WAAW,OAAO,CAAC,MAAM;AACzC,cAAM,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AACxC,eAAO,IAAI,aAAa,KAAK;AAAA,MAC/B,CAAC;AACD,gBAAU,QAAQ,CAAC,KAAK,OAAO;AAC7B,oBAAY,KAAK,KAAK,UAAU,SAAS,IAAI,iBAAO,cAAI;AAAA,MAC1D,CAAC;AAAA,IACH;AAGA,UAAM,iBAAiB,IAAI,KAAK,eAAe,eAAe,SAAS,CAAC,EAAG,SAAS,EAAE,QAAQ;AAC9F,UAAM,UAAU,WAAW,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,cAAc;AACzF,YAAQ,QAAQ,CAAC,KAAK,OAAO;AAC3B,kBAAY,KAAK,KAAK,QAAQ,SAAS,IAAI,iBAAO,cAAI;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AACZ,GAAU;AACR,MAAI,CAAC,SAAS;AACZ,WACE,gBAAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,eAAc;AAAA,QACd;AAAA,QACA,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,UAAU;AAAA,QACV,gBAAe;AAAA,QACf,YAAW;AAAA,QAEX,0BAAAD,KAACE,OAAA,EAAK,UAAQ,MAAC,8CAAgC;AAAA;AAAA,IACjD;AAAA,EAEJ;AAEA,QAAM,WAAW;AAAA,IACf,MAAM,WAAW,SAAS,aAAa,aAAa,aAAa,OAAO,SAAS;AAAA,IACjF,CAAC,SAAS,aAAa,aAAa,aAAa,OAAO,SAAS;AAAA,EACnE;AAEA,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AG3SA,SAAgB,WAAAG,gBAAe;AAC/B,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAmElB,gBAAAC,YAAA;AAhDR,SAASC,YAAW,WAAuB,OAA6B;AACtE,QAAM,QAAsB,CAAC;AAC7B,QAAM,eAAe,QAAQ;AAE7B,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAE9D,aAAW,EAAE,OAAO,QAAQ,KAAK,QAAQ;AACvC,UAAM,KAAK,CAAC,IAAI,WAAW,KAAK,IAAI,EAAE,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;AAEnE,UAAM,UAAU,cAAc,iBAAiB,OAAO,CAAC,EAAE,KAAK;AAC9D,QAAI,SAAS;AACX,iBAAW,WAAW,QAAQ,MAAM,IAAI,GAAG;AACzC,cAAM,UAAU,SAAS,SAAS,eAAe,CAAC;AAClD,mBAAW,MAAM,SAAS;AACxB,gBAAM,KAAK,CAAC,IAAI,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AAAA,EACvB;AAEA,SAAO;AACT;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AACZ,GAAU;AACR,MAAI,UAAU,WAAW,GAAG;AAC1B,WACE,gBAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,eAAc;AAAA,QACd;AAAA,QACA,aAAY;AAAA,QACZ,aAAa,UAAU,SAAS;AAAA,QAChC,UAAU;AAAA,QACV,gBAAe;AAAA,QACf,YAAW;AAAA,QAEX,0BAAAF,KAACG,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA;AAAA,IACxB;AAAA,EAEJ;AAEA,QAAM,WAAWC;AAAA,IACf,MAAMH,YAAW,WAAW,KAAK;AAAA,IACjC,CAAC,WAAW,KAAK;AAAA,EACnB;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;ACvFA,SAAgB,WAAAK,gBAAe;AA0H3B,gBAAAC,YAAA;AA/FJ,SAASC,YAAW,OAA0B,QAAiB,OAA6B;AAC1F,QAAM,QAAsB,CAAC;AAC7B,QAAM,eAAe,QAAQ;AAC7B,QAAM,YAAY,CAAC,MAAM;AACzB,QAAM,MAAM,MAAM,cACd,eAAe,MAAM,WAAW,MAAM,WAAW,IACjD;AACJ,QAAM,cAAc,OAAO,OAAO,CAAC,MAAM,MAAM,cAAc,SAAS,EAAE,EAAE,CAAC;AAG3E,QAAM,KAAK,WAAW,UAAU,MAAM,KAAK,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC;AAG9D,QAAM,KAAK;AAAA,IACT,IAAI,IAAI;AAAA,IACR,IAAI,YAAY,YAAY,aAAa,EAAE,OAAO,YAAY,UAAU,OAAO,CAAC;AAAA,IAChF,IAAI,SAAM,GAAG,SAAM,YAAY,MAAM,SAAS,YAAY,WAAW,IAAI,MAAM,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,IAClG,GAAI,MAAM,OACN;AAAA,MACE,IAAI,UAAO,EAAE,KAAK,KAAK,CAAC;AAAA,MACxB,IAAI,MAAM,MAAM;AAAA,QACd,OAAO,MAAM,SAAS,aAAa,SAAS,MAAM,SAAS,mBAAmB,UAAU;AAAA,MAC1F,CAAC;AAAA,IACH,IACA,CAAC;AAAA,EACP,CAAC;AAGD,QAAM,KAAK;AAAA,IACT,KAAK,WAAW,MAAM,SAAS,CAAC,GAAG,MAAM,cAAc,WAAM,WAAW,MAAM,WAAW,CAAC,KAAK,EAAE;AAAA,IACjG,EAAE,KAAK,KAAK;AAAA,EACd,CAAC;AAGD,QAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,QAAM,KAAK,CAAC,IAAI,0BAAgB,EAAE,OAAO,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC;AAEhE,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,KAAK,WAAW,0CAAqC,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EACzF,OAAO;AACL,eAAW,SAAS,aAAa;AAC/B,YAAM,YAAY,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO,MAAM;AAC/D,YAAM,eAAe,MAAM,YAAY,MAAM,IAAI,EAAE,CAAC,KAAK;AACzD,YAAM,eAAe,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,MAAM,QAAQ,SAAS,CAAC,IAAK;AAC3F,YAAM,gBAAgB,gBAAgB,MAAM,WAAW,cACnD,qBAAqB,aAAa,SAAS,eAAe,EAAE,IAC5D;AACJ,YAAM,WAAW,eAAe,MAAM,WAAW,MAAM,WAAW;AAClE,YAAM,SAAS,cAAc,MAAM,WAAW,MAAM,WAAW,KAAK;AAEpE,YAAM,KAAK;AAAA,QACT,IAAI,MAAM;AAAA,QACV,IAAI,gBAAgB,MAAM,MAAM,GAAG,EAAE,OAAO,YAAY,MAAM,MAAM,EAAE,CAAC;AAAA,QACvE,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAAA,QAClC,IAAI,IAAI,SAAS,WAAW,eAAe,EAAE,CAAC,IAAI;AAAA,UAChD,OAAO,eAAe,MAAM,SAAS,KAAK;AAAA,UAC1C,KAAK,CAAC,eAAe,MAAM,SAAS;AAAA,QACtC,CAAC;AAAA,QACD,IAAI,SAAM,MAAM,MAAM,UAAO,EAAE,KAAK,KAAK,CAAC;AAAA,QAC1C,IAAI,UAAU,EAAE,OAAO,QAAQ,KAAK,CAAC,OAAO,CAAC;AAAA,MAC/C,CAAC;AAED,UAAI,cAAc;AAChB,cAAM,KAAK,WAAW,SAAS,SAAS,cAAc,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5F;AAEA,UAAI,eAAe;AACjB,cAAM,KAAK;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,IAAI,UAAK,EAAE,OAAO,OAAO,CAAC;AAAA,UAC1B,IAAI,IAAI,aAAa,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,YAAY;AACpB,UAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,UAAM,KAAK,CAAC,IAAI,+BAAqB,EAAE,OAAO,UAAU,MAAM,KAAK,CAAC,CAAC,CAAC;AACtE,eAAW,MAAM,SAAS,MAAM,YAAY,eAAe,CAAC,GAAG;AAC7D,YAAM,KAAK,WAAW,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,EAAE,OAAO,QAAQ,OAAO,QAAQ,eAAe,GAAG,UAAU,MAAM,GAAU;AACtG,QAAM,WAAWC;AAAA,IACf,MAAMD,YAAW,OAAO,QAAQ,KAAK;AAAA,IACrC,CAAC,OAAO,QAAQ,KAAK;AAAA,EACvB;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AClIA,SAAgB,WAAAG,gBAAe;AAyJ3B,gBAAAC,YAAA;AAhIJ,SAASC,YAAW,OAAc,cAAyC,OAA6B;AACtG,QAAM,QAAsB,CAAC;AAC7B,QAAM,eAAe,QAAQ;AAC7B,QAAM,MAAM,eAAe,MAAM,WAAW,MAAM,WAAW;AAC7D,QAAM,OAAO,gBAAgB,MAAM,MAAM;AACzC,QAAM,QAAQ,YAAY,MAAM,MAAM;AACtC,QAAM,YAAY,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO,MAAM;AAC/D,QAAM,gBAAgB;AAGtB,QAAM,KAAK;AAAA,IACT,IAAI,GAAG;AAAA,IACP,IAAI,MAAM,EAAE,MAAM,CAAC;AAAA,IACnB,IAAI,IAAI,MAAM,EAAE,SAAM,SAAS,IAAI,EAAE,MAAM,KAAK,CAAC;AAAA,EACnD,CAAC;AAGD,QAAM,YAAsC,CAAC;AAC7C,MAAI,MAAM,aAAa;AACrB,cAAU,KAAK,IAAI,UAAO,EAAE,KAAK,KAAK,CAAC,CAAC;AACxC,YAAQ,MAAM,aAAa;AAAA,MACzB,KAAK;AACH,kBAAU,KAAK,IAAI,iBAAY,EAAE,OAAO,QAAQ,CAAC,CAAC;AAClD;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,IAAI,kBAAa,EAAE,OAAO,SAAS,CAAC,CAAC;AACpD;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,IAAI,qBAAgB,EAAE,OAAO,OAAO,CAAC,CAAC;AACrD;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,IAAI,mBAAc,EAAE,OAAO,MAAM,CAAC,CAAC;AAClD;AAAA,MACF;AACE,kBAAU,KAAK,IAAI,MAAM,aAAa,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AACA,QAAM,KAAK;AAAA,IACT,IAAI,IAAI;AAAA,IACR,IAAI,MAAM,QAAQ,EAAE,MAAM,CAAC;AAAA,IAC3B,IAAI,SAAM,GAAG,SAAM,MAAM,SAAS,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,IACnD,GAAG;AAAA,EACL,CAAC;AAGD,MAAI,MAAM,cAAc;AACtB,UAAM,KAAK,WAAW,YAAO,MAAM,YAAY,IAAI,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,EACtE;AAEA,MAAI,MAAM,gBAAgB,cAAc,MAAM,cAAc;AAC1D,eAAW,MAAM,SAAS,MAAM,cAAc,eAAe,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG;AACvF,YAAM,KAAK,WAAW,YAAO,EAAE,IAAI,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,MAAM,gBAAgB,YAAY;AACpC,UAAM,KAAK,WAAW,qDAAqD,EAAE,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,EACzG;AAGA,QAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,QAAM,KAAK,WAAW,+BAAqB,EAAE,OAAO,SAAS,MAAM,KAAK,CAAC,CAAC;AAC1E,aAAW,MAAM,SAAS,MAAM,aAAa,eAAe,CAAC,GAAG;AAC9D,UAAM,KAAK,WAAW,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,EACnD;AAGA,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,UAAM,cAAc,gBAAgB,aAAa,SAAS;AAC1D,UAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,UAAM,KAAK,CAAC,IAAI,4BAAkB,MAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;AAE1F,QAAI,aAAa;AACf,eAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,cAAM,QAAQ,aAAa,CAAC;AAC5B,cAAM,QAAQ,MAAM,SAAS,UAAU,UAAU;AACjD,cAAM,aAAa,MAAM,SAAS,UAAU,SAAS;AAErD,YAAI,IAAI,EAAG,OAAM,KAAK,WAAW,GAAG,CAAC;AACrC,cAAM,KAAK;AAAA,UACT,IAAI,MAAM;AAAA,UACV,IAAI,OAAO,EAAE,OAAO,YAAY,MAAM,MAAM,SAAS,QAAQ,CAAC;AAAA,UAC9D,IAAI,IAAI,WAAW,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,QACtD,CAAC;AACD,mBAAW,MAAM,SAAS,cAAc,MAAM,QAAQ,KAAK,CAAC,GAAG,eAAe,EAAE,GAAG;AACjF,gBAAM,KAAK,WAAW,SAAS,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF,OAAO;AACL,iBAAW,UAAU,MAAM,SAAS;AAClC,cAAM,QAAQ,OAAO,SAAS,UAAU,UAAU;AAClD,cAAM,aAAa,OAAO,SAAS,UAAU,SAAS;AACtD,cAAM,KAAK;AAAA,UACT,IAAI,MAAM;AAAA,UACV,IAAI,OAAO,EAAE,OAAO,YAAY,MAAM,OAAO,SAAS,QAAQ,CAAC;AAAA,UAC/D,IAAI,IAAI,WAAW,OAAO,SAAS,CAAC,KAAK,OAAO,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,QACzF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,KAAK,WAAW,GAAG,CAAC;AAC1B,QAAM,KAAK,WAAW,wBAAc,EAAE,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC;AAClE,QAAM,KAAK,WAAW,gBAAgB,WAAW,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AACnF,MAAI,MAAM,aAAa;AACrB,UAAM,KAAK,WAAW,kBAAkB,WAAW,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,EACzF;AACA,MAAI,MAAM,QAAQ;AAChB,UAAM,KAAK,WAAW,aAAa,MAAM,MAAM,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,EACnE;AACA,MAAI,MAAM,cAAc;AACtB,UAAM,KAAK,WAAW,iBAAiB,MAAM,YAAY,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,EAC7E;AACA,MAAI,MAAM,YAAY;AACpB,UAAM,KAAK,WAAW,eAAe,MAAM,UAAU,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,EAAE,OAAO,cAAc,OAAO,QAAQ,eAAe,GAAG,UAAU,MAAM,GAAU;AAC5G,QAAM,WAAWC;AAAA,IACf,MAAMD,YAAW,OAAO,cAAc,KAAK;AAAA,IAC3C,CAAC,OAAO,cAAc,KAAK;AAAA,EAC7B;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;ACjKA,SAAgB,UAAU,WAAAG,gBAAe;AACzC,SAAS,OAAAC,MAAK,QAAAC,OAAM,gBAAgB;AA4G9B,SAEE,OAAAC,MAFF,QAAAC,aAAA;AA/FC,SAAS,WAAW,EAAE,OAAO,cAAc,OAAO,QAAQ,QAAQ,GAAU;AACjF,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAElD,QAAM,eAAe,QAAQ;AAG7B,QAAM,QAAQC,SAAQ,MAAM;AAC1B,UAAMC,SAAgF,CAAC;AAEvF,QAAI,aAAa,WAAW,GAAG;AAC7B,MAAAA,OAAM,KAAK,EAAE,MAAM,IAAI,KAAK,KAAK,CAAC;AAClC,MAAAA,OAAM,KAAK,EAAE,MAAM,+BAA+B,KAAK,KAAK,CAAC;AAC7D,MAAAA,OAAM,KAAK,EAAE,MAAM,IAAI,KAAK,KAAK,CAAC;AAClC,aAAOA;AAAA,IACT;AAEA,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,YAAM,SAAS,aAAa,CAAC;AAC7B,YAAM,OAAO,WAAW,OAAO,SAAS;AAExC,UAAI,IAAI,GAAG;AACT,QAAAA,OAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AACvB,QAAAA,OAAM,KAAK,EAAE,MAAM,KAAK,QAAQ,eAAe,GAAG,MAAG,CAAC,IAAI,KAAK,KAAK,CAAC;AACrE,QAAAA,OAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,MACzB;AAGA,YAAM,QAAQ,OAAO,SAAS,UAAU,UAAU;AAClD,YAAM,aAAa,OAAO,SAAS,UAAU,SAAS;AACtD,MAAAA,OAAM,KAAK;AAAA,QACT,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,QACzB,OAAO;AAAA,QACP,MAAM,OAAO,SAAS;AAAA,MACxB,CAAC;AACD,MAAAA,OAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AAGvB,YAAM,UAAU,SAAS,OAAO,QAAQ,KAAK,GAAG,eAAe,CAAC;AAChE,iBAAW,QAAQ,SAAS;AAC1B,QAAAA,OAAM,KAAK,EAAE,MAAM,OAAO,IAAI,GAAG,CAAC;AAAA,MACpC;AAAA,IACF;AAEA,IAAAA,OAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AACvB,WAAOA;AAAA,EACT,GAAG,CAAC,cAAc,YAAY,CAAC;AAG/B,QAAM,iBAAiB,SAAS;AAChC,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,SAAS,cAAc;AAE3D,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,UAAU,IAAI,QAAQ;AAC5B,cAAQ;AACR;AAAA,IACF;AACA,QAAI,IAAI,SAAS;AACf,sBAAgB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AACzC;AAAA,IACF;AACA,QAAI,IAAI,WAAW;AACjB,sBAAgB,CAAC,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,CAAC;AACjD;AAAA,IACF;AAEA,QAAI,UAAU,OAAQ,IAAI,WAAW,IAAI,OAAQ;AAC/C,sBAAgB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM,iBAAiB,CAAC,CAAC,CAAC;AACtE;AAAA,IACF;AACA,QAAI,UAAU,OAAQ,IAAI,aAAa,IAAI,OAAQ;AACjD,sBAAgB,CAAC,MAAM,KAAK,IAAI,WAAW,IAAI,KAAK,MAAM,iBAAiB,CAAC,CAAC,CAAC;AAC9E;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,MAAM,MAAM,cAAc,eAAe,cAAc;AAGvE,QAAM,YAAY,YAAY,IAAI,KAAK,MAAO,eAAe,YAAa,GAAG,IAAI;AACjF,QAAM,eAAe,MAAM,QAAQ;AACnC,QAAM,OAAO,gBAAgB,MAAM,MAAM;AACzC,QAAM,QAAQ,YAAY,MAAM,MAAM;AACtC,QAAM,MAAM,eAAe,MAAM,WAAW,MAAM,WAAW;AAE7D,SACE,gBAAAF;AAAA,IAACG;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MAGV;AAAA,wBAAAH,MAACI,OAAA,EAAK,MAAI,MACP;AAAA;AAAA,UACD,gBAAAL,KAACK,OAAA,EAAK,OAAe,gBAAK;AAAA,UACzB;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACD,gBAAAL,KAACK,OAAA,EAAK,UAAQ,MAAC,kBAAC;AAAA,UACf;AAAA,UACA,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO,MAAM;AAAA,WAChD;AAAA,QACA,gBAAAJ,MAACI,OAAA,EAAK,UAAQ,MACX;AAAA;AAAA,UAAM,MAAM;AAAA,UAAO;AAAA,UAAI;AAAA,UAAI;AAAA,UAAI,MAAM;AAAA,UAAU;AAAA,UAAI;AAAA,UAAa;AAAA,UAAQ,iBAAiB,IAAI,MAAM;AAAA,WACtG;AAAA,QACA,gBAAAL,KAACK,OAAA,EAAK,UAAQ,MAAE,iBAAO,QAAQ,eAAe,CAAC,GAAE;AAAA,QAGjD,gBAAAL,KAACI,MAAA,EAAI,eAAc,UAAS,UAAU,GACnC,kBAAQ,IAAI,CAAC,MAAM,MAClB,gBAAAJ;AAAA,UAACK;AAAA,UAAA;AAAA,YAEC,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YAEd,eAAK;AAAA;AAAA,UALD;AAAA,QAMP,CACD,GACH;AAAA,QAGA,gBAAAL,KAACK,OAAA,EAAK,UAAQ,MAAE,iBAAO,QAAQ,eAAe,CAAC,GAAE;AAAA,QACjD,gBAAAJ,MAACI,OAAA,EAAK,UAAQ,MACX;AAAA;AAAA,UAAK;AAAA,UAA6B;AAAA,UAClC;AAAA,UACD,gBAAAJ,MAACI,OAAA,EAAM;AAAA;AAAA,YAAU;AAAA,aAAC;AAAA,UACjB,YAAY,KAAK,gBAAAJ,MAACI,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,YAAI,MAAM;AAAA,YAAO;AAAA,aAAM;AAAA,WAC1D;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACpJA,SAAgB,YAAAC,WAAU,WAAW,cAAc;AACnD,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAiI5B,gBAAAC,MAaF,QAAAC,aAbE;AAvGR,IAAM,cAAc,oBAAI,IAAe;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,UAA8C;AAAA,EAClD,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAEA,IAAM,iBAAiB,oBAAI,IAAe,CAAC,UAAU,YAAY,QAAQ,CAAC;AAEnE,SAAS,SAAS,EAAE,MAAM,aAAa,UAAU,SAAS,GAAU;AACzE,QAAM,CAAC,MAAM,OAAO,IAAIL,UAAS,EAAE;AACnC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,CAAC;AAC5C,QAAM,WAAW,OAAO,IAAI;AAG5B,YAAU,MAAM;AACd,QAAI,SAAS,SAAS,SAAS;AAC7B,UAAI,YAAY,IAAI,IAAI,KAAK,aAAa;AACxC,gBAAQ,WAAW;AACnB,qBAAa,YAAY,MAAM;AAAA,MACjC,OAAO;AACL,gBAAQ,EAAE;AACV,qBAAa,CAAC;AAAA,MAChB;AAAA,IACF;AACA,aAAS,UAAU;AAAA,EACrB,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,EAAAG;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,QAAQ;AACd,YAAI,eAAe,IAAI,IAAI,KAAK,KAAK,KAAK,GAAG;AAC3C,mBAAS,KAAK,KAAK,CAAC;AACpB,kBAAQ,EAAE;AACV,uBAAa,CAAC;AAAA,QAChB;AACA;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,gBAAQ,EAAE;AACV,qBAAa,CAAC;AACd,iBAAS;AACT;AAAA,MACF;AACA,UAAI,IAAI,WAAW;AACjB,qBAAa,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AACtC;AAAA,MACF;AACA,UAAI,IAAI,YAAY;AAClB,qBAAa,CAAC,MAAM,KAAK,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC;AAChD;AAAA,MACF;AACA,UAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,qBAAa,CAAC;AACd;AAAA,MACF;AACA,UAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,qBAAa,KAAK,MAAM;AACxB;AAAA,MACF;AACA,UAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,gBAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;AAEpC;AAAA,MACF;AACA,UAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,gBAAQ,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,qBAAa,CAAC;AACd;AAAA,MACF;AACA,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,YAAI,YAAY,GAAG;AACjB,kBAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7D,uBAAa,CAAC,MAAM,IAAI,CAAC;AAAA,QAC3B;AACA;AAAA,MACF;AACA,UAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AACnC,gBAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjE,qBAAa,CAAC,MAAM,IAAI,MAAM,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IACA,EAAE,UAAU,YAAY,IAAI,IAAI,EAAE;AAAA,EACpC;AAEA,MAAI,SAAS,YAAY;AACvB,WACE,gBAAAC,KAACH,MAAA,EAAI,UAAU,GACb,0BAAAG,KAACF,OAAA,EAAK,UAAQ,MAAC,oEAAsD,GACvE;AAAA,EAEJ;AAEA,MAAI,SAAS,mBAAmB,SAAS,YAAY,SAAS,eAAe,SAAS,UAAU,CAAC,YAAY,IAAI,IAAI,GAAG;AACtH,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,IAAI,KAAK;AAEhC,SACE,gBAAAG,MAACJ,MAAA,EAAI,UAAU,GACb;AAAA,oBAAAI,MAACH,OAAA,EAAK,OAAM,UAAU;AAAA;AAAA,MAAO;AAAA,OAAM;AAAA,IACnC,gBAAAE,KAACF,OAAA,EAAM,eAAK,MAAM,GAAG,SAAS,GAAE;AAAA,IAChC,gBAAAE,KAACF,OAAA,EAAK,SAAO,MAAE,sBAAY,KAAK,SAAS,KAAK,SAAS,IAAI,KAAI;AAAA,IAC/D,gBAAAE,KAACF,OAAA,EAAM,eAAK,MAAM,YAAY,CAAC,GAAE;AAAA,IACjC,gBAAAE,KAACF,OAAA,EAAK,UAAQ,MAAC,8CAAgC;AAAA,KACjD;AAEJ;;;ACrJA,SAAS,OAAAI,MAAK,QAAAC,aAAY;AAmBpB,SAsHsC,UArHpC,OAAAC,OADF,QAAAC,aAAA;AAPC,SAAS,WAAW,EAAE,MAAM,gBAAgB,OAAO,cAAc,OAAO,WAAW,OAAO,eAAe,GAAU;AACxH,MAAI,SAAS,iBAAiB;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,UAAU;AACrB,WACE,gBAAAA,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,WAAU,MAAI,MAAC,oBAAM;AAAA,MACjC,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,sDAAwC;AAAA,OACzD;AAAA,EAEJ;AAEA,MAAI,SAAS,aAAa;AACxB,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,kBAAI;AAAA,MAC5B,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,6EAA+D;AAAA,OAChF;AAAA,EAEJ;AAEA,MAAI,SAAS,QAAQ;AACnB,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,UAAS,MAAI,MAAC,kBAAI;AAAA,MAC9B,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,uCAAyB;AAAA,OAC1C;AAAA,EAEJ;AAEA,MAAI,SAAS,kBAAkB;AAC7B,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,OAAM,MAAI,MAAC,oBAAM;AAAA,MAC7B,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,sDAAkD;AAAA,OACnE;AAAA,EAEJ;AAEA,MAAI,SAAS,eAAe;AAC1B,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,SAAQ,MAAI,MAAC,mBAAK;AAAA,MAC9B,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,wDAA0C;AAAA,OAC3D;AAAA,EAEJ;AAEA,MAAI,SAAS,UAAU;AACrB,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,oBAAM;AAAA,MAC9B,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,+DAAiD;AAAA,OAClE;AAAA,EAEJ;AAEA,MAAI,SAAS,iBAAiB;AAC5B,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,qBAAO;AAAA,MAC/B,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,wDAA0C;AAAA,OAC3D;AAAA,EAEJ;AAEA,MAAI,SAAS,iBAAiB;AAC5B,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,OAAM,WAAU,MAAI,MAAC,mBAAK;AAAA,MAChC,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,8CAAgC;AAAA,OACjD;AAAA,EAEJ;AAEA,MAAI,SAAS,YAAY;AACvB,WACE,gBAAAC,MAACF,MAAA,EAAI,UAAU,GACb,0BAAAE,MAACD,OAAA,EAAK,UAAQ,MAAC,wCAA0B,GAC3C;AAAA,EAEJ;AAEA,MAAI,aAAa;AACf,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,MAAI,MAAC,+BAAO;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,MACjD,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,4BAAS;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,MACjD,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,0BAAY;AAAA,MAChD,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAE;AAAA,MACjB,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,kBAAI;AAAA,MACxC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,mBAAK;AAAA,MACzC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,kBAAI;AAAA,MACxC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,mBAAK;AAAA,MACzC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,MAC3C,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,MAC3C,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,iBAAG;AAAA,OACzC;AAAA,EAEJ;AAEA,MAAI,eAAe;AACjB,WACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAE,MAACD,OAAA,EAAK,MAAI,MAAC,+BAAO;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,MACjD,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,4BAAS;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,MACjD,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,0BAAY;AAAA,MAChD,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAE;AAAA,MACjB,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,kBAAI;AAAA,MACxC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,mBAAK;AAAA,MACzC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,kBAAI;AAAA,MACxC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,mBAAK;AAAA,MACzC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,MAC3C,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,MAC3C,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,iBAAG;AAAA,OACzC;AAAA,EAEJ;AAEA,SACE,gBAAAE,MAACH,MAAA,EAAI,UAAU,GACb;AAAA,oBAAAE,MAACD,OAAA,EAAK,MAAI,MAAC,oBAAM;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,yBAAW;AAAA,IAClD,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAE;AAAA,IAChB,mBAAmB,kBAAkB,gBAAAE,MAAA,YAAE;AAAA,sBAAAD,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,mBAAK;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,sBAAG;AAAA,MAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,OAAO;AAAA,IAC1I,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,qBAAO;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,IACjD,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,mBAAK;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,IAC/C,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,0BAAY;AAAA,IAChD,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAE;AAAA,IACjB,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,kBAAI;AAAA,IACxC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,kBAAI;AAAA,IACxC,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,IAC3C,gBAAAC,MAACD,OAAA,EAAK,MAAI,MAAC,iBAAG;AAAA,IAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC,iBAAG;AAAA,KACzC;AAEJ;;;ACpJA,SAAS,OAAAG,MAAK,QAAAC,aAAY;AAuBpB,SASE,OAAAC,OATF,QAAAC,aAAA;AAdN,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAEpB,IAAM,QAAQ,eAAe;AAG7B,SAAS,IAAI,GAAmB;AAC9B,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,cAAc,EAAE,MAAM,MAAM,KAAK,GAAU;AACzD,MAAI,SAAS,UAAU;AACrB,WACE,gBAAAA;AAAA,MAACH;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,WAAW,OAAO,gBAAgB;AAAA,QAClC,YAAY,OAAO,eAAe;AAAA,QAClC,OAAO;AAAA,QACP,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,aAAY;AAAA,QAEZ;AAAA,0BAAAE,MAACD,OAAA,EAAK,MAAI,MAAC,OAAM,WAAW,cAAI,UAAU,GAAE;AAAA,UAC5C,gBAAAC,MAACD,OAAA,EAAM,cAAI,GAAG,GAAE;AAAA,UAChB,gBAAAC,MAACD,OAAA,EAAM,cAAI,gBAAgB,GAAE;AAAA,UAC7B,gBAAAC,MAACD,OAAA,EAAM,cAAI,qBAAqB,GAAE;AAAA,UAClC,gBAAAC,MAACD,OAAA,EAAM,cAAI,kBAAkB,GAAE;AAAA,UAC/B,gBAAAC,MAACD,OAAA,EAAM,cAAI,uBAAuB,GAAE;AAAA,UACpC,gBAAAC,MAACD,OAAA,EAAM,cAAI,kBAAkB,GAAE;AAAA,UAC/B,gBAAAC,MAACD,OAAA,EAAM,cAAI,oBAAoB,GAAE;AAAA,UACjC,gBAAAC,MAACD,OAAA,EAAM,cAAI,aAAa,GAAE;AAAA,UAC1B,gBAAAC,MAACD,OAAA,EAAM,cAAI,oBAAoB,GAAE;AAAA,UACjC,gBAAAC,MAACD,OAAA,EAAM,cAAI,mBAAmB,GAAE;AAAA,UAChC,gBAAAC,MAACD,OAAA,EAAM,cAAI,yBAAyB,GAAE;AAAA,UACtC,gBAAAC,MAACD,OAAA,EAAM,cAAI,WAAW,GAAE;AAAA,UACxB,gBAAAC,MAACD,OAAA,EAAM,cAAI,WAAW,GAAE;AAAA,UACxB,gBAAAC,MAACD,OAAA,EAAM,cAAI,uBAAuB,GAAE;AAAA,UACpC,gBAAAC,MAACD,OAAA,EAAM,cAAI,GAAG,GAAE;AAAA,UAChB,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAE,cAAI,gBAAgB,GAAE;AAAA;AAAA;AAAA,IACxC;AAAA,EAEJ;AAEA,MAAI,SAAS,aAAa;AACxB,WACE,gBAAAE;AAAA,MAACH;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,WAAW,OAAO,cAAc;AAAA,QAChC,YAAY,OAAO,eAAe;AAAA,QAClC,OAAO;AAAA,QACP,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,aAAY;AAAA,QAEZ;AAAA,0BAAAE,MAACD,OAAA,EAAK,MAAI,MAAC,OAAM,QAAQ,cAAI,QAAQ,GAAE;AAAA,UACvC,gBAAAC,MAACD,OAAA,EAAM,cAAI,GAAG,GAAE;AAAA,UAChB,gBAAAC,MAACD,OAAA,EAAM,cAAI,mBAAmB,GAAE;AAAA,UAChC,gBAAAC,MAACD,OAAA,EAAM,cAAI,kBAAkB,GAAE;AAAA,UAC/B,gBAAAC,MAACD,OAAA,EAAM,cAAI,mBAAmB,GAAE;AAAA,UAChC,gBAAAC,MAACD,OAAA,EAAM,cAAI,iBAAiB,GAAE;AAAA,UAC9B,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAE,cAAI,eAAe,GAAE;AAAA;AAAA;AAAA,IACvC;AAAA,EAEJ;AAEA,SAAO;AACT;;;AC5EA,SAAS,OAAAG,OAAK,QAAAC,cAAY;AAuDtB,SASE,OAAAC,OATF,QAAAC,aAAA;AA9CJ,IAAM,aAAa;AACnB,IAAMC,SAAQ,aAAa;AAE3B,SAASC,KAAI,GAAmB;AAC9B,SAAO,EAAE,OAAOD,MAAK;AACvB;AAMA,SAAS,IAAI,MAAc,OAAuB;AAChD,QAAM,MAAM,KAAK,MAAME,SAAQ,CAAC;AAChC,UAAQ,KAAK,OAAO,GAAG,IAAI,OAAO,OAAOA,MAAK;AAChD;AAEO,SAAS,YAAY,EAAE,MAAM,MAAM,KAAK,GAAU;AACvD,MAAI,SAAS,OAAQ,QAAO;AAE5B,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO,cAAc,CAAC,CAAC;AAClE,QAAM,QAAQ;AAAA,IACZ,IAAI,6CAAyB,oBAAoB;AAAA,IACjD,IAAI,wBAAwB,kBAAkB;AAAA,IAC9C;AAAA,IACA,IAAI,oBAAoB,oBAAoB;AAAA,IAC5C,IAAI,uBAAuB,uBAAuB;AAAA,IAClD,IAAI,uBAAuB,oBAAoB;AAAA,IAC/C,IAAI,qBAAqB,gBAAgB;AAAA,IACzC,IAAI,qBAAqB,mBAAmB;AAAA,IAC5C,IAAI,yBAAyB,WAAW;AAAA,IACxC;AAAA,IACA,IAAI,kCAA6B,kCAA6B;AAAA,IAC9D,IAAI,kCAA6B,wBAAmB;AAAA,IACpD,IAAI,0BAAqB,4BAAuB;AAAA,IAChD,IAAI,+BAA0B,0BAAqB;AAAA,IACnD,IAAI,iCAA4B,6BAAwB;AAAA,IACxD,IAAI,0BAAqB,0BAAqB;AAAA,IAC9C;AAAA,IACA,IAAI,8BAAyB,2BAAsB;AAAA,IACnD,IAAI,8BAAyB,0BAAqB;AAAA,EACpD;AAGA,QAAM,gBAAgB,KAAK,IAAI,MAAM,SAAS,GAAG,OAAO,CAAC;AAEzD,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,WAAW,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO,iBAAiB,CAAC,CAAC;AAAA,MAC7D;AAAA,MACA,OAAO;AAAA,MACP,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MAEZ;AAAA,wBAAAC,MAACC,QAAA,EAAK,MAAI,MAAC,OAAM,UAAU,UAAAC,KAAI,oCAAoC,GAAE;AAAA,QACrE,gBAAAF,MAACC,QAAA,EAAM,UAAAC,KAAI,GAAG,GAAE;AAAA,QACf,MAAM,IAAI,CAAC,MAAM,MAAM;AACtB,cAAI,SAAS,GAAI,QAAO,gBAAAF,MAACC,QAAA,EAAc,UAAAC,KAAI,GAAG,KAAX,CAAa;AAChD,iBAAO,gBAAAF,MAACC,QAAA,EAAc,UAAAC,KAAI,IAAI,KAAZ,CAAc;AAAA,QAClC,CAAC;AAAA,QACD,gBAAAF,MAACC,QAAA,EAAM,UAAAC,KAAI,GAAG,GAAE;AAAA;AAAA;AAAA,EAClB;AAEJ;;;AC1EA,SAAS,YAAAC,WAAU,aAAAC,YAAW,UAAAC,SAAQ,mBAAmB;;;ACGlD,SAAS,KAAK,SAAqC;AACxD,SAAO,QAAQ,SAAS,GAAK;AAC/B;;;ADHA,SAAS,gBAAAC,eAAc,cAAAC,aAAY,mBAAmB;AACtD,SAAS,QAAAC,aAAY;;;AEHrB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,cAAc,eAAe,aAAa,QAAQ,QAAQ,YAAY,iBAAiB;AAChG,SAAS,cAAc;AAWhB,SAAS,aAAa,UAAwB;AACnD,WAAS,0BAA0B,QAAQ,GAAG;AAChD;AAEO,SAAS,WAAW,QAAsB;AAC/C,WAAS,wBAAwB,MAAM,GAAG;AAC5C;AAEO,SAAS,aAAa,UAA2B;AACtD,SAAO,SAAS,4BAA4B,QAAQ,qBAAqB,MAAM;AACjF;AAEA,IAAI,kBAAiC;AAErC,SAAS,uBAA+B;AACtC,QAAM,SAAS,KAAK,YAAY,SAAS,aAAa,kBAAkB;AACxE,QAAM,UAAU,KAAK,UAAU,GAAG,kBAAkB;AACpD,MAAI,CAAC,WAAW,OAAO,EAAG,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAChE,SAAO,QAAQ,SAAS,EAAE,WAAW,KAAK,CAAC;AAC3C,SAAO;AACT;AAEA,SAAS,YAAY,QAAyB;AAC5C,SAAO,SAAS,2BAA2B,WAAW,MAAM,CAAC,kBAAkB,MAAM;AACvF;AAEO,SAAS,kBAAkBC,MAAmB;AAEnD,MAAI,mBAAmB,YAAY,eAAe,GAAG;AACnD,aAAS,uBAAuB,WAAW,eAAe,CAAC,EAAE;AAC7D;AAAA,EACF;AAEA,QAAM,YAAY,qBAAqB;AAEvC,QAAM,eAAe,KAAK,YAAY,SAAS,aAAa,qBAAqB;AACjF,MAAI;AACJ,MAAI;AACF,eAAW,aAAa,cAAc,OAAO;AAAA,EAC/C,QAAQ;AACN,eAAW;AAAA,WAAgGA,IAAG;AAAA;AAAA,EAChH;AAEA,QAAM,WAAW,SAAS,QAAQ,gBAAgBA,IAAG;AACrD,QAAM,aAAa,KAAK,UAAU,GAAG,+BAA+B;AACpE,gBAAc,YAAY,UAAU,OAAO;AAE3C,QAAM,UAAU,cAAc;AAE9B,QAAM,YAAY,0BAA0B,WAAWA,IAAG,CAAC,SAAS,WAAW,OAAO,CAAC,uDAAuD,WAAW,SAAS,CAAC,kCAAkC,WAAW,UAAU,CAAC;AAE3N,QAAM,SAAS;AAAA,IACb,wDAAwD,WAAWA,IAAG,CAAC,IAAI,WAAW,SAAS,CAAC;AAAA,EAClG;AACA,oBAAkB,OAAO,KAAK,KAAK;AACrC;AAEA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,QAAQ,SAAS,SAAS,SAAS,MAAM,OAAO,MAAM,KAAK,CAAC;AAE5G,SAAS,gBAAgB,aAA2B;AACzD,WAAS,0BAA0B,WAAW,GAAG;AACnD;AAEO,SAAS,YAAYA,MAAa,QAAgB,MAA6E;AACpI,QAAM,SAAS,YAAY,KAAK,OAAO,GAAG,WAAW,CAAC;AACtD,QAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,MAAI;AACF,kBAAc,UAAU,MAAM,UAAU,KAAK,UAAU,IAAI,OAAO;AAClE,oBAAgBA,MAAK,QAAQ,UAAU,MAAM,IAAI;AACjD,UAAM,SAAS,aAAa,UAAU,OAAO,EAAE,KAAK;AACpD,WAAO,UAAU;AAAA,EACnB,UAAE;AACA,WAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACjD;AACF;AAEO,SAAS,eAAqB;AACnC;AAAA,IACE,uCAAuC,WAAW,gCAAgC,CAAC;AAAA,IACnF,EAAE,OAAO,WAAW,KAAK,SAAS;AAAA,EACpC;AACF;AAEO,SAAS,eAAeA,MAAa,SAAuB;AACjE;AAAA,IACE,0CAA0C,WAAWA,IAAG,CAAC,IAAI,WAAW,UAAU,QAAQ,QAAQ,MAAM,OAAO,CAAC,4CAA4C,CAAC;AAAA,IAC7J,EAAE,OAAO,WAAW,KAAK,SAAS;AAAA,EACpC;AACF;AAEO,SAAS,kBAAkB,MAAoB;AACpD,WAAS,QAAQ,WAAW,IAAI,CAAC,IAAI,EAAE,OAAO,WAAW,KAAK,SAAS,CAAC;AAC1E;AAEO,SAAS,gBAAgBA,MAAa,QAAgB,UAAkB,MAAuC;AACpH,QAAM,EAAE,IAAI,OAAO,IAAI,MAAM,IAAI,QAAQ,CAAC;AAC1C,QAAM,YAAY,OAAO,MAAM,KAAK,EAAE,CAAC,EAAG,MAAM,GAAG,EAAE,IAAI;AACzD,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACnC;AAAA,MACE,4BAA4B,CAAC,OAAO,CAAC,OAAO,WAAWA,IAAG,CAAC,IAAI,WAAW,GAAG,MAAM,IAAI,WAAW,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC9G,EAAE,OAAO,WAAW,KAAK,SAAS;AAAA,IACpC;AAAA,EACF,OAAO;AACL,aAAS,GAAG,MAAM,IAAI,WAAW,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,KAAAA,MAAK,KAAK,SAAS,CAAC;AAAA,EACxF;AACF;;;AFnFO,SAAS,WACdC,MACA,mBACA,aAAqB,MACP;AACd,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAuB;AAAA,IAC/C,UAAU,CAAC;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY,CAAC;AAAA,IACb,WAAW;AAAA,IACX,cAAc,CAAC;AAAA,IACf,OAAO;AAAA,EACT,CAAC;AAED,QAAM,gBAAgBC,QAAO,iBAAiB;AAC9C,gBAAc,UAAU;AACxB,QAAM,aAAaA,QAAO,IAAI;AAE9B,QAAM,OAAO,YAAY,YAAY;AACnC,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,EAAE,MAAM,QAAQ,KAAAF,KAAI,CAAC;AAChD,UAAI,CAAC,WAAW,QAAS;AAEzB,YAAM,WAAW,QAAQ,KACnB,QAAQ,MAAM,YAA6C,CAAC,IAC9D,CAAC;AAGL,iBAAW,KAAK,UAAU;AACxB,YAAI,EAAE,WAAW,eAAe,EAAE,cAAc;AAC9C,cAAI;AACF,cAAE,cAAc,aAAa,EAAE,YAAY;AAAA,UAC7C,QAAQ;AACN,cAAE,cAAc;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,kBAAkC;AACtC,UAAI,cAAc;AAClB,UAAI,cAAc;AAClB,UAAI,cAAc;AAClB,UAAI,aAAyB,CAAC;AAC9B,UAAI,YAAY;AAChB,UAAI,eAAyB,CAAC;AAE9B,UAAI,cAAc,SAAS;AACzB,cAAM,YAAY,MAAM,KAAK,EAAE,MAAM,UAAU,WAAW,cAAc,SAAS,KAAAA,KAAI,CAAC;AACtF,YAAI,WAAW,WAAW,UAAU,IAAI;AACtC,4BAAmB,UAAU,MAAM,WAAmC;AAAA,QACxE;AAGA,YAAI,iBAAiB,cAAc;AACjC,gBAAM,SAAS,SAAS,KAAK,OAAK,EAAE,OAAO,cAAc,OAAO;AAChE,sBAAY,QAAQ,eAAe;AAAA,QACrC;AAEA,YAAI;AACF,gBAAM,KAAK,YAAYA,MAAK,cAAc,OAAO;AACjD,cAAIG,YAAW,EAAE,GAAG;AAClB,0BAAcC,cAAa,IAAI,OAAO;AAAA,UACxC;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,YAAI;AACF,gBAAM,KAAK,SAASJ,MAAK,cAAc,OAAO;AAC9C,cAAIG,YAAW,EAAE,GAAG;AAClB,0BAAcC,cAAa,IAAI,OAAO;AAAA,UACxC;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,YAAI;AACF,gBAAM,KAAK,QAAQJ,MAAK,cAAc,OAAO;AAC7C,cAAIG,YAAW,EAAE,GAAG;AAClB,kBAAM,QAAQ,YAAY,EAAE,EAAE,OAAO,OAAK,EAAE,WAAW,QAAQ,CAAC,EAAE,KAAK;AACvE,yBAAa,MAAM,IAAI,OAAK;AAC1B,oBAAM,QAAQ,EAAE,MAAM,kBAAkB;AACxC,oBAAM,QAAQ,QAAQ,SAAS,MAAM,CAAC,GAAI,EAAE,IAAI;AAChD,oBAAM,UAAUC,cAAaC,MAAK,IAAI,CAAC,GAAG,OAAO;AACjD,qBAAO,EAAE,OAAO,QAAQ;AAAA,YAC1B,CAAC;AACD,0BAAc,WAAW,IAAI,OAAK,EAAE,OAAO,EAAE,KAAK,IAAI;AAAA,UACxD;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,YAAI;AACF,gBAAM,KAAK,WAAWL,MAAK,cAAc,OAAO;AAChD,cAAIG,YAAW,EAAE,GAAG;AAClB,2BAAe,YAAY,EAAE,EAAE,OAAO,OAAK,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,KAAK;AAAA,UACtE;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UAAI,WAAW,SAAS;AACtB,cAAM,OAAO,EAAE,UAAU,iBAAiB,aAAa,aAAa,aAAa,YAAY,WAAW,cAAc,OAAO,KAAK;AAElI,iBAAS,CAAC,SAAS;AACjB,cAAI,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,IAAI,EAAG,QAAO;AAC1D,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,WAAW,SAAS;AACtB,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,OAAQ,IAAc,QAAQ,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF,GAAG,CAACH,IAAG,CAAC;AAGR,EAAAM,WAAU,MAAM;AACd,eAAW,UAAU;AACrB,SAAK;AACL,UAAM,WAAW,YAAY,MAAM,UAAU;AAC7C,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,oBAAc,QAAQ;AAAA,IACxB;AAAA,EACF,GAAG,CAACN,MAAK,YAAY,IAAI,CAAC;AAG1B,EAAAM,WAAU,MAAM;AACd,QAAI,qBAAqB,MAAM;AAC7B,WAAK;AAAA,IACP;AAAA,EACF,GAAG,CAAC,mBAAmB,IAAI,CAAC;AAE5B,SAAO;AACT;;;AG/KA,SAAS,YAAAC,iBAAgB;AA0BlB,SAAS,eAAe,UAA8B,UAAyB;AACpF,EAAAA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,SAAS;AAAE,iBAAS,SAAS;AAAG;AAAA,MAAQ;AAChD,UAAI,IAAI,WAAW;AAAE,iBAAS,WAAW;AAAG;AAAA,MAAQ;AACpD,UAAI,IAAI,WAAW;AAAE,iBAAS,OAAO;AAAG;AAAA,MAAQ;AAChD,UAAI,IAAI,YAAY;AAAE,iBAAS,QAAQ;AAAG;AAAA,MAAQ;AAClD,UAAI,IAAI,QAAQ;AAAE,iBAAS,QAAQ;AAAG;AAAA,MAAQ;AAC9C,UAAI,IAAI,KAAK;AAAE,iBAAS,MAAM;AAAG;AAAA,MAAQ;AACzC,UAAI,UAAU,KAAK;AAAE,iBAAS,QAAQ;AAAG;AAAA,MAAQ;AAEjD,UAAI,UAAU,KAAK;AAAE,iBAAS,OAAO;AAAG;AAAA,MAAQ;AAChD,UAAI,UAAU,KAAK;AAAE,iBAAS,WAAW;AAAG;AAAA,MAAQ;AACpD,UAAI,UAAU,KAAK;AAAE,iBAAS,SAAS;AAAG;AAAA,MAAQ;AAClD,UAAI,UAAU,KAAK;AAAE,iBAAS,QAAQ;AAAG;AAAA,MAAQ;AACjD,UAAI,UAAU,KAAK;AAAE,iBAAS,aAAa;AAAG;AAAA,MAAQ;AACtD,UAAI,UAAU,KAAK;AAAE,iBAAS,UAAU;AAAG;AAAA,MAAQ;AACnD,UAAI,UAAU,KAAK;AAAE,iBAAS,aAAa;AAAG;AAAA,MAAQ;AACtD,UAAI,UAAU,KAAK;AAAE,iBAAS,WAAW;AAAG;AAAA,MAAQ;AACpD,UAAI,UAAU,KAAK;AAAE,iBAAS,aAAa;AAAG;AAAA,MAAQ;AACtD,UAAI,UAAU,KAAK;AAAE,iBAAS,SAAS;AAAG;AAAA,MAAQ;AAClD,UAAI,UAAU,KAAK;AAAE,iBAAS,WAAW;AAAG;AAAA,MAAQ;AACpD,UAAI,UAAU,KAAK;AAAE,iBAAS,OAAO;AAAG;AAAA,MAAQ;AAChD,UAAI,UAAU,KAAK;AAAE,iBAAS,QAAQ;AAAG;AAAA,MAAQ;AACjD,UAAI,UAAU,KAAK;AAAE,iBAAS,SAAS;AAAG;AAAA,MAAQ;AAClD,UAAI,UAAU,KAAK;AAAE,iBAAS,WAAW;AAAG;AAAA,MAAQ;AACpD,UAAI,UAAU,KAAK;AAAE,iBAAS,eAAe;AAAG;AAAA,MAAQ;AACxD,UAAI,UAAU,KAAK;AAAE,iBAAS,WAAW;AAAG;AAAA,MAAQ;AACpD,UAAI,UAAU,KAAK;AAAE,iBAAS,OAAO;AAAG;AAAA,MAAQ;AAAA,IAClD;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AACF;;;AC1DA,SAAS,YAAAC,iBAAgB;AAuBlB,SAAS,aAAa,MAAiB,UAAgD;AAC5F,EAAAA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,QAAQ;AAAE,iBAAS,EAAE,MAAM,UAAU,CAAC;AAAG;AAAA,MAAQ;AACzD,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,kBAAkB,CAAC;AAAG;AAAA,MAAQ;AACpE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,iBAAiB,CAAC;AAAG;AAAA,MAAQ;AACnE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,YAAY,CAAC;AAAG;AAAA,MAAQ;AAC9D,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,mBAAmB,CAAC;AAAG;AAAA,MAAQ;AACrE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,SAAS,CAAC;AAAG;AAAA,MAAQ;AAC3D,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,cAAc,CAAC;AAAG;AAAA,MAAQ;AAChE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,gBAAgB,CAAC;AAAG;AAAA,MAAQ;AAClE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,OAAO,CAAC;AAAG;AAAA,MAAQ;AACzD,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,gBAAgB,CAAC;AAAG;AAAA,MAAQ;AAClE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,eAAe,CAAC;AAAG;AAAA,MAAQ;AACjE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,OAAO,CAAC;AAAG;AAAA,MAAQ;AACzD,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,OAAO,CAAC;AAAG;AAAA,MAAQ;AACzD,YAAM,QAAQ,SAAS,OAAO,EAAE;AAChC,UAAI,CAAC,MAAM,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG;AAC7C,iBAAS,EAAE,MAAM,mBAAmB,OAAO,MAAM,CAAC;AAClD;AAAA,MACF;AACA,eAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IAC9B;AAAA,IACA,EAAE,UAAU,SAAS,SAAS;AAAA,EAChC;AAEA,EAAAA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,QAAQ;AAAE,iBAAS,EAAE,MAAM,UAAU,CAAC;AAAG;AAAA,MAAQ;AACzD,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,YAAY,CAAC;AAAG;AAAA,MAAQ;AAC9D,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,eAAe,CAAC;AAAG;AAAA,MAAQ;AACjE,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,YAAY,CAAC;AAAG;AAAA,MAAQ;AAC9D,UAAI,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,kBAAkB,CAAC;AAAG;AAAA,MAAQ;AACpE,eAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IAC9B;AAAA,IACA,EAAE,UAAU,SAAS,YAAY;AAAA,EACnC;AAEA,EAAAA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,UAAU,UAAU,KAAK;AAAE,iBAAS,EAAE,MAAM,UAAU,CAAC;AAAG;AAAA,MAAQ;AAAA,IAC5E;AAAA,IACA,EAAE,UAAU,SAAS,OAAO;AAAA,EAC9B;AACF;;;ACnEA,SAAS,YAAAC,iBAAgB;AAElB,SAAS,gBAAgB,MAAoB;AAClD,EAAAA,UAAS,UAAU,EAAE,OAAO,KAAK,CAAC;AACpC;;;ACJA,SAAS,QAAAC,aAAY;AAiBrB,SAAS,eAAe,GAA2B;AACjD,MAAI,EAAE,WAAW,YAAa,QAAO;AAErC,QAAM,OAAO,EAAE,eAAe;AAC9B,MAAI,EAAE,WAAW,SAAU,QAAO,OAAO,IAAI;AAE7C,SAAO,OAAO,IAAI;AACpB;AAEO,SAAS,UACd,UACA,iBACA,UACAC,MACA,qBAA+B,CAAC,GACpB;AACZ,QAAM,QAAoB,CAAC;AAE3B,QAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM;AAC1C,UAAM,UAAU,eAAe,CAAC,IAAI,eAAe,CAAC;AACpD,QAAI,YAAY,EAAG,QAAO;AAE1B,WAAO,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,EACzE,CAAC;AAED,aAAW,KAAK,QAAQ;AACtB,UAAM,gBAAgB,WAAW,EAAE,EAAE;AACrC,UAAM,aAAa,iBAAiB,OAAO,EAAE;AAC7C,UAAM,aAAa,SAAS,IAAI,aAAa;AAE7C,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU,cAAc;AAAA,MACxB,WAAW,EAAE;AAAA,MACb,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE;AAAA,MACV,YAAY,aAAc,iBAAiB,mBAAmB,UAAU,IAAK;AAAA,MAC7E,YAAY,EAAE;AAAA,MACd,WAAW,EAAE;AAAA,MACb,aAAa,aAAa,iBAAiB,cAAc;AAAA,IAC3D,CAA2B;AAG3B,QAAI,CAAC,cAAc,CAAC,cAAc,CAAC,gBAAiB;AAEpD,UAAM,SAAS,CAAC,GAAG,gBAAgB,kBAAkB,EAAE,QAAQ;AAC/D,UAAM,gBAAgB,IAAI;AAAA,MACxB,gBAAgB,mBAAmB,QAAQ,CAAC,MAAM,EAAE,aAAa;AAAA,IACnE;AAEA,eAAW,SAAS,QAAQ;AAC1B,YAAM,cAAc,SAAS,EAAE,EAAE,IAAI,MAAM,KAAK;AAChD,YAAM,gBAAgB,SAAS,IAAI,WAAW;AAG9C,YAAM,cAAc,gBAAgB,OAAO;AAAA,QAAO,CAAC,MACjD,MAAM,cAAc,SAAS,EAAE,EAAE;AAAA,MACnC;AAGA,YAAM,WAAW,UAAU,OAAO,CAAC;AACnC,YAAM,aAAa,WACf,gBAAgB,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC,IAC7D,CAAC;AACL,YAAM,iBAAiB,CAAC,GAAG,aAAa,GAAG,UAAU;AAErD,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY,eAAe,SAAS;AAAA,QACpC,UAAU;AAAA,QACV,WAAW,EAAE;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,QACnB,YAAY,eAAe;AAAA,QAC3B,MAAM,MAAM;AAAA,MACd,CAAyB;AAEzB,UAAI,CAAC,cAAe;AAEpB,iBAAW,SAAS,gBAAgB;AAClC,cAAM,cAAc,SAAS,EAAE,EAAE,IAAI,MAAM,EAAE;AAC7C,cAAM,aAAa,MAAM,QAAQ,SAAS;AAC1C,cAAM,gBAAgB,SAAS,IAAI,WAAW;AAE9C,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU,iBAAiB;AAAA,UAC3B,WAAW,EAAE;AAAA,UACb,SAAS,MAAM;AAAA,UACf,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,QAAQ,MAAM;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,aAAa,MAAM;AAAA,UACnB,aAAa,MAAM,QAAQ;AAAA,QAC7B,CAAyB;AAEzB,YAAI,CAAC,iBAAiB,CAAC,WAAY;AAEnC,iBAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,QAAQ,MAAM;AAChD,gBAAM,SAAS,MAAM,QAAQ,EAAE;AAC/B,gBAAM,KAAK;AAAA,YACT,IAAI,UAAU,EAAE,EAAE,IAAI,MAAM,EAAE,IAAI,EAAE;AAAA,YACpC,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,WAAW,EAAE;AAAA,YACb,aAAa;AAAA,YACb,YAAY,OAAO;AAAA,YACnB,WAAW,OAAO;AAAA,YAClB,SAAS,MAAM;AAAA,UACjB,CAA0B;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,gBAAgB,YAAY,CAAC;AAC9C,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,aAAa,YAAY,EAAE,EAAE;AACnC,YAAM,eAAe,SAAS,IAAI,UAAU;AAE5C,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,WAAW,EAAE;AAAA,QACb,OAAO,SAAS;AAAA,MAClB,CAA4B;AAE5B,UAAI,cAAc;AAChB,mBAAW,OAAO,UAAU;AAC1B,gBAAM,cACJ,IAAI,OAAO,SAAS,SAChB,QACA,IAAI,OAAO,SAAS,UAClB,IAAI,OAAO,UACX;AAER,gBAAM,KAAK;AAAA,YACT,IAAI,WAAW,EAAE,EAAE,IAAI,IAAI,EAAE;AAAA,YAC7B,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,WAAW,EAAE;AAAA,YACb,WAAW,IAAI;AAAA,YACf,QAAQ;AAAA,YACR,SAAS,IAAI,WAAW,IAAI;AAAA,YAC5B,WAAW,IAAI;AAAA,UACjB,CAA2B;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,aAAa,qBAAqB,CAAC;AAExD,UAAM,YAAY,WAAW,EAAE,EAAE;AACjC,UAAM,cAAc,SAAS,IAAI,SAAS;AAE1C,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,YAAY,aAAa,SAAS;AAAA,MAClC,UAAU,eAAe,aAAa,SAAS;AAAA,MAC/C,WAAW,EAAE;AAAA,MACb,WAAW,aAAa;AAAA,IAC1B,CAA2B;AAE3B,QAAI,eAAe,aAAa,SAAS,GAAG;AAC1C,iBAAW,YAAY,cAAc;AACnC,cAAM,KAAK;AAAA,UACT,IAAI,gBAAgB,EAAE,EAAE,IAAI,QAAQ;AAAA,UACpC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW,EAAE;AAAA,UACb,OAAO;AAAA,UACP,UAAUC,MAAK,WAAWD,MAAK,EAAE,EAAE,GAAG,QAAQ;AAAA,QAChD,CAA+B;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,gBAAgB,OAAmB,OAAuB;AACxE,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,CAAC,QAAQ,KAAK,UAAU,EAAG,QAAO;AACtC,QAAM,cAAc,KAAK,QAAQ;AACjC,WAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;AACnC,QAAI,MAAM,CAAC,EAAG,UAAU,YAAa,QAAO;AAC5C,QAAI,MAAM,CAAC,EAAG,QAAQ,YAAa,QAAO;AAAA,EAC5C;AACA,SAAO;AACT;;;AxBnMA,SAAS,gBAAAE,eAAc,cAAAC,mBAAkB;AA0uB/B,gBAAAC,OAyRF,QAAAC,aAzRE;AAjuBV,SAAS,cAAc,cAA0C;AAC/D,MAAI,aAAc,QAAO;AACzB,MAAI,QAAQ,IAAI,OAAQ,QAAO,QAAQ,IAAI;AAC3C,SAAO;AACT;AAEO,SAAS,IAAI,EAAE,KAAAC,KAAI,GAAU;AAClC,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,OAAO,OAAO,WAAW;AAC/B,QAAM,SAAS,WAAWA,IAAG;AAG7B,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,CAAC;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AAC/D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAoB,UAAU;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAwB,IAAI;AAC9E,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,CAAC;AAC9D,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,CAAC;AAC1D,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAqC,MAAM;AAC7E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAwB,IAAI;AACtE,QAAM,kBAAkBC,QAAsB,IAAI;AAClD,QAAM,eAAeA,QAAmB,CAAC,CAAC;AAG1C,QAAM,EAAE,UAAU,iBAAiB,aAAa,aAAa,aAAa,YAAY,WAAW,cAAc,MAAM,IAAI,WAAWF,MAAK,iBAAiB;AAG1J,QAAM,mBAAmBG,SAAQ,MAAM;AACrC,QAAI,CAAC,aAAc,QAAO;AAC1B,UAAM,IAAI,aAAa,YAAY;AACnC,WAAO,SAAS;AAAA,MACd,CAAC,MAAM,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,YAAY,EAAE,SAAS,CAAC;AAAA,IAC1E;AAAA,EACF,GAAG,CAAC,UAAU,YAAY,CAAC;AAG3B,QAAM,QAAQA;AAAA,IACZ,MAAM,UAAU,kBAAkB,iBAAiB,UAAUH,MAAK,YAAY;AAAA,IAC9E,CAAC,kBAAkB,iBAAiB,UAAUA,MAAK,YAAY;AAAA,EACjE;AAIA,MAAI,UAAU,aAAa,SAAS;AAClC,UAAM,OAAO,MAAM,WAAW;AAC9B,QAAI,KAAM,iBAAgB,UAAU,KAAK;AAAA,EAC3C,WAAW,gBAAgB,YAAY,QAAQ,MAAM,SAAS,GAAG;AAC/D,oBAAgB,UAAU,MAAM,CAAC,GAAG,MAAM;AAAA,EAC5C;AACA,eAAa,UAAU;AAGvB,EAAAI,WAAU,MAAM;AACd,UAAM,OAAO,MAAM,WAAW;AAC9B,UAAM,KAAK,MAAM,aAAa;AAC9B,QAAI,OAAO,mBAAmB;AAC5B,2BAAqB,EAAE;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,iBAAiB,CAAC;AAG1C,EAAAA,WAAU,MAAM;AACd,0BAAsB,CAAC;AACvB,wBAAoB,CAAC;AAAA,EACvB,GAAG,CAAC,WAAW,CAAC;AAGhB,EAAAA,WAAU,MAAM;AACd,QAAI,MAAM,WAAW,GAAG;AACtB,qBAAe,CAAC;AAChB;AAAA,IACF;AACA,UAAM,WAAW,gBAAgB;AACjC,QAAI,CAAC,UAAU;AACb,sBAAgB,UAAU,MAAM,CAAC,GAAG,MAAM;AAC1C;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG,OAAO,SAAU;AAGzC,UAAM,WAAW,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AACzD,QAAI,aAAa,IAAI;AACnB,qBAAe,QAAQ;AAAA,IACzB,OAAO;AAEL,YAAM,UAAU,KAAK,IAAI,aAAa,MAAM,SAAS,CAAC;AACtD,qBAAe,OAAO;AACtB,sBAAgB,UAAU,MAAM,OAAO,GAAG,MAAM;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAGV,QAAM,oBAAoBF,QAAe,CAAC;AAC1C,EAAAE,WAAU,MAAM;AACd,QAAI,CAAC,gBAAiB;AACtB,UAAM,gBAAgB,WAAW,gBAAgB,EAAE;AACnD,UAAM,SAAS,gBAAgB;AAE/B,gBAAY,CAAC,SAAS;AAEpB,UAAI,CAAC,KAAK,IAAI,aAAa,GAAG;AAC5B,0BAAkB,UAAU,OAAO;AACnC,eAAO;AAAA,MACT;AACA,UAAI,OAAO,WAAW,GAAG;AACvB,0BAAkB,UAAU;AAC5B,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,OAAO,OAAO,SAAS,CAAC;AACvC,YAAM,WAAW,SAAS,gBAAgB,EAAE,IAAI,OAAO,KAAK;AAE5D,UAAI,OAAO;AACX,UAAI,OAAO,SAAS,kBAAkB,WAAW,kBAAkB,UAAU,GAAG;AAE9E,cAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,YAAI,WAAW;AACb,gBAAM,SAAS,SAAS,gBAAgB,EAAE,IAAI,UAAU,KAAK;AAC7D,iBAAO,IAAI,IAAI,IAAI;AACnB,eAAK,OAAO,MAAM;AAClB,eAAK,IAAI,QAAQ;AAAA,QACnB;AAAA,MACF,WAAW,CAAC,KAAK,IAAI,QAAQ,GAAG;AAE9B,eAAO,IAAI,IAAI,IAAI;AACnB,aAAK,IAAI,QAAQ;AAAA,MACnB;AAEA,wBAAkB,UAAU,OAAO;AACnC,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,iBAAiB,mBAAmB,QAAQ,iBAAiB,EAAE,CAAC;AAGpE,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,UAAM,IAAI,WAAW,MAAM,gBAAgB,IAAI,GAAG,GAAI;AACtD,WAAO,MAAM,aAAa,CAAC;AAAA,EAC7B,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,SAASC,aAAY,CAAC,QAAgB,gBAAgB,GAAG,GAAG,CAAC,CAAC;AAEpE,QAAM,UAAU;AAChB,QAAM,SAAS,SAAS,UAAU,CAAC;AAGnC,QAAM,aAAmC,MAAM,WAAW;AAG1D,QAAM,kBAAkBA;AAAA,IACtB,CAAC,SAA+B;AAC9B,UAAI,CAAC,QAAQ,CAAC,QAAS,QAAO;AAC9B,UAAI,KAAK,SAAS,QAAS,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,KAAK;AAC/E,UAAI,KAAK,SAAS,SAAU,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,KAAK;AAChF,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,MAAM;AAAA,EAClB;AAGA,QAAM,gBAAgBA;AAAA,IACpB,OAAO,SAAkB,eAAuB;AAC9C,UAAI;AACF,cAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,eAAO,IAAI,KAAK,aAAa,UAAU,IAAI,KAAK,EAAE;AAAA,MACpD,SAAS,KAAK;AACZ,eAAO,UAAW,IAAc,OAAO,EAAE;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAGA,QAAM,eAAeA;AAAA,IACnB,CAAC,WAAmB;AAClB,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAI,KAAK,IAAI,MAAM,EAAG,MAAK,OAAO,MAAM;AAAA,YACnC,MAAK,IAAI,MAAM;AACpB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,aAAaA;AAAA,IACjB,CAAC,WAAmB;AAClB,kBAAY,CAAC,SAAS;AACpB,YAAI,KAAK,IAAI,MAAM,EAAG,QAAO;AAC7B,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,IAAI,MAAM;AACf,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,eAAeA;AAAA,IACnB,CAAC,WAAmB;AAClB,kBAAY,CAAC,SAAS;AACpB,YAAI,CAAC,KAAK,IAAI,MAAM,EAAG,QAAO;AAC9B,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,OAAO,MAAM;AAClB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,YAAY;AAClB,QAAM,iBAAiB,OAAO;AAC9B,QAAM,cAAc,WAAW,KAAK,MAAM,iBAAiB,GAAG,IAAI;AAClE,QAAM,YAAY,WAAW,iBAAiB,cAAc;AAC5D,QAAM,gBAAgB,OAAO;AAG7B;AAAA,IACE;AAAA,MACE,UAAU,MAAM;AACd,YAAI,cAAc,UAAU;AAC1B,gCAAsB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QACjD,WAAW,cAAc,QAAQ;AAC/B,8BAAoB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QAC/C,OAAO;AACL,yBAAe,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,cAAc,UAAU;AAC1B,gCAAsB,CAAC,MAAM,IAAI,CAAC;AAAA,QACpC,WAAW,cAAc,QAAQ;AAC/B,8BAAoB,CAAC,MAAM,IAAI,CAAC;AAAA,QAClC,OAAO;AACL,yBAAe,CAAC,MAAM,KAAK,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,MACA,QAAQ,MAAM;AACZ,YAAI,cAAc,QAAQ;AACxB,uBAAa,QAAQ;AACrB;AAAA,QACF;AACA,YAAI,cAAc,UAAU;AAC1B,uBAAa,MAAM;AACnB;AAAA,QACF;AACA,cAAM,OAAO,MAAM,WAAW;AAC9B,YAAI,CAAC,KAAM;AACX,YAAI,KAAK,UAAU;AACjB,uBAAa,KAAK,EAAE;AAAA,QACtB,OAAO;AAEL,gBAAM,YAAY,gBAAgB,OAAO,WAAW;AACpD,cAAI,cAAc,YAAa,gBAAe,SAAS;AAAA,QACzD;AAAA,MACF;AAAA,MACA,SAAS,MAAM;AACb,cAAM,OAAO,MAAM,WAAW;AAC9B,YAAI,CAAC,KAAM;AACX,YAAI,KAAK,cAAc,CAAC,KAAK,UAAU;AACrC,qBAAW,KAAK,EAAE;AAElB,cAAI,KAAK,SAAS,aAAa,iBAAiB,OAAO,KAAK,WAAW;AACrE,kBAAM,SAAS,gBAAgB;AAC/B,gBAAI,OAAO,SAAS,GAAG;AACrB,oBAAM,SAAS,OAAO,OAAO,SAAS,CAAC;AACvC,yBAAW,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;AAAA,YACtD;AAAA,UACF;AAAA,QACF,WAAW,KAAK,cAAc,KAAK,UAAU;AAE3C,cAAI,cAAc,IAAI,MAAM,UAAU,MAAM,cAAc,CAAC,EAAG,QAAQ,KAAK,OAAO;AAChF,2BAAe,cAAc,CAAC;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,MAAM;AACX,qBAAa,CAAC,MAAM;AAClB,cAAI,MAAM,OAAQ,QAAO;AACzB,cAAI,MAAM,SAAU,QAAO,WAAW,SAAS;AAC/C,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,cAAc,MAAM;AAClB,oBAAY,CAAC,SAAS;AACpB,cAAI,MAAM;AAER,yBAAa,CAAC,MAAO,MAAM,SAAS,WAAW,CAAE;AACjD,gCAAoB,CAAC;AAAA,UACvB;AACA,iBAAO,CAAC;AAAA,QACV,CAAC;AAAA,MACH;AAAA,MACA,SAAS,MAAM;AACb,gBAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,SAAS,MAAM;AACb,cAAM,OAAO,MAAM,WAAW;AAC9B,YAAI,CAAC,KAAM;AACX,YAAI,KAAK,cAAc,CAAC,KAAK,UAAU;AACrC,qBAAW,KAAK,EAAE;AAElB,cAAI,KAAK,SAAS,aAAa,iBAAiB,OAAO,KAAK,WAAW;AACrE,kBAAM,SAAS,gBAAgB;AAC/B,gBAAI,OAAO,SAAS,GAAG;AACrB,oBAAM,SAAS,OAAO,OAAO,SAAS,CAAC;AACvC,yBAAW,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;AAAA,YACtD;AAAA,UACF;AAAA,QACF,WAAW,KAAK,SAAS,UAAU;AACjC,kBAAQ,eAAe;AAAA,QACzB,WAAW,KAAK,SAAS,gBAAgB;AACvC,gBAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,cAAI;AACF,4BAAgBL,MAAK,QAAQ,KAAK,QAAQ;AAAA,UAC5C,QAAQ;AACN,mBAAO,+BAA+B;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW,MAAM;AACf,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG;AAAA,QAAQ;AACjE,cAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,YAAI;AACF,gBAAM,UAAU,YAAYA,MAAK,MAAM;AACvC,cAAI,SAAS;AACX,iBAAK;AAAA,cACH,EAAE,MAAM,WAAW,WAAW,mBAAmB,QAAQ;AAAA,cACzD;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AACN,iBAAO,uBAAuB;AAAA,QAChC;AAAA,MACF;AAAA;AAAA,MAEA,cAAc,MAAM;AAClB,YAAI,CAAC,SAAS,cAAc;AAAE,iBAAO,gBAAgB;AAAG;AAAA,QAAQ;AAChE,YAAI,QAAQ,gBAAiB,iBAAgB,QAAQ,eAAe;AACpE,qBAAa,QAAQ,YAAY;AAAA,MACnC;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG;AAAA,QAAQ;AACjE,cAAM,KAAK,SAASA,MAAK,iBAAiB;AAC1C,cAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,YAAI;AACF,0BAAgBA,MAAK,QAAQ,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAAA,QACxD,QAAQ;AACN,iBAAO,0BAA0B,MAAM,EAAE;AAAA,QAC3C;AAAA,MACF;AAAA,MACA,cAAc,MAAM;AAClB,cAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,YAAI;AACF,gBAAM,UAAU,YAAYA,MAAK,MAAM;AACvC,cAAI,SAAS;AACX,iBAAK;AAAA,cACH,EAAE,MAAM,SAAS,MAAM,SAAS,KAAAA,KAAI;AAAA,cACpC;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AACN,iBAAO,uBAAuB;AAAA,QAChC;AAAA,MACF;AAAA,MACA,UAAU,MAAM;AACd,YAAI;AACF,4BAAkBA,IAAG;AAAA,QACvB,QAAQ;AACN,iBAAO,+BAA+B;AAAA,QACxC;AAAA,MACF;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG;AAAA,QAAQ;AACjE,cAAM,KAAK,YAAYA,MAAK,iBAAiB;AAC7C,cAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,YAAI;AACF,0BAAgBA,MAAK,QAAQ,EAAE;AAAA,QACjC,QAAQ;AACN,iBAAO,6BAA6B,MAAM,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,MACA,QAAQ,MAAM,KAAK;AAAA,MACnB,SAAS,MAAM;AACb,cAAM,QAAQ,gBAAgB,UAAU;AACxC,YAAI,CAAC,SAAS,CAAC,mBAAmB;AAAE,iBAAO,2BAA2B;AAAG;AAAA,QAAQ;AACjF,sBAAc;AAAA,UACZ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW,MAAM;AAAA,UACjB,MAAM,GAAG,MAAM,IAAI;AAAA,UACnB,aAAa,MAAM;AAAA,QACrB,GAAG,cAAc,MAAM,IAAI,EAAE;AAAA,MAC/B;AAAA;AAAA,MAEA,UAAU,MAAM;AACd,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG;AAAA,QAAQ;AACjE,YAAI,SAAS,WAAW,YAAY,WAAW;AAAE,iBAAO,wBAAwB;AAAG;AAAA,QAAQ;AAC3F,gBAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG;AAAA,QAAQ;AACjE,YAAI,SAAS,WAAW,aAAa;AAAE,iBAAO,uBAAuB;AAAG;AAAA,QAAQ;AAChF,gBAAQ,UAAU;AAAA,MACpB;AAAA,MACA,gBAAgB,MAAM;AACpB,cAAM,QAAQ,gBAAgB,UAAU;AACxC,YAAI,CAAC,SAAS,CAAC,mBAAmB;AAAE,iBAAO,4BAA4B;AAAG;AAAA,QAAQ;AAClF;AAAA,UACE,EAAE,MAAM,iBAAiB,WAAW,mBAAmB,SAAS,MAAM,GAAG;AAAA,UACzE,aAAa,MAAM,EAAE;AAAA,QACvB;AAAA,MACF;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG;AAAA,QAAQ;AACjE,gBAAQ,UAAU;AAAA,MACpB;AAAA,MACA,QAAQ,MAAM;AACZ,YAAI,CAAC,cAAc,WAAW,SAAS,eAAgB;AACvD,cAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,YAAI;AACF,0BAAgBA,MAAK,QAAQ,WAAW,QAAQ;AAAA,QAClD,QAAQ;AACN,iBAAO,+BAA+B;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AAGA,eAAa,MAAM,CAAC,WAAW;AAC7B,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AACH,gBAAQ,WAAW;AACnB;AAAA,MAEF,KAAK,aAAa;AAChB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACrF,cAAM,OAAO,WAAWA,MAAK,iBAAiB;AAC9C,YAAI;AACF,0BAAgB,IAAI;AACpB,iBAAO,gBAAgB,IAAI,GAAG;AAAA,QAChC,QAAQ;AACN,iBAAO,6BAA6B;AAAA,QACtC;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,YAAI,CAAC,qBAAqB,CAAC,SAAS;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACjG,YAAI;AACF,gBAAM,MAAM,oBAAoB,SAASA,IAAG;AAC5C,0BAAgB,GAAG;AACnB,iBAAO,mBAAmB,IAAI,MAAM,SAAS;AAAA,QAC/C,QAAQ;AACN,iBAAO,wBAAwB;AAAA,QACjC;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,CAAC,aAAa;AAAE,iBAAO,iBAAiB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AAC3E,YAAI;AACF,0BAAgB,WAAW;AAC3B,iBAAO,gBAAgB,YAAY,MAAM,SAAS;AAAA,QACpD,QAAQ;AACN,iBAAO,6BAA6B;AAAA,QACtC;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK,mBAAmB;AACtB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACrF,YAAI;AACF,0BAAgB,iBAAiB;AACjC,iBAAO,sBAAsB,iBAAiB,GAAG;AAAA,QACnD,QAAQ;AACN,iBAAO,6BAA6B;AAAA,QACtC;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACrF,gBAAQ,gBAAgB;AACxB;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI;AACF,uBAAa;AAAA,QACf,QAAQ;AACN,iBAAO,0BAA0B;AAAA,QACnC;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACvB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACrF,YAAI;AACF,4BAAkB,WAAWA,MAAK,iBAAiB,CAAC;AAAA,QACtD,QAAQ;AACN,iBAAO,kCAAkC;AAAA,QAC3C;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK;AACH,gBAAQ,QAAQ;AAChB;AAAA,MAEF,KAAK,mBAAmB;AAEtB,YAAI,QAAQ;AACZ,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAI,MAAM,CAAC,GAAG,SAAS,WAAW;AAChC;AACA,gBAAI,UAAU,OAAO,OAAO;AAC1B,6BAAe,CAAC;AAChB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACrF,gBAAQ,aAAa;AACrB;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,QAAQ,gBAAgB,UAAU;AACxC,YAAI,CAAC,OAAO;AAAE,iBAAO,4BAA4B;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AAChF,yBAAiB,MAAM,EAAE;AACzB,gBAAQ,eAAe;AACvB;AAAA,MACF;AAAA,MAEA,KAAK;AACH,gBAAQ,MAAM;AACd;AAAA,MAEF,KAAK,iBAAiB;AACpB,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACrF,gBAAQ,eAAe;AACvB;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM,QAAQ,gBAAgB,UAAU;AACxC,YAAI,CAAC,OAAO,QAAQ;AAAE,iBAAO,qCAAqC;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACjG,YAAI,SAAS,gBAAiB,iBAAgB,QAAQ,eAAe;AACrE,YAAI,SAAS,aAAc,cAAa,QAAQ,YAAY;AAC5D,mBAAW,MAAM,MAAM;AACvB,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,YAAI,CAAC,mBAAmB;AAAE,iBAAO,qBAAqB;AAAG,kBAAQ,UAAU;AAAG;AAAA,QAAO;AACrF,cAAM,OAAO,MAAM,WAAW;AAC9B,YAAI,SAAS,KAAK,SAAS,WAAW,KAAK,SAAS,WAAW;AAC7D,gBAAM,UAAU,KAAK;AACrB,gBAAM,QAAQ,OAAO,KAAK,OAAK,EAAE,OAAO,OAAO;AAC/C,cAAI,OAAO,WAAW,WAAW;AAAE,mBAAO,SAAS,OAAO,iBAAiB;AAAG,oBAAQ,UAAU;AAAG;AAAA,UAAO;AAC1G,wBAAc,EAAE,MAAM,cAAc,WAAW,mBAAmB,QAAQ,GAAG,UAAU,OAAO,EAAE;AAAA,QAClG,OAAO;AACL,wBAAc,EAAE,MAAM,QAAQ,WAAW,kBAAkB,GAAG,gBAAgB;AAAA,QAChF;AACA,gBAAQ,UAAU;AAClB;AAAA,MACF;AAAA,MAEA,KAAK;AACH,aAAK;AACL;AAAA,MAEF,KAAK;AACH,gBAAQ,UAAU;AAClB;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,eAAeK;AAAA,IACnB,OAAO,SAAiB;AACtB,cAAQ,MAAM;AAAA,QACZ,KAAK,UAAU;AACb,cAAI,CAAC,kBAAmB;AACxB,gBAAM;AAAA,YACJ,EAAE,MAAM,UAAU,WAAW,mBAAmB,KAAAL,MAAK,SAAS,QAAQ,OAAU;AAAA,YAChF;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,cAAI,CAAC,kBAAmB;AACxB,cAAI;AACF,kBAAM,UAAU,MAAM,KAAK,EAAE,MAAM,YAAY,WAAW,kBAAkB,CAAC;AAC7E,gBAAI,CAAC,QAAQ,IAAI;AAAE,qBAAO,UAAU,QAAQ,KAAK,EAAE;AAAG;AAAA,YAAO;AAC7D,kBAAM;AAAA,cACJ,EAAE,MAAM,UAAU,WAAW,mBAAmB,KAAAA,MAAK,SAAS,QAAQ,OAAU;AAAA,cAChF;AAAA,YACF;AAAA,UACF,SAAS,KAAK;AACZ,mBAAO,UAAW,IAAc,OAAO,EAAE;AAAA,UAC3C;AACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,cAAI,CAAC,kBAAmB;AACxB,gBAAM,UAAU,SAAS,MAAM,EAAE;AACjC,cAAI,MAAM,OAAO,KAAK,UAAU,GAAG;AAAE,mBAAO,sBAAsB;AAAG;AAAA,UAAO;AAC5E,gBAAM;AAAA,YACJ,EAAE,MAAM,YAAY,WAAW,mBAAmB,KAAAA,MAAK,QAAQ;AAAA,YAC/D,wBAAwB,OAAO;AAAA,UACjC;AACA;AAAA,QACF;AAAA,QACA,KAAK,kBAAkB;AACrB,cAAI,CAAC,kBAAmB;AACxB,cAAI,SAAS,OAAO;AAAE,mBAAO,0CAA0C;AAAG;AAAA,UAAO;AACjF,gBAAM;AAAA,YACJ,EAAE,MAAM,UAAU,WAAW,mBAAmB,KAAAA,KAAI;AAAA,YACpD;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,eAAe;AAClB,cAAI,CAAC,kBAAmB;AACxB,cAAI,CAAC,KAAK,KAAK,GAAG;AAAE,mBAAO,sBAAsB;AAAG;AAAA,UAAO;AAC3D,gBAAM;AAAA,YACJ;AAAA,cACE,MAAM;AAAA,cACN,WAAW;AAAA,cACX,WAAW;AAAA,cACX,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,UAAU;AACb,0BAAgB,KAAK,KAAK,KAAK,IAAI;AACnC;AAAA,QACF;AAAA,QACA,KAAK,iBAAiB;AACpB,cAAI,CAAC,qBAAqB,CAAC,cAAe;AAC1C,gBAAM;AAAA,YACJ,EAAE,MAAM,WAAW,WAAW,mBAAmB,SAAS,MAAM,QAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,EAAE;AAAA,YAClH,mBAAmB,aAAa;AAAA,UAClC;AACA,2BAAiB,IAAI;AACrB;AAAA,QACF;AAAA,QACA,KAAK,iBAAiB;AACpB,cAAI,CAAC,KAAK,KAAK,EAAG;AAClB,cAAI;AACF,2BAAeA,MAAK,IAAI;AAAA,UAC1B,QAAQ;AACN,mBAAO,6BAA6B;AAAA,UACtC;AACA;AAAA,QACF;AAAA,MACF;AACA,cAAQ,UAAU;AAAA,IACpB;AAAA,IACA,CAAC,MAAM,mBAAmB,eAAeA,MAAK,QAAQ,aAAa;AAAA,EACrE;AAEA,QAAM,eAAeK,aAAY,MAAM;AACrC,YAAQ,UAAU;AAClB,iBAAa,MAAM;AACnB,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,CAAC;AAGL,QAAM,cAAcF,SAAQ,MAAM;AAChC,QAAI,SAAS,gBAAiB,QAAO,gBAAgB,UAAU;AAC/D,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,YAAY,eAAe,CAAC;AAEtC,QAAM,eAAeA;AAAA,IACnB,MAAO,cAAc,eAAe,YAAY,OAAO,IAAI,CAAC;AAAA,IAC5D,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,cAAcA,SAAQ,MAAM;AAChC,QAAI,CAAC,WAAY,QAAO;AACxB,QAAI,WAAW,SAAS,WAAW,WAAW,SAAS,UAAU;AAC/D,aAAO,gBAAgB,UAAU;AAAA,IACnC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,eAAe,CAAC;AAEhC,QAAM,qBAAqBA;AAAA,IACzB,MAAO,cAAc,eAAe,YAAY,OAAO,IAAI,CAAC;AAAA,IAC5D,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,qBAAqBA,SAAQ,MAAM;AACvC,QAAI,CAAC,cAAc,WAAW,SAAS,eAAgB,QAAO;AAC9D,QAAI;AACF,UAAIG,YAAW,WAAW,QAAQ,GAAG;AACnC,eAAOC,cAAa,WAAW,UAAU,OAAO;AAAA,MAClD;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,oBAAoBF;AAAA,IACxB,CAACG,cAAqBC,mBAA0B;AAE9C,UAAI,SAAS,mBAAmB,aAAa;AAC3C,eACE,gBAAAX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP;AAAA,YACA,OAAOU;AAAA,YACP,QAAQC;AAAA,YACR,SAAS;AAAA;AAAA,QACX;AAAA,MAEJ;AAEA,UAAI,CAAC,cAAc,CAAC,SAAS;AAC3B,eACE,gBAAAX;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,aAAY;AAAA,YACZ,aAAY;AAAA,YACZ,aAAY;AAAA,YACZ,OAAOU;AAAA,YACP,QAAQC;AAAA,YACR,WAAW;AAAA;AAAA,QACb;AAAA,MAEJ;AAEA,cAAQ,WAAW,MAAM;AAAA,QACvB,KAAK;AACH,iBACE,gBAAAX;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR;AAAA,cACA,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,QAGJ,KAAK,SAAS;AACZ,gBAAM,QAAQ,QAAQ,mBAAmB;AAAA,YACvC,CAAC,MAAM,EAAE,UAAU,WAAW;AAAA,UAChC;AACA,cAAI,CAAC,OAAO;AACV,mBACE,gBAAAX;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,OAAOU;AAAA,gBACP,QAAQC;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,gBACd,SAAS,cAAc;AAAA;AAAA,YACzB;AAAA,UAEJ;AACA,iBACE,gBAAAX;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,QAAQ,QAAQ;AAAA,cAChB,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,QAEJ;AAAA,QAEA,KAAK,SAAS;AACZ,gBAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,OAAO;AAC5D,cAAI,CAAC,OAAO;AACV,mBACE,gBAAAX;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,OAAOU;AAAA,gBACP,QAAQC;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,gBACd,SAAS,cAAc;AAAA;AAAA,YACzB;AAAA,UAEJ;AACA,iBACE,gBAAAX;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,cAAc;AAAA,cACd,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,QAEJ;AAAA,QAEA,KAAK,UAAU;AACb,gBAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,OAAO;AAC5D,cAAI,CAAC,OAAO;AACV,mBACE,gBAAAX;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,OAAOU;AAAA,gBACP,QAAQC;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,gBACd,SAAS,cAAc;AAAA;AAAA,YACzB;AAAA,UAEJ;AAEA,gBAAM,YAAY,WAAW;AAC7B,gBAAM,gBAAgB,mBAAmB,KAAK,CAAC,IAAI,MAAM;AAEvD,kBAAM,cAAc,MAAM,QAAQ,SAAS,IAAI;AAC/C,mBAAO,gBAAgB;AAAA,UACzB,CAAC;AACD,cAAI,eAAe;AACjB,kBAAM,QAAQ,cAAc,SAAS,UAAU,UAAU;AACzD,kBAAM,aAAa,cAAc,SAAS,UAAU,SAAS;AAC7D,kBAAM,qBAAmC;AAAA,cACvC,CAAC,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,OAAO,WAAW,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,SAAM,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO,MAAM,SAAS,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,cAC7I,WAAW,KAAK,WAAW,cAAc,SAAS,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,cACpE,WAAW,GAAG;AAAA,cACd,CAAC,IAAI,oBAAe,EAAE,OAAO,YAAY,MAAM,KAAK,CAAC,CAAC;AAAA,cACtD,GAAG,SAAS,cAAc,QAAQ,KAAK,GAAGD,eAAc,CAAC,EAAE,IAAI,OAAK,WAAW,OAAO,CAAC,EAAE,CAAC;AAAA,YAC5F;AACA,mBACE,gBAAAV;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,OAAOU;AAAA,gBACP,QAAQC;AAAA,gBACR,cAAc;AAAA,gBACd,SAAS,cAAc;AAAA,gBACvB,aAAa;AAAA;AAAA,YACf;AAAA,UAEJ;AACA,iBACE,gBAAAX;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,cAAc;AAAA,cACd,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,QAEJ;AAAA,QAEA,KAAK,YAAY;AACf,gBAAM,YAA0B;AAAA,YAC9B,WAAW,cAAc,QAAQ,SAAS,MAAM,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,UACrE;AACA,cAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,sBAAU,KAAK,WAAW,iBAAiB,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,UACzE,OAAO;AACL,uBAAW,OAAO,QAAQ,UAAU;AAClC,oBAAM,OAAO,WAAW,IAAI,SAAS;AACrC,oBAAM,QAAQ,IAAI,OAAO,SAAS,SAAS,QAAQ,IAAI,OAAO,SAAS,UAAU,IAAI,OAAO,UAAU;AACtG,oBAAM,aAAa,IAAI,OAAO,SAAS,SAAS,WAAW,IAAI,OAAO,SAAS,UAAU,SAAS;AAClG,oBAAM,aAAa,KAAK,IAAI,IAAID,eAAc,MAAM,SAAS,EAAE;AAC/D,wBAAU,KAAK;AAAA,gBACb,IAAI,MAAM,IAAI,MAAM,EAAE,KAAK,KAAK,CAAC;AAAA,gBACjC,IAAI,GAAG,KAAK,MAAM,EAAE,OAAO,YAAY,MAAM,KAAK,CAAC;AAAA,gBACnD,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,UAAU,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AAAA,cACnE,CAAC;AAAA,YACH;AAAA,UACF;AACA,iBACE,gBAAAV;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,QAEJ;AAAA,QAEA,KAAK,WAAW;AACd,gBAAM,MAAM,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,SAAS;AACtE,gBAAM,kBAAgC;AAAA,YACpC,WAAW,YAAY,EAAE,MAAM,KAAK,CAAC;AAAA,UACvC;AACA,cAAI,KAAK;AACP,4BAAgB,KAAK,WAAW,KAAK,WAAW,MAAM,SAAM,WAAW,SAAS,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAClG,uBAAW,KAAK,SAAS,IAAI,SAASD,eAAc,CAAC,GAAG;AACtD,8BAAgB,KAAK,WAAW,KAAK,CAAC,EAAE,CAAC;AAAA,YAC3C;AAAA,UACF,OAAO;AACL,4BAAgB,KAAK,WAAW,uBAAuB,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,UACvE;AACA,iBACE,gBAAAV;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,QAEJ;AAAA,QAEA,KAAK,WAAW;AACd,gBAAM,WAAyB;AAAA,YAC7B,CAAC,IAAI,GAAG,GAAG,IAAI,UAAK,EAAE,OAAO,QAAQ,CAAC,GAAG,IAAI,aAAa,aAAa,MAAM,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,UACnG;AACA,cAAI,aAAa,WAAW,GAAG;AAC7B,qBAAS,KAAK,WAAW,6BAA6B,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,UACtE,OAAO;AACL,uBAAW,KAAK,cAAc;AAC5B,uBAAS,KAAK,WAAW,UAAO,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,YACrD;AAAA,UACF;AACA,iBACE,gBAAAX;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,QAEJ;AAAA,QAEA,KAAK,gBAAgB;AACnB,gBAAM,eAA6B;AAAA,YACjC,CAAC,IAAI,GAAG,GAAG,IAAI,UAAK,EAAE,OAAO,QAAQ,CAAC,GAAG,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,YACpF,WAAW,GAAG;AAAA,UAChB;AACA,cAAI,sBAAsB,MAAM;AAC9B,yBAAa,KAAK,WAAW,mCAAmC,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,UAChF,OAAO;AACL,kBAAM,UAAU,SAAS,cAAc,iBAAiB,kBAAkB,CAAC,GAAGD,eAAc,CAAC;AAC7F,gBAAI,QAAQ,WAAW,GAAG;AACxB,2BAAa,KAAK,WAAW,aAAa,EAAE,KAAK,KAAK,CAAC,CAAC;AAAA,YAC1D,OAAO;AACL,yBAAW,KAAK,SAAS;AACvB,6BAAa,KAAK,WAAW,OAAO,CAAC,EAAE,CAAC;AAAA,cAC1C;AAAA,YACF;AAAA,UACF;AACA,iBACE,gBAAAV;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR,cAAc;AAAA,cACd,SAAS,cAAc;AAAA,cACvB,aAAY;AAAA;AAAA,UACd;AAAA,QAEJ;AAAA,QAEA;AACE,iBACE,gBAAAX;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAOU;AAAA,cACP,QAAQC;AAAA,cACR;AAAA,cACA,cAAc;AAAA,cACd,SAAS,cAAc;AAAA;AAAA,UACzB;AAAA,MAEN;AAAA,IACF;AAAA,IACA,CAAC,YAAY,SAAS,aAAa,aAAa,aAAa,WAAW,QAAQ,MAAM,aAAa,cAAc,oBAAoB,cAAc,oBAAoB,WAAW,cAAc,kBAAkB;AAAA,EACpN;AAEA,MAAI,OAAO,MAAM,OAAO,IAAI;AAC1B,WACE,gBAAAV,MAACW,OAAA,EAAI,eAAc,UAAS,OAAO,MAAM,QAAQ,MAAM,gBAAe,UAAS,YAAW,UACxF;AAAA,sBAAAZ,MAACa,QAAA,EAAK,OAAM,UAAS,MAAI,MAAC,gCAAkB;AAAA,MAC5C,gBAAAZ,MAACY,QAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAA0B;AAAA,QAAK;AAAA,QAAE;AAAA,QAAK;AAAA,SAAC;AAAA,MACtD,gBAAAb,MAACa,QAAA,EAAK,UAAQ,MAAC,iDAAmC;AAAA,OACpD;AAAA,EAEJ;AAEA,SACE,gBAAAZ,MAACW,OAAA,EAAI,eAAc,UAAS,OAAO,MAAM,QAAQ,MAC/C;AAAA,oBAAAX,MAACW,OAAA,EAAI,eAAc,OAAM,QAAQ,eAC/B;AAAA,sBAAAZ;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS,SAAS,cAAc,cAAc;AAAA;AAAA,MAChD;AAAA,MAEC,kBAAkB,aAAa,aAAa;AAAA,MAC5C,YACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,kBAAkB,aAAa,CAAC;AAAA,UAC3C,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,SAAS,SAAS,cAAc,cAAc;AAAA;AAAA,MAChD;AAAA,OAEJ;AAAA,IAEC,gBACC,gBAAAA,MAACY,OAAA,EAAI,UAAU,GACb,0BAAAZ,MAACa,QAAA,EAAK,OAAM,UAAS,MAAI,MACtB,0BAAgB,KAAK,YAAY,IAC9B,UAAK,YAAY,KACjB,8CAA8C,KAAK,YAAY,IAC7D,UAAK,YAAY,KACjB,UAAK,YAAY,IACzB,GACF;AAAA,IAGD,SAAS,CAAC,gBACT,gBAAAb,MAACY,OAAA,EAAI,UAAU,GACb,0BAAAX,MAACY,QAAA,EAAK,OAAM,OAAM;AAAA;AAAA,MAAG;AAAA,OAAM,GAC7B;AAAA,IAGF,gBAAAb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,aAAa,SAAS,cAAc,YAAY,SAAS,UAAU,OAAO,WAAW,WAAW,IAAI;AAAA,QACpG,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,IACZ;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,eAAe,cAAc;AAAA,QAC7B,aAAa,cAAc;AAAA,QAC3B;AAAA,QACA,gBAAgB,YAAY;AAAA;AAAA,IAC9B;AAAA,IAEA,gBAAAA,MAAC,iBAAc,MAAY,MAAY,MAAY;AAAA,IACnD,gBAAAA,MAAC,eAAY,MAAY,MAAY,MAAY;AAAA,KACnD;AAEJ;;;ADvlCO,gBAAAc,aAAA;AAZP,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAEjC,SAAS,OAAO,MAAkC;AAChD,QAAM,MAAM,KAAK,QAAQ,KAAK,IAAI,EAAE;AACpC,MAAI,QAAQ,MAAM,MAAM,IAAI,KAAK,QAAQ;AACvC,WAAO,KAAK,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AAEA,IAAM,MAAM,OAAO,KAAK,KAAK,QAAQ,IAAI;AAEzC,OAAO,gBAAAA,MAAC,OAAI,KAAU,CAAE;","names":["useState","useEffect","useCallback","useMemo","useRef","Box","Text","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","Box","Text","jsx","jsxs","useMemo","lines","Box","Text","useState","Box","Text","useInput","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","existsSync","readFileSync","detailWidth","contentHeight","Box","Text","jsx"]}
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 } 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, cleanMarkdown, stripFrontmatter, seg, singleLine, 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 // 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 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 } 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 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 } 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 // 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 onClose={handleCancel}\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 badge = specificBlock.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = specificBlock.type === 'final' ? 'cyan' : 'yellow';\n const reportContentLines: DetailLine[] = [\n [seg(' '), seg(badge, { color: badgeColor }), seg(` ${agent.id} · ${agent.name !== agent.id ? agent.name : agent.agentType}`, { 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 label = msg.source.type === 'user' ? 'You' : msg.source.type === 'agent' ? msg.source.agentId : 'system';\n const labelColor = msg.source.type === 'user' ? 'yellow' : msg.source.type === 'agent' ? 'cyan' : 'gray';\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(cleanMarkdown(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} 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 = node.name !== node.agentId ? node.name : 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 wrapText(text: string, width: number): string[] {\n if (width <= 0) return text.split('\\n');\n const result: string[] = [];\n for (const rawLine of text.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 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 modeColor = mode === 'planning' ? 'blue' : mode === 'implementation' ? 'green' : 'cyan';\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: modeColor }), 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(cleanMarkdown(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 label =\n msg.source.type === 'user'\n ? 'You'\n : msg.source.type === 'agent'\n ? msg.source.agentId\n : '⚙ system';\n const labelColor =\n msg.source.type === 'user' ? 'yellow' : msg.source.type === 'agent' ? 'cyan' : 'gray';\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 = cycle.mode === 'planning' ? 'blue' : cycle.mode === 'implementation' ? 'green' : 'cyan';\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 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: cycle.mode === 'planning' ? 'blue' : cycle.mode === 'implementation' ? 'green' : 'cyan',\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 = agent.name !== agent.id ? agent.name : agent.agentType;\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 cleanMarkdown,\n seg,\n singleLine,\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 = agent.name !== agent.id ? agent.name : agent.agentType;\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 mergeSegs: ReturnType<typeof seg>[] = [];\n if (agent.mergeStatus) {\n mergeSegs.push(seg(' · ', { dim: true }));\n switch (agent.mergeStatus) {\n case 'merged':\n mergeSegs.push(seg('⊕ merged', { color: 'green' }));\n break;\n case 'pending':\n mergeSegs.push(seg('◌ pending', { color: 'yellow' }));\n break;\n case 'no-changes':\n mergeSegs.push(seg('∅ no changes', { color: 'gray' }));\n break;\n case 'conflict':\n mergeSegs.push(seg('⚠ conflict', { color: 'red' }));\n break;\n default:\n mergeSegs.push(seg(agent.mergeStatus, { dim: true }));\n }\n }\n lines.push([\n seg(' '),\n seg(agent.status, { color }),\n seg(` · ${dur} · ${agent.agentType}`, { dim: true }),\n ...mergeSegs,\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 badge = block.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = block.type === 'final' ? 'cyan' : 'yellow';\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(cleanMarkdown(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 badge = report.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = report.type === 'final' ? 'cyan' : 'yellow';\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, { useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { Agent } from '../../shared/types.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport { formatDuration, formatTime, divider, statusColor, agentStatusIcon, wrapText } from '../lib/format.js';\n\ninterface Props {\n agent: Agent;\n reportBlocks: ReportBlock[];\n width: number;\n height: number;\n onClose: () => void;\n}\n\nexport function ReportView({ agent, reportBlocks, width, height, onClose }: Props) {\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const contentWidth = width - 6; // border + padding + gutter\n\n // Build the rendered lines (memoized since report content is static)\n const lines = useMemo(() => {\n const lines: Array<{ text: string; color?: string; bold?: boolean; dim?: boolean }> = [];\n\n if (reportBlocks.length === 0) {\n lines.push({ text: '', dim: true });\n lines.push({ text: ' No reports submitted yet.', dim: true });\n lines.push({ text: '', dim: true });\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({ text: '' });\n lines.push({ text: ` ${divider(contentWidth - 2, '·')}`, dim: true });\n lines.push({ text: '' });\n }\n\n // Report header\n const badge = report.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = report.type === 'final' ? 'cyan' : 'yellow';\n lines.push({\n text: ` ${badge} ${time}`,\n color: badgeColor,\n bold: report.type === 'final',\n });\n lines.push({ text: '' });\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({ text: ` ${line}` });\n }\n }\n\n lines.push({ text: '' });\n return lines;\n }, [reportBlocks, contentWidth]);\n\n // Scroll bounds\n const viewableHeight = height - 7; // header (4) + footer (2) + border\n const maxScroll = Math.max(0, lines.length - viewableHeight);\n\n useInput((input, key) => {\n if (key.escape || key.return) {\n onClose();\n return;\n }\n if (key.upArrow) {\n setScrollOffset((o) => Math.max(0, o - 1));\n return;\n }\n if (key.downArrow) {\n setScrollOffset((o) => Math.min(maxScroll, o + 1));\n return;\n }\n // Page up/down with shift or brackets\n if (input === '[' || (key.upArrow && key.shift)) {\n setScrollOffset((o) => Math.max(0, o - Math.floor(viewableHeight / 2)));\n return;\n }\n if (input === ']' || (key.downArrow && key.shift)) {\n setScrollOffset((o) => Math.min(maxScroll, o + Math.floor(viewableHeight / 2)));\n return;\n }\n });\n\n // Visible slice\n const visible = lines.slice(scrollOffset, scrollOffset + viewableHeight);\n\n // Scroll position indicator\n const scrollPct = maxScroll > 0 ? Math.round((scrollOffset / maxScroll) * 100) : 100;\n const totalReports = agent.reports.length;\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const dur = formatDuration(agent.spawnedAt, agent.completedAt);\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n height={height}\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n >\n {/* Header */}\n <Text bold>\n {' '}\n <Text color={color}>{icon}</Text>\n {' '}\n {agent.id}\n {' '}\n <Text dimColor>·</Text>\n {' '}\n {agent.name !== agent.id ? agent.name : agent.agentType}\n </Text>\n <Text dimColor>\n {' '}{agent.status} · {dur} · {agent.agentType} · {totalReports} report{totalReports !== 1 ? 's' : ''}\n </Text>\n <Text dimColor>{' ' + divider(contentWidth - 2)}</Text>\n\n {/* Scrollable content */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {visible.map((line, i) => (\n <Text\n key={i}\n color={line.color}\n bold={line.bold}\n dimColor={line.dim}\n >\n {line.text}\n </Text>\n ))}\n </Box>\n\n {/* Footer */}\n <Text dimColor>{' ' + divider(contentWidth - 2)}</Text>\n <Text dimColor>\n {' '}[esc] back [↑↓] scroll [{ }] page\n {' '}\n <Text>{scrollPct}%</Text>\n {maxScroll > 0 && <Text dimColor> · {lines.length} lines</Text>}\n </Text>\n </Box>\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} &gt; </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 &apos;yes&apos; 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 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 sourceLabel =\n msg.source.type === 'user'\n ? 'You'\n : msg.source.type === 'agent'\n ? msg.source.agentId\n : 'system';\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,QAAI,MAAM,CAAC;AAEX,QAAI,eAAe,OAAO,QAAQ;AAChC,aAAO,iBAAiB;AAAA,IAC1B,OAAO;AACL,aAAO,UAAU;AAAA,IACnB;AAEA,QAAI,iBAAiB,SAAS,WAAW;AACvC,UAAI,IAAI,UAAU,WAAW,CAAC;AAC9B,UAAI,IAAK,UAAU,UAAU,IAAK,UAAU,WAAW,CAAC,IAAI;AAC5D,UAAI,YAAY;AAChB,UAAK,SAAU,KAAK,KAAK,UAAY,SAAU,KAAK,KAAK,QAAS;AAChE,aAAK;AACL,aAAK;AACL,oBAAa,KAAK,KAAM;AACxB,qBAAa;AAAA,MACf;AAEA,UAAK,SAAU,aACV,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,OAAS;AAChD,eAAO;AAAA,MACT;AACA,UAAK,QAAU,aACV,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,OAAS;AAChD,eAAO;AAAA,MACT;AACA,UAAK,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,QAAU,aAAa,aAAa,QACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,SACpC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,UACrC,UAAW,aAAa,aAAa,QAAU;AAClD,eAAO;AAAA,MACT;AACA,UAAK,MAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aACV,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa,OAAS;AAChD,eAAO;AAAA,MACT;AACA,UAAK,OAAU,aACV,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aACV,OAAU,aACV,OAAU,aAAa,aAAa,OACpC,OAAU,aAAa,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","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","Box","Text","jsx","jsxs","useMemo","lines","Box","Text","useState","Box","Text","useInput","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","existsSync","readFileSync","detailWidth","contentHeight","Box","Text","jsx"]}