aicodeman 0.2.9 → 0.3.1

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 (374) hide show
  1. package/README.md +118 -4
  2. package/dist/ai-idle-checker.d.ts.map +1 -1
  3. package/dist/ai-idle-checker.js +3 -2
  4. package/dist/ai-idle-checker.js.map +1 -1
  5. package/dist/ai-plan-checker.d.ts.map +1 -1
  6. package/dist/ai-plan-checker.js +3 -2
  7. package/dist/ai-plan-checker.js.map +1 -1
  8. package/dist/bash-tool-parser.d.ts +2 -3
  9. package/dist/bash-tool-parser.d.ts.map +1 -1
  10. package/dist/bash-tool-parser.js +14 -31
  11. package/dist/bash-tool-parser.js.map +1 -1
  12. package/dist/config/ai-defaults.d.ts +16 -0
  13. package/dist/config/ai-defaults.d.ts.map +1 -0
  14. package/dist/config/ai-defaults.js +16 -0
  15. package/dist/config/ai-defaults.js.map +1 -0
  16. package/dist/config/auth-config.d.ts +19 -0
  17. package/dist/config/auth-config.d.ts.map +1 -0
  18. package/dist/config/auth-config.js +28 -0
  19. package/dist/config/auth-config.js.map +1 -0
  20. package/dist/config/exec-timeout.d.ts +10 -0
  21. package/dist/config/exec-timeout.d.ts.map +1 -0
  22. package/dist/config/exec-timeout.js +10 -0
  23. package/dist/config/exec-timeout.js.map +1 -0
  24. package/dist/config/map-limits.d.ts +4 -0
  25. package/dist/config/map-limits.d.ts.map +1 -1
  26. package/dist/config/map-limits.js +7 -0
  27. package/dist/config/map-limits.js.map +1 -1
  28. package/dist/config/server-timing.d.ts +42 -0
  29. package/dist/config/server-timing.d.ts.map +1 -0
  30. package/dist/config/server-timing.js +57 -0
  31. package/dist/config/server-timing.js.map +1 -0
  32. package/dist/config/team-config.d.ts +16 -0
  33. package/dist/config/team-config.d.ts.map +1 -0
  34. package/dist/config/team-config.js +16 -0
  35. package/dist/config/team-config.js.map +1 -0
  36. package/dist/config/terminal-limits.d.ts +18 -0
  37. package/dist/config/terminal-limits.d.ts.map +1 -0
  38. package/dist/config/terminal-limits.js +18 -0
  39. package/dist/config/terminal-limits.js.map +1 -0
  40. package/dist/config/tunnel-config.d.ts +27 -0
  41. package/dist/config/tunnel-config.d.ts.map +1 -0
  42. package/dist/config/tunnel-config.js +36 -0
  43. package/dist/config/tunnel-config.js.map +1 -0
  44. package/dist/hooks-config.d.ts +21 -6
  45. package/dist/hooks-config.d.ts.map +1 -1
  46. package/dist/hooks-config.js +28 -12
  47. package/dist/hooks-config.js.map +1 -1
  48. package/dist/image-watcher.d.ts +4 -4
  49. package/dist/image-watcher.d.ts.map +1 -1
  50. package/dist/image-watcher.js +17 -30
  51. package/dist/image-watcher.js.map +1 -1
  52. package/dist/index.js +1 -2
  53. package/dist/index.js.map +1 -1
  54. package/dist/plan-orchestrator.d.ts +2 -24
  55. package/dist/plan-orchestrator.d.ts.map +1 -1
  56. package/dist/plan-orchestrator.js.map +1 -1
  57. package/dist/prompts/planner.d.ts +7 -8
  58. package/dist/prompts/planner.d.ts.map +1 -1
  59. package/dist/prompts/planner.js +7 -8
  60. package/dist/prompts/planner.js.map +1 -1
  61. package/dist/prompts/research-agent.d.ts +6 -4
  62. package/dist/prompts/research-agent.d.ts.map +1 -1
  63. package/dist/prompts/research-agent.js +6 -4
  64. package/dist/prompts/research-agent.js.map +1 -1
  65. package/dist/push-store.d.ts +1 -1
  66. package/dist/push-store.d.ts.map +1 -1
  67. package/dist/push-store.js +4 -12
  68. package/dist/push-store.js.map +1 -1
  69. package/dist/ralph-fix-plan-watcher.d.ts +91 -0
  70. package/dist/ralph-fix-plan-watcher.d.ts.map +1 -0
  71. package/dist/ralph-fix-plan-watcher.js +326 -0
  72. package/dist/ralph-fix-plan-watcher.js.map +1 -0
  73. package/dist/ralph-loop.d.ts +14 -4
  74. package/dist/ralph-loop.d.ts.map +1 -1
  75. package/dist/ralph-loop.js +14 -4
  76. package/dist/ralph-loop.js.map +1 -1
  77. package/dist/ralph-plan-tracker.d.ts +201 -0
  78. package/dist/ralph-plan-tracker.d.ts.map +1 -0
  79. package/dist/ralph-plan-tracker.js +325 -0
  80. package/dist/ralph-plan-tracker.js.map +1 -0
  81. package/dist/ralph-stall-detector.d.ts +84 -0
  82. package/dist/ralph-stall-detector.d.ts.map +1 -0
  83. package/dist/ralph-stall-detector.js +139 -0
  84. package/dist/ralph-stall-detector.js.map +1 -0
  85. package/dist/ralph-status-parser.d.ts +141 -0
  86. package/dist/ralph-status-parser.d.ts.map +1 -0
  87. package/dist/ralph-status-parser.js +478 -0
  88. package/dist/ralph-status-parser.js.map +1 -0
  89. package/dist/ralph-tracker.d.ts +218 -692
  90. package/dist/ralph-tracker.d.ts.map +1 -1
  91. package/dist/ralph-tracker.js +389 -1723
  92. package/dist/ralph-tracker.js.map +1 -1
  93. package/dist/respawn-adaptive-timing.d.ts +61 -0
  94. package/dist/respawn-adaptive-timing.d.ts.map +1 -0
  95. package/dist/respawn-adaptive-timing.js +105 -0
  96. package/dist/respawn-adaptive-timing.js.map +1 -0
  97. package/dist/respawn-controller.d.ts +35 -115
  98. package/dist/respawn-controller.d.ts.map +1 -1
  99. package/dist/respawn-controller.js +167 -607
  100. package/dist/respawn-controller.js.map +1 -1
  101. package/dist/respawn-health.d.ts +54 -0
  102. package/dist/respawn-health.d.ts.map +1 -0
  103. package/dist/respawn-health.js +183 -0
  104. package/dist/respawn-health.js.map +1 -0
  105. package/dist/respawn-metrics.d.ts +81 -0
  106. package/dist/respawn-metrics.d.ts.map +1 -0
  107. package/dist/respawn-metrics.js +198 -0
  108. package/dist/respawn-metrics.js.map +1 -0
  109. package/dist/respawn-patterns.d.ts +45 -0
  110. package/dist/respawn-patterns.d.ts.map +1 -0
  111. package/dist/respawn-patterns.js +125 -0
  112. package/dist/respawn-patterns.js.map +1 -0
  113. package/dist/session-auto-ops.d.ts +89 -0
  114. package/dist/session-auto-ops.d.ts.map +1 -0
  115. package/dist/session-auto-ops.js +224 -0
  116. package/dist/session-auto-ops.js.map +1 -0
  117. package/dist/session-cli-builder.d.ts +62 -0
  118. package/dist/session-cli-builder.d.ts.map +1 -0
  119. package/dist/session-cli-builder.js +121 -0
  120. package/dist/session-cli-builder.js.map +1 -0
  121. package/dist/session-manager.d.ts +17 -5
  122. package/dist/session-manager.d.ts.map +1 -1
  123. package/dist/session-manager.js +17 -5
  124. package/dist/session-manager.js.map +1 -1
  125. package/dist/session-task-cache.d.ts +52 -0
  126. package/dist/session-task-cache.d.ts.map +1 -0
  127. package/dist/session-task-cache.js +90 -0
  128. package/dist/session-task-cache.js.map +1 -0
  129. package/dist/session.d.ts +23 -41
  130. package/dist/session.d.ts.map +1 -1
  131. package/dist/session.js +79 -317
  132. package/dist/session.js.map +1 -1
  133. package/dist/state-store.d.ts +19 -9
  134. package/dist/state-store.d.ts.map +1 -1
  135. package/dist/state-store.js +29 -30
  136. package/dist/state-store.js.map +1 -1
  137. package/dist/subagent-watcher.d.ts +26 -7
  138. package/dist/subagent-watcher.d.ts.map +1 -1
  139. package/dist/subagent-watcher.js +47 -64
  140. package/dist/subagent-watcher.js.map +1 -1
  141. package/dist/team-watcher.d.ts.map +1 -1
  142. package/dist/team-watcher.js +2 -5
  143. package/dist/team-watcher.js.map +1 -1
  144. package/dist/tmux-manager.d.ts.map +1 -1
  145. package/dist/tmux-manager.js +1 -2
  146. package/dist/tmux-manager.js.map +1 -1
  147. package/dist/tunnel-manager.d.ts +26 -0
  148. package/dist/tunnel-manager.d.ts.map +1 -1
  149. package/dist/tunnel-manager.js +126 -7
  150. package/dist/tunnel-manager.js.map +1 -1
  151. package/dist/types/api.d.ts +108 -0
  152. package/dist/types/api.d.ts.map +1 -0
  153. package/dist/types/api.js +98 -0
  154. package/dist/types/api.js.map +1 -0
  155. package/dist/types/app-state.d.ts +117 -0
  156. package/dist/types/app-state.d.ts.map +1 -0
  157. package/dist/types/app-state.js +76 -0
  158. package/dist/types/app-state.js.map +1 -0
  159. package/dist/types/common.d.ts +79 -0
  160. package/dist/types/common.d.ts.map +1 -0
  161. package/dist/types/common.js +17 -0
  162. package/dist/types/common.js.map +1 -0
  163. package/dist/types/index.d.ts +66 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/index.js +66 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/dist/types/lifecycle.d.ts +28 -0
  168. package/dist/types/lifecycle.d.ts.map +1 -0
  169. package/dist/types/lifecycle.js +16 -0
  170. package/dist/types/lifecycle.js.map +1 -0
  171. package/dist/types/plan.d.ts +45 -0
  172. package/dist/types/plan.d.ts.map +1 -0
  173. package/dist/types/plan.js +18 -0
  174. package/dist/types/plan.js.map +1 -0
  175. package/dist/types/push.d.ts +36 -0
  176. package/dist/types/push.d.ts.map +1 -0
  177. package/dist/types/push.js +18 -0
  178. package/dist/types/push.js.map +1 -0
  179. package/dist/types/ralph.d.ts +262 -0
  180. package/dist/types/ralph.d.ts.map +1 -0
  181. package/dist/types/ralph.js +70 -0
  182. package/dist/types/ralph.js.map +1 -0
  183. package/dist/types/respawn.d.ts +271 -0
  184. package/dist/types/respawn.d.ts.map +1 -0
  185. package/dist/types/respawn.js +26 -0
  186. package/dist/types/respawn.js.map +1 -0
  187. package/dist/types/run-summary.d.ts +96 -0
  188. package/dist/types/run-summary.d.ts.map +1 -0
  189. package/dist/types/run-summary.js +37 -0
  190. package/dist/types/run-summary.js.map +1 -0
  191. package/dist/types/session.d.ts +152 -0
  192. package/dist/types/session.d.ts.map +1 -0
  193. package/dist/types/session.js +27 -0
  194. package/dist/types/session.js.map +1 -0
  195. package/dist/types/task.d.ts +72 -0
  196. package/dist/types/task.d.ts.map +1 -0
  197. package/dist/types/task.js +19 -0
  198. package/dist/types/task.js.map +1 -0
  199. package/dist/types/teams.d.ts +73 -0
  200. package/dist/types/teams.d.ts.map +1 -0
  201. package/dist/types/teams.js +23 -0
  202. package/dist/types/teams.js.map +1 -0
  203. package/dist/types/tools.d.ts +61 -0
  204. package/dist/types/tools.d.ts.map +1 -0
  205. package/dist/types/tools.js +20 -0
  206. package/dist/types/tools.js.map +1 -0
  207. package/dist/types.d.ts +8 -1134
  208. package/dist/types.d.ts.map +1 -1
  209. package/dist/types.js +8 -210
  210. package/dist/types.js.map +1 -1
  211. package/dist/utils/claude-cli-resolver.d.ts.map +1 -1
  212. package/dist/utils/claude-cli-resolver.js +1 -2
  213. package/dist/utils/claude-cli-resolver.js.map +1 -1
  214. package/dist/utils/debouncer.d.ts +111 -0
  215. package/dist/utils/debouncer.d.ts.map +1 -0
  216. package/dist/utils/debouncer.js +162 -0
  217. package/dist/utils/debouncer.js.map +1 -0
  218. package/dist/utils/index.d.ts +3 -2
  219. package/dist/utils/index.d.ts.map +1 -1
  220. package/dist/utils/index.js +3 -2
  221. package/dist/utils/index.js.map +1 -1
  222. package/dist/utils/opencode-cli-resolver.d.ts.map +1 -1
  223. package/dist/utils/opencode-cli-resolver.js +1 -2
  224. package/dist/utils/opencode-cli-resolver.js.map +1 -1
  225. package/dist/utils/string-similarity.d.ts +0 -57
  226. package/dist/utils/string-similarity.d.ts.map +1 -1
  227. package/dist/utils/string-similarity.js +3 -18
  228. package/dist/utils/string-similarity.js.map +1 -1
  229. package/dist/web/middleware/auth.d.ts +31 -0
  230. package/dist/web/middleware/auth.d.ts.map +1 -0
  231. package/dist/web/middleware/auth.js +154 -0
  232. package/dist/web/middleware/auth.js.map +1 -0
  233. package/dist/web/ports/auth-port.d.ts +18 -0
  234. package/dist/web/ports/auth-port.d.ts.map +1 -0
  235. package/dist/web/ports/auth-port.js +6 -0
  236. package/dist/web/ports/auth-port.js.map +1 -0
  237. package/dist/web/ports/config-port.d.ts +28 -0
  238. package/dist/web/ports/config-port.d.ts.map +1 -0
  239. package/dist/web/ports/config-port.js +6 -0
  240. package/dist/web/ports/config-port.js.map +1 -0
  241. package/dist/web/ports/event-port.d.ts +13 -0
  242. package/dist/web/ports/event-port.d.ts.map +1 -0
  243. package/dist/web/ports/event-port.js +6 -0
  244. package/dist/web/ports/event-port.js.map +1 -0
  245. package/dist/web/ports/index.d.ts +14 -0
  246. package/dist/web/ports/index.d.ts.map +1 -0
  247. package/dist/web/ports/index.js +9 -0
  248. package/dist/web/ports/index.js.map +1 -0
  249. package/dist/web/ports/infra-port.d.ts +36 -0
  250. package/dist/web/ports/infra-port.d.ts.map +1 -0
  251. package/dist/web/ports/infra-port.js +6 -0
  252. package/dist/web/ports/infra-port.js.map +1 -0
  253. package/dist/web/ports/respawn-port.d.ts +20 -0
  254. package/dist/web/ports/respawn-port.d.ts.map +1 -0
  255. package/dist/web/ports/respawn-port.js +6 -0
  256. package/dist/web/ports/respawn-port.js.map +1 -0
  257. package/dist/web/ports/session-port.d.ts +15 -0
  258. package/dist/web/ports/session-port.d.ts.map +1 -0
  259. package/dist/web/ports/session-port.js +6 -0
  260. package/dist/web/ports/session-port.js.map +1 -0
  261. package/dist/web/public/api-client.js +82 -0
  262. package/dist/web/public/api-client.js.br +0 -0
  263. package/dist/web/public/api-client.js.gz +0 -0
  264. package/dist/web/public/app.js +117 -201
  265. package/dist/web/public/app.js.br +0 -0
  266. package/dist/web/public/app.js.gz +0 -0
  267. package/dist/web/public/constants.js +365 -0
  268. package/dist/web/public/constants.js.br +0 -0
  269. package/dist/web/public/constants.js.gz +0 -0
  270. package/dist/web/public/index.html +15 -3
  271. package/dist/web/public/index.html.br +0 -0
  272. package/dist/web/public/index.html.gz +0 -0
  273. package/dist/web/public/keyboard-accessory.js +302 -0
  274. package/dist/web/public/keyboard-accessory.js.br +0 -0
  275. package/dist/web/public/keyboard-accessory.js.gz +0 -0
  276. package/dist/web/public/mobile-handlers.js +491 -0
  277. package/dist/web/public/mobile-handlers.js.br +0 -0
  278. package/dist/web/public/mobile-handlers.js.gz +0 -0
  279. package/dist/web/public/mobile.css.gz +0 -0
  280. package/dist/web/public/notification-manager.js +472 -0
  281. package/dist/web/public/notification-manager.js.br +0 -0
  282. package/dist/web/public/notification-manager.js.gz +0 -0
  283. package/dist/web/public/ralph-wizard.js +33 -9
  284. package/dist/web/public/ralph-wizard.js.br +0 -0
  285. package/dist/web/public/ralph-wizard.js.gz +0 -0
  286. package/dist/web/public/styles.css.gz +0 -0
  287. package/dist/web/public/subagent-windows.js +1149 -0
  288. package/dist/web/public/subagent-windows.js.br +0 -0
  289. package/dist/web/public/subagent-windows.js.gz +0 -0
  290. package/dist/web/public/sw.js +15 -0
  291. package/dist/web/public/sw.js.br +0 -0
  292. package/dist/web/public/sw.js.gz +0 -0
  293. package/dist/web/public/upload.html.gz +0 -0
  294. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  295. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  296. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  297. package/dist/web/public/vendor/xterm-zerolag-input.js +4 -0
  298. package/dist/web/public/vendor/xterm-zerolag-input.js.br +0 -0
  299. package/dist/web/public/vendor/xterm-zerolag-input.js.gz +0 -0
  300. package/dist/web/public/vendor/xterm.css.gz +0 -0
  301. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  302. package/dist/web/public/voice-input.js +882 -0
  303. package/dist/web/public/voice-input.js.br +0 -0
  304. package/dist/web/public/voice-input.js.gz +0 -0
  305. package/dist/web/route-helpers.d.ts +38 -0
  306. package/dist/web/route-helpers.d.ts.map +1 -0
  307. package/dist/web/route-helpers.js +144 -0
  308. package/dist/web/route-helpers.js.map +1 -0
  309. package/dist/web/routes/case-routes.d.ts +9 -0
  310. package/dist/web/routes/case-routes.d.ts.map +1 -0
  311. package/dist/web/routes/case-routes.js +426 -0
  312. package/dist/web/routes/case-routes.js.map +1 -0
  313. package/dist/web/routes/file-routes.d.ts +8 -0
  314. package/dist/web/routes/file-routes.d.ts.map +1 -0
  315. package/dist/web/routes/file-routes.js +337 -0
  316. package/dist/web/routes/file-routes.js.map +1 -0
  317. package/dist/web/routes/hook-event-routes.d.ts +9 -0
  318. package/dist/web/routes/hook-event-routes.d.ts.map +1 -0
  319. package/dist/web/routes/hook-event-routes.js +57 -0
  320. package/dist/web/routes/hook-event-routes.js.map +1 -0
  321. package/dist/web/routes/index.d.ts +16 -0
  322. package/dist/web/routes/index.d.ts.map +1 -0
  323. package/dist/web/routes/index.js +16 -0
  324. package/dist/web/routes/index.js.map +1 -0
  325. package/dist/web/routes/mux-routes.d.ts +8 -0
  326. package/dist/web/routes/mux-routes.d.ts.map +1 -0
  327. package/dist/web/routes/mux-routes.js +32 -0
  328. package/dist/web/routes/mux-routes.js.map +1 -0
  329. package/dist/web/routes/plan-routes.d.ts +9 -0
  330. package/dist/web/routes/plan-routes.d.ts.map +1 -0
  331. package/dist/web/routes/plan-routes.js +385 -0
  332. package/dist/web/routes/plan-routes.js.map +1 -0
  333. package/dist/web/routes/push-routes.d.ts +8 -0
  334. package/dist/web/routes/push-routes.d.ts.map +1 -0
  335. package/dist/web/routes/push-routes.js +49 -0
  336. package/dist/web/routes/push-routes.js.map +1 -0
  337. package/dist/web/routes/ralph-routes.d.ts +9 -0
  338. package/dist/web/routes/ralph-routes.d.ts.map +1 -0
  339. package/dist/web/routes/ralph-routes.js +485 -0
  340. package/dist/web/routes/ralph-routes.js.map +1 -0
  341. package/dist/web/routes/respawn-routes.d.ts +8 -0
  342. package/dist/web/routes/respawn-routes.d.ts.map +1 -0
  343. package/dist/web/routes/respawn-routes.js +270 -0
  344. package/dist/web/routes/respawn-routes.js.map +1 -0
  345. package/dist/web/routes/scheduled-routes.d.ts +8 -0
  346. package/dist/web/routes/scheduled-routes.d.ts.map +1 -0
  347. package/dist/web/routes/scheduled-routes.js +51 -0
  348. package/dist/web/routes/scheduled-routes.js.map +1 -0
  349. package/dist/web/routes/session-routes.d.ts +9 -0
  350. package/dist/web/routes/session-routes.d.ts.map +1 -0
  351. package/dist/web/routes/session-routes.js +751 -0
  352. package/dist/web/routes/session-routes.js.map +1 -0
  353. package/dist/web/routes/system-routes.d.ts +9 -0
  354. package/dist/web/routes/system-routes.d.ts.map +1 -0
  355. package/dist/web/routes/system-routes.js +699 -0
  356. package/dist/web/routes/system-routes.js.map +1 -0
  357. package/dist/web/routes/team-routes.d.ts +8 -0
  358. package/dist/web/routes/team-routes.d.ts.map +1 -0
  359. package/dist/web/routes/team-routes.js +14 -0
  360. package/dist/web/routes/team-routes.js.map +1 -0
  361. package/dist/web/schemas.d.ts +43 -3
  362. package/dist/web/schemas.d.ts.map +1 -1
  363. package/dist/web/schemas.js +6 -2
  364. package/dist/web/schemas.js.map +1 -1
  365. package/dist/web/server.d.ts +35 -15
  366. package/dist/web/server.d.ts.map +1 -1
  367. package/dist/web/server.js +563 -3971
  368. package/dist/web/server.js.map +1 -1
  369. package/dist/web/sse-events.d.ts +361 -0
  370. package/dist/web/sse-events.d.ts.map +1 -0
  371. package/dist/web/sse-events.js +396 -0
  372. package/dist/web/sse-events.js.map +1 -0
  373. package/package.json +2 -1
  374. package/scripts/postinstall.js +58 -0
