aicodeman 1.35.0 → 1.41.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 (316) hide show
  1. package/README.md +33 -7
  2. package/dist/attachment-registry.d.ts +6 -0
  3. package/dist/attachment-registry.d.ts.map +1 -1
  4. package/dist/attachment-registry.js +9 -3
  5. package/dist/attachment-registry.js.map +1 -1
  6. package/dist/cli-agent.d.ts +225 -0
  7. package/dist/cli-agent.d.ts.map +1 -0
  8. package/dist/cli-agent.js +767 -0
  9. package/dist/cli-agent.js.map +1 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +8 -32
  12. package/dist/cli.js.map +1 -1
  13. package/dist/codeman-credentials.d.ts +27 -0
  14. package/dist/codeman-credentials.d.ts.map +1 -0
  15. package/dist/codeman-credentials.js +66 -0
  16. package/dist/codeman-credentials.js.map +1 -0
  17. package/dist/config/cli-registry/patterns.d.ts +6 -0
  18. package/dist/config/cli-registry/patterns.d.ts.map +1 -1
  19. package/dist/config/cli-registry/patterns.js +13 -0
  20. package/dist/config/cli-registry/patterns.js.map +1 -1
  21. package/dist/config/cli-registry/schema.d.ts +15 -0
  22. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  23. package/dist/config/cli-registry/schema.js +63 -2
  24. package/dist/config/cli-registry/schema.js.map +1 -1
  25. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  26. package/dist/config/cli-registry/stock.js +180 -7
  27. package/dist/config/cli-registry/stock.js.map +1 -1
  28. package/dist/config/cli-registry/types.d.ts +105 -7
  29. package/dist/config/cli-registry/types.d.ts.map +1 -1
  30. package/dist/deepseek-route-config.d.ts +110 -0
  31. package/dist/deepseek-route-config.d.ts.map +1 -0
  32. package/dist/deepseek-route-config.js +477 -0
  33. package/dist/deepseek-route-config.js.map +1 -0
  34. package/dist/git-clone.d.ts.map +1 -1
  35. package/dist/git-clone.js +4 -0
  36. package/dist/git-clone.js.map +1 -1
  37. package/dist/git-workspace-status.d.ts +31 -5
  38. package/dist/git-workspace-status.d.ts.map +1 -1
  39. package/dist/git-workspace-status.js +49 -29
  40. package/dist/git-workspace-status.js.map +1 -1
  41. package/dist/image-watcher.d.ts.map +1 -1
  42. package/dist/image-watcher.js +6 -2
  43. package/dist/image-watcher.js.map +1 -1
  44. package/dist/mcp-sync-targets.d.ts +34 -0
  45. package/dist/mcp-sync-targets.d.ts.map +1 -0
  46. package/dist/mcp-sync-targets.js +55 -0
  47. package/dist/mcp-sync-targets.js.map +1 -0
  48. package/dist/mcp-sync.d.ts +2 -1
  49. package/dist/mcp-sync.d.ts.map +1 -1
  50. package/dist/mcp-sync.js +62 -1
  51. package/dist/mcp-sync.js.map +1 -1
  52. package/dist/model-config-resolvers.d.ts +29 -0
  53. package/dist/model-config-resolvers.d.ts.map +1 -0
  54. package/dist/model-config-resolvers.js +34 -0
  55. package/dist/model-config-resolvers.js.map +1 -0
  56. package/dist/session-display-model.d.ts +110 -0
  57. package/dist/session-display-model.d.ts.map +1 -0
  58. package/dist/session-display-model.js +154 -0
  59. package/dist/session-display-model.js.map +1 -0
  60. package/dist/session.d.ts +145 -8
  61. package/dist/session.d.ts.map +1 -1
  62. package/dist/session.js +290 -39
  63. package/dist/session.js.map +1 -1
  64. package/dist/subagent-watcher.d.ts.map +1 -1
  65. package/dist/subagent-watcher.js +29 -6
  66. package/dist/subagent-watcher.js.map +1 -1
  67. package/dist/templates/case-template.md +2 -0
  68. package/dist/tmux-manager.d.ts +5 -0
  69. package/dist/tmux-manager.d.ts.map +1 -1
  70. package/dist/tmux-manager.js +47 -22
  71. package/dist/tmux-manager.js.map +1 -1
  72. package/dist/tui/tui-client.d.ts +3 -17
  73. package/dist/tui/tui-client.d.ts.map +1 -1
  74. package/dist/tui/tui-client.js +3 -44
  75. package/dist/tui/tui-client.js.map +1 -1
  76. package/dist/types/session.d.ts +28 -1
  77. package/dist/types/session.d.ts.map +1 -1
  78. package/dist/types/session.js.map +1 -1
  79. package/dist/types/tools.d.ts +1 -1
  80. package/dist/types/tools.d.ts.map +1 -1
  81. package/dist/utils/deepseek-cli-resolver.d.ts +8 -0
  82. package/dist/utils/deepseek-cli-resolver.d.ts.map +1 -1
  83. package/dist/utils/deepseek-cli-resolver.js +18 -2
  84. package/dist/utils/deepseek-cli-resolver.js.map +1 -1
  85. package/dist/utils/index.d.ts +1 -0
  86. package/dist/utils/index.d.ts.map +1 -1
  87. package/dist/utils/index.js +1 -0
  88. package/dist/utils/index.js.map +1 -1
  89. package/dist/utils/process-exit-wait.d.ts +40 -0
  90. package/dist/utils/process-exit-wait.d.ts.map +1 -0
  91. package/dist/utils/process-exit-wait.js +68 -0
  92. package/dist/utils/process-exit-wait.js.map +1 -0
  93. package/dist/web/launch-defaults.d.ts +22 -0
  94. package/dist/web/launch-defaults.d.ts.map +1 -0
  95. package/dist/web/launch-defaults.js +46 -0
  96. package/dist/web/launch-defaults.js.map +1 -0
  97. package/dist/web/paste-image-gc.d.ts +46 -6
  98. package/dist/web/paste-image-gc.d.ts.map +1 -1
  99. package/dist/web/paste-image-gc.js +106 -32
  100. package/dist/web/paste-image-gc.js.map +1 -1
  101. package/dist/web/public/admin-ui.js.gz +0 -0
  102. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  103. package/dist/web/public/app.6f8552e1.js +43 -0
  104. package/dist/web/public/app.6f8552e1.js.br +0 -0
  105. package/dist/web/public/app.6f8552e1.js.gz +0 -0
  106. package/dist/web/public/approvals-ui.js.gz +0 -0
  107. package/dist/web/public/{constants.d95fade9.js → constants.bc9c1f63.js} +1276 -127
  108. package/dist/web/public/constants.bc9c1f63.js.br +0 -0
  109. package/dist/web/public/constants.bc9c1f63.js.gz +0 -0
  110. package/dist/web/public/cron-ui.js.gz +0 -0
  111. package/dist/web/public/entrance-animations.js +491 -43
  112. package/dist/web/public/entrance-animations.js.br +0 -0
  113. package/dist/web/public/entrance-animations.js.gz +0 -0
  114. package/dist/web/public/git-status-ui.js +55 -9
  115. package/dist/web/public/git-status-ui.js.br +0 -0
  116. package/dist/web/public/git-status-ui.js.gz +0 -0
  117. package/dist/web/public/home-sessions.js +13 -9
  118. package/dist/web/public/home-sessions.js.br +0 -0
  119. package/dist/web/public/home-sessions.js.gz +0 -0
  120. package/dist/web/public/host-wake-ui.js.gz +0 -0
  121. package/dist/web/public/i18n.a9840ea2.js +2 -0
  122. package/dist/web/public/i18n.a9840ea2.js.br +0 -0
  123. package/dist/web/public/i18n.a9840ea2.js.gz +0 -0
  124. package/dist/web/public/{image-input.a216cf9e.js → image-input.e00471c6.js} +21 -9
  125. package/dist/web/public/image-input.e00471c6.js.br +0 -0
  126. package/dist/web/public/image-input.e00471c6.js.gz +0 -0
  127. package/dist/web/public/index.html +250 -59
  128. package/dist/web/public/index.html.br +0 -0
  129. package/dist/web/public/index.html.gz +0 -0
  130. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  131. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
  132. package/dist/web/public/{mobile-handlers.23a85db1.js → mobile-handlers.0ef9c311.js} +20 -0
  133. package/dist/web/public/mobile-handlers.0ef9c311.js.br +0 -0
  134. package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
  135. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  136. package/dist/web/public/mobile-overview.js.gz +0 -0
  137. package/dist/web/public/mobile.111b187d.css +1 -0
  138. package/dist/web/public/mobile.111b187d.css.br +0 -0
  139. package/dist/web/public/mobile.111b187d.css.gz +0 -0
  140. package/dist/web/public/{notification-manager.50bb87d8.js → notification-manager.feb82c04.js} +19 -2
  141. package/dist/web/public/notification-manager.feb82c04.js.br +0 -0
  142. package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
  143. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  144. package/dist/web/public/{panels-ui.6a5898d9.js → panels-ui.71846fcb.js} +4 -4
  145. package/dist/web/public/panels-ui.71846fcb.js.br +0 -0
  146. package/dist/web/public/panels-ui.71846fcb.js.gz +0 -0
  147. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  148. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  149. package/dist/web/public/readmymind-ui.js.gz +0 -0
  150. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  151. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  152. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  153. package/dist/web/public/session-lineage.js +229 -86
  154. package/dist/web/public/session-lineage.js.br +0 -0
  155. package/dist/web/public/session-lineage.js.gz +0 -0
  156. package/dist/web/public/session-ui.f731602c.js +100 -0
  157. package/dist/web/public/session-ui.f731602c.js.br +0 -0
  158. package/dist/web/public/session-ui.f731602c.js.gz +0 -0
  159. package/dist/web/public/settings-ui.4e33390f.js +97 -0
  160. package/dist/web/public/settings-ui.4e33390f.js.br +0 -0
  161. package/dist/web/public/settings-ui.4e33390f.js.gz +0 -0
  162. package/dist/web/public/spreadsheet-preview-worker.js +290 -0
  163. package/dist/web/public/spreadsheet-preview-worker.js.br +0 -0
  164. package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
  165. package/dist/web/public/spreadsheet-preview.af82fa2f.js +555 -0
  166. package/dist/web/public/spreadsheet-preview.af82fa2f.js.br +0 -0
  167. package/dist/web/public/spreadsheet-preview.af82fa2f.js.gz +0 -0
  168. package/dist/web/public/spreadsheet-xlsx-core.js +1006 -0
  169. package/dist/web/public/spreadsheet-xlsx-core.js.br +0 -0
  170. package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
  171. package/dist/web/public/styles.81a72906.css +1 -0
  172. package/dist/web/public/styles.81a72906.css.br +0 -0
  173. package/dist/web/public/styles.81a72906.css.gz +0 -0
  174. package/dist/web/public/{subagent-windows.e6ca799f.js → subagent-windows.07277a58.js} +7 -5
  175. package/dist/web/public/subagent-windows.07277a58.js.br +0 -0
  176. package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
  177. package/dist/web/public/sw.js +2 -2
  178. package/dist/web/public/sw.js.br +0 -0
  179. package/dist/web/public/sw.js.gz +0 -0
  180. package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
  181. package/dist/web/public/{tab-rail-resize.94cd59f0.js → tab-rail-resize.a5867793.js} +1 -1
  182. package/dist/web/public/tab-rail-resize.a5867793.js.br +0 -0
  183. package/dist/web/public/{tab-rail-resize.94cd59f0.js.gz → tab-rail-resize.a5867793.js.gz} +0 -0
  184. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js +1 -0
  185. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.br +0 -0
  186. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
  187. package/dist/web/public/terminal-split.js +146 -649
  188. package/dist/web/public/terminal-split.js.br +0 -0
  189. package/dist/web/public/terminal-split.js.gz +0 -0
  190. package/dist/web/public/terminal-tile.js +1688 -0
  191. package/dist/web/public/terminal-tile.js.br +0 -0
  192. package/dist/web/public/terminal-tile.js.gz +0 -0
  193. package/dist/web/public/terminal-ui.b7267005.js +2 -0
  194. package/dist/web/public/terminal-ui.b7267005.js.br +0 -0
  195. package/dist/web/public/terminal-ui.b7267005.js.gz +0 -0
  196. package/dist/web/public/tile-grid.js +2895 -0
  197. package/dist/web/public/tile-grid.js.br +0 -0
  198. package/dist/web/public/tile-grid.js.gz +0 -0
  199. package/dist/web/public/ultracode-panel.js.gz +0 -0
  200. package/dist/web/public/ultracode-windows.js +9 -6
  201. package/dist/web/public/ultracode-windows.js.br +0 -0
  202. package/dist/web/public/ultracode-windows.js.gz +0 -0
  203. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  204. package/dist/web/public/vendor/exceljs.min.js +44 -0
  205. package/dist/web/public/vendor/exceljs.min.js.br +0 -0
  206. package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
  207. package/dist/web/public/vendor/fflate.min.js +1 -0
  208. package/dist/web/public/vendor/fflate.min.js.br +0 -0
  209. package/dist/web/public/vendor/fflate.min.js.gz +0 -0
  210. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  211. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  212. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  213. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  214. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  215. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  216. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js +4 -0
  217. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.br +0 -0
  218. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
  219. package/dist/web/public/vendor/xterm.css.gz +0 -0
  220. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  221. package/dist/web/public/{voice-input.c4b51eb6.js → voice-input.2342c37b.js} +64 -10
  222. package/dist/web/public/voice-input.2342c37b.js.br +0 -0
  223. package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
  224. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  225. package/dist/web/public/webview-tabs.js +9 -1
  226. package/dist/web/public/webview-tabs.js.br +0 -0
  227. package/dist/web/public/webview-tabs.js.gz +0 -0
  228. package/dist/web/routes/cli-registry-routes.d.ts +23 -4
  229. package/dist/web/routes/cli-registry-routes.d.ts.map +1 -1
  230. package/dist/web/routes/cli-registry-routes.js +95 -8
  231. package/dist/web/routes/cli-registry-routes.js.map +1 -1
  232. package/dist/web/routes/file-routes.d.ts +7 -0
  233. package/dist/web/routes/file-routes.d.ts.map +1 -1
  234. package/dist/web/routes/file-routes.js +34 -4
  235. package/dist/web/routes/file-routes.js.map +1 -1
  236. package/dist/web/routes/git-status-routes.d.ts.map +1 -1
  237. package/dist/web/routes/git-status-routes.js +33 -6
  238. package/dist/web/routes/git-status-routes.js.map +1 -1
  239. package/dist/web/routes/mcp-sync-routes.d.ts +7 -2
  240. package/dist/web/routes/mcp-sync-routes.d.ts.map +1 -1
  241. package/dist/web/routes/mcp-sync-routes.js +10 -3
  242. package/dist/web/routes/mcp-sync-routes.js.map +1 -1
  243. package/dist/web/routes/reboot-restore-routes.js +1 -1
  244. package/dist/web/routes/reboot-restore-routes.js.map +1 -1
  245. package/dist/web/routes/session-routes.d.ts +18 -0
  246. package/dist/web/routes/session-routes.d.ts.map +1 -1
  247. package/dist/web/routes/session-routes.js +154 -69
  248. package/dist/web/routes/session-routes.js.map +1 -1
  249. package/dist/web/routes/status-telemetry-routes.d.ts +3 -0
  250. package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
  251. package/dist/web/routes/status-telemetry-routes.js +12 -0
  252. package/dist/web/routes/status-telemetry-routes.js.map +1 -1
  253. package/dist/web/routes/system-routes.d.ts.map +1 -1
  254. package/dist/web/routes/system-routes.js +13 -0
  255. package/dist/web/routes/system-routes.js.map +1 -1
  256. package/dist/web/schemas.d.ts +30 -0
  257. package/dist/web/schemas.d.ts.map +1 -1
  258. package/dist/web/schemas.js +43 -0
  259. package/dist/web/schemas.js.map +1 -1
  260. package/dist/web/server.d.ts +6 -1
  261. package/dist/web/server.d.ts.map +1 -1
  262. package/dist/web/server.js +47 -21
  263. package/dist/web/server.js.map +1 -1
  264. package/dist/web/session-listener-wiring.d.ts +1 -0
  265. package/dist/web/session-listener-wiring.d.ts.map +1 -1
  266. package/dist/web/session-listener-wiring.js +11 -0
  267. package/dist/web/session-listener-wiring.js.map +1 -1
  268. package/package.json +6 -4
  269. package/scripts/postinstall.js +16 -0
  270. package/skills/codeman/SKILL.md +6 -0
  271. package/README.zh-CN.md +0 -1139
  272. package/dist/web/public/app.b9516c7b.js +0 -43
  273. package/dist/web/public/app.b9516c7b.js.br +0 -0
  274. package/dist/web/public/app.b9516c7b.js.gz +0 -0
  275. package/dist/web/public/constants.d95fade9.js.br +0 -0
  276. package/dist/web/public/constants.d95fade9.js.gz +0 -0
  277. package/dist/web/public/i18n.52f5b7cc.js +0 -1
  278. package/dist/web/public/i18n.52f5b7cc.js.br +0 -0
  279. package/dist/web/public/i18n.52f5b7cc.js.gz +0 -0
  280. package/dist/web/public/image-input.a216cf9e.js.br +0 -0
  281. package/dist/web/public/image-input.a216cf9e.js.gz +0 -0
  282. package/dist/web/public/mobile-handlers.23a85db1.js.br +0 -0
  283. package/dist/web/public/mobile-handlers.23a85db1.js.gz +0 -0
  284. package/dist/web/public/mobile.1aa4952d.css +0 -1
  285. package/dist/web/public/mobile.1aa4952d.css.br +0 -0
  286. package/dist/web/public/mobile.1aa4952d.css.gz +0 -0
  287. package/dist/web/public/notification-manager.50bb87d8.js.br +0 -0
  288. package/dist/web/public/notification-manager.50bb87d8.js.gz +0 -0
  289. package/dist/web/public/panels-ui.6a5898d9.js.br +0 -0
  290. package/dist/web/public/panels-ui.6a5898d9.js.gz +0 -0
  291. package/dist/web/public/session-ui.6bddf916.js +0 -89
  292. package/dist/web/public/session-ui.6bddf916.js.br +0 -0
  293. package/dist/web/public/session-ui.6bddf916.js.gz +0 -0
  294. package/dist/web/public/settings-ui.6e798b7b.js +0 -97
  295. package/dist/web/public/settings-ui.6e798b7b.js.br +0 -0
  296. package/dist/web/public/settings-ui.6e798b7b.js.gz +0 -0
  297. package/dist/web/public/styles.2d175c60.css +0 -1
  298. package/dist/web/public/styles.2d175c60.css.br +0 -0
  299. package/dist/web/public/styles.2d175c60.css.gz +0 -0
  300. package/dist/web/public/subagent-windows.e6ca799f.js.br +0 -0
  301. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  302. package/dist/web/public/tab-rail-resize.94cd59f0.js.br +0 -0
  303. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js +0 -1
  304. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.br +0 -0
  305. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.gz +0 -0
  306. package/dist/web/public/terminal-ui.a4535311.js +0 -2
  307. package/dist/web/public/terminal-ui.a4535311.js.br +0 -0
  308. package/dist/web/public/terminal-ui.a4535311.js.gz +0 -0
  309. package/dist/web/public/upload.html +0 -155
  310. package/dist/web/public/upload.html.br +0 -0
  311. package/dist/web/public/upload.html.gz +0 -0
  312. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js +0 -4
  313. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js.br +0 -0
  314. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js.gz +0 -0
  315. package/dist/web/public/voice-input.c4b51eb6.js.br +0 -0
  316. package/dist/web/public/voice-input.c4b51eb6.js.gz +0 -0
