aicodeman 1.45.0 → 1.46.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 (283) hide show
  1. package/README.md +26 -6
  2. package/dist/agent-codex-identity.d.ts +26 -0
  3. package/dist/agent-codex-identity.d.ts.map +1 -0
  4. package/dist/agent-codex-identity.js +253 -0
  5. package/dist/agent-codex-identity.js.map +1 -0
  6. package/dist/agent-inspection.d.ts +32 -0
  7. package/dist/agent-inspection.d.ts.map +1 -0
  8. package/dist/agent-inspection.js +196 -0
  9. package/dist/agent-inspection.js.map +1 -0
  10. package/dist/agent-staging.d.ts +130 -0
  11. package/dist/agent-staging.d.ts.map +1 -0
  12. package/dist/agent-staging.js +312 -0
  13. package/dist/agent-staging.js.map +1 -0
  14. package/dist/cli-agent.d.ts +31 -2
  15. package/dist/cli-agent.d.ts.map +1 -1
  16. package/dist/cli-agent.js +279 -34
  17. package/dist/cli-agent.js.map +1 -1
  18. package/dist/cli-history.d.ts +20 -0
  19. package/dist/cli-history.d.ts.map +1 -0
  20. package/dist/cli-history.js +61 -0
  21. package/dist/cli-history.js.map +1 -0
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +6 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/codex-rollout-format.d.ts +66 -0
  26. package/dist/codex-rollout-format.d.ts.map +1 -0
  27. package/dist/codex-rollout-format.js +111 -0
  28. package/dist/codex-rollout-format.js.map +1 -0
  29. package/dist/codex-transcript.d.ts +3 -0
  30. package/dist/codex-transcript.d.ts.map +1 -1
  31. package/dist/codex-transcript.js +13 -41
  32. package/dist/codex-transcript.js.map +1 -1
  33. package/dist/config/cli-registry/schema.d.ts +12 -7
  34. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  35. package/dist/config/cli-registry/schema.js +26 -0
  36. package/dist/config/cli-registry/schema.js.map +1 -1
  37. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  38. package/dist/config/cli-registry/stock.js +40 -1
  39. package/dist/config/cli-registry/stock.js.map +1 -1
  40. package/dist/config/cli-registry/types.d.ts +57 -0
  41. package/dist/config/cli-registry/types.d.ts.map +1 -1
  42. package/dist/config/server-timing.d.ts +6 -0
  43. package/dist/config/server-timing.d.ts.map +1 -1
  44. package/dist/config/server-timing.js +9 -0
  45. package/dist/config/server-timing.js.map +1 -1
  46. package/dist/daemon-control.d.ts +1 -0
  47. package/dist/daemon-control.d.ts.map +1 -1
  48. package/dist/daemon-control.js +2 -0
  49. package/dist/daemon-control.js.map +1 -1
  50. package/dist/deepseek-transcript.d.ts +9 -7
  51. package/dist/deepseek-transcript.d.ts.map +1 -1
  52. package/dist/deepseek-transcript.js +9 -7
  53. package/dist/deepseek-transcript.js.map +1 -1
  54. package/dist/docker-hosts.d.ts +8 -0
  55. package/dist/docker-hosts.d.ts.map +1 -1
  56. package/dist/docker-hosts.js +29 -0
  57. package/dist/docker-hosts.js.map +1 -1
  58. package/dist/git-fetch-scheduler.d.ts +124 -0
  59. package/dist/git-fetch-scheduler.d.ts.map +1 -0
  60. package/dist/git-fetch-scheduler.js +249 -0
  61. package/dist/git-fetch-scheduler.js.map +1 -0
  62. package/dist/git-fetch.d.ts +241 -0
  63. package/dist/git-fetch.d.ts.map +1 -0
  64. package/dist/git-fetch.js +392 -0
  65. package/dist/git-fetch.js.map +1 -0
  66. package/dist/git-workspace-status.d.ts +36 -1
  67. package/dist/git-workspace-status.d.ts.map +1 -1
  68. package/dist/git-workspace-status.js +42 -5
  69. package/dist/git-workspace-status.js.map +1 -1
  70. package/dist/hooks-config.d.ts +14 -2
  71. package/dist/hooks-config.d.ts.map +1 -1
  72. package/dist/hooks-config.js +39 -3
  73. package/dist/hooks-config.js.map +1 -1
  74. package/dist/local-history.d.ts +71 -0
  75. package/dist/local-history.d.ts.map +1 -0
  76. package/dist/local-history.js +750 -0
  77. package/dist/local-history.js.map +1 -0
  78. package/dist/mcp-server.d.ts.map +1 -1
  79. package/dist/mcp-server.js +2 -2
  80. package/dist/mcp-server.js.map +1 -1
  81. package/dist/mux-interface.d.ts +5 -2
  82. package/dist/mux-interface.d.ts.map +1 -1
  83. package/dist/prompt-cache-keepwarm.d.ts.map +1 -1
  84. package/dist/prompt-cache-keepwarm.js +5 -3
  85. package/dist/prompt-cache-keepwarm.js.map +1 -1
  86. package/dist/session.d.ts +113 -0
  87. package/dist/session.d.ts.map +1 -1
  88. package/dist/session.js +341 -13
  89. package/dist/session.js.map +1 -1
  90. package/dist/terminal-input-classifier.d.ts +8 -0
  91. package/dist/terminal-input-classifier.d.ts.map +1 -0
  92. package/dist/terminal-input-classifier.js +60 -0
  93. package/dist/terminal-input-classifier.js.map +1 -0
  94. package/dist/tmux-manager.d.ts +23 -1
  95. package/dist/tmux-manager.d.ts.map +1 -1
  96. package/dist/tmux-manager.js +54 -6
  97. package/dist/tmux-manager.js.map +1 -1
  98. package/dist/types/session.d.ts +15 -0
  99. package/dist/types/session.d.ts.map +1 -1
  100. package/dist/types/session.js.map +1 -1
  101. package/dist/web/network-auth-policy.d.ts +13 -3
  102. package/dist/web/network-auth-policy.d.ts.map +1 -1
  103. package/dist/web/network-auth-policy.js +15 -3
  104. package/dist/web/network-auth-policy.js.map +1 -1
  105. package/dist/web/ports/infra-port.d.ts +2 -0
  106. package/dist/web/ports/infra-port.d.ts.map +1 -1
  107. package/dist/web/public/admin-ui.js.gz +0 -0
  108. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  109. package/dist/web/public/app.3093527f.js +43 -0
  110. package/dist/web/public/app.3093527f.js.br +0 -0
  111. package/dist/web/public/app.3093527f.js.gz +0 -0
  112. package/dist/web/public/approvals-ui.js.gz +0 -0
  113. package/dist/web/public/{constants.0b3cdde9.js → constants.affcdde6.js} +611 -12
  114. package/dist/web/public/constants.affcdde6.js.br +0 -0
  115. package/dist/web/public/constants.affcdde6.js.gz +0 -0
  116. package/dist/web/public/cron-ui.js.gz +0 -0
  117. package/dist/web/public/entrance-animations.js.gz +0 -0
  118. package/dist/web/public/git-status-ui.js +88 -5
  119. package/dist/web/public/git-status-ui.js.br +0 -0
  120. package/dist/web/public/git-status-ui.js.gz +0 -0
  121. package/dist/web/public/header-divider.eb2d2463.js.gz +0 -0
  122. package/dist/web/public/home-sessions.js.gz +0 -0
  123. package/dist/web/public/host-wake-ui.js.gz +0 -0
  124. package/dist/web/public/i18n.70265257.js +2 -0
  125. package/dist/web/public/i18n.70265257.js.br +0 -0
  126. package/dist/web/public/i18n.70265257.js.gz +0 -0
  127. package/dist/web/public/image-input.941386e7.js.gz +0 -0
  128. package/dist/web/public/index.html +107 -16
  129. package/dist/web/public/index.html.br +0 -0
  130. package/dist/web/public/index.html.gz +0 -0
  131. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  132. package/dist/web/public/keyboard-accessory.4e8b20ac.js.gz +0 -0
  133. package/dist/web/public/{mobile-handlers.1c0cbcd8.js → mobile-handlers.f7c3f692.js} +22 -0
  134. package/dist/web/public/mobile-handlers.f7c3f692.js.br +0 -0
  135. package/dist/web/public/mobile-handlers.f7c3f692.js.gz +0 -0
  136. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  137. package/dist/web/public/mobile-overview.js.gz +0 -0
  138. package/dist/web/public/mobile.1bbd2d67.css +1 -0
  139. package/dist/web/public/mobile.1bbd2d67.css.br +0 -0
  140. package/dist/web/public/mobile.1bbd2d67.css.gz +0 -0
  141. package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
  142. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  143. package/dist/web/public/{panels-ui.78c3defb.js → panels-ui.4a56ee63.js} +1 -1
  144. package/dist/web/public/panels-ui.4a56ee63.js.br +0 -0
  145. package/dist/web/public/panels-ui.4a56ee63.js.gz +0 -0
  146. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  147. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  148. package/dist/web/public/readmymind-ui.js.gz +0 -0
  149. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  150. package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
  151. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  152. package/dist/web/public/session-lineage.js.gz +0 -0
  153. package/dist/web/public/{session-ui.ea6b1994.js → session-ui.186f9419.js} +8 -8
  154. package/dist/web/public/session-ui.186f9419.js.br +0 -0
  155. package/dist/web/public/session-ui.186f9419.js.gz +0 -0
  156. package/dist/web/public/{settings-ui.085dd202.js → settings-ui.a191154e.js} +11 -11
  157. package/dist/web/public/settings-ui.a191154e.js.br +0 -0
  158. package/dist/web/public/settings-ui.a191154e.js.gz +0 -0
  159. package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
  160. package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
  161. package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
  162. package/dist/web/public/styles.7238eae8.css +1 -0
  163. package/dist/web/public/styles.7238eae8.css.br +0 -0
  164. package/dist/web/public/styles.7238eae8.css.gz +0 -0
  165. package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
  166. package/dist/web/public/sw.js +2 -2
  167. package/dist/web/public/sw.js.br +0 -0
  168. package/dist/web/public/sw.js.gz +0 -0
  169. package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
  170. package/dist/web/public/{tab-rail-resize.7157e0bd.js → tab-rail-resize.b5cdceaf.js} +1 -1
  171. package/dist/web/public/tab-rail-resize.b5cdceaf.js.br +0 -0
  172. package/dist/web/public/tab-rail-resize.b5cdceaf.js.gz +0 -0
  173. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
  174. package/dist/web/public/terminal-split.js.gz +0 -0
  175. package/dist/web/public/terminal-tile.js +2 -0
  176. package/dist/web/public/terminal-tile.js.br +0 -0
  177. package/dist/web/public/terminal-tile.js.gz +0 -0
  178. package/dist/web/public/terminal-ui.7e787829.js +4 -0
  179. package/dist/web/public/terminal-ui.7e787829.js.br +0 -0
  180. package/dist/web/public/terminal-ui.7e787829.js.gz +0 -0
  181. package/dist/web/public/tile-grid.js.gz +0 -0
  182. package/dist/web/public/ultracode-panel.js.gz +0 -0
  183. package/dist/web/public/ultracode-windows.js.gz +0 -0
  184. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  185. package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
  186. package/dist/web/public/vendor/fflate.min.js.gz +0 -0
  187. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  188. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  189. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  190. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  191. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  192. package/dist/web/public/vendor/{xterm-predictive-echo.ae5e3d5d.js → xterm-predictive-echo.276b11d9.js} +1 -1
  193. package/dist/web/public/vendor/xterm-predictive-echo.276b11d9.js.br +0 -0
  194. package/dist/web/public/vendor/xterm-predictive-echo.276b11d9.js.gz +0 -0
  195. package/dist/web/public/vendor/xterm-zerolag-input.1be42307.js +5 -0
  196. package/dist/web/public/vendor/xterm-zerolag-input.1be42307.js.br +0 -0
  197. package/dist/web/public/vendor/xterm-zerolag-input.1be42307.js.gz +0 -0
  198. package/dist/web/public/vendor/xterm.css.gz +0 -0
  199. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  200. package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
  201. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  202. package/dist/web/public/webview-tabs.js.gz +0 -0
  203. package/dist/web/public/whats-new.json +9 -9
  204. package/dist/web/routes/agent-session-routes.d.ts +20 -0
  205. package/dist/web/routes/agent-session-routes.d.ts.map +1 -0
  206. package/dist/web/routes/agent-session-routes.js +160 -0
  207. package/dist/web/routes/agent-session-routes.js.map +1 -0
  208. package/dist/web/routes/case-routes.d.ts.map +1 -1
  209. package/dist/web/routes/case-routes.js +32 -26
  210. package/dist/web/routes/case-routes.js.map +1 -1
  211. package/dist/web/routes/config-backup-routes.js +2 -2
  212. package/dist/web/routes/config-backup-routes.js.map +1 -1
  213. package/dist/web/routes/git-status-routes.d.ts +21 -7
  214. package/dist/web/routes/git-status-routes.d.ts.map +1 -1
  215. package/dist/web/routes/git-status-routes.js +78 -12
  216. package/dist/web/routes/git-status-routes.js.map +1 -1
  217. package/dist/web/routes/index.d.ts +1 -0
  218. package/dist/web/routes/index.d.ts.map +1 -1
  219. package/dist/web/routes/index.js +1 -0
  220. package/dist/web/routes/index.js.map +1 -1
  221. package/dist/web/routes/ralph-routes.d.ts.map +1 -1
  222. package/dist/web/routes/ralph-routes.js +7 -16
  223. package/dist/web/routes/ralph-routes.js.map +1 -1
  224. package/dist/web/routes/session-routes.d.ts.map +1 -1
  225. package/dist/web/routes/session-routes.js +96 -28
  226. package/dist/web/routes/session-routes.js.map +1 -1
  227. package/dist/web/routes/system-routes.d.ts.map +1 -1
  228. package/dist/web/routes/system-routes.js +84 -57
  229. package/dist/web/routes/system-routes.js.map +1 -1
  230. package/dist/web/routes/ws-routes.d.ts +5 -0
  231. package/dist/web/routes/ws-routes.d.ts.map +1 -1
  232. package/dist/web/routes/ws-routes.js +84 -47
  233. package/dist/web/routes/ws-routes.js.map +1 -1
  234. package/dist/web/schemas.d.ts +30 -7
  235. package/dist/web/schemas.d.ts.map +1 -1
  236. package/dist/web/schemas.js +40 -1
  237. package/dist/web/schemas.js.map +1 -1
  238. package/dist/web/server.d.ts +5 -2
  239. package/dist/web/server.d.ts.map +1 -1
  240. package/dist/web/server.js +84 -14
  241. package/dist/web/server.js.map +1 -1
  242. package/dist/web/settings-writer.d.ts +47 -0
  243. package/dist/web/settings-writer.d.ts.map +1 -0
  244. package/dist/web/settings-writer.js +110 -0
  245. package/dist/web/settings-writer.js.map +1 -0
  246. package/package.json +1 -1
  247. package/skills/codeman/SKILL.md +25 -6
  248. package/skills/codeman/reference/history.md +84 -0
  249. package/skills/codeman/reference/inspection-and-staging.md +152 -0
  250. package/skills/codeman/reference/messaging.md +1 -1
  251. package/skills/codeman/reference/verbs.md +18 -3
  252. package/dist/web/public/app.42d0abae.js +0 -43
  253. package/dist/web/public/app.42d0abae.js.br +0 -0
  254. package/dist/web/public/app.42d0abae.js.gz +0 -0
  255. package/dist/web/public/constants.0b3cdde9.js.br +0 -0
  256. package/dist/web/public/constants.0b3cdde9.js.gz +0 -0
  257. package/dist/web/public/i18n.1e68220d.js +0 -2
  258. package/dist/web/public/i18n.1e68220d.js.br +0 -0
  259. package/dist/web/public/i18n.1e68220d.js.gz +0 -0
  260. package/dist/web/public/mobile-handlers.1c0cbcd8.js.br +0 -0
  261. package/dist/web/public/mobile-handlers.1c0cbcd8.js.gz +0 -0
  262. package/dist/web/public/mobile.12fb18de.css +0 -1
  263. package/dist/web/public/mobile.12fb18de.css.br +0 -0
  264. package/dist/web/public/mobile.12fb18de.css.gz +0 -0
  265. package/dist/web/public/panels-ui.78c3defb.js.br +0 -0
  266. package/dist/web/public/panels-ui.78c3defb.js.gz +0 -0
  267. package/dist/web/public/session-ui.ea6b1994.js.br +0 -0
  268. package/dist/web/public/session-ui.ea6b1994.js.gz +0 -0
  269. package/dist/web/public/settings-ui.085dd202.js.br +0 -0
  270. package/dist/web/public/settings-ui.085dd202.js.gz +0 -0
  271. package/dist/web/public/styles.3b59b41d.css +0 -1
  272. package/dist/web/public/styles.3b59b41d.css.br +0 -0
  273. package/dist/web/public/styles.3b59b41d.css.gz +0 -0
  274. package/dist/web/public/tab-rail-resize.7157e0bd.js.br +0 -0
  275. package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
  276. package/dist/web/public/terminal-ui.fb2a27f5.js +0 -2
  277. package/dist/web/public/terminal-ui.fb2a27f5.js.br +0 -0
  278. package/dist/web/public/terminal-ui.fb2a27f5.js.gz +0 -0
  279. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.br +0 -0
  280. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  281. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js +0 -4
  282. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.br +0 -0
  283. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
