aicodeman 1.46.0 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/README.md +3 -0
  2. package/dist/cli-notify.d.ts +34 -0
  3. package/dist/cli-notify.d.ts.map +1 -0
  4. package/dist/cli-notify.js +100 -0
  5. package/dist/cli-notify.js.map +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +16 -0
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config/cli-registry/patterns.d.ts +1 -1
  10. package/dist/config/cli-registry/patterns.d.ts.map +1 -1
  11. package/dist/config/cli-registry/patterns.js +4 -0
  12. package/dist/config/cli-registry/patterns.js.map +1 -1
  13. package/dist/config/cli-registry/schema.d.ts +6 -0
  14. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  15. package/dist/config/cli-registry/schema.js +62 -2
  16. package/dist/config/cli-registry/schema.js.map +1 -1
  17. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  18. package/dist/config/cli-registry/stock.js +43 -26
  19. package/dist/config/cli-registry/stock.js.map +1 -1
  20. package/dist/config/cli-registry/types.d.ts +47 -17
  21. package/dist/config/cli-registry/types.d.ts.map +1 -1
  22. package/dist/config/path-probe.d.ts +6 -0
  23. package/dist/config/path-probe.d.ts.map +1 -1
  24. package/dist/config/path-probe.js +6 -0
  25. package/dist/config/path-probe.js.map +1 -1
  26. package/dist/config-backup.d.ts +1 -1
  27. package/dist/config-backup.d.ts.map +1 -1
  28. package/dist/config-backup.js +2 -0
  29. package/dist/config-backup.js.map +1 -1
  30. package/dist/custom-model-hosts.d.ts +32 -8
  31. package/dist/custom-model-hosts.d.ts.map +1 -1
  32. package/dist/custom-model-hosts.js +10 -0
  33. package/dist/custom-model-hosts.js.map +1 -1
  34. package/dist/custom-model-injection-apply.d.ts +19 -5
  35. package/dist/custom-model-injection-apply.d.ts.map +1 -1
  36. package/dist/custom-model-injection-apply.js +88 -8
  37. package/dist/custom-model-injection-apply.js.map +1 -1
  38. package/dist/custom-model-injection.d.ts +6 -0
  39. package/dist/custom-model-injection.d.ts.map +1 -1
  40. package/dist/custom-model-injection.js +92 -10
  41. package/dist/custom-model-injection.js.map +1 -1
  42. package/dist/discord-bridge.d.ts +338 -0
  43. package/dist/discord-bridge.d.ts.map +1 -0
  44. package/dist/discord-bridge.js +1256 -0
  45. package/dist/discord-bridge.js.map +1 -0
  46. package/dist/edit-history-local-source.d.ts +83 -0
  47. package/dist/edit-history-local-source.d.ts.map +1 -0
  48. package/dist/edit-history-local-source.js +198 -0
  49. package/dist/edit-history-local-source.js.map +1 -0
  50. package/dist/edit-history-parse.d.ts +114 -0
  51. package/dist/edit-history-parse.d.ts.map +1 -0
  52. package/dist/edit-history-parse.js +312 -0
  53. package/dist/edit-history-parse.js.map +1 -0
  54. package/dist/edit-history-store.d.ts +209 -0
  55. package/dist/edit-history-store.d.ts.map +1 -0
  56. package/dist/edit-history-store.js +599 -0
  57. package/dist/edit-history-store.js.map +1 -0
  58. package/dist/git-clone.d.ts +6 -1
  59. package/dist/git-clone.d.ts.map +1 -1
  60. package/dist/git-clone.js +79 -14
  61. package/dist/git-clone.js.map +1 -1
  62. package/dist/image-watcher.js +4 -4
  63. package/dist/image-watcher.js.map +1 -1
  64. package/dist/mux-interface.d.ts +10 -1
  65. package/dist/mux-interface.d.ts.map +1 -1
  66. package/dist/ralph-fix-plan-watcher.d.ts +13 -1
  67. package/dist/ralph-fix-plan-watcher.d.ts.map +1 -1
  68. package/dist/ralph-fix-plan-watcher.js +21 -3
  69. package/dist/ralph-fix-plan-watcher.js.map +1 -1
  70. package/dist/ralph-tracker.d.ts +6 -0
  71. package/dist/ralph-tracker.d.ts.map +1 -1
  72. package/dist/ralph-tracker.js +8 -0
  73. package/dist/ralph-tracker.js.map +1 -1
  74. package/dist/session-cli-registry-bridge.d.ts.map +1 -1
  75. package/dist/session-cli-registry-bridge.js +4 -0
  76. package/dist/session-cli-registry-bridge.js.map +1 -1
  77. package/dist/session.d.ts +70 -3
  78. package/dist/session.d.ts.map +1 -1
  79. package/dist/session.js +147 -4
  80. package/dist/session.js.map +1 -1
  81. package/dist/tmux-manager.d.ts +40 -0
  82. package/dist/tmux-manager.d.ts.map +1 -1
  83. package/dist/tmux-manager.js +62 -0
  84. package/dist/tmux-manager.js.map +1 -1
  85. package/dist/types/discord.d.ts +55 -0
  86. package/dist/types/discord.d.ts.map +1 -0
  87. package/dist/types/discord.js +18 -0
  88. package/dist/types/discord.js.map +1 -0
  89. package/dist/types/index.d.ts +2 -0
  90. package/dist/types/index.d.ts.map +1 -1
  91. package/dist/types/index.js +2 -0
  92. package/dist/types/index.js.map +1 -1
  93. package/dist/types/session.d.ts +13 -0
  94. package/dist/types/session.d.ts.map +1 -1
  95. package/dist/types/session.js.map +1 -1
  96. package/dist/web/case-path.d.ts +2 -0
  97. package/dist/web/case-path.d.ts.map +1 -1
  98. package/dist/web/case-path.js +3 -3
  99. package/dist/web/case-path.js.map +1 -1
  100. package/dist/web/edit-history-sync.d.ts +158 -0
  101. package/dist/web/edit-history-sync.d.ts.map +1 -0
  102. package/dist/web/edit-history-sync.js +445 -0
  103. package/dist/web/edit-history-sync.js.map +1 -0
  104. package/dist/web/paste-image-gc.d.ts +6 -0
  105. package/dist/web/paste-image-gc.d.ts.map +1 -1
  106. package/dist/web/paste-image-gc.js +6 -0
  107. package/dist/web/paste-image-gc.js.map +1 -1
  108. package/dist/web/ports/session-port.d.ts +13 -0
  109. package/dist/web/ports/session-port.d.ts.map +1 -1
  110. package/dist/web/public/admin-ui.js.gz +0 -0
  111. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  112. package/dist/web/public/{app.3093527f.js → app.963b5ba8.js} +18 -18
  113. package/dist/web/public/app.963b5ba8.js.br +0 -0
  114. package/dist/web/public/app.963b5ba8.js.gz +0 -0
  115. package/dist/web/public/approvals-ui.js.gz +0 -0
  116. package/dist/web/public/{constants.affcdde6.js → constants.782170e1.js} +114 -25
  117. package/dist/web/public/constants.782170e1.js.br +0 -0
  118. package/dist/web/public/constants.782170e1.js.gz +0 -0
  119. package/dist/web/public/cron-ui.js.gz +0 -0
  120. package/dist/web/public/edit-history-ui.js +630 -0
  121. package/dist/web/public/edit-history-ui.js.br +0 -0
  122. package/dist/web/public/edit-history-ui.js.gz +0 -0
  123. package/dist/web/public/entrance-animations.js.gz +0 -0
  124. package/dist/web/public/git-status-ui.js.gz +0 -0
  125. package/dist/web/public/header-divider.eb2d2463.js.gz +0 -0
  126. package/dist/web/public/home-sessions.js.gz +0 -0
  127. package/dist/web/public/host-wake-ui.js.gz +0 -0
  128. package/dist/web/public/i18n.33f930d7.js +2 -0
  129. package/dist/web/public/i18n.33f930d7.js.br +0 -0
  130. package/dist/web/public/i18n.33f930d7.js.gz +0 -0
  131. package/dist/web/public/{image-input.941386e7.js → image-input.a5d0f8f3.js} +18 -9
  132. package/dist/web/public/image-input.a5d0f8f3.js.br +0 -0
  133. package/dist/web/public/image-input.a5d0f8f3.js.gz +0 -0
  134. package/dist/web/public/index.html +162 -16
  135. package/dist/web/public/index.html.br +0 -0
  136. package/dist/web/public/index.html.gz +0 -0
  137. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  138. package/dist/web/public/{keyboard-accessory.4e8b20ac.js → keyboard-accessory.d4ec5957.js} +77 -2
  139. package/dist/web/public/keyboard-accessory.d4ec5957.js.br +0 -0
  140. package/dist/web/public/keyboard-accessory.d4ec5957.js.gz +0 -0
  141. package/dist/web/public/mobile-handlers.f7c3f692.js.gz +0 -0
  142. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  143. package/dist/web/public/mobile-overview.js.gz +0 -0
  144. package/dist/web/public/mobile.5ef2ce85.css +1 -0
  145. package/dist/web/public/mobile.5ef2ce85.css.br +0 -0
  146. package/dist/web/public/mobile.5ef2ce85.css.gz +0 -0
  147. package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
  148. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  149. package/dist/web/public/{panels-ui.4a56ee63.js → panels-ui.b100727d.js} +2 -2
  150. package/dist/web/public/panels-ui.b100727d.js.br +0 -0
  151. package/dist/web/public/{panels-ui.4a56ee63.js.gz → panels-ui.b100727d.js.gz} +0 -0
  152. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  153. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  154. package/dist/web/public/readmymind-ui.js.gz +0 -0
  155. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  156. package/dist/web/public/{respawn-ui.d7adcf6a.js → respawn-ui.304ba0d4.js} +1 -1
  157. package/dist/web/public/respawn-ui.304ba0d4.js.br +0 -0
  158. package/dist/web/public/respawn-ui.304ba0d4.js.gz +0 -0
  159. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  160. package/dist/web/public/security-notices.json +1 -21
  161. package/dist/web/public/session-lineage.js.gz +0 -0
  162. package/dist/web/public/{session-ui.186f9419.js → session-ui.5ac82f2c.js} +30 -30
  163. package/dist/web/public/session-ui.5ac82f2c.js.br +0 -0
  164. package/dist/web/public/session-ui.5ac82f2c.js.gz +0 -0
  165. package/dist/web/public/settings-ui.d1d4fb99.js +106 -0
  166. package/dist/web/public/settings-ui.d1d4fb99.js.br +0 -0
  167. package/dist/web/public/settings-ui.d1d4fb99.js.gz +0 -0
  168. package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
  169. package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
  170. package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
  171. package/dist/web/public/styles.77dc538f.css +1 -0
  172. package/dist/web/public/styles.77dc538f.css.br +0 -0
  173. package/dist/web/public/styles.77dc538f.css.gz +0 -0
  174. package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
  175. package/dist/web/public/sw.js +2 -2
  176. package/dist/web/public/sw.js.br +0 -0
  177. package/dist/web/public/sw.js.gz +0 -0
  178. package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
  179. package/dist/web/public/tab-rail-resize.b5cdceaf.js.gz +0 -0
  180. package/dist/web/public/terminal-keycode229-recovery.98843069.js +1 -0
  181. package/dist/web/public/terminal-keycode229-recovery.98843069.js.br +0 -0
  182. package/dist/web/public/terminal-keycode229-recovery.98843069.js.gz +0 -0
  183. package/dist/web/public/terminal-split.js.gz +0 -0
  184. package/dist/web/public/terminal-tile.js +8 -6
  185. package/dist/web/public/terminal-tile.js.br +0 -0
  186. package/dist/web/public/terminal-tile.js.gz +0 -0
  187. package/dist/web/public/{terminal-ui.7e787829.js → terminal-ui.d7c75ce8.js} +3 -3
  188. package/dist/web/public/terminal-ui.d7c75ce8.js.br +0 -0
  189. package/dist/web/public/terminal-ui.d7c75ce8.js.gz +0 -0
  190. package/dist/web/public/tile-grid.js.gz +0 -0
  191. package/dist/web/public/ultracode-panel.js.gz +0 -0
  192. package/dist/web/public/ultracode-windows.js.gz +0 -0
  193. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  194. package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
  195. package/dist/web/public/vendor/fflate.min.js.gz +0 -0
  196. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  197. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  198. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  199. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  200. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  201. package/dist/web/public/vendor/xterm-predictive-echo.276b11d9.js.gz +0 -0
  202. package/dist/web/public/vendor/xterm-zerolag-input.1be42307.js.gz +0 -0
  203. package/dist/web/public/vendor/xterm.css.gz +0 -0
  204. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  205. package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
  206. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  207. package/dist/web/public/webview-tabs.js.gz +0 -0
  208. package/dist/web/public/whats-new.json +9 -9
  209. package/dist/web/request-body-parser.d.ts +23 -0
  210. package/dist/web/request-body-parser.d.ts.map +1 -0
  211. package/dist/web/request-body-parser.js +57 -0
  212. package/dist/web/request-body-parser.js.map +1 -0
  213. package/dist/web/routes/case-routes.d.ts.map +1 -1
  214. package/dist/web/routes/case-routes.js +104 -8
  215. package/dist/web/routes/case-routes.js.map +1 -1
  216. package/dist/web/routes/config-backup-routes.d.ts +5 -1
  217. package/dist/web/routes/config-backup-routes.d.ts.map +1 -1
  218. package/dist/web/routes/config-backup-routes.js +4 -1
  219. package/dist/web/routes/config-backup-routes.js.map +1 -1
  220. package/dist/web/routes/custom-model-routes.d.ts +7 -2
  221. package/dist/web/routes/custom-model-routes.d.ts.map +1 -1
  222. package/dist/web/routes/custom-model-routes.js +51 -6
  223. package/dist/web/routes/custom-model-routes.js.map +1 -1
  224. package/dist/web/routes/discord-routes.d.ts +25 -0
  225. package/dist/web/routes/discord-routes.d.ts.map +1 -0
  226. package/dist/web/routes/discord-routes.js +206 -0
  227. package/dist/web/routes/discord-routes.js.map +1 -0
  228. package/dist/web/routes/edit-history-routes.d.ts +43 -0
  229. package/dist/web/routes/edit-history-routes.d.ts.map +1 -0
  230. package/dist/web/routes/edit-history-routes.js +106 -0
  231. package/dist/web/routes/edit-history-routes.js.map +1 -0
  232. package/dist/web/routes/file-routes.d.ts +5 -0
  233. package/dist/web/routes/file-routes.d.ts.map +1 -1
  234. package/dist/web/routes/file-routes.js +67 -3
  235. package/dist/web/routes/file-routes.js.map +1 -1
  236. package/dist/web/routes/index.d.ts +2 -0
  237. package/dist/web/routes/index.d.ts.map +1 -1
  238. package/dist/web/routes/index.js +2 -0
  239. package/dist/web/routes/index.js.map +1 -1
  240. package/dist/web/routes/ralph-routes.d.ts.map +1 -1
  241. package/dist/web/routes/ralph-routes.js +45 -2
  242. package/dist/web/routes/ralph-routes.js.map +1 -1
  243. package/dist/web/routes/session-routes.d.ts +17 -0
  244. package/dist/web/routes/session-routes.d.ts.map +1 -1
  245. package/dist/web/routes/session-routes.js +92 -37
  246. package/dist/web/routes/session-routes.js.map +1 -1
  247. package/dist/web/routes/system-routes.d.ts.map +1 -1
  248. package/dist/web/routes/system-routes.js +4 -2
  249. package/dist/web/routes/system-routes.js.map +1 -1
  250. package/dist/web/schemas.d.ts +68 -1
  251. package/dist/web/schemas.d.ts.map +1 -1
  252. package/dist/web/schemas.js +77 -1
  253. package/dist/web/schemas.js.map +1 -1
  254. package/dist/web/sensitive-path.d.ts.map +1 -1
  255. package/dist/web/sensitive-path.js +15 -0
  256. package/dist/web/sensitive-path.js.map +1 -1
  257. package/dist/web/server.d.ts +43 -0
  258. package/dist/web/server.d.ts.map +1 -1
  259. package/dist/web/server.js +237 -15
  260. package/dist/web/server.js.map +1 -1
  261. package/package.json +1 -1
  262. package/dist/web/public/app.3093527f.js.br +0 -0
  263. package/dist/web/public/app.3093527f.js.gz +0 -0
  264. package/dist/web/public/constants.affcdde6.js.br +0 -0
  265. package/dist/web/public/constants.affcdde6.js.gz +0 -0
  266. package/dist/web/public/i18n.70265257.js +0 -2
  267. package/dist/web/public/i18n.70265257.js.br +0 -0
  268. package/dist/web/public/i18n.70265257.js.gz +0 -0
  269. package/dist/web/public/image-input.941386e7.js.br +0 -0
  270. package/dist/web/public/image-input.941386e7.js.gz +0 -0
  271. package/dist/web/public/keyboard-accessory.4e8b20ac.js.br +0 -0
  272. package/dist/web/public/keyboard-accessory.4e8b20ac.js.gz +0 -0
  273. package/dist/web/public/mobile.1bbd2d67.css +0 -1
  274. package/dist/web/public/mobile.1bbd2d67.css.br +0 -0
  275. package/dist/web/public/mobile.1bbd2d67.css.gz +0 -0
  276. package/dist/web/public/panels-ui.4a56ee63.js.br +0 -0
  277. package/dist/web/public/respawn-ui.d7adcf6a.js.br +0 -0
  278. package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
  279. package/dist/web/public/session-ui.186f9419.js.br +0 -0
  280. package/dist/web/public/session-ui.186f9419.js.gz +0 -0
  281. package/dist/web/public/settings-ui.a191154e.js +0 -106
  282. package/dist/web/public/settings-ui.a191154e.js.br +0 -0
  283. package/dist/web/public/settings-ui.a191154e.js.gz +0 -0
  284. package/dist/web/public/styles.7238eae8.css +0 -1
  285. package/dist/web/public/styles.7238eae8.css.br +0 -0
  286. package/dist/web/public/styles.7238eae8.css.gz +0 -0
  287. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js +0 -1
  288. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.br +0 -0
  289. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
  290. package/dist/web/public/terminal-ui.7e787829.js.br +0 -0
  291. package/dist/web/public/terminal-ui.7e787829.js.gz +0 -0