Binary file
Binary file
@@ -0,0 +1,365 @@
1
+ /**
2
+ * @fileoverview Shared constants, utility functions, and SSE event type registry for all frontend modules.
3
+ *
4
+ * This is the first script loaded in index.html. Every other frontend module depends on the
5
+ * globals defined here: timing constants, Z-index layers, DEC 2026 sync markers, respawn
6
+ * preset definitions, the SSE_EVENTS registry, and shared utilities (escapeHtml, extractSyncSegments,
7
+ * getEventCoords, scheduleBackground, urlBase64ToUint8Array).
8
+ *
9
+ * @globals {function} urlBase64ToUint8Array - VAPID key conversion for Web Push
10
+ * @globals {function} scheduleBackground - scheduler.postTask wrapper (background priority)
11
+ * @globals {function} extractSyncSegments - DEC 2026 terminal sync marker parser
12
+ * @globals {function} getEventCoords - Unified mouse/touch coordinate extractor
13
+ * @globals {function} escapeHtml - XSS-safe HTML escaping
14
+ * @globals {object} SSE_EVENTS - Centralized SSE event type constants (~73 event types)
15
+ * @globals {Array} BUILTIN_RESPAWN_PRESETS - Built-in respawn configuration presets
16
+ *
17
+ * @dependency None (first in load order)
18
+ * @loadorder 1 of 9 — constants.js → mobile-handlers.js → voice-input.js → notification-manager.js
19
+ * → keyboard-accessory.js → app.js → ralph-wizard.js → api-client.js → subagent-windows.js
20
+ */
21
+
22
+ // Codeman — Shared constants and utility functions for frontend modules
23
+
24
+ // ═══════════════════════════════════════════════════════════════
25
+ // Web Push Utilities
26
+ // ═══════════════════════════════════════════════════════════════
27
+
28
+ /** Convert a base64-encoded VAPID key to Uint8Array for pushManager.subscribe() */
29
+ function urlBase64ToUint8Array(base64String) {
30
+ const padding = '='.repeat((4 - base64String.length % 4) % 4);
31
+ const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
32
+ const rawData = atob(base64);
33
+ const outputArray = new Uint8Array(rawData.length);
34
+ for (let i = 0; i < rawData.length; ++i) {
35
+ outputArray[i] = rawData.charCodeAt(i);
36
+ }
37
+ return outputArray;
38
+ }
39
+
40
+ // ═══════════════════════════════════════════════════════════════
41
+ // Constants
42
+ // ═══════════════════════════════════════════════════════════════
43
+
44
+ // Default terminal scrollback (can be changed via settings)
45
+ const DEFAULT_SCROLLBACK = 5000;
46
+
47
+ // Timing constants
48
+ const STUCK_THRESHOLD_DEFAULT_MS = 600000; // 10 minutes - default for stuck detection
49
+ const GROUPING_TIMEOUT_MS = 5000; // 5 seconds - notification grouping window
50
+ const NOTIFICATION_LIST_CAP = 100; // Max notifications in list
51
+ const TITLE_FLASH_INTERVAL_MS = 1500; // Title flash rate
52
+ const BROWSER_NOTIF_RATE_LIMIT_MS = 3000; // Rate limit for browser notifications
53
+ const AUTO_CLOSE_NOTIFICATION_MS = 8000; // Auto-close browser notifications
54
+ const THROTTLE_DELAY_MS = 100; // General UI throttle delay
55
+ const TERMINAL_CHUNK_SIZE = 128 * 1024; // 128KB chunks for terminal data
56
+ const TERMINAL_TAIL_SIZE = 256 * 1024; // 256KB tail for initial load
57
+ const SYNC_WAIT_TIMEOUT_MS = 50; // Wait timeout for terminal sync
58
+ const STATS_POLLING_INTERVAL_MS = 2000; // System stats polling
59
+
60
+ // Z-index base values for layered floating windows
61
+ const ZINDEX_SUBAGENT_BASE = 1000;
62
+ const ZINDEX_PLAN_SUBAGENT_BASE = 1100;
63
+ const ZINDEX_LOG_VIEWER_BASE = 2000;
64
+ const ZINDEX_IMAGE_POPUP_BASE = 3000;
65
+
66
+ // Subagent/floating window layout
67
+ const WINDOW_INITIAL_TOP_PX = 120;
68
+ const WINDOW_CASCADE_OFFSET_PX = 30;
69
+ const WINDOW_MIN_WIDTH_PX = 200;
70
+ const WINDOW_MIN_HEIGHT_PX = 200;
71
+ const WINDOW_DEFAULT_WIDTH_PX = 300;
72
+
73
+ // Scheduler API — prioritize terminal writes over background UI updates.
74
+ // scheduler.postTask('background') defers non-critical work (connection lines, panel renders)
75
+ // so the main thread stays free for terminal rendering at 60fps.
76
+ const _hasScheduler = typeof globalThis.scheduler?.postTask === 'function';
77
+ function scheduleBackground(fn) {
78
+ if (_hasScheduler) { scheduler.postTask(fn, { priority: 'background' }); }
79
+ else { requestAnimationFrame(fn); }
80
+ }
81
+
82
+ // DEC mode 2026 - Synchronized Output
83
+ // Wrap terminal writes with these markers to prevent partial-frame flicker.
84
+ // Terminal buffers all output between markers and renders atomically.
85
+ // Supported by: WezTerm, Kitty, Ghostty, iTerm2 3.5+, Windows Terminal, VSCode terminal
86
+ // xterm.js doesn't support DEC 2026 natively, so we implement buffering ourselves.
87
+ const DEC_SYNC_START = '\x1b[?2026h';
88
+ const DEC_SYNC_END = '\x1b[?2026l';
89
+ // Pre-compiled regex for stripping DEC 2026 markers (single pass instead of two replaceAll calls)
90
+ const DEC_SYNC_STRIP_RE = /\x1b\[\?2026[hl]/g;
91
+
92
+ // Built-in respawn configuration presets
93
+ const BUILTIN_RESPAWN_PRESETS = [
94
+ {
95
+ id: 'solo-work',
96
+ name: 'Solo',
97
+ description: 'Claude working alone — fast respawn cycles with context reset',
98
+ config: {
99
+ idleTimeoutMs: 3000,
100
+ updatePrompt: 'summarize your progress so far before the context reset.',
101
+ interStepDelayMs: 2000,
102
+ sendClear: true,
103
+ sendInit: true,
104
+ kickstartPrompt: 'continue working. Pick up where you left off based on the context above.',
105
+ autoAcceptPrompts: true,
106
+ },
107
+ durationMinutes: 60,
108
+ builtIn: true,
109
+ createdAt: 0,
110
+ },
111
+ {
112
+ id: 'subagent-workflow',
113
+ name: 'Subagents',
114
+ description: 'Lead session with Task tool subagents — longer idle tolerance',
115
+ config: {
116
+ idleTimeoutMs: 45000,
117
+ updatePrompt: 'check on your running subagents and summarize their results before the context reset. If all subagents have finished, note what was completed and what remains.',
118
+ interStepDelayMs: 3000,
119
+ sendClear: true,
120
+ sendInit: true,
121
+ kickstartPrompt: 'check on your running subagents and continue coordinating their work. If all subagents have finished, summarize their results and proceed with the next step.',
122
+ autoAcceptPrompts: true,
123
+ },
124
+ durationMinutes: 240,
125
+ builtIn: true,
126
+ createdAt: 0,
127
+ },
128
+ {
129
+ id: 'team-lead',
130
+ name: 'Team',
131
+ description: 'Leading an agent team via TeamCreate — tolerates long silences',
132
+ config: {
133
+ idleTimeoutMs: 90000,
134
+ updatePrompt: 'review the task list and teammate progress. Summarize the current state before the context reset.',
135
+ interStepDelayMs: 5000,
136
+ sendClear: true,
137
+ sendInit: true,
138
+ kickstartPrompt: 'check on your teammates by reviewing the task list and any messages in your inbox. Assign new tasks if teammates are idle, or continue coordinating the team effort.',
139
+ autoAcceptPrompts: true,
140
+ },
141
+ durationMinutes: 480,
142
+ builtIn: true,
143
+ createdAt: 0,
144
+ },
145
+ {
146
+ id: 'ralph-todo',
147
+ name: 'Ralph/Todo',
148
+ description: 'Ralph Loop task list — works through todos with progress tracking',
149
+ config: {
150
+ idleTimeoutMs: 8000,
151
+ updatePrompt: 'update CLAUDE.md with discoveries and progress notes, mark completed tasks in @fix_plan.md, write a brief summary so the next cycle can continue seamlessly.',
152
+ interStepDelayMs: 3000,
153
+ sendClear: true,
154
+ sendInit: true,
155
+ kickstartPrompt: 'read @fix_plan.md for task status, continue on the next uncompleted task. When ALL tasks are complete, output <promise>COMPLETE</promise>.',
156
+ autoAcceptPrompts: true,
157
+ },
158
+ durationMinutes: 480,
159
+ builtIn: true,
160
+ createdAt: 0,
161
+ },
162
+ {
163
+ id: 'overnight-autonomous',
164
+ name: 'Overnight',
165
+ description: 'Unattended overnight runs with full context reset between cycles',
166
+ config: {
167
+ idleTimeoutMs: 10000,
168
+ updatePrompt: 'summarize what you accomplished so far and write key progress notes to CLAUDE.md so the next cycle can pick up where you left off.',
169
+ interStepDelayMs: 3000,
170
+ sendClear: true,
171
+ sendInit: true,
172
+ kickstartPrompt: 'continue working on the task. Pick up where you left off based on the context above.',
173
+ autoAcceptPrompts: true,
174
+ },
175
+ durationMinutes: 480,
176
+ builtIn: true,
177
+ createdAt: 0,
178
+ },
179
+ ];
180
+
181
+ // ═══════════════════════════════════════════════════════════════
182
+ // SSE Event Types
183
+ // ═══════════════════════════════════════════════════════════════
184
+
185
+ /** @type {Record<string, string>} Centralized SSE event type constants */
186
+ const SSE_EVENTS = {
187
+ // Core
188
+ INIT: 'init',
189
+
190
+ // Session lifecycle
191
+ SESSION_CREATED: 'session:created',
192
+ SESSION_UPDATED: 'session:updated',
193
+ SESSION_DELETED: 'session:deleted',
194
+ SESSION_TERMINAL: 'session:terminal',
195
+ SESSION_NEEDS_REFRESH: 'session:needsRefresh',
196
+ SESSION_CLEAR_TERMINAL: 'session:clearTerminal',
197
+ SESSION_COMPLETION: 'session:completion',
198
+ SESSION_ERROR: 'session:error',
199
+ SESSION_EXIT: 'session:exit',
200
+ SESSION_IDLE: 'session:idle',
201
+ SESSION_WORKING: 'session:working',
202
+ SESSION_AUTO_CLEAR: 'session:autoClear',
203
+ SESSION_CLI_INFO: 'session:cliInfo',
204
+
205
+ // Scheduled runs
206
+ SCHEDULED_CREATED: 'scheduled:created',
207
+ SCHEDULED_UPDATED: 'scheduled:updated',
208
+ SCHEDULED_COMPLETED: 'scheduled:completed',
209
+ SCHEDULED_STOPPED: 'scheduled:stopped',
210
+
211
+ // Respawn
212
+ RESPAWN_STARTED: 'respawn:started',
213
+ RESPAWN_STOPPED: 'respawn:stopped',
214
+ RESPAWN_STATE_CHANGED: 'respawn:stateChanged',
215
+ RESPAWN_CYCLE_STARTED: 'respawn:cycleStarted',
216
+ RESPAWN_BLOCKED: 'respawn:blocked',
217
+ RESPAWN_AUTO_ACCEPT_SENT: 'respawn:autoAcceptSent',
218
+ RESPAWN_DETECTION_UPDATE: 'respawn:detectionUpdate',
219
+ RESPAWN_TIMER_STARTED: 'respawn:timerStarted',
220
+ RESPAWN_TIMER_CANCELLED: 'respawn:timerCancelled',
221
+ RESPAWN_TIMER_COMPLETED: 'respawn:timerCompleted',
222
+ RESPAWN_ERROR: 'respawn:error',
223
+ RESPAWN_ACTION_LOG: 'respawn:actionLog',
224
+
225
+ // Tasks
226
+ TASK_CREATED: 'task:created',
227
+ TASK_COMPLETED: 'task:completed',
228
+ TASK_FAILED: 'task:failed',
229
+ TASK_UPDATED: 'task:updated',
230
+
231
+ // Mux (tmux)
232
+ MUX_CREATED: 'mux:created',
233
+ MUX_KILLED: 'mux:killed',
234
+ MUX_DIED: 'mux:died',
235
+ MUX_STATS_UPDATED: 'mux:statsUpdated',
236
+
237
+ // Ralph
238
+ SESSION_RALPH_LOOP_UPDATE: 'session:ralphLoopUpdate',
239
+ SESSION_RALPH_TODO_UPDATE: 'session:ralphTodoUpdate',
240
+ SESSION_RALPH_COMPLETION_DETECTED: 'session:ralphCompletionDetected',
241
+ SESSION_RALPH_STATUS_UPDATE: 'session:ralphStatusUpdate',
242
+ SESSION_CIRCUIT_BREAKER_UPDATE: 'session:circuitBreakerUpdate',
243
+ SESSION_EXIT_GATE_MET: 'session:exitGateMet',
244
+
245
+ // Bash tools
246
+ SESSION_BASH_TOOL_START: 'session:bashToolStart',
247
+ SESSION_BASH_TOOL_END: 'session:bashToolEnd',
248
+ SESSION_BASH_TOOLS_UPDATE: 'session:bashToolsUpdate',
249
+
250
+ // Hooks (Claude Code hook events)
251
+ HOOK_IDLE_PROMPT: 'hook:idle_prompt',
252
+ HOOK_PERMISSION_PROMPT: 'hook:permission_prompt',
253
+ HOOK_ELICITATION_DIALOG: 'hook:elicitation_dialog',
254
+ HOOK_STOP: 'hook:stop',
255
+ HOOK_TEAMMATE_IDLE: 'hook:teammate_idle',
256
+ HOOK_TASK_COMPLETED: 'hook:task_completed',
257
+
258
+ // Subagents (Claude Code background agents)
259
+ SUBAGENT_DISCOVERED: 'subagent:discovered',
260
+ SUBAGENT_UPDATED: 'subagent:updated',
261
+ SUBAGENT_TOOL_CALL: 'subagent:tool_call',
262
+ SUBAGENT_PROGRESS: 'subagent:progress',
263
+ SUBAGENT_MESSAGE: 'subagent:message',
264
+ SUBAGENT_TOOL_RESULT: 'subagent:tool_result',
265
+ SUBAGENT_COMPLETED: 'subagent:completed',
266
+
267
+ // Images
268
+ IMAGE_DETECTED: 'image:detected',
269
+
270
+ // Tunnel
271
+ TUNNEL_STARTED: 'tunnel:started',
272
+ TUNNEL_STOPPED: 'tunnel:stopped',
273
+ TUNNEL_PROGRESS: 'tunnel:progress',
274
+ TUNNEL_ERROR: 'tunnel:error',
275
+ TUNNEL_QR_ROTATED: 'tunnel:qrRotated',
276
+ TUNNEL_QR_REGENERATED: 'tunnel:qrRegenerated',
277
+ TUNNEL_QR_AUTH_USED: 'tunnel:qrAuthUsed',
278
+
279
+ // Plan orchestration
280
+ PLAN_SUBAGENT: 'plan:subagent',
281
+ PLAN_PROGRESS: 'plan:progress',
282
+ PLAN_STARTED: 'plan:started',
283
+ PLAN_CANCELLED: 'plan:cancelled',
284
+ PLAN_COMPLETED: 'plan:completed',
285
+ };
286
+
287
+ // ═══════════════════════════════════════════════════════════════
288
+ // Utility Functions
289
+ // ═══════════════════════════════════════════════════════════════
290
+
291
+ /**
292
+ * Get unified coordinates from mouse or touch event.
293
+ * @param {MouseEvent|TouchEvent} e - The event
294
+ * @returns {{ clientX: number, clientY: number }} Coordinates
295
+ */
296
+ function getEventCoords(e) {
297
+ if (e.touches && e.touches.length > 0) {
298
+ return { clientX: e.touches[0].clientX, clientY: e.touches[0].clientY };
299
+ }
300
+ if (e.changedTouches && e.changedTouches.length > 0) {
301
+ return { clientX: e.changedTouches[0].clientX, clientY: e.changedTouches[0].clientY };
302
+ }
303
+ return { clientX: e.clientX, clientY: e.clientY };
304
+ }
305
+
306
+ /**
307
+ * Process data containing DEC 2026 sync markers.
308
+ * Strips markers and returns segments that should be written atomically.
309
+ * Each returned segment represents content between SYNC_START and SYNC_END.
310
+ * Content outside sync blocks is returned as-is.
311
+ *
312
+ * @param {string} data - Raw terminal data with potential sync markers
313
+ * @returns {string[]} - Array of content segments to write (markers stripped)
314
+ */
315
+ function extractSyncSegments(data) {
316
+ const segments = [];
317
+ let remaining = data;
318
+
319
+ while (remaining.length > 0) {
320
+ const startIdx = remaining.indexOf(DEC_SYNC_START);
321
+
322
+ if (startIdx === -1) {
323
+ // No more sync blocks, return rest as-is
324
+ if (remaining.length > 0) {
325
+ segments.push(remaining);
326
+ }
327
+ break;
328
+ }
329
+
330
+ // Content before sync block (if any)
331
+ if (startIdx > 0) {
332
+ segments.push(remaining.slice(0, startIdx));
333
+ }
334
+
335
+ // Find matching end marker
336
+ const afterStart = remaining.slice(startIdx + DEC_SYNC_START.length);
337
+ const endIdx = afterStart.indexOf(DEC_SYNC_END);
338
+
339
+ if (endIdx === -1) {
340
+ // No end marker found - sync block continues in next chunk
341
+ // Include the start marker so it can be handled when more data arrives
342
+ segments.push(remaining.slice(startIdx));
343
+ break;
344
+ }
345
+
346
+ // Extract synchronized content (without markers)
347
+ const syncContent = afterStart.slice(0, endIdx);
348
+ if (syncContent.length > 0) {
349
+ segments.push(syncContent);
350
+ }
351
+
352
+ // Continue with content after end marker
353
+ remaining = afterStart.slice(endIdx + DEC_SYNC_END.length);
354
+ }
355
+
356
+ return segments;
357
+ }
358
+
359
+ // HTML escape utility (shared by NotificationManager, CodemanApp, and ralph-wizard.js)
360
+ const _htmlEscapeMap = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
361
+ const _htmlEscapePattern = /[&<>"']/g;
362
+ function escapeHtml(text) {
363
+ if (typeof text !== 'string') return '';
364
+ return text.replace(_htmlEscapePattern, (ch) => _htmlEscapeMap[ch]);
365
+ }
Binary file
Binary file
@@ -20,6 +20,7 @@
20
20
  <script defer src="vendor/xterm-addon-fit.min.js"></script>
21
21
  <script defer src="vendor/xterm-addon-webgl.min.js"></script>
22
22
  <script defer src="vendor/xterm-addon-unicode11.min.js"></script>
23
+ <script defer src="vendor/xterm-zerolag-input.js?v=0.3.0"></script>
23
24
  <!-- Synchronous mobile detection — runs before first paint to prevent panel flash -->
24
25
  <script>if(window.innerWidth<768||(('ontouchstart' in window||navigator.maxTouchPoints>0)&&window.innerWidth<1024))document.documentElement.classList.add('mobile-init');</script>
25
26
  <!-- Inline critical CSS for instant skeleton paint (before styles.css loads) -->
@@ -435,7 +436,7 @@
435
436
  <div class="monitor-panel-header" id="monitorPanelHeader">
436
437
  <div class="monitor-panel-title">Monitor</div>
437
438
  <div class="monitor-panel-actions">
438
- <button class="btn-toolbar btn-sm btn-danger" onclick="app.killAllSessions()" title="Kill all sessions and their tmux processes">Kill All</button>
439
+ <button class="btn-toolbar btn-sm btn-danger" onclick="app.killAllMuxSessions()" title="Kill all sessions and their tmux processes">Kill All</button>
439
440
  <button class="btn-icon-sm" onclick="app.reconcileMuxSessions()" title="Refresh tmux sessions">&#x21BB;</button>
440
441
  <button class="btn-icon-sm" onclick="app.toggleMonitorDetach()" title="Detach panel" id="monitorDetachBtn">&#x29C9;</button>
441
442
  <button class="btn-icon-sm" onclick="app.toggleMonitorPanel()" title="Toggle panel" id="monitorToggleBtn">&#x25B2;</button>
@@ -960,6 +961,10 @@
960
961
  <button class="btn-icon-sm" id="tunnelQrBtn" onclick="app.showTunnelQR()" title="Show QR code" style="font-size:16px; padding:2px 6px; background:none; border:1px solid var(--border); border-radius:4px; cursor:pointer; color:var(--text-secondary)">⊞</button>
961
962
  </div>
962
963
  </div>
964
+ <div class="settings-item" id="tunnelUploadUrlRow" style="display:none">
965
+ <span class="settings-item-label">Upload URL</span>
966
+ <span id="tunnelUploadUrlDisplay" class="settings-item-value" style="cursor:pointer; text-decoration:underline; font-family:monospace; font-size:12px" title="Click to copy"></span>
967
+ </div>
963
968
 
964
969
  </div>
965
970
  </div>
@@ -1669,7 +1674,14 @@
1669
1674
  <!-- Lines drawn dynamically -->
1670
1675
  </svg>
1671
1676
 
1672
- <script defer src="app.js?v=0.1631"></script>
1673
- <script defer src="ralph-wizard.js?v=0.1631"></script>
1677
+ <script defer src="constants.js?v=0.3.0"></script>
1678
+ <script defer src="mobile-handlers.js?v=0.3.0"></script>
1679
+ <script defer src="voice-input.js?v=0.3.0"></script>
1680
+ <script defer src="notification-manager.js?v=0.3.0"></script>
1681
+ <script defer src="keyboard-accessory.js?v=0.3.0"></script>
1682
+ <script defer src="app.js?v=0.3.0"></script>
1683
+ <script defer src="ralph-wizard.js?v=0.3.0"></script>
1684
+ <script defer src="api-client.js?v=0.3.0"></script>
1685
+ <script defer src="subagent-windows.js?v=0.3.0"></script>
1674
1686
  </body>
1675
1687
  </html>
Binary file
Binary file