@@ -16,8 +16,8 @@
16
16
  <link rel="manifest" href="manifest.json">
17
17
  <title>Codeman</title>
18
18
  <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'%3E%3Cstop offset='0%25' stop-color='%2360a5fa'/%3E%3Cstop offset='100%25' stop-color='%233b82f6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='32' height='32' rx='6' fill='%230a0a0a'/%3E%3Cpath d='M18 4L8 18h6l-2 10 10-14h-6z' fill='url(%23g)'/%3E%3C/svg%3E">
19
- <link rel="stylesheet" href="styles.3b59b41d.css">
20
- <link rel="stylesheet" href="mobile.12fb18de.css" media="(max-width: 1023px)">
19
+ <link rel="stylesheet" href="styles.7238eae8.css">
20
+ <link rel="stylesheet" href="mobile.1bbd2d67.css" media="(max-width: 1023px)">
21
21
  <!-- xterm.css loaded async — terminal won't display until xterm.js runs anyway -->
22
22
  <link rel="preload" href="vendor/xterm.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
23
23
  <noscript><link rel="stylesheet" href="vendor/xterm.css"></noscript>
@@ -27,8 +27,8 @@
27
27
  <!-- Symbols font before the terminal first paints — a late-loading icon font
28
28
  leaves tofu in xterm's glyph atlas until something forces a re-render. -->
29
29
  <link rel="preload" href="fonts/symbols-nerd-font-mono.woff2" as="font" type="font/woff2" crossorigin>
30
- <link rel="preload" href="constants.0b3cdde9.js" as="script">
31
- <link rel="preload" href="app.42d0abae.js" as="script">
30
+ <link rel="preload" href="constants.affcdde6.js" as="script">
31
+ <link rel="preload" href="app.3093527f.js" as="script">
32
32
  <!-- Self-hosted xterm.js — eliminates CDN DNS/TLS latency (~100ms).
33
33
  'defer' preserves execution order (xterm loads before fit addon). -->
34
34
  <script defer src="vendor/xterm.min.js"></script>
@@ -40,8 +40,8 @@
40
40
  <script defer src="vendor/xterm-addon-serialize.min.js"></script>
41
41
  <!-- WebGL addon lazy-loaded by app.js on desktop only (skipped on mobile, saving 244KB) -->
42
42
  <script defer src="vendor/xterm-addon-unicode11.min.js"></script>
43
- <script defer src="vendor/xterm-zerolag-input.0b69623c.js"></script>
44
- <script defer src="vendor/xterm-predictive-echo.ae5e3d5d.js"></script>
43
+ <script defer src="vendor/xterm-zerolag-input.1be42307.js"></script>
44
+ <script defer src="vendor/xterm-predictive-echo.276b11d9.js"></script>
45
45
  <script defer src="vendor/marked.min.js"></script>
46
46
  <!-- DOMPurify (allowlist HTML sanitizer for rendered markdown).
47
47
  Must load before sanitize-html.js (which wires it) and app.js (which calls it). -->
@@ -625,6 +625,7 @@
625
625
  <span class="git-status-title">Git <span class="git-status-branch" id="gitStatusBranch" data-i18n-skip></span></span>
626
626
  <div class="git-status-actions">
627
627
  <button class="btn-icon-sm" onclick="app.refreshGitStatusNow()" title="Refresh" aria-label="Refresh git status">&#x21BB;</button>
628
+ <button class="btn-icon-sm" id="gitStatusFetchBtn" onclick="app.fetchGitStatusNow()" title="Fetch" aria-label="Fetch git status">&#x2913;</button>
628
629
  <button class="btn-icon-sm" onclick="app.closeGitStatusPanel()" title="Close" aria-label="Close git status">&times;</button>
629
630
  </div>
630
631
  </div>
@@ -1331,6 +1332,13 @@
1331
1332
  <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"/><polyline points="7 14 11 10 14 13 20 7"/></svg>
1332
1333
  <span>Summary</span>
1333
1334
  </button>
1335
+ <!-- Git is last: the section shows for every local session, but until the interval feature is
1336
+ in use it holds one toggle and a status row that has never run, so it earns its place at the
1337
+ end of the rail rather than among the tabs a session uses every day. -->
1338
+ <button type="button" class="set-rail-item" data-tab="git" onclick="app.switchOptionsTab('git')">
1339
+ <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M6 3v12"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
1340
+ <span>Git</span>
1341
+ </button>
1334
1342
  </div>
1335
1343
  <p class="set-rail-foot">These options belong to the selected session and save as you change them.</p>
1336
1344
  </nav>
@@ -1719,6 +1727,54 @@
1719
1727
  </div>
1720
1728
  </div>
1721
1729
  </section>
1730
+
1731
+ <!-- ══ Git ══════════════════════════════════════════════════════ -->
1732
+ <section class="set-section hidden" id="git-tab" data-label="Git">
1733
+ <div class="set-section-head">
1734
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M6 3v12"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
1735
+ <h2>Git</h2>
1736
+ </div>
1737
+ <p class="set-section-blurb">Whether Codeman fetches this session's repositories on a timer.</p>
1738
+
1739
+ <div class="set-group">
1740
+ <div class="set-group-head"><h4>Fetch on an interval</h4></div>
1741
+ <p class="set-group-hint">Fetching is the only git command the Git panel runs that writes, and the only one Codeman runs on a timer, so nothing runs until you turn it on (here, or in App Settings &rarr; Bottom bar). Cloning and worktree management write too, but only when you asked for them at the moment you asked. The panel's Fetch button is always just a click.</p>
1742
+ <div class="set-group-body">
1743
+ <!-- Live from the session's own last run (session-ui.js: updateGitFetchStatus), which is the
1744
+ run its folder got: several sessions on one folder share one run and read the same row. -->
1745
+ <div class="set-row">
1746
+ <div class="set-row-text">
1747
+ <span class="set-row-label">Status</span>
1748
+ <span class="set-row-desc" id="gitFetchStatus" data-i18n-skip hidden></span>
1749
+ </div>
1750
+ </div>
1751
+ <div class="set-row">
1752
+ <div class="set-row-text">
1753
+ <span class="set-row-label">Follow the app setting</span>
1754
+ <span class="set-row-desc">Uses the app-wide switch and interval for this session. Switch it off to pick your own.</span>
1755
+ </div>
1756
+ <label class="switch switch-sm"><input type="checkbox" id="modalGitFetchFollow" checked onchange="app.autoSaveGitFetch()"><span class="slider"></span></label>
1757
+ </div>
1758
+ <div class="set-row" id="gitFetchEnabledRow">
1759
+ <div class="set-row-text">
1760
+ <span class="set-row-label">Fetch this session</span>
1761
+ <span class="set-row-desc">Runs on its own even while the app-wide switch is off: a session that turned itself on means exactly that. Sessions sharing one folder share one run, and each sees that run's result.</span>
1762
+ </div>
1763
+ <label class="switch switch-sm"><input type="checkbox" id="modalGitFetchEnabled" onchange="app.autoSaveGitFetch()"><span class="slider"></span></label>
1764
+ </div>
1765
+ <div class="set-row" id="gitFetchIntervalRow">
1766
+ <div class="set-row-text">
1767
+ <span class="set-row-label">How often</span>
1768
+ <span class="set-row-desc">30 sec to 1 hr, timed from the start of a run, so a slow repository does not push the next one out.</span>
1769
+ </div>
1770
+ <div class="set-row-actions">
1771
+ <input type="number" id="modalGitFetchInterval" class="set-num set-num-wide" value="300" min="30" max="3600" step="30" onchange="app.autoSaveGitFetch()">
1772
+ <span class="set-unit">sec</span>
1773
+ </div>
1774
+ </div>
1775
+ </div>
1776
+ </div>
1777
+ </section>
1722
1778
  </div>
1723
1779
  </div>
1724
1780
  </div>
@@ -1944,6 +2000,13 @@
1944
2000
  </div>
1945
2001
  <label class="switch switch-sm"><input type="checkbox" id="appSettingsLocalEcho"><span class="slider"></span></label>
1946
2002
  </div>
2003
+ <div class="set-row" data-search="keyboard hold rows resize redraw mobile">
2004
+ <div class="set-row-text">
2005
+ <span class="set-row-label">Keep Size Under Keyboard</span>
2006
+ <span class="set-row-desc">For local Claude sessions, opening the on-screen keyboard keeps the session's size and scrolls the view instead, so Claude does not reprint its screen and lose transcript lines. Full-screen interfaces (Codex, Claude's fullscreen mode) are resized as before.</span>
2007
+ </div>
2008
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsKeyboardHoldsRows"><span class="slider"></span></label>
2009
+ </div>
1947
2010
  <div class="set-row" data-search="cjk input ime chinese japanese korean">
1948
2011
  <div class="set-row-text">
1949
2012
  <span class="set-row-label">CJK Input</span>
@@ -2178,6 +2241,13 @@
2178
2241
  </div>
2179
2242
  <label class="switch switch-sm"><input type="checkbox" id="appSettingsAgentInboxPersist"><span class="slider"></span></label>
2180
2243
  </div>
2244
+ <div class="set-row" data-search="experimental agent coordination inspect stage submit codeman agent guarded input">
2245
+ <div class="set-row-text">
2246
+ <span class="set-row-label">Experimental agent coordination</span>
2247
+ <span class="set-row-desc">Lets agents read another session's output in bounded pages and type a prompt into a local Codex composer, then press Enter once after checking it is unchanged (the inspect, stage and submit commands). Experimental: the commands and their HTTP routes may change in any release. Off by default; while off those routes refuse every request.</span>
2248
+ </div>
2249
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsAgentCoordination"><span class="slider"></span></label>
2250
+ </div>
2181
2251
  </div>
2182
2252
  </div>
2183
2253
 
@@ -2196,7 +2266,7 @@
2196
2266
  <div class="set-row" data-search="git status uncommitted unpushed commit push indicator bottom bar toolbar">
2197
2267
  <div class="set-row-text">
2198
2268
  <span class="set-row-label">Git status <span class="set-scope">device</span></span>
2199
- <span class="set-row-desc">Shows, at the right of the bottom bar, when the active session's repository (or each repository inside its folder, up to two levels down) has uncommitted files or commits that are not pushed. Click it for the list. Read-only: Codeman never fetches or changes the repository. Not shown for Docker or remote sessions. Off by default.</span>
2269
+ <span class="set-row-desc">Shows, at the right of the bottom bar, when the active session's repository (or each repository inside its folder, up to two levels down) has uncommitted files or commits that are not pushed. Click it for the list. Read-only apart from Fetch: Codeman never commits or changes the repository, and `git fetch` runs only when you click Fetch in that window, or on the interval below if you turned it on. It is the only git command the Git window runs that writes, and the only one Codeman runs on a timer (cloning and worktree management write too, but only when you asked for them at the moment you asked). Not shown for Docker or remote sessions. Off by default.</span>
2200
2270
  </div>
2201
2271
  <label class="switch switch-sm"><input type="checkbox" id="appSettingsShowGitStatus"><span class="slider"></span></label>
2202
2272
  </div>
@@ -2221,6 +2291,20 @@
2221
2291
  </div>
2222
2292
  <input type="number" id="appSettingsGitStatusTimeout" class="set-num" value="30" min="5" max="120" step="1">
2223
2293
  </div>
2294
+ <div class="set-row" data-search="git fetch interval timer behind remote tracking refs poll run automatically">
2295
+ <div class="set-row-text">
2296
+ <span class="set-row-label">Git fetch on an interval <span class="set-scope">synced</span></span>
2297
+ <span class="set-row-desc">Runs `git fetch` for the repositories the Git window lists on a timer, so the "behind" number is current without a click. Off by default: this is the only git command the Git panel runs that writes, and the only one Codeman runs on a timer (cloning and worktree management write too, but only when you asked for them at the moment you asked), so nothing runs until you turn it on. A session can override both the switch and the interval in Session Options → Git.</span>
2298
+ </div>
2299
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsGitFetchEnabled"><span class="slider"></span></label>
2300
+ </div>
2301
+ <div class="set-row" data-search="git fetch how often seconds between runs interval case override session options">
2302
+ <div class="set-row-text">
2303
+ <span class="set-row-label">Git fetch: how often <span class="set-scope">synced</span></span>
2304
+ <span class="set-row-desc">Seconds between runs for a session that has no override of its own (30 to 3600, default 300). Only a session that is on (here, or in Session Options → Git) is fetched, and sessions sharing one folder are fetched by one run.</span>
2305
+ </div>
2306
+ <input type="number" id="appSettingsGitFetchIntervalSeconds" class="set-num" value="300" min="30" max="3600" step="1">
2307
+ </div>
2224
2308
  </div>
2225
2309
  </div>
2226
2310
 
@@ -2413,6 +2497,13 @@
2413
2497
  </div>
2414
2498
  <label class="switch switch-sm"><input type="checkbox" id="appSettingsShowTabDetachButton"><span class="slider"></span></label>
2415
2499
  </div>
2500
+ <div class="set-row" data-search="new session plus add tab same case group cli">
2501
+ <div class="set-row-text">
2502
+ <span class="set-row-label">New Session Button on Tabs</span>
2503
+ <span class="set-row-desc">A + on the tab that starts a session in the same case and group, in any installed CLI.</span>
2504
+ </div>
2505
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsShowTabNewButton"><span class="slider"></span></label>
2506
+ </div>
2416
2507
  <div class="set-row" id="appSettingsTileDetachItem" data-search="detach tiles tile pop out window drag move another window">
2417
2508
  <div class="set-row-text">
2418
2509
  <span class="set-row-label">Detach Tiles <span class="set-tag">desktop</span> <span class="set-tag set-tag-beta">beta</span></span>
@@ -4390,9 +4481,9 @@
4390
4481
  <div class="approvals-list"></div>
4391
4482
  </div>
4392
4483
 