@@ -1,4 +1,4 @@
1
- "use strict";(function(e){const t=/^\x1b\[[\?>=]?[\d;]*[cnR]$/,i=/^\x1b\][\d;]*[^\x07\x1b]*(?:\x07|\x1b\\)$/,s=/^\x1b\[<\d+;\d+;\d+[Mm]$/,n=/^\x1b\[M[\s\S]{3}$/,o=/^\x1b\[[IO]$/,d=["input","textarea","select","button","a[href]",'[contenteditable=""]','[contenteditable="true"]','[tabindex]:not([tabindex="-1"])','[role="treeitem"]',".keyboard-accessory-bar",".path-picker-overlay"].join(","),y=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b\[[0-9;?<>=!]*[ -/]*[@-~]|\x1b[()#][0-9A-Za-z]|\x1b[=>78M]/g,p="\x1B[5~",u="\x1B[6~",T=.5,r=3,m=150,_=.1,I=2,E=3e3,w=1e3;function k(S,C){const M=S.shiftKey&&Math.abs(S.deltaX)>Math.abs(S.deltaY)?S.deltaX:S.deltaY;return M?S.deltaMode===1?M:S.deltaMode===2?M*(C||24):M/25:0}const R=5;function O(S,C){if(!S||!C)return"";const M=S<0?64:65,N=Math.min(Math.abs(S),R);return`\x1B[<${M};${C.col};${C.row}M`.repeat(N)}function A(S,C,M){if(!Number.isFinite(C)||!C)return{state:S||{},ticks:0};const N=Math.sign(C),K=!S||typeof S.lastAt!="number"||M-S.lastAt>m,W=S?.dir&&S.dir!==N;if(K&&Math.abs(C)>=_){const J=N*Math.max(1,Math.round(Math.abs(C)));return{state:{dir:N,lastAt:M,pending:C-J},ticks:N*Math.min(Math.abs(J),R)}}const z=(K||W?0:S.pending||0)+C,j=Math.trunc(z+Math.sign(z)*1e-9);return{state:{dir:N,lastAt:M,pending:Math.abs(z-j)<1e-9?0:z-j},ticks:j===0?0:Math.sign(j)*Math.min(Math.abs(j),R)}}function H(S,C){const M=j=>j?.match(/\x1b\[<(64|65);|\x1b\[(5|6)~/)?.[0],N=M(S),K=M(C);return((N&&N===K?S+C:C).match(/\x1b\[<(?:64|65);\d+;\d+M|\x1b\[[56]~/g)||[]).join("")}function g(S){return Math.max(2,Math.round((S||24)*T))}function x(S,C,M){const N=g(M),K=(S||0)+C,W=Math.trunc(K/N),z=W?(W<0?p:u).repeat(Math.min(Math.abs(W),r)):"";return{pending:K-W*N,keys:z}}function v(S,C,M,N,K){const W=S||{};if(C?.ctrlKey)return{state:W,keys:""};const z=Math.abs(C?.deltaX||0),j=Math.abs(C?.deltaY||0);if(z&&j&&z>j)return{state:W,keys:""};const J=g(N),q=M<0?-1:1,ne=typeof C?.touchId=="number"?C.touchId:null,fe=typeof W.touchId=="number"?W.touchId:null;let oe=W.pending||0,X=!!W.prepaid;const he=q!==W.dir;let Z;if(typeof W.lastAt!="number"||ne!==fe)Z=!0;else if(ne!==null)Z=!1;else{const ee=K-W.lastAt,re=W.notch?E:w;Z=ee>(X&&!he?re:m)}if((Z||he)&&(X&&(oe=0),X=!1),Z){const ee=Math.abs(M),re=oe*q>0?oe:0;if(ee>=_&&ee<J&&(re+M)*q<J)return{state:{pending:re+M-q*J,lastAt:K,dir:q,prepaid:!0,notch:ee>=I,touchId:ne},keys:q<0?p:u}}const ae=x(oe,M,N);return X&&ae.pending*q>=0&&(X=!1),{state:{pending:ae.pending,lastAt:K,dir:q,prepaid:X,notch:X&&!!W.notch,touchId:ne},keys:ae.keys}}const L=4,b=/^\x1b(?:\[(?:[ABCDHF]|1;[2-8][ABCDHF]|[1-8](?:;[2-8])?~)|O[ABCDHF])$/,B="\x1B[200~";function D(S){return b.test(S)}const G=/^› /;function U(S){const C=Array.from(S);if(C.length===1){const M=C[0].codePointAt(0);return M===127?"backspace":M>=32?"char":"clear"}return S.charCodeAt(0)===27?"clear":S.charCodeAt(0)>=32?"text":"clear"}function V(S){try{const C=S.buffer.active,M=C.getLine(C.baseY+C.cursorY);return!!M&&G.test(M.translateToString(!0))}catch{return!1}}const P=/^ {0,2}› (?:\d+\. |Add notes)/,F=/^ {2}[a-z←|]/,Y=/^ {1,4}(?:Press enter to confirm|enter (?:select|continue)|tab (?:to add|or esc to clear) notes)/;function te(S){try{const C=S.buffer.active,M=[];for(let K=C.baseY+S.rows-1;K>=C.baseY;K--){const W=C.getLine(K)?.translateToString(!0)??"";W.trim()&&M.push(W)}let N=0;for(;N<M.length&&!Y.test(M[N]);){if(!F.test(M[N]))return!1;N++}return N<M.length&&M.slice(N+1).some(K=>P.test(K))}catch{return!1}}function ie(S){try{const C=S.buffer.active,M=C.baseY+(C.cursorY||0)-C.viewportY;return M>=0&&M<S.rows?M:null}catch{return null}}function $(S){return t.test(S)||i.test(S)}function Q(S){return $(S)}function se(S){return o.test(S)||s.test(S)||n.test(S)}const le={og:{background:"#0d0d0d",foreground:"#e0e0e0",cursor:"#e0e0e0",cursorAccent:"#0d0d0d",selectionBackground:"rgba(255,255,255,0.3)",black:"#0d0d0d",red:"#ff6b6b",green:"#51cf66",yellow:"#ffd43b",blue:"#339af0",magenta:"#cc5de8",cyan:"#22b8cf",white:"#e0e0e0",brightBlack:"#495057",brightRed:"#ff8787",brightGreen:"#69db7c",brightYellow:"#ffe066",brightBlue:"#5c7cfa",brightMagenta:"#da77f2",brightCyan:"#66d9e8",brightWhite:"#ffffff"},"daylight-green":{background:"#161b23",foreground:"#dfe6ef",cursor:"#2fd3aa",cursorAccent:"#161b23",selectionBackground:"rgba(47,211,170,0.22)",black:"#161b23",red:"#ff8585",green:"#34d8a0",yellow:"#f0c25a",blue:"#5cc6e8",magenta:"#c79af2",cyan:"#2bcbbb",white:"#dfe6ef",brightBlack:"#5b6675",brightRed:"#ffa0a0",brightGreen:"#5fe6b8",brightYellow:"#ffd884",brightBlue:"#82d4ee",brightMagenta:"#d6b3f7",brightCyan:"#5ee0d4",brightWhite:"#f3f6fa"},"daylight-blue":{background:"#161b23",foreground:"#dfe6ef",cursor:"#38b6f0",cursorAccent:"#161b23",selectionBackground:"rgba(56,182,240,0.22)",black:"#161b23",red:"#ff8585",green:"#34d8a0",yellow:"#f0c25a",blue:"#5cc6e8",magenta:"#c79af2",cyan:"#2bcbbb",white:"#dfe6ef",brightBlack:"#5b6675",brightRed:"#ffa0a0",brightGreen:"#5fe6b8",brightYellow:"#ffd884",brightBlue:"#82d4ee",brightMagenta:"#d6b3f7",brightCyan:"#5ee0d4",brightWhite:"#f3f6fa"},"paper-gray":{background:"#f6f8fa",foreground:"#1f2328",cursor:"#0969da",cursorAccent:"#ffffff",selectionBackground:"rgba(9,105,218,0.2)",black:"#24292f",red:"#cf222e",green:"#1a7f37",yellow:"#9a6700",blue:"#0969da",magenta:"#8250df",cyan:"#1b7c83",white:"#59636e",brightBlack:"#6e7781",brightRed:"#a40e26",brightGreen:"#116329",brightYellow:"#7d4e00",brightBlue:"#0550ae",brightMagenta:"#6639ba",brightCyan:"#116b75",brightWhite:"#1f2328"},"solarized-light":{background:"#fdf6e3",foreground:"#586e75",cursor:"#147ba3",cursorAccent:"#fdf6e3",selectionBackground:"rgba(38,139,210,0.2)",black:"#eee8d5",red:"#dc322f",green:"#758600",yellow:"#9b7800",blue:"#147ba3",magenta:"#d33682",cyan:"#2a9189",white:"#073642",brightBlack:"#93a1a1",brightRed:"#cb4b16",brightGreen:"#657b83",brightYellow:"#586e75",brightBlue:"#268bd2",brightMagenta:"#6c71c4",brightCyan:"#2aa198",brightWhite:"#002b36"},"catppuccin-latte":{background:"#eff1f5",foreground:"#4c4f69",cursor:"#1e66f5",cursorAccent:"#ffffff",selectionBackground:"rgba(30,102,245,0.18)",black:"#5c5f77",red:"#d20f39",green:"#3b8f2b",yellow:"#a86605",blue:"#1e66f5",magenta:"#8839ef",cyan:"#177f86",white:"#6c6f85",brightBlack:"#7c7f93",brightRed:"#b50930",brightGreen:"#2f7622",brightYellow:"#8b5604",brightBlue:"#174fbf",brightMagenta:"#6f2bc5",brightCyan:"#116b71",brightWhite:"#4c4f69"},"rose-pine-dawn":{background:"#faf4ed",foreground:"#575279",cursor:"#286983",cursorAccent:"#fffaf3",selectionBackground:"rgba(40,105,131,0.2)",black:"#575279",red:"#b4637a",green:"#286983",yellow:"#96681f",blue:"#477f91",magenta:"#907aa9",cyan:"#3f7f8b",white:"#6e6a86",brightBlack:"#797593",brightRed:"#984d66",brightGreen:"#1f5266",brightYellow:"#7d5417",brightBlue:"#386b7c",brightMagenta:"#765f90",brightCyan:"#326b76",brightWhite:"#575279"}},de=new Set(["paper-gray","solarized-light","catppuccin-latte","rose-pine-dawn"]);function ce(){return typeof document<"u"&&document.documentElement.dataset.skin||"daylight-blue"}function ue(){const S=ce();return le[S]||le["daylight-blue"]}function me(S=ce()){return de.has(S)}e.CodemanTerminalInput={isTerminalQueryResponse:$,shouldSuppressTerminalQueryResponse:Q,isTerminalFocusOrMouseReport:se,isComposerNavKey:D,classifyPredictInput:U,isCodexComposerRow:V,isCodexSelectionMenu:te,cursorViewportRow:ie,CODEX_COMPOSER_ROW_RE:G,BRACKETED_PASTE_START:B,USER_SCROLL_STICKY_SUPPRESS_MS:1500,TOUCH_COMPAT_MOUSE_SUPPRESS_MS:450,REPLAY_ESCAPE_RE:y,KEY_PAGE_UP:p,KEY_PAGE_DOWN:u,PAGE_KEY_SCREEN_FRACTION:T,PAGE_KEY_MAX_PER_BATCH:r,wheelDeltaLines:k,SGR_WHEEL_MAX_TICKS:R,sgrWheelReports:O,wheelTicksForGesture:A,coalesceScrollBytes:H,pageKeysForTravel:x,pageKeysForGesture:v,PAGE_KEY_GESTURE_GAP_MS:m,PAGE_KEY_MIN_START_ROWS:_,PAGE_KEY_IMMEDIATE_MAX_ROWS:I,PAGE_KEY_DEBT_MS:w,PAGE_KEY_NOTCH_DEBT_MS:E,TUI_PROMPT_DEFAULT_ROWS_FROM_BOTTOM:L,MOBILE_KEYBOARD_DISMISS_EXEMPT_SELECTOR:d,MOBILE_KEYBOARD_DISMISS_TAP_SLOP:8,TOUCH_SELECT_LONG_PRESS_MS:350,TOUCH_SELECT_FOCUS_GUARD_MS:800},e.CODEMAN_XTERM_THEMES=le,e.codemanCurrentXtermTheme=ue,e.codemanCurrentSkinIsLight=me})(window),Object.assign(CodemanApp.prototype,{_destroyKeyCode229Recovery(){try{this._keyCode229Recovery?.destroy?.()}catch{}this._keyCode229Recovery=null},_destroyMobileImePreview(){try{this._mobileImePreview?.destroy?.()}catch{}this._mobileImePreview=null,this._mobileImePreviewSessionId=null,this._mobileImeCommitOutputSeq=null;try{this._mobileImePreviewNode?.remove?.()}catch{}try{this._mobileImePreviewHelpers?.classList?.remove("codeman-ime-preview-owned")}catch{}this._mobileImePreviewNode=null,this._mobileImePreviewHelpers=null;try{this._mobileImePreviewOfflineHandler&&window.removeEventListener("offline",this._mobileImePreviewOfflineHandler),this._mobileImePreviewPagehideHandler&&window.removeEventListener("pagehide",this._mobileImePreviewPagehideHandler)}catch{}this._mobileImePreviewOfflineHandler=null,this._mobileImePreviewPagehideHandler=null},_initMobileImePreview(){this._destroyMobileImePreview();let e=null,t=null;try{if(typeof MobileImePreview>"u"||!MobileImePreview?.isIosWebKitTouch?.())return;const i=this.terminal?.textarea;if(t=this.terminal?.element?.querySelector?.(".xterm-helpers"),!i||!t)return;e=document.createElement("span"),this._mobileImePreviewNode=e,this._mobileImePreviewHelpers=t,e.className="codeman-ime-preview",e.setAttribute("aria-hidden","true"),e.hidden=!0,t.appendChild(e);const s=()=>{try{const h=t.querySelector?.(".composition-view")||this.terminal?.element?.querySelector?.(".composition-view");if(!h||!e.style)return;const f=typeof getComputedStyle=="function"?getComputedStyle(h):h.style;for(const u of["fontFamily","fontSize","fontWeight","fontStyle","lineHeight","height"]){const T=f?.[u]||h.style?.[u];T&&(e.style[u]=T)}const d=this.terminal?.options?.theme;let y=d?.foreground,p=d?.background;if(!y||!p)try{const u=window.codemanCurrentXtermTheme?.();y=y||u?.foreground,p=p||u?.background}catch{}e.style.color=y||"#e0e0e0",e.style.backgroundColor=p||"#0d0d0d"}catch{}},n=()=>this._localEchoEnabled&&!this._echoPassthroughSessions?.has(this.activeSessionId)&&this._localEchoOverlay||null,o=()=>{try{this._localEchoOverlay?.composition&&this._localEchoOverlay.setComposition("")}catch{}},l=()=>{try{e.hidden=!0}catch{}try{e.textContent=""}catch{}try{delete e.dataset.phase}catch{}try{t.classList.remove("codeman-ime-preview-owned")}catch{}},a=()=>{o(),l()},c=MobileImePreview.create({textarea:i,keydownTarget:this.terminal.element,render:({text:h,phase:f})=>{try{const d=n();if(d&&typeof d.setComposition=="function"){if(d.setComposition(h),!h||d.state?.visible){l(),t.classList.toggle("codeman-ime-preview-owned",!!h);return}d.setComposition("")}else o();s(),e.textContent=h,e.dataset.phase=f,e.hidden=!h,t.classList.toggle("codeman-ime-preview-owned",!!h)}catch{a()}},clear:a});this._mobileImePreview=c,this._mobileImePreviewSessionId=this.activeSessionId,this._mobileImePreviewOfflineHandler=()=>{try{this._mobileImePreview?.reset?.()}catch{}},this._mobileImePreviewPagehideHandler=this._mobileImePreviewOfflineHandler,window.addEventListener("offline",this._mobileImePreviewOfflineHandler),window.addEventListener("pagehide",this._mobileImePreviewPagehideHandler)}catch{this._destroyMobileImePreview()}},_consumeMobileImeTerminalData(e){let t=!1;try{t=this._mobileImePreview?.consumeTerminalData?.(e)===!0}catch{}return t&&(this._mobileImeCommitOutputSeq=this._terminalOutputSeq||0),t},_noteMobileImeAuthoritativeOutput(e,t){try{const i=this._mobileImeCommitOutputSeq;if(i==null||e===null||t!==this.activeSessionId||!(e>i))return;this._mobileImeCommitOutputSeq=null,this._mobileImePreview?.noteAuthoritativeOutput?.()}catch{}},_transferMobileImeCommitToLocalEcho(){this._mobileImeCommitOutputSeq=null;try{this._mobileImePreview?.completeCommit?.({predicted:!0})}catch{}},initTerminal(){const e=parseInt(localStorage.getItem("codeman-scrollback")),t=Number.isFinite(e)&&e>0?Math.max(e,DEFAULT_SCROLLBACK):DEFAULT_SCROLLBACK;this._destroyKeyCode229Recovery();const i=this.loadAppSettingsFromStorage?.()||{};if(this.terminal=new Terminal({theme:{...window.codemanCurrentXtermTheme()},fontFamily:window.CodemanTerminalFont.resolve(i.terminalFontFamily),...window.CodemanTerminalFont.resolveWeights(i),fontSize:MobileDetection.getDeviceType()==="mobile"?10:14,lineHeight:1.2,cursorBlink:!1,cursorStyle:"block",minimumContrastRatio:window.codemanCurrentSkinIsLight()?4.5:1,scrollback:t,allowTransparency:!0,allowProposedApi:!0,linkHandler:this._terminalOsc8LinkHandler()}),this.fitAddon=new FitAddon.FitAddon,this.terminal.loadAddon(this.fitAddon),this._xtermSnapshots=new Map,typeof SerializeAddon<"u")try{this._serializeAddon=new SerializeAddon.SerializeAddon,this.terminal.loadAddon(this._serializeAddon)}catch{this._serializeAddon=null}if(typeof Unicode11Addon<"u")try{const r=new Unicode11Addon.Unicode11Addon;this.terminal.loadAddon(r),this.terminal.unicode.activeVersion="11"}catch{}this._installOsc52Clipboard(this.terminal);const s=document.getElementById("terminalContainer");this.terminal.open(s),this._initMobileImePreview(),this._installMobileTapMouseGuard(),this._installShiftDragSelection(),this._installTouchSelectionFocusGuard(),this.terminal.textarea?.addEventListener("focus",()=>this._noteFocusedTile(null)),this.terminal.attachCustomKeyEventHandler(r=>{try{this._keyCode229Recovery?.handleKeyEvent?.(r)}catch{}if(r.isComposing||r.key==="Process"||r.keyCode===229)return!0;if(r.altKey&&!r.ctrlKey&&!r.shiftKey&&/^(Digit[1-9]|BracketLeft|BracketRight|KeyK)$/.test(r.code||"")||r.type==="keydown"&&this.isUserBoundShortcutEvent?.(r)||r.type==="keydown"&&this.shouldOpenCommandPaletteFromShortcut?.(r)||this.tileShortcutFor?.(r))return!1;if(this.shouldCopyTerminalSelectionFromShortcut?.(r)){const m=this.terminal?.hasSelection?.()?this.terminal.getSelection():"";return this.cleanedTerminalSelection(m).trim()?(r.preventDefault(),this.copyTerminalSelection(m),!1):(this.terminal?.hasSelection?.()&&(this.terminal.clearSelection?.(),this.showToast("Nothing to copy","warning")),r.shiftKey?(r.preventDefault(),!1):!0)}if(r.type==="keydown"&&this.shouldToggleSessionSidebarFromShortcut?.(r))return!1;if((r.ctrlKey||r.metaKey)&&r.key==="v"&&r.type==="keydown")return this.activeSessionId&&this._handleImagePaste&&this._handleImagePaste(),!1;if(r.type==="keydown"&&r.key.toLowerCase()==="z"&&r.ctrlKey&&!r.altKey&&!r.metaKey&&!r.shiftKey){const m=this.activeSessionId?this.sessions.get(this.activeSessionId):null;if(m&&m.mode!=="shell")return r.preventDefault(),!1}if(r.key==="Enter"&&(r.shiftKey||r.ctrlKey)){if(r.type==="keydown"&&this.activeSessionId)if(this._localEchoEnabled){const m=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),m&&(this._pendingInput+=m,u()),setTimeout(()=>{fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:r.ctrlKey?"C-Enter":"S-Enter"})})},m?80:0)}else fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:r.ctrlKey?"C-Enter":"S-Enter"})});return!1}return!0}),this._webglAddon=null;const n=new URLSearchParams(location.search),o=(()=>{try{const r=localStorage.getItem("codeman-webgl-disabled");if(!r)return!1;const{at:m}=JSON.parse(r);return Date.now()-m>WEBGL_FALLBACK.STICKY_EXPIRY_MS?(localStorage.removeItem("codeman-webgl-disabled"),!1):!0}catch{return!1}})(),l=this.loadAppSettingsFromStorage(),a=this.getDefaultSettings(),c=l.webglRendererEnabled??a.webglRendererEnabled,{skip:h,clearSticky:f}=shouldSkipWebGL({deviceType:MobileDetection.getDeviceType(),noWebglParam:n.has("nowebgl"),forceParam:n.get("webgl")==="force",stickyDisabled:o,userPrefEnabled:c});if(f)try{localStorage.removeItem("codeman-webgl-disabled")}catch{}if(h&&o&&console.log("[CRASH-DIAG] WebGL sticky-disabled from prior stalls \u2014 DOM renderer in use. Re-enable: ?webgl=force"),!h)if(typeof WebglAddon<"u")this._initWebGL();else{const r=document.createElement("script");r.src="vendor/xterm-addon-webgl.min.js",r.onload=()=>this._initWebGL(),r.onerror=()=>console.warn("[CRASH-DIAG] Failed to load WebGL addon \u2014 using canvas renderer"),document.head.appendChild(r)}this._localEchoOverlay=new LocalEchoOverlay(this.terminal),this._predictiveEcho=typeof PredictiveEchoOverlay<"u"?new PredictiveEchoOverlay(this.terminal):null,this._predictiveEcho?.setPredictWhen(r=>window.CodemanTerminalInput.isCodexComposerRow(r)),MobileDetection.isTouchDevice()&&(this.terminal.onCursorMove(()=>this._syncMobileHelperTextareaToCursor()),this.terminal.onRender(()=>this._syncMobileHelperTextareaToCursor()),this.terminal.onCursorMove(()=>this._applyKeyboardClip()),this.terminal.onRender(()=>this._applyKeyboardClip())),this.terminal.onRender(()=>{this._lastRenderAt=Date.now()}),this._startRenderLivenessWatchdog(),this._cjkInput=null,typeof CjkInput<"u"&&(this._cjkInput=CjkInput.init({send:r=>{this._handleCjkInput(r)}}));const d=this.terminal.focus.bind(this.terminal);this.terminal.focus=()=>{const r=document.getElementById("cjkInput");r?.classList.contains("cjk-input-visible")?r.focus():d()},MobileDetection.getDeviceType()==="mobile"&&document.body.classList.contains("safari-browser")?requestAnimationFrame(()=>{this.syncTerminalGeometry(),requestAnimationFrame(()=>this.syncTerminalGeometry())}):this.syncTerminalGeometry(),this._terminalFontReady=this._awaitTerminalFont(),this.registerFilePathLinkProvider(),this.terminal.onSelectionChange?.(()=>{if(!this.terminal?.hasSelection?.()){this._touchSelecting=!1,this._touchSelectionActive=!1,this._touchSelectionAnchor=null,this._hideTouchSelectionBar(),this._autoCopyPending=!1;return}this._autoCopyPending=!0}),this._autoCopyListenerInstalled||(this._autoCopyListenerInstalled=!0,document.addEventListener("mouseup",()=>this._flushAutoCopySelection())),s.addEventListener("wheel",r=>{const m=this.terminal?.modes?.mouseTrackingMode;if(m&&m!=="none"||this.terminal?.buffer?.active?.type==="alternate")return;if(r.preventDefault(),r.stopPropagation(),this._shouldForwardWheelToApp(r)){if(r.ctrlKey||Math.abs(r.deltaX||0)>Math.abs(r.deltaY||0))return;this._logScrollRouting("forward-sgr"),this._forwardScrollToApp(r.clientX,r.clientY,this._wheelScrollLinesFloat(r));return}const _=this._wheelScrollLinesFloat(r);this._maybePageCliTranscript(r,_)||(this._logScrollRouting("local-scrollback"),this._noteTerminalUserScroll(_),this._smoothScrollBy(_))},{passive:!1,capture:!0});{const r=()=>this.terminal._core?._renderService?.dimensions?.css?.cell?.height||13;let m=0,_=0,I=0,E=0,w=null,k=!1,R=0;const O=P=>{const F=E?(P-E)/16.67:1;if(E=P,!k&&Math.abs(I)>.3){const Y=Math.round(I/r());Y!==0&&(this._shouldForwardTouchToApp()?this._forwardScrollToApp(m,_,Y):this._maybePageCliTranscript({shiftKey:!1,touchId:R},Y)||(this.terminal.scrollLines(Y),this._maybeLoadMoreHistoryOnScroll(Y))),I*=.92,w=requestAnimationFrame(O)}else k?w=requestAnimationFrame(O):(w=null,I=0)};let A=0,H=!1,g=null,x=0,v=0,L=0,b=0,B=null;const D=()=>s.classList.contains("term-overflows-x")&&s.scrollWidth-s.clientWidth>1;let G=!1,U=null;const V=window.CodemanTerminalInput.MOBILE_KEYBOARD_DISMISS_TAP_SLOP;s.addEventListener("touchstart",P=>{if(!P.target?.closest?.(".term-select-bar")&&(P.touches.length!==1&&(clearTimeout(g),g=null),P.touches.length===1)){m=P.touches[0].clientX,_=P.touches[0].clientY,L=_,b=m,B=null,this._terminalGestureAxis=null,I=0,A=0,k=!0,R++,H=!1,G=this._isMobileTerminalInputFocused();const F=this._classifyMobileTerminalTap(m,_);U={x:m,y:_,intent:F},F==="content"&&(P.preventDefault(),this._blurMobileTerminalInput()),x=m,v=_,clearTimeout(g),g=setTimeout(()=>{g=null,this._beginTouchSelection(x,v)},window.CodemanTerminalInput.TOUCH_SELECT_LONG_PRESS_MS),E=0,w&&(cancelAnimationFrame(w),w=null)}},{passive:!1}),s.addEventListener("touchmove",P=>{if(this._touchSelecting){P.preventDefault();const F=P.touches[0];F&&this._extendTouchSelection(F.clientX,F.clientY);return}if(g&&P.touches.length===1){const F=P.touches[0];(Math.abs(F.clientX-x)>V||Math.abs(F.clientY-v)>V)&&(clearTimeout(g),g=null)}if(P.touches.length===1&&k){const F=P.touches[0].clientY,Y=P.touches[0].clientX;if(!H){const Q=Math.abs(F-L),se=Math.abs(Y-b);(Q>=V||se>=V)&&(H=!0,B=se>Q?D()?"x":"swipe":"y",this._terminalGestureAxis=B)}if(!H)return;if(P.preventDefault(),B==="swipe"){const Q=typeof SwipeHandler<"u"?SwipeHandler.maxVerticalDrift:50;if(Math.abs(F-L)<=Q)return;B="y",this._terminalGestureAxis="y",m=Y,_=F;return}if(B==="x"){s.scrollLeft-=Y-m,m=Y,_=F;return}const te=_-F;A+=te,I=te*1.2,m=P.touches[0].clientX,_=F;const ie=r(),$=Math.trunc(A/ie);$!==0&&(this._shouldForwardTouchToApp()?(this._logScrollRouting("forward-sgr"),this._forwardScrollToApp(m,_,$)):this._maybePageCliTranscript({shiftKey:!1,touchId:R},$)||(this._logScrollRouting("local-scrollback"),this._noteTerminalUserScroll($),this.terminal.scrollLines($),this._maybeLoadMoreHistoryOnScroll($)),A-=$*ie)}},{passive:!1}),s.addEventListener("touchend",P=>{if(!P.target?.closest?.(".term-select-bar")){if(clearTimeout(g),g=null,k=!1,this._touchSelecting){P.preventDefault(),I=0,this._endTouchSelectionGesture(),G=!1;return}if(!w&&Math.abs(I)>.3&&(w=requestAnimationFrame(O)),!H&&this.terminal){const F=P.changedTouches&&P.changedTouches[0];if(F){this._suppressTrustedTapMouseEvents();const Y=U&&U.x===F.clientX&&U.y===F.clientY?U.intent:null;this._handleMobileTerminalTap(F,G,Y)}}G=!1}},{passive:!1}),s.addEventListener("contextmenu",P=>{if(g!==null||this._touchSelecting||this._touchSelectionActive){P.preventDefault();return}if(!this.terminal?.hasSelection?.())return;const F=this.terminal.getSelection();F&&(P.preventDefault(),this.copyTerminalSelection(F))}),s.addEventListener("touchcancel",()=>{clearTimeout(g),g=null,k=!1,this._touchSelecting=!1,I=0,A=0,G=!1},{passive:!0})}s.addEventListener("click",r=>this._handleDesktopTerminalClick(r)),this._installMobileKeyboardDismiss(),this.showWelcome(),this.initImageInput(),this._chunkedWriteGen=0,this._bufferLoadSeq=0,this._bufferLoadOwner=null,this._lastUserScrollUpAt=null,this._resizeTimeout=null,this._lastResizeDims=null;const p=()=>{this._tabRailResizeOwnsObserver||(this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeTimeout=setTimeout(()=>{this._resizeTimeout=null,this.flickerFilterBuffer&&(this.flickerFilterTimeout&&(clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=null),this.flushFlickerBuffer());const r=typeof KeyboardHandler<"u"&&KeyboardHandler.keyboardVisible,m=!this.isSoloWindow&&this.detachedSessions?.has(this.activeSessionId),_=this._tilesOwnTerminal?.(),I=this.activeSessionId&&!r&&!m&&!_?this._geometryForResizeRequest():null;if(I){const{cols:E,rows:w}=I;if(!this._lastResizeDims||E!==this._lastResizeDims.cols||w!==this._lastResizeDims.rows){const k=this.activeSessionId?this.sessions.get(this.activeSessionId):null;k&&k.mode!=="shell"&&!this._paneWidthRefused&&this.terminal&&this.isTerminalAtBottom()&&this.terminal.write("\x1B[3J\x1B[H\x1B[2J"),this._lastResizeDims={cols:E,rows:w};const R=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():"desktop";let O=!1;if(this._wsReady&&this._wsSessionId===this.activeSessionId)try{this._ws.send(JSON.stringify({t:"z",c:E,r:w,v:R})),O=!0}catch{}if(!O){const A=this.activeSessionId;fetch(`/api/sessions/${this.activeSessionId}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cols:E,rows:w,viewportType:R})}).then(async H=>{const g=(await H.json())?.data??{};this._onPtyGeometryReport(A,g.cols,g.rows)}).catch(()=>{})}}}this.applyLineageLineSettings?.(),this.updateConnectionLines(),this._localEchoOverlay?.rerender(),this._forEachTile?.(E=>E.fit(),{grid:!1})},300))};window.addEventListener("resize",p),this.terminalResizeObserver&&this.terminalResizeObserver.disconnect(),this.terminalResizeObserver=new ResizeObserver(p),this.terminalResizeObserver.observe(s),this._pendingInput="",this._inputFlushTimeout=null,this._lastKeystrokeTime=0;const u=()=>{if(this._inputFlushTimeout=null,this._pendingInput&&this.activeSessionId){const r=this._pendingInput,m=this.activeSessionId;this._pendingInput="",this._sendInputAsync(m,r)}},T=r=>{const m=this._consumeMobileImeTerminalData(r);if(!/^\x1b\[<\d+;\d+;\d+[Mm]$/.test(r)&&(window.cjkActive||document.activeElement?.id==="cjkInput")){const I=document.getElementById("cjkInput");I?.classList.contains("cjk-input-visible")&&document.activeElement===this.terminal.textarea&&!window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(r)&&(_crashDiag.log("CJK regain-focus (onData swallowed input)"),I.focus());return}if(this.activeSessionId){if(window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(r))return;typeof KeyboardAccessoryBar<"u"&&KeyboardAccessoryBar.isCtrlArmed?.()&&!window.CodemanTerminalInput?.isTerminalFocusOrMouseReport(r)&&(r=KeyboardAccessoryBar.consumeCtrl(r)),this._lastTerminalData={data:r,time:performance.now()};const I=this._localEchoEnabled&&this._echoPassthroughSessions?.has(this.activeSessionId);if(I&&(r==="\r"||r==="")&&this._echoPassthroughSessions.delete(this.activeSessionId),this._localEchoEnabled&&!I){if(r==="\x7F"){const w=this._localEchoOverlay?.removeChar();if(w==="flushed"){const{count:k,text:R}=this._localEchoOverlay.getFlushed();this._flushedOffsets?.has(this.activeSessionId)&&(k===0?(this._flushedOffsets.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId)):(this._flushedOffsets.set(this.activeSessionId,k),this._flushedTexts?.set(this.activeSessionId,R))),this._pendingInput+=r,u()}else w===!1&&(this._pendingInput+=r,u());return}if(/^[\r\n]+$/.test(r)){const w=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),w&&(this._pendingInput+=w,u()),setTimeout(()=>{this._pendingInput+="\r",u()},80);return}if(r.length>1&&r.charCodeAt(0)>=32){this._localEchoOverlay?.appendText(r),m&&this._localEchoOverlay&&this._transferMobileImeCommitToLocalEcho();return}if(r.charCodeAt(0)<32){if(r.length>1&&r.charCodeAt(0)===27){if(r.startsWith(window.CodemanTerminalInput.BRACKETED_PASTE_START)){const k=!!this._localEchoOverlay?.pendingText;this._flushLocalEchoPending(),k?(u(),setTimeout(()=>{this._pendingInput+=r,u()},80)):(this._pendingInput+=r,u());return}if(window.CodemanTerminalInput.isComposerNavKey(r)){this._flushLocalEchoPending(),this._echoPassthroughSessions||(this._echoPassthroughSessions=new Set),this._echoPassthroughSessions.add(this.activeSessionId),this._pendingInput+=r,u();return}this._pendingInput+=r,u();return}if(this._restoringFlushedState){this._pendingInput+=r,u();return}if(r===" "){const k=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),k&&(this._pendingInput+=k),this._pendingInput+=r,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null);let R="";try{const A=this._localEchoOverlay?.findPrompt?.();if(A){const H=this.terminal.buffer.active,g=H.getLine(H.viewportY+A.row);g&&(R=g.translateToString(!0).slice(A.col+2).trimEnd())}}catch{}this._tabCompletionBaseText=R,u(),this._tabCompletionSessionId=this.activeSessionId,this._tabCompletionRetries=0,this._tabCompletionFallback&&clearTimeout(this._tabCompletionFallback);const O=this;this._tabCompletionFallback=setTimeout(()=>{if(O._tabCompletionFallback=null,!O._tabCompletionSessionId||O._tabCompletionSessionId!==O.activeSessionId)return;const A=O._localEchoOverlay;!A||A.pendingText||O.terminal.write("",()=>{if(!O._tabCompletionSessionId)return;A.resetBufferDetection();const H=A.detectBufferText();H&&H!==O._tabCompletionBaseText&&(O._tabCompletionSessionId=null,O._tabCompletionRetries=0,O._tabCompletionBaseText=null,A.rerender())})},300);return}const w=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),w&&(this._pendingInput+=w),this._pendingInput+=r,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),u();return}if(r.length===1&&r.charCodeAt(0)>=32){this._localEchoOverlay?.addChar(r),m&&this._localEchoOverlay&&this._transferMobileImeCommitToLocalEcho();return}}if(this._predictHookOnData(r),this._pendingInput+=r,r.charCodeAt(0)<32||r.length>1){this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),u();return}const E=performance.now();E-this._lastKeystrokeTime>50?(this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),this._lastKeystrokeTime=E,u()):(this._lastKeystrokeTime=E,this._inputFlushTimeout||(this._inputFlushTimeout=setTimeout(u,0)))}};try{this._keyCode229Recovery=window.CodemanKeyCode229Recovery?.create?.({textarea:this.terminal.textarea,emitRecovered:r=>T(r),getCompositionHelper:()=>this.terminal?._core?._compositionHelper,isScreenReaderMode:()=>this.terminal?.options?.screenReaderMode===!0})}catch{this._keyCode229Recovery=null}this.terminal.onData(r=>{try{const m=window.CodemanTerminalInput;!m?.shouldSuppressTerminalQueryResponse(r)&&!m?.isTerminalFocusOrMouseReport(r)&&this._keyCode229Recovery?.notifyCanonicalData?.()}catch{}T(r)})},_resolveLinkedFilePath(e,t){return typeof resolveLinkedFilePath!="function"?e:resolveLinkedFilePath(e,this.sessions?.get?.(t)?.workingDir)},registerFilePathLinkProvider(e={}){const t=this,i=e.terminal||this.terminal,s=e.getSessionId||(()=>this.activeSessionId),n=e.setHovered||(c=>{this._linkHovered=c}),o=i===this.terminal;let l=-1;const a={provideLinks(c,h){c!==l&&(l=c,console.debug("[LinkProvider] Checking line:",c));const f=i.buffer.active;if(!f.getLine(c-1)){h(void 0);return}const p=window.CodemanTerminalLines?.terminalLinkLine(f,c-1,i.cols,12);if(!p){h(void 0);return}const u=p.text,T=g=>{const x=p.offsetToCell(g);return{x:x.col+1,y:x.row+1}},r=(window.CodemanTerminalLines?.terminalCellWrappedPaths?.(f,c-1,4)??[]).filter(g=>!/(^|\/)\.\.(\/|$)/.test(g.path));if(!u||!u.includes("/")&&!u.includes(".")&&r.length===0){h(void 0);return}const m=[],_=[],I=(g,x)=>_.some(v=>g<v.end&&v.start<g+x),E=({url:g,startIndex:x})=>{const v=T(x);if(m.some(D=>D.range.start.x===v.x&&D.range.start.y===v.y))return;_.push({start:x,end:x+g.length});const L=x+g.length,b=[];let B=x;for(let D=x+1;D<L;D++)T(D).y!==T(D-1).y&&(b.push([B,D]),B=D);b.push([B,L]);for(let D=0;D<b.length;D++){const[G,U]=b[D];m.push({text:g,range:{start:T(G),end:b.length===1?T(U):T(U-1)},decorations:{pointerCursor:!0,underline:!0},activate(){t._openTerminalUrl(g)},hover(){n(!0)},leave(){n(!1)}})}},w=/\b(tail|cat|head|less|grep|watch|vim|nano)\s+(?:[^\s\/]+\s+){0,4}(\/[^\s"'<>|;&\n\x00-\x1f]+)/g,k=/Bash\([^)]*?(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\)\n\x00-\x1f]+)/g,R=(g,x=!1)=>{const v=s(),L=t._resolveLinkedFilePath(g,v);if(x){t.openFolderGrid(L,v);return}if(previewsInFileViewer(L)||rendersAsPage(L)||t._isExternalPreviewPath(L,v)){t.openFilePreview(L,v);return}t.openLogViewerWindow(L,v)},O=(g,x,v=!1)=>{const L=u.indexOf(g,x);if(L===-1)return;const b=T(L),B=T(L+g.length);m.some(D=>D.range.start.x===b.x&&D.range.start.y===b.y)||I(L,g.length)||(_.push({start:L,end:L+g.length}),m.push({text:g,range:{start:b,end:B},decorations:{pointerCursor:!0,underline:!0},activate(D,G){R(G,v)},hover(){n(!0)},leave(){n(!1)}}))};let A;for(const g of window.CodemanTerminalLines?.findTerminalUrls?.(u)??[])E(g);for(w.lastIndex=0;(A=w.exec(u))!==null;)O(A[2],A.index);for(const g of findFilePathLinks(u))O(g.path,g.index,!!g.folder);for(k.lastIndex=0;(A=k.exec(u))!==null;)O(A[1],A.index);const H=r.filter(g=>!m.some(x=>x.text===g.path&&x.range.start.y===g.segments[0].row+1&&x.range.start.x===g.segments[0].startCol+1));if(H.length>0){const g=H.flatMap(v=>v.segments),x=v=>g.some(L=>{const b=L.row+1;if(b<v.range.start.y||b>v.range.end.y)return!1;const B=b===v.range.start.y?v.range.start.x:1,D=b===v.range.end.y?v.range.end.x:Number.MAX_SAFE_INTEGER;return B<=L.endCol&&D>=L.startCol+1});for(let v=m.length-1;v>=0;v--)x(m[v])&&m.splice(v,1);for(const v of H)for(const L of v.segments)m.push({text:v.path,range:{start:{x:L.startCol+1,y:L.row+1},end:{x:L.endCol,y:L.row+1}},decorations:{pointerCursor:!0,underline:!0},activate(){R(v.path)},hover(){n(!0)},leave(){n(!1)}})}m.length>0&&console.debug("[LinkProvider] Found links:",m.map(g=>g.text)),h(m.length>0?m:void 0)}};return o&&(this._terminalLinkProvider=a),i.registerLinkProvider(a),console.log("[LinkProvider] File path link provider registered"),a},_terminalOsc8LinkHandler(){return{activate:(e,t)=>{/^https?:\/\/[^\s\x00-\x1f]+$/i.test(t)&&window.confirm(`Open this link?
1
+ "use strict";(function(e){const t=/^\x1b\[[\?>=]?[\d;]*[cnR]$/,i=/^\x1b\][\d;]*[^\x07\x1b]*(?:\x07|\x1b\\)$/,s=/^\x1b\[<\d+;\d+;\d+[Mm]$/,n=/^\x1b\[M[\s\S]{3}$/,o=/^\x1b\[[IO]$/,d=["input","textarea","select","button","a[href]",'[contenteditable=""]','[contenteditable="true"]','[tabindex]:not([tabindex="-1"])','[role="treeitem"]',".keyboard-accessory-bar",".path-picker-overlay"].join(","),S=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b\[[0-9;?<>=!]*[ -/]*[@-~]|\x1b[()#][0-9A-Za-z]|\x1b[=>78M]/g,p="\x1B[5~",u="\x1B[6~",T=.5,r=3,m=150,_=.1,I=2,E=3e3,w=1e3;function A(b,C){const L=b.shiftKey&&Math.abs(b.deltaX)>Math.abs(b.deltaY)?b.deltaX:b.deltaY;return L?b.deltaMode===1?L:b.deltaMode===2?L*(C||24):L/25:0}const k=5;function F(b,C){if(!b||!C)return"";const L=b<0?64:65,N=Math.min(Math.abs(b),k);return`\x1B[<${L};${C.col};${C.row}M`.repeat(N)}function x(b,C,L){if(!Number.isFinite(C)||!C)return{state:b||{},ticks:0};const N=Math.sign(C),K=!b||typeof b.lastAt!="number"||L-b.lastAt>m,W=b?.dir&&b.dir!==N;if(K&&Math.abs(C)>=_){const J=N*Math.max(1,Math.round(Math.abs(C)));return{state:{dir:N,lastAt:L,pending:C-J},ticks:N*Math.min(Math.abs(J),k)}}const z=(K||W?0:b.pending||0)+C,j=Math.trunc(z+Math.sign(z)*1e-9);return{state:{dir:N,lastAt:L,pending:Math.abs(z-j)<1e-9?0:z-j},ticks:j===0?0:Math.sign(j)*Math.min(Math.abs(j),k)}}function H(b,C){const L=j=>j?.match(/\x1b\[<(64|65);|\x1b\[(5|6)~/)?.[0],N=L(b),K=L(C);return((N&&N===K?b+C:C).match(/\x1b\[<(?:64|65);\d+;\d+M|\x1b\[[56]~/g)||[]).join("")}function g(b){return Math.max(2,Math.round((b||24)*T))}function R(b,C,L){const N=g(L),K=(b||0)+C,W=Math.trunc(K/N),z=W?(W<0?p:u).repeat(Math.min(Math.abs(W),r)):"";return{pending:K-W*N,keys:z}}function M(b,C,L,N,K){const W=b||{};if(C?.ctrlKey)return{state:W,keys:""};const z=Math.abs(C?.deltaX||0),j=Math.abs(C?.deltaY||0);if(z&&j&&z>j)return{state:W,keys:""};const J=g(N),q=L<0?-1:1,ne=typeof C?.touchId=="number"?C.touchId:null,fe=typeof W.touchId=="number"?W.touchId:null;let oe=W.pending||0,X=!!W.prepaid;const he=q!==W.dir;let Z;if(typeof W.lastAt!="number"||ne!==fe)Z=!0;else if(ne!==null)Z=!1;else{const ee=K-W.lastAt,re=W.notch?E:w;Z=ee>(X&&!he?re:m)}if((Z||he)&&(X&&(oe=0),X=!1),Z){const ee=Math.abs(L),re=oe*q>0?oe:0;if(ee>=_&&ee<J&&(re+L)*q<J)return{state:{pending:re+L-q*J,lastAt:K,dir:q,prepaid:!0,notch:ee>=I,touchId:ne},keys:q<0?p:u}}const ae=R(oe,L,N);return X&&ae.pending*q>=0&&(X=!1),{state:{pending:ae.pending,lastAt:K,dir:q,prepaid:X,notch:X&&!!W.notch,touchId:ne},keys:ae.keys}}const v=4,y=/^\x1b(?:\[(?:[ABCDHF]|1;[2-8][ABCDHF]|[1-8](?:;[2-8])?~)|O[ABCDHF])$/,P="\x1B[200~";function B(b){return y.test(b)}const Y=/^› /;function G(b){const C=Array.from(b);if(C.length===1){const L=C[0].codePointAt(0);return L===127?"backspace":L>=32?"char":"clear"}return b.charCodeAt(0)===27?"clear":b.charCodeAt(0)>=32?"text":"clear"}function V(b){try{const C=b.buffer.active,L=C.getLine(C.baseY+C.cursorY);return!!L&&Y.test(L.translateToString(!0))}catch{return!1}}const O=/^ {0,2}› (?:\d+\. |Add notes)/,D=/^ {2}[a-z←|]/,U=/^ {1,4}(?:Press enter to confirm|enter (?:select|continue)|tab (?:to add|or esc to clear) notes)/;function te(b){try{const C=b.buffer.active,L=[];for(let K=C.baseY+b.rows-1;K>=C.baseY;K--){const W=C.getLine(K)?.translateToString(!0)??"";W.trim()&&L.push(W)}let N=0;for(;N<L.length&&!U.test(L[N]);){if(!D.test(L[N]))return!1;N++}return N<L.length&&L.slice(N+1).some(K=>O.test(K))}catch{return!1}}function ie(b){try{const C=b.buffer.active,L=C.baseY+(C.cursorY||0)-C.viewportY;return L>=0&&L<b.rows?L:null}catch{return null}}function $(b){return t.test(b)||i.test(b)}function Q(b){return $(b)}function se(b){return o.test(b)||s.test(b)||n.test(b)}const le={og:{background:"#0d0d0d",foreground:"#e0e0e0",cursor:"#e0e0e0",cursorAccent:"#0d0d0d",selectionBackground:"rgba(255,255,255,0.3)",black:"#0d0d0d",red:"#ff6b6b",green:"#51cf66",yellow:"#ffd43b",blue:"#339af0",magenta:"#cc5de8",cyan:"#22b8cf",white:"#e0e0e0",brightBlack:"#495057",brightRed:"#ff8787",brightGreen:"#69db7c",brightYellow:"#ffe066",brightBlue:"#5c7cfa",brightMagenta:"#da77f2",brightCyan:"#66d9e8",brightWhite:"#ffffff"},"daylight-green":{background:"#161b23",foreground:"#dfe6ef",cursor:"#2fd3aa",cursorAccent:"#161b23",selectionBackground:"rgba(47,211,170,0.22)",black:"#161b23",red:"#ff8585",green:"#34d8a0",yellow:"#f0c25a",blue:"#5cc6e8",magenta:"#c79af2",cyan:"#2bcbbb",white:"#dfe6ef",brightBlack:"#5b6675",brightRed:"#ffa0a0",brightGreen:"#5fe6b8",brightYellow:"#ffd884",brightBlue:"#82d4ee",brightMagenta:"#d6b3f7",brightCyan:"#5ee0d4",brightWhite:"#f3f6fa"},"daylight-blue":{background:"#161b23",foreground:"#dfe6ef",cursor:"#38b6f0",cursorAccent:"#161b23",selectionBackground:"rgba(56,182,240,0.22)",black:"#161b23",red:"#ff8585",green:"#34d8a0",yellow:"#f0c25a",blue:"#5cc6e8",magenta:"#c79af2",cyan:"#2bcbbb",white:"#dfe6ef",brightBlack:"#5b6675",brightRed:"#ffa0a0",brightGreen:"#5fe6b8",brightYellow:"#ffd884",brightBlue:"#82d4ee",brightMagenta:"#d6b3f7",brightCyan:"#5ee0d4",brightWhite:"#f3f6fa"},"paper-gray":{background:"#f6f8fa",foreground:"#1f2328",cursor:"#0969da",cursorAccent:"#ffffff",selectionBackground:"rgba(9,105,218,0.2)",black:"#24292f",red:"#cf222e",green:"#1a7f37",yellow:"#9a6700",blue:"#0969da",magenta:"#8250df",cyan:"#1b7c83",white:"#59636e",brightBlack:"#6e7781",brightRed:"#a40e26",brightGreen:"#116329",brightYellow:"#7d4e00",brightBlue:"#0550ae",brightMagenta:"#6639ba",brightCyan:"#116b75",brightWhite:"#1f2328"},"solarized-light":{background:"#fdf6e3",foreground:"#586e75",cursor:"#147ba3",cursorAccent:"#fdf6e3",selectionBackground:"rgba(38,139,210,0.2)",black:"#eee8d5",red:"#dc322f",green:"#758600",yellow:"#9b7800",blue:"#147ba3",magenta:"#d33682",cyan:"#2a9189",white:"#073642",brightBlack:"#93a1a1",brightRed:"#cb4b16",brightGreen:"#657b83",brightYellow:"#586e75",brightBlue:"#268bd2",brightMagenta:"#6c71c4",brightCyan:"#2aa198",brightWhite:"#002b36"},"catppuccin-latte":{background:"#eff1f5",foreground:"#4c4f69",cursor:"#1e66f5",cursorAccent:"#ffffff",selectionBackground:"rgba(30,102,245,0.18)",black:"#5c5f77",red:"#d20f39",green:"#3b8f2b",yellow:"#a86605",blue:"#1e66f5",magenta:"#8839ef",cyan:"#177f86",white:"#6c6f85",brightBlack:"#7c7f93",brightRed:"#b50930",brightGreen:"#2f7622",brightYellow:"#8b5604",brightBlue:"#174fbf",brightMagenta:"#6f2bc5",brightCyan:"#116b71",brightWhite:"#4c4f69"},"rose-pine-dawn":{background:"#faf4ed",foreground:"#575279",cursor:"#286983",cursorAccent:"#fffaf3",selectionBackground:"rgba(40,105,131,0.2)",black:"#575279",red:"#b4637a",green:"#286983",yellow:"#96681f",blue:"#477f91",magenta:"#907aa9",cyan:"#3f7f8b",white:"#6e6a86",brightBlack:"#797593",brightRed:"#984d66",brightGreen:"#1f5266",brightYellow:"#7d5417",brightBlue:"#386b7c",brightMagenta:"#765f90",brightCyan:"#326b76",brightWhite:"#575279"}},de=new Set(["paper-gray","solarized-light","catppuccin-latte","rose-pine-dawn"]);function ce(){return typeof document<"u"&&document.documentElement.dataset.skin||"daylight-blue"}function ue(){const b=ce();return le[b]||le["daylight-blue"]}function me(b=ce()){return de.has(b)}e.CodemanTerminalInput={isTerminalQueryResponse:$,shouldSuppressTerminalQueryResponse:Q,isTerminalFocusOrMouseReport:se,isComposerNavKey:B,classifyPredictInput:G,isCodexComposerRow:V,isCodexSelectionMenu:te,cursorViewportRow:ie,CODEX_COMPOSER_ROW_RE:Y,BRACKETED_PASTE_START:P,USER_SCROLL_STICKY_SUPPRESS_MS:1500,TOUCH_COMPAT_MOUSE_SUPPRESS_MS:450,REPLAY_ESCAPE_RE:S,KEY_PAGE_UP:p,KEY_PAGE_DOWN:u,PAGE_KEY_SCREEN_FRACTION:T,PAGE_KEY_MAX_PER_BATCH:r,wheelDeltaLines:A,SGR_WHEEL_MAX_TICKS:k,sgrWheelReports:F,wheelTicksForGesture:x,coalesceScrollBytes:H,pageKeysForTravel:R,pageKeysForGesture:M,PAGE_KEY_GESTURE_GAP_MS:m,PAGE_KEY_MIN_START_ROWS:_,PAGE_KEY_IMMEDIATE_MAX_ROWS:I,PAGE_KEY_DEBT_MS:w,PAGE_KEY_NOTCH_DEBT_MS:E,TUI_PROMPT_DEFAULT_ROWS_FROM_BOTTOM:v,MOBILE_KEYBOARD_DISMISS_EXEMPT_SELECTOR:d,MOBILE_KEYBOARD_DISMISS_TAP_SLOP:8,TOUCH_SELECT_LONG_PRESS_MS:350,TOUCH_SELECT_FOCUS_GUARD_MS:800},e.CODEMAN_XTERM_THEMES=le,e.codemanCurrentXtermTheme=ue,e.codemanCurrentSkinIsLight=me})(window),Object.assign(CodemanApp.prototype,{_destroyKeyCode229Recovery(){try{this._keyCode229Recovery?.destroy?.()}catch{}this._keyCode229Recovery=null},_destroyMobileImePreview(){try{this._mobileImePreview?.destroy?.()}catch{}this._mobileImePreview=null,this._mobileImePreviewSessionId=null,this._mobileImeCommitOutputSeq=null;try{this._mobileImePreviewNode?.remove?.()}catch{}try{this._mobileImePreviewHelpers?.classList?.remove("codeman-ime-preview-owned")}catch{}this._mobileImePreviewNode=null,this._mobileImePreviewHelpers=null;try{this._mobileImePreviewOfflineHandler&&window.removeEventListener("offline",this._mobileImePreviewOfflineHandler),this._mobileImePreviewPagehideHandler&&window.removeEventListener("pagehide",this._mobileImePreviewPagehideHandler)}catch{}this._mobileImePreviewOfflineHandler=null,this._mobileImePreviewPagehideHandler=null},_initMobileImePreview(){this._destroyMobileImePreview();let e=null,t=null;try{if(typeof MobileImePreview>"u"||!MobileImePreview?.isIosWebKitTouch?.())return;const i=this.terminal?.textarea;if(t=this.terminal?.element?.querySelector?.(".xterm-helpers"),!i||!t)return;e=document.createElement("span"),this._mobileImePreviewNode=e,this._mobileImePreviewHelpers=t,e.className="codeman-ime-preview",e.setAttribute("aria-hidden","true"),e.hidden=!0,t.appendChild(e);const s=()=>{try{const h=t.querySelector?.(".composition-view")||this.terminal?.element?.querySelector?.(".composition-view");if(!h||!e.style)return;const f=typeof getComputedStyle=="function"?getComputedStyle(h):h.style;for(const u of["fontFamily","fontSize","fontWeight","fontStyle","lineHeight","height"]){const T=f?.[u]||h.style?.[u];T&&(e.style[u]=T)}const d=this.terminal?.options?.theme;let S=d?.foreground,p=d?.background;if(!S||!p)try{const u=window.codemanCurrentXtermTheme?.();S=S||u?.foreground,p=p||u?.background}catch{}e.style.color=S||"#e0e0e0",e.style.backgroundColor=p||"#0d0d0d"}catch{}},n=()=>this._localEchoEnabled&&!this._echoPassthroughSessions?.has(this.activeSessionId)&&this._localEchoOverlay||null,o=()=>{try{this._localEchoOverlay?.composition&&this._localEchoOverlay.setComposition("")}catch{}},l=()=>{try{e.hidden=!0}catch{}try{e.textContent=""}catch{}try{delete e.dataset.phase}catch{}try{t.classList.remove("codeman-ime-preview-owned")}catch{}},a=()=>{o(),l()},c=MobileImePreview.create({textarea:i,keydownTarget:this.terminal.element,render:({text:h,phase:f})=>{try{const d=n();if(d&&typeof d.setComposition=="function"){if(d.setComposition(h),!h||d.state?.visible){l(),t.classList.toggle("codeman-ime-preview-owned",!!h);return}d.setComposition("")}else o();s(),e.textContent=h,e.dataset.phase=f,e.hidden=!h,t.classList.toggle("codeman-ime-preview-owned",!!h)}catch{a()}},clear:a});this._mobileImePreview=c,this._mobileImePreviewSessionId=this.activeSessionId,this._mobileImePreviewOfflineHandler=()=>{try{this._mobileImePreview?.reset?.()}catch{}},this._mobileImePreviewPagehideHandler=this._mobileImePreviewOfflineHandler,window.addEventListener("offline",this._mobileImePreviewOfflineHandler),window.addEventListener("pagehide",this._mobileImePreviewPagehideHandler)}catch{this._destroyMobileImePreview()}},_consumeMobileImeTerminalData(e){let t=!1;try{t=this._mobileImePreview?.consumeTerminalData?.(e)===!0}catch{}return t&&(this._mobileImeCommitOutputSeq=this._terminalOutputSeq||0),t},_noteMobileImeAuthoritativeOutput(e,t){try{const i=this._mobileImeCommitOutputSeq;if(i==null||e===null||t!==this.activeSessionId||!(e>i))return;this._mobileImeCommitOutputSeq=null,this._mobileImePreview?.noteAuthoritativeOutput?.()}catch{}},_transferMobileImeCommitToLocalEcho(){this._mobileImeCommitOutputSeq=null;try{this._mobileImePreview?.completeCommit?.({predicted:!0})}catch{}},initTerminal(){const e=parseInt(localStorage.getItem("codeman-scrollback")),t=Number.isFinite(e)&&e>0?Math.max(e,DEFAULT_SCROLLBACK):DEFAULT_SCROLLBACK;this._destroyKeyCode229Recovery();const i=this.loadAppSettingsFromStorage?.()||{};if(this.terminal=new Terminal({theme:{...window.codemanCurrentXtermTheme()},fontFamily:window.CodemanTerminalFont.resolve(i.terminalFontFamily),...window.CodemanTerminalFont.resolveWeights(i),fontSize:MobileDetection.getDeviceType()==="mobile"?10:14,lineHeight:1.2,cursorBlink:!1,cursorStyle:"block",minimumContrastRatio:window.codemanCurrentSkinIsLight()?4.5:1,scrollback:t,allowTransparency:!0,allowProposedApi:!0,linkHandler:this._terminalOsc8LinkHandler()}),this.fitAddon=new FitAddon.FitAddon,this.terminal.loadAddon(this.fitAddon),this._xtermSnapshots=new Map,typeof SerializeAddon<"u")try{this._serializeAddon=new SerializeAddon.SerializeAddon,this.terminal.loadAddon(this._serializeAddon)}catch{this._serializeAddon=null}if(typeof Unicode11Addon<"u")try{const r=new Unicode11Addon.Unicode11Addon;this.terminal.loadAddon(r),this.terminal.unicode.activeVersion="11"}catch{}this._installOsc52Clipboard(this.terminal);const s=document.getElementById("terminalContainer");this.terminal.open(s),this._initMobileImePreview(),this._installMobileTapMouseGuard(),this._installShiftDragSelection(),this._installTouchSelectionFocusGuard(),this.terminal.textarea?.addEventListener("focus",()=>this._noteFocusedTile(null)),this.terminal.attachCustomKeyEventHandler(r=>{try{this._keyCode229Recovery?.handleKeyEvent?.(r)}catch{}if(r.isComposing||r.key==="Process"||r.keyCode===229)return!0;if(r.altKey&&!r.ctrlKey&&!r.shiftKey&&/^(Digit[1-9]|BracketLeft|BracketRight|KeyK)$/.test(r.code||"")||r.type==="keydown"&&this.isUserBoundShortcutEvent?.(r)||r.type==="keydown"&&this.shouldOpenCommandPaletteFromShortcut?.(r)||this.tileShortcutFor?.(r))return!1;if(this.shouldCopyTerminalSelectionFromShortcut?.(r)){const m=this.terminal?.hasSelection?.()?this.terminal.getSelection():"";return this.cleanedTerminalSelection(m).trim()?(r.preventDefault(),this.copyTerminalSelection(m),!1):(this.terminal?.hasSelection?.()&&(this.terminal.clearSelection?.(),this.showToast("Nothing to copy","warning")),r.shiftKey?(r.preventDefault(),!1):!0)}if(r.type==="keydown"&&this.shouldToggleSessionSidebarFromShortcut?.(r))return!1;if((r.ctrlKey||r.metaKey)&&r.key==="v"&&r.type==="keydown")return this.activeSessionId&&this._handleImagePaste&&this._handleImagePaste(),!1;if(r.type==="keydown"&&r.key.toLowerCase()==="z"&&r.ctrlKey&&!r.altKey&&!r.metaKey&&!r.shiftKey){const m=this.activeSessionId?this.sessions.get(this.activeSessionId):null;if(m&&m.mode!=="shell")return r.preventDefault(),!1}if(r.key==="Enter"&&(r.shiftKey||r.ctrlKey)){if(r.type==="keydown"&&this.activeSessionId)if(this._localEchoEnabled){const m=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),m&&(this._pendingInput+=m,u()),setTimeout(()=>{fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:r.ctrlKey?"C-Enter":"S-Enter"})})},m?80:0)}else fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:r.ctrlKey?"C-Enter":"S-Enter"})});return!1}return!0}),this._webglAddon=null;const n=new URLSearchParams(location.search),o=(()=>{try{const r=localStorage.getItem("codeman-webgl-disabled");if(!r)return!1;const{at:m}=JSON.parse(r);return Date.now()-m>WEBGL_FALLBACK.STICKY_EXPIRY_MS?(localStorage.removeItem("codeman-webgl-disabled"),!1):!0}catch{return!1}})(),l=this.loadAppSettingsFromStorage(),a=this.getDefaultSettings(),c=l.webglRendererEnabled??a.webglRendererEnabled,{skip:h,clearSticky:f}=shouldSkipWebGL({deviceType:MobileDetection.getDeviceType(),noWebglParam:n.has("nowebgl"),forceParam:n.get("webgl")==="force",stickyDisabled:o,userPrefEnabled:c});if(f)try{localStorage.removeItem("codeman-webgl-disabled")}catch{}if(h&&o&&console.log("[CRASH-DIAG] WebGL sticky-disabled from prior stalls \u2014 DOM renderer in use. Re-enable: ?webgl=force"),!h)if(typeof WebglAddon<"u")this._initWebGL();else{const r=document.createElement("script");r.src="vendor/xterm-addon-webgl.min.js",r.onload=()=>this._initWebGL(),r.onerror=()=>console.warn("[CRASH-DIAG] Failed to load WebGL addon \u2014 using canvas renderer"),document.head.appendChild(r)}this._localEchoOverlay=new LocalEchoOverlay(this.terminal),this._predictiveEcho=typeof PredictiveEchoOverlay<"u"?new PredictiveEchoOverlay(this.terminal):null,this._predictiveEcho?.setPredictWhen(r=>window.CodemanTerminalInput.isCodexComposerRow(r)),MobileDetection.isTouchDevice()&&(this.terminal.onCursorMove(()=>this._syncMobileHelperTextareaToCursor()),this.terminal.onRender(()=>this._syncMobileHelperTextareaToCursor()),this.terminal.onCursorMove(()=>this._applyKeyboardClip()),this.terminal.onRender(()=>this._applyKeyboardClip())),this.terminal.onRender(()=>{this._lastRenderAt=Date.now()}),this._startRenderLivenessWatchdog(),this._cjkInput=null,typeof CjkInput<"u"&&(this._cjkInput=CjkInput.init({send:r=>{this._handleCjkInput(r)}}));const d=this.terminal.focus.bind(this.terminal);this.terminal.focus=()=>{const r=document.getElementById("cjkInput");r?.classList.contains("cjk-input-visible")?r.focus():d()},MobileDetection.getDeviceType()==="mobile"&&document.body.classList.contains("safari-browser")?requestAnimationFrame(()=>{this.syncTerminalGeometry(),requestAnimationFrame(()=>this.syncTerminalGeometry())}):this.syncTerminalGeometry(),this._terminalFontReady=this._awaitTerminalFont(),this.registerFilePathLinkProvider(),this.terminal.onSelectionChange?.(()=>{if(!this.terminal?.hasSelection?.()){this._touchSelecting=!1,this._touchSelectionActive=!1,this._touchSelectionAnchor=null,this._hideTouchSelectionBar(),this._autoCopyPending=!1;return}this._autoCopyPending=!0}),this._autoCopyListenerInstalled||(this._autoCopyListenerInstalled=!0,document.addEventListener("mouseup",()=>this._flushAutoCopySelection())),s.addEventListener("wheel",r=>{const m=this.terminal?.modes?.mouseTrackingMode;if(m&&m!=="none"||this.terminal?.buffer?.active?.type==="alternate")return;if(r.preventDefault(),r.stopPropagation(),this._shouldForwardWheelToApp(r)){if(r.ctrlKey||Math.abs(r.deltaX||0)>Math.abs(r.deltaY||0))return;this._logScrollRouting("forward-sgr"),this._forwardScrollToApp(r.clientX,r.clientY,this._wheelScrollLinesFloat(r));return}const _=this._wheelScrollLinesFloat(r);this._maybePageCliTranscript(r,_)||(this._logScrollRouting("local-scrollback"),this._noteTerminalUserScroll(_),this._smoothScrollBy(_))},{passive:!1,capture:!0});{const r=()=>this.terminal._core?._renderService?.dimensions?.css?.cell?.height||13;let m=0,_=0,I=0,E=0,w=null,A=!1,k=0;const F=O=>{const D=E?(O-E)/16.67:1;if(E=O,!A&&Math.abs(I)>.3){const U=Math.round(I/r());U!==0&&(this._shouldForwardTouchToApp()?this._forwardScrollToApp(m,_,U):this._maybePageCliTranscript({shiftKey:!1,touchId:k},U)||(this.terminal.scrollLines(U),this._maybeLoadMoreHistoryOnScroll(U))),I*=.92,w=requestAnimationFrame(F)}else A?w=requestAnimationFrame(F):(w=null,I=0)};let x=0,H=!1,g=null,R=0,M=0,v=0,y=0,P=null;const B=()=>s.classList.contains("term-overflows-x")&&s.scrollWidth-s.clientWidth>1;let Y=!1,G=null;const V=window.CodemanTerminalInput.MOBILE_KEYBOARD_DISMISS_TAP_SLOP;s.addEventListener("touchstart",O=>{if(!O.target?.closest?.(".term-select-bar")&&(O.touches.length!==1&&(clearTimeout(g),g=null),O.touches.length===1)){m=O.touches[0].clientX,_=O.touches[0].clientY,v=_,y=m,P=null,this._terminalGestureAxis=null,I=0,x=0,A=!0,k++,H=!1,Y=this._isMobileTerminalInputFocused();const D=this._classifyMobileTerminalTap(m,_);G={x:m,y:_,intent:D},D==="content"&&(O.preventDefault(),this._blurMobileTerminalInput()),R=m,M=_,clearTimeout(g),g=setTimeout(()=>{g=null,this._beginTouchSelection(R,M)},window.CodemanTerminalInput.TOUCH_SELECT_LONG_PRESS_MS),E=0,w&&(cancelAnimationFrame(w),w=null)}},{passive:!1}),s.addEventListener("touchmove",O=>{if(this._touchSelecting){O.preventDefault();const D=O.touches[0];D&&this._extendTouchSelection(D.clientX,D.clientY);return}if(g&&O.touches.length===1){const D=O.touches[0];(Math.abs(D.clientX-R)>V||Math.abs(D.clientY-M)>V)&&(clearTimeout(g),g=null)}if(O.touches.length===1&&A){const D=O.touches[0].clientY,U=O.touches[0].clientX;if(!H){const Q=Math.abs(D-v),se=Math.abs(U-y);(Q>=V||se>=V)&&(H=!0,P=se>Q?B()?"x":"swipe":"y",this._terminalGestureAxis=P)}if(!H)return;if(O.preventDefault(),P==="swipe"){const Q=typeof SwipeHandler<"u"?SwipeHandler.maxVerticalDrift:50;if(Math.abs(D-v)<=Q)return;P="y",this._terminalGestureAxis="y",m=U,_=D;return}if(P==="x"){s.scrollLeft-=U-m,m=U,_=D;return}const te=_-D;x+=te,I=te*1.2,m=O.touches[0].clientX,_=D;const ie=r(),$=Math.trunc(x/ie);$!==0&&(this._shouldForwardTouchToApp()?(this._logScrollRouting("forward-sgr"),this._forwardScrollToApp(m,_,$)):this._maybePageCliTranscript({shiftKey:!1,touchId:k},$)||(this._logScrollRouting("local-scrollback"),this._noteTerminalUserScroll($),this.terminal.scrollLines($),this._maybeLoadMoreHistoryOnScroll($)),x-=$*ie)}},{passive:!1}),s.addEventListener("touchend",O=>{if(!O.target?.closest?.(".term-select-bar")){if(clearTimeout(g),g=null,A=!1,this._touchSelecting){O.preventDefault(),I=0,this._endTouchSelectionGesture(),Y=!1;return}if(!w&&Math.abs(I)>.3&&(w=requestAnimationFrame(F)),!H&&this.terminal){const D=O.changedTouches&&O.changedTouches[0];if(D){this._suppressTrustedTapMouseEvents();const U=G&&G.x===D.clientX&&G.y===D.clientY?G.intent:null;this._handleMobileTerminalTap(D,Y,U)}}Y=!1}},{passive:!1}),s.addEventListener("contextmenu",O=>{if(g!==null||this._touchSelecting||this._touchSelectionActive){O.preventDefault();return}if(!this.terminal?.hasSelection?.())return;const D=this.terminal.getSelection();D&&(O.preventDefault(),this.copyTerminalSelection(D))}),s.addEventListener("touchcancel",()=>{clearTimeout(g),g=null,A=!1,this._touchSelecting=!1,I=0,x=0,Y=!1},{passive:!0})}s.addEventListener("click",r=>this._handleDesktopTerminalClick(r)),this._installMobileKeyboardDismiss(),this.showWelcome(),this.initImageInput(),this._chunkedWriteGen=0,this._bufferLoadSeq=0,this._bufferLoadOwner=null,this._lastUserScrollUpAt=null,this._resizeTimeout=null,this._lastResizeDims=null;const p=()=>{this._tabRailResizeOwnsObserver||(this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeTimeout=setTimeout(()=>{this._resizeTimeout=null,this.flickerFilterBuffer&&(this.flickerFilterTimeout&&(clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=null),this.flushFlickerBuffer());const r=typeof KeyboardHandler<"u"&&KeyboardHandler.keyboardVisible,m=!this.isSoloWindow&&this.detachedSessions?.has(this.activeSessionId),_=this._tilesOwnTerminal?.(),I=this.activeSessionId&&!r&&!m&&!_?this._geometryForResizeRequest():null;if(I){const{cols:E,rows:w}=I;if(!this._lastResizeDims||E!==this._lastResizeDims.cols||w!==this._lastResizeDims.rows){const A=this.activeSessionId?this.sessions.get(this.activeSessionId):null;A&&A.mode!=="shell"&&!this._paneWidthRefused&&this.terminal&&this.isTerminalAtBottom()&&this.terminal.write("\x1B[3J\x1B[H\x1B[2J"),this._lastResizeDims={cols:E,rows:w};const k=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():"desktop";let F=!1;if(this._wsReady&&this._wsSessionId===this.activeSessionId)try{this._ws.send(JSON.stringify({t:"z",c:E,r:w,v:k})),F=!0}catch{}if(!F){const x=this.activeSessionId;fetch(`/api/sessions/${this.activeSessionId}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cols:E,rows:w,viewportType:k})}).then(async H=>{const g=(await H.json())?.data??{};this._onPtyGeometryReport(x,g.cols,g.rows)}).catch(()=>{})}}}this.applyLineageLineSettings?.(),this.updateConnectionLines(),this._localEchoOverlay?.rerender(),this._forEachTile?.(E=>E.fit(),{grid:!1})},300))};window.addEventListener("resize",p),this.terminalResizeObserver&&this.terminalResizeObserver.disconnect(),this.terminalResizeObserver=new ResizeObserver(p),this.terminalResizeObserver.observe(s),this._pendingInput="",this._inputFlushTimeout=null,this._lastKeystrokeTime=0;const u=()=>{if(this._inputFlushTimeout=null,this._pendingInput&&this.activeSessionId){const r=this._pendingInput,m=this.activeSessionId;this._pendingInput="",this._sendInputAsync(m,r)}},T=r=>{const m=this._consumeMobileImeTerminalData(r);if(!/^\x1b\[<\d+;\d+;\d+[Mm]$/.test(r)&&(window.cjkActive||document.activeElement?.id==="cjkInput")){const I=document.getElementById("cjkInput");I?.classList.contains("cjk-input-visible")&&document.activeElement===this.terminal.textarea&&!window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(r)&&(_crashDiag.log("CJK regain-focus (onData swallowed input)"),I.focus());return}if(this.activeSessionId){if(window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(r))return;typeof KeyboardAccessoryBar<"u"&&KeyboardAccessoryBar.isCtrlArmed?.()&&!window.CodemanTerminalInput?.isTerminalFocusOrMouseReport(r)&&(r=KeyboardAccessoryBar.consumeCtrl(r)),this._lastTerminalData={data:r,time:performance.now()};const I=this._localEchoEnabled&&this._echoPassthroughSessions?.has(this.activeSessionId);if(I&&(r==="\r"||r==="")&&this._echoPassthroughSessions.delete(this.activeSessionId),this._localEchoEnabled&&!I){if(r==="\x7F"){const w=this._localEchoOverlay?.removeChar();if(w==="flushed"){const{count:A,text:k}=this._localEchoOverlay.getFlushed();this._flushedOffsets?.has(this.activeSessionId)&&(A===0?(this._flushedOffsets.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId)):(this._flushedOffsets.set(this.activeSessionId,A),this._flushedTexts?.set(this.activeSessionId,k))),this._pendingInput+=r,u()}else w===!1&&(this._pendingInput+=r,u());return}if(/^[\r\n]+$/.test(r)){const w=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),w&&(this._pendingInput+=w,u()),setTimeout(()=>{this._pendingInput+="\r",u()},80);return}if(r.length>1&&r.charCodeAt(0)>=32){this._localEchoOverlay?.appendText(r),m&&this._localEchoOverlay&&this._transferMobileImeCommitToLocalEcho();return}if(r.charCodeAt(0)<32){if(r.length>1&&r.charCodeAt(0)===27){if(r.startsWith(window.CodemanTerminalInput.BRACKETED_PASTE_START)){const A=!!this._localEchoOverlay?.pendingText;this._flushLocalEchoPending(),A?(u(),setTimeout(()=>{this._pendingInput+=r,u()},80)):(this._pendingInput+=r,u());return}if(window.CodemanTerminalInput.isComposerNavKey(r)){this._flushLocalEchoPending(),this._echoPassthroughSessions||(this._echoPassthroughSessions=new Set),this._echoPassthroughSessions.add(this.activeSessionId),this._pendingInput+=r,u();return}this._pendingInput+=r,u();return}if(this._restoringFlushedState){this._pendingInput+=r,u();return}if(r===" "){const A=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),A&&(this._pendingInput+=A),this._pendingInput+=r,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null);let k="";try{const x=this._localEchoOverlay?.findPrompt?.();if(x){const H=this.terminal.buffer.active,g=H.getLine(H.viewportY+x.row);g&&(k=g.translateToString(!0).slice(x.col+2).trimEnd())}}catch{}this._tabCompletionBaseText=k,u(),this._tabCompletionSessionId=this.activeSessionId,this._tabCompletionRetries=0,this._tabCompletionFallback&&clearTimeout(this._tabCompletionFallback);const F=this;this._tabCompletionFallback=setTimeout(()=>{if(F._tabCompletionFallback=null,!F._tabCompletionSessionId||F._tabCompletionSessionId!==F.activeSessionId)return;const x=F._localEchoOverlay;!x||x.pendingText||F.terminal.write("",()=>{if(!F._tabCompletionSessionId)return;x.resetBufferDetection();const H=x.detectBufferText();H&&H!==F._tabCompletionBaseText&&(F._tabCompletionSessionId=null,F._tabCompletionRetries=0,F._tabCompletionBaseText=null,x.rerender())})},300);return}const w=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),w&&(this._pendingInput+=w),this._pendingInput+=r,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),u();return}if(r.length===1&&r.charCodeAt(0)>=32){this._localEchoOverlay?.addChar(r),m&&this._localEchoOverlay&&this._transferMobileImeCommitToLocalEcho();return}}if(this._predictHookOnData(r),this._pendingInput+=r,r.charCodeAt(0)<32||r.length>1){this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),u();return}const E=performance.now();E-this._lastKeystrokeTime>50?(this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),this._lastKeystrokeTime=E,u()):(this._lastKeystrokeTime=E,this._inputFlushTimeout||(this._inputFlushTimeout=setTimeout(u,0)))}};try{this._keyCode229Recovery=window.CodemanKeyCode229Recovery?.create?.({textarea:this.terminal.textarea,emitRecovered:r=>T(r),getCompositionHelper:()=>this.terminal?._core?._compositionHelper,isScreenReaderMode:()=>this.terminal?.options?.screenReaderMode===!0})}catch{this._keyCode229Recovery=null}this.terminal.onData(r=>{try{const m=window.CodemanTerminalInput;!m?.shouldSuppressTerminalQueryResponse(r)&&!m?.isTerminalFocusOrMouseReport(r)&&this._keyCode229Recovery?.notifyCanonicalData?.()}catch{}T(r)})},_resolveLinkedFilePath(e,t){if(typeof resolveLinkedFilePath!="function")return e;const i=this.sessions?.get?.(t),s=typeof relativeResolutionBase=="function"?relativeResolutionBase(i):i?.workingDir;return resolveLinkedFilePath(e,s)},registerFilePathLinkProvider(e={}){const t=this,i=e.terminal||this.terminal,s=e.getSessionId||(()=>this.activeSessionId),n=e.setHovered||(c=>{this._linkHovered=c}),o=i===this.terminal;let l=-1;const a={provideLinks(c,h){c!==l&&(l=c,console.debug("[LinkProvider] Checking line:",c));const f=i.buffer.active;if(!f.getLine(c-1)){h(void 0);return}const p=window.CodemanTerminalLines?.terminalLinkLine(f,c-1,i.cols,12);if(!p){h(void 0);return}const u=p.text,T=g=>{const R=p.offsetToCell(g);return{x:R.col+1,y:R.row+1}},r=(window.CodemanTerminalLines?.terminalCellWrappedPaths?.(f,c-1,4)??[]).filter(g=>!/(^|\/)\.\.(\/|$)/.test(g.path));if(!u||!u.includes("/")&&!u.includes(".")&&r.length===0){h(void 0);return}const m=[],_=[],I=(g,R)=>_.some(M=>g<M.end&&M.start<g+R),E=({url:g,startIndex:R})=>{const M=T(R);if(m.some(B=>B.range.start.x===M.x&&B.range.start.y===M.y))return;_.push({start:R,end:R+g.length});const v=R+g.length,y=[];let P=R;for(let B=R+1;B<v;B++)T(B).y!==T(B-1).y&&(y.push([P,B]),P=B);y.push([P,v]);for(let B=0;B<y.length;B++){const[Y,G]=y[B];m.push({text:g,range:{start:T(Y),end:y.length===1?T(G):T(G-1)},decorations:{pointerCursor:!0,underline:!0},activate(){t._openTerminalUrl(g)},hover(){n(!0)},leave(){n(!1)}})}},w=/\b(tail|cat|head|less|grep|watch|vim|nano)\s+(?:[^\s\/]+\s+){0,4}(\/[^\s"'<>|;&\n\x00-\x1f]+)/g,A=/Bash\([^)]*?(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\)\n\x00-\x1f]+)/g,k=(g,R=!1,M=null)=>{const v=M||s();if(!v)return;const y=t._resolveLinkedFilePath(g,v),P=!R&&p.pathAlternatives?.find(B=>B.path===g);if(P&&!M)return(async()=>{if((await t._registerExternalPreview(y,v)).status!==404)return k(y,!1,v);const Y=t._resolveLinkedFilePath(P.spacedPath,v),G=await t._registerExternalPreview(Y,v);if(G.status===404)return k(y,!1,v);if(!G.attachmentId){t.showToast(G.error||"Cannot open this file","error");return}return k(Y,!1,v)})();if(R){t.openFolderGrid(y,v);return}if(previewsInFileViewer(y)||rendersAsPage(y)||t._isExternalPreviewPath(y,v)){t.openFilePreview(y,v);return}t.openLogViewerWindow(y,v)},F=(g,R,M=!1)=>{const v=u.indexOf(g,R);if(v===-1)return;const y=T(v),P=T(v+g.length);m.some(B=>B.range.start.x===y.x&&B.range.start.y===y.y)||I(v,g.length)||(_.push({start:v,end:v+g.length}),m.push({text:g,range:{start:y,end:P},decorations:{pointerCursor:!0,underline:!0},activate(B,Y){return k(Y,M)},hover(){n(!0)},leave(){n(!1)}}))};let x;for(const g of window.CodemanTerminalLines?.findTerminalUrls?.(u)??[])E(g);for(w.lastIndex=0;(x=w.exec(u))!==null;)F(x[2],x.index);for(const g of findFilePathLinks(u))F(g.path,g.index,!!g.folder);for(A.lastIndex=0;(x=A.exec(u))!==null;)F(x[1],x.index);const H=r.filter(g=>!m.some(R=>R.text===g.path&&R.range.start.y===g.segments[0].row+1&&R.range.start.x===g.segments[0].startCol+1));if(H.length>0){const g=H.flatMap(M=>M.segments),R=M=>g.some(v=>{const y=v.row+1;if(y<M.range.start.y||y>M.range.end.y)return!1;const P=y===M.range.start.y?M.range.start.x:1,B=y===M.range.end.y?M.range.end.x:Number.MAX_SAFE_INTEGER;return P<=v.endCol&&B>=v.startCol+1});for(let M=m.length-1;M>=0;M--)R(m[M])&&m.splice(M,1);for(const M of H)for(const v of M.segments)m.push({text:M.path,range:{start:{x:v.startCol+1,y:v.row+1},end:{x:v.endCol,y:v.row+1}},decorations:{pointerCursor:!0,underline:!0},activate(){k(M.path)},hover(){n(!0)},leave(){n(!1)}})}m.length>0&&console.debug("[LinkProvider] Found links:",m.map(g=>g.text)),h(m.length>0?m:void 0)}};return o&&(this._terminalLinkProvider=a),i.registerLinkProvider(a),console.log("[LinkProvider] File path link provider registered"),a},_terminalOsc8LinkHandler(){return{activate:(e,t)=>{/^https?:\/\/[^\s\x00-\x1f]+$/i.test(t)&&window.confirm(`Open this link?
2
2
 
3
- ${t}`)&&this._openTerminalUrl(t)}}},_openTerminalUrl(e){this.openLinkThroughWebTabIfLoopback?.(e)||window.open(e,"_blank","noopener,noreferrer")},_terminalLinkAtPoint(e,t){const i=this._terminalLinkProvider,s=this.terminal?.buffer?.active;if(!i||!s)return null;const n=this._clientPointToCell(e,t);if(!n)return null;const o=(s.viewportY||0)+n.row;let l=null;try{i.provideLinks(o,h=>{l=h||[]})}catch{return null}if(!l||l.length===0)return null;const a=Math.max(1,this.terminal.cols||1),c=o*a+n.col;return l.find(h=>{const f=h?.range?.start,d=h?.range?.end;return!f||!d?!1:f.y*a+f.x<=c&&c<=d.y*a+d.x})||null},_tapIsOnCaretLine(e,t){const i=this.terminal?.buffer?.active;if(!i?.getLine)return!1;const s=this._clientPointToCell(e,t);if(!s)return!1;const n=i.baseY+(i.cursorY||0),o=i.viewportY+s.row-1;let l=n;for(;l>0&&i.getLine(l)?.isWrapped;)l--;let a=n;for(;a+1<i.length&&i.getLine(a+1)?.isWrapped;)a++;return o>=l&&o<=a},_activateTerminalLinkAtPoint(e,t){const i=this._terminalLinkAtPoint(e,t);if(!i||typeof i.activate!="function")return!1;try{i.activate(null,i.text)}catch(s){return console.warn("[LinkProvider] tap activation failed:",s),!1}return!0},_installTouchSelectionFocusGuard(){const e=this.terminal?.textarea;!e||e._codemanSelectionFocusGuard||(e._codemanSelectionFocusGuard=!0,e.addEventListener("focus",()=>{this._touchSelectionFocusGuarded()&&this._blurMobileTerminalInput()}))},_touchSelectionFocusGuarded(){return this._touchSelecting?!0:performance.now()<(this._touchSelectionFocusGuardUntil||0)},_armTouchSelectionFocusGuard(){this._touchSelectionFocusGuardUntil=performance.now()+(window.CodemanTerminalInput?.TOUCH_SELECT_FOCUS_GUARD_MS||800)},_touchSelectionCellAt(e,t){const i=this._clientPointToCell(e,t),s=this.terminal?.buffer?.active;return!i||!s?null:{col:i.col-1,row:(s.viewportY||0)+i.row-1}},_touchSelectionLogicalLine(e){const t=this.terminal?.buffer?.active,i=Math.max(1,this.terminal?.cols||1);return!t||typeof window.CodemanTerminalLines?.terminalLogicalLine!="function"?null:window.CodemanTerminalLines.terminalLogicalLine(t,e,i)},_touchSelectionWordAt(e){const t=Math.max(1,this.terminal?.cols||1),i=this._touchSelectionLogicalLine(e.row);if(!i)return null;const s=i.cellToOffset(e.row,e.col);if(s<0)return null;const n=i.text[s];if(!n||!n.trim())return null;let o=s;for(;o>0&&i.text[o-1]&&i.text[o-1].trim();)o--;let l=s;for(;l+1<i.text.length&&i.text[l+1]&&i.text[l+1].trim();)l++;const a=i.offsetToCell(o),c=i.offsetToCell(l),h=a.row*t+a.col,f=c.row*t+c.col-h+1;return f>0?{index:h,length:f}:null},_applyTouchSelection(e,t){const i=Math.max(1,this.terminal?.cols||1);t<=0||this.terminal?.select?.(e%i,Math.floor(e/i),t)},_beginTouchSelection(e,t){this._blurMobileTerminalInput(),this._suppressTrustedTapMouseEvents(),this._armTouchSelectionFocusGuard(),this._touchSelecting=!0;const i=this._touchSelectionCellAt(e,t);if(!i)return!1;const s=this._touchSelectionWordAt(i);if(!s)return!1;this._touchSelectionAnchor=s,this._touchSelectionActive=!0,this._applyTouchSelection(s.index,s.length);try{navigator.vibrate?.(15)}catch{}return this._showTouchSelectionBar(),!0},_extendTouchSelection(e,t){const i=this._touchSelectionAnchor,s=this._touchSelectionCellAt(e,t);if(!i||!s)return;const n=Math.max(1,this.terminal?.cols||1),o=s.row*n+s.col,l=Math.min(i.index,o),a=Math.max(i.index+i.length,o+1);this._applyTouchSelection(l,a-l),this._armTouchSelectionFocusGuard(),this._positionTouchSelectionBar()},_endTouchSelectionGesture(){this._touchSelecting=!1,this._suppressTrustedTapMouseEvents(),this._armTouchSelectionFocusGuard(),this._positionTouchSelectionBar(),this._flushAutoCopySelection()},_selectTouchSelectionLine(){const e=this._touchSelectionAnchor,t=Math.max(1,this.terminal?.cols||1);if(!e)return;const i=this._touchSelectionLogicalLine(Math.floor(e.index/t));if(!i)return;const n=(this.terminal?.buffer?.active?.getLine(i.endRow)?.translateToString(!0)||"").length,o=i.startRow*t,l=i.endRow*t+Math.max(0,n-1)-o+1;l<=0||(this._touchSelectionAnchor={index:o,length:l},this._applyTouchSelection(o,l),this._positionTouchSelectionBar(),this._flushAutoCopySelection())},async _copyTouchSelection(){const e=await this.copyTerminalSelection();return this._clearTouchSelection(),typeof MobileDetection<"u"&&MobileDetection.isTouchDevice?.()&&this._blurMobileTerminalInput(),e},_clearTouchSelection(){this._touchSelecting=!1,this._touchSelectionActive=!1,this._touchSelectionAnchor=null,this.terminal?.clearSelection?.(),this._hideTouchSelectionBar()},_ensureTouchSelectionBar(){if(this._touchSelectionBar?.isConnected)return this._touchSelectionBar;const e=document.getElementById("terminalContainer");if(!e)return null;const t=document.createElement("div");return t.className="term-select-bar",t.setAttribute("role","toolbar"),t.innerHTML='<button type="button" class="term-select-btn" data-act="copy">Copy</button><button type="button" class="term-select-btn" data-act="line">Line</button><button type="button" class="term-select-btn term-select-btn--close" data-act="close" aria-label="Clear selection">\u2715</button>',t.addEventListener("click",i=>{const s=i.target?.closest?.("[data-act]")?.dataset?.act;s&&(i.preventDefault(),i.stopPropagation(),s==="copy"?this._copyTouchSelection():s==="line"?this._selectTouchSelectionLine():this._clearTouchSelection())}),e.appendChild(t),this._touchSelectionBar=t,t},_showTouchSelectionBar(){const e=this._ensureTouchSelectionBar();e&&(e.classList.add("visible"),this._positionTouchSelectionBar())},_hideTouchSelectionBar(){this._touchSelectionBar?.classList.remove("visible")},_positionTouchSelectionBar(){const e=this._touchSelectionBar,t=document.getElementById("terminalContainer"),i=this.terminal?.element?.querySelector(".xterm-screen"),s=this.terminal?._core?._renderService?.dimensions?.css?.cell,n=this.terminal?.getSelectionPosition?.(),o=this.terminal?.buffer?.active;if(!e||!t||!i||!s?.height||!n||!o)return;const l=i.getBoundingClientRect(),a=t.getBoundingClientRect(),c=r=>r-(o.viewportY||0),h=l.top-a.top+c(n.start.y)*s.height,f=l.top-a.top+(c(n.end.y)+1)*s.height,d=e.offsetHeight||36,y=6;let p=h-d-y;p<0&&(p=f+y),p=Math.max(0,Math.min(p,a.height-d));const u=l.left-a.left+n.start.x*(s.width||8),T=e.offsetWidth||150;e.style.top=`${Math.round(p)}px`,e.style.left=`${Math.round(Math.max(0,Math.min(u,a.width-T)))}px`},showWelcome(){if(this.shouldUseMobileOverview?.()){const t=document.getElementById("welcomeOverlay");t&&t.classList.remove("visible"),this.hideHomeSessions?.(),this.showMobileOverview(),this._updateCjkInputState?.();return}this.hideMobileOverview?.();const e=document.getElementById("welcomeOverlay");e&&(e.classList.add("visible"),this.loadTunnelStatus(),this.applyWelcomeCliVisibility(),this.loadHistorySessions(),this.initSearchPanel(),this.showHomeSessions?.()),this._updateCjkInputState?.()},hideWelcome(){this.hideMobileOverview?.(),this.hideHomeSessions?.();const e=document.getElementById("welcomeOverlay");e&&e.classList.remove("visible");const t=document.getElementById("welcomeQr");t&&(clearTimeout(this._welcomeQrShrinkTimer),t.classList.remove("expanded")),this._updateCjkInputState?.()},async _fetchHistorySessions(){const i=(await(await fetch("/api/history/sessions")).json()).data?.sessions||[];if(i.length===0)return[];const s=new Map;for(const o of i){const l=o.projectKey||o.workingDir;s.has(l)||s.set(l,[]),s.get(l).push(o)}const n=[];for(const[,o]of s)n.push(...o.slice(0,3));return n.sort((o,l)=>new Date(l.lastModified)-new Date(o.lastModified)),n},async _fetchUnifiedSessions(e=60){const t=await fetch("/api/sessions/unified?limit="+e),i=await t.json().catch(()=>null);if(!t.ok||!i||i.success===!1||!i.data)throw new Error(i?.error||`unified sessions request failed (HTTP ${t.status})`);return i.data.sessions||[]},_worktreeLabel(e){const t=e&&e.worktreeName;if(!t)return"";let i=e.gitBranch||"";return(i===t||i===`worktree-${t}`)&&(i=""),i.length>24&&(i=i.slice(0,23)+"\u2026"),"\u2442 "+[t,i].filter(Boolean).join(" \xB7 ")},_resolveCaseLabel(e,t){if(!e)return"";let i=null;for(const s of t||[])if(!(!s||!s.path)){if(e===s.path)return`#${s.name}`;if(e.startsWith(s.path+"/")){const n=s.path.length;(!i||n>i.len)&&(i={name:s.name,suffix:e.slice(n),len:n})}}return i?`#${i.name}${i.suffix}`:e.split("/").pop()||e},_shortenHomePath(e){return(e||"").replace(/^\/(?:home|Users)\/[^/]+(?=\/|$)/,"~")},_buildHistoryItem(e,t,i){const s=i?.showViewAll!==!1,n=typeof e.sizeBytes=="number",o=n?e.sizeBytes<1024?`${e.sizeBytes}B`:e.sizeBytes<1048576?`${(e.sizeBytes/1024).toFixed(0)}K`:`${(e.sizeBytes/1048576).toFixed(1)}M`:"",l=typeof e.lastActivityAt=="number"?e.lastActivityAt:e.lastModified?Date.parse(e.lastModified):NaN;let a="";if(!Number.isNaN(l)){const b=new Date(l);a=b.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+b.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1})}const c=this._shortenHomePath(e.workingDir),h=this._resolveCaseLabel(e.workingDir,t),f=Array.isArray(e.sources)&&e.sources.includes("live"),d=e.pinned===!0,y=document.createElement("div");y.className="history-item"+(d?" is-pinned":""),y.title=e.workingDir||"";const p=document.createElement("div");p.className="history-item-main",p.addEventListener("click",i?.onActivate||(()=>{f&&this.sessions.has(e.sessionId)?this.selectSession(e.sessionId):this.resumeHistorySession(e.claudeSessionId||e.sessionId,e.workingDir||"",e.name,e.mode,e.resumeId)}));const u=document.createElement("div");u.className="history-item-text";const T=document.createElement("span");if(T.className="history-item-title",d){const b=document.createElement("span");b.className="history-item-pin",b.textContent="\u{1F4CC}",b.setAttribute("aria-label","Pinned"),b.title="Pinned",T.appendChild(b)}T.appendChild(document.createTextNode(this._historyRowLabel(e,c)));const r=document.createElement("div");if(r.className="history-item-badges",e.mode){const b=document.createElement("span");b.className="history-item-badge history-item-badge-mode",b.textContent=e.mode,r.appendChild(b)}const m=this._worktreeLabel(e);if(m){const b=document.createElement("span");b.className="history-item-badge history-item-badge-worktree",b.textContent=m,b.title=e.worktreeRepo?`worktree of ${e.worktreeRepo}`:m,r.appendChild(b)}if(f){const b=document.createElement("span");b.className="history-item-badge history-item-badge-live",b.textContent="LIVE",r.appendChild(b)}const _=document.createElement("span");_.className="history-item-subtitle",h.startsWith("#")&&_.classList.add("is-case"),_.textContent=h,u.append(T),r.childElementCount>0&&u.append(r),u.append(_);const I=document.createElement("span");I.className="history-item-meta",I.textContent=a;const E=document.createElement("button");E.className="history-item-expand",E.type="button",E.setAttribute("aria-haspopup","menu"),E.setAttribute("aria-label","Session actions"),E.setAttribute("aria-expanded","false"),E.textContent="\u22EF",p.append(u,I,E);const w=document.createElement("div");w.className="history-item-detail",w.hidden=!0;const k=document.createElement("div");k.className="history-detail-row";const R=document.createElement("span");R.className="history-detail-label",R.textContent="Prompt";const O=document.createElement("span");O.className="history-detail-value history-detail-prompt",O.textContent=e.firstPrompt||"(no prompt captured)",k.append(R,O);let A=null;if(e.lastPrompt&&e.lastPrompt!==e.firstPrompt){A=document.createElement("div"),A.className="history-detail-row";const b=document.createElement("span");b.className="history-detail-label",b.textContent="Last prompt";const B=document.createElement("span");B.className="history-detail-value history-detail-prompt",B.textContent=e.lastPrompt,A.append(b,B)}const H=document.createElement("div");H.className="history-detail-row";const g=document.createElement("span");g.className="history-detail-label",g.textContent="Path";const x=document.createElement("span");x.className="history-detail-value history-detail-path",x.textContent=c,H.append(g,x);const v=document.createElement("div");v.className="history-detail-row history-detail-meta";const L=[];if(a&&L.push(a),n&&L.push(o),L.push(e.sessionId.slice(0,8)),v.textContent=L.join(" \xB7 "),w.append(k),A&&w.append(A),w.append(H,v),s&&e.projectKey){const b=document.createElement("div");b.className="history-detail-row history-detail-actions";const B=document.createElement("button");B.type="button",B.className="history-view-all-btn",B.textContent="View all in this folder",B.addEventListener("click",D=>{D.stopPropagation(),this.openFolderHistoryModal(e.projectKey,e.workingDir,t)}),b.appendChild(B),w.appendChild(b)}return E.addEventListener("click",b=>{b.stopPropagation(),b.preventDefault(),this._openSessionRowMenu(b.currentTarget,e,t,y,w)}),y.append(p,w),y},_openSessionRowMenu(e,t,i,s,n){if(this._openRowMenuClose)try{this._openRowMenuClose()}catch{}const o=Array.isArray(t.sources)&&t.sources.includes("live")&&this.sessions.has(t.sessionId),l=document.createElement("div");l.className="session-row-menu",l.setAttribute("role","menu");let a=null,c=null,h=null;const f=()=>{document.removeEventListener("mousedown",a,!0),document.removeEventListener("keydown",c,!0),window.removeEventListener("scroll",h,!0),window.removeEventListener("resize",h,!0);try{l.remove()}catch{}this._openRowMenuEl===l&&(this._openRowMenuEl=null,this._openRowMenuClose=null)},d=(_,I,E)=>{const w=document.createElement("button");w.type="button",w.className="session-row-menu-item",w.setAttribute("role","menuitem");const k=document.createElement("span");if(k.className="session-row-menu-label",k.textContent=_,w.appendChild(k),E&&E.sublabel){const R=document.createElement("span");R.className="session-row-menu-sublabel",R.textContent=E.sublabel,w.appendChild(R)}w.addEventListener("click",async R=>{R.stopPropagation(),R.preventDefault(),await I()}),l.appendChild(w)};d(o?"Switch to session":"Resume session",()=>{o?this.selectSession(t.sessionId):this.resumeHistorySession(t.claudeSessionId||t.sessionId,t.workingDir||"",t.name,t.mode,t.resumeId),this.closeSessionManager?.(),f()});const y=t.pinned===!0;d(y?"Unpin session":"Pin to top",async()=>{await this._setSessionPinned(t.sessionId,!y)?(t.pinned=!y,this.showToast(y?"Unpinned":"Pinned to top","success")):this.showToast("Pin failed","error"),f()}),o&&d("Open folder",()=>{this.selectSession(t.sessionId),this.loadFileBrowser?.(t.sessionId),this.closeSessionManager?.(),f()}),t.workingDir&&d("Copy path",async()=>{const _=await this._copyText(t.workingDir);this.showToast(_?"Path copied":"Copy failed",_?"success":"error"),f()}),d("Show details",()=>{const _=s.classList.toggle("expanded");n.hidden=!_,e.setAttribute("aria-expanded",_?"true":"false"),f()}),document.body.appendChild(l);const p=e.getBoundingClientRect(),u=l.getBoundingClientRect(),T=4;let r=p.bottom+T;r+u.height>window.innerHeight&&p.top-T-u.height>=0&&(r=p.top-T-u.height);let m=p.right-u.width;m<T&&(m=T),m+u.width>window.innerWidth-T&&(m=Math.max(T,window.innerWidth-T-u.width)),l.style.top=`${Math.max(T,r)}px`,l.style.left=`${m}px`,a=_=>{l.contains(_.target)||e.contains(_.target)||f()},c=_=>{_.key==="Escape"&&(_.stopPropagation(),f())},h=()=>f(),document.addEventListener("mousedown",a,!0),document.addEventListener("keydown",c,!0),window.addEventListener("scroll",h,!0),window.addEventListener("resize",h,!0),this._openRowMenuEl=l,this._openRowMenuClose=f},async _setSessionPinned(e,t){try{const i=await fetch(`/api/sessions/${encodeURIComponent(e)}/pin`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({pinned:t})});return i.ok?(await i.json())?.success===!0:!1}catch(i){return console.error("[_setSessionPinned]",i),!1}},_HISTORY_INITIAL_COUNT:10,_HISTORY_FETCH_LIMIT:200,_HISTORY_SORT_KEY:"codeman:historySort",async loadHistorySessions(){const e=document.getElementById("historySessions"),t=document.getElementById("historyList");if(!(!e||!t))try{const i=Array.isArray(this.cases)&&this.cases.length>0?Promise.resolve(this.cases):fetch("/api/cases").then(o=>o.ok?o.json():null).then(o=>o?.data||[]).catch(()=>[]),[s,n]=await Promise.all([this._fetchUnifiedSessions(this._HISTORY_FETCH_LIMIT),i]);if(s.length===0){e.style.display="none";return}this._historyAll=s,this._historyCases=n,this._wireHistoryControls(),this._renderHistoryList(),e.style.display=""}catch(i){console.error("[loadHistorySessions]",i),e.style.display="none"}},_wireHistoryControls(){if(this._historyControlsWired)return;const e=document.getElementById("historyFilter"),t=document.getElementById("historySort");if(!(!e&&!t)){if(this._historyControlsWired=!0,t)try{const i=localStorage.getItem(this._HISTORY_SORT_KEY);i&&Array.from(t.options).some(s=>s.value===i)&&(t.value=i)}catch{}e&&(e.addEventListener("input",()=>this._renderHistoryList()),e.addEventListener("keydown",i=>{i.key==="Escape"&&e.value&&(i.stopPropagation(),e.value="",this._renderHistoryList())})),t&&t.addEventListener("change",()=>{try{localStorage.setItem(this._HISTORY_SORT_KEY,t.value)}catch{}this._renderHistoryList()})}},_historyRowMatches(e,t,i){return[e.name,e.workingDir,this._resolveCaseLabel(e.workingDir,i),e.firstPrompt,e.lastPrompt,e.sessionId].some(n=>typeof n=="string"&&n.toLowerCase().includes(t))},_historyRowLabel(e,t){return e.name||e.firstPrompt||t||""},_sortHistoryRows(e,t){const n=t==="name"?a=>this._historyRowLabel(a,this._shortenHomePath(a.workingDir)).toLowerCase():a=>((a.workingDir||"").split("/").pop()||"").toLowerCase(),o=t==="recent"?e.slice():e.slice().sort((a,c)=>n(a).localeCompare(n(c),void 0,{sensitivity:"base",numeric:!0})),l=o.filter(a=>a.pinned);return l.length===0?o:l.concat(o.filter(a=>!a.pinned))},_renderHistoryList(){const e=document.getElementById("historyList");if(!e)return;const t=this._historyAll||[],i=this._historyCases||[],s=document.getElementById("historyCount"),n=(document.getElementById("historyFilter")?.value||"").trim().toLowerCase(),o=document.getElementById("historySort")?.value||"recent",l=n?t.filter(d=>this._historyRowMatches(d,n,i)):t,a=this._sortHistoryRows(l,o),c=!!this._historyExpanded||n.length>0,h=c?a:a.slice(0,this._HISTORY_INITIAL_COUNT);if(e.replaceChildren(),e.classList.toggle("expanded",c),a.length===0){const d=document.createElement("div");d.className="history-empty",d.textContent=`No conversations match "${n}"`,e.appendChild(d)}for(const d of h)e.appendChild(this._buildHistoryItem(d,i));const f=a.length-h.length;if(f>0){const d=document.createElement("button");d.className="history-show-more",d.textContent=`Show ${f} more`,d.addEventListener("click",()=>{this._historyExpanded=!0,this._renderHistoryList()}),e.appendChild(d)}else if(c&&!n&&a.length>this._HISTORY_INITIAL_COUNT){const d=document.createElement("button");d.className="history-show-more",d.textContent="Show less",d.addEventListener("click",()=>{this._historyExpanded=!1,this._renderHistoryList(),e.scrollTop=0}),e.appendChild(d)}s&&(s.textContent=n?`${a.length} of ${t.length}`:a.length>h.length?`${h.length} of ${a.length}`:String(a.length))},_FOLDER_HISTORY_PAGE_SIZE:20,openFolderHistoryModal(e,t,i){this._closeFolderHistoryModal();const s=document.createElement("div");s.className="modal active folder-history-modal",s.id="folderHistoryModal";const n=document.createElement("div");n.className="modal-backdrop",n.addEventListener("click",()=>this._closeFolderHistoryModal());const o=document.createElement("div");o.className="modal-content modal-lg";const l=document.createElement("div");l.className="modal-header";const a=document.createElement("h3");a.textContent="Folder History";const c=document.createElement("div");c.className="folder-history-subtitle",c.textContent=this._shortenHomePath(t);const h=document.createElement("button");h.className="modal-close",h.setAttribute("aria-label","Close"),h.innerHTML="&times;",h.addEventListener("click",()=>this._closeFolderHistoryModal()),l.append(a,h);const f=document.createElement("div");f.className="modal-body";const d=document.createElement("div");d.className="folder-history-list",d.setAttribute("data-loading","true"),d.textContent="Loading...",f.append(c,d),o.append(l,f),s.append(n,o),document.body.appendChild(s),this._folderHistoryState={projectKey:e,workingDir:t,cases:i||[],offset:0,total:null,list:d},this._folderHistoryEscHandler=y=>{y.key==="Escape"&&this._closeFolderHistoryModal()},document.addEventListener("keydown",this._folderHistoryEscHandler),this._loadFolderHistoryPage()},async _loadFolderHistoryPage(){const e=this._folderHistoryState;if(!e)return;const{projectKey:t,cases:i,list:s}=e,n=this._FOLDER_HISTORY_PAGE_SIZE,o=e.offset,l=s.querySelector(".folder-history-more");l&&l.remove(),o===0&&(s.replaceChildren(),s.removeAttribute("data-loading"));try{const a=`/api/history/sessions?projectKey=${encodeURIComponent(t)}&offset=${o}&limit=${n}`,h=await(await fetch(a)).json(),f=h.data?.sessions||[];if(e.total=typeof h.data?.total=="number"?h.data.total:f.length+o,o===0&&f.length===0){const d=document.createElement("div");d.className="folder-history-empty",d.textContent="No conversations found in this folder.",s.appendChild(d);return}for(const d of f)s.appendChild(this._buildHistoryItem(d,i,{showViewAll:!1}));if(e.offset=o+f.length,e.offset<e.total){const d=e.total-e.offset,y=document.createElement("button");y.className="history-show-more folder-history-more",y.textContent=`Show ${Math.min(n,d)} more (${d} remaining)`,y.addEventListener("click",()=>this._loadFolderHistoryPage()),s.appendChild(y)}}catch(a){console.error("[loadFolderHistoryPage]",a);const c=document.createElement("div");c.className="folder-history-empty",c.textContent="Failed to load folder history.",s.appendChild(c)}},_closeFolderHistoryModal(){const e=document.getElementById("folderHistoryModal");e&&e.remove(),this._folderHistoryEscHandler&&(document.removeEventListener("keydown",this._folderHistoryEscHandler),this._folderHistoryEscHandler=null),this._folderHistoryState=null},_resolveResumeName(e,t){if(typeof e=="string"&&e.trim())return e;const i=(t||"").split("/").pop()||"session";let s=1;for(const[,n]of this.sessions){const o=n.name&&n.name.match(/^w(\d+)-/);if(o){const l=parseInt(o[1]);l>=s&&(s=l+1)}}return`w${s}-${i}`},async resumeHistorySession(e,t,i,s,n){document.getElementById("runModeMenu")?.classList.remove("active"),this._closeFolderHistoryModal();try{this.terminal.clear(),this.terminal.writeln(`\x1B[1;32m Resuming conversation ${e.slice(0,8)}...\x1B[0m`);const o=this._resolveResumeName(i,t),a=(this.cases||[]).find(E=>E.path===t)?.name||t.split("/").pop()||"",c=this.loadAppSettingsFromStorage(),h=this.buildEnvOverrides(this.getCaseSettings(a),c),f=this.getEffortSetting(c),d=this.getAdvisorSetting(c),y=s||"claude",p={opencode:"openCodeConfig",pi:"piConfig",grok:"grokConfig",copilot:"copilotConfig",omp:"ompConfig"}[y],u=y==="codex"?n:void 0,T=p?{[p]:{continueSession:!0}}:y==="deepseek"?{deepSeekConfig:{resumeSession:!0}}:u?{codexConfig:{resumeSessionId:u}}:{},r=!!p||y==="deepseek"||!!u,_=await(await fetch("/api/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({workingDir:t,name:o,mode:y,...y==="claude"?{resumeSessionId:e}:{},...T,...Object.keys(h).length>0?{envOverrides:h}:{},...f?{effort:f}:{},...d&&y==="claude"?{advisorModel:d}:{}})})).json();if(!_.success)throw new Error(_.error);const I=_.data.session.id;await fetch(`/api/sessions/${I}/interactive`,{method:"POST"}),y!=="claude"&&r&&e!==I&&fetch(`/api/sessions/${e}?killMux=true`,{method:"DELETE"}).catch(()=>{}),this.terminal.writeln(`\x1B[90m Session ${o} ready\x1B[0m`),await this.selectSession(I),this.terminal.focus()}catch(o){this.terminal.writeln(`\x1B[1;31m Error: ${o.message}\x1B[0m`)}},isTerminalAtBottom(){if(!this.terminal)return!0;const e=this.terminal.buffer.active;return e.viewportY>=e.baseY-2},_syncStickyScrollBaseline(){this._wasAtBottomBeforeWrite=this.isTerminalAtBottom()},_noteTerminalUserScroll(e){e<0?this._lastUserScrollUpAt=performance.now():this.isTerminalAtBottom()&&(this._lastUserScrollUpAt=null)},_maybeLoadMoreHistoryOnScroll(e){if(e>0){this.isTerminalAtBottom()&&this._setHistoryNoticeRevealed?.(null);return}if(e===0||this.terminal?.buffer?.active?.viewportY!==0||this._fullHistoryRepullInFlight||this._isLoadingBuffer)return;const t=this.activeSessionId;Promise.resolve(this._maybeRefetchFullHistory?.()).catch(()=>{}).then(()=>{t&&this.activeSessionId===t&&this._setHistoryNoticeRevealed?.(t)})},_estimateReplayRows(e,t){if(typeof e!="string"||!e)return 0;const i=t>0?t:80,s=e.replace(window.CodemanTerminalInput.REPLAY_ESCAPE_RE,"");let n=0;for(const o of s.split(`
4
- `)){const l=o.endsWith("\r")?o.length-1:o.length;n+=l>i?Math.ceil(l/i):1}return n},_replayWouldShrinkBuffer(e,t){const i=this.terminal,s=i?.buffer?.active?.length||0;if(!s)return!1;const n=i?.rows||24;return(t??this._estimateReplayRows(e,i?.cols))+n<s},_smoothScrollBy(e){if(!e||(this._smoothScrollPending=(this._smoothScrollPending||0)+e,this._smoothScrollSession=this.activeSessionId,this._smoothScrollFrame))return;const t=()=>{this._smoothScrollFrame=null;const i=this._smoothScrollPending||0;if(!i)return;if(this.activeSessionId!==this._smoothScrollSession){this._smoothScrollPending=0;return}if(Math.abs(i)<1)return;const s=i*.22,n=i>0?Math.max(1,Math.floor(s)):Math.min(-1,Math.ceil(s));this._smoothScrollPending=i-n,this.terminal.scrollLines(n),this._maybeLoadMoreHistoryOnScroll(n),Math.abs(this._smoothScrollPending)>=1&&(this._smoothScrollFrame=requestAnimationFrame(t))};this._smoothScrollFrame=requestAnimationFrame(t)},_forwardScrollToApp(e,t,i){this._terminalViewportAtBottom()||this.terminal.scrollToBottom(),this._sendSyntheticSgrWheel(e,t,i)},_hasRecentUserScrollUp(){return typeof this._lastUserScrollUpAt!="number"?!1:performance.now()-this._lastUserScrollUpAt<window.CodemanTerminalInput.USER_SCROLL_STICKY_SUPPRESS_MS},_startRenderLivenessWatchdog(){this._stopRenderLivenessWatchdog(),this._lastRenderAt=Date.now(),this._lastTerminalWriteAt=0,this._renderLivenessTimer=setInterval(()=>{try{if(typeof CodemanRenderLiveness>"u"||!CodemanRenderLiveness.shouldKickRenderer({wroteAt:this._lastTerminalWriteAt||0,renderedAt:this._lastRenderAt||0,now:Date.now(),visible:document.visibilityState==="visible"&&!!this.terminal?.element?.isConnected}))return;const t=this._kickRenderer();_crashDiag.log(`RENDER STALL: kick=${t}`),this._lastRenderAt=Date.now()}catch{}},RENDER_LIVENESS_POLL_MS)},_stopRenderLivenessWatchdog(){this._renderLivenessTimer&&(clearInterval(this._renderLivenessTimer),this._renderLivenessTimer=null)},_kickRenderer(){try{const e=this.terminal?._core?._renderService,t=e?._renderDebouncer;if(!t||typeof e.refreshRows!="function")return!1;const i=t._animationFrame;if(i===void 0)return!1;try{cancelAnimationFrame(i)}catch{}return t._animationFrame=void 0,e.refreshRows(0,Math.max(0,(this.terminal.rows||1)-1)),!0}catch{return!1}},batchTerminalWrite(e){if(this._terminalOutputSeq=(this._terminalOutputSeq||0)+1,this._lastTerminalWriteAt=Date.now(),this._isLoadingBuffer){this._loadBufferQueue&&this._loadBufferQueue.push({at:performance.now(),data:e});return}if(this.writeFrameScheduled||(this._wasAtBottomBeforeWrite=this.isTerminalAtBottom()),(this.activeSessionId?this.sessions.get(this.activeSessionId):null)?.flickerFilterEnabled??!1){if(e.includes("\x1B[2J")||e.includes("\x1B[H\x1B[J")||e.includes("\x1B[H")&&e.includes("\x1B[?25l")){this.flickerFilterActive=!0,this.flickerFilterBuffer+=e,this.flickerFilterTimeout&&clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=setTimeout(()=>{this.flickerFilterTimeout=null,this.flushFlickerBuffer()},SYNC_WAIT_TIMEOUT_MS);return}if(this.flickerFilterActive){this.flickerFilterBuffer+=e;return}}this.pendingWrites.push(e),this._pendingWritesOutputSeq=this._terminalOutputSeq,this._scheduleTerminalWriteFlush()},_scheduleTerminalWriteFlush(){this._terminalWriteInFlight||this.writeFrameScheduled||this.pendingWrites.length===0||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.writeFrameScheduled=!1,this.flushPendingWrites()}))},flushFlickerBuffer(){this.flickerFilterBuffer&&(this.pendingWrites.push(this.flickerFilterBuffer),this._pendingWritesOutputSeq=this._terminalOutputSeq,this.flickerFilterBuffer="",this.flickerFilterActive=!1,this._scheduleTerminalWriteFlush())},_flushLocalEchoPending(){const e=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),e&&(this._pendingInput+=e)},_updateLocalEchoState(){if(this._mobileImePreviewSessionId!==this.activeSessionId){this._mobileImePreviewSessionId=this.activeSessionId,this._mobileImeCommitOutputSeq=null;try{this._mobileImePreview?.reset?.()}catch{}}const e=this.loadAppSettingsFromStorage(),t=this.activeSessionId?this.sessions.get(this.activeSessionId):null,i=e.localEchoEnabled??MobileDetection.isTouchDevice(),s=!!(i&&t);this._localEchoEnabled&&!s&&this._localEchoOverlay?.clear(),this._localEchoEnabled=s,this._localEchoOverlay&&t&&(t.mode==="opencode"?this._localEchoOverlay.setPrompt({type:"custom",offset:3,find:o=>{try{const l=o.buffer.active,a=window.CodemanTerminalInput.cursorViewportRow(o);if(a===null)return null;const c=l.getLine(l.viewportY+a);if(!c)return null;const f=c.translateToString(!0).indexOf("\u2503");return f>=0?{row:a,col:f}:null}catch{return null}}}):t.mode==="shell"||t.mode==="codex"?(this._localEchoOverlay.clear(),this._localEchoEnabled=!1):this._localEchoOverlay.setPrompt({type:"custom",offset:0,find:o=>{try{const l=o.buffer.active,a=window.CodemanTerminalInput.cursorViewportRow(o);if(a===null)return null;const c=Math.max(0,l.baseY-l.viewportY);for(let h=a;h>=c;h--){const f=l.getLine(l.viewportY+h);if(!f)continue;const y=f.translateToString(!0).lastIndexOf("\u276F");if(y>=0)return{row:h,col:y+2}}return{row:a,col:Math.max(0,Math.min(o.cols-1,l.cursorX))}}catch{return null}}}));let n="off";t&&i&&(t.mode==="codex"?n="predict":t.mode!=="shell"&&(n="buffer")),this._localEchoPolicy=n,n!=="predict"&&this._predictiveEcho?.clearPredictions()},_predictHookOnData(e){if(!(this._localEchoPolicy!=="predict"||!this._predictiveEcho))try{const t=window.CodemanTerminalInput.classifyPredictInput(e);t==="char"?this._predictiveEcho.predictChar(e):t==="backspace"?this._predictiveEcho.predictBackspace():this._predictiveEcho.clearPredictions()}catch{}},_handleCjkInput(e){if(!this.activeSessionId){_crashDiag.log(`CJK send DROP no-session len=${e.length}`);return}typeof KeyboardAccessoryBar<"u"&&KeyboardAccessoryBar.isCtrlArmed?.()&&(e=KeyboardAccessoryBar.consumeCtrl(e)),this._localEchoPolicy==="predict"&&this._predictiveEcho?.clearPredictions(),_crashDiag.log(`CJK send\u2192${this.activeSessionId.slice(0,8)} len=${e.length}`),this._sendInputAsync(this.activeSessionId,e)},_restoreTerminalViewport(e,t){e!=null&&(t!==void 0&&t!==this.activeSessionId||this._isLoadingBuffer||typeof this.terminal?.scrollToLine=="function"&&this.terminal.buffer?.active?.viewportY!==e&&this.terminal.scrollToLine(e))},flushPendingWrites(){if(this._terminalWriteInFlight||this.pendingWrites.length===0||!this.terminal)return;const e=performance.now(),t=this.pendingWrites.join("");this.pendingWrites=[];const i=t.length;i>16384&&_crashDiag.log(`FLUSH: ${(i/1024).toFixed(0)}KB`);const n=(this.activeSessionId&&this.sessions?this.sessions.get(this.activeSessionId):null)?.mode==="codex"?32768:65536;let o=!1;const l=this.terminal.buffer?.active&&!this.isTerminalAtBottom()?this.terminal.buffer.active.viewportY:null,a=this.activeSessionId,c=t.slice(0,n);i>n&&(this.pendingWrites.push(t.slice(n)),o=!0);const h=o?null:this._pendingWritesOutputSeq??null;this._terminalWriteInFlight=!0,this._terminalWriteInFlightBytes=c.length;try{this.terminal.write(c,()=>{this._terminalWriteInFlight=!1,this._terminalWriteInFlightBytes=0,this._restoreTerminalViewport(l,a),this._scheduleTerminalWriteFlush(),this._noteMobileImeAuthoritativeOutput(h,a)})}catch(y){throw this._terminalWriteInFlight=!1,this._terminalWriteInFlightBytes=0,y}const f=o?n:i,d=performance.now()-e;if((d>100||o)&&console.warn(`[CRASH-DIAG] flushPendingWrites: ${d.toFixed(0)}ms, ${(f/1024).toFixed(0)}KB written${o?", rest deferred":""} (total ${(i/1024).toFixed(0)}KB)`),l===null&&this._wasAtBottomBeforeWrite&&!this._hasRecentUserScrollUp()&&this.terminal.scrollToBottom(),this._localEchoOverlay?.rerender(),this._tabCompletionSessionId&&this._tabCompletionSessionId===this.activeSessionId&&this._localEchoOverlay&&!this._localEchoOverlay.pendingText){const y=this._localEchoOverlay,p=this;this.terminal.write("",()=>{if(!p._tabCompletionSessionId)return;y.resetBufferDetection();const u=y.detectBufferText();u?u===p._tabCompletionBaseText?(y.undoDetection(),p._tabCompletionRetries=(p._tabCompletionRetries||0)+1,p._tabCompletionRetries>60&&(p._tabCompletionSessionId=null,p._tabCompletionRetries=0)):(p._tabCompletionSessionId=null,p._tabCompletionRetries=0,p._tabCompletionBaseText=null,p._tabCompletionFallback&&(clearTimeout(p._tabCompletionFallback),p._tabCompletionFallback=null),y.rerender()):(p._tabCompletionRetries=(p._tabCompletionRetries||0)+1,p._tabCompletionRetries>60&&(p._tabCompletionSessionId=null,p._tabCompletionRetries=0))})}},_safeYield(e){let t=!1;const i=()=>{t||(t=!0,e())};requestAnimationFrame(i),setTimeout(i,50),this._workerYield(i)},_workerYield(e){try{if(this._yieldWorker===void 0){const t="onmessage=()=>setTimeout(()=>postMessage(0),0);",i=new Blob([t],{type:"application/javascript"}),s=URL.createObjectURL(i);this._yieldWorker=new Worker(s),URL.revokeObjectURL(s),this._yieldQueue=[],this._yieldWorker.onmessage=()=>{const n=this._yieldQueue.shift();n&&n()}}if(!this._yieldWorker)return;this._yieldQueue.push(e),this._yieldWorker.postMessage(0)}catch{this._yieldWorker=null}},scrollToLastNonEmptyLine(){if(!this.terminal?.buffer?.active){this.terminal?.scrollToBottom?.();return}const e=this.terminal.buffer.active,t=e.length;let i=-1;for(let s=t-1;s>=0;s--)if(e.getLine(s)?.translateToString(!0).trim()){i=s;break}if(i>=0&&typeof this.terminal.scrollToLine=="function"){let s=Math.max(0,i-this.terminal.rows+2);const n=Math.max(0,i);for(;s<n&&!e.getLine(s)?.translateToString(!0).trim();)s++;this.terminal.scrollToLine(s)}else this.terminal.scrollToBottom()},chunkedTerminalWrite(e,t=TERMINAL_CHUNK_SIZE,i,s){const n=++this._chunkedWriteGen,o=this._beginBufferLoad(i);return new Promise(l=>{const a=(p=this._chunkedWriteGen===n)=>({parsedAt:performance.now(),bufferLength:this.terminal?.buffer?.active?.length??0,completed:p});if(!e||e.length===0){this._finishBufferLoad(o,s),l(a());return}const c=e.replace(DEC_SYNC_STRIP_RE,"").replace(OSC52_STRIP_RE,"");if(c.length<=t){this.terminal.write(c,()=>l(a())),this._finishBufferLoad(o,s);return}let h=0;const f=performance.now();let d=0;const y=()=>{if(this._chunkedWriteGen!==n){l(a(!1));return}const p=c.slice(h,h+t);if(h+=p.length,d++,this.terminal.write(p),h>=c.length){this.terminal.write("",()=>{const u=a(),T=u.parsedAt-f;console.log(`[CRASH-DIAG] chunkedTerminalWrite complete: ${c.length} bytes in ${d} chunks, ${T.toFixed(0)}ms parsed`),l(u)}),this._finishBufferLoad(o,s);return}this._safeYield(y)};this._safeYield(y)})},_beginBufferLoad(e){this._bufferLoadSeq===void 0&&(this._bufferLoadSeq=0);const t=e===void 0?`buffer-${++this._bufferLoadSeq}`:e,i=this._bufferLoadOwner===t&&Array.isArray(this._loadBufferQueue);return this._bufferLoadOwner=t,this._isLoadingBuffer=!0,i||(this._loadBufferQueue=[]),t},_finishBufferLoad(e,t){if(e!==void 0&&this._bufferLoadOwner!==e)return!1;const i=this._loadBufferQueue;if(this._isLoadingBuffer=!1,this._loadBufferQueue=null,this._bufferLoadOwner=null,t?.flushQueued&&i&&i.length){const s=typeof t.since=="number"?t.since:0;for(const n of i)n.at<s||this.batchTerminalWrite(n.data)}return!0},_focusedPane(){let e=this._focusedTile;return(!e||e._destroyed||!e.terminal)&&this._tilesOwnTerminal?.()&&(e=this._tileFor(this.activeSessionId)),e&&!e._destroyed&&e.terminal?{terminal:e.terminal,sessionId:e.sessionId,isPrimary:!1,tile:e}:{terminal:this.terminal,sessionId:this.activeSessionId,isPrimary:!0,tile:null}},_noteFocusedTile(e){this._focusedTile=e||null},_forEachTile(e,{grid:t=!0}={}){if(this._splitPane?.terminal&&e(this._splitPane),!(!t||!this._tileGrid?.open))for(const{tile:i}of this._tileGrid.tiles.values())i.terminal&&e(i)},clearTerminal(){this._focusedPane().terminal?.clear()},insertTerminalText(e){if(!this.activeSessionId||!e)return;const t=this._focusedPane?.();if(t&&!t.isPrimary){this._sendInputAsync(t.sessionId,e),t.terminal?.focus();return}this._localEchoPolicy==="predict"&&this._predictiveEcho?.clearPredictions(),this._localEchoEnabled&&this._localEchoOverlay&&!this._echoPassthroughSessions?.has(this.activeSessionId)?this._localEchoOverlay.appendText(e):this.sendInput(e).catch(()=>{}),this.terminal?.focus()},clearTerminalInput(){if(!this.activeSessionId)return;typeof CjkInput<"u"&&CjkInput.clear();const e=this._focusedPane?.();if(e&&!e.isPrimary){this._sendInputAsync(e.sessionId,""),this.showToast?.("Input cleared","success"),e.terminal?.focus();return}if(this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),this._pendingInput="",this._localEchoPolicy==="predict"&&this._predictiveEcho?.clearPredictions(),this._localEchoEnabled&&this._localEchoOverlay){const t=this._localEchoOverlay.getFlushed?.()||{count:0,text:""};this._localEchoOverlay.clear(),this._localEchoOverlay.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId);const i=Array.from(t.text||"").length;i>0&&this.sendInput("\x7F".repeat(i)).catch(()=>{})}else this.sendInput("").catch(()=>{});this.showToast?.("Input cleared","success"),this.terminal?.focus()},async restoreTerminalSize(){const e=this._focusedPane();if(!e.isPrimary){e.tile.fit({force:!0})!==!1?this.showToast(`Terminal restored to ${e.terminal.cols}x${e.terminal.rows}`,"success"):this.detachedSessions?.has(e.sessionId)?this.showToast("This session is sized by its own window","warning"):e.tile._wsReady?this.showToast("Could not determine terminal size","error"):this.showToast("Terminal not connected: its size is sent when it reconnects","warning");return}if(!this.activeSessionId){this.showToast("No active session","warning");return}if(this._tilesOwnTerminal?.())return;if(!this.isSoloWindow&&this.detachedSessions?.has(this.activeSessionId)){this.showToast("This session is sized by its own window","warning");return}const t=this.getTerminalDimensions();if(!t){this.showToast("Could not determine terminal size","error");return}try{await this.sendResize(this.activeSessionId,{force:!0}),this.showToast(`Terminal restored to ${t.cols}x${t.rows}`,"success")}catch(i){console.error("Failed to restore terminal size:",i),this.showToast("Failed to restore terminal size","error")}},sendPendingCtrlL(e){},shouldCopyTerminalSelectionFromShortcut(e){if(!e||e.type!=="keydown"||!e.ctrlKey&&!e.metaKey&&!e.altKey)return!1;const i=typeof this.getShortcutRegistry=="function"&&typeof this.matchesShortcutEvent=="function"?this.getShortcutRegistry().find(s=>s.id==="copy-selection"):null;return i?!i.disabled&&this.matchesShortcutEvent(e,i):!e.altKey&&(e.key||"").toLowerCase()==="c"},cleanedTerminalSelection(e,t={}){const i=t.terminal||this.terminal,s=e??(i?.hasSelection?.()?i.getSelection():"");if(!s)return"";if(i?._core?._selectionService?._activeSelectionMode===3)return s;const n=window.CodemanCopySelection?.clean;if(!n)return s;const o=this._normalisedSelectionRange(i);return n(s,{margin:this._cliGutterColumns(t.sessionId),firstLinePartial:!!o&&o.start.x>0})},_normalisedSelectionRange(e){const t=(e??this.terminal)?.getSelectionPosition?.();if(!t?.start||!t?.end)return null;const{start:i,end:s}=t;return s.y<i.y||s.y===i.y&&s.x<i.x?{start:s,end:i}:{start:i,end:s}},_cliGutterColumns(e){if(!this._copyStripMarginEnabled())return 0;const t=window.__codemanTranscriptGutter;if(!t||typeof t!="object")return 0;const i=this.sessions?.get(e??this.activeSessionId)?.mode,s=i?t[i]:0;return Number.isInteger(s)&&s>0?s:0},_installOsc52Clipboard(e,t=()=>this._isLoadingBuffer){e.parser?.registerOscHandler?.(52,i=>{const s=i.indexOf(";"),n=s>=0?i.slice(s+1):i;if(!n||n==="?"||t())return!0;let o;try{const c=Uint8Array.from(atob(n),h=>h.charCodeAt(0));o=new TextDecoder().decode(c)}catch{return!0}if(!o)return!0;const l=Date.now();if(this._lastOsc52?.text===o&&l-this._lastOsc52.at<OSC52_DEDUPE_MS)return!0;this._lastOsc52={text:o,at:l};const a=document.activeElement;return this._copyText(o).then(c=>{if(a&&a!==document.activeElement&&a.isConnected)try{a.focus()}catch{}c?this.showToast(`Copied to clipboard (${o.length} chars)`,"success"):document.hasFocus?.()&&this._showClipboardFallback?.(o)}),!0})},async copyTerminalSelection(e,t={}){const i=t.terminal||this.terminal,s=this.cleanedTerminalSelection(e,t);if(!s.trim())return i?.clearSelection?.(),this.showToast("Nothing to copy","warning"),!1;const n=await this._copyText(s);return n?(i.clearSelection?.(),this.showToast("Copied to clipboard","success")):this.showToast("Failed to copy","error"),i.focus(),n},_copyStripMarginEnabled(){try{return this.loadAppSettingsFromStorage?.()?.copyStripMargin!==!1}catch{return!0}},_autoCopySelectionEnabled(){try{return this.loadAppSettingsFromStorage?.()?.autoCopySelection===!0}catch{return!1}},async _flushAutoCopySelection(){const e=window.CodemanAutoCopy?.decide;if(!e||!this.terminal)return;const t=this._autoCopySelectionEnabled(),i=t?this.cleanedTerminalSelection():"",s=e({enabled:t,text:i,lastCopied:this._autoCopyLastText,pending:!!this._autoCopyPending});if(this._autoCopyPending=!1,s==="skip")return;if(s==="too-large"){this._autoCopyNotify("Selection too large to copy automatically. Press Ctrl+C.","warning");return}this._autoCopyLastText=i;const n=document.activeElement,o=await this._copyText(i);if(n&&n!==document.activeElement&&n.isConnected&&typeof n.focus=="function")try{n.focus()}catch{}if(!o){this._autoCopyLastText="",this._autoCopyNotify("Auto Copy failed: the browser blocked clipboard access","error");return}this._autoCopyHintShown||(this._autoCopyHintShown=!0,this.showToast("Auto Copy: selection copied","success"))},_autoCopyNotify(e,t){const i=Date.now(),s=this._autoCopyNotifiedAt;s!==void 0&&i-s<1e4||(this._autoCopyNotifiedAt=i,this.showToast(e,t))},_syncMobileHelperTextareaToCursor(){if(!(!MobileDetection.isTouchDevice()||!this.terminal?.element))try{const e=this.terminal.element,t=this.terminal.element.querySelector(".xterm-cursor"),i=this.terminal.element.querySelector(".xterm-screen");if(!(e instanceof HTMLElement)||!(t instanceof HTMLElement)||!(i instanceof HTMLElement))return;const s=t.getBoundingClientRect(),n=i.getBoundingClientRect();if(!s.width&&!s.height)return;const o=Math.max(0,Math.round(s.left-n.left)),l=Math.max(0,Math.round(s.top-n.top));e.style.setProperty("--xterm-helper-left",`${o}px`),e.style.setProperty("--xterm-helper-top",`${l}px`)}catch{}},_isMobileTerminalInputFocused(){const e=document.activeElement;return e===this.terminal?.textarea||e?.classList?.contains("xterm-helper-textarea")||e?.id==="cjkInput"},_classifyMobileTerminalTap(e,t){if(!this._terminalViewportAtBottom())return"history";const i=this._clientPointToCell(e,t);if(!i||!this.terminal)return"input";const s=this.terminal.modes?.mouseTrackingMode;if(!(!!s&&s!=="none")&&!this._shouldReportMouseToCli())return"input";const o=this.terminal.buffer?.active;if(!o?.getLine)return"input";const l=Math.max(1,this.terminal.rows||1),a=[],c=[];let h=!1;for(let _=0;_<l;_++){const I=o.getLine(o.viewportY+_),E=I?.translateToString?.(!0)||"";a.push(E),c.push(!!I?.isWrapped),E.trim()&&(h=!0)}if(!h)return"input";const f=Math.max(0,Math.min(l-1,o.cursorY||0)),d=this.sessions?.get(this.activeSessionId)?.mode||"claude";let y=-1,p=!1;if(d==="opencode")a[f]?.includes("\u2503")&&(y=f);else for(let _=l-1;_>=0;_--){const I=a[_].match(/^\s*[❯›]/);if(!I)continue;const E=a[_].slice(I[0].length).trim(),w=a.some((k,R)=>R!==_&&/^\s+\d+[.)]\s/.test(k));if(/^\d+[.)]\s/.test(E)&&w){p=!0;break}y=_;break}const u=i.row-1;let T=u;for(;T>0&&c[T];)T--;let r=u;for(;r+1<l&&c[r+1];)r++;const m=a.slice(T,r+1).join("");if(d==="claude"&&/\b(?:esc to interrupt|background)\b/i.test(m)||p)return"content";if(y>=0){const _=f>=y?f:y;if(u>=y&&u<=_)return"input"}else if(u===f||u>=Math.max(0,l-window.CodemanTerminalInput.TUI_PROMPT_DEFAULT_ROWS_FROM_BOTTOM))return"input";return"content"},_blurMobileTerminalInput(){const e=document.activeElement;(e===this.terminal?.textarea||e?.classList?.contains("xterm-helper-textarea")||e?.id==="cjkInput")&&e.blur?.()},_installMobileKeyboardDismiss(){if(this._mobileKeyboardDismissHandler)return;let e=0,t=0,i=!1;this._mobileKeyboardDismissStart=s=>{if(s.touches.length!==1){i=!0;return}e=s.touches[0].clientX,t=s.touches[0].clientY,i=!1},this._mobileKeyboardDismissMove=s=>{if(i||!s.touches.length)return;const n=s.touches[0].clientX-e,o=s.touches[0].clientY-t,l=window.CodemanTerminalInput.MOBILE_KEYBOARD_DISMISS_TAP_SLOP;(Math.abs(n)>l||Math.abs(o)>l)&&(i=!0)},this._mobileKeyboardDismissHandler=s=>{if(i||!this._isMobileTerminalInputFocused())return;const n=s.target;!n||typeof n.closest!="function"||n.closest("#terminalContainer")||n.closest(window.CodemanTerminalInput.MOBILE_KEYBOARD_DISMISS_EXEMPT_SELECTOR)||this._blurMobileTerminalInput()},document.addEventListener("touchstart",this._mobileKeyboardDismissStart,{passive:!0}),document.addEventListener("touchmove",this._mobileKeyboardDismissMove,{passive:!0}),document.addEventListener("touchend",this._mobileKeyboardDismissHandler,{passive:!0})},_isActionableMobileTerminalTap(e,t){const i=this._clientPointToCell(e,t),s=this.terminal?.buffer?.active;if(!i||!s?.getLine)return!1;const n=Math.max(1,this.terminal.rows||1),o=[],l=[];for(let r=0;r<n;r++){const m=s.getLine(s.viewportY+r);o.push(m?.translateToString?.(!0)||""),l.push(!!m?.isWrapped)}const a=i.row-1;let c=a;for(;c>0&&l[c];)c--;let h=a;for(;h+1<n&&l[h+1];)h++;const f=o.slice(c,h+1).join(""),d=/\b(?:ctrl\+\w+|shift\+\w+|esc|enter|tab|tap)\s+to\s+(?:expand|collapse|view|open|interrupt|see)\b/i,y=Math.max(0,c-1),p=Math.min(n-1,h+1);for(let r=y;r<=p;r++)if(d.test(o[r]))return!0;const u=o.some(r=>/^\s*[❯›]\s+\d+[.)]\s/.test(r)),T=o.some(r=>/^\s+\d+[.)]\s/.test(r));return u&&T&&/^\s*(?:[❯›]\s*)?\d+[.)]\s/.test(f)},_focusMobileTerminalInput(){this._syncMobileHelperTextareaToCursor();const e=document.getElementById("cjkInput");e?.classList.contains("cjk-input-visible")?e.focus():this.terminal?.focus()},_handleMobileTerminalTap(e,t,i=null){if(!e||!this.terminal)return null;if(this._touchSelectionActive)return this._extendTouchSelection(e.clientX,e.clientY),"select";const s=i??this._classifyMobileTerminalTap(e.clientX,e.clientY),n=this._isActionableMobileTerminalTap(e.clientX,e.clientY);if(!n&&!this._tapIsOnCaretLine(e.clientX,e.clientY)&&this._activateTerminalLinkAtPoint(e.clientX,e.clientY))return"link";if(s==="history")return this._focusMobileTerminalInput(),s;const o=this.terminal.modes?.mouseTrackingMode,l=!!o&&o!=="none",a=s==="content"||t;return a&&l?this._dispatchSyntheticTerminalClick(e.clientX,e.clientY):a&&this._shouldReportMouseToCli()&&this._sendSyntheticSgrTap(e.clientX,e.clientY),s==="content"&&n?this._blurMobileTerminalInput():s==="content"&&t?this._blurMobileTerminalInput():this._focusMobileTerminalInput(),s},_dispatchSyntheticTerminalClick(e,t){const i=this.terminal?.element;if(!i||!Number.isFinite(e)||!Number.isFinite(t))return;const s={bubbles:!0,cancelable:!0,view:window,clientX:e,clientY:t,screenX:e,screenY:t,button:0,detail:1};try{i.dispatchEvent(new MouseEvent("mousedown",{...s,buttons:1})),i.dispatchEvent(new MouseEvent("mouseup",{...s,buttons:0}))}catch{}},_shouldReportMouseToCli(e=this.activeSessionId){return this.sessions?.get(e)?.cliMouseTracking===!0},_terminalViewportAtBottom(e=this.terminal){const t=e?.buffer?.active;return!t||t.viewportY>=t.baseY},_clientPointToCell(e,t,i=this.terminal){if(!i||!Number.isFinite(e)||!Number.isFinite(t))return null;const s=i.element?.querySelector(".xterm-screen"),n=i._core?._renderService?.dimensions?.css?.cell;if(!s||!n?.width||!n?.height)return null;const o=s.getBoundingClientRect(),l=Math.max(1,Math.min(i.cols,Math.floor((e-o.left)/n.width)+1)),a=Math.max(1,Math.min(i.rows,Math.floor((t-o.top)/n.height)+1));return{col:l,row:a}},_sendSyntheticSgrTap(e,t,i={}){const s=i.sessionId||this.activeSessionId,n=i.terminal||this.terminal;if(!s||!this._terminalViewportAtBottom(n))return;const o=this._clientPointToCell(e,t,n);if(!o)return;const l=`\x1B[<0;${o.col};${o.row}M\x1B[<0;${o.col};${o.row}m`;i.ephemeral?this._sendInputEphemeral(s,l):this._sendInputAsync(s,l)},_cliVersionAtLeast(e,t){if(typeof e!="string")return!1;const i=e.trim().replace(/^v/,"").split(".").map(Number);if(i.length!==3||i.some(n=>!Number.isFinite(n)))return!1;const s=t.split(".").map(Number);for(let n=0;n<3;n++)if(i[n]!==s[n])return i[n]>s[n];return!0},_wheelScrollLinesFloat(e){return window.CodemanTerminalInput.wheelDeltaLines(e,this.terminal?.rows)},_shouldForwardTouchToApp(){if(this.loadAppSettingsFromStorage?.()?.terminalWheelLocalScrollback)return!1;const e=this.terminal?.modes?.mouseTrackingMode,t=this.terminal?._core?.coreMouseService?.activeEncoding==="SGR";return!!(e&&e!=="none"&&e!=="x10"&&t)||this._shouldForwardWheelToApp({shiftKey:!1})},_shouldForwardWheelToApp(e,t={}){if(e.shiftKey||this.loadAppSettingsFromStorage?.()?.terminalWheelLocalScrollback)return!1;const i=(t.terminal||this.terminal)?.modes?.mouseTrackingMode;if(i&&i!=="none")return!1;const s=this.sessions?.get(t.sessionId||this.activeSessionId),n=s?.mode||"claude";return n==="copilot"?s?.cliMouseTracking===!0:!(n!=="claude"&&n!=="codex"||n==="claude"&&!this._cliVersionAtLeast(s?.cliVersion,"2.1.187")||s?.cliMouseTracking!==!0)},_sendSyntheticSgrWheel(e,t,i){if(!this.activeSessionId||!i)return;const s=this._clientPointToCell(e,t);if(!s)return;const n=window.CodemanTerminalInput,o=this._wheelTickSession===this.activeSessionId?this._wheelTickGesture:null;o?.dir&&o.dir!==Math.sign(i)&&(this._wheelSgrQueue="");const l=n.wheelTicksForGesture(o,i,performance.now());this._wheelTickSession=this.activeSessionId,this._wheelTickGesture=l.state,this._queueScrollBytes(n.sgrWheelReports(l.ticks,s))},_queueScrollBytes(e){if(!e||!this.activeSessionId)return;const t=e.startsWith("\x1B[<")&&(this._wheelNativeStartSession!==this.activeSessionId||this._wheelNativeStartGeneration!==this._selectGeneration),i=!t&&this._wheelQueueSession===this.activeSessionId&&this._wheelSgrQueue||"";if(this._wheelQueueSession=this.activeSessionId,this._wheelSgrQueue=window.CodemanTerminalInput.coalesceScrollBytes(i,e),t){this._wheelNativeStartSession=this.activeSessionId,this._wheelNativeStartGeneration=this._selectGeneration,this._wheelSgrFlushTimer&&clearTimeout(this._wheelSgrFlushTimer),this._flushWheelSgrQueue();return}this._wheelSgrFlushTimer||(this._wheelSgrFlushTimer=setTimeout(()=>this._flushWheelSgrQueue(),40))},_localScrollbackIsHollow(e={}){const t=this.sessions?.get(e.sessionId||this.activeSessionId)?.mode||"claude",i=window.__codemanTranscriptPageKeys;if(!Array.isArray(i)||!i.includes(t))return!1;const s=(e.terminal||this.terminal)?.buffer?.active;return!s||s.type==="alternate"?!1:((Number.isFinite(e.localRows)?e.localRows:s.baseY)||0)===0},_maybePageCliTranscript(e,t){if(!t||e?.shiftKey||!this.activeSessionId)return!1;if(e?.ctrlKey||Math.abs(e?.deltaX||0)>Math.abs(e?.deltaY||0))return this._localScrollbackIsHollow();if(!this._localScrollbackIsHollow())return!1;if(this.tabAlerts?.get(this.activeSessionId)==="action")return this._logScrollRouting("page-keys-dialog-open"),!0;if(this._codexMenuOpen())return this._logScrollRouting("page-keys-menu-open"),!0;if((this._paneHistoryLines?.get(this.activeSessionId)??0)>0)return this._pageKeyGesture=null,this._wheelSgrQueue="",!1;this._pageKeySession!==this.activeSessionId&&(this._pageKeySession=this.activeSessionId,this._pageKeyGesture=null),this._pageKeyGesture?.dir&&this._pageKeyGesture.dir!==Math.sign(t)&&(this._wheelSgrQueue="");const i=window.CodemanTerminalInput.pageKeysForGesture(this._pageKeyGesture,e,t,this.terminal?.rows,performance.now());return this._pageKeyGesture=i.state,i.keys&&this._queueScrollBytes(i.keys),this._logScrollRouting("page-keys"),!0},_codexMenuOpen(e={}){return this.sessions?.get(e.sessionId||this.activeSessionId)?.mode!=="codex"?!1:window.CodemanTerminalInput.isCodexSelectionMenu(e.terminal||this.terminal)},_logScrollRouting(e){const t=this.activeSessionId||"(none)",i=this.sessions?.get(t),s=!!this.loadAppSettingsFromStorage?.()?.terminalWheelLocalScrollback,n=this.terminal?.modes?.mouseTrackingMode||"none",o=this.terminal?._core?.coreMouseService?.activeEncoding||"unknown",l=i?.cliMouseTracking===!0,a=this.terminal?.buffer?.active?.baseY??-1,c=this._paneHistoryLines?.get(t),h=`${e}|${i?.mode}|${i?.cliVersion}|${s}|${n}|${o}|${l}|${a>0}|${(c??0)>0}`;this._scrollRoutingLogged||(this._scrollRoutingLogged=new Map),this._scrollRoutingLogged.get(t)!==h&&(this._scrollRoutingLogged.set(t,h),console.log(`[scroll] ${t} \u2192 ${e} (mode=${i?.mode||"?"}, cliVersion=${i?.cliVersion||"unknown"}, localScrollbackOptOut=${s}, mouseTracking=${n}, mouseEncoding=${o}, cliMouseTracking=${l}, localScrollbackRows=${a}, paneHistoryLines=${c??"unknown"})`))},_flushWheelSgrQueue(){this._wheelSgrFlushTimer=null;const e=this._wheelSgrQueue;this._wheelSgrQueue="",e&&this.activeSessionId&&this._wheelQueueSession===this.activeSessionId&&this._sendInputEphemeral(this.activeSessionId,e)},_handleDesktopTerminalClick(e,t={}){const i=t.terminal||this.terminal;if(!i||!e?.isTrusted||e.button!==0||e.detail!==1||e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)return;const s=i.modes?.mouseTrackingMode;s&&s!=="none"||this._shouldReportMouseToCli(t.sessionId)&&(i.hasSelection?.()||(t.linkHovered??this._linkHovered)||performance.now()<=(this._trustedTapMouseSuppressUntil||0)||e.target?.closest?.(".xterm-screen")&&this._sendSyntheticSgrTap(e.clientX,e.clientY,t))},_installShiftDragSelection(){const e=this.terminal?.element;!e||e._codemanShiftDragInstalled||(e._codemanShiftDragInstalled=!0,e.addEventListener("mousedown",t=>{if(!t.isTrusted||t.button!==0||!t.shiftKey||t.altKey||t.ctrlKey||t.metaKey||this.terminal?.hasSelection?.())return;const i=this._clientPointToCell(t.clientX,t.clientY);if(!i)return;const s=this.terminal.buffer?.active?.viewportY??0;this.terminal.select(i.col-1,i.row-1+s,0)},!0))},_installMobileTapMouseGuard(){const e=this.terminal?.element;if(!e||e._codemanTapMouseGuardInstalled||typeof MobileDetection<"u"&&MobileDetection.isTouchDevice&&!MobileDetection.isTouchDevice())return;e._codemanTapMouseGuardInstalled=!0;const t=i=>{const s=this._trustedTapMouseSuppressUntil||0;!i.isTrusted||performance.now()>s||(i.preventDefault(),i.stopImmediatePropagation())};e.addEventListener("mousedown",t,!0),e.addEventListener("mouseup",t,!0)},_suppressTrustedTapMouseEvents(){const e=window.CodemanTerminalInput?.TOUCH_COMPAT_MOUSE_SUPPRESS_MS||450;this._trustedTapMouseSuppressUntil=performance.now()+e},increaseFontSize(){if(this._tilesOwnTerminal?.()){this.setTileFontSize(Math.min(this._tileGridFontSize()+2,24));return}const e=this.terminal.options.fontSize||14;this.setFontSize(Math.min(e+2,24))},decreaseFontSize(){if(this._tilesOwnTerminal?.()){this.setTileFontSize(Math.max(this._tileGridFontSize()-2,10));return}const e=this.terminal.options.fontSize||14;this.setFontSize(Math.max(e-2,10))},setFontSize(e){this.terminal.options.fontSize=e,document.getElementById("fontSizeDisplay").textContent=e,this._refitAfterCellSizeChange(),localStorage.setItem("codeman-font-size",e),this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont(),this._forEachTile?.(t=>{t.terminal.options.fontSize=e,t.fit()},{grid:!1})},applyTerminalFontFamily(e){const t=window.CodemanTerminalFont.resolve(e);!this.terminal||this.terminal.options.fontFamily===t||(this.terminal.options.fontFamily=t,this._terminalFontReady=this._awaitTerminalFont().then(()=>{this.terminal?.options?.fontFamily===t&&this._refitAfterCellSizeChange()}),this._refitAfterCellSizeChange(),this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont(),this._forEachTile?.(i=>{i.terminal.options.fontFamily=t,i.fit()}))},applyTerminalFontWeights(e){const{fontWeight:t,fontWeightBold:i}=window.CodemanTerminalFont.resolveWeights(e);if(this.terminal&&!(this.terminal.options.fontWeight===t&&this.terminal.options.fontWeightBold===i)){this.terminal.options.fontWeight=t,this.terminal.options.fontWeightBold=i,this._terminalFontReady=this._awaitTerminalFont().then(()=>{this.terminal?.options?.fontWeight===t&&this._refitAfterCellSizeChange()}),this._refitAfterCellSizeChange(),this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont();for(const[,s]of this.teammateTerminals||[])if(s?.terminal){s.terminal.options.fontWeight=t,s.terminal.options.fontWeightBold=i;try{s.fitAddon?.fit()}catch{}}this._forEachTile?.(s=>{s.terminal.options.fontWeight=t,s.terminal.options.fontWeightBold=i,s.fit()})}},loadFontSize(){const e=localStorage.getItem("codeman-font-size");if(e){const t=parseInt(e,10);t>=10&&t<=24&&(this.terminal.options.fontSize=t,document.getElementById("fontSizeDisplay").textContent=t)}},async _awaitTerminalFont(){try{if(typeof document>"u"||!document.fonts?.load)return;const e=this.terminal?.options?.fontSize||14,t=String(this.terminal?.options?.fontFamily||"").split(",").map(s=>s.trim().replace(/^["']|["']$/g,"")).filter(Boolean).filter(s=>!TERMINAL_FONT_UNMEASURED.has(s.toLowerCase())),i=Promise.all(t.map(s=>document.fonts.load(`${e}px "${s}"`).catch(()=>{}))).then(()=>document.fonts.ready);await Promise.race([i,new Promise(s=>setTimeout(s,TERMINAL_FONT_WAIT_MS))])}catch{}try{this.terminal?._core?._charSizeService?.measure()}catch{}},getTerminalDimensions(){try{const e=window.CodemanTerminalGeometry.clampTerminalDimensions(this.fitAddon?.proposeDimensions()),t=this._keyboardHeldRowsActive?.();return e&&t&&(e.rows=Math.max(e.rows,t)),e}catch{return null}},_keyboardHeldRowsActive(){return this._keyboardHeldRows>0&&typeof KeyboardHandler<"u"&&KeyboardHandler.keyboardVisible?this._keyboardHeldRows:0},_keyboardHoldEligible(e=this.activeSessionId){if(this.loadAppSettingsFromStorage?.()?.keyboardHoldsRows===!1)return!1;const t=e?this.sessions?.get(e):null;if(!t||t.remote||t.docker||t.cliMouseTracking)return!1;const i=window.__codemanKeyboardHoldModes;return Array.isArray(i)&&i.includes(t.mode||"claude")},_reconcileKeyboardHold({resize:e=!0}={}){!this._keyboardHeldRows||this._keyboardHoldEligible()||(this._releaseKeyboardHold(),e&&this.activeSessionId&&this.sendResize(this.activeSessionId)?.catch?.(()=>{}))},_releaseKeyboardHold(){return this._keyboardHeldRows?(this._keyboardHeldRows=0,this._applyKeyboardClip(),!0):!1},_applyKeyboardClip(){const e=this.terminal?.element?.parentElement;if(!e)return;const t=this._keyboardHeldRowsActive()?this.terminal.rows:0,i=t?this.terminal._core?._renderService?.dimensions?.css?.cell?.height:0,s=t?e.clientHeight:0;let n=0;if(i&&s){const o=this.terminal.buffer.active,l=o.viewportY>=o.baseY;let a=-1;if(l){for(let c=t-1;c>=0;c--)if(o.getLine(o.baseY+c)?.translateToString(!0).trim()){a=c;break}}n=window.CodemanTerminalGeometry.keyboardClipPx({rows:t,cellHeight:i,viewHeight:s,cursorRow:o.cursorY,lastContentRow:a,following:l,viewportY:o.viewportY,baseY:o.baseY})}n!==(this._keyboardClipPx||0)&&(this._keyboardClipPx=n,n?e.style.setProperty("--kb-clip",`${n}px`):e.style.removeProperty("--kb-clip")),this._localEchoOverlay?.setRowLimit?.(i&&s?window.CodemanTerminalGeometry.keyboardVisibleRowLimit(n,s,i):null)},syncTerminalGeometry(){if(!this.fitAddon||!this.terminal)return null;try{this._keyboardHeldRowsActive?.()||this.fitAddon.fit()}catch{}const e=this.getTerminalDimensions();return!e||!this._resizeTerminalTo(e)?null:(this._scheduleOverflowAffordanceSync(),e)},_geometryForResizeRequest(){if(!this._paneWidthRefused)return this.syncTerminalGeometry();const e=this.getTerminalDimensions();return!e||!this.terminal||!this._resizeTerminalTo({cols:this.terminal.cols,rows:e.rows})?null:(this._scheduleOverflowAffordanceSync(),e)},_refitAfterCellSizeChange(){if(this.activeSessionId){this.sendResize(this.activeSessionId)?.catch?.(()=>{});return}this.syncTerminalGeometry()},_resizeTerminalTo(e){if(!this.terminal||!e)return null;if(this.terminal.cols===e.cols&&this.terminal.rows===e.rows)return e;try{return this.terminal.resize(e.cols,e.rows),e}catch{return null}},async sendResize(e,t={}){if(!this.isSoloWindow&&this.detachedSessions?.has(e)||this._tilesOwnTerminal?.())return!1;const i=this._geometryForResizeRequest();if(!i)return!1;const s=this._lastResizeDims,n=!s||s.cols!==i.cols||s.rows!==i.rows;this._lastResizeDims={cols:i.cols,rows:i.rows};const o=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():window.innerWidth<600?"mobile":window.innerWidth<768?"tablet":"desktop";if(!t.forceHttp&&this._wsReady&&this._wsSessionId===e)try{const c={t:"z",c:i.cols,r:i.rows,v:o};return t.force&&(c.f=!0),this._ws.send(JSON.stringify(c)),n}catch{}const l={...i,viewportType:o};t.force&&(l.force=!0);const a=await fetch(`/api/sessions/${e}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)});try{const c=(await a.json())?.data??{};this._onPtyGeometryReport(e,c.cols,c.rows)}catch{}return n},_onPtyGeometryReport(e,t,i){if(!this.terminal||e!==this.activeSessionId)return;const s={cols:this.terminal.cols,rows:this.terminal.rows},{adopt:n}=window.CodemanTerminalGeometry.reconcilePtyGeometry(s,{cols:t,rows:i});n&&this._resizeTerminalTo({cols:t,rows:s.rows})&&(this._lastResizeDims={cols:t,rows:s.rows});const o=this.getTerminalDimensions();this._paneWidthRefused=!!o&&Number.isFinite(t)&&t!==o.cols,this._scheduleOverflowAffordanceSync()},_scheduleOverflowAffordanceSync(){if(typeof requestAnimationFrame!="function"){this._syncTerminalOverflowAffordance();return}this._overflowAffordanceFrame||(this._overflowAffordanceFrame=requestAnimationFrame(()=>{this._overflowAffordanceFrame=null,this._syncTerminalOverflowAffordance()}))},_syncTerminalOverflowAffordance(){let e=null,t=!1;try{e=document.getElementById("terminalContainer");const i=e?.querySelector(".xterm-screen");e&&i&&(t=i.getBoundingClientRect().width-e.clientWidth>1)}catch{}if(e?.classList.toggle("term-overflows-x",t),!t||!this._paneWidthRefused){this._paneOwnedElsewhere=!1;return}this._notePaneOwnedElsewhere()},_notePaneOwnedElsewhere(){this._paneOwnedElsewhere||(this._paneOwnedElsewhere=!0,this.showToast("Another device is setting the width \u2014 scroll sideways","info"))},async sendInput(e){!this.activeSessionId||!e||this._sendInputAsync(this.activeSessionId,e,{useMux:!0})},toggleDirInput(){const e=document.querySelector("#dirDisplay").parentElement,t=document.getElementById("dirInput");t.classList.contains("hidden")&&(t.classList.remove("hidden"),e.style.display="none",t.focus())},hideDirInput(){const e=document.querySelector("#dirDisplay").parentElement,t=document.getElementById("dirInput");setTimeout(()=>{t.classList.add("hidden"),e.style.display="";const i=t.value.trim();document.getElementById("dirDisplay").textContent=i||"No directory"},100)},applyTerminalSkin(e){const t={...window.CODEMAN_XTERM_THEMES[e]||window.CODEMAN_XTERM_THEMES["daylight-blue"]},i=window.codemanCurrentSkinIsLight(e)?4.5:1;if(this.terminal){this.terminal.options.minimumContrastRatio=i,this.terminal.options.theme=t,this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont();try{this.terminal.refresh(0,this.terminal.rows-1)}catch{}}if(this.teammateTerminals){for(const[,s]of this.teammateTerminals)if(s&&s.terminal){s.terminal.options.minimumContrastRatio=i,s.terminal.options.theme={...t};try{s.terminal.refresh(0,s.terminal.rows-1)}catch{}}}this._forEachTile?.(s=>{s.terminal.options.minimumContrastRatio=i,s.terminal.options.theme={...t};try{s.terminal.refresh(0,s.terminal.rows-1)}catch{}})}}),(function(e){const s={session:"Sessions",event:"Events",file:"Files"};function n(o){if(!Number.isFinite(o))return"";const l=new Date(o);return l.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+l.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1})}e.CodemanSearch={SEARCH_DEBOUNCE_MS:250,SEARCH_LIMIT:60,SOURCE_LABELS:s,formatSearchTime:n}})(window),Object.assign(CodemanApp.prototype,{initSearchPanel(){const e=document.getElementById("searchInput");if(!e||this._searchPanelWired){this._searchPanelWired&&this._populateSearchCaseFilter();return}this._searchPanelWired=!0,this._searchTypes=new Set(["session","event","file"]),this._searchSecondary={caseLabel:"",status:"",days:""},this._searchDebounceTimer=null,this._searchSeq=0,this._searchLastData=null;const t=document.getElementById("searchClearBtn"),i=document.getElementById("searchResults");e.addEventListener("input",()=>{t&&(t.hidden=e.value.length===0),this._scheduleSearch()}),e.addEventListener("keydown",l=>{l.key==="Escape"&&e.value&&(l.stopPropagation(),this._clearSearch())}),t&&t.addEventListener("click",()=>this._clearSearch()),document.querySelectorAll("#searchFilters .search-filter-chip").forEach(l=>{l.addEventListener("click",()=>{const a=l.dataset.typeFilter;this._searchTypes.has(a)&&this._searchTypes.size===1||(this._searchTypes.has(a)?(this._searchTypes.delete(a),l.classList.remove("active")):(this._searchTypes.add(a),l.classList.add("active")),this._runSearch())})});const s=document.getElementById("searchCaseFilter"),n=document.getElementById("searchStatusFilter"),o=document.getElementById("searchDateFilter");s&&s.addEventListener("change",()=>{this._searchSecondary.caseLabel=s.value,this._renderSearch(this._searchLastData)}),n&&n.addEventListener("change",()=>{this._searchSecondary.status=n.value,this._renderSearch(this._searchLastData)}),o&&o.addEventListener("change",()=>{this._searchSecondary.days=o.value,this._renderSearch(this._searchLastData)}),this._populateSearchCaseFilter(),i&&(i.hidden=!0)},_populateSearchCaseFilter(){const e=document.getElementById("searchCaseFilter");if(!e)return;const t=Array.isArray(this.cases)?this.cases:[],i=Array.from(new Set(t.map(o=>o&&o.name).filter(Boolean))).sort(),s=e.value;e.innerHTML="";const n=document.createElement("option");n.value="",n.textContent="All cases",e.appendChild(n);for(const o of i){const l=document.createElement("option");l.value=o,l.textContent="#"+o,e.appendChild(l)}s&&i.includes(s)&&(e.value=s)},_scheduleSearch(){clearTimeout(this._searchDebounceTimer),this._searchDebounceTimer=setTimeout(()=>this._runSearch(),window.CodemanSearch.SEARCH_DEBOUNCE_MS)},_clearSearch(){const e=document.getElementById("searchInput"),t=document.getElementById("searchClearBtn");e&&(e.value=""),t&&(t.hidden=!0),this._searchLastData=null,this._renderSearch(null)},async _runSearch(){const e=document.getElementById("searchInput");if(!e)return;const t=e.value.trim();if(t.length===0){this._searchLastData=null,this._renderSearch(null);return}const i=Array.from(this._searchTypes),s=new URLSearchParams;s.set("q",t.slice(0,200)),i.length>0&&i.length<3&&s.set("types",i.join(",")),s.set("limit",String(window.CodemanSearch.SEARCH_LIMIT));const n=++this._searchSeq,o=await this._apiJson("/api/search?"+s.toString());n===this._searchSeq&&(o?this._searchLastData=o:this._searchLastData={query:t,groups:[],totalResults:0,truncated:!1,_error:!0},this._renderSearch(this._searchLastData))},_applySecondaryFilters(e){const{caseLabel:t,status:i,days:s}=this._searchSecondary;let n=e;if(t){const o="#"+t;n=n.filter(l=>(l.sessionName||"").includes(o)||l.sessionName===t)}if(i){const o=new Set((this.sessionOrder||[]).concat(Object.keys(this.sessions||{})));n=n.filter(l=>{const a=o.has(l.sessionId);return i==="active"?a:!a})}if(s){const o=Date.now()-Number(s)*24*60*60*1e3;n=n.filter(l=>Number.isFinite(l.timestamp)&&l.timestamp>=o)}return n},_renderSearch(e){const t=document.getElementById("searchResults"),i=document.getElementById("historyHeader")||document.getElementById("historyTitle"),s=document.getElementById("historyList");if(!t)return;const n=!!e;if(i&&(i.style.display=n?"none":""),s&&(s.style.display=n?"none":""),t.innerHTML="",!e){t.hidden=!0;return}if(t.hidden=!1,e._error){const a=document.createElement("div");a.className="search-empty",a.textContent="Search unavailable \u2014 check the query and try again.",t.appendChild(a);return}const o=(e.groups||[]).map(a=>({type:a.type,results:this._applySecondaryFilters(a.results||[])})).filter(a=>a.results.length>0);if(o.reduce((a,c)=>a+c.results.length,0)===0){const a=document.createElement("div");a.className="search-empty",a.textContent='No results for "'+(e.query||"")+'"',t.appendChild(a);return}for(const a of o){const c=document.createElement("div");c.className="search-group-header";const h=document.createElement("span");h.className="search-group-label",h.textContent=window.CodemanSearch.SOURCE_LABELS[a.type]||a.type;const f=document.createElement("span");f.className="search-group-count",f.textContent=String(a.results.length),c.append(h,f),t.appendChild(c);for(const d of a.results)t.appendChild(this._buildSearchResultCard(d))}if(e.truncated){const a=document.createElement("div");a.className="search-truncated",a.textContent="Showing the top matches \u2014 refine your search to narrow results.",t.appendChild(a)}},_buildSearchResultCard(e){const t=document.createElement("div");t.className="search-result-card",t.dataset.type=e.type,t.tabIndex=0,t.setAttribute("role","button");const i=document.createElement("div");i.className="search-result-top";const s=e.jumpTo&&e.jumpTo.kind==="resume-session",n=document.createElement("span");n.className="search-result-badge search-badge-"+e.type+(s?" search-badge-past":""),n.textContent=s?"Resume":(window.CodemanSearch.SOURCE_LABELS[e.type]||e.type).replace(/s$/,"");const o=document.createElement("span");o.className="search-result-name",o.textContent=e.sessionName||e.sessionId||"(session)";const l=document.createElement("span");l.className="search-result-time",l.textContent=window.CodemanSearch.formatSearchTime(e.timestamp),i.append(n,o,l);const a=document.createElement("div");a.className="search-result-snippet",a.textContent=e.snippet||"",t.append(i,a);const c=()=>this._jumpToSearchResult(e);return t.addEventListener("click",c),t.addEventListener("keydown",h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),c())}),t},_jumpToSearchResult(e){const t=e&&e.jumpTo;if(t){if(t.kind==="resume-session"){this.resumeHistorySession(t.claudeSessionId||t.sessionId,t.workingDir||"",e.sessionName);return}typeof this.hideWelcome=="function"&&this.hideWelcome();try{t.kind==="run-summary"?this.openRunSummary(t.sessionId):t.kind==="file-preview"?this.openFilePreview(t.relativePath||"",t.sessionId,t.targetId||null):this.selectSession(t.sessionId)}catch(i){console.error("[search] jump failed",i)}}}});
3
+ ${t}`)&&this._openTerminalUrl(t)}}},_openTerminalUrl(e){this.openLinkThroughWebTabIfLoopback?.(e)||window.open(e,"_blank","noopener,noreferrer")},_terminalLinkAtPoint(e,t){const i=this._terminalLinkProvider,s=this.terminal?.buffer?.active;if(!i||!s)return null;const n=this._clientPointToCell(e,t);if(!n)return null;const o=(s.viewportY||0)+n.row;let l=null;try{i.provideLinks(o,h=>{l=h||[]})}catch{return null}if(!l||l.length===0)return null;const a=Math.max(1,this.terminal.cols||1),c=o*a+n.col;return l.find(h=>{const f=h?.range?.start,d=h?.range?.end;return!f||!d?!1:f.y*a+f.x<=c&&c<=d.y*a+d.x})||null},_tapIsOnCaretLine(e,t){const i=this.terminal?.buffer?.active;if(!i?.getLine)return!1;const s=this._clientPointToCell(e,t);if(!s)return!1;const n=i.baseY+(i.cursorY||0),o=i.viewportY+s.row-1;let l=n;for(;l>0&&i.getLine(l)?.isWrapped;)l--;let a=n;for(;a+1<i.length&&i.getLine(a+1)?.isWrapped;)a++;return o>=l&&o<=a},_activateTerminalLinkAtPoint(e,t){const i=this._terminalLinkAtPoint(e,t);if(!i||typeof i.activate!="function")return!1;try{i.activate(null,i.text)}catch(s){return console.warn("[LinkProvider] tap activation failed:",s),!1}return!0},_installTouchSelectionFocusGuard(){const e=this.terminal?.textarea;!e||e._codemanSelectionFocusGuard||(e._codemanSelectionFocusGuard=!0,e.addEventListener("focus",()=>{this._touchSelectionFocusGuarded()&&this._blurMobileTerminalInput()}))},_touchSelectionFocusGuarded(){return this._touchSelecting?!0:performance.now()<(this._touchSelectionFocusGuardUntil||0)},_armTouchSelectionFocusGuard(){this._touchSelectionFocusGuardUntil=performance.now()+(window.CodemanTerminalInput?.TOUCH_SELECT_FOCUS_GUARD_MS||800)},_touchSelectionCellAt(e,t){const i=this._clientPointToCell(e,t),s=this.terminal?.buffer?.active;return!i||!s?null:{col:i.col-1,row:(s.viewportY||0)+i.row-1}},_touchSelectionLogicalLine(e){const t=this.terminal?.buffer?.active,i=Math.max(1,this.terminal?.cols||1);return!t||typeof window.CodemanTerminalLines?.terminalLogicalLine!="function"?null:window.CodemanTerminalLines.terminalLogicalLine(t,e,i)},_touchSelectionWordAt(e){const t=Math.max(1,this.terminal?.cols||1),i=this._touchSelectionLogicalLine(e.row);if(!i)return null;const s=i.cellToOffset(e.row,e.col);if(s<0)return null;const n=i.text[s];if(!n||!n.trim())return null;let o=s;for(;o>0&&i.text[o-1]&&i.text[o-1].trim();)o--;let l=s;for(;l+1<i.text.length&&i.text[l+1]&&i.text[l+1].trim();)l++;const a=i.offsetToCell(o),c=i.offsetToCell(l),h=a.row*t+a.col,f=c.row*t+c.col-h+1;return f>0?{index:h,length:f}:null},_applyTouchSelection(e,t){const i=Math.max(1,this.terminal?.cols||1);t<=0||this.terminal?.select?.(e%i,Math.floor(e/i),t)},_beginTouchSelection(e,t){this._blurMobileTerminalInput(),this._suppressTrustedTapMouseEvents(),this._armTouchSelectionFocusGuard(),this._touchSelecting=!0;const i=this._touchSelectionCellAt(e,t);if(!i)return!1;const s=this._touchSelectionWordAt(i);if(!s)return!1;this._touchSelectionAnchor=s,this._touchSelectionActive=!0,this._applyTouchSelection(s.index,s.length);try{navigator.vibrate?.(15)}catch{}return this._showTouchSelectionBar(),!0},_extendTouchSelection(e,t){const i=this._touchSelectionAnchor,s=this._touchSelectionCellAt(e,t);if(!i||!s)return;const n=Math.max(1,this.terminal?.cols||1),o=s.row*n+s.col,l=Math.min(i.index,o),a=Math.max(i.index+i.length,o+1);this._applyTouchSelection(l,a-l),this._armTouchSelectionFocusGuard(),this._positionTouchSelectionBar()},_endTouchSelectionGesture(){this._touchSelecting=!1,this._suppressTrustedTapMouseEvents(),this._armTouchSelectionFocusGuard(),this._positionTouchSelectionBar(),this._flushAutoCopySelection()},_selectTouchSelectionLine(){const e=this._touchSelectionAnchor,t=Math.max(1,this.terminal?.cols||1);if(!e)return;const i=this._touchSelectionLogicalLine(Math.floor(e.index/t));if(!i)return;const n=(this.terminal?.buffer?.active?.getLine(i.endRow)?.translateToString(!0)||"").length,o=i.startRow*t,l=i.endRow*t+Math.max(0,n-1)-o+1;l<=0||(this._touchSelectionAnchor={index:o,length:l},this._applyTouchSelection(o,l),this._positionTouchSelectionBar(),this._flushAutoCopySelection())},async _copyTouchSelection(){const e=await this.copyTerminalSelection();return this._clearTouchSelection(),typeof MobileDetection<"u"&&MobileDetection.isTouchDevice?.()&&this._blurMobileTerminalInput(),e},_clearTouchSelection(){this._touchSelecting=!1,this._touchSelectionActive=!1,this._touchSelectionAnchor=null,this.terminal?.clearSelection?.(),this._hideTouchSelectionBar()},_ensureTouchSelectionBar(){if(this._touchSelectionBar?.isConnected)return this._touchSelectionBar;const e=document.getElementById("terminalContainer");if(!e)return null;const t=document.createElement("div");return t.className="term-select-bar",t.setAttribute("role","toolbar"),t.innerHTML='<button type="button" class="term-select-btn" data-act="copy">Copy</button><button type="button" class="term-select-btn" data-act="line">Line</button><button type="button" class="term-select-btn term-select-btn--close" data-act="close" aria-label="Clear selection">\u2715</button>',t.addEventListener("click",i=>{const s=i.target?.closest?.("[data-act]")?.dataset?.act;s&&(i.preventDefault(),i.stopPropagation(),s==="copy"?this._copyTouchSelection():s==="line"?this._selectTouchSelectionLine():this._clearTouchSelection())}),e.appendChild(t),this._touchSelectionBar=t,t},_showTouchSelectionBar(){const e=this._ensureTouchSelectionBar();e&&(e.classList.add("visible"),this._positionTouchSelectionBar())},_hideTouchSelectionBar(){this._touchSelectionBar?.classList.remove("visible")},_positionTouchSelectionBar(){const e=this._touchSelectionBar,t=document.getElementById("terminalContainer"),i=this.terminal?.element?.querySelector(".xterm-screen"),s=this.terminal?._core?._renderService?.dimensions?.css?.cell,n=this.terminal?.getSelectionPosition?.(),o=this.terminal?.buffer?.active;if(!e||!t||!i||!s?.height||!n||!o)return;const l=i.getBoundingClientRect(),a=t.getBoundingClientRect(),c=r=>r-(o.viewportY||0),h=l.top-a.top+c(n.start.y)*s.height,f=l.top-a.top+(c(n.end.y)+1)*s.height,d=e.offsetHeight||36,S=6;let p=h-d-S;p<0&&(p=f+S),p=Math.max(0,Math.min(p,a.height-d));const u=l.left-a.left+n.start.x*(s.width||8),T=e.offsetWidth||150;e.style.top=`${Math.round(p)}px`,e.style.left=`${Math.round(Math.max(0,Math.min(u,a.width-T)))}px`},showWelcome(){if(this.shouldUseMobileOverview?.()){const t=document.getElementById("welcomeOverlay");t&&t.classList.remove("visible"),this.hideHomeSessions?.(),this.showMobileOverview(),this._updateCjkInputState?.();return}this.hideMobileOverview?.();const e=document.getElementById("welcomeOverlay");e&&(e.classList.add("visible"),this.loadTunnelStatus(),this.applyWelcomeCliVisibility(),this.loadHistorySessions(),this.initSearchPanel(),this.showHomeSessions?.()),this._updateCjkInputState?.()},hideWelcome(){this.hideMobileOverview?.(),this.hideHomeSessions?.();const e=document.getElementById("welcomeOverlay");e&&e.classList.remove("visible");const t=document.getElementById("welcomeQr");t&&(clearTimeout(this._welcomeQrShrinkTimer),t.classList.remove("expanded")),this._updateCjkInputState?.()},async _fetchHistorySessions(){const i=(await(await fetch("/api/history/sessions")).json()).data?.sessions||[];if(i.length===0)return[];const s=new Map;for(const o of i){const l=o.projectKey||o.workingDir;s.has(l)||s.set(l,[]),s.get(l).push(o)}const n=[];for(const[,o]of s)n.push(...o.slice(0,3));return n.sort((o,l)=>new Date(l.lastModified)-new Date(o.lastModified)),n},async _fetchUnifiedSessions(e=60){const t=await fetch("/api/sessions/unified?limit="+e),i=await t.json().catch(()=>null);if(!t.ok||!i||i.success===!1||!i.data)throw new Error(i?.error||`unified sessions request failed (HTTP ${t.status})`);return i.data.sessions||[]},_worktreeLabel(e){const t=e&&e.worktreeName;if(!t)return"";let i=e.gitBranch||"";return(i===t||i===`worktree-${t}`)&&(i=""),i.length>24&&(i=i.slice(0,23)+"\u2026"),"\u2442 "+[t,i].filter(Boolean).join(" \xB7 ")},_resolveCaseLabel(e,t){if(!e)return"";let i=null;for(const s of t||[])if(!(!s||!s.path)){if(e===s.path)return`#${s.name}`;if(e.startsWith(s.path+"/")){const n=s.path.length;(!i||n>i.len)&&(i={name:s.name,suffix:e.slice(n),len:n})}}return i?`#${i.name}${i.suffix}`:e.split("/").pop()||e},_shortenHomePath(e){return(e||"").replace(/^\/(?:home|Users)\/[^/]+(?=\/|$)/,"~")},_buildHistoryItem(e,t,i){const s=i?.showViewAll!==!1,n=typeof e.sizeBytes=="number",o=n?e.sizeBytes<1024?`${e.sizeBytes}B`:e.sizeBytes<1048576?`${(e.sizeBytes/1024).toFixed(0)}K`:`${(e.sizeBytes/1048576).toFixed(1)}M`:"",l=typeof e.lastActivityAt=="number"?e.lastActivityAt:e.lastModified?Date.parse(e.lastModified):NaN;let a="";if(!Number.isNaN(l)){const y=new Date(l);a=y.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+y.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1})}const c=this._shortenHomePath(e.workingDir),h=this._resolveCaseLabel(e.workingDir,t),f=Array.isArray(e.sources)&&e.sources.includes("live"),d=e.pinned===!0,S=document.createElement("div");S.className="history-item"+(d?" is-pinned":""),S.title=e.workingDir||"";const p=document.createElement("div");p.className="history-item-main",p.addEventListener("click",i?.onActivate||(()=>{f&&this.sessions.has(e.sessionId)?this.selectSession(e.sessionId):this.resumeHistorySession(e.claudeSessionId||e.sessionId,e.workingDir||"",e.name,e.mode,e.resumeId)}));const u=document.createElement("div");u.className="history-item-text";const T=document.createElement("span");if(T.className="history-item-title",d){const y=document.createElement("span");y.className="history-item-pin",y.textContent="\u{1F4CC}",y.setAttribute("aria-label","Pinned"),y.title="Pinned",T.appendChild(y)}T.appendChild(document.createTextNode(this._historyRowLabel(e,c)));const r=document.createElement("div");if(r.className="history-item-badges",e.mode){const y=document.createElement("span");y.className="history-item-badge history-item-badge-mode",y.textContent=e.mode,r.appendChild(y)}const m=this._worktreeLabel(e);if(m){const y=document.createElement("span");y.className="history-item-badge history-item-badge-worktree",y.textContent=m,y.title=e.worktreeRepo?`worktree of ${e.worktreeRepo}`:m,r.appendChild(y)}if(f){const y=document.createElement("span");y.className="history-item-badge history-item-badge-live",y.textContent="LIVE",r.appendChild(y)}const _=document.createElement("span");_.className="history-item-subtitle",h.startsWith("#")&&_.classList.add("is-case"),_.textContent=h,u.append(T),r.childElementCount>0&&u.append(r),u.append(_);const I=document.createElement("span");I.className="history-item-meta",I.textContent=a;const E=document.createElement("button");E.className="history-item-expand",E.type="button",E.setAttribute("aria-haspopup","menu"),E.setAttribute("aria-label","Session actions"),E.setAttribute("aria-expanded","false"),E.textContent="\u22EF",p.append(u,I,E);const w=document.createElement("div");w.className="history-item-detail",w.hidden=!0;const A=document.createElement("div");A.className="history-detail-row";const k=document.createElement("span");k.className="history-detail-label",k.textContent="Prompt";const F=document.createElement("span");F.className="history-detail-value history-detail-prompt",F.textContent=e.firstPrompt||"(no prompt captured)",A.append(k,F);let x=null;if(e.lastPrompt&&e.lastPrompt!==e.firstPrompt){x=document.createElement("div"),x.className="history-detail-row";const y=document.createElement("span");y.className="history-detail-label",y.textContent="Last prompt";const P=document.createElement("span");P.className="history-detail-value history-detail-prompt",P.textContent=e.lastPrompt,x.append(y,P)}const H=document.createElement("div");H.className="history-detail-row";const g=document.createElement("span");g.className="history-detail-label",g.textContent="Path";const R=document.createElement("span");R.className="history-detail-value history-detail-path",R.textContent=c,H.append(g,R);const M=document.createElement("div");M.className="history-detail-row history-detail-meta";const v=[];if(a&&v.push(a),n&&v.push(o),v.push(e.sessionId.slice(0,8)),M.textContent=v.join(" \xB7 "),w.append(A),x&&w.append(x),w.append(H,M),s&&e.projectKey){const y=document.createElement("div");y.className="history-detail-row history-detail-actions";const P=document.createElement("button");P.type="button",P.className="history-view-all-btn",P.textContent="View all in this folder",P.addEventListener("click",B=>{B.stopPropagation(),this.openFolderHistoryModal(e.projectKey,e.workingDir,t)}),y.appendChild(P),w.appendChild(y)}return E.addEventListener("click",y=>{y.stopPropagation(),y.preventDefault(),this._openSessionRowMenu(y.currentTarget,e,t,S,w)}),S.append(p,w),S},_openSessionRowMenu(e,t,i,s,n){if(this._openRowMenuClose)try{this._openRowMenuClose()}catch{}const o=Array.isArray(t.sources)&&t.sources.includes("live")&&this.sessions.has(t.sessionId),l=document.createElement("div");l.className="session-row-menu",l.setAttribute("role","menu");let a=null,c=null,h=null;const f=()=>{document.removeEventListener("mousedown",a,!0),document.removeEventListener("keydown",c,!0),window.removeEventListener("scroll",h,!0),window.removeEventListener("resize",h,!0);try{l.remove()}catch{}this._openRowMenuEl===l&&(this._openRowMenuEl=null,this._openRowMenuClose=null)},d=(_,I,E)=>{const w=document.createElement("button");w.type="button",w.className="session-row-menu-item",w.setAttribute("role","menuitem");const A=document.createElement("span");if(A.className="session-row-menu-label",A.textContent=_,w.appendChild(A),E&&E.sublabel){const k=document.createElement("span");k.className="session-row-menu-sublabel",k.textContent=E.sublabel,w.appendChild(k)}w.addEventListener("click",async k=>{k.stopPropagation(),k.preventDefault(),await I()}),l.appendChild(w)};d(o?"Switch to session":"Resume session",()=>{o?this.selectSession(t.sessionId):this.resumeHistorySession(t.claudeSessionId||t.sessionId,t.workingDir||"",t.name,t.mode,t.resumeId),this.closeSessionManager?.(),f()});const S=t.pinned===!0;d(S?"Unpin session":"Pin to top",async()=>{await this._setSessionPinned(t.sessionId,!S)?(t.pinned=!S,this.showToast(S?"Unpinned":"Pinned to top","success")):this.showToast("Pin failed","error"),f()}),o&&d("Open folder",()=>{this.selectSession(t.sessionId),this.loadFileBrowser?.(t.sessionId),this.closeSessionManager?.(),f()}),t.workingDir&&d("Copy path",async()=>{const _=await this._copyText(t.workingDir);this.showToast(_?"Path copied":"Copy failed",_?"success":"error"),f()}),d("Show details",()=>{const _=s.classList.toggle("expanded");n.hidden=!_,e.setAttribute("aria-expanded",_?"true":"false"),f()}),document.body.appendChild(l);const p=e.getBoundingClientRect(),u=l.getBoundingClientRect(),T=4;let r=p.bottom+T;r+u.height>window.innerHeight&&p.top-T-u.height>=0&&(r=p.top-T-u.height);let m=p.right-u.width;m<T&&(m=T),m+u.width>window.innerWidth-T&&(m=Math.max(T,window.innerWidth-T-u.width)),l.style.top=`${Math.max(T,r)}px`,l.style.left=`${m}px`,a=_=>{l.contains(_.target)||e.contains(_.target)||f()},c=_=>{_.key==="Escape"&&(_.stopPropagation(),f())},h=()=>f(),document.addEventListener("mousedown",a,!0),document.addEventListener("keydown",c,!0),window.addEventListener("scroll",h,!0),window.addEventListener("resize",h,!0),this._openRowMenuEl=l,this._openRowMenuClose=f},async _setSessionPinned(e,t){try{const i=await fetch(`/api/sessions/${encodeURIComponent(e)}/pin`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({pinned:t})});return i.ok?(await i.json())?.success===!0:!1}catch(i){return console.error("[_setSessionPinned]",i),!1}},_HISTORY_INITIAL_COUNT:10,_HISTORY_FETCH_LIMIT:200,_HISTORY_SORT_KEY:"codeman:historySort",async loadHistorySessions(){const e=document.getElementById("historySessions"),t=document.getElementById("historyList");if(!(!e||!t))try{const i=Array.isArray(this.cases)&&this.cases.length>0?Promise.resolve(this.cases):fetch("/api/cases").then(o=>o.ok?o.json():null).then(o=>o?.data||[]).catch(()=>[]),[s,n]=await Promise.all([this._fetchUnifiedSessions(this._HISTORY_FETCH_LIMIT),i]);if(s.length===0){e.style.display="none";return}this._historyAll=s,this._historyCases=n,this._wireHistoryControls(),this._renderHistoryList(),e.style.display=""}catch(i){console.error("[loadHistorySessions]",i),e.style.display="none"}},_wireHistoryControls(){if(this._historyControlsWired)return;const e=document.getElementById("historyFilter"),t=document.getElementById("historySort");if(!(!e&&!t)){if(this._historyControlsWired=!0,t)try{const i=localStorage.getItem(this._HISTORY_SORT_KEY);i&&Array.from(t.options).some(s=>s.value===i)&&(t.value=i)}catch{}e&&(e.addEventListener("input",()=>this._renderHistoryList()),e.addEventListener("keydown",i=>{i.key==="Escape"&&e.value&&(i.stopPropagation(),e.value="",this._renderHistoryList())})),t&&t.addEventListener("change",()=>{try{localStorage.setItem(this._HISTORY_SORT_KEY,t.value)}catch{}this._renderHistoryList()})}},_historyRowMatches(e,t,i){return[e.name,e.workingDir,this._resolveCaseLabel(e.workingDir,i),e.firstPrompt,e.lastPrompt,e.sessionId].some(n=>typeof n=="string"&&n.toLowerCase().includes(t))},_historyRowLabel(e,t){return e.name||e.firstPrompt||t||""},_sortHistoryRows(e,t){const n=t==="name"?a=>this._historyRowLabel(a,this._shortenHomePath(a.workingDir)).toLowerCase():a=>((a.workingDir||"").split("/").pop()||"").toLowerCase(),o=t==="recent"?e.slice():e.slice().sort((a,c)=>n(a).localeCompare(n(c),void 0,{sensitivity:"base",numeric:!0})),l=o.filter(a=>a.pinned);return l.length===0?o:l.concat(o.filter(a=>!a.pinned))},_renderHistoryList(){const e=document.getElementById("historyList");if(!e)return;const t=this._historyAll||[],i=this._historyCases||[],s=document.getElementById("historyCount"),n=(document.getElementById("historyFilter")?.value||"").trim().toLowerCase(),o=document.getElementById("historySort")?.value||"recent",l=n?t.filter(d=>this._historyRowMatches(d,n,i)):t,a=this._sortHistoryRows(l,o),c=!!this._historyExpanded||n.length>0,h=c?a:a.slice(0,this._HISTORY_INITIAL_COUNT);if(e.replaceChildren(),e.classList.toggle("expanded",c),a.length===0){const d=document.createElement("div");d.className="history-empty",d.textContent=`No conversations match "${n}"`,e.appendChild(d)}for(const d of h)e.appendChild(this._buildHistoryItem(d,i));const f=a.length-h.length;if(f>0){const d=document.createElement("button");d.className="history-show-more",d.textContent=`Show ${f} more`,d.addEventListener("click",()=>{this._historyExpanded=!0,this._renderHistoryList()}),e.appendChild(d)}else if(c&&!n&&a.length>this._HISTORY_INITIAL_COUNT){const d=document.createElement("button");d.className="history-show-more",d.textContent="Show less",d.addEventListener("click",()=>{this._historyExpanded=!1,this._renderHistoryList(),e.scrollTop=0}),e.appendChild(d)}s&&(s.textContent=n?`${a.length} of ${t.length}`:a.length>h.length?`${h.length} of ${a.length}`:String(a.length))},_FOLDER_HISTORY_PAGE_SIZE:20,openFolderHistoryModal(e,t,i){this._closeFolderHistoryModal();const s=document.createElement("div");s.className="modal active folder-history-modal",s.id="folderHistoryModal";const n=document.createElement("div");n.className="modal-backdrop",n.addEventListener("click",()=>this._closeFolderHistoryModal());const o=document.createElement("div");o.className="modal-content modal-lg";const l=document.createElement("div");l.className="modal-header";const a=document.createElement("h3");a.textContent="Folder History";const c=document.createElement("div");c.className="folder-history-subtitle",c.textContent=this._shortenHomePath(t);const h=document.createElement("button");h.className="modal-close",h.setAttribute("aria-label","Close"),h.innerHTML="&times;",h.addEventListener("click",()=>this._closeFolderHistoryModal()),l.append(a,h);const f=document.createElement("div");f.className="modal-body";const d=document.createElement("div");d.className="folder-history-list",d.setAttribute("data-loading","true"),d.textContent="Loading...",f.append(c,d),o.append(l,f),s.append(n,o),document.body.appendChild(s),this._folderHistoryState={projectKey:e,workingDir:t,cases:i||[],offset:0,total:null,list:d},this._folderHistoryEscHandler=S=>{S.key==="Escape"&&this._closeFolderHistoryModal()},document.addEventListener("keydown",this._folderHistoryEscHandler),this._loadFolderHistoryPage()},async _loadFolderHistoryPage(){const e=this._folderHistoryState;if(!e)return;const{projectKey:t,cases:i,list:s}=e,n=this._FOLDER_HISTORY_PAGE_SIZE,o=e.offset,l=s.querySelector(".folder-history-more");l&&l.remove(),o===0&&(s.replaceChildren(),s.removeAttribute("data-loading"));try{const a=`/api/history/sessions?projectKey=${encodeURIComponent(t)}&offset=${o}&limit=${n}`,h=await(await fetch(a)).json(),f=h.data?.sessions||[];if(e.total=typeof h.data?.total=="number"?h.data.total:f.length+o,o===0&&f.length===0){const d=document.createElement("div");d.className="folder-history-empty",d.textContent="No conversations found in this folder.",s.appendChild(d);return}for(const d of f)s.appendChild(this._buildHistoryItem(d,i,{showViewAll:!1}));if(e.offset=o+f.length,e.offset<e.total){const d=e.total-e.offset,S=document.createElement("button");S.className="history-show-more folder-history-more",S.textContent=`Show ${Math.min(n,d)} more (${d} remaining)`,S.addEventListener("click",()=>this._loadFolderHistoryPage()),s.appendChild(S)}}catch(a){console.error("[loadFolderHistoryPage]",a);const c=document.createElement("div");c.className="folder-history-empty",c.textContent="Failed to load folder history.",s.appendChild(c)}},_closeFolderHistoryModal(){const e=document.getElementById("folderHistoryModal");e&&e.remove(),this._folderHistoryEscHandler&&(document.removeEventListener("keydown",this._folderHistoryEscHandler),this._folderHistoryEscHandler=null),this._folderHistoryState=null},_resolveResumeName(e,t){if(typeof e=="string"&&e.trim())return e;const i=(t||"").split("/").pop()||"session";let s=1;for(const[,n]of this.sessions){const o=n.name&&n.name.match(/^w(\d+)-/);if(o){const l=parseInt(o[1]);l>=s&&(s=l+1)}}return`w${s}-${i}`},async resumeHistorySession(e,t,i,s,n){document.getElementById("runModeMenu")?.classList.remove("active"),this._closeFolderHistoryModal();try{this.terminal.clear(),this.terminal.writeln(`\x1B[1;32m Resuming conversation ${e.slice(0,8)}...\x1B[0m`);const o=this._resolveResumeName(i,t),a=(this.cases||[]).find(E=>E.path===t)?.name||t.split("/").pop()||"",c=this.loadAppSettingsFromStorage(),h=this.buildEnvOverrides(this.getCaseSettings(a),c),f=this.getEffortSetting(c),d=this.getAdvisorSetting(c),S=s||"claude",p={opencode:"openCodeConfig",pi:"piConfig",grok:"grokConfig",copilot:"copilotConfig",omp:"ompConfig"}[S],u=S==="codex"?n:void 0,T=p?{[p]:{continueSession:!0}}:S==="deepseek"?{deepSeekConfig:{resumeSession:!0}}:u?{codexConfig:{resumeSessionId:u}}:{},r=!!p||S==="deepseek"||!!u,_=await(await fetch("/api/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({workingDir:t,name:o,mode:S,...S==="claude"?{resumeSessionId:e}:{},...T,...Object.keys(h).length>0?{envOverrides:h}:{},...f?{effort:f}:{},...d&&S==="claude"?{advisorModel:d}:{}})})).json();if(!_.success)throw new Error(_.error);const I=_.data.session.id;await fetch(`/api/sessions/${I}/interactive`,{method:"POST"}),S!=="claude"&&r&&e!==I&&fetch(`/api/sessions/${e}?killMux=true`,{method:"DELETE"}).catch(()=>{}),this.terminal.writeln(`\x1B[90m Session ${o} ready\x1B[0m`),await this.selectSession(I),this.terminal.focus()}catch(o){this.terminal.writeln(`\x1B[1;31m Error: ${o.message}\x1B[0m`)}},isTerminalAtBottom(){if(!this.terminal)return!0;const e=this.terminal.buffer.active;return e.viewportY>=e.baseY-2},_syncStickyScrollBaseline(){this._wasAtBottomBeforeWrite=this.isTerminalAtBottom()},_noteTerminalUserScroll(e){e<0?this._lastUserScrollUpAt=performance.now():this.isTerminalAtBottom()&&(this._lastUserScrollUpAt=null)},_maybeLoadMoreHistoryOnScroll(e){if(e>0){this.isTerminalAtBottom()&&this._setHistoryNoticeRevealed?.(null);return}if(e===0||this.terminal?.buffer?.active?.viewportY!==0||this._fullHistoryRepullInFlight||this._isLoadingBuffer)return;const t=this.activeSessionId;Promise.resolve(this._maybeRefetchFullHistory?.()).catch(()=>{}).then(()=>{t&&this.activeSessionId===t&&this._setHistoryNoticeRevealed?.(t)})},_estimateReplayRows(e,t){if(typeof e!="string"||!e)return 0;const i=t>0?t:80,s=e.replace(window.CodemanTerminalInput.REPLAY_ESCAPE_RE,"");let n=0;for(const o of s.split(`
4
+ `)){const l=o.endsWith("\r")?o.length-1:o.length;n+=l>i?Math.ceil(l/i):1}return n},_replayWouldShrinkBuffer(e,t){const i=this.terminal,s=i?.buffer?.active?.length||0;if(!s)return!1;const n=i?.rows||24;return(t??this._estimateReplayRows(e,i?.cols))+n<s},_smoothScrollBy(e){if(!e||(this._smoothScrollPending=(this._smoothScrollPending||0)+e,this._smoothScrollSession=this.activeSessionId,this._smoothScrollFrame))return;const t=()=>{this._smoothScrollFrame=null;const i=this._smoothScrollPending||0;if(!i)return;if(this.activeSessionId!==this._smoothScrollSession){this._smoothScrollPending=0;return}if(Math.abs(i)<1)return;const s=i*.22,n=i>0?Math.max(1,Math.floor(s)):Math.min(-1,Math.ceil(s));this._smoothScrollPending=i-n,this.terminal.scrollLines(n),this._maybeLoadMoreHistoryOnScroll(n),Math.abs(this._smoothScrollPending)>=1&&(this._smoothScrollFrame=requestAnimationFrame(t))};this._smoothScrollFrame=requestAnimationFrame(t)},_forwardScrollToApp(e,t,i){this._terminalViewportAtBottom()||this.terminal.scrollToBottom(),this._sendSyntheticSgrWheel(e,t,i)},_hasRecentUserScrollUp(){return typeof this._lastUserScrollUpAt!="number"?!1:performance.now()-this._lastUserScrollUpAt<window.CodemanTerminalInput.USER_SCROLL_STICKY_SUPPRESS_MS},_startRenderLivenessWatchdog(){this._stopRenderLivenessWatchdog(),this._lastRenderAt=Date.now(),this._lastTerminalWriteAt=0,this._renderLivenessTimer=setInterval(()=>{try{if(typeof CodemanRenderLiveness>"u"||!CodemanRenderLiveness.shouldKickRenderer({wroteAt:this._lastTerminalWriteAt||0,renderedAt:this._lastRenderAt||0,now:Date.now(),visible:document.visibilityState==="visible"&&!!this.terminal?.element?.isConnected}))return;const t=this._kickRenderer();_crashDiag.log(`RENDER STALL: kick=${t}`),this._lastRenderAt=Date.now()}catch{}},RENDER_LIVENESS_POLL_MS)},_stopRenderLivenessWatchdog(){this._renderLivenessTimer&&(clearInterval(this._renderLivenessTimer),this._renderLivenessTimer=null)},_kickRenderer(){try{const e=this.terminal?._core?._renderService,t=e?._renderDebouncer;if(!t||typeof e.refreshRows!="function")return!1;const i=t._animationFrame;if(i===void 0)return!1;try{cancelAnimationFrame(i)}catch{}return t._animationFrame=void 0,e.refreshRows(0,Math.max(0,(this.terminal.rows||1)-1)),!0}catch{return!1}},batchTerminalWrite(e){if(this._terminalOutputSeq=(this._terminalOutputSeq||0)+1,this._lastTerminalWriteAt=Date.now(),this._isLoadingBuffer){this._loadBufferQueue&&this._loadBufferQueue.push({at:performance.now(),data:e});return}if(this.writeFrameScheduled||(this._wasAtBottomBeforeWrite=this.isTerminalAtBottom()),(this.activeSessionId?this.sessions.get(this.activeSessionId):null)?.flickerFilterEnabled??!1){if(e.includes("\x1B[2J")||e.includes("\x1B[H\x1B[J")||e.includes("\x1B[H")&&e.includes("\x1B[?25l")){this.flickerFilterActive=!0,this.flickerFilterBuffer+=e,this.flickerFilterTimeout&&clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=setTimeout(()=>{this.flickerFilterTimeout=null,this.flushFlickerBuffer()},SYNC_WAIT_TIMEOUT_MS);return}if(this.flickerFilterActive){this.flickerFilterBuffer+=e;return}}this.pendingWrites.push(e),this._pendingWritesOutputSeq=this._terminalOutputSeq,this._scheduleTerminalWriteFlush()},_scheduleTerminalWriteFlush(){this._terminalWriteInFlight||this.writeFrameScheduled||this.pendingWrites.length===0||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.writeFrameScheduled=!1,this.flushPendingWrites()}))},flushFlickerBuffer(){this.flickerFilterBuffer&&(this.pendingWrites.push(this.flickerFilterBuffer),this._pendingWritesOutputSeq=this._terminalOutputSeq,this.flickerFilterBuffer="",this.flickerFilterActive=!1,this._scheduleTerminalWriteFlush())},_flushLocalEchoPending(){const e=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),e&&(this._pendingInput+=e)},_updateLocalEchoState(){if(this._mobileImePreviewSessionId!==this.activeSessionId){this._mobileImePreviewSessionId=this.activeSessionId,this._mobileImeCommitOutputSeq=null;try{this._mobileImePreview?.reset?.()}catch{}}const e=this.loadAppSettingsFromStorage(),t=this.activeSessionId?this.sessions.get(this.activeSessionId):null,i=e.localEchoEnabled??MobileDetection.isTouchDevice(),s=!!(i&&t);this._localEchoEnabled&&!s&&this._localEchoOverlay?.clear(),this._localEchoEnabled=s,this._localEchoOverlay&&t&&(t.mode==="opencode"?this._localEchoOverlay.setPrompt({type:"custom",offset:3,find:o=>{try{const l=o.buffer.active,a=window.CodemanTerminalInput.cursorViewportRow(o);if(a===null)return null;const c=l.getLine(l.viewportY+a);if(!c)return null;const f=c.translateToString(!0).indexOf("\u2503");return f>=0?{row:a,col:f}:null}catch{return null}}}):t.mode==="shell"||t.mode==="codex"?(this._localEchoOverlay.clear(),this._localEchoEnabled=!1):this._localEchoOverlay.setPrompt({type:"custom",offset:0,find:o=>{try{const l=o.buffer.active,a=window.CodemanTerminalInput.cursorViewportRow(o);if(a===null)return null;const c=Math.max(0,l.baseY-l.viewportY);for(let h=a;h>=c;h--){const f=l.getLine(l.viewportY+h);if(!f)continue;const S=f.translateToString(!0).lastIndexOf("\u276F");if(S>=0)return{row:h,col:S+2}}return{row:a,col:Math.max(0,Math.min(o.cols-1,l.cursorX))}}catch{return null}}}));let n="off";t&&i&&(t.mode==="codex"?n="predict":t.mode!=="shell"&&(n="buffer")),this._localEchoPolicy=n,n!=="predict"&&this._predictiveEcho?.clearPredictions()},_predictHookOnData(e){if(!(this._localEchoPolicy!=="predict"||!this._predictiveEcho))try{const t=window.CodemanTerminalInput.classifyPredictInput(e);t==="char"?this._predictiveEcho.predictChar(e):t==="backspace"?this._predictiveEcho.predictBackspace():this._predictiveEcho.clearPredictions()}catch{}},_handleCjkInput(e){if(!this.activeSessionId){_crashDiag.log(`CJK send DROP no-session len=${e.length}`);return}typeof KeyboardAccessoryBar<"u"&&KeyboardAccessoryBar.isCtrlArmed?.()&&(e=KeyboardAccessoryBar.consumeCtrl(e)),this._localEchoPolicy==="predict"&&this._predictiveEcho?.clearPredictions(),_crashDiag.log(`CJK send\u2192${this.activeSessionId.slice(0,8)} len=${e.length}`),this._sendInputAsync(this.activeSessionId,e)},_restoreTerminalViewport(e,t){e!=null&&(t!==void 0&&t!==this.activeSessionId||this._isLoadingBuffer||typeof this.terminal?.scrollToLine=="function"&&this.terminal.buffer?.active?.viewportY!==e&&this.terminal.scrollToLine(e))},flushPendingWrites(){if(this._terminalWriteInFlight||this.pendingWrites.length===0||!this.terminal)return;const e=performance.now(),t=this.pendingWrites.join("");this.pendingWrites=[];const i=t.length;i>16384&&_crashDiag.log(`FLUSH: ${(i/1024).toFixed(0)}KB`);const n=(this.activeSessionId&&this.sessions?this.sessions.get(this.activeSessionId):null)?.mode==="codex"?32768:65536;let o=!1;const l=this.terminal.buffer?.active&&!this.isTerminalAtBottom()?this.terminal.buffer.active.viewportY:null,a=this.activeSessionId,c=t.slice(0,n);i>n&&(this.pendingWrites.push(t.slice(n)),o=!0);const h=o?null:this._pendingWritesOutputSeq??null;this._terminalWriteInFlight=!0,this._terminalWriteInFlightBytes=c.length;try{this.terminal.write(c,()=>{this._terminalWriteInFlight=!1,this._terminalWriteInFlightBytes=0,this._restoreTerminalViewport(l,a),this._scheduleTerminalWriteFlush(),this._noteMobileImeAuthoritativeOutput(h,a)})}catch(S){throw this._terminalWriteInFlight=!1,this._terminalWriteInFlightBytes=0,S}const f=o?n:i,d=performance.now()-e;if((d>100||o)&&console.warn(`[CRASH-DIAG] flushPendingWrites: ${d.toFixed(0)}ms, ${(f/1024).toFixed(0)}KB written${o?", rest deferred":""} (total ${(i/1024).toFixed(0)}KB)`),l===null&&this._wasAtBottomBeforeWrite&&!this._hasRecentUserScrollUp()&&this.terminal.scrollToBottom(),this._localEchoOverlay?.rerender(),this._tabCompletionSessionId&&this._tabCompletionSessionId===this.activeSessionId&&this._localEchoOverlay&&!this._localEchoOverlay.pendingText){const S=this._localEchoOverlay,p=this;this.terminal.write("",()=>{if(!p._tabCompletionSessionId)return;S.resetBufferDetection();const u=S.detectBufferText();u?u===p._tabCompletionBaseText?(S.undoDetection(),p._tabCompletionRetries=(p._tabCompletionRetries||0)+1,p._tabCompletionRetries>60&&(p._tabCompletionSessionId=null,p._tabCompletionRetries=0)):(p._tabCompletionSessionId=null,p._tabCompletionRetries=0,p._tabCompletionBaseText=null,p._tabCompletionFallback&&(clearTimeout(p._tabCompletionFallback),p._tabCompletionFallback=null),S.rerender()):(p._tabCompletionRetries=(p._tabCompletionRetries||0)+1,p._tabCompletionRetries>60&&(p._tabCompletionSessionId=null,p._tabCompletionRetries=0))})}},_safeYield(e){let t=!1;const i=()=>{t||(t=!0,e())};requestAnimationFrame(i),setTimeout(i,50),this._workerYield(i)},_workerYield(e){try{if(this._yieldWorker===void 0){const t="onmessage=()=>setTimeout(()=>postMessage(0),0);",i=new Blob([t],{type:"application/javascript"}),s=URL.createObjectURL(i);this._yieldWorker=new Worker(s),URL.revokeObjectURL(s),this._yieldQueue=[],this._yieldWorker.onmessage=()=>{const n=this._yieldQueue.shift();n&&n()}}if(!this._yieldWorker)return;this._yieldQueue.push(e),this._yieldWorker.postMessage(0)}catch{this._yieldWorker=null}},scrollToLastNonEmptyLine(){if(!this.terminal?.buffer?.active){this.terminal?.scrollToBottom?.();return}const e=this.terminal.buffer.active,t=e.length;let i=-1;for(let s=t-1;s>=0;s--)if(e.getLine(s)?.translateToString(!0).trim()){i=s;break}if(i>=0&&typeof this.terminal.scrollToLine=="function"){let s=Math.max(0,i-this.terminal.rows+2);const n=Math.max(0,i);for(;s<n&&!e.getLine(s)?.translateToString(!0).trim();)s++;this.terminal.scrollToLine(s)}else this.terminal.scrollToBottom()},chunkedTerminalWrite(e,t=TERMINAL_CHUNK_SIZE,i,s){const n=++this._chunkedWriteGen,o=this._beginBufferLoad(i);return new Promise(l=>{const a=(p=this._chunkedWriteGen===n)=>({parsedAt:performance.now(),bufferLength:this.terminal?.buffer?.active?.length??0,completed:p});if(!e||e.length===0){this._finishBufferLoad(o,s),l(a());return}const c=e.replace(DEC_SYNC_STRIP_RE,"").replace(OSC52_STRIP_RE,"");if(c.length<=t){this.terminal.write(c,()=>l(a())),this._finishBufferLoad(o,s);return}let h=0;const f=performance.now();let d=0;const S=()=>{if(this._chunkedWriteGen!==n){l(a(!1));return}const p=c.slice(h,h+t);if(h+=p.length,d++,this.terminal.write(p),h>=c.length){this.terminal.write("",()=>{const u=a(),T=u.parsedAt-f;console.log(`[CRASH-DIAG] chunkedTerminalWrite complete: ${c.length} bytes in ${d} chunks, ${T.toFixed(0)}ms parsed`),l(u)}),this._finishBufferLoad(o,s);return}this._safeYield(S)};this._safeYield(S)})},_beginBufferLoad(e){this._bufferLoadSeq===void 0&&(this._bufferLoadSeq=0);const t=e===void 0?`buffer-${++this._bufferLoadSeq}`:e,i=this._bufferLoadOwner===t&&Array.isArray(this._loadBufferQueue);return this._bufferLoadOwner=t,this._isLoadingBuffer=!0,i||(this._loadBufferQueue=[]),t},_finishBufferLoad(e,t){if(e!==void 0&&this._bufferLoadOwner!==e)return!1;const i=this._loadBufferQueue;if(this._isLoadingBuffer=!1,this._loadBufferQueue=null,this._bufferLoadOwner=null,t?.flushQueued&&i&&i.length){const s=typeof t.since=="number"?t.since:0;for(const n of i)n.at<s||this.batchTerminalWrite(n.data)}return!0},_focusedPane(){let e=this._focusedTile;return(!e||e._destroyed||!e.terminal)&&this._tilesOwnTerminal?.()&&(e=this._tileFor(this.activeSessionId)),e&&!e._destroyed&&e.terminal?{terminal:e.terminal,sessionId:e.sessionId,isPrimary:!1,tile:e}:{terminal:this.terminal,sessionId:this.activeSessionId,isPrimary:!0,tile:null}},_noteFocusedTile(e){this._focusedTile=e||null},_forEachTile(e,{grid:t=!0}={}){if(this._splitPane?.terminal&&e(this._splitPane),!(!t||!this._tileGrid?.open))for(const{tile:i}of this._tileGrid.tiles.values())i.terminal&&e(i)},clearTerminal(){this._focusedPane().terminal?.clear()},insertTerminalText(e){if(!this.activeSessionId||!e)return;const t=this._focusedPane?.();if(t&&!t.isPrimary){this._sendInputAsync(t.sessionId,e),t.terminal?.focus();return}this._localEchoPolicy==="predict"&&this._predictiveEcho?.clearPredictions(),this._localEchoEnabled&&this._localEchoOverlay&&!this._echoPassthroughSessions?.has(this.activeSessionId)?this._localEchoOverlay.appendText(e):this.sendInput(e).catch(()=>{}),this.terminal?.focus()},clearTerminalInput(){if(!this.activeSessionId)return;typeof CjkInput<"u"&&CjkInput.clear();const e=this._focusedPane?.();if(e&&!e.isPrimary){this._sendInputAsync(e.sessionId,""),this.showToast?.("Input cleared","success"),e.terminal?.focus();return}if(this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),this._pendingInput="",this._localEchoPolicy==="predict"&&this._predictiveEcho?.clearPredictions(),this._localEchoEnabled&&this._localEchoOverlay){const t=this._localEchoOverlay.getFlushed?.()||{count:0,text:""};this._localEchoOverlay.clear(),this._localEchoOverlay.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId);const i=Array.from(t.text||"").length;i>0&&this.sendInput("\x7F".repeat(i)).catch(()=>{})}else this.sendInput("").catch(()=>{});this.showToast?.("Input cleared","success"),this.terminal?.focus()},async restoreTerminalSize(){const e=this._focusedPane();if(!e.isPrimary){e.tile.fit({force:!0})!==!1?this.showToast(`Terminal restored to ${e.terminal.cols}x${e.terminal.rows}`,"success"):this.detachedSessions?.has(e.sessionId)?this.showToast("This session is sized by its own window","warning"):e.tile._wsReady?this.showToast("Could not determine terminal size","error"):this.showToast("Terminal not connected: its size is sent when it reconnects","warning");return}if(!this.activeSessionId){this.showToast("No active session","warning");return}if(this._tilesOwnTerminal?.())return;if(!this.isSoloWindow&&this.detachedSessions?.has(this.activeSessionId)){this.showToast("This session is sized by its own window","warning");return}const t=this.getTerminalDimensions();if(!t){this.showToast("Could not determine terminal size","error");return}try{await this.sendResize(this.activeSessionId,{force:!0}),this.showToast(`Terminal restored to ${t.cols}x${t.rows}`,"success")}catch(i){console.error("Failed to restore terminal size:",i),this.showToast("Failed to restore terminal size","error")}},sendPendingCtrlL(e){},shouldCopyTerminalSelectionFromShortcut(e){if(!e||e.type!=="keydown"||!e.ctrlKey&&!e.metaKey&&!e.altKey)return!1;const i=typeof this.getShortcutRegistry=="function"&&typeof this.matchesShortcutEvent=="function"?this.getShortcutRegistry().find(s=>s.id==="copy-selection"):null;return i?!i.disabled&&this.matchesShortcutEvent(e,i):!e.altKey&&(e.key||"").toLowerCase()==="c"},cleanedTerminalSelection(e,t={}){const i=t.terminal||this.terminal,s=e??(i?.hasSelection?.()?i.getSelection():"");if(!s)return"";if(i?._core?._selectionService?._activeSelectionMode===3)return s;const n=window.CodemanCopySelection?.clean;if(!n)return s;const o=this._normalisedSelectionRange(i);return n(s,{margin:this._cliGutterColumns(t.sessionId),firstLinePartial:!!o&&o.start.x>0})},_normalisedSelectionRange(e){const t=(e??this.terminal)?.getSelectionPosition?.();if(!t?.start||!t?.end)return null;const{start:i,end:s}=t;return s.y<i.y||s.y===i.y&&s.x<i.x?{start:s,end:i}:{start:i,end:s}},_cliGutterColumns(e){if(!this._copyStripMarginEnabled())return 0;const t=window.__codemanTranscriptGutter;if(!t||typeof t!="object")return 0;const i=this.sessions?.get(e??this.activeSessionId)?.mode,s=i?t[i]:0;return Number.isInteger(s)&&s>0?s:0},_installOsc52Clipboard(e,t=()=>this._isLoadingBuffer){e.parser?.registerOscHandler?.(52,i=>{const s=i.indexOf(";"),n=s>=0?i.slice(s+1):i;if(!n||n==="?"||t())return!0;let o;try{const c=Uint8Array.from(atob(n),h=>h.charCodeAt(0));o=new TextDecoder().decode(c)}catch{return!0}if(!o)return!0;const l=Date.now();if(this._lastOsc52?.text===o&&l-this._lastOsc52.at<OSC52_DEDUPE_MS)return!0;this._lastOsc52={text:o,at:l};const a=document.activeElement;return this._copyText(o).then(c=>{if(a&&a!==document.activeElement&&a.isConnected)try{a.focus()}catch{}c?this.showToast(`Copied to clipboard (${o.length} chars)`,"success"):document.hasFocus?.()&&this._showClipboardFallback?.(o)}),!0})},async copyTerminalSelection(e,t={}){const i=t.terminal||this.terminal,s=this.cleanedTerminalSelection(e,t);if(!s.trim())return i?.clearSelection?.(),this.showToast("Nothing to copy","warning"),!1;const n=await this._copyText(s);return n?(i.clearSelection?.(),this.showToast("Copied to clipboard","success")):this.showToast("Failed to copy","error"),i.focus(),n},_copyStripMarginEnabled(){try{return this.loadAppSettingsFromStorage?.()?.copyStripMargin!==!1}catch{return!0}},_autoCopySelectionEnabled(){try{return this.loadAppSettingsFromStorage?.()?.autoCopySelection===!0}catch{return!1}},async _flushAutoCopySelection(){const e=window.CodemanAutoCopy?.decide;if(!e||!this.terminal)return;const t=this._autoCopySelectionEnabled(),i=t?this.cleanedTerminalSelection():"",s=e({enabled:t,text:i,lastCopied:this._autoCopyLastText,pending:!!this._autoCopyPending});if(this._autoCopyPending=!1,s==="skip")return;if(s==="too-large"){this._autoCopyNotify("Selection too large to copy automatically. Press Ctrl+C.","warning");return}this._autoCopyLastText=i;const n=document.activeElement,o=await this._copyText(i);if(n&&n!==document.activeElement&&n.isConnected&&typeof n.focus=="function")try{n.focus()}catch{}if(!o){this._autoCopyLastText="",this._autoCopyNotify("Auto Copy failed: the browser blocked clipboard access","error");return}this._autoCopyHintShown||(this._autoCopyHintShown=!0,this.showToast("Auto Copy: selection copied","success"))},_autoCopyNotify(e,t){const i=Date.now(),s=this._autoCopyNotifiedAt;s!==void 0&&i-s<1e4||(this._autoCopyNotifiedAt=i,this.showToast(e,t))},_syncMobileHelperTextareaToCursor(){if(!(!MobileDetection.isTouchDevice()||!this.terminal?.element))try{const e=this.terminal.element,t=this.terminal.element.querySelector(".xterm-cursor"),i=this.terminal.element.querySelector(".xterm-screen");if(!(e instanceof HTMLElement)||!(t instanceof HTMLElement)||!(i instanceof HTMLElement))return;const s=t.getBoundingClientRect(),n=i.getBoundingClientRect();if(!s.width&&!s.height)return;const o=Math.max(0,Math.round(s.left-n.left)),l=Math.max(0,Math.round(s.top-n.top));e.style.setProperty("--xterm-helper-left",`${o}px`),e.style.setProperty("--xterm-helper-top",`${l}px`)}catch{}},_isMobileTerminalInputFocused(){const e=document.activeElement;return e===this.terminal?.textarea||e?.classList?.contains("xterm-helper-textarea")||e?.id==="cjkInput"},_classifyMobileTerminalTap(e,t){if(!this._terminalViewportAtBottom())return"history";const i=this._clientPointToCell(e,t);if(!i||!this.terminal)return"input";const s=this.terminal.modes?.mouseTrackingMode;if(!(!!s&&s!=="none")&&!this._shouldReportMouseToCli())return"input";const o=this.terminal.buffer?.active;if(!o?.getLine)return"input";const l=Math.max(1,this.terminal.rows||1),a=[],c=[];let h=!1;for(let _=0;_<l;_++){const I=o.getLine(o.viewportY+_),E=I?.translateToString?.(!0)||"";a.push(E),c.push(!!I?.isWrapped),E.trim()&&(h=!0)}if(!h)return"input";const f=Math.max(0,Math.min(l-1,o.cursorY||0)),d=this.sessions?.get(this.activeSessionId)?.mode||"claude";let S=-1,p=!1;if(d==="opencode")a[f]?.includes("\u2503")&&(S=f);else for(let _=l-1;_>=0;_--){const I=a[_].match(/^\s*[❯›]/);if(!I)continue;const E=a[_].slice(I[0].length).trim(),w=a.some((A,k)=>k!==_&&/^\s+\d+[.)]\s/.test(A));if(/^\d+[.)]\s/.test(E)&&w){p=!0;break}S=_;break}const u=i.row-1;let T=u;for(;T>0&&c[T];)T--;let r=u;for(;r+1<l&&c[r+1];)r++;const m=a.slice(T,r+1).join("");if(d==="claude"&&/\b(?:esc to interrupt|background)\b/i.test(m)||p)return"content";if(S>=0){const _=f>=S?f:S;if(u>=S&&u<=_)return"input"}else if(u===f||u>=Math.max(0,l-window.CodemanTerminalInput.TUI_PROMPT_DEFAULT_ROWS_FROM_BOTTOM))return"input";return"content"},_blurMobileTerminalInput(){const e=document.activeElement;(e===this.terminal?.textarea||e?.classList?.contains("xterm-helper-textarea")||e?.id==="cjkInput")&&e.blur?.()},_installMobileKeyboardDismiss(){if(this._mobileKeyboardDismissHandler)return;let e=0,t=0,i=!1;this._mobileKeyboardDismissStart=s=>{if(s.touches.length!==1){i=!0;return}e=s.touches[0].clientX,t=s.touches[0].clientY,i=!1},this._mobileKeyboardDismissMove=s=>{if(i||!s.touches.length)return;const n=s.touches[0].clientX-e,o=s.touches[0].clientY-t,l=window.CodemanTerminalInput.MOBILE_KEYBOARD_DISMISS_TAP_SLOP;(Math.abs(n)>l||Math.abs(o)>l)&&(i=!0)},this._mobileKeyboardDismissHandler=s=>{if(i||!this._isMobileTerminalInputFocused())return;const n=s.target;!n||typeof n.closest!="function"||n.closest("#terminalContainer")||n.closest(window.CodemanTerminalInput.MOBILE_KEYBOARD_DISMISS_EXEMPT_SELECTOR)||this._blurMobileTerminalInput()},document.addEventListener("touchstart",this._mobileKeyboardDismissStart,{passive:!0}),document.addEventListener("touchmove",this._mobileKeyboardDismissMove,{passive:!0}),document.addEventListener("touchend",this._mobileKeyboardDismissHandler,{passive:!0})},_isActionableMobileTerminalTap(e,t){const i=this._clientPointToCell(e,t),s=this.terminal?.buffer?.active;if(!i||!s?.getLine)return!1;const n=Math.max(1,this.terminal.rows||1),o=[],l=[];for(let r=0;r<n;r++){const m=s.getLine(s.viewportY+r);o.push(m?.translateToString?.(!0)||""),l.push(!!m?.isWrapped)}const a=i.row-1;let c=a;for(;c>0&&l[c];)c--;let h=a;for(;h+1<n&&l[h+1];)h++;const f=o.slice(c,h+1).join(""),d=/\b(?:ctrl\+\w+|shift\+\w+|esc|enter|tab|tap)\s+to\s+(?:expand|collapse|view|open|interrupt|see)\b/i,S=Math.max(0,c-1),p=Math.min(n-1,h+1);for(let r=S;r<=p;r++)if(d.test(o[r]))return!0;const u=o.some(r=>/^\s*[❯›]\s+\d+[.)]\s/.test(r)),T=o.some(r=>/^\s+\d+[.)]\s/.test(r));return u&&T&&/^\s*(?:[❯›]\s*)?\d+[.)]\s/.test(f)},_focusMobileTerminalInput(){this._syncMobileHelperTextareaToCursor();const e=document.getElementById("cjkInput");e?.classList.contains("cjk-input-visible")?e.focus():this.terminal?.focus()},_handleMobileTerminalTap(e,t,i=null){if(!e||!this.terminal)return null;if(this._touchSelectionActive)return this._extendTouchSelection(e.clientX,e.clientY),"select";const s=i??this._classifyMobileTerminalTap(e.clientX,e.clientY),n=this._isActionableMobileTerminalTap(e.clientX,e.clientY);if(!n&&!this._tapIsOnCaretLine(e.clientX,e.clientY)&&this._activateTerminalLinkAtPoint(e.clientX,e.clientY))return"link";if(s==="history")return this._focusMobileTerminalInput(),s;const o=this.terminal.modes?.mouseTrackingMode,l=!!o&&o!=="none",a=s==="content"||t;return a&&l?this._dispatchSyntheticTerminalClick(e.clientX,e.clientY):a&&this._shouldReportMouseToCli()&&this._sendSyntheticSgrTap(e.clientX,e.clientY),s==="content"&&n?this._blurMobileTerminalInput():s==="content"&&t?this._blurMobileTerminalInput():this._focusMobileTerminalInput(),s},_dispatchSyntheticTerminalClick(e,t){const i=this.terminal?.element;if(!i||!Number.isFinite(e)||!Number.isFinite(t))return;const s={bubbles:!0,cancelable:!0,view:window,clientX:e,clientY:t,screenX:e,screenY:t,button:0,detail:1};try{i.dispatchEvent(new MouseEvent("mousedown",{...s,buttons:1})),i.dispatchEvent(new MouseEvent("mouseup",{...s,buttons:0}))}catch{}},_shouldReportMouseToCli(e=this.activeSessionId){return this.sessions?.get(e)?.cliMouseTracking===!0},_terminalViewportAtBottom(e=this.terminal){const t=e?.buffer?.active;return!t||t.viewportY>=t.baseY},_clientPointToCell(e,t,i=this.terminal){if(!i||!Number.isFinite(e)||!Number.isFinite(t))return null;const s=i.element?.querySelector(".xterm-screen"),n=i._core?._renderService?.dimensions?.css?.cell;if(!s||!n?.width||!n?.height)return null;const o=s.getBoundingClientRect(),l=Math.max(1,Math.min(i.cols,Math.floor((e-o.left)/n.width)+1)),a=Math.max(1,Math.min(i.rows,Math.floor((t-o.top)/n.height)+1));return{col:l,row:a}},_sendSyntheticSgrTap(e,t,i={}){const s=i.sessionId||this.activeSessionId,n=i.terminal||this.terminal;if(!s||!this._terminalViewportAtBottom(n))return;const o=this._clientPointToCell(e,t,n);if(!o)return;const l=`\x1B[<0;${o.col};${o.row}M\x1B[<0;${o.col};${o.row}m`;i.ephemeral?this._sendInputEphemeral(s,l):this._sendInputAsync(s,l)},_cliVersionAtLeast(e,t){if(typeof e!="string")return!1;const i=e.trim().replace(/^v/,"").split(".").map(Number);if(i.length!==3||i.some(n=>!Number.isFinite(n)))return!1;const s=t.split(".").map(Number);for(let n=0;n<3;n++)if(i[n]!==s[n])return i[n]>s[n];return!0},_wheelScrollLinesFloat(e){return window.CodemanTerminalInput.wheelDeltaLines(e,this.terminal?.rows)},_shouldForwardTouchToApp(){if(this.loadAppSettingsFromStorage?.()?.terminalWheelLocalScrollback)return!1;const e=this.terminal?.modes?.mouseTrackingMode,t=this.terminal?._core?.coreMouseService?.activeEncoding==="SGR";return!!(e&&e!=="none"&&e!=="x10"&&t)||this._shouldForwardWheelToApp({shiftKey:!1})},_shouldForwardWheelToApp(e,t={}){if(e.shiftKey||this.loadAppSettingsFromStorage?.()?.terminalWheelLocalScrollback)return!1;const i=(t.terminal||this.terminal)?.modes?.mouseTrackingMode;if(i&&i!=="none")return!1;const s=this.sessions?.get(t.sessionId||this.activeSessionId),n=s?.mode||"claude";return n==="copilot"?s?.cliMouseTracking===!0:!(n!=="claude"&&n!=="codex"||n==="claude"&&!this._cliVersionAtLeast(s?.cliVersion,"2.1.187")||s?.cliMouseTracking!==!0)},_sendSyntheticSgrWheel(e,t,i){if(!this.activeSessionId||!i)return;const s=this._clientPointToCell(e,t);if(!s)return;const n=window.CodemanTerminalInput,o=this._wheelTickSession===this.activeSessionId?this._wheelTickGesture:null;o?.dir&&o.dir!==Math.sign(i)&&(this._wheelSgrQueue="");const l=n.wheelTicksForGesture(o,i,performance.now());this._wheelTickSession=this.activeSessionId,this._wheelTickGesture=l.state,this._queueScrollBytes(n.sgrWheelReports(l.ticks,s))},_queueScrollBytes(e){if(!e||!this.activeSessionId)return;const t=e.startsWith("\x1B[<")&&(this._wheelNativeStartSession!==this.activeSessionId||this._wheelNativeStartGeneration!==this._selectGeneration),i=!t&&this._wheelQueueSession===this.activeSessionId&&this._wheelSgrQueue||"";if(this._wheelQueueSession=this.activeSessionId,this._wheelSgrQueue=window.CodemanTerminalInput.coalesceScrollBytes(i,e),t){this._wheelNativeStartSession=this.activeSessionId,this._wheelNativeStartGeneration=this._selectGeneration,this._wheelSgrFlushTimer&&clearTimeout(this._wheelSgrFlushTimer),this._flushWheelSgrQueue();return}this._wheelSgrFlushTimer||(this._wheelSgrFlushTimer=setTimeout(()=>this._flushWheelSgrQueue(),40))},_localScrollbackIsHollow(e={}){const t=this.sessions?.get(e.sessionId||this.activeSessionId)?.mode||"claude",i=window.__codemanTranscriptPageKeys;if(!Array.isArray(i)||!i.includes(t))return!1;const s=(e.terminal||this.terminal)?.buffer?.active;return!s||s.type==="alternate"?!1:((Number.isFinite(e.localRows)?e.localRows:s.baseY)||0)===0},_maybePageCliTranscript(e,t){if(!t||e?.shiftKey||!this.activeSessionId)return!1;if(e?.ctrlKey||Math.abs(e?.deltaX||0)>Math.abs(e?.deltaY||0))return this._localScrollbackIsHollow();if(!this._localScrollbackIsHollow())return!1;if(this.tabAlerts?.get(this.activeSessionId)==="action")return this._logScrollRouting("page-keys-dialog-open"),!0;if(this._codexMenuOpen())return this._logScrollRouting("page-keys-menu-open"),!0;if((this._paneHistoryLines?.get(this.activeSessionId)??0)>0)return this._pageKeyGesture=null,this._wheelSgrQueue="",!1;this._pageKeySession!==this.activeSessionId&&(this._pageKeySession=this.activeSessionId,this._pageKeyGesture=null),this._pageKeyGesture?.dir&&this._pageKeyGesture.dir!==Math.sign(t)&&(this._wheelSgrQueue="");const i=window.CodemanTerminalInput.pageKeysForGesture(this._pageKeyGesture,e,t,this.terminal?.rows,performance.now());return this._pageKeyGesture=i.state,i.keys&&this._queueScrollBytes(i.keys),this._logScrollRouting("page-keys"),!0},_codexMenuOpen(e={}){return this.sessions?.get(e.sessionId||this.activeSessionId)?.mode!=="codex"?!1:window.CodemanTerminalInput.isCodexSelectionMenu(e.terminal||this.terminal)},_logScrollRouting(e){const t=this.activeSessionId||"(none)",i=this.sessions?.get(t),s=!!this.loadAppSettingsFromStorage?.()?.terminalWheelLocalScrollback,n=this.terminal?.modes?.mouseTrackingMode||"none",o=this.terminal?._core?.coreMouseService?.activeEncoding||"unknown",l=i?.cliMouseTracking===!0,a=this.terminal?.buffer?.active?.baseY??-1,c=this._paneHistoryLines?.get(t),h=`${e}|${i?.mode}|${i?.cliVersion}|${s}|${n}|${o}|${l}|${a>0}|${(c??0)>0}`;this._scrollRoutingLogged||(this._scrollRoutingLogged=new Map),this._scrollRoutingLogged.get(t)!==h&&(this._scrollRoutingLogged.set(t,h),console.log(`[scroll] ${t} \u2192 ${e} (mode=${i?.mode||"?"}, cliVersion=${i?.cliVersion||"unknown"}, localScrollbackOptOut=${s}, mouseTracking=${n}, mouseEncoding=${o}, cliMouseTracking=${l}, localScrollbackRows=${a}, paneHistoryLines=${c??"unknown"})`))},_flushWheelSgrQueue(){this._wheelSgrFlushTimer=null;const e=this._wheelSgrQueue;this._wheelSgrQueue="",e&&this.activeSessionId&&this._wheelQueueSession===this.activeSessionId&&this._sendInputEphemeral(this.activeSessionId,e)},_handleDesktopTerminalClick(e,t={}){const i=t.terminal||this.terminal;if(!i||!e?.isTrusted||e.button!==0||e.detail!==1||e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)return;const s=i.modes?.mouseTrackingMode;s&&s!=="none"||this._shouldReportMouseToCli(t.sessionId)&&(i.hasSelection?.()||(t.linkHovered??this._linkHovered)||performance.now()<=(this._trustedTapMouseSuppressUntil||0)||e.target?.closest?.(".xterm-screen")&&this._sendSyntheticSgrTap(e.clientX,e.clientY,t))},_installShiftDragSelection(){const e=this.terminal?.element;!e||e._codemanShiftDragInstalled||(e._codemanShiftDragInstalled=!0,e.addEventListener("mousedown",t=>{if(!t.isTrusted||t.button!==0||!t.shiftKey||t.altKey||t.ctrlKey||t.metaKey||this.terminal?.hasSelection?.())return;const i=this._clientPointToCell(t.clientX,t.clientY);if(!i)return;const s=this.terminal.buffer?.active?.viewportY??0;this.terminal.select(i.col-1,i.row-1+s,0)},!0))},_installMobileTapMouseGuard(){const e=this.terminal?.element;if(!e||e._codemanTapMouseGuardInstalled||typeof MobileDetection<"u"&&MobileDetection.isTouchDevice&&!MobileDetection.isTouchDevice())return;e._codemanTapMouseGuardInstalled=!0;const t=i=>{const s=this._trustedTapMouseSuppressUntil||0;!i.isTrusted||performance.now()>s||(i.preventDefault(),i.stopImmediatePropagation())};e.addEventListener("mousedown",t,!0),e.addEventListener("mouseup",t,!0)},_suppressTrustedTapMouseEvents(){const e=window.CodemanTerminalInput?.TOUCH_COMPAT_MOUSE_SUPPRESS_MS||450;this._trustedTapMouseSuppressUntil=performance.now()+e},increaseFontSize(){if(this._tilesOwnTerminal?.()){this.setTileFontSize(Math.min(this._tileGridFontSize()+2,24));return}const e=this.terminal.options.fontSize||14;this.setFontSize(Math.min(e+2,24))},decreaseFontSize(){if(this._tilesOwnTerminal?.()){this.setTileFontSize(Math.max(this._tileGridFontSize()-2,10));return}const e=this.terminal.options.fontSize||14;this.setFontSize(Math.max(e-2,10))},setFontSize(e){this.terminal.options.fontSize=e,document.getElementById("fontSizeDisplay").textContent=e,this._refitAfterCellSizeChange(),localStorage.setItem("codeman-font-size",e),this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont(),this._forEachTile?.(t=>{t.terminal.options.fontSize=e,t.fit()},{grid:!1})},applyTerminalFontFamily(e){const t=window.CodemanTerminalFont.resolve(e);!this.terminal||this.terminal.options.fontFamily===t||(this.terminal.options.fontFamily=t,this._terminalFontReady=this._awaitTerminalFont().then(()=>{this.terminal?.options?.fontFamily===t&&this._refitAfterCellSizeChange()}),this._refitAfterCellSizeChange(),this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont(),this._forEachTile?.(i=>{i.terminal.options.fontFamily=t,i.fit()}))},applyTerminalFontWeights(e){const{fontWeight:t,fontWeightBold:i}=window.CodemanTerminalFont.resolveWeights(e);if(this.terminal&&!(this.terminal.options.fontWeight===t&&this.terminal.options.fontWeightBold===i)){this.terminal.options.fontWeight=t,this.terminal.options.fontWeightBold=i,this._terminalFontReady=this._awaitTerminalFont().then(()=>{this.terminal?.options?.fontWeight===t&&this._refitAfterCellSizeChange()}),this._refitAfterCellSizeChange(),this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont();for(const[,s]of this.teammateTerminals||[])if(s?.terminal){s.terminal.options.fontWeight=t,s.terminal.options.fontWeightBold=i;try{s.fitAddon?.fit()}catch{}}this._forEachTile?.(s=>{s.terminal.options.fontWeight=t,s.terminal.options.fontWeightBold=i,s.fit()})}},loadFontSize(){const e=localStorage.getItem("codeman-font-size");if(e){const t=parseInt(e,10);t>=10&&t<=24&&(this.terminal.options.fontSize=t,document.getElementById("fontSizeDisplay").textContent=t)}},async _awaitTerminalFont(){try{if(typeof document>"u"||!document.fonts?.load)return;const e=this.terminal?.options?.fontSize||14,t=String(this.terminal?.options?.fontFamily||"").split(",").map(s=>s.trim().replace(/^["']|["']$/g,"")).filter(Boolean).filter(s=>!TERMINAL_FONT_UNMEASURED.has(s.toLowerCase())),i=Promise.all(t.map(s=>document.fonts.load(`${e}px "${s}"`).catch(()=>{}))).then(()=>document.fonts.ready);await Promise.race([i,new Promise(s=>setTimeout(s,TERMINAL_FONT_WAIT_MS))])}catch{}try{this.terminal?._core?._charSizeService?.measure()}catch{}},getTerminalDimensions(){try{const e=window.CodemanTerminalGeometry.clampTerminalDimensions(this.fitAddon?.proposeDimensions()),t=this._keyboardHeldRowsActive?.();return e&&t&&(e.rows=Math.max(e.rows,t)),e}catch{return null}},_keyboardHeldRowsActive(){return this._keyboardHeldRows>0&&typeof KeyboardHandler<"u"&&KeyboardHandler.keyboardVisible?this._keyboardHeldRows:0},_keyboardHoldEligible(e=this.activeSessionId){if(this.loadAppSettingsFromStorage?.()?.keyboardHoldsRows===!1)return!1;const t=e?this.sessions?.get(e):null;if(!t||t.remote||t.docker||t.cliMouseTracking)return!1;const i=window.__codemanKeyboardHoldModes;return Array.isArray(i)&&i.includes(t.mode||"claude")},_reconcileKeyboardHold({resize:e=!0}={}){!this._keyboardHeldRows||this._keyboardHoldEligible()||(this._releaseKeyboardHold(),e&&this.activeSessionId&&this.sendResize(this.activeSessionId)?.catch?.(()=>{}))},_releaseKeyboardHold(){return this._keyboardHeldRows?(this._keyboardHeldRows=0,this._applyKeyboardClip(),!0):!1},_applyKeyboardClip(){const e=this.terminal?.element?.parentElement;if(!e)return;const t=this._keyboardHeldRowsActive()?this.terminal.rows:0,i=t?this.terminal._core?._renderService?.dimensions?.css?.cell?.height:0,s=t?e.clientHeight:0;let n=0;if(i&&s){const o=this.terminal.buffer.active,l=o.viewportY>=o.baseY;let a=-1;if(l){for(let c=t-1;c>=0;c--)if(o.getLine(o.baseY+c)?.translateToString(!0).trim()){a=c;break}}n=window.CodemanTerminalGeometry.keyboardClipPx({rows:t,cellHeight:i,viewHeight:s,cursorRow:o.cursorY,lastContentRow:a,following:l,viewportY:o.viewportY,baseY:o.baseY})}n!==(this._keyboardClipPx||0)&&(this._keyboardClipPx=n,n?e.style.setProperty("--kb-clip",`${n}px`):e.style.removeProperty("--kb-clip")),this._localEchoOverlay?.setRowLimit?.(i&&s?window.CodemanTerminalGeometry.keyboardVisibleRowLimit(n,s,i):null)},syncTerminalGeometry(){if(!this.fitAddon||!this.terminal)return null;try{this._keyboardHeldRowsActive?.()||this.fitAddon.fit()}catch{}const e=this.getTerminalDimensions();return!e||!this._resizeTerminalTo(e)?null:(this._scheduleOverflowAffordanceSync(),e)},_geometryForResizeRequest(){if(!this._paneWidthRefused)return this.syncTerminalGeometry();const e=this.getTerminalDimensions();return!e||!this.terminal||!this._resizeTerminalTo({cols:this.terminal.cols,rows:e.rows})?null:(this._scheduleOverflowAffordanceSync(),e)},_refitAfterCellSizeChange(){if(this.activeSessionId){this.sendResize(this.activeSessionId)?.catch?.(()=>{});return}this.syncTerminalGeometry()},_resizeTerminalTo(e){if(!this.terminal||!e)return null;if(this.terminal.cols===e.cols&&this.terminal.rows===e.rows)return e;try{return this.terminal.resize(e.cols,e.rows),e}catch{return null}},async sendResize(e,t={}){if(!this.isSoloWindow&&this.detachedSessions?.has(e)||this._tilesOwnTerminal?.())return!1;const i=this._geometryForResizeRequest();if(!i)return!1;const s=this._lastResizeDims,n=!s||s.cols!==i.cols||s.rows!==i.rows;this._lastResizeDims={cols:i.cols,rows:i.rows};const o=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():window.innerWidth<600?"mobile":window.innerWidth<768?"tablet":"desktop";if(!t.forceHttp&&this._wsReady&&this._wsSessionId===e)try{const c={t:"z",c:i.cols,r:i.rows,v:o};return t.force&&(c.f=!0),this._ws.send(JSON.stringify(c)),n}catch{}const l={...i,viewportType:o};t.force&&(l.force=!0);const a=await fetch(`/api/sessions/${e}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)});try{const c=(await a.json())?.data??{};this._onPtyGeometryReport(e,c.cols,c.rows)}catch{}return n},_onPtyGeometryReport(e,t,i){if(!this.terminal||e!==this.activeSessionId)return;const s={cols:this.terminal.cols,rows:this.terminal.rows},{adopt:n}=window.CodemanTerminalGeometry.reconcilePtyGeometry(s,{cols:t,rows:i});n&&this._resizeTerminalTo({cols:t,rows:s.rows})&&(this._lastResizeDims={cols:t,rows:s.rows});const o=this.getTerminalDimensions();this._paneWidthRefused=!!o&&Number.isFinite(t)&&t!==o.cols,this._scheduleOverflowAffordanceSync()},_scheduleOverflowAffordanceSync(){if(typeof requestAnimationFrame!="function"){this._syncTerminalOverflowAffordance();return}this._overflowAffordanceFrame||(this._overflowAffordanceFrame=requestAnimationFrame(()=>{this._overflowAffordanceFrame=null,this._syncTerminalOverflowAffordance()}))},_syncTerminalOverflowAffordance(){let e=null,t=!1;try{e=document.getElementById("terminalContainer");const i=e?.querySelector(".xterm-screen");e&&i&&(t=i.getBoundingClientRect().width-e.clientWidth>1)}catch{}if(e?.classList.toggle("term-overflows-x",t),!t||!this._paneWidthRefused){this._paneOwnedElsewhere=!1;return}this._notePaneOwnedElsewhere()},_notePaneOwnedElsewhere(){this._paneOwnedElsewhere||(this._paneOwnedElsewhere=!0,this.showToast("Another device is setting the width \u2014 scroll sideways","info"))},async sendInput(e){!this.activeSessionId||!e||this._sendInputAsync(this.activeSessionId,e,{useMux:!0})},toggleDirInput(){const e=document.querySelector("#dirDisplay").parentElement,t=document.getElementById("dirInput");t.classList.contains("hidden")&&(t.classList.remove("hidden"),e.style.display="none",t.focus())},hideDirInput(){const e=document.querySelector("#dirDisplay").parentElement,t=document.getElementById("dirInput");setTimeout(()=>{t.classList.add("hidden"),e.style.display="";const i=t.value.trim();document.getElementById("dirDisplay").textContent=i||"No directory"},100)},applyTerminalSkin(e){const t={...window.CODEMAN_XTERM_THEMES[e]||window.CODEMAN_XTERM_THEMES["daylight-blue"]},i=window.codemanCurrentSkinIsLight(e)?4.5:1;if(this.terminal){this.terminal.options.minimumContrastRatio=i,this.terminal.options.theme=t,this._localEchoOverlay?.refreshFont(),this._predictiveEcho?.refreshFont();try{this.terminal.refresh(0,this.terminal.rows-1)}catch{}}if(this.teammateTerminals){for(const[,s]of this.teammateTerminals)if(s&&s.terminal){s.terminal.options.minimumContrastRatio=i,s.terminal.options.theme={...t};try{s.terminal.refresh(0,s.terminal.rows-1)}catch{}}}this._forEachTile?.(s=>{s.terminal.options.minimumContrastRatio=i,s.terminal.options.theme={...t};try{s.terminal.refresh(0,s.terminal.rows-1)}catch{}})}}),(function(e){const s={session:"Sessions",event:"Events",file:"Files"};function n(o){if(!Number.isFinite(o))return"";const l=new Date(o);return l.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+l.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1})}e.CodemanSearch={SEARCH_DEBOUNCE_MS:250,SEARCH_LIMIT:60,SOURCE_LABELS:s,formatSearchTime:n}})(window),Object.assign(CodemanApp.prototype,{initSearchPanel(){const e=document.getElementById("searchInput");if(!e||this._searchPanelWired){this._searchPanelWired&&this._populateSearchCaseFilter();return}this._searchPanelWired=!0,this._searchTypes=new Set(["session","event","file"]),this._searchSecondary={caseLabel:"",status:"",days:""},this._searchDebounceTimer=null,this._searchSeq=0,this._searchLastData=null;const t=document.getElementById("searchClearBtn"),i=document.getElementById("searchResults");e.addEventListener("input",()=>{t&&(t.hidden=e.value.length===0),this._scheduleSearch()}),e.addEventListener("keydown",l=>{l.key==="Escape"&&e.value&&(l.stopPropagation(),this._clearSearch())}),t&&t.addEventListener("click",()=>this._clearSearch()),document.querySelectorAll("#searchFilters .search-filter-chip").forEach(l=>{l.addEventListener("click",()=>{const a=l.dataset.typeFilter;this._searchTypes.has(a)&&this._searchTypes.size===1||(this._searchTypes.has(a)?(this._searchTypes.delete(a),l.classList.remove("active")):(this._searchTypes.add(a),l.classList.add("active")),this._runSearch())})});const s=document.getElementById("searchCaseFilter"),n=document.getElementById("searchStatusFilter"),o=document.getElementById("searchDateFilter");s&&s.addEventListener("change",()=>{this._searchSecondary.caseLabel=s.value,this._renderSearch(this._searchLastData)}),n&&n.addEventListener("change",()=>{this._searchSecondary.status=n.value,this._renderSearch(this._searchLastData)}),o&&o.addEventListener("change",()=>{this._searchSecondary.days=o.value,this._renderSearch(this._searchLastData)}),this._populateSearchCaseFilter(),i&&(i.hidden=!0)},_populateSearchCaseFilter(){const e=document.getElementById("searchCaseFilter");if(!e)return;const t=Array.isArray(this.cases)?this.cases:[],i=Array.from(new Set(t.map(o=>o&&o.name).filter(Boolean))).sort(),s=e.value;e.innerHTML="";const n=document.createElement("option");n.value="",n.textContent="All cases",e.appendChild(n);for(const o of i){const l=document.createElement("option");l.value=o,l.textContent="#"+o,e.appendChild(l)}s&&i.includes(s)&&(e.value=s)},_scheduleSearch(){clearTimeout(this._searchDebounceTimer),this._searchDebounceTimer=setTimeout(()=>this._runSearch(),window.CodemanSearch.SEARCH_DEBOUNCE_MS)},_clearSearch(){const e=document.getElementById("searchInput"),t=document.getElementById("searchClearBtn");e&&(e.value=""),t&&(t.hidden=!0),this._searchLastData=null,this._renderSearch(null)},async _runSearch(){const e=document.getElementById("searchInput");if(!e)return;const t=e.value.trim();if(t.length===0){this._searchLastData=null,this._renderSearch(null);return}const i=Array.from(this._searchTypes),s=new URLSearchParams;s.set("q",t.slice(0,200)),i.length>0&&i.length<3&&s.set("types",i.join(",")),s.set("limit",String(window.CodemanSearch.SEARCH_LIMIT));const n=++this._searchSeq,o=await this._apiJson("/api/search?"+s.toString());n===this._searchSeq&&(o?this._searchLastData=o:this._searchLastData={query:t,groups:[],totalResults:0,truncated:!1,_error:!0},this._renderSearch(this._searchLastData))},_applySecondaryFilters(e){const{caseLabel:t,status:i,days:s}=this._searchSecondary;let n=e;if(t){const o="#"+t;n=n.filter(l=>(l.sessionName||"").includes(o)||l.sessionName===t)}if(i){const o=new Set((this.sessionOrder||[]).concat(Object.keys(this.sessions||{})));n=n.filter(l=>{const a=o.has(l.sessionId);return i==="active"?a:!a})}if(s){const o=Date.now()-Number(s)*24*60*60*1e3;n=n.filter(l=>Number.isFinite(l.timestamp)&&l.timestamp>=o)}return n},_renderSearch(e){const t=document.getElementById("searchResults"),i=document.getElementById("historyHeader")||document.getElementById("historyTitle"),s=document.getElementById("historyList");if(!t)return;const n=!!e;if(i&&(i.style.display=n?"none":""),s&&(s.style.display=n?"none":""),t.innerHTML="",!e){t.hidden=!0;return}if(t.hidden=!1,e._error){const a=document.createElement("div");a.className="search-empty",a.textContent="Search unavailable \u2014 check the query and try again.",t.appendChild(a);return}const o=(e.groups||[]).map(a=>({type:a.type,results:this._applySecondaryFilters(a.results||[])})).filter(a=>a.results.length>0);if(o.reduce((a,c)=>a+c.results.length,0)===0){const a=document.createElement("div");a.className="search-empty",a.textContent='No results for "'+(e.query||"")+'"',t.appendChild(a);return}for(const a of o){const c=document.createElement("div");c.className="search-group-header";const h=document.createElement("span");h.className="search-group-label",h.textContent=window.CodemanSearch.SOURCE_LABELS[a.type]||a.type;const f=document.createElement("span");f.className="search-group-count",f.textContent=String(a.results.length),c.append(h,f),t.appendChild(c);for(const d of a.results)t.appendChild(this._buildSearchResultCard(d))}if(e.truncated){const a=document.createElement("div");a.className="search-truncated",a.textContent="Showing the top matches \u2014 refine your search to narrow results.",t.appendChild(a)}},_buildSearchResultCard(e){const t=document.createElement("div");t.className="search-result-card",t.dataset.type=e.type,t.tabIndex=0,t.setAttribute("role","button");const i=document.createElement("div");i.className="search-result-top";const s=e.jumpTo&&e.jumpTo.kind==="resume-session",n=document.createElement("span");n.className="search-result-badge search-badge-"+e.type+(s?" search-badge-past":""),n.textContent=s?"Resume":(window.CodemanSearch.SOURCE_LABELS[e.type]||e.type).replace(/s$/,"");const o=document.createElement("span");o.className="search-result-name",o.textContent=e.sessionName||e.sessionId||"(session)";const l=document.createElement("span");l.className="search-result-time",l.textContent=window.CodemanSearch.formatSearchTime(e.timestamp),i.append(n,o,l);const a=document.createElement("div");a.className="search-result-snippet",a.textContent=e.snippet||"",t.append(i,a);const c=()=>this._jumpToSearchResult(e);return t.addEventListener("click",c),t.addEventListener("keydown",h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),c())}),t},_jumpToSearchResult(e){const t=e&&e.jumpTo;if(t){if(t.kind==="resume-session"){this.resumeHistorySession(t.claudeSessionId||t.sessionId,t.workingDir||"",e.sessionName);return}typeof this.hideWelcome=="function"&&this.hideWelcome();try{t.kind==="run-summary"?this.openRunSummary(t.sessionId):t.kind==="file-preview"?this.openFilePreview(t.relativePath||"",t.sessionId,t.targetId||null):this.selectSession(t.sessionId)}catch(i){console.error("[search] jump failed",i)}}}});
Binary file
Binary file