@@ -283,12 +283,14 @@ Object.assign(CodemanApp.prototype, {
283
283
  wizardRect = wizardContent.getBoundingClientRect();
284
284
  }
285
285
 
286
- // Read tab rects for normal mode (only tabs that are actually needed)
286
+ // Read tab rects for normal mode (only tabs that are actually needed).
287
+ // Only a painted row is cached: a row a search or filter hid has no line
288
+ // (_paintedSessionTab), rather than one drawn from the viewport's corner.
287
289
  if (!wizardOpen) {
288
290
  for (const { agentId } of visibleSubagentWindows) {
289
291
  const parentSessionId = this.subagentParentMap.get(agentId);
290
292
  if (!parentSessionId || rects.has('tab:' + parentSessionId)) continue;
291
- const tab = document.querySelector(`.session-tab[data-id="${parentSessionId}"]`);
293
+ const tab = this._paintedSessionTab(parentSessionId);
292
294
  if (tab) rects.set('tab:' + parentSessionId, tab.getBoundingClientRect());
293
295
  }
294
296
  }
@@ -397,7 +399,7 @@ Object.assign(CodemanApp.prototype, {
397
399
 
398
400
  const tabRect = rects.get('tab:' + parentSessionId);
399
401
  if (!tabRect) {
400
- // Tab not in DOM (might be scrolled out or session closed)
402
+ // Tab not painted (session closed, collapsed group, or hidden by a search)
401
403
  continue;
402
404
  }
403
405
 
@@ -691,8 +693,8 @@ Object.assign(CodemanApp.prototype, {
691
693
  }
692
694
  }
693
695
 
694
- // Get parent TAB element for spawn animation
695
- const parentTab = parentSessionId ? document.querySelector(`.session-tab[data-id="${parentSessionId}"]`) : null;
696
+ // Get parent TAB element for spawn animation (a hidden row spawns normally)
697
+ const parentTab = this._paintedSessionTab(parentSessionId);
696
698
 
697
699
  // Create window element
698
700
  const win = document.createElement('div');
@@ -26,7 +26,7 @@
26
26
  // not the current one, so the old constant key meant that cleanup never deleted
27
27
  // anything — hashed assets from every release ever deployed accumulated in one
28
28
  // bucket until the origin hit its storage quota.
29
- const BUILD_ID = '1562378ee72a';
29
+ const BUILD_ID = '904fc9253db5';
30
30
  const CACHE_NAME = `codeman-${BUILD_ID}`;
31
31
 
32
32
  // Reverse-proxy base path: the worker is served at `<base>/sw.js`, so its own
@@ -48,7 +48,7 @@ const B = (p) => (p && p[0] === '/' ? SW_BASE + p : p);
48
48
  // handler caches every successful GET at runtime, but the precache warmed
49
49
  // nothing while looking like it did. Deriving it from the same manifest that
50
50
  // renames the files is the only thing that keeps the two from drifting again.
51
- const HASHED_ASSETS = ["styles.2d175c60.css", "mobile.1aa4952d.css", "constants.d95fade9.js", "i18n.52f5b7cc.js", "mobile-handlers.23a85db1.js", "voice-input.c4b51eb6.js", "notification-manager.50bb87d8.js", "keyboard-accessory.c1e7c7b7.js", "input-cjk.8bc46081.js", "mobile-ime-preview.2dbaf262.js", "terminal-keycode229-recovery.fb91b25b.js", "sanitize-html.e7147e76.js", "tab-layout-browser.065fcba4.js", "app.b9516c7b.js", "tab-rail-resize.94cd59f0.js", "terminal-ui.a4535311.js", "respawn-ui.ff0dae4c.js", "ralph-panel.b350e2ef.js", "settings-ui.6e798b7b.js", "panels-ui.6a5898d9.js", "session-ui.6bddf916.js", "ralph-wizard.b6c0dd19.js", "api-client.c9b1cddc.js", "subagent-windows.e6ca799f.js", "image-input.a216cf9e.js", "vendor/xterm-zerolag-input.bbb5f84c.js", "vendor/xterm-predictive-echo.ae5e3d5d.js"];
51
+ const HASHED_ASSETS = ["styles.81a72906.css", "mobile.111b187d.css", "constants.bc9c1f63.js", "i18n.a9840ea2.js", "mobile-handlers.0ef9c311.js", "voice-input.2342c37b.js", "notification-manager.feb82c04.js", "keyboard-accessory.c1e7c7b7.js", "input-cjk.8bc46081.js", "mobile-ime-preview.2dbaf262.js", "terminal-keycode229-recovery.af09f99a.js", "sanitize-html.e7147e76.js", "tab-layout-browser.065fcba4.js", "app.6f8552e1.js", "tab-rail-resize.a5867793.js", "terminal-ui.b7267005.js", "respawn-ui.ff0dae4c.js", "ralph-panel.b350e2ef.js", "settings-ui.4e33390f.js", "panels-ui.71846fcb.js", "session-ui.f731602c.js", "ralph-wizard.b6c0dd19.js", "api-client.c9b1cddc.js", "subagent-windows.07277a58.js", "image-input.e00471c6.js", "spreadsheet-preview.af82fa2f.js", "vendor/xterm-zerolag-input.0b69623c.js", "vendor/xterm-predictive-echo.ae5e3d5d.js"];
52
52
 
53
53
  // Core app shell -- cached on install for instant startup
54
54
  const APP_SHELL = [
Binary file
Binary file
@@ -1 +1 @@
1
- "use strict";Object.assign(CodemanApp.prototype,{_getTabRailMinimumTerminalWidth(){const t=this.terminal?._core?._renderService?.dimensions?.css?.cell?.width;return Number.isFinite(t)&&t>0?Math.ceil(t*40+24):420},_getTabRailBounds(){const t=document.querySelector(".main");return{viewportWidth:window.innerWidth,mainWidth:t?.clientWidth||window.innerWidth,minTerminalWidth:this._getTabRailMinimumTerminalWidth()}},_getCurrentTabRailWidth(){const t=Number.parseFloat(document.documentElement.style.getPropertyValue("--tab-rail-width"));if(Number.isFinite(t))return t;const e=document.getElementById("tabRail")?.getBoundingClientRect?.().width;return Number.isFinite(e)&&e>0?e:window.CodemanTabRail?.DEFAULT_WIDTH||256},readTabRailWidthSetting(){const t=document.getElementById("appSettingsTabRailWidth");return t?t.value==="custom"?Number(t.dataset.currentWidth)||this._getCurrentTabRailWidth():Number(t.value)||window.CodemanTabRail?.DEFAULT_WIDTH||256:this._getCurrentTabRailWidth()},syncTabRailWidthSetting(t){const e=document.getElementById("appSettingsTabRailWidth");if(!e)return;const i=Math.round(t);if(e.dataset.currentWidth=String(i),e.querySelector(`option[value="${i}"]`)){e.value=String(i);return}const n=e.querySelector('option[value="custom"]');n&&(n.textContent=`Custom (${i}px)`),e.value="custom"},_setTabRailWidth(t){const e=window.CodemanTabRail;if(!e)return 256;const i=e.resolveWidth({width:t}),a=this._getTabRailBounds(),n=e.resolveWidth({width:i,...a}),h=e.resolveWidth({width:e.MAX_WIDTH,...a}),r=document.documentElement;r.style.setProperty("--tab-rail-width",`${n}px`);const o=r.classList.contains("tab-rail-compact"),s=n<240;if(r.classList.toggle("tab-rail-compact",s),r.classList.toggle("tab-rail-tight",n<288),o!==s){const d=this._tallTabsEnabled;this.applyTabWrapSettings?.(),d!==void 0&&this._tallTabsEnabled!==d||this._fullRenderSessionTabs?.()}const l=document.getElementById("tabRailResizeHandle");return l&&(l.setAttribute("aria-valuemax",String(h)),l.setAttribute("aria-valuenow",String(n))),this.syncTabRailWidthSetting(i),n},_persistTabRailWidth(t){const e=this.loadAppSettingsFromStorage();e.tabRailWidth!==t&&(e.tabRailWidth=t,this.saveAppSettingsToStorage(e))},_claimTabRailResize(){this._tabRailResizeOwnsObserver=!0,clearTimeout(this._tabRailResizeWatchdog),clearTimeout(this._tabRailReleaseTimer),this._tabRailReleaseRaf&&cancelAnimationFrame(this._tabRailReleaseRaf),this._armTabRailResizeWatchdog(),this._resizeRaf&&cancelAnimationFrame(this._resizeRaf),this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeRaf=null,this._resizeTimeout=null},_armTabRailResizeWatchdog(){this._tabRailResizeWatchdog=setTimeout(()=>{if(this._tabRailResizeWatchdog=null,document.body.classList.contains("tab-rail-resizing")){this._armTabRailResizeWatchdog();return}this._tabRailResizeOwnsObserver=!1},1e3)},_releaseTabRailResize(){clearTimeout(this._tabRailResizeWatchdog),this._tabRailResizeWatchdog=null;const t=()=>{clearTimeout(this._tabRailReleaseTimer),this._tabRailReleaseTimer=null,this._tabRailReleaseRaf=null,this._tabRailResizeOwnsObserver=!1};typeof requestAnimationFrame=="function"?(this._tabRailReleaseRaf=requestAnimationFrame(()=>{this._tabRailReleaseRaf=requestAnimationFrame(t)}),this._tabRailReleaseTimer=setTimeout(t,250)):t()},_scheduleTabRailSettle(t,e=t){clearTimeout(this._tabRailSettleTimer),this._tabRailSettleTimer=setTimeout(async()=>{this._tabRailSettleTimer=null,this._persistTabRailWidth(e);try{this.activeSessionId&&this.sendResize?await this.sendResize(this.activeSessionId):this.syncTerminalGeometry?.(),this._updateConnectionLinesImmediate?.()}catch(i){console.warn("Failed to resize terminal after rail resize:",i)}finally{this._releaseTabRailResize()}},150)},_defaultTabRailWidth(){return document.documentElement.dataset.tabRailDetail!=="simple"?window.CodemanTabRail?.RICH_DEFAULT_WIDTH??320:window.CodemanTabRail?.DEFAULT_WIDTH??256},applyTabRailWidth(t={}){const i=this.loadAppSettingsFromStorage().tabRailWidth??this._defaultTabRailWidth(),a=window.CodemanTabRail?.resolveWidth({width:i})??256;t.settle&&this._claimTabRailResize();const n=this._setTabRailWidth(a);return t.persist!==!1&&i!==a&&this._persistTabRailWidth(a),t.settle&&this._scheduleTabRailSettle(n,a),n},_applyTabRailPointerWidth(t){const e=document.querySelector(".main");if(!e)return this._getCurrentTabRailWidth();const i=this._getCurrentTabRailWidth(),a=this._setTabRailWidth(t-e.getBoundingClientRect().left);let n=null;try{n=this.fitAddon?.proposeDimensions?.()}catch{}return n&&n.cols<40?this._setTabRailWidth(i):a},_queueTabRailPointerWidth(t){this._tabRailPendingClientX=t,!this._tabRailPointerRaf&&(this._tabRailPointerRaf=requestAnimationFrame(()=>{this._tabRailPointerRaf=null,this._tabRailDragWidth=this._applyTabRailPointerWidth(this._tabRailPendingClientX)}))},_finishTabRailDrag(t,e){if(!document.body.classList.contains("tab-rail-resizing"))return;this._tabRailPointerRaf&&(cancelAnimationFrame(this._tabRailPointerRaf),this._tabRailPointerRaf=null,this._tabRailDragWidth=this._applyTabRailPointerWidth(this._tabRailPendingClientX)),document.body.classList.remove("tab-rail-resizing");const i=document.getElementById("tabRailResizeShield");i&&(i.hidden=!0);try{t.hasPointerCapture?.(e)&&t.releasePointerCapture(e)}catch{}const a=window.CodemanTabRail?.resolveWidth({width:this._tabRailDragWidth})??this._tabRailDragWidth;this._scheduleTabRailSettle(this._tabRailDragWidth||this._getCurrentTabRailWidth(),a)},_onTabRailKeyDown(t){const e=window.CodemanTabRail?.resolveKeyboardWidth({key:t.key,shiftKey:t.shiftKey,currentWidth:this._getCurrentTabRailWidth(),defaultWidth:this._defaultTabRailWidth?.(),...this._getTabRailBounds()});if(e==null)return;t.preventDefault(),this._claimTabRailResize();const i=this._setTabRailWidth(e);this._scheduleTabRailSettle(i,window.CodemanTabRail.resolveWidth({width:e}))},initTabRailResize(){const t=document.getElementById("tabRailResizeHandle");if(!t||t.dataset.ready==="1")return;t.dataset.ready="1",this.applyTabRailWidth(),t.addEventListener("pointerdown",i=>{if(i.button!==0)return;i.preventDefault(),this.closeTabRailActionMenu(),this._claimTabRailResize(),this._tabRailDragWidth=this._getCurrentTabRailWidth(),this._tabRailPendingClientX=i.clientX,document.body.classList.add("tab-rail-resizing");const a=document.getElementById("tabRailResizeShield");a&&(a.hidden=!1);try{t.setPointerCapture(i.pointerId)}catch{document.body.classList.remove("tab-rail-resizing"),a&&(a.hidden=!0),this._releaseTabRailResize()}}),t.addEventListener("pointermove",i=>{t.hasPointerCapture?.(i.pointerId)&&this._queueTabRailPointerWidth(i.clientX)}),t.addEventListener("pointerup",i=>this._finishTabRailDrag(t,i.pointerId)),t.addEventListener("pointercancel",i=>this._finishTabRailDrag(t,i.pointerId)),t.addEventListener("lostpointercapture",i=>this._finishTabRailDrag(t,i.pointerId)),t.addEventListener("keydown",i=>this._onTabRailKeyDown(i)),t.addEventListener("dblclick",i=>{i.preventDefault(),this._claimTabRailResize();const a=this._defaultTabRailWidth?.()??(window.CodemanTabRail?.DEFAULT_WIDTH||256),n=this._setTabRailWidth(a);this._scheduleTabRailSettle(n,a)});let e=null;window.addEventListener("resize",()=>{clearTimeout(e),e=setTimeout(()=>{this.applyTabOrientation?.(),this.applyTabRailWidth({persist:!1})},100)})},closeTabRailActionMenu(t={}){const e=document.querySelector(".tab-rail-action-menu:not(.tab-layout-group-action-menu)"),i=this._tabRailActionMenuTrigger;e?.remove(),this._tabRailActionMenuOutside&&(document.removeEventListener("pointerdown",this._tabRailActionMenuOutside,!0),this._tabRailActionMenuOutside=null),this._tabRailActionMenuViewport&&(window.removeEventListener("resize",this._tabRailActionMenuViewport),this._tabRailActionMenuViewport=null),this._tabRailActionMenuTrigger=null,t.restoreFocus&&i?.focus?.()},openTabRailActionMenu(t,e){t.preventDefault(),t.stopPropagation(),this.closeTabRailActionMenu();const i=t.currentTarget,a=document.createElement("div");a.className="tab-rail-action-menu",a.setAttribute("role","menu"),a.setAttribute("aria-label","Session actions");const n=this.loadAppSettingsFromStorage(),h=[{label:"Session options",run:()=>this.openSessionOptions(e)},...this._tabRefMoveActions?.({kind:"session",id:e})||[],...n.showTabDetachButton||this.detachedSessions?.has(e)?[{label:"Open in a new window",run:()=>this.detachSession(e)}]:[],{label:"Close session",className:"danger",run:()=>this.requestCloseSession(e)}];for(const s of h){const l=document.createElement("button");l.type="button",l.setAttribute("role","menuitem"),l.textContent=s.label,s.className&&(l.className=s.className),l.addEventListener("click",()=>{this.closeTabRailActionMenu(),s.run()}),a.appendChild(l)}document.body.appendChild(a);const r=i.getBoundingClientRect(),o=a.getBoundingClientRect();a.style.left=`${Math.max(8,Math.min(r.right-o.width,window.innerWidth-o.width-8))}px`,a.style.top=`${Math.max(8,Math.min(r.bottom+4,window.innerHeight-o.height-8))}px`,this._tabRailActionMenuTrigger=i,this._tabRailActionMenuOutside=s=>{!a.contains(s.target)&&s.target!==i&&this.closeTabRailActionMenu()},document.addEventListener("pointerdown",this._tabRailActionMenuOutside,!0),this._tabRailActionMenuViewport=()=>this.closeTabRailActionMenu(),window.addEventListener("resize",this._tabRailActionMenuViewport,{once:!0}),a.addEventListener("keydown",s=>{const l=[...a.querySelectorAll("button")],d=l.indexOf(document.activeElement);if(s.key==="Escape")s.preventDefault(),this.closeTabRailActionMenu({restoreFocus:!0});else if(s.key==="ArrowDown"||s.key==="ArrowUp"){s.preventDefault();const c=s.key==="ArrowDown"?1:-1;l[(d+c+l.length)%l.length]?.focus()}}),a.querySelector("button")?.focus()}});
1
+ "use strict";Object.assign(CodemanApp.prototype,{_getTabRailMinimumTerminalWidth(){const t=this.terminal?._core?._renderService?.dimensions?.css?.cell?.width;return Number.isFinite(t)&&t>0?Math.ceil(t*40+24):420},_getTabRailBounds(){const t=document.querySelector(".main");return{viewportWidth:window.innerWidth,mainWidth:t?.clientWidth||window.innerWidth,minTerminalWidth:this._getTabRailMinimumTerminalWidth()}},_getCurrentTabRailWidth(){const t=Number.parseFloat(document.documentElement.style.getPropertyValue("--tab-rail-width"));if(Number.isFinite(t))return t;const e=document.getElementById("tabRail")?.getBoundingClientRect?.().width;return Number.isFinite(e)&&e>0?e:window.CodemanTabRail?.DEFAULT_WIDTH||256},readTabRailWidthSetting(){const t=document.getElementById("appSettingsTabRailWidth");return t?t.value==="custom"?Number(t.dataset.currentWidth)||this._getCurrentTabRailWidth():Number(t.value)||window.CodemanTabRail?.DEFAULT_WIDTH||256:this._getCurrentTabRailWidth()},syncTabRailWidthSetting(t){const e=document.getElementById("appSettingsTabRailWidth");if(!e)return;const i=Math.round(t);if(e.dataset.currentWidth=String(i),e.querySelector(`option[value="${i}"]`)){e.value=String(i);return}const n=e.querySelector('option[value="custom"]');n&&(n.textContent=`Custom (${i}px)`),e.value="custom"},_setTabRailWidth(t){const e=window.CodemanTabRail;if(!e)return 256;const i=e.resolveWidth({width:t}),a=this._getTabRailBounds(),n=e.resolveWidth({width:i,...a}),h=e.resolveWidth({width:e.MAX_WIDTH,...a}),r=document.documentElement;r.style.setProperty("--tab-rail-width",`${n}px`);const o=r.classList.contains("tab-rail-compact"),s=n<240;if(r.classList.toggle("tab-rail-compact",s),r.classList.toggle("tab-rail-tight",n<288),o!==s){const d=this._tallTabsEnabled;this.applyTabWrapSettings?.(),d!==void 0&&this._tallTabsEnabled!==d||this._fullRenderSessionTabs?.()}const l=document.getElementById("tabRailResizeHandle");return l&&(l.setAttribute("aria-valuemax",String(h)),l.setAttribute("aria-valuenow",String(n))),this.syncTabRailWidthSetting(i),n},_persistTabRailWidth(t){const e=this.loadAppSettingsFromStorage();e.tabRailWidth!==t&&(e.tabRailWidth=t,this.saveAppSettingsToStorage(e))},_claimTabRailResize(){this._tabRailResizeOwnsObserver=!0,clearTimeout(this._tabRailResizeWatchdog),clearTimeout(this._tabRailReleaseTimer),this._tabRailReleaseRaf&&cancelAnimationFrame(this._tabRailReleaseRaf),this._armTabRailResizeWatchdog(),this._resizeRaf&&cancelAnimationFrame(this._resizeRaf),this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeRaf=null,this._resizeTimeout=null},_armTabRailResizeWatchdog(){this._tabRailResizeWatchdog=setTimeout(()=>{if(this._tabRailResizeWatchdog=null,document.body.classList.contains("tab-rail-resizing")){this._armTabRailResizeWatchdog();return}this._tabRailResizeOwnsObserver=!1},1e3)},_releaseTabRailResize(){clearTimeout(this._tabRailResizeWatchdog),this._tabRailResizeWatchdog=null;const t=()=>{clearTimeout(this._tabRailReleaseTimer),this._tabRailReleaseTimer=null,this._tabRailReleaseRaf=null,this._tabRailResizeOwnsObserver=!1};typeof requestAnimationFrame=="function"?(this._tabRailReleaseRaf=requestAnimationFrame(()=>{this._tabRailReleaseRaf=requestAnimationFrame(t)}),this._tabRailReleaseTimer=setTimeout(t,250)):t()},_scheduleTabRailSettle(t,e=t){clearTimeout(this._tabRailSettleTimer),this._tabRailSettleTimer=setTimeout(async()=>{this._tabRailSettleTimer=null,this._persistTabRailWidth(e);try{this.activeSessionId&&this.sendResize?await this.sendResize(this.activeSessionId):this.syncTerminalGeometry?.(),this._updateConnectionLinesImmediate?.()}catch(i){console.warn("Failed to resize terminal after rail resize:",i)}finally{this._releaseTabRailResize()}},150)},_defaultTabRailWidth(){return document.documentElement.dataset.tabRailDetail!=="simple"?window.CodemanTabRail?.RICH_DEFAULT_WIDTH??320:window.CodemanTabRail?.DEFAULT_WIDTH??256},applyTabRailWidth(t={}){const i=this.loadAppSettingsFromStorage().tabRailWidth??this._defaultTabRailWidth(),a=window.CodemanTabRail?.resolveWidth({width:i})??256;t.settle&&this._claimTabRailResize();const n=this._setTabRailWidth(a);return t.persist!==!1&&i!==a&&this._persistTabRailWidth(a),t.settle&&this._scheduleTabRailSettle(n,a),n},_applyTabRailPointerWidth(t){const e=document.querySelector(".main");if(!e)return this._getCurrentTabRailWidth();const i=this._getCurrentTabRailWidth(),a=this._setTabRailWidth(t-e.getBoundingClientRect().left);let n=null;try{n=this.fitAddon?.proposeDimensions?.()}catch{}return n&&n.cols<40?this._setTabRailWidth(i):a},_queueTabRailPointerWidth(t){this._tabRailPendingClientX=t,!this._tabRailPointerRaf&&(this._tabRailPointerRaf=requestAnimationFrame(()=>{this._tabRailPointerRaf=null,this._tabRailDragWidth=this._applyTabRailPointerWidth(this._tabRailPendingClientX)}))},_finishTabRailDrag(t,e){if(!document.body.classList.contains("tab-rail-resizing"))return;this._tabRailPointerRaf&&(cancelAnimationFrame(this._tabRailPointerRaf),this._tabRailPointerRaf=null,this._tabRailDragWidth=this._applyTabRailPointerWidth(this._tabRailPendingClientX)),document.body.classList.remove("tab-rail-resizing");const i=document.getElementById("tabRailResizeShield");i&&(i.hidden=!0);try{t.hasPointerCapture?.(e)&&t.releasePointerCapture(e)}catch{}const a=window.CodemanTabRail?.resolveWidth({width:this._tabRailDragWidth})??this._tabRailDragWidth;this._scheduleTabRailSettle(this._tabRailDragWidth||this._getCurrentTabRailWidth(),a)},_onTabRailKeyDown(t){const e=window.CodemanTabRail?.resolveKeyboardWidth({key:t.key,shiftKey:t.shiftKey,currentWidth:this._getCurrentTabRailWidth(),defaultWidth:this._defaultTabRailWidth?.(),...this._getTabRailBounds()});if(e==null)return;t.preventDefault(),this._claimTabRailResize();const i=this._setTabRailWidth(e);this._scheduleTabRailSettle(i,window.CodemanTabRail.resolveWidth({width:e}))},initTabRailResize(){const t=document.getElementById("tabRailResizeHandle");if(!t||t.dataset.ready==="1")return;t.dataset.ready="1",this.applyTabRailWidth(),t.addEventListener("pointerdown",i=>{if(i.button!==0)return;i.preventDefault(),this.closeTabRailActionMenu(),this._claimTabRailResize(),this._tabRailDragWidth=this._getCurrentTabRailWidth(),this._tabRailPendingClientX=i.clientX,document.body.classList.add("tab-rail-resizing");const a=document.getElementById("tabRailResizeShield");a&&(a.hidden=!1);try{t.setPointerCapture(i.pointerId)}catch{document.body.classList.remove("tab-rail-resizing"),a&&(a.hidden=!0),this._releaseTabRailResize()}}),t.addEventListener("pointermove",i=>{t.hasPointerCapture?.(i.pointerId)&&this._queueTabRailPointerWidth(i.clientX)}),t.addEventListener("pointerup",i=>this._finishTabRailDrag(t,i.pointerId)),t.addEventListener("pointercancel",i=>this._finishTabRailDrag(t,i.pointerId)),t.addEventListener("lostpointercapture",i=>this._finishTabRailDrag(t,i.pointerId)),t.addEventListener("keydown",i=>this._onTabRailKeyDown(i)),t.addEventListener("dblclick",i=>{i.preventDefault(),this._claimTabRailResize();const a=this._defaultTabRailWidth?.()??(window.CodemanTabRail?.DEFAULT_WIDTH||256),n=this._setTabRailWidth(a);this._scheduleTabRailSettle(n,a)});let e=null;window.addEventListener("resize",()=>{clearTimeout(e),e=setTimeout(()=>{this.applyTabOrientation?.(),this.applyTabRailWidth({persist:!1})},100)})},closeTabRailActionMenu(t={}){const e=document.querySelector(".tab-rail-action-menu:not(.tab-layout-group-action-menu)"),i=this._tabRailActionMenuTrigger;e?.remove(),this._tabRailActionMenuOutside&&(document.removeEventListener("pointerdown",this._tabRailActionMenuOutside,!0),this._tabRailActionMenuOutside=null),this._tabRailActionMenuViewport&&(window.removeEventListener("resize",this._tabRailActionMenuViewport),this._tabRailActionMenuViewport=null),this._tabRailActionMenuTrigger=null,t.restoreFocus&&i?.focus?.()},openTabRailActionMenu(t,e){t.preventDefault(),t.stopPropagation(),this.closeTabRailActionMenu();const i=t.currentTarget,a=document.createElement("div");a.className="tab-rail-action-menu",a.setAttribute("role","menu"),a.setAttribute("aria-label","Session actions");const n=this.loadAppSettingsFromStorage(),h=[{label:"Session options",run:()=>this.openSessionOptions(e)},...this._tabRefMoveActions?.({kind:"session",id:e})||[],...(this.tabDetachButtonEnabled?.(n)??n.showTabDetachButton)||this.detachedSessions?.has(e)?[{label:"Open in a new window",run:()=>this.detachSession(e)}]:[],{label:"Close session",className:"danger",run:()=>this.requestCloseSession(e)}];for(const s of h){const l=document.createElement("button");l.type="button",l.setAttribute("role","menuitem"),l.textContent=s.label,s.className&&(l.className=s.className),l.addEventListener("click",()=>{this.closeTabRailActionMenu(),s.run()}),a.appendChild(l)}document.body.appendChild(a);const r=i.getBoundingClientRect(),o=a.getBoundingClientRect();a.style.left=`${Math.max(8,Math.min(r.right-o.width,window.innerWidth-o.width-8))}px`,a.style.top=`${Math.max(8,Math.min(r.bottom+4,window.innerHeight-o.height-8))}px`,this._tabRailActionMenuTrigger=i,this._tabRailActionMenuOutside=s=>{!a.contains(s.target)&&s.target!==i&&this.closeTabRailActionMenu()},document.addEventListener("pointerdown",this._tabRailActionMenuOutside,!0),this._tabRailActionMenuViewport=()=>this.closeTabRailActionMenu(),window.addEventListener("resize",this._tabRailActionMenuViewport,{once:!0}),a.addEventListener("keydown",s=>{const l=[...a.querySelectorAll("button")],d=l.indexOf(document.activeElement);if(s.key==="Escape")s.preventDefault(),this.closeTabRailActionMenu({restoreFocus:!0});else if(s.key==="ArrowDown"||s.key==="ArrowUp"){s.preventDefault();const c=s.key==="ArrowDown"?1:-1;l[(d+c+l.length)%l.length]?.focus()}}),a.querySelector("button")?.focus()}});
@@ -0,0 +1 @@
1
+ "use strict";(function(f){"use strict";function T(o,t){const s=Array.from(o),d=Array.from(t);let r=0;const y=Math.min(s.length,d.length);for(;r<y&&s[r]===d[r];)r+=1;return{deleted:s.length-r,inserted:d.slice(r).join("")}}function D(o){const t=o?.textarea,s=o?.emitRecovered;if(!t?.addEventListener||!t?.removeEventListener||typeof s!="function")return null;const d=o.isScreenReaderMode,r=o.setTimer||f.setTimeout.bind(f),y=o.clearTimer||f.clearTimeout.bind(f);let i=!1,p=0,x=0,v=!1;const m=[];let g=()=>{};function j(){for(const e of m.splice(0)){if(e.timer!==null){try{y(e.timer)}catch{}e.timer=null}S(e)}}function C(){for(const e of m.splice(0))if(e.active=!1,e.timer!==null){try{y(e.timer)}catch{}e.timer=null}}function S(e){const n=m.indexOf(e);if(n!==-1&&m.splice(n,1),e.timer=null,!(!e.active||i)&&(e.active=!1,!(p>e.snapshot)))try{s(e.data)}catch{}}function k(){p+=1}function M(e){i||e?.type!=="keydown"||(g(e),j(),x=p)}function w(e){if(i||v||e?.isComposing||e.inputType!=="insertText")return;const n=e.data;if(typeof n!="string"||n==="")return;try{if(d?.())return}catch{return}const c={data:n,snapshot:x??p,active:!0,timer:null};m.push(c);try{c.timer=r(()=>S(c),0)}catch{C()}}function O(){let e;try{e=o.getCompositionHelper?.()}catch{return null}const n=e?._handleAnyTextareaChanges,c=e?._coreService;if(typeof n!="function"||typeof c?.triggerDataEvent!="function")return null;let h=t.value;const u=new Set;function R(){if(i||e._isComposing)return;const l=t.value;if(l===h)return;const{deleted:a,inserted:E}=T(h,l);h=l;try{for(let z=0;z<a;z+=1)c.triggerDataEvent("\x7F",!0);E&&(e._dataAlreadySent=E,c.triggerDataEvent(E,!0))}catch{}}return e._handleAnyTextareaChanges=function(){if(i)return n.call(this);u.size===0&&h!==t.value&&(h=t.value);const a={id:null};u.add(a),a.id=r(()=>{u.delete(a),R()},0)},g=l=>{if(u.size!==0){for(const a of u)try{y(a.id)}catch{}u.clear(),!(e._isSendingComposition&&![229,20,16,17,18].includes(l?.keyCode))&&R()}},()=>{g=()=>{},e._handleAnyTextareaChanges!==n&&(e._handleAnyTextareaChanges=n)}}const b=O();function A(){i||(v=!0,C())}function L(){i||(v=!1)}function _(){if(!i){i=!0,C();try{b?.()}catch{}try{t.removeEventListener("input",w,!0),t.removeEventListener("compositionstart",A,!0),t.removeEventListener("compositionend",L,!0)}catch{}}}try{t.addEventListener("input",w,!0),t.addEventListener("compositionstart",A,!0),t.addEventListener("compositionend",L,!0)}catch{return _(),null}return Object.freeze({handleKeyEvent:M,notifyCanonicalData:k,destroy:_})}f.CodemanKeyCode229Recovery=Object.freeze({create:D,editBetween:T})})(typeof window<"u"?window:globalThis);