4393
- <script defer src="constants.0b3cdde9.js"></script>
4394
- <script defer src="i18n.1e68220d.js"></script>
4395
- <script defer src="mobile-handlers.1c0cbcd8.js"></script>
4484
+ <script defer src="constants.affcdde6.js"></script>
4485
+ <script defer src="i18n.70265257.js"></script>
4486
+ <script defer src="mobile-handlers.f7c3f692.js"></script>
4396
4487
  <script defer src="voice-input.2342c37b.js"></script>
4397
4488
  <script defer src="notification-manager.feb82c04.js"></script>
4398
4489
  <script defer src="keyboard-accessory.4e8b20ac.js"></script>
@@ -4405,10 +4496,10 @@
4405
4496
  <script defer src="sanitize-html.e7147e76.js"></script>
4406
4497
  <!-- Owner tab layout projection (grouped vertical rail); pure, read by app.js. -->
4407
4498
  <script defer src="tab-layout-browser.2d6189f7.js"></script>
4408
- <script defer src="app.42d0abae.js"></script>
4409
- <script defer src="tab-rail-resize.7157e0bd.js"></script>
4499
+ <script defer src="app.3093527f.js"></script>
4500
+ <script defer src="tab-rail-resize.b5cdceaf.js"></script>
4410
4501
  <script defer src="header-divider.eb2d2463.js"></script>
4411
- <script defer src="terminal-ui.fb2a27f5.js"></script>
4502
+ <script defer src="terminal-ui.7e787829.js"></script>
4412
4503
  <script defer src="terminal-tile.js"></script>
4413
4504
  <script defer src="terminal-split.js"></script>
4414
4505
  <script defer src="tile-grid.js"></script>
@@ -4416,14 +4507,14 @@
4416
4507
  <script defer src="ralph-panel.b350e2ef.js"></script>
4417
4508
  <script defer src="orchestrator-panel.js"></script>
4418
4509
  <script defer src="cron-ui.js"></script>
4419
- <script defer src="settings-ui.085dd202.js"></script>
4420
- <script defer src="panels-ui.78c3defb.js"></script>
4510
+ <script defer src="settings-ui.a191154e.js"></script>
4511
+ <script defer src="panels-ui.4a56ee63.js"></script>
4421
4512
  <script defer src="readmymind-ui.js"></script>
4422
4513
  <script defer src="ultracode-panel.js"></script>
4423
4514
  <script defer src="approvals-ui.js"></script>
4424
4515
  <script defer src="reboot-restore-ui.js"></script>
4425
4516
  <script defer src="admin-ui.js"></script>
4426
- <script defer src="session-ui.ea6b1994.js"></script>
4517
+ <script defer src="session-ui.186f9419.js"></script>
4427
4518
  <script defer src="host-wake-ui.js"></script>
4428
4519
  <script defer src="webview-tabs.js"></script>
4429
4520
  <script defer src="mobile-overview.js"></script>
Binary file
Binary file
@@ -344,6 +344,13 @@ const KeyboardHandler = {
344
344
  // branches are skipped on a shape change, whichever way the height moved.
345
345
  if (!shapeChanged && heightDiff > 150 && !this.keyboardVisible) {
346
346
  this.keyboardVisible = true;
347
+ // Hold the PTY's rows for as long as the keyboard covers the terminal
348
+ // (keyboardHoldsRows, keyboardClipPx in constants.js): every height
349
+ // change makes Claude Code clear and reprint only the tail that fits.
350
+ // Captured before anything refits, so these are the keyboard-free rows.
351
+ if (typeof app !== 'undefined' && app.terminal && app._keyboardHoldEligible?.()) {
352
+ app._keyboardHeldRows = app.terminal.rows;
353
+ }
347
354
  document.body.classList.add('keyboard-visible');
348
355
  // While the keyboard is open, size the app to the visual viewport so
349
356
  // xterm's bottom row and cursor sit above the OS keyboard.
@@ -355,6 +362,7 @@ const KeyboardHandler = {
355
362
  // iOS 26's persistent 24px discrepancy, and Safari bottom bar changes
356
363
  else if (!shapeChanged && heightDiff < 100 && this.keyboardVisible) {
357
364
  this.keyboardVisible = false;
365
+ this._releaseHeldRows();
358
366
  document.body.classList.remove('keyboard-visible');
359
367
  this.onKeyboardHide();
360
368
  // Re-sync --app-height now that keyboard is gone (MobileDetection skipped
@@ -381,6 +389,12 @@ const KeyboardHandler = {
381
389
  // drop can re-arm the show branch against a baseline that already sits
382
390
  // at the shrunk height.
383
391
  if (shapeChanged) {
392
+ // Held rows belong to the display that is gone: release them and arm the
393
+ // settle, which refits and tells the PTY. Nothing else would: with the
394
+ // keyboard up throttledResize stands aside, and a rotation alone arms no
395
+ // settle, so xterm kept the held rows with no clip and the composer sat
396
+ // under the keyboard until it closed.
397
+ if (this._releaseHeldRows()) this._scheduleViewportSettle();
384
398
  this.initialViewportHeight = this.keyboardVisible ? window.innerHeight : currentHeight;
385
399
  } else if (!this.keyboardVisible) {
386
400
  this.initialViewportHeight = currentHeight;
@@ -394,6 +408,11 @@ const KeyboardHandler = {
394
408
  this.lastViewportHeight = currentHeight;
395
409
  },
396
410
 
411
+ /** End a keyboard row hold (app._releaseKeyboardHold); true when one was held. */
412
+ _releaseHeldRows() {
413
+ return typeof app !== 'undefined' && !!app._releaseKeyboardHold?.();
414
+ },
415
+
397
416
  /** Update layout when keyboard shows/hides */
398
417
  updateLayoutForKeyboard() {
399
418
  if (!window.visualViewport) return;
@@ -606,6 +625,9 @@ const KeyboardHandler = {
606
625
  // geometry xterm will actually keep (issue #464).
607
626
  app.syncTerminalGeometry?.();
608
627
  if (this.keyboardVisible) this._shrinkPaddingToFit();
628
+ // Rows held: nothing re-renders on its own (the size did not change),
629
+ // so place the screen for the settled box here.
630
+ app._applyKeyboardClip?.();
609
631
  // Following live output → bottom, as before. Reading history → back to
610
632
  // the pre-reflow anchor instead of being yanked down (#259).
611
633
  if (shouldRestoreScroll) {
@@ -0,0 +1 @@
1
+ html.mobile-init .header-font-controls,html.mobile-init .header-system-stats,html.mobile-init .header-tokens,html.mobile-init .monitor-panel,html.mobile-init .subagents-panel,html.mobile-init .project-insights-panel,html.mobile-init .file-browser-panel{display:none!important}@media(max-width:768px){input,textarea,select{font-size:16px!important}html{touch-action:manipulation}html:not(.host-windows) .session-tab .tab-detach{display:none!important}}@media(max-width:768px)and (min-width:600px){.header{position:fixed;top:0;left:0;right:0;min-height:48px;max-height:48px;padding:.35rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));background:#0a0a0a;border-bottom:1px solid rgba(255,255,255,.08);contain:none;overflow:visible;z-index:1200}.ios-device .header{padding-top:calc(.35rem + var(--safe-area-top));min-height:calc(48px + var(--safe-area-top));max-height:calc(48px + var(--safe-area-top))}.app{padding-top:54px}.ios-device .app{padding-top:calc(54px + var(--safe-area-top))}.header-font-controls{gap:.15rem;padding:.15rem .25rem}.header-font-controls .btn-icon-sm{width:18px;height:18px}.header-system-stats{font-size:.6rem;gap:.25rem}.header-right{gap:.35rem}.btn-icon-header:not(.btn-sm){width:44px;height:44px}.session-tabs,.session-tabs.tabs-two-rows{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;scrollbar-width:none;max-height:52px;gap:3px}.session-tabs::-webkit-scrollbar{display:none}.session-tab{padding:.4rem .6rem;font-size:.75rem;min-height:40px}.session-tab .tab-name{max-width:80px}.toolbar{padding:.4rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));gap:.4rem}.tab-count-group{display:none}.btn-toolbar{padding:.4rem .8rem;font-size:.8rem;min-height:40px}.case-select-group{max-width:none}.case-combobox{width:160px}.toolbar-select{font-size:.75rem}.monitor-panel,.subagents-panel{width:100%;max-width:100%;left:0;right:0;border-radius:8px 8px 0 0;max-height:40vh}.project-insights-panel{max-width:280px;font-size:.7rem}.modal{z-index:1300}.command-palette-modal{padding:10vh .75rem 0}.command-palette-shell{width:100%;max-height:74vh}.command-palette-input-row{grid-template-columns:20px minmax(0,1fr)}.command-palette-input-row kbd{display:none}.command-palette-item{min-height:56px}.settings-grid{gap:.4rem .75rem}.settings-item{font-size:.7rem}.event-type-grid{grid-template-columns:1fr 40px 40px 40px;gap:5px 6px}.event-label{font-size:.7rem}.subagent-window{width:320px;height:280px;min-width:240px;min-height:160px}.subagent-window-header{padding:.35rem .5rem}.subagent-window-title .id{font-size:.7rem;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.subagent-window-title .status{font-size:.55rem}.subagent-window-body{font-size:.7rem}.respawn-banner{padding:.25rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));font-size:.65rem}.respawn-compact-layout{gap:.75rem}.respawn-status-row1{gap:.4rem}.respawn-action-log{max-height:2.6em;font-size:.6rem}.respawn-countdown-timer{font-size:.55rem}.respawn-timer-bar{width:24px}.toolbar-center .btn-toolbar.btn-voice{display:flex!important}.toolbar{padding:0 .5rem;gap:.5rem}.toolbar-left,.toolbar-right,.toolbar-group{gap:.5rem}.btn-toolbar{padding:.4rem .75rem;font-size:.75rem;min-height:unset}}@media(min-width:600px)and (max-width:767px){:where(.header) .session-tabs-host>.session-tabs.tabs-clusters>.tab-cluster{display:contents}:where(.header) .tab-cluster-label{display:none}:where(.header) .session-tabs-host>.session-tabs.tabs-clusters .tab-name-case{display:inline}}@property --tab-strip-fade-start{syntax: "<length>"; inherits: false; initial-value: 0px;}@property --tab-strip-fade-end{syntax: "<length>"; inherits: false; initial-value: 0px;}@keyframes tab-strip-edge-fade{0%{--tab-strip-fade-start: 0px;--tab-strip-fade-end: 28px}10%,90%{--tab-strip-fade-start: 28px;--tab-strip-fade-end: 28px}to{--tab-strip-fade-start: 28px;--tab-strip-fade-end: 0px}}@media(max-width:599px){:root{--header-height: 44px}.header-brand{padding-right:0;margin-right:.1rem;border-right:none}.header-brand .logo{display:inline-flex;align-items:center;justify-content:center;min-width:44px;height:var(--header-height);margin-left:-.3rem;font-size:1.15rem;line-height:1;border-radius:8px;-webkit-tap-highlight-color:transparent}.header-brand .logo:active{background:#60a5fa29}.header-brand .logo .logo-text{display:none}.header-brand .logo .logo-compact{display:inline}.header-font-controls{gap:.1rem;padding:.1rem .2rem}.header-font-controls .btn-icon-sm{width:16px;height:16px}.header-font-controls .font-size-display{font-size:.6rem;min-width:14px}.header-system-stats{font-size:.55rem;gap:.15rem}.header-tokens{font-size:.6rem;padding:.1rem .3rem}.header{position:fixed;top:0;left:0;right:0;min-height:var(--header-height);max-height:var(--header-height);align-items:center;padding:.15rem .3rem;padding-left:calc(.3rem + var(--safe-area-left));padding-right:calc(.3rem + var(--safe-area-right));gap:.15rem;overflow:hidden;background:#0a0a0a;border-bottom:1px solid rgba(255,255,255,.08);contain:none;z-index:1200}.ios-device .header{padding-top:calc(.15rem + var(--safe-area-top));min-height:calc(var(--header-height) + var(--safe-area-top));max-height:calc(var(--header-height) + var(--safe-area-top))}.app{padding-top:calc(var(--header-height) + 6px)}.ios-device .app{padding-top:calc(var(--header-height) + 6px + var(--safe-area-top))}.main{padding-bottom:calc(40px + var(--safe-area-bottom))}.ios-device.safari-browser .main{padding-bottom:calc(40px + var(--safe-area-bottom) + var(--chrome-overlap, 0px))}.header-right{padding-left:.2rem;gap:.1rem;flex-shrink:0;border-left:none}.btn-icon-header{width:26px;height:26px;padding:0}.btn-icon-header svg{width:12px;height:12px}html[data-session-list=sidebar] #sidebarToggleBtn{width:44px;height:44px}html[data-session-list=sidebar] #sidebarToggleBtn svg{width:18px;height:18px}.btn-icon-header.btn-settings,.btn-icon-header.btn-lifecycle-log,.btn-icon-header.btn-away-digest,.btn-icon-header.btn-session-manager,.btn-icon-header.btn-file-viewer,.btn-icon-header.btn-approvals,.btn-icon-header.btn-readmymind,.btn-admin-panel{display:none!important}.btn-voice-mobile,.btn-attach-mobile{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;background:#1a2a3f;border:1px solid rgba(59,130,246,.3);border-radius:4px;color:#93c5fd;cursor:pointer;flex-shrink:0}.btn-voice-mobile,.btn-attach-mobile-wrap{order:5}.btn-attach-mobile-wrap{position:relative;display:inline-flex;flex-shrink:0;overflow:hidden}.btn-attach-mobile-input{position:absolute;inset:0;width:100%;height:100%;opacity:0}.btn-voice-mobile svg,.btn-attach-mobile svg{width:13px;height:13px}.btn-voice-mobile:active,.btn-attach-mobile:active,.btn-attach-mobile-wrap:active .btn-attach-mobile{background:#2a3a5f}.btn-voice-mobile.recording{background:#ef444440;border-color:#ef444499;color:#ef4444;animation:mobile-voice-pulse 1.2s ease-in-out infinite}@keyframes mobile-voice-pulse{0%,to{box-shadow:inset 0 0 0 1px #ef444459;background:#ef444433}50%{box-shadow:inset 0 0 0 2px #ef4444bf;background:#ef444459}}.btn-settings-mobile{display:inline-flex!important;align-items:center;justify-content:center;width:26px;height:26px;background:transparent;border:1px solid rgba(255,255,255,.2);border-radius:4px;color:#9ca3af;font-size:.85rem;cursor:pointer;flex-shrink:0;order:6;position:relative}.btn-settings-mobile svg{width:13px;height:13px}.btn-settings-mobile:active{background:#ffffff1a;color:#fff}.app{overflow:hidden;position:relative}.keyboard-visible .app{position:fixed;inset:0 0 auto;height:var(--app-height, 100dvh)}.session-tabs,.session-tabs.tabs-two-rows{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;scrollbar-width:none;max-height:36px;gap:6px;padding:0}.session-tabs::-webkit-scrollbar{display:none}@supports (animation-timeline: scroll()){.header .session-tabs{-webkit-mask-image:linear-gradient(to right,transparent,#000 var(--tab-strip-fade-start),#000 calc(100% - var(--tab-strip-fade-end)),transparent);mask-image:linear-gradient(to right,transparent,#000 var(--tab-strip-fade-start),#000 calc(100% - var(--tab-strip-fade-end)),transparent);animation:tab-strip-edge-fade linear both;animation-timeline:scroll(self inline)}}.session-tab{flex-shrink:0;min-height:32px;max-height:32px;padding:.35rem .5rem;font-size:.7rem;gap:.25rem;border-radius:4px}:where(.header) .session-tab{border-radius:8px;background:var(--control-bg-hover);border-color:var(--control-border-hover);color:var(--text)}:where(.header) .session-tab .tab-name{font-weight:500}:where(.header) .tab-triage-head{display:none}:where(.header) .session-tabs-host>.session-tabs.tabs-clusters>.tab-cluster{display:contents}:where(.header) .tab-cluster-label{display:none}:where(.header) .session-tabs-host>.session-tabs.tabs-clusters .tab-name-case{display:inline}:where(.header) .session-tab:not(.active) .tab-actions{display:none}:where(.header) .session-tab .tab-number{display:none}.session-tab .tab-status{width:6px;height:6px}.session-tab .tab-status.busy{width:9px;height:9px;box-shadow:0 0 8px 2px color-mix(in srgb,var(--green) 55%,transparent)!important}.session-tab .tab-status.busy:after{display:none}.session-tab.tab-agent-exited:not(.tab-alert-action):not(.tab-alert-idle) .tab-status:not(.error){background:var(--text-muted)!important;box-shadow:none!important;opacity:.5}.session-tab .tab-name{max-width:80px;overflow:hidden;text-overflow:ellipsis}.session-tab.active .tab-name{min-width:44px}.session-tab .tab-close,.session-tab .tab-gear{display:none}.session-tab .tab-detach{display:none!important}.session-tab .tab-new{display:none}html.tabs-show-new .session-tab.active .tab-new{display:inline-flex;align-items:center;justify-content:center;font-size:1rem;line-height:1;width:28px;height:32px;padding:0;opacity:.8}html.tabs-show-new .session-tab.active .tab-name{min-width:68px}.session-tab.active .tab-gear{display:inline-flex;align-items:center;justify-content:center;font-size:.65rem;line-height:1;width:32px;height:32px;margin-left:auto;opacity:.6}.session-tab.active .tab-close{display:inline-flex;align-items:center;justify-content:center;font-size:1.1rem;line-height:1;width:20px;height:18px;margin-left:-2px}.toolbar{position:fixed;bottom:var(--safe-area-bottom);left:0;right:0;height:40px;min-height:40px;max-height:40px;padding:.3rem .4rem;padding-left:calc(.4rem + var(--safe-area-left));padding-right:calc(.4rem + var(--safe-area-right));flex-wrap:nowrap;gap:.3rem;align-items:center;justify-content:space-between;background:#111;border-top:1px solid rgba(255,255,255,.1);z-index:50;transition:transform .15s ease-out;will-change:transform}.ios-device.safari-browser .toolbar{bottom:calc(var(--safe-area-bottom) + var(--chrome-overlap, 0px))}.keyboard-visible.ios-device.safari-browser .toolbar{bottom:var(--safe-area-bottom)}.keyboard-visible.ios-device.safari-browser .keyboard-accessory-bar{bottom:calc(var(--safe-area-bottom) + 40px)}.toolbar-center{display:flex!important;align-items:center}.toolbar-center .btn-toolbar.btn-voice,.toolbar-right,.version-display{display:none!important}.toolbar-left{flex:1 1 0;min-width:0;align-items:center;gap:.3rem}.toolbar-left .toolbar-group{display:flex;flex:1 1 0;min-width:0;align-items:center;gap:.3rem}.toolbar-left .toolbar-group:first-child{flex:1 1 0;min-width:0;justify-content:space-between;gap:.3rem;flex-wrap:nowrap;align-items:center}.tab-count-group{display:none!important}.btn-toolbar{min-height:26px!important;max-height:26px!important;height:26px!important;padding:0 .5rem!important;font-size:.65rem!important;border-radius:4px;line-height:26px;display:inline-flex;align-items:center;justify-content:center;font-weight:500;letter-spacing:.01em;color:#fff}.run-btn-group{display:flex;flex:0 0 auto}.btn-toolbar.btn-run{flex:0 0 auto;padding:0 .6rem!important;font-weight:500;border-radius:4px 0 0 4px!important;border-right:none!important}.btn-toolbar.btn-run svg{width:10px;height:10px;margin-right:3px}.btn-toolbar.btn-run-gear{flex:0 0 auto;padding:0 .35rem!important;min-width:unset!important;border-radius:0 4px 4px 0!important;border-left:1px solid rgba(255,255,255,.15)!important}.btn-toolbar.btn-run-gear svg{width:10px;height:10px}.btn-toolbar.btn-run.mode-claude,.btn-toolbar.btn-run-gear.mode-claude{background:#1e3a5f;border-color:#3b82f64d;color:#93c5fd}.btn-toolbar.btn-run.mode-claude:active,.btn-toolbar.btn-run-gear.mode-claude:active{background:#2563eb;border-color:#3b82f680}.btn-toolbar.btn-run.mode-opencode,.btn-toolbar.btn-run-gear.mode-opencode{background:#0a2e2a;border-color:#10b9814d;color:#6ee7b7}.btn-toolbar.btn-run.mode-opencode:active,.btn-toolbar.btn-run-gear.mode-opencode:active{background:#0d4a40;border-color:#10b98180}.btn-toolbar.btn-run.mode-gemini,.btn-toolbar.btn-run-gear.mode-gemini{background:#10243f!important;border-color:#60a5fa4d!important;color:#dbeafe!important}.btn-toolbar.btn-run.mode-gemini:active,.btn-toolbar.btn-run-gear.mode-gemini:active{background:#174ea6!important;border-color:#60a5fa80!important}.btn-toolbar.btn-run.mode-antigravity,.btn-toolbar.btn-run-gear.mode-antigravity{background:#0b2b33!important;border-color:#22d3ee4d!important;color:#cffafe!important}.btn-toolbar.btn-run.mode-antigravity:active,.btn-toolbar.btn-run-gear.mode-antigravity:active{background:#0e7490!important;border-color:#22d3ee80!important}.btn-toolbar.btn-run.mode-pi,.btn-toolbar.btn-run-gear.mode-pi{background:#33121f!important;border-color:#f472b64d!important;color:#fce7f3!important}.btn-toolbar.btn-run.mode-pi:active,.btn-toolbar.btn-run-gear.mode-pi:active{background:#9d174d!important;border-color:#f472b680!important}.btn-toolbar.btn-run.mode-grok,.btn-toolbar.btn-run-gear.mode-grok{background:#1c1c1f!important;border-color:#d4d4d84d!important;color:#f4f4f5!important}.btn-toolbar.btn-run.mode-grok:active,.btn-toolbar.btn-run-gear.mode-grok:active{background:#3f3f46!important;border-color:#d4d4d880!important}.btn-toolbar.btn-run.mode-deepseek,.btn-toolbar.btn-run-gear.mode-deepseek{background:#16225f!important;border-color:#7c93ff59!important;color:#eef2ff!important}.btn-toolbar.btn-run.mode-deepseek:active,.btn-toolbar.btn-run-gear.mode-deepseek:active{background:#3350e6!important;border-color:#96aaff8c!important}.btn-toolbar.btn-run.mode-omp,.btn-toolbar.btn-run-gear.mode-omp{background:#312e81!important;border-color:#818cf84d!important;color:#e0e7ff!important}.btn-toolbar.btn-run.mode-omp:active,.btn-toolbar.btn-run-gear.mode-omp:active{background:#4f46e5!important;border-color:#818cf880!important}.btn-toolbar.btn-run.mode-copilot,.btn-toolbar.btn-run-gear.mode-copilot{background:#2e1065!important;border-color:#a371f74d!important;color:#ede9fe!important}.btn-toolbar.btn-run.mode-copilot:active,.btn-toolbar.btn-run-gear.mode-copilot:active{background:#6d28d9!important;border-color:#a371f780!important}.run-mode-menu{bottom:100%;left:0;margin-bottom:6px;min-width:160px;max-width:80vw}.run-mode-option{padding:10px 12px;font-size:.8rem;cursor:pointer;-webkit-tap-highlight-color:rgba(255,255,255,.1)}.run-mode-row-btn{width:34px;height:34px;font-size:1rem;-webkit-tap-highlight-color:rgba(255,255,255,.1)}.run-mode-webview-delete{font-size:1.2rem}.run-mode-history{-webkit-overflow-scrolling:touch;touch-action:manipulation}.btn-toolbar.btn-stop{display:flex!important;flex:0 0 auto;padding:0 8px!important;min-width:unset;order:3}.btn-toolbar.btn-stop svg{width:10px;height:10px;margin-right:0}.btn-toolbar.btn-shell{display:none!important}.btn-toolbar.btn-enter{display:flex!important;flex:0 0 auto;align-items:center;justify-content:center;min-width:54px;width:54px;white-space:nowrap;padding:0 8px!important;overflow:hidden;font-size:.65rem;font-weight:600;letter-spacing:.01em;background:#1e3a5fd9!important;border:1px solid rgba(59,130,246,.45)!important;color:#dbeafe!important;order:4}.btn-toolbar.btn-enter:hover,.btn-toolbar.btn-enter:active{background:#254a7af2!important;border-color:#3b82f6b3!important;color:#fff!important}.case-select-group{display:none!important}.toolbar-left .toolbar-group:first-child{width:100%;gap:8px}.btn-toolbar.btn-case-mobile{display:flex!important;flex:1 1 0!important;min-width:0;padding:0 8px!important;order:2;overflow:hidden;justify-content:center;gap:4px}.btn-toolbar.btn-case-mobile #mobileCaseName{max-width:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-case-settings-mobile{display:inline-flex!important;align-items:center;justify-content:center;width:26px;height:26px;background:transparent;border:1px solid rgba(255,255,255,.2);border-radius:4px;color:#9ca3af;cursor:pointer;flex-shrink:0;order:1}.btn-case-settings-mobile:active{background:#ffffff1a;color:#fff}@media(max-width:374px){.toolbar{padding:0 2px}.toolbar-left,.toolbar-left .toolbar-group,.toolbar-left .toolbar-group:first-child{gap:2px}}.btn-case-settings-mobile{display:none!important}.case-settings-popover-mobile{position:fixed;bottom:calc(var(--safe-area-bottom) + 46px);left:8px;right:8px;background:#1e1e1e;border:1px solid rgba(255,255,255,.15);border-radius:8px;padding:.6rem .75rem;z-index:1000;box-shadow:0 4px 16px #00000080;display:block}.case-settings-popover-mobile.hidden{display:none!important}.case-settings-popover-mobile .checkbox-inline{display:flex;align-items:center;gap:6px;font-size:.75rem;color:#e5e7eb}.case-settings-popover-mobile .form-hint{display:block;margin-top:.2rem;font-size:.6rem;color:#6b7280}.keyboard-accessory-bar{display:none;position:fixed;bottom:calc(var(--safe-area-bottom) + 40px);left:0;right:0;height:44px;background:#1a1a1a;border-top:1px solid rgba(255,255,255,.1);padding:6px 8px;padding-left:calc(8px + var(--safe-area-left));padding-right:calc(8px + var(--safe-area-right));gap:8px;align-items:center;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;z-index:51;transition:transform .15s ease-out;will-change:transform}.keyboard-accessory-bar.visible{display:flex}.keyboard-accessory-bar::-webkit-scrollbar{display:none}.accessory-btn{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;gap:4px;padding:6px 12px;background:#2a2a2a;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:#e5e5e5;font-size:.65rem;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s}.accessory-btn.confirming{background:#6b4f00;border-color:#b8860b;color:#ffd54f}.accessory-btn.accessory-btn-ctrl.armed{background:#2563eb;border-color:#3b82f6e6;color:#fff;font-weight:700;box-shadow:0 0 0 2px #3b82f673}.accessory-btn:active{background:#3a3a3a}.accessory-btn svg{width:14px;height:14px}.accessory-btn-arrow{padding:6px 10px;background:#2563eb;border-color:#3b82f680;color:#fff}.accessory-btn-arrow:active{background:#1d4ed8}.accessory-btn-dismiss{margin-left:auto;flex:1 1 0;max-width:100px;padding:10px 8px;background:#2563eb;border-color:#3b82f680;color:#fff;font-weight:600}.accessory-btn-dismiss svg{width:22px;height:22px}.accessory-btn-dismiss:active{background:#1d4ed8}.voice-preview{bottom:calc(var(--safe-area-bottom) + 94px);font-size:.8rem;max-width:90%;padding:6px 14px}.toolbar-select{display:none!important}.monitor-panel,.subagents-panel{width:100%;max-width:100%;left:0;right:0;border-radius:8px 8px 0 0;bottom:calc(44px + 2rem + var(--safe-area-bottom));max-height:35vh}.modal{z-index:1300}.modal-content{width:100%;max-width:100%;height:100%;max-height:100%;border-radius:0;margin:0;display:flex;flex-direction:column}.modal-content.modal-sm,.modal-content.readmymind-modal{height:auto;max-height:85vh;border-radius:12px;margin:1rem;width:calc(100% - 2rem)}.readmymind-modal .modal-footer{flex-wrap:wrap}.readmymind-modal .modal-footer .btn-toolbar{flex:1 1 auto;justify-content:center;min-height:38px}.readmymind-alt,.readmymind-steer-input{min-height:38px}.ios-device .modal-content{padding-top:var(--safe-area-top);padding-bottom:var(--safe-area-bottom);padding-left:var(--safe-area-left);padding-right:var(--safe-area-right)}.modal-header{padding:.75rem 1rem}.modal-header h3{font-size:1rem}.modal-body{padding:.75rem 1rem;flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch}.away-digest-modal{width:100%;max-width:100%;height:100%;max-height:100%}.away-digest-ranges{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.4rem}.away-digest-ranges .filter-btn{min-height:38px;padding:.4rem .5rem}.away-digest-custom-range,.away-digest-custom-range.active{grid-template-columns:1fr}.away-digest-summary{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem}.away-digest-item{grid-template-columns:1fr;gap:.5rem}.away-digest-action{width:100%;min-height:38px}.modal-footer,.form-actions{padding:.75rem 1rem;padding-bottom:calc(.75rem + var(--safe-area-bottom))}.ios-device .terminal-container{padding-bottom:var(--safe-area-bottom)}.main{flex:1;min-height:0}.cli-info-bar{display:block}.terminal-container{height:100%;min-height:0;position:relative;overflow:visible;touch-action:none}.terminal-container .xterm,.terminal-container .xterm-viewport,.terminal-container .xterm-screen{touch-action:none}.response-viewer{padding-bottom:var(--safe-area-bottom, 0px);max-height:88vh;max-height:92dvh}.response-viewer-body{font-size:14.5px;line-height:1.65;padding:16px 16px 24px;--rv-content-max: 100%}.response-viewer-body .rv-text pre,.response-viewer-body pre{padding:12px 14px;margin-left:-4px;margin-right:-4px;border-radius:6px}.response-viewer-body .rv-text pre code,.response-viewer-body pre code{font-size:11.5px;line-height:1.5}.response-viewer-body .rv-text h1,.response-viewer-body>h1{font-size:1.35em}.response-viewer-body .rv-text h2,.response-viewer-body>h2{font-size:1.2em}.response-viewer-body .rv-text h3,.response-viewer-body>h3{font-size:1.08em}.welcome-content{max-width:calc(100vw - 1.5rem);padding:1rem .75rem}.welcome-title{font-size:1.2rem;margin-bottom:.5rem}.welcome-desc{font-size:.8rem;margin-bottom:.4rem}.welcome-actions{margin-top:1rem}.welcome-primary{width:100%;justify-content:center;min-height:44px;font-size:.9rem}.welcome-chip{height:40px;border-radius:20px}.history-show-more{display:block;margin-bottom:.75rem}.welcome-ralph-link{display:block;margin:.75rem auto 0}.welcome-hint{font-size:.7rem;margin-top:.75rem}.modal-wizard{display:flex;flex-direction:column}.wizard-progress{padding:.5rem}.wizard-step{padding:.3rem}.wizard-step-number{width:24px;height:24px;font-size:.7rem}.wizard-step-label{display:none}.timer-banner{padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right))}.respawn-banner{padding:.3rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));font-size:.65rem}.respawn-compact-layout{flex-direction:column;gap:.15rem}.respawn-status-col{flex-shrink:1;min-width:0;gap:.1rem}.respawn-status-row1{flex-wrap:wrap;gap:.25rem;row-gap:.1rem}.respawn-state{font-size:.6rem;padding:.05rem .3rem}.respawn-banner .detection-confidence{font-size:.5rem;padding:.02rem .2rem}.respawn-cycles{font-size:.55rem}.respawn-timer{font-size:.55rem;padding:0 .25rem}.respawn-tokens{font-size:.55rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:120px}.respawn-indicator{font-size:.65rem}.respawn-banner .btn-icon-only{min-width:36px;min-height:36px;font-size:1rem;display:flex;align-items:center;justify-content:center;margin-left:auto;border-radius:6px;flex-shrink:0}.respawn-status-row2{font-size:.55rem;gap:.3rem;min-height:0;flex-wrap:wrap}.respawn-banner .detection-hook,.respawn-banner .detection-ai-check,.respawn-banner .detection-status{font-size:.55rem;padding:.02rem .2rem}.respawn-countdown-timers{gap:.2rem}.respawn-countdown-timer{font-size:.5rem;padding:.02rem .2rem;gap:.15rem}.respawn-countdown-timer .respawn-timer-bar{display:none}.respawn-action-log{border-left:none;border-top:1px solid rgba(34,197,94,.15);padding-left:0;padding-top:.15rem;max-height:1.4em;font-size:.55rem;overflow:hidden}.respawn-header{flex-direction:row;gap:.4rem;align-items:center}.respawn-header .respawn-actions{display:flex;gap:.3rem;flex-shrink:0}.respawn-header .respawn-actions .btn-toolbar{min-height:28px!important;font-size:.7rem!important;padding:.2rem .5rem!important;border-radius:5px}.duration-presets{display:flex;flex-wrap:wrap;gap:.2rem}.duration-preset-btn{min-height:24px;padding:.1rem .4rem;font-size:.6rem;border-radius:4px;text-align:center}.duration-custom{display:flex;gap:.2rem;align-items:center}.duration-custom-input.visible{flex:0 1 auto}.duration-custom-input input{width:64px;min-height:24px;font-size:16px;padding:.1rem .3rem}.preset-selector{display:grid;grid-template-columns:1fr 1fr;gap:.25rem}.preset-selector select{grid-column:1 / -1;min-height:32px;font-size:16px;border-radius:5px;padding:.2rem .4rem}.preset-selector .btn{min-height:32px;font-size:.65rem;border-radius:5px;padding:.2rem .4rem}#sessionOptionsModal textarea{font-size:16px;min-height:32px!important;max-height:56px;height:auto!important;border-radius:6px;padding:.3rem .5rem}#modalRespawnPrompt{min-height:32px!important;max-height:56px}#modalRespawnKickstart{min-height:32px!important;max-height:48px}#sessionOptionsModal .checkbox-inline{min-height:30px;font-size:.75rem;padding:.15rem 0;gap:.4rem}#sessionOptionsModal .checkbox-inline input[type=checkbox]{width:18px;height:18px}#sessionOptionsModal .respawn-loop-title{font-size:.75rem}#sessionOptionsModal .respawn-loop-box .checkbox-inline{font-size:.65rem}#sessionOptionsModal .respawn-options-row{gap:.5rem}#sessionOptionsModal .form-section-header{margin-top:.75rem;padding-top:.5rem;font-size:.65rem}#sessionOptionsModal .form-row{margin-bottom:.5rem}#sessionOptionsModal .form-row label{font-size:.65rem;margin-bottom:.2rem}#sessionOptionsModal .form-hint{font-size:.6rem;margin-top:.2rem}.context-setting{padding:.625rem}.context-setting-header{flex-wrap:wrap;gap:.4rem}.context-setting-header .input-suffix-sm input{width:60px;font-size:16px;min-height:36px}.context-setting input[type=text]{font-size:16px;min-height:36px;padding:.4rem .6rem;border-radius:6px}.color-picker{gap:8px}.color-swatch{width:36px;height:36px;border-radius:6px}.form-row-switch{min-height:40px;gap:.4rem}.context-settings-grid input[type=number]{font-size:16px;min-height:36px}.ralph-limits-grid{grid-template-columns:1fr 1fr;gap:.5rem}.ralph-limits-grid .form-col input[type=number]{font-size:16px;min-height:36px;padding:.4rem .5rem;border-radius:6px}#modalRalphPhrase{font-size:16px;min-height:40px;border-radius:6px}.ralph-config-actions{margin-top:1rem}.ralph-config-actions .btn-toolbar{width:100%;min-height:44px;font-size:.85rem;border-radius:8px}.run-summary-filters{gap:.3rem;margin-bottom:.5rem}.filter-btn{padding:.35rem .75rem;font-size:.7rem;min-height:32px}.timeline-event{padding:.4rem .5rem;margin-bottom:.25rem;font-size:.7rem}.run-summary-footer{flex-direction:column;gap:.4rem;padding:.5rem 0}.run-summary-actions{flex-wrap:wrap;gap:.3rem}.run-summary-actions .btn-toolbar{flex:1;min-height:36px;font-size:.7rem;white-space:nowrap}.auto-refresh-label{font-size:.7rem}.ralph-panel{font-size:.75rem}.ralph-summary{padding:.4rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right))}.project-insights-panel{max-width:100%;font-size:.65rem;bottom:calc(44px + 2rem + var(--safe-area-bottom))}.file-browser-panel{max-width:100%;max-height:50vh;bottom:calc(44px + 2rem + var(--safe-area-bottom))}.file-preview-window{width:100vw;max-width:100vw;height:var(--app-height, 100vh);max-height:var(--app-height, 100vh);border-radius:0;border-left:none;border-right:none}.file-preview-window,.file-preview-window.expanded{width:100vw!important;height:var(--app-height, 100vh)!important}#filePreviewExpandBtn,.file-preview-resize{display:none}.file-preview-editbar{padding-bottom:calc(.4rem + var(--safe-area-bottom))}.file-preview-overlay .file-preview-footer{padding-bottom:calc(.35rem + var(--safe-area-bottom))}.file-preview-body textarea.file-preview-editor{font-size:16px}.notification-drawer{width:100%;max-width:100%;right:0;border-radius:0;padding-left:var(--safe-area-left);padding-right:var(--safe-area-right);padding-bottom:var(--safe-area-bottom)}input,textarea,[contenteditable]{scroll-margin-bottom:200px;scroll-margin-top:80px}.keyboard-visible .modal-body{max-height:40vh;overflow-y:auto}.keyboard-visible #createCaseModal .modal-body{max-height:60vh}.mobile-case-picker .modal-backdrop{background:#00000080}.mobile-case-picker-sheet{max-height:80vh;max-height:80dvh;animation:slideUp .2s ease-out}@keyframes slideUp{0%{transform:translateY(100%)}to{transform:translateY(0)}}.mobile-case-picker-header .modal-close{width:32px;height:32px;font-size:1.5rem}.keyboard-visible .mobile-case-picker-sheet{max-height:45vh}.keyboard-visible .mobile-case-picker-body{max-height:28vh}.mobile-case-picker-footer{padding-bottom:calc(12px + var(--safe-area-bottom))}#createCaseModal .form-row{margin-bottom:1rem}#createCaseModal .form-row label{font-size:.8rem;margin-bottom:.4rem;font-weight:500;color:#e5e7eb}#createCaseModal .form-row input[type=text]{min-height:44px;font-size:16px;padding:.5rem .75rem;border-radius:8px}#createCaseModal .form-row .form-hint{font-size:.65rem;margin-top:.35rem;line-height:1.4}#createCaseModal .form-actions{padding:.75rem 1rem;padding-bottom:calc(.75rem + var(--safe-area-bottom));gap:.75rem}#createCaseModal .form-actions .btn-toolbar{min-height:44px!important;max-height:44px!important;height:44px!important;font-size:.85rem!important;font-weight:500;border-radius:8px}#caseModalSubmit.loading{opacity:.6;pointer-events:none}#createCaseModal.from-mobile .modal-content{animation:caseModalSlideUp .25s ease-out}@keyframes caseModalSlideUp{0%{transform:translateY(30px);opacity:0}to{transform:translateY(0);opacity:1}}.btn-case-create-mobile{min-height:48px!important;max-height:48px!important;height:48px!important;font-size:.85rem!important;font-weight:500;border-radius:10px}.settings-grid{grid-template-columns:1fr;gap:.35rem}.settings-grid-3col{grid-template-columns:1fr 1fr 1fr}.settings-item{padding:.35rem .5rem;font-size:.7rem}.settings-item-label{font-size:.7rem}.settings-section-header{font-size:.6rem;padding:.35rem 0 .2rem;margin-top:.5rem}.form-row{margin-bottom:.5rem}.form-row label{font-size:.7rem;margin-bottom:.2rem}.form-row .form-hint{font-size:.6rem}.form-row input[type=text],.form-row input[type=number],.form-row textarea,.form-row .form-select,.form-row select{font-size:.75rem;padding:.35rem .5rem;min-height:32px}.form-row-switch{gap:.3rem}.form-row-switch>label:first-child{font-size:.7rem}.form-section-header{font-size:.6rem;margin-top:.75rem}.event-type-grid{grid-template-columns:1fr 36px 36px 36px;gap:4px 4px;padding:6px;margin-top:6px}.event-header{font-size:.55rem}.event-label{font-size:.65rem}.event-type-grid input[type=checkbox]{width:12px;height:12px}.form-actions{gap:.5rem}.form-actions .btn-toolbar{flex:1;min-height:36px!important;max-height:36px!important;height:36px!important;font-size:.75rem!important}.subagent-window{position:fixed;width:calc(100% - 8px);max-width:calc(100% - 8px);height:110px;min-height:80px;max-height:110px;min-width:200px;border-radius:6px;resize:none;box-shadow:0 2px 8px #0006}.subagent-window:after{display:none}.subagent-window-header{padding:.2rem .4rem;min-height:24px}.subagent-window-title{gap:.2rem;overflow:hidden}.subagent-window-title .icon{font-size:.7rem}.subagent-window-title .id{font-size:.6rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:45vw}.subagent-window-title .status{font-size:.45rem;padding:.05rem .15rem}.subagent-model-badge{font-size:.45rem!important;padding:.05rem .15rem!important}.subagent-window-actions button{font-size:.7rem;padding:.15rem .35rem;min-width:26px;min-height:26px;display:flex;align-items:center;justify-content:center}.subagent-window-body{font-size:.6rem;padding:.2rem .35rem}.subagent-window-body .activity-line{gap:.15rem;padding:.05rem 0}.subagent-window-body .activity-line .time{font-size:.5rem}.subagent-window-body .activity-line .tool-name,.subagent-window-body .activity-line .tool-detail{font-size:.55rem}.subagent-window-parent{display:none}.session-tab .tab-subagent-badge{height:14px;padding:0 3px;border-radius:7px;margin-left:2px}.session-tab .tab-subagent-badge .subagent-label{font-size:.45rem}.subagent-dropdown{position:fixed!important;left:8px!important;right:8px!important;bottom:auto!important;min-width:auto!important;max-width:none!important;border-radius:8px;transform:none!important}.mobile-overview.visible{position:absolute;inset:0;z-index:10;display:flex;flex-direction:column;gap:.75rem;padding:.75rem .6rem calc(1rem + var(--safe-area-bottom));background:var(--bg-dark);overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.mobile-overview-top{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:0}.mobile-overview-brand{display:inline-flex;align-items:center;min-height:48px;font-size:1.5rem;font-weight:800;line-height:1;color:var(--accent-hover);letter-spacing:-.02em}.mobile-overview-header{position:relative;display:flex;flex-direction:column}.mobile-overview-run-group{display:flex;align-items:stretch;flex-shrink:0}.mobile-overview-run-group .mobile-overview-run{display:inline-flex;align-items:center;gap:.4rem;min-height:48px!important;height:48px!important;max-height:48px!important;padding:0 1.15rem!important;font-size:.95rem!important;line-height:1;font-weight:700;font-family:inherit;border-radius:10px 0 0 10px!important}.mobile-overview-run-mode{font-weight:600;font-size:.85rem;opacity:.8}.mobile-overview-run-group .mobile-overview-run-caret{display:inline-flex;align-items:center;justify-content:center;min-height:48px!important;height:48px!important;max-height:48px!important;min-width:48px!important;width:48px!important;padding:0!important;line-height:1;font-family:inherit;border-radius:0 10px 10px 0!important}.mobile-overview-run-group .mobile-overview-run-caret svg{display:block;width:20px!important;height:20px!important;margin:0!important}.mobile-overview-run-menu{display:flex;flex-direction:column;gap:.15rem;margin:.5rem 0 0;padding:.35rem;border:1px solid var(--border);border-radius:12px;background:var(--floating-bg);box-shadow:var(--elevated-shadow)}.mobile-overview-run-option{display:flex;align-items:center;gap:.5rem;min-height:44px;padding:0 .6rem;border:none;border-radius:8px;background:transparent;color:var(--text);font-family:inherit;font-size:.82rem;text-align:left}.mobile-overview-run-option.selected{background:var(--control-bg-hover)}.mobile-overview-run-option:active{background:var(--bg-hover)}.mobile-overview-run-option--add{color:var(--accent)}.mobile-overview-run-header{padding:.4rem .6rem .2rem;font-size:.6rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--text-muted)}.mobile-overview-section{display:flex;flex-direction:column;gap:.4rem}.mobile-overview-heading{display:flex;align-items:center;gap:.35rem;margin:.35rem 0 0;padding:0;font-size:.65rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--text-muted)}.mobile-overview-heading-count{color:var(--text-dim);font-weight:600}.mobile-overview-empty{margin:0;padding:.5rem 0;font-size:.75rem;color:var(--text-muted)}.mobile-overview-row{display:flex;align-items:center;gap:.6rem;width:100%;min-height:56px;padding:.5rem .7rem;border:1px solid var(--border);border-radius:12px;background:var(--bg-card);color:var(--text);font-family:inherit;text-align:left}.mobile-overview-row:active{background:var(--bg-hover)}.mobile-overview-row-wrap{width:100%}.mobile-overview-approval-strip{display:flex;flex-wrap:wrap;gap:.4rem;padding:.4rem .2rem .1rem}.mobile-overview-approval-btn{border:1px solid var(--border);border-radius:8px;background:var(--bg-card);color:var(--text);font-family:inherit;font-size:.72rem;padding:.35rem .6rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-overview-approval-btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.mobile-overview-approval-btn.danger{border-color:var(--error);color:var(--error)}.mobile-overview-row--needs{border-color:var(--red);animation:mobile-overview-blink-red 2.5s ease-in-out infinite}.mobile-overview-row--waiting{border-color:var(--yellow);animation:mobile-overview-blink-yellow 3.5s ease-in-out infinite}.mobile-overview-row--error{border-color:var(--red)}.mobile-overview-row--working{border-color:var(--green);animation:mobile-overview-breathe-green 2.2s ease-in-out infinite}@keyframes mobile-overview-breathe-green{0%,to{background:var(--bg-card);border-color:var(--border)}50%{background:#22c55e1a;border-color:var(--green)}}.mobile-overview-pill--working:after{content:"";display:inline-block;width:.75em;text-align:left;animation:mobile-overview-pill-dots 1.5s steps(1,end) infinite}@keyframes mobile-overview-pill-dots{0%{content:""}25%{content:"."}50%{content:".."}75%{content:"..."}}@keyframes mobile-overview-blink-red{0%,to{background:var(--bg-card);border-color:var(--border)}50%{background:#ef444424;border-color:var(--red)}}@keyframes mobile-overview-blink-yellow{0%,to{background:var(--bg-card);border-color:var(--border)}50%{background:#eab3081f;border-color:var(--yellow)}}.mobile-overview-row-body{display:flex;flex-direction:column;gap:.15rem;flex:1;min-width:0}.mobile-overview-row-title{display:block;font-size:.9rem;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-overview-row-case{color:var(--text-dim);font-weight:500}.mobile-overview-row-sub{display:block;font-size:.68rem;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-overview-row-meta{display:flex;align-items:center;gap:.3rem;min-width:0;font-family:var(--font-mono, monospace);font-size:.63rem;color:var(--text-muted);white-space:nowrap;overflow:hidden}.mobile-overview-meta-item{min-width:0;overflow:hidden;text-overflow:ellipsis}.mobile-overview-meta-key{margin-right:.3rem;opacity:.6;text-transform:uppercase;letter-spacing:.05em}.mobile-overview-meta-sep{opacity:.45}.mobile-overview-row--working .mobile-overview-meta-since{color:var(--green);opacity:.95}.mobile-overview-dot{flex-shrink:0;width:9px;height:9px;border-radius:50%;background:var(--text-muted)}.mobile-overview-dot--needs,.mobile-overview-dot--error{background:var(--red)}.mobile-overview-dot--waiting{background:var(--yellow)}.mobile-overview-dot--working{background:var(--green);animation:pulse 1.5s infinite;box-shadow:0 0 8px 2px color-mix(in srgb,var(--green) 55%,transparent);will-change:opacity}.mobile-overview-dot{position:relative}.mobile-overview-dot--working:after{content:"";position:absolute;inset:-4px;border:2px solid rgba(34,197,94,.25);border-top-color:var(--green);border-radius:50%;animation:tab-load-spin .7s linear infinite}.mobile-overview-dot--idle{background:var(--green)}.mobile-overview-dot--done{background:var(--text-muted);opacity:.5}.mobile-overview-pill{flex-shrink:0;display:inline-flex;align-items:center;gap:.25rem;padding:.2rem .45rem;border:1px solid var(--border-light);border-radius:999px;font-size:.62rem;font-weight:600;color:var(--text-dim);white-space:nowrap}.mobile-overview-pill--needs,.mobile-overview-pill--error{border-color:var(--red);color:var(--red)}.mobile-overview-pill--waiting{border-color:var(--yellow);color:var(--yellow)}.mobile-overview-pill--idle,.mobile-overview-pill--working{border-color:var(--green);color:var(--green)}.mobile-overview-pill--exited{border-color:var(--text-muted);color:var(--text-muted)}.mobile-overview-pill--watching{border-color:var(--accent);color:var(--accent)}.mobile-overview-chevron{flex-shrink:0;color:var(--text-muted);font-size:1rem;line-height:1}.mobile-overview-row--past{background:transparent;border-style:dashed}.mobile-overview-row--past .mobile-overview-row-title{font-weight:500;color:var(--text-dim)}.mobile-overview-dot--past{background:transparent;border:1px solid var(--border-light)}.mobile-overview-pill--past{border-color:var(--border-light);color:var(--text-muted)}.mobile-overview-more{display:flex;align-items:center;justify-content:center;gap:.35rem;min-height:40px;border:none;border-radius:10px;background:var(--control-bg);color:var(--text-dim);font-family:inherit;font-size:.72rem;font-weight:600}.mobile-overview-more-count{padding:.05rem .35rem;border-radius:999px;background:var(--control-bg-hover);color:var(--text-muted)}}@media(prefers-reduced-motion:reduce){.mobile-overview-row--needs,.mobile-overview-row--waiting{animation:none}.mobile-overview-row--needs{background:#ef444424}.mobile-overview-row--waiting{background:#eab3081f}.mobile-overview-dot--working{animation:none}.mobile-overview-dot--working:after{border-color:var(--green);animation:none}.mobile-overview-row--working{animation:none}.mobile-overview-pill--working:after{content:"...";animation:none}}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.header,.toolbar,.keyboard-accessory-bar){background:var(--glass-bg);border-color:var(--glass-border);color:var(--text)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-voice-mobile,.btn-attach-mobile,.btn-settings-mobile,.btn-toolbar.btn-shell,.accessory-btn:not(.armed)){background:var(--control-bg);border-color:var(--control-border);color:var(--text-dim)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-voice-mobile:active,.btn-attach-mobile:active,.btn-settings-mobile:active,.btn-toolbar.btn-shell:hover,.btn-toolbar.btn-shell:active,.accessory-btn:active){background:var(--control-bg-hover);border-color:var(--control-border-hover);color:var(--text)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) .btn-attach-mobile-wrap:active .btn-attach-mobile{background:var(--control-bg-hover);border-color:var(--control-border-hover);color:var(--text)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-claude,.btn-toolbar.btn-run-gear.mode-claude){background:linear-gradient(135deg,var(--accent-grad-a),var(--accent-grad-b));border-color:var(--accent);color:var(--accent-ink)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-opencode,.btn-toolbar.btn-run-gear.mode-opencode){background:linear-gradient(135deg,var(--accent-d),var(--accent-grad-b));border-color:var(--accent);color:var(--accent-ink)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-gemini,.btn-toolbar.btn-run-gear.mode-gemini){background:linear-gradient(135deg,#174ea6,#4f46e5);border-color:#315fc3;color:#fff}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-antigravity,.btn-toolbar.btn-run-gear.mode-antigravity){background:linear-gradient(135deg,#0e7490,#0891b2);border-color:#155e75;color:#fff}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-pi,.btn-toolbar.btn-run-gear.mode-pi){background:linear-gradient(135deg,#be185d,#db2777);border-color:#9d174d;color:#fff}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-omp,.btn-toolbar.btn-run-gear.mode-omp){background:linear-gradient(135deg,#4f46e5,#6366f1);border-color:#4338ca;color:#fff}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-copilot,.btn-toolbar.btn-run-gear.mode-copilot){background:linear-gradient(135deg,#6d28d9,#8b5cf6);border-color:#5b21b6;color:#fff}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-grok,.btn-toolbar.btn-run-gear.mode-grok){background:linear-gradient(135deg,#27272a,#52525b);border-color:#18181b;color:#fff}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.btn-toolbar.btn-run.mode-deepseek,.btn-toolbar.btn-run-gear.mode-deepseek){background:linear-gradient(135deg,#2740c4,#4d6bfe);border-color:#1b2a8f;color:#fff}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) .btn-toolbar.btn-run-gear{border-left-color:var(--control-border-hover)!important}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.case-settings-popover-mobile,.mobile-case-picker-sheet){background:var(--floating-bg);border-color:var(--control-border);color:var(--text);box-shadow:var(--elevated-shadow)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) :is(.case-settings-popover-mobile .checkbox-inline,#createCaseModal .form-row label){color:var(--text)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) .case-settings-popover-mobile .form-hint{color:var(--text-muted)}html:is([data-skin=paper-gray],[data-skin=solarized-light],[data-skin=catppuccin-latte],[data-skin=rose-pine-dawn]) .mobile-case-picker .modal-backdrop{background:var(--modal-backdrop)}.ios-device.safari-browser{overscroll-behavior:none}@media(hover:none)and (pointer:coarse){.session-tab .tab-close,.session-tab .tab-gear,.session-tab .tab-new{opacity:1;width:auto;padding:.15rem .25rem;align-items:center;justify-content:center}.btn-toolbar:hover,.btn-icon-header:hover{transform:none}.subagent-dropdown-trigger:active+.subagent-dropdown-menu,.subagent-dropdown-trigger:focus+.subagent-dropdown-menu{display:block}}@media(max-width:599px){.attachment-history-drawer{top:0;bottom:0;width:100%;max-width:100%;height:100vh;height:100dvh;border-left:none;border-radius:0;padding-top:var(--safe-area-top);padding-left:var(--safe-area-left);padding-right:var(--safe-area-right);padding-bottom:var(--safe-area-bottom)}.attachment-history-header{padding:12px}.attachment-history-list{padding:6px}.attachment-history-item{grid-template-columns:104px minmax(0,1fr);gap:8px;padding:8px 6px}.attachment-history-thumb{width:104px}.attachment-history-actions{gap:4px}.attachment-history-actions button{padding:4px 7px}}@media(max-width:599px){.reboot-restore-banner{padding:.4rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));font-size:.7rem;gap:.4rem}.reboot-restore-banner-detail,.reboot-restore-banner-note{display:none}.reboot-restore-banner-text{min-width:0;overflow:hidden;text-overflow:ellipsis}.reboot-restore-banner-accept,.reboot-restore-banner-dismiss{padding:.25rem .5rem}.reboot-restore-banner-accept{margin-left:auto}.offline-banner{padding:.4rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));font-size:.7rem;gap:.4rem}.offline-banner-detail{display:none}.offline-banner-retry{padding:.25rem .5rem;margin-left:auto}.offline-overlay-card{padding:22px 18px 18px}.offline-overlay-title{font-size:1.05rem}.offline-overlay-actions{flex-direction:column}.offline-overlay-btn{width:100%;padding:.65rem 1rem}}@media(max-width:860px){:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .modal-content.modal-lg{width:100%;max-width:100%;height:100%;max-height:100%}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-body{display:flex;flex-direction:column;min-height:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-rail{flex-direction:row;align-items:center;border-right:0;border-bottom:1px solid var(--border);background:transparent;padding:10px 14px;overflow:visible;flex-shrink:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-rail-items,:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-rail-foot{display:none}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-search{margin:0;flex:1}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-search input{padding:9px 10px 9px 30px;border-radius:10px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-head-actions:has(.set-head-save){padding:3px;border:1px solid var(--border);border-radius:12px;background:var(--bg-input)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-head-save{display:inline-flex;height:36px;padding:0 16px;font-size:.86rem}#createCaseModal .set-head-save.loading{opacity:.6;pointer-events:none}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-head-actions .modal-close{width:36px;height:36px;font-size:1.35rem}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-foot{display:none}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-doc{padding:0 14px 34px;flex:1}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump{display:flex;position:sticky;top:0;z-index:4;align-items:center;gap:8px;width:100%;margin:10px 0 2px;padding:10px 12px;border-radius:11px;font:inherit;font-size:.82rem;color:var(--text);background:rgba(var(--accent-rgb),.13);border:1px solid rgba(var(--accent-rgb),.3);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);cursor:pointer}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-ico{color:var(--accent);flex-shrink:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-label{font-weight:580;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-chev{margin-left:auto;color:var(--text-muted);flex-shrink:0;transition:transform .18s}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump[aria-expanded=true] .set-jump-chev{transform:rotate(180deg)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-veil{display:none;position:fixed;inset:0;z-index:8;background:#04080d9e}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-menu{display:none;position:absolute;left:14px;right:14px;z-index:9;padding:7px;border-radius:16px;background:var(--bg-card);border:1px solid var(--control-border);box-shadow:var(--elevated-shadow);max-height:70vh;overflow-y:auto}#appSettingsModal.jump-open .set-jump-veil,#appSettingsModal.jump-open .set-jump-menu{display:block}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-row{display:flex;align-items:center;gap:11px;width:100%;padding:11px 12px;border:0;border-radius:11px;background:transparent;color:var(--text-dim);font:inherit;font-size:.82rem;text-align:left}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-row svg{color:var(--text-muted);flex-shrink:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-row .set-jump-count{margin-left:auto;font-size:.62rem;color:var(--text-muted)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-row.active{background:rgba(var(--accent-rgb),.14);color:var(--text);font-weight:570}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-jump-row.active svg{color:var(--accent)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-section{padding-top:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-section+.set-section{border-top:0;margin-top:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-section-head{gap:7px;margin:18px 0 2px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-section-head svg{padding:0;border:0;background:none;color:var(--text-muted);width:12px;height:12px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-section-head h2{font-size:.6rem;font-weight:640;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-section-head:after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--border),transparent)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-section-blurb{display:none}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-preview{margin-bottom:12px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-preview-stage{min-height:62px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group{margin-top:14px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group+.set-group{margin-top:16px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-head{margin-bottom:7px;padding:0 3px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-hint{padding:0 3px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body{gap:0;background:#ffffff09;border:1px solid rgba(255,255,255,.06);border-radius:13px;overflow:hidden}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body>.set-row{background:transparent;border:0;border-radius:0;padding:12px 13px;gap:12px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body>.set-row+.set-row{border-top:1px solid rgba(255,255,255,.055)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body>.set-chips,:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body>.set-modelgrid,:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body>.set-minigrid,:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body>#appSettingsShortcutsList{padding:12px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-group-body>.event-type-grid{padding:12px;margin:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-row-label{font-size:.84rem}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-row-desc{font-size:.69rem;max-width:none}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-row.has-field{flex-direction:column;align-items:stretch;gap:9px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-row.has-field .set-select,:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-row.has-field .set-input{width:100%;min-width:0;max-width:none;box-sizing:border-box}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-row-actions-wide{width:100%}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-row-actions-wide .set-input{flex:1;min-width:0}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-num{width:76px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .switch-sm{width:40px;height:24px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .switch-sm .slider:before{height:18px;width:18px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .switch-sm input:checked+.slider:before{transform:translate(16px)}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-chip{font-size:.78rem;padding:9px 14px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-modelgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-minigrid{grid-template-columns:1fr}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-mini .set-select{width:148px}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-segment{overflow-x:auto;scrollbar-width:none}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-segment::-webkit-scrollbar{display:none}:is(#appSettingsModal,#sessionOptionsModal,#createCaseModal) .set-segment button{flex:0 0 auto;padding:8px 12px}}@media(max-width:860px){:is(#sessionOptionsModal,#createCaseModal) .set-rail{padding:8px 10px}:is(#sessionOptionsModal,#createCaseModal) .set-rail-items{display:flex;flex-direction:row;flex:1;min-width:0;gap:4px;overflow-x:auto;scrollbar-width:none}:is(#sessionOptionsModal,#createCaseModal) .set-rail-items::-webkit-scrollbar{display:none}:is(#sessionOptionsModal,#createCaseModal) .set-rail-item{white-space:nowrap;padding:8px 12px}:is(#sessionOptionsModal,#createCaseModal) .set-rail-item.active:before{display:none}:is(#sessionOptionsModal,#createCaseModal) .set-rail-item.active{background:rgba(var(--accent-rgb),.13)}}html[data-session-list=sidebar] .session-sidebar{position:absolute;top:0;bottom:0;left:0;width:min(280px,80vw);flex:0 0 auto;transform:translate(-100%);visibility:hidden;transition:transform var(--sidebar-transition),visibility var(--sidebar-transition);box-shadow:10px 0 28px #0000005c;z-index:12;padding-left:var(--safe-area-left)}html[data-session-list=sidebar][data-sidebar-detail=rich] .session-sidebar{width:min(280px,80vw);flex:0 0 auto}html[data-session-list=sidebar] .session-sidebar.open{transform:translate(0);visibility:visible}html[data-session-list=sidebar][data-sidebar=collapsed] .session-sidebar{flex-basis:auto;width:min(280px,80vw)}html[data-session-list=sidebar][data-sidebar=collapsed] .session-sidebar-head,html[data-session-list=sidebar][data-sidebar=collapsed] .session-sidebar-filter{display:flex}html[data-session-list=sidebar][data-sidebar=collapsed] .session-sidebar .session-tab{justify-content:flex-start;flex-wrap:nowrap;padding:.4rem .5rem}html[data-session-list=sidebar][data-sidebar=collapsed] .session-sidebar .tab-info{display:flex}html[data-session-list=sidebar][data-sidebar=collapsed] .session-sidebar .tab-number{display:inline-flex}html[data-session-list=sidebar][data-sidebar=collapsed] .session-sidebar .tab-subagent-badge{margin-left:4px}html[data-session-list=sidebar] .session-sidebar .session-tab{min-height:44px;max-height:none;flex-shrink:0}html[data-session-list=sidebar] .session-sidebar .session-tab .tab-gear,html[data-session-list=sidebar] .session-sidebar .session-tab .tab-new,html[data-session-list=sidebar] .session-sidebar .session-tab .tab-close{display:inline-flex;align-items:center;justify-content:center;opacity:1;width:auto;min-width:28px;height:auto;margin-left:0;padding:.15rem .25rem}@media(prefers-reduced-motion:reduce){html[data-session-list=sidebar] .session-sidebar{transition:none}}@media(vertical-viewport-segments:2){.response-viewer{max-height:min(88vh,env(viewport-segment-height 0 1,88vh))}}@media(max-width:700px){.spreadsheet-sheet-tabs{padding-inline:4px;scroll-snap-type:x proximity}.spreadsheet-sheet-tab{min-width:96px;min-height:40px;scroll-snap-align:start}.spreadsheet-grid{min-height:55vh;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y}}
@@ -1,4 +1,4 @@
1
- "use strict";const AWAY_DIGEST_LAST_VIEWED_KEY="codeman-away-digest-last-viewed",FILE_BROWSER_SHOW_HIDDEN_KEY="codeman:fileBrowserShowHidden",TEXT_PREVIEW_MAX_BYTES=524288,TEXT_PREVIEW_MAX_LINES=500,MARKDOWN_PREVIEW_MAX_LINES=1e4,MARKDOWN_EXTS=new Set(["md","markdown"]),FILE_PREVIEW_PREF_KEYS={mdRendered:"codeman:filePreviewMdRendered",htmlRendered:"codeman:filePreviewHtmlRendered",lineNumbers:"codeman:filePreviewLineNumbers",wrap:"codeman:filePreviewWrap",expanded:"codeman:filePreviewExpanded"},FILE_PREVIEW_PREF_DEFAULTS={mdRendered:!0,htmlRendered:!0,lineNumbers:!1,wrap:!0,expanded:!1},FILE_PREVIEW_HISTORY_MAX=50,AWAY_DIGEST_SECTIONS=[["needsAttention","Needs Attention"],["completed","Completed"],["stillRunning","Still Running"],["idle","Idle"],["informational","Informational"]];Object.assign(CodemanApp.prototype,{_addActivityEntry(e,t,s=50){const n=this.subagentActivity.get(e)||[];n.push(t),n.length>s&&n.shift(),this.subagentActivity.set(e,n)},_onTaskCreated(e){this.renderSessionTabs(),e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onTaskCompleted(e){this.renderSessionTabs(),e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onTaskFailed(e){this.renderSessionTabs(),e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onTaskUpdated(e){e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onMuxCreated(e){this.muxSessions.push(e),this.renderMuxSessions()},_onMuxKilled(e){this.muxSessions=this.muxSessions.filter(t=>t.sessionId!==e.sessionId),this.renderMuxSessions()},_onMuxDied(e){this.muxSessions=this.muxSessions.filter(t=>t.sessionId!==e.sessionId),this.renderMuxSessions(),this.showToast("Mux session died: "+this.getShortId(e.sessionId),"warning")},_onMuxStatsUpdated(e){this.muxSessions=e,document.getElementById("monitorPanel").classList.contains("open")&&this.renderMuxSessions()},_onRemoteSessionReconnected(e){const t=this.getShortId(e.sessionId);this.showToast(`Remote session ${t} reconnected`,"success"),this.activeSessionId===e.sessionId&&this._pollHostReachability?.(!0)},_onRemoteReconnectExhausted(e){const t=e.sessionId,s=this.getShortId(t);this.showToast(`Remote session ${s} dropped \u2014 auto-reconnect gave up`,"error",{duration:15e3,action:{label:"Reconnect",onClick:()=>{this.sessions&&this.sessions.has(t)?this.selectSession(t,{forceReload:!0}):this.showToast("Session no longer available","warning")}}})},_onBashToolStart(e){this.handleBashToolStart(e.sessionId,e.tool)},_onBashToolEnd(e){this.handleBashToolEnd(e.sessionId,e.tool)},_onBashToolsUpdate(e){this.handleBashToolsUpdate(e.sessionId,e.tools)},_onSubagentDiscovered(e){this.subagents.set(e.agentId,e),this.subagentActivity.set(e.agentId,[]),this.subagentToolResults.delete(e.agentId),this.subagentWindows.has(e.agentId)&&this.forceCloseSubagentWindow(e.agentId),this.renderSubagentPanel(),this.findParentSessionForSubagent(e.agentId),requestAnimationFrame(()=>{this.updateConnectionLines()});const t=this.subagentParentMap.get(e.agentId);this._notifySession(t||e.sessionId,"info","subagent-spawn","Subagent Spawned",e.description||"New background agent started")},_onSubagentUpdated(e){const t=this.subagents.get(e.agentId);t?(Object.assign(t,e),this.subagents.set(e.agentId,t)):this.subagents.set(e.agentId,e),this.renderSubagentPanel(),this.subagentWindows.has(e.agentId)&&(this.renderSubagentWindowContent(e.agentId),this.updateSubagentWindowHeader(e.agentId))},_onSubagentToolCall(e){this._addActivityEntry(e.agentId,{type:"tool",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.renderSubagentPanel(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},_onSubagentProgress(e){this._addActivityEntry(e.agentId,{type:"progress",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},_onSubagentMessage(e){this._addActivityEntry(e.agentId,{type:"message",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},_onSubagentToolResult(e){this.subagentToolResults.has(e.agentId)||this.subagentToolResults.set(e.agentId,new Map);const t=this.subagentToolResults.get(e.agentId);if(t.set(e.toolUseId,e),t.size>50){const s=t.keys().next().value;t.delete(s)}this._addActivityEntry(e.agentId,{type:"tool_result",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},async _onSubagentCompleted(e){const t=this.subagents.get(e.agentId);if(t&&(t.status="completed",this.subagents.set(e.agentId,t)),this.renderSubagentPanel(),this.updateSubagentWindows(),this.subagentWindows.has(e.agentId)){const n=this.subagentWindows.get(e.agentId);n&&!n.minimized&&(await this.closeSubagentWindow(e.agentId),this.saveSubagentWindowStates())}const s=this.subagentParentMap.get(e.agentId);this._notifySession(s||t?.sessionId||e.sessionId,"info","subagent-complete","Subagent Completed",t?.description||e.description||"Background agent finished"),setTimeout(()=>{this.subagents.get(e.agentId)?.status==="completed"&&(this.subagentActivity.delete(e.agentId),this.subagentToolResults.delete(e.agentId))},300*1e3),setTimeout(()=>{this.subagents.get(e.agentId)?.status==="completed"&&!this.subagentWindows.has(e.agentId)&&(this.subagents.delete(e.agentId),this.subagentParentMap.delete(e.agentId))},1800*1e3)},_onImageDetected(e){console.log("[Image Detected]",e),this.openImagePopup(e)},shouldOpenCommandPaletteFromShortcut(e){if(!e||!e.ctrlKey&&!e.metaKey&&!e.altKey)return!1;const s=typeof this.getShortcutRegistry=="function"&&typeof this.matchesShortcutEvent=="function"?this.getShortcutRegistry().find(a=>a.id==="command-palette"):null;if(s){if(s.disabled||!this.matchesShortcutEvent(e,s))return!1}else if((e.key||"").toLowerCase()!=="k"&&e.code!=="KeyK"||e.shiftKey)return!1;const n=e.target;if(!n)return!0;const i=(n.tagName||"").toUpperCase(),o=typeof n.className=="string"?n.className:"";return n.classList?.contains?.("xterm-helper-textarea")||o.includes("xterm-helper-textarea")?!0:!(i==="INPUT"||i==="TEXTAREA"||i==="SELECT"||n.isContentEditable||typeof n.closest=="function"&&n.closest('[contenteditable="true"]'))},_rememberOverlayFocus(e){this[e]=typeof document<"u"&&document.activeElement||null},_restoreOverlayFocus(e,t){const s=this[e];this[e]=null;const n=typeof document<"u"?document.body:null,i=typeof document<"u"?document.activeElement:null;if(!(i&&i!==n&&t?.contains?.(i)===!1)){if(s&&s!==n&&s.isConnected!==!1&&typeof s.focus=="function"){s.focus();return}this.activeSessionId&&this._shouldFocusTerminalForTabSwitch?.()!==!1&&this.terminal?.focus?.()}},openCommandPalette(){const e=document.getElementById("commandPaletteModal"),t=document.getElementById("commandPaletteSearch");!e||!t||(this.commandPaletteActiveIndex=0,this._resetCommandPaletteAgent(),t.value="",e.classList.add("active"),this._wireCommandPalette(),this.renderCommandPalette(),this._rememberOverlayFocus("_commandPalettePrevFocus"),t.focus(),t.select?.())},closeCommandPalette(){const e=document.getElementById("commandPaletteModal");e?.classList?.contains("active")&&(e.classList.remove("active"),this._restoreOverlayFocus("_commandPalettePrevFocus",e))},_wireCommandPalette(){if(this._commandPaletteWired)return;this._commandPaletteWired=!0;const e=document.getElementById("commandPaletteModal"),t=document.getElementById("commandPaletteSearch"),s=document.getElementById("commandPaletteList");t?.addEventListener("input",()=>{this.commandPaletteActiveIndex=0,this.renderCommandPalette()}),t?.addEventListener("keydown",async n=>{if((n.key==="ArrowLeft"||n.key==="ArrowRight")&&this._commandPaletteArrowCyclesAgent(n)){n.preventDefault(),this._cycleCommandPaletteAgent(n.key==="ArrowRight"?1:-1);return}if(n.key==="ArrowDown"){n.preventDefault(),this.moveCommandPaletteSelection(1);return}if(n.key==="ArrowUp"){n.preventDefault(),this.moveCommandPaletteSelection(-1);return}if(n.key==="Enter"){n.preventDefault(),n.stopPropagation(),await this.activateCommandPaletteItem();return}n.key==="Escape"&&(n.preventDefault(),this.closeCommandPalette())}),e?.addEventListener("keydown",n=>{n.key==="Escape"&&(n.preventDefault(),this.closeCommandPalette())}),s?.addEventListener?.("mousedown",n=>{n.target?.closest?.("[data-palette-agent-cycle]")&&n.preventDefault?.()}),s?.addEventListener?.("click",n=>{const i=n.target?.closest?.("[data-palette-agent-cycle]");if(i){n.preventDefault?.(),n.stopPropagation?.(),this._cycleCommandPaletteAgent(i.dataset.paletteAgentCycle==="prev"?-1:1);return}const o=n.target?.closest?.("[data-command-index]");o&&(this.commandPaletteActiveIndex=Number(o.dataset.commandIndex)||0,this.activateCommandPaletteItem())})},buildCommandPaletteItems(e=""){const t=e.trim().toLowerCase(),s=[...Array.isArray(this.sessionOrder)?this.sessionOrder:[],...Array.from(this.sessions?.keys?.()||[]).filter(o=>!this.sessionOrder?.includes?.(o))],n=new Set,i=[];for(const o of s){if(n.has(o))continue;n.add(o);const l=this.sessions?.get?.(o);if(!l)continue;const a=this.getSessionName?.(l)||l.name||l.title||o.slice(0,8),r=[l.workingDir,l.mode,l.status].filter(Boolean),c=[a,l.workingDir,l.mode,l.status,o].filter(Boolean).join(" ").toLowerCase();t&&!c.includes(t)||i.push({id:`session:${o}`,type:"session",sessionId:o,title:a,subtitle:r.join(" \xB7 ")})}return i.push(this._buildCommandPaletteNewSessionItem(e)),i.push({id:"browse-sessions",type:"browse-sessions",title:"Browse all sessions\u2026",subtitle:"Open Session Manager"}),i},_buildCommandPaletteNewSessionItem(e=""){const t=this._commandPaletteCaseName(e),s=this._commandPaletteAgent(t),n=s?.id||this.runMode||this._runMode||"claude",i={claude:"Claude",opencode:"OpenCode",codex:"Codex",gemini:"Gemini",antigravity:"Antigravity",pi:"Pi",grok:"Grok",deepseek:"DeepSeek",omp:"OMP",copilot:"Copilot"};return{id:"new-session",type:"new-session",caseName:t,mode:n,title:"New session",subtitle:`Run ${s?.label||i[n]||n} in ${t}`}},_commandPaletteCaseName(e=""){return this._findCommandPaletteCaseMatch(e)||document.getElementById("quickStartCase")?.value||"testcase"},_commandPaletteRowCase(){const e=(this.commandPaletteItems||[]).find(t=>t?.type==="new-session");return e?e.caseName:this._commandPaletteCaseName(document.getElementById("commandPaletteSearch")?.value||"")},_commandPaletteAgentChoices(e=this._commandPaletteRowCase()){const t=typeof window<"u"&&Array.isArray(window.__codemanCliCatalog)?window.__codemanCliCatalog:[],s=n=>typeof this._runModeAvailableForCase=="function"?this._runModeAvailableForCase(n,e):this.isCliAvailable?.(n)??!0;return t.filter(n=>n&&typeof n.id=="string"&&n.enabled&&(n.kind!=="agent"||s(n.id))).map(n=>({id:n.id,label:typeof n.label=="string"&&n.label.trim()||n.id}))},_commandPaletteAgent(e=this._commandPaletteRowCase()){const t=this._commandPaletteAgentChoices(e);if(t.length<2)return null;const s=this.runMode||this._runMode;return t.find(n=>n.id===this._commandPaletteAgentId)||t.find(n=>n.id===s)||t[0]},_resetCommandPaletteAgent(){this._commandPaletteAgentId=null},_cycleCommandPaletteAgent(e){const t=this._commandPaletteRowCase(),s=this._commandPaletteAgentChoices(t);if(s.length<2)return;const n=Math.max(0,s.findIndex(i=>i.id===this._commandPaletteAgent(t)?.id));this._commandPaletteAgentId=s[((n+e)%s.length+s.length)%s.length].id,this.renderCommandPalette()},_commandPaletteArrowCyclesAgent(e){const t=(this.commandPaletteItems||[])[this.commandPaletteActiveIndex||0];if(t?.type!=="new-session"||this._commandPaletteAgentChoices(t.caseName).length<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)return!1;const s=e.target,n=typeof s?.value=="string"?s.value:"",i=Number.isFinite(s?.selectionStart)?s.selectionStart:n.length,o=Number.isFinite(s?.selectionEnd)?s.selectionEnd:i;return i!==o?!1:e.key==="ArrowRight"?o>=n.length:i<=0},_findCommandPaletteCaseMatch(e=""){const t=e.trim().toLowerCase();if(!t||!Array.isArray(this.cases))return null;const s=o=>{const l=String(o?.name||"").trim();if(!l)return 0;const a=[l,o?.path,o?.casePath,o?.workingDir,o?.remote?.path,o?.remote?.hostId].filter(Boolean).join(" ").toLowerCase(),r=l.toLowerCase();return r===t?100:r.startsWith(t)?90:r.includes(t)?80:a.includes(t)?60:0};let n=null,i=0;for(const o of this.cases){const l=s(o);l>i&&(n=o,i=l)}return n?.name||null},renderCommandPalette(){const e=document.getElementById("commandPaletteSearch"),t=document.getElementById("commandPaletteList");if(!t)return;const s=e?.value||"",n=this.buildCommandPaletteItems(s);this.commandPaletteItems=n,this.commandPaletteActiveIndex=Math.max(0,Math.min(this.commandPaletteActiveIndex||0,n.length-1)),t.innerHTML=n.map((i,o)=>{const l=o===this.commandPaletteActiveIndex?" active":"",a=i.type==="new-session"?"+":i.type==="browse-sessions"?"\u2261":"\u203A",r=i.type==="browse-sessions"?" command-palette-item--browse":"",c=i.type==="new-session"?this._renderCommandPaletteAgentPicker(i.mode,i.caseName):"";return`
1
+ "use strict";const AWAY_DIGEST_LAST_VIEWED_KEY="codeman-away-digest-last-viewed",FILE_BROWSER_SHOW_HIDDEN_KEY="codeman:fileBrowserShowHidden",TEXT_PREVIEW_MAX_BYTES=524288,TEXT_PREVIEW_MAX_LINES=500,MARKDOWN_PREVIEW_MAX_LINES=1e4,MARKDOWN_EXTS=new Set(["md","markdown"]),FILE_PREVIEW_PREF_KEYS={mdRendered:"codeman:filePreviewMdRendered",htmlRendered:"codeman:filePreviewHtmlRendered",lineNumbers:"codeman:filePreviewLineNumbers",wrap:"codeman:filePreviewWrap",expanded:"codeman:filePreviewExpanded"},FILE_PREVIEW_PREF_DEFAULTS={mdRendered:!0,htmlRendered:!0,lineNumbers:!1,wrap:!0,expanded:!1},FILE_PREVIEW_HISTORY_MAX=50,AWAY_DIGEST_SECTIONS=[["needsAttention","Needs Attention"],["completed","Completed"],["stillRunning","Still Running"],["idle","Idle"],["informational","Informational"]];Object.assign(CodemanApp.prototype,{_addActivityEntry(e,t,s=50){const n=this.subagentActivity.get(e)||[];n.push(t),n.length>s&&n.shift(),this.subagentActivity.set(e,n)},_onTaskCreated(e){this.renderSessionTabs(),e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onTaskCompleted(e){this.renderSessionTabs(),e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onTaskFailed(e){this.renderSessionTabs(),e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onTaskUpdated(e){e.sessionId===this.activeSessionId&&this.renderTaskPanel()},_onMuxCreated(e){this.muxSessions.push(e),this.renderMuxSessions()},_onMuxKilled(e){this.muxSessions=this.muxSessions.filter(t=>t.sessionId!==e.sessionId),this.renderMuxSessions()},_onMuxDied(e){this.muxSessions=this.muxSessions.filter(t=>t.sessionId!==e.sessionId),this.renderMuxSessions(),this.showToast("Mux session died: "+this.getShortId(e.sessionId),"warning")},_onMuxStatsUpdated(e){this.muxSessions=e,document.getElementById("monitorPanel").classList.contains("open")&&this.renderMuxSessions()},_onRemoteSessionReconnected(e){const t=this.getShortId(e.sessionId);this.showToast(`Remote session ${t} reconnected`,"success"),this.activeSessionId===e.sessionId&&this._pollHostReachability?.(!0)},_onRemoteReconnectExhausted(e){const t=e.sessionId,s=this.getShortId(t);this.showToast(`Remote session ${s} dropped \u2014 auto-reconnect gave up`,"error",{duration:15e3,action:{label:"Reconnect",onClick:()=>{this.sessions&&this.sessions.has(t)?this.selectSession(t,{forceReload:!0}):this.showToast("Session no longer available","warning")}}})},_onBashToolStart(e){this.handleBashToolStart(e.sessionId,e.tool)},_onBashToolEnd(e){this.handleBashToolEnd(e.sessionId,e.tool)},_onBashToolsUpdate(e){this.handleBashToolsUpdate(e.sessionId,e.tools)},_onSubagentDiscovered(e){this.subagents.set(e.agentId,e),this.subagentActivity.set(e.agentId,[]),this.subagentToolResults.delete(e.agentId),this.subagentWindows.has(e.agentId)&&this.forceCloseSubagentWindow(e.agentId),this.renderSubagentPanel(),this.findParentSessionForSubagent(e.agentId),requestAnimationFrame(()=>{this.updateConnectionLines()});const t=this.subagentParentMap.get(e.agentId);this._notifySession(t||e.sessionId,"info","subagent-spawn","Subagent Spawned",e.description||"New background agent started")},_onSubagentUpdated(e){const t=this.subagents.get(e.agentId);t?(Object.assign(t,e),this.subagents.set(e.agentId,t)):this.subagents.set(e.agentId,e),this.renderSubagentPanel(),this.subagentWindows.has(e.agentId)&&(this.renderSubagentWindowContent(e.agentId),this.updateSubagentWindowHeader(e.agentId))},_onSubagentToolCall(e){this._addActivityEntry(e.agentId,{type:"tool",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.renderSubagentPanel(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},_onSubagentProgress(e){this._addActivityEntry(e.agentId,{type:"progress",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},_onSubagentMessage(e){this._addActivityEntry(e.agentId,{type:"message",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},_onSubagentToolResult(e){this.subagentToolResults.has(e.agentId)||this.subagentToolResults.set(e.agentId,new Map);const t=this.subagentToolResults.get(e.agentId);if(t.set(e.toolUseId,e),t.size>50){const s=t.keys().next().value;t.delete(s)}this._addActivityEntry(e.agentId,{type:"tool_result",...e}),this.activeSubagentId===e.agentId&&this.renderSubagentDetail(),this.subagentWindows.has(e.agentId)&&this.scheduleSubagentWindowRender(e.agentId)},async _onSubagentCompleted(e){const t=this.subagents.get(e.agentId);if(t&&(t.status="completed",this.subagents.set(e.agentId,t)),this.renderSubagentPanel(),this.updateSubagentWindows(),this.subagentWindows.has(e.agentId)){const n=this.subagentWindows.get(e.agentId);n&&!n.minimized&&(await this.closeSubagentWindow(e.agentId),this.saveSubagentWindowStates())}const s=this.subagentParentMap.get(e.agentId);this._notifySession(s||t?.sessionId||e.sessionId,"info","subagent-complete","Subagent Completed",t?.description||e.description||"Background agent finished"),setTimeout(()=>{this.subagents.get(e.agentId)?.status==="completed"&&(this.subagentActivity.delete(e.agentId),this.subagentToolResults.delete(e.agentId))},300*1e3),setTimeout(()=>{this.subagents.get(e.agentId)?.status==="completed"&&!this.subagentWindows.has(e.agentId)&&(this.subagents.delete(e.agentId),this.subagentParentMap.delete(e.agentId))},1800*1e3)},_onImageDetected(e){console.log("[Image Detected]",e),this.openImagePopup(e)},shouldOpenCommandPaletteFromShortcut(e){if(!e||!e.ctrlKey&&!e.metaKey&&!e.altKey)return!1;const s=typeof this.getShortcutRegistry=="function"&&typeof this.matchesShortcutEvent=="function"?this.getShortcutRegistry().find(a=>a.id==="command-palette"):null;if(s){if(s.disabled||!this.matchesShortcutEvent(e,s))return!1}else if((e.key||"").toLowerCase()!=="k"&&e.code!=="KeyK"||e.shiftKey)return!1;const n=e.target;if(!n)return!0;const i=(n.tagName||"").toUpperCase(),o=typeof n.className=="string"?n.className:"";return n.classList?.contains?.("xterm-helper-textarea")||o.includes("xterm-helper-textarea")?!0:!(i==="INPUT"||i==="TEXTAREA"||i==="SELECT"||n.isContentEditable||typeof n.closest=="function"&&n.closest('[contenteditable="true"]'))},_rememberOverlayFocus(e){this[e]=typeof document<"u"&&document.activeElement||null},_restoreOverlayFocus(e,t){const s=this[e];this[e]=null;const n=typeof document<"u"?document.body:null,i=typeof document<"u"?document.activeElement:null;if(!(i&&i!==n&&t?.contains?.(i)===!1)){if(s&&s!==n&&s.isConnected!==!1&&typeof s.focus=="function"){s.focus();return}this.activeSessionId&&this._shouldFocusTerminalForTabSwitch?.()!==!1&&this.terminal?.focus?.()}},openCommandPalette(){const e=document.getElementById("commandPaletteModal"),t=document.getElementById("commandPaletteSearch");!e||!t||(this.commandPaletteActiveIndex=0,this._resetCommandPaletteAgent(),t.value="",e.classList.add("active"),this._wireCommandPalette(),this.renderCommandPalette(),this._rememberOverlayFocus("_commandPalettePrevFocus"),t.focus(),t.select?.())},closeCommandPalette(){const e=document.getElementById("commandPaletteModal");e?.classList?.contains("active")&&(e.classList.remove("active"),this._restoreOverlayFocus("_commandPalettePrevFocus",e))},_wireCommandPalette(){if(this._commandPaletteWired)return;this._commandPaletteWired=!0;const e=document.getElementById("commandPaletteModal"),t=document.getElementById("commandPaletteSearch"),s=document.getElementById("commandPaletteList");t?.addEventListener("input",()=>{this.commandPaletteActiveIndex=0,this.renderCommandPalette()}),t?.addEventListener("keydown",async n=>{if((n.key==="ArrowLeft"||n.key==="ArrowRight")&&this._commandPaletteArrowCyclesAgent(n)){n.preventDefault(),this._cycleCommandPaletteAgent(n.key==="ArrowRight"?1:-1);return}if(n.key==="ArrowDown"){n.preventDefault(),this.moveCommandPaletteSelection(1);return}if(n.key==="ArrowUp"){n.preventDefault(),this.moveCommandPaletteSelection(-1);return}if(n.key==="Enter"){n.preventDefault(),n.stopPropagation(),await this.activateCommandPaletteItem();return}n.key==="Escape"&&(n.preventDefault(),this.closeCommandPalette())}),e?.addEventListener("keydown",n=>{n.key==="Escape"&&(n.preventDefault(),this.closeCommandPalette())}),s?.addEventListener?.("mousedown",n=>{n.target?.closest?.("[data-palette-agent-cycle]")&&n.preventDefault?.()}),s?.addEventListener?.("click",n=>{const i=n.target?.closest?.("[data-palette-agent-cycle]");if(i){n.preventDefault?.(),n.stopPropagation?.(),this._cycleCommandPaletteAgent(i.dataset.paletteAgentCycle==="prev"?-1:1);return}const o=n.target?.closest?.("[data-command-index]");o&&(this.commandPaletteActiveIndex=Number(o.dataset.commandIndex)||0,this.activateCommandPaletteItem())})},buildCommandPaletteItems(e=""){const t=e.trim().toLowerCase(),s=[...Array.isArray(this.sessionOrder)?this.sessionOrder:[],...Array.from(this.sessions?.keys?.()||[]).filter(o=>!this.sessionOrder?.includes?.(o))],n=new Set,i=[];for(const o of s){if(n.has(o))continue;n.add(o);const l=this.sessions?.get?.(o);if(!l)continue;const a=this.getSessionName?.(l)||l.name||l.title||o.slice(0,8),r=[l.workingDir,l.mode,l.status].filter(Boolean),c=[a,l.workingDir,l.mode,l.status,o].filter(Boolean).join(" ").toLowerCase();t&&!c.includes(t)||i.push({id:`session:${o}`,type:"session",sessionId:o,title:a,subtitle:r.join(" \xB7 ")})}return i.push(this._buildCommandPaletteNewSessionItem(e)),i.push({id:"browse-sessions",type:"browse-sessions",title:"Browse all sessions\u2026",subtitle:"Open Session Manager"}),i},_buildCommandPaletteNewSessionItem(e=""){const t=this._commandPaletteCaseName(e),s=this._commandPaletteAgent(t),n=s?.id||this.runMode||this._runMode||"claude",i={claude:"Claude",opencode:"OpenCode",codex:"Codex",gemini:"Gemini",antigravity:"Antigravity",pi:"Pi",grok:"Grok",deepseek:"DeepSeek",omp:"OMP",copilot:"Copilot"};return{id:"new-session",type:"new-session",caseName:t,mode:n,title:"New session",subtitle:`Run ${s?.label||i[n]||n} in ${t}`}},_commandPaletteCaseName(e=""){return this._findCommandPaletteCaseMatch(e)||document.getElementById("quickStartCase")?.value||"testcase"},_commandPaletteRowCase(){const e=(this.commandPaletteItems||[]).find(t=>t?.type==="new-session");return e?e.caseName:this._commandPaletteCaseName(document.getElementById("commandPaletteSearch")?.value||"")},_commandPaletteAgentChoices(e=this._commandPaletteRowCase()){const t=typeof window<"u"&&Array.isArray(window.__codemanCliCatalog)?window.__codemanCliCatalog:[],s=n=>typeof this._runModeAvailableForCase=="function"?this._runModeAvailableForCase(n,e):this.isCliAvailable?.(n)??!0;return t.filter(n=>n&&typeof n.id=="string"&&n.enabled&&(n.kind!=="agent"||s(n.id))).map(n=>({id:n.id,label:typeof n.label=="string"&&n.label.trim()||n.id}))},_commandPaletteAgent(e=this._commandPaletteRowCase()){const t=this._commandPaletteAgentChoices(e);if(t.length<2)return null;const s=this.runMode||this._runMode;return t.find(n=>n.id===this._commandPaletteAgentId)||t.find(n=>n.id===s)||t[0]},_resetCommandPaletteAgent(){this._commandPaletteAgentId=null},_cycleCommandPaletteAgent(e){const t=this._commandPaletteRowCase(),s=this._commandPaletteAgentChoices(t);if(s.length<2)return;const n=Math.max(0,s.findIndex(i=>i.id===this._commandPaletteAgent(t)?.id));this._commandPaletteAgentId=s[((n+e)%s.length+s.length)%s.length].id,this.renderCommandPalette()},_commandPaletteArrowCyclesAgent(e){const t=(this.commandPaletteItems||[])[this.commandPaletteActiveIndex||0];if(t?.type!=="new-session"||this._commandPaletteAgentChoices(t.caseName).length<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)return!1;const s=e.target,n=typeof s?.value=="string"?s.value:"",i=Number.isFinite(s?.selectionStart)?s.selectionStart:n.length,o=Number.isFinite(s?.selectionEnd)?s.selectionEnd:i;return i!==o?!1:i<=0||o>=n.length},_findCommandPaletteCaseMatch(e=""){const t=e.trim().toLowerCase();if(!t||!Array.isArray(this.cases))return null;const s=o=>{const l=String(o?.name||"").trim();if(!l)return 0;const a=[l,o?.path,o?.casePath,o?.workingDir,o?.remote?.path,o?.remote?.hostId].filter(Boolean).join(" ").toLowerCase(),r=l.toLowerCase();return r===t?100:r.startsWith(t)?90:r.includes(t)?80:a.includes(t)?60:0};let n=null,i=0;for(const o of this.cases){const l=s(o);l>i&&(n=o,i=l)}return n?.name||null},renderCommandPalette(){const e=document.getElementById("commandPaletteSearch"),t=document.getElementById("commandPaletteList");if(!t)return;const s=e?.value||"",n=this.buildCommandPaletteItems(s);this.commandPaletteItems=n,this.commandPaletteActiveIndex=Math.max(0,Math.min(this.commandPaletteActiveIndex||0,n.length-1)),t.innerHTML=n.map((i,o)=>{const l=o===this.commandPaletteActiveIndex?" active":"",a=i.type==="new-session"?"+":i.type==="browse-sessions"?"\u2261":"\u203A",r=i.type==="browse-sessions"?" command-palette-item--browse":"",c=i.type==="new-session"?this._renderCommandPaletteAgentPicker(i.mode,i.caseName):"";return`
2
2
  <button class="command-palette-item${l}${r}${c?" command-palette-item--agent":""}" type="button" data-command-index="${o}">
3
3
  <span class="command-palette-icon" aria-hidden="true">${a}</span>
4
4
  <span class="command-palette-text">
Binary file