aicodeman 0.2.8 → 0.3.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 (348) hide show
  1. package/README.md +91 -0
  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 +36 -0
  29. package/dist/config/server-timing.d.ts.map +1 -0
  30. package/dist/config/server-timing.js +51 -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.map +1 -1
  45. package/dist/hooks-config.js +7 -6
  46. package/dist/hooks-config.js.map +1 -1
  47. package/dist/image-watcher.d.ts +4 -4
  48. package/dist/image-watcher.d.ts.map +1 -1
  49. package/dist/image-watcher.js +17 -30
  50. package/dist/image-watcher.js.map +1 -1
  51. package/dist/index.js +1 -2
  52. package/dist/index.js.map +1 -1
  53. package/dist/plan-orchestrator.d.ts +2 -24
  54. package/dist/plan-orchestrator.d.ts.map +1 -1
  55. package/dist/plan-orchestrator.js.map +1 -1
  56. package/dist/push-store.d.ts +1 -1
  57. package/dist/push-store.d.ts.map +1 -1
  58. package/dist/push-store.js +4 -12
  59. package/dist/push-store.js.map +1 -1
  60. package/dist/ralph-fix-plan-watcher.d.ts +91 -0
  61. package/dist/ralph-fix-plan-watcher.d.ts.map +1 -0
  62. package/dist/ralph-fix-plan-watcher.js +326 -0
  63. package/dist/ralph-fix-plan-watcher.js.map +1 -0
  64. package/dist/ralph-plan-tracker.d.ts +201 -0
  65. package/dist/ralph-plan-tracker.d.ts.map +1 -0
  66. package/dist/ralph-plan-tracker.js +325 -0
  67. package/dist/ralph-plan-tracker.js.map +1 -0
  68. package/dist/ralph-stall-detector.d.ts +84 -0
  69. package/dist/ralph-stall-detector.d.ts.map +1 -0
  70. package/dist/ralph-stall-detector.js +139 -0
  71. package/dist/ralph-stall-detector.js.map +1 -0
  72. package/dist/ralph-status-parser.d.ts +141 -0
  73. package/dist/ralph-status-parser.d.ts.map +1 -0
  74. package/dist/ralph-status-parser.js +478 -0
  75. package/dist/ralph-status-parser.js.map +1 -0
  76. package/dist/ralph-tracker.d.ts +194 -685
  77. package/dist/ralph-tracker.d.ts.map +1 -1
  78. package/dist/ralph-tracker.js +349 -1713
  79. package/dist/ralph-tracker.js.map +1 -1
  80. package/dist/respawn-adaptive-timing.d.ts +61 -0
  81. package/dist/respawn-adaptive-timing.d.ts.map +1 -0
  82. package/dist/respawn-adaptive-timing.js +105 -0
  83. package/dist/respawn-adaptive-timing.js.map +1 -0
  84. package/dist/respawn-controller.d.ts +14 -101
  85. package/dist/respawn-controller.d.ts.map +1 -1
  86. package/dist/respawn-controller.js +155 -594
  87. package/dist/respawn-controller.js.map +1 -1
  88. package/dist/respawn-health.d.ts +54 -0
  89. package/dist/respawn-health.d.ts.map +1 -0
  90. package/dist/respawn-health.js +183 -0
  91. package/dist/respawn-health.js.map +1 -0
  92. package/dist/respawn-metrics.d.ts +81 -0
  93. package/dist/respawn-metrics.d.ts.map +1 -0
  94. package/dist/respawn-metrics.js +198 -0
  95. package/dist/respawn-metrics.js.map +1 -0
  96. package/dist/respawn-patterns.d.ts +45 -0
  97. package/dist/respawn-patterns.d.ts.map +1 -0
  98. package/dist/respawn-patterns.js +125 -0
  99. package/dist/respawn-patterns.js.map +1 -0
  100. package/dist/session-auto-ops.d.ts +89 -0
  101. package/dist/session-auto-ops.d.ts.map +1 -0
  102. package/dist/session-auto-ops.js +224 -0
  103. package/dist/session-auto-ops.js.map +1 -0
  104. package/dist/session-cli-builder.d.ts +62 -0
  105. package/dist/session-cli-builder.d.ts.map +1 -0
  106. package/dist/session-cli-builder.js +121 -0
  107. package/dist/session-cli-builder.js.map +1 -0
  108. package/dist/session-task-cache.d.ts +52 -0
  109. package/dist/session-task-cache.d.ts.map +1 -0
  110. package/dist/session-task-cache.js +90 -0
  111. package/dist/session-task-cache.js.map +1 -0
  112. package/dist/session.d.ts +2 -33
  113. package/dist/session.d.ts.map +1 -1
  114. package/dist/session.js +58 -309
  115. package/dist/session.js.map +1 -1
  116. package/dist/state-store.d.ts +9 -2
  117. package/dist/state-store.d.ts.map +1 -1
  118. package/dist/state-store.js +112 -39
  119. package/dist/state-store.js.map +1 -1
  120. package/dist/subagent-watcher.d.ts +16 -9
  121. package/dist/subagent-watcher.d.ts.map +1 -1
  122. package/dist/subagent-watcher.js +126 -147
  123. package/dist/subagent-watcher.js.map +1 -1
  124. package/dist/team-watcher.d.ts +3 -0
  125. package/dist/team-watcher.d.ts.map +1 -1
  126. package/dist/team-watcher.js +54 -5
  127. package/dist/team-watcher.js.map +1 -1
  128. package/dist/tmux-manager.d.ts.map +1 -1
  129. package/dist/tmux-manager.js +1 -2
  130. package/dist/tmux-manager.js.map +1 -1
  131. package/dist/tunnel-manager.d.ts +26 -0
  132. package/dist/tunnel-manager.d.ts.map +1 -1
  133. package/dist/tunnel-manager.js +127 -7
  134. package/dist/tunnel-manager.js.map +1 -1
  135. package/dist/types/api.d.ts +93 -0
  136. package/dist/types/api.d.ts.map +1 -0
  137. package/dist/types/api.js +83 -0
  138. package/dist/types/api.js.map +1 -0
  139. package/dist/types/app-state.d.ts +100 -0
  140. package/dist/types/app-state.d.ts.map +1 -0
  141. package/dist/types/app-state.js +59 -0
  142. package/dist/types/app-state.js.map +1 -0
  143. package/dist/types/common.d.ts +70 -0
  144. package/dist/types/common.d.ts.map +1 -0
  145. package/dist/types/common.js +8 -0
  146. package/dist/types/common.js.map +1 -0
  147. package/dist/types/index.d.ts +18 -0
  148. package/dist/types/index.d.ts.map +1 -0
  149. package/dist/types/index.js +18 -0
  150. package/dist/types/index.js.map +1 -0
  151. package/dist/types/lifecycle.d.ts +17 -0
  152. package/dist/types/lifecycle.d.ts.map +1 -0
  153. package/dist/types/lifecycle.js +5 -0
  154. package/dist/types/lifecycle.js.map +1 -0
  155. package/dist/types/plan.d.ts +32 -0
  156. package/dist/types/plan.d.ts.map +1 -0
  157. package/dist/types/plan.js +5 -0
  158. package/dist/types/plan.js.map +1 -0
  159. package/dist/types/push.d.ts +23 -0
  160. package/dist/types/push.d.ts.map +1 -0
  161. package/dist/types/push.js +5 -0
  162. package/dist/types/push.js.map +1 -0
  163. package/dist/types/ralph.d.ts +241 -0
  164. package/dist/types/ralph.d.ts.map +1 -0
  165. package/dist/types/ralph.js +49 -0
  166. package/dist/types/ralph.js.map +1 -0
  167. package/dist/types/respawn.d.ts +250 -0
  168. package/dist/types/respawn.d.ts.map +1 -0
  169. package/dist/types/respawn.js +5 -0
  170. package/dist/types/respawn.js.map +1 -0
  171. package/dist/types/run-summary.d.ts +81 -0
  172. package/dist/types/run-summary.d.ts.map +1 -0
  173. package/dist/types/run-summary.js +22 -0
  174. package/dist/types/run-summary.js.map +1 -0
  175. package/dist/types/session.d.ts +130 -0
  176. package/dist/types/session.d.ts.map +1 -0
  177. package/dist/types/session.js +5 -0
  178. package/dist/types/session.js.map +1 -0
  179. package/dist/types/task.d.ts +58 -0
  180. package/dist/types/task.d.ts.map +1 -0
  181. package/dist/types/task.js +5 -0
  182. package/dist/types/task.js.map +1 -0
  183. package/dist/types/teams.d.ts +55 -0
  184. package/dist/types/teams.d.ts.map +1 -0
  185. package/dist/types/teams.js +5 -0
  186. package/dist/types/teams.js.map +1 -0
  187. package/dist/types/tools.d.ts +46 -0
  188. package/dist/types/tools.d.ts.map +1 -0
  189. package/dist/types/tools.js +5 -0
  190. package/dist/types/tools.js.map +1 -0
  191. package/dist/types.d.ts +1 -1138
  192. package/dist/types.d.ts.map +1 -1
  193. package/dist/types.js +1 -214
  194. package/dist/types.js.map +1 -1
  195. package/dist/utils/claude-cli-resolver.d.ts.map +1 -1
  196. package/dist/utils/claude-cli-resolver.js +1 -2
  197. package/dist/utils/claude-cli-resolver.js.map +1 -1
  198. package/dist/utils/debouncer.d.ts +111 -0
  199. package/dist/utils/debouncer.d.ts.map +1 -0
  200. package/dist/utils/debouncer.js +162 -0
  201. package/dist/utils/debouncer.js.map +1 -0
  202. package/dist/utils/index.d.ts +3 -2
  203. package/dist/utils/index.d.ts.map +1 -1
  204. package/dist/utils/index.js +3 -2
  205. package/dist/utils/index.js.map +1 -1
  206. package/dist/utils/opencode-cli-resolver.d.ts.map +1 -1
  207. package/dist/utils/opencode-cli-resolver.js +1 -2
  208. package/dist/utils/opencode-cli-resolver.js.map +1 -1
  209. package/dist/utils/string-similarity.d.ts +0 -57
  210. package/dist/utils/string-similarity.d.ts.map +1 -1
  211. package/dist/utils/string-similarity.js +3 -18
  212. package/dist/utils/string-similarity.js.map +1 -1
  213. package/dist/web/middleware/auth.d.ts +31 -0
  214. package/dist/web/middleware/auth.d.ts.map +1 -0
  215. package/dist/web/middleware/auth.js +154 -0
  216. package/dist/web/middleware/auth.js.map +1 -0
  217. package/dist/web/ports/auth-port.d.ts +18 -0
  218. package/dist/web/ports/auth-port.d.ts.map +1 -0
  219. package/dist/web/ports/auth-port.js +6 -0
  220. package/dist/web/ports/auth-port.js.map +1 -0
  221. package/dist/web/ports/config-port.d.ts +28 -0
  222. package/dist/web/ports/config-port.d.ts.map +1 -0
  223. package/dist/web/ports/config-port.js +6 -0
  224. package/dist/web/ports/config-port.js.map +1 -0
  225. package/dist/web/ports/event-port.d.ts +13 -0
  226. package/dist/web/ports/event-port.d.ts.map +1 -0
  227. package/dist/web/ports/event-port.js +6 -0
  228. package/dist/web/ports/event-port.js.map +1 -0
  229. package/dist/web/ports/index.d.ts +14 -0
  230. package/dist/web/ports/index.d.ts.map +1 -0
  231. package/dist/web/ports/index.js +9 -0
  232. package/dist/web/ports/index.js.map +1 -0
  233. package/dist/web/ports/infra-port.d.ts +36 -0
  234. package/dist/web/ports/infra-port.d.ts.map +1 -0
  235. package/dist/web/ports/infra-port.js +6 -0
  236. package/dist/web/ports/infra-port.js.map +1 -0
  237. package/dist/web/ports/respawn-port.d.ts +20 -0
  238. package/dist/web/ports/respawn-port.d.ts.map +1 -0
  239. package/dist/web/ports/respawn-port.js +6 -0
  240. package/dist/web/ports/respawn-port.js.map +1 -0
  241. package/dist/web/ports/session-port.d.ts +15 -0
  242. package/dist/web/ports/session-port.d.ts.map +1 -0
  243. package/dist/web/ports/session-port.js +6 -0
  244. package/dist/web/ports/session-port.js.map +1 -0
  245. package/dist/web/public/api-client.js +70 -0
  246. package/dist/web/public/api-client.js.br +0 -0
  247. package/dist/web/public/api-client.js.gz +0 -0
  248. package/dist/web/public/app.js +152 -236
  249. package/dist/web/public/app.js.br +0 -0
  250. package/dist/web/public/app.js.gz +0 -0
  251. package/dist/web/public/constants.js +238 -0
  252. package/dist/web/public/constants.js.br +0 -0
  253. package/dist/web/public/constants.js.gz +0 -0
  254. package/dist/web/public/index.html +11 -3
  255. package/dist/web/public/index.html.br +0 -0
  256. package/dist/web/public/index.html.gz +0 -0
  257. package/dist/web/public/keyboard-accessory.js +279 -0
  258. package/dist/web/public/keyboard-accessory.js.br +0 -0
  259. package/dist/web/public/keyboard-accessory.js.gz +0 -0
  260. package/dist/web/public/mobile-handlers.js +467 -0
  261. package/dist/web/public/mobile-handlers.js.br +0 -0
  262. package/dist/web/public/mobile-handlers.js.gz +0 -0
  263. package/dist/web/public/mobile.css.gz +0 -0
  264. package/dist/web/public/notification-manager.js +445 -0
  265. package/dist/web/public/notification-manager.js.br +0 -0
  266. package/dist/web/public/notification-manager.js.gz +0 -0
  267. package/dist/web/public/ralph-wizard.js +3 -3
  268. package/dist/web/public/ralph-wizard.js.br +0 -0
  269. package/dist/web/public/ralph-wizard.js.gz +0 -0
  270. package/dist/web/public/styles.css.gz +0 -0
  271. package/dist/web/public/subagent-windows.js +1115 -0
  272. package/dist/web/public/subagent-windows.js.br +0 -0
  273. package/dist/web/public/subagent-windows.js.gz +0 -0
  274. package/dist/web/public/sw.js.gz +0 -0
  275. package/dist/web/public/upload.html.gz +0 -0
  276. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  277. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  278. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  279. package/dist/web/public/vendor/xterm.css.gz +0 -0
  280. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  281. package/dist/web/public/voice-input.js +858 -0
  282. package/dist/web/public/voice-input.js.br +0 -0
  283. package/dist/web/public/voice-input.js.gz +0 -0
  284. package/dist/web/route-helpers.d.ts +38 -0
  285. package/dist/web/route-helpers.d.ts.map +1 -0
  286. package/dist/web/route-helpers.js +143 -0
  287. package/dist/web/route-helpers.js.map +1 -0
  288. package/dist/web/routes/case-routes.d.ts +9 -0
  289. package/dist/web/routes/case-routes.d.ts.map +1 -0
  290. package/dist/web/routes/case-routes.js +419 -0
  291. package/dist/web/routes/case-routes.js.map +1 -0
  292. package/dist/web/routes/file-routes.d.ts +8 -0
  293. package/dist/web/routes/file-routes.d.ts.map +1 -0
  294. package/dist/web/routes/file-routes.js +337 -0
  295. package/dist/web/routes/file-routes.js.map +1 -0
  296. package/dist/web/routes/hook-event-routes.d.ts +9 -0
  297. package/dist/web/routes/hook-event-routes.d.ts.map +1 -0
  298. package/dist/web/routes/hook-event-routes.js +57 -0
  299. package/dist/web/routes/hook-event-routes.js.map +1 -0
  300. package/dist/web/routes/index.d.ts +16 -0
  301. package/dist/web/routes/index.d.ts.map +1 -0
  302. package/dist/web/routes/index.js +16 -0
  303. package/dist/web/routes/index.js.map +1 -0
  304. package/dist/web/routes/mux-routes.d.ts +8 -0
  305. package/dist/web/routes/mux-routes.d.ts.map +1 -0
  306. package/dist/web/routes/mux-routes.js +32 -0
  307. package/dist/web/routes/mux-routes.js.map +1 -0
  308. package/dist/web/routes/plan-routes.d.ts +9 -0
  309. package/dist/web/routes/plan-routes.d.ts.map +1 -0
  310. package/dist/web/routes/plan-routes.js +381 -0
  311. package/dist/web/routes/plan-routes.js.map +1 -0
  312. package/dist/web/routes/push-routes.d.ts +8 -0
  313. package/dist/web/routes/push-routes.d.ts.map +1 -0
  314. package/dist/web/routes/push-routes.js +49 -0
  315. package/dist/web/routes/push-routes.js.map +1 -0
  316. package/dist/web/routes/ralph-routes.d.ts +9 -0
  317. package/dist/web/routes/ralph-routes.d.ts.map +1 -0
  318. package/dist/web/routes/ralph-routes.js +475 -0
  319. package/dist/web/routes/ralph-routes.js.map +1 -0
  320. package/dist/web/routes/respawn-routes.d.ts +8 -0
  321. package/dist/web/routes/respawn-routes.d.ts.map +1 -0
  322. package/dist/web/routes/respawn-routes.js +260 -0
  323. package/dist/web/routes/respawn-routes.js.map +1 -0
  324. package/dist/web/routes/scheduled-routes.d.ts +8 -0
  325. package/dist/web/routes/scheduled-routes.d.ts.map +1 -0
  326. package/dist/web/routes/scheduled-routes.js +51 -0
  327. package/dist/web/routes/scheduled-routes.js.map +1 -0
  328. package/dist/web/routes/session-routes.d.ts +9 -0
  329. package/dist/web/routes/session-routes.d.ts.map +1 -0
  330. package/dist/web/routes/session-routes.js +729 -0
  331. package/dist/web/routes/session-routes.js.map +1 -0
  332. package/dist/web/routes/system-routes.d.ts +9 -0
  333. package/dist/web/routes/system-routes.d.ts.map +1 -0
  334. package/dist/web/routes/system-routes.js +678 -0
  335. package/dist/web/routes/system-routes.js.map +1 -0
  336. package/dist/web/routes/team-routes.d.ts +8 -0
  337. package/dist/web/routes/team-routes.d.ts.map +1 -0
  338. package/dist/web/routes/team-routes.js +14 -0
  339. package/dist/web/routes/team-routes.js.map +1 -0
  340. package/dist/web/schemas.d.ts +43 -3
  341. package/dist/web/schemas.d.ts.map +1 -1
  342. package/dist/web/schemas.js +6 -2
  343. package/dist/web/schemas.js.map +1 -1
  344. package/dist/web/server.d.ts +10 -9
  345. package/dist/web/server.d.ts.map +1 -1
  346. package/dist/web/server.js +342 -3829
  347. package/dist/web/server.js.map +1 -1
  348. package/package.json +1 -1
@@ -28,6 +28,15 @@ export declare class TunnelManager extends EventEmitter {
28
28
  private stopped;
29
29
  private localPort;
30
30
  private useHttps;
31
+ /** Map-based lookup: shortCode → QrTokenRecord (hash-based, timing-safe) */
32
+ private qrTokensByCode;
33
+ private currentShortCode;
34
+ private rotationTimer;
35
+ /** SVG cache — regenerated only on token rotation, not per request */
36
+ private cachedQrSvg;
37
+ /** Global rate limit counter (separate from Basic Auth rate limiting) */
38
+ private qrAttemptCount;
39
+ private qrRateLimitResetTimer;
31
40
  /**
32
41
  * Resolve cloudflared binary path.
33
42
  * Checks ~/.local/bin first, then falls back to PATH.
@@ -47,6 +56,23 @@ export declare class TunnelManager extends EventEmitter {
47
56
  * Stop the cloudflared tunnel process. Safe to call from any state.
48
57
  */
49
58
  stop(): void;
59
+ /** Start token rotation — called after tunnel URL is acquired */
60
+ startTokenRotation(): void;
61
+ /** Stop token rotation and clear all tokens */
62
+ stopTokenRotation(): void;
63
+ /** Create a new token, evict expired/consumed ones, emit rotation event */
64
+ private rotateToken;
65
+ /** Get the current (newest) token's short code for QR URL */
66
+ getCurrentShortCode(): string | undefined;
67
+ /** Get cached QR SVG, regenerating only if the short code changed */
68
+ getQrSvg(tunnelUrl: string): Promise<string>;
69
+ /**
70
+ * Validate and atomically consume a token by short code.
71
+ * Map.get() is hash-based — no timing side-channel from string comparison.
72
+ */
73
+ consumeToken(shortCode: string): boolean;
74
+ /** Force-regenerate (manual revocation via API) */
75
+ regenerateQrToken(): void;
50
76
  isRunning(): boolean;
51
77
  getUrl(): string | null;
52
78
  getStatus(): TunnelStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel-manager.d.ts","sourceRoot":"","sources":["../src/tunnel-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAkBD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,cAAc,CAA+B;IACrD,6EAA6E;IAC7E,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAsB1B,+BAA+B;IAC/B,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IA4H9C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAwBZ,SAAS,IAAI,OAAO;IAIpB,MAAM,IAAI,MAAM,GAAG,IAAI;IAIvB,SAAS,IAAI,YAAY;CAM1B"}
1
+ {"version":3,"file":"tunnel-manager.d.ts","sourceRoot":"","sources":["../src/tunnel-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmB3C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AA2BD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,cAAc,CAA+B;IACrD,6EAA6E;IAC7E,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAS;IAGzB,4EAA4E;IAC5E,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAA+C;IACpE,sEAAsE;IACtE,OAAO,CAAC,WAAW,CAAmD;IACtE,yEAAyE;IACzE,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,qBAAqB,CAA+C;IAE5E;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAsB1B,+BAA+B;IAC/B,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAgI9C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,IAAI,IAAI,IAAI;IA2BZ,iEAAiE;IACjE,kBAAkB,IAAI,IAAI;IAS1B,+CAA+C;IAC/C,iBAAiB,IAAI,IAAI;IAezB,2EAA2E;IAC3E,OAAO,CAAC,WAAW;IAsBnB,6DAA6D;IAC7D,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIzC,qEAAqE;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBlD;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAoBxC,mDAAmD;IACnD,iBAAiB,IAAI,IAAI;IAOzB,SAAS,IAAI,OAAO;IAIpB,MAAM,IAAI,MAAM,GAAG,IAAI;IAIvB,SAAS,IAAI,YAAY;CAM1B"}
@@ -17,15 +17,23 @@ import { spawn } from 'node:child_process';
17
17
  import { existsSync } from 'node:fs';
18
18
  import { join } from 'node:path';
19
19
  import { homedir } from 'node:os';
20
- // ========== Constants ==========
20
+ import { randomBytes } from 'node:crypto';
21
+ import { QR_TOKEN_TTL_MS, QR_TOKEN_GRACE_MS, SHORT_CODE_LENGTH, QR_RATE_LIMIT_MAX, QR_RATE_LIMIT_WINDOW_MS, URL_TIMEOUT_MS, RESTART_DELAY_MS, FORCE_KILL_MS, } from './config/tunnel-config.js';
22
+ /** Rejection-sampled base62 short code — no modulo bias */
23
+ function generateShortCode() {
24
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
25
+ const maxUnbiased = 248; // largest multiple of 62 that fits in a byte (248 = 62 * 4)
26
+ const result = [];
27
+ while (result.length < SHORT_CODE_LENGTH) {
28
+ const [byte] = randomBytes(1);
29
+ if (byte < maxUnbiased)
30
+ result.push(chars[byte % 62]);
31
+ // else: discard and re-draw (rejection sampling)
32
+ }
33
+ return result.join('');
34
+ }
21
35
  /** Regex to extract the trycloudflare.com URL from cloudflared output */
22
36
  const TUNNEL_URL_REGEX = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/;
23
- /** Max time to wait for URL before considering it a timeout (ms) */
24
- const URL_TIMEOUT_MS = 30_000;
25
- /** Restart delay after unexpected exit (ms) */
26
- const RESTART_DELAY_MS = 5_000;
27
- /** Force-kill timeout after SIGTERM (ms) */
28
- const FORCE_KILL_MS = 5_000;
29
37
  // ========== TunnelManager Class ==========
30
38
  export class TunnelManager extends EventEmitter {
31
39
  process = null;
@@ -38,6 +46,16 @@ export class TunnelManager extends EventEmitter {
38
46
  stopped = true;
39
47
  localPort = 3000;
40
48
  useHttps = false;
49
+ // ========== QR Token State ==========
50
+ /** Map-based lookup: shortCode → QrTokenRecord (hash-based, timing-safe) */
51
+ qrTokensByCode = new Map();
52
+ currentShortCode = null;
53
+ rotationTimer = null;
54
+ /** SVG cache — regenerated only on token rotation, not per request */
55
+ cachedQrSvg = null;
56
+ /** Global rate limit counter (separate from Basic Auth rate limiting) */
57
+ qrAttemptCount = 0;
58
+ qrRateLimitResetTimer = null;
41
59
  /**
42
60
  * Resolve cloudflared binary path.
43
61
  * Checks ~/.local/bin first, then falls back to PATH.
@@ -144,6 +162,10 @@ export class TunnelManager extends EventEmitter {
144
162
  // Detach listeners — no need to parse further output
145
163
  this.process?.stdout?.off('data', handleOutput);
146
164
  this.process?.stderr?.off('data', handleOutput);
165
+ // Start QR token rotation when tunnel URL is acquired (only if auth enabled)
166
+ if (process.env.CODEMAN_PASSWORD) {
167
+ this.startTokenRotation();
168
+ }
147
169
  this.emit('started', { url: this.url });
148
170
  }
149
171
  };
@@ -213,6 +235,7 @@ export class TunnelManager extends EventEmitter {
213
235
  stop() {
214
236
  this.stopped = true;
215
237
  this.clearTimers();
238
+ this.stopTokenRotation();
216
239
  if (this.process) {
217
240
  const pid = this.process.pid;
218
241
  console.log(`[TunnelManager] Stopping tunnel (PID ${pid})`);
@@ -235,6 +258,103 @@ export class TunnelManager extends EventEmitter {
235
258
  this.emit('stopped', {});
236
259
  }
237
260
  }
261
+ // ========== QR Token Management ==========
262
+ /** Start token rotation — called after tunnel URL is acquired */
263
+ startTokenRotation() {
264
+ this.stopTokenRotation();
265
+ this.rotateToken();
266
+ this.rotationTimer = setInterval(() => this.rotateToken(), QR_TOKEN_TTL_MS);
267
+ this.qrRateLimitResetTimer = setInterval(() => {
268
+ this.qrAttemptCount = 0;
269
+ }, QR_RATE_LIMIT_WINDOW_MS);
270
+ }
271
+ /** Stop token rotation and clear all tokens */
272
+ stopTokenRotation() {
273
+ if (this.rotationTimer) {
274
+ clearInterval(this.rotationTimer);
275
+ this.rotationTimer = null;
276
+ }
277
+ if (this.qrRateLimitResetTimer) {
278
+ clearInterval(this.qrRateLimitResetTimer);
279
+ this.qrRateLimitResetTimer = null;
280
+ }
281
+ this.qrTokensByCode.clear();
282
+ this.currentShortCode = null;
283
+ this.cachedQrSvg = null;
284
+ this.qrAttemptCount = 0;
285
+ }
286
+ /** Create a new token, evict expired/consumed ones, emit rotation event */
287
+ rotateToken() {
288
+ const record = {
289
+ token: randomBytes(32).toString('hex'),
290
+ shortCode: generateShortCode(),
291
+ createdAt: Date.now(),
292
+ consumed: false,
293
+ };
294
+ // Evict expired or consumed tokens
295
+ const now = Date.now();
296
+ for (const [code, rec] of this.qrTokensByCode) {
297
+ if (now - rec.createdAt > QR_TOKEN_GRACE_MS || rec.consumed) {
298
+ this.qrTokensByCode.delete(code);
299
+ }
300
+ }
301
+ this.qrTokensByCode.set(record.shortCode, record);
302
+ this.currentShortCode = record.shortCode;
303
+ this.cachedQrSvg = null; // invalidate SVG cache
304
+ this.emit('qrTokenRotated');
305
+ }
306
+ /** Get the current (newest) token's short code for QR URL */
307
+ getCurrentShortCode() {
308
+ return this.currentShortCode ?? undefined;
309
+ }
310
+ /** Get cached QR SVG, regenerating only if the short code changed */
311
+ async getQrSvg(tunnelUrl) {
312
+ const code = this.currentShortCode;
313
+ if (!code)
314
+ throw new Error('No QR token available');
315
+ if (this.cachedQrSvg?.shortCode === code)
316
+ return this.cachedQrSvg.svg;
317
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- dynamic optional dependency
318
+ const QRCode = require('qrcode');
319
+ const svg = await QRCode.toString(`${tunnelUrl}/q/${code}`, {
320
+ type: 'svg',
321
+ margin: 2,
322
+ width: 256,
323
+ });
324
+ this.cachedQrSvg = { shortCode: code, svg };
325
+ return svg;
326
+ }
327
+ /**
328
+ * Validate and atomically consume a token by short code.
329
+ * Map.get() is hash-based — no timing side-channel from string comparison.
330
+ */
331
+ consumeToken(shortCode) {
332
+ // Global rate limit (across all IPs)
333
+ if (this.qrAttemptCount >= QR_RATE_LIMIT_MAX)
334
+ return false;
335
+ this.qrAttemptCount++;
336
+ const record = this.qrTokensByCode.get(shortCode);
337
+ if (!record)
338
+ return false;
339
+ if (record.consumed)
340
+ return false;
341
+ const now = Date.now();
342
+ if (now - record.createdAt > QR_TOKEN_GRACE_MS)
343
+ return false;
344
+ // Atomic consume (single-threaded JS = no race)
345
+ record.consumed = true;
346
+ // Immediately rotate so desktop gets a fresh QR
347
+ this.rotateToken();
348
+ this.emit('qrTokenRegenerated');
349
+ return true;
350
+ }
351
+ /** Force-regenerate (manual revocation via API) */
352
+ regenerateQrToken() {
353
+ this.qrTokensByCode.clear();
354
+ this.currentShortCode = null;
355
+ this.rotateToken();
356
+ this.emit('qrTokenRegenerated');
357
+ }
238
358
  isRunning() {
239
359
  return this.process !== null || this.restartTimer !== null;
240
360
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel-manager.js","sourceRoot":"","sources":["../src/tunnel-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel-manager.js","sourceRoot":"","sources":["../src/tunnel-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @fileoverview API types and error handling
3
+ */
4
+ /**
5
+ * Standard error codes for API responses
6
+ */
7
+ export declare enum ApiErrorCode {
8
+ /** Resource not found */
9
+ NOT_FOUND = "NOT_FOUND",
10
+ /** Invalid input provided */
11
+ INVALID_INPUT = "INVALID_INPUT",
12
+ /** Session is currently busy */
13
+ SESSION_BUSY = "SESSION_BUSY",
14
+ /** Operation failed */
15
+ OPERATION_FAILED = "OPERATION_FAILED",
16
+ /** Resource already exists */
17
+ ALREADY_EXISTS = "ALREADY_EXISTS",
18
+ /** Internal server error */
19
+ INTERNAL_ERROR = "INTERNAL_ERROR"
20
+ }
21
+ /**
22
+ * Hook event types triggered by Claude Code's hooks system
23
+ */
24
+ export type HookEventType = 'idle_prompt' | 'permission_prompt' | 'elicitation_dialog' | 'stop' | 'teammate_idle' | 'task_completed';
25
+ /**
26
+ * Standard API response wrapper (discriminated union for type safety)
27
+ * @template T Type of the data payload
28
+ */
29
+ export type ApiResponse<T = unknown> = {
30
+ success: true;
31
+ data?: T;
32
+ } | {
33
+ success: false;
34
+ error: string;
35
+ errorCode: ApiErrorCode;
36
+ };
37
+ /**
38
+ * Creates a standardized error response
39
+ * @param code Error code
40
+ * @param details Optional detailed error message
41
+ * @returns Formatted error response
42
+ */
43
+ export declare function createErrorResponse(code: ApiErrorCode, details?: string): ApiResponse<never>;
44
+ /**
45
+ * Response for quick start operation
46
+ */
47
+ export interface QuickStartResponse {
48
+ /** Whether the request succeeded */
49
+ success: boolean;
50
+ /** Created session ID */
51
+ sessionId?: string;
52
+ /** Path to case folder */
53
+ casePath?: string;
54
+ /** Case name */
55
+ caseName?: string;
56
+ /** Error message if failed */
57
+ error?: string;
58
+ }
59
+ /**
60
+ * Information about a case folder
61
+ */
62
+ export interface CaseInfo {
63
+ /** Case name */
64
+ name: string;
65
+ /** Full path to case folder */
66
+ path: string;
67
+ /** Whether CLAUDE.md exists */
68
+ hasClaudeMd?: boolean;
69
+ }
70
+ /**
71
+ * Type guard to check if a value is an Error instance
72
+ * @param value The value to check
73
+ * @returns True if the value is an Error instance
74
+ */
75
+ export declare function isError(value: unknown): value is Error;
76
+ /**
77
+ * Safely extracts an error message from an unknown caught value.
78
+ * Handles the TypeScript 4.4+ unknown error type in catch blocks.
79
+ *
80
+ * @param error The caught error (type unknown in strict mode)
81
+ * @returns A string error message
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * try {
86
+ * await riskyOperation();
87
+ * } catch (err) {
88
+ * console.error('Failed:', getErrorMessage(err));
89
+ * }
90
+ * ```
91
+ */
92
+ export declare function getErrorMessage(error: unknown): string;
93
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,oBAAY,YAAY;IACtB,yBAAyB;IACzB,SAAS,cAAc;IACvB,6BAA6B;IAC7B,aAAa,kBAAkB;IAC/B,gCAAgC;IAChC,YAAY,iBAAiB;IAC7B,uBAAuB;IACvB,gBAAgB,qBAAqB;IACrC,8BAA8B;IAC9B,cAAc,mBAAmB;IACjC,4BAA4B;IAC5B,cAAc,mBAAmB;CAClC;AAcD;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,mBAAmB,GACnB,oBAAoB,GACpB,MAAM,GACN,eAAe,GACf,gBAAgB,CAAC;AAIrB;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAC/B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAA;CAAE,GAC3B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAM5F;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAEtD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWtD"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @fileoverview API types and error handling
3
+ */
4
+ /**
5
+ * Standard error codes for API responses
6
+ */
7
+ export var ApiErrorCode;
8
+ (function (ApiErrorCode) {
9
+ /** Resource not found */
10
+ ApiErrorCode["NOT_FOUND"] = "NOT_FOUND";
11
+ /** Invalid input provided */
12
+ ApiErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
13
+ /** Session is currently busy */
14
+ ApiErrorCode["SESSION_BUSY"] = "SESSION_BUSY";
15
+ /** Operation failed */
16
+ ApiErrorCode["OPERATION_FAILED"] = "OPERATION_FAILED";
17
+ /** Resource already exists */
18
+ ApiErrorCode["ALREADY_EXISTS"] = "ALREADY_EXISTS";
19
+ /** Internal server error */
20
+ ApiErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
21
+ })(ApiErrorCode || (ApiErrorCode = {}));
22
+ /**
23
+ * User-friendly error messages for each error code
24
+ */
25
+ const ErrorMessages = {
26
+ [ApiErrorCode.NOT_FOUND]: 'The requested resource was not found',
27
+ [ApiErrorCode.INVALID_INPUT]: 'Invalid input provided',
28
+ [ApiErrorCode.SESSION_BUSY]: 'Session is currently busy',
29
+ [ApiErrorCode.OPERATION_FAILED]: 'The operation failed',
30
+ [ApiErrorCode.ALREADY_EXISTS]: 'Resource already exists',
31
+ [ApiErrorCode.INTERNAL_ERROR]: 'An internal error occurred',
32
+ };
33
+ /**
34
+ * Creates a standardized error response
35
+ * @param code Error code
36
+ * @param details Optional detailed error message
37
+ * @returns Formatted error response
38
+ */
39
+ export function createErrorResponse(code, details) {
40
+ return {
41
+ success: false,
42
+ error: details || ErrorMessages[code],
43
+ errorCode: code,
44
+ };
45
+ }
46
+ // ========== Error Handling Utilities ==========
47
+ /**
48
+ * Type guard to check if a value is an Error instance
49
+ * @param value The value to check
50
+ * @returns True if the value is an Error instance
51
+ */
52
+ export function isError(value) {
53
+ return value instanceof Error;
54
+ }
55
+ /**
56
+ * Safely extracts an error message from an unknown caught value.
57
+ * Handles the TypeScript 4.4+ unknown error type in catch blocks.
58
+ *
59
+ * @param error The caught error (type unknown in strict mode)
60
+ * @returns A string error message
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * try {
65
+ * await riskyOperation();
66
+ * } catch (err) {
67
+ * console.error('Failed:', getErrorMessage(err));
68
+ * }
69
+ * ```
70
+ */
71
+ export function getErrorMessage(error) {
72
+ if (isError(error)) {
73
+ return error.message;
74
+ }
75
+ if (typeof error === 'string') {
76
+ return error;
77
+ }
78
+ if (error && typeof error === 'object' && 'message' in error) {
79
+ return String(error.message);
80
+ }
81
+ return 'An unknown error occurred';
82
+ }
83
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,YAaX;AAbD,WAAY,YAAY;IACtB,yBAAyB;IACzB,uCAAuB,CAAA;IACvB,6BAA6B;IAC7B,+CAA+B,CAAA;IAC/B,gCAAgC;IAChC,6CAA6B,CAAA;IAC7B,uBAAuB;IACvB,qDAAqC,CAAA;IACrC,8BAA8B;IAC9B,iDAAiC,CAAA;IACjC,4BAA4B;IAC5B,iDAAiC,CAAA;AACnC,CAAC,EAbW,YAAY,KAAZ,YAAY,QAavB;AAED;;GAEG;AACH,MAAM,aAAa,GAAiC;IAClD,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,sCAAsC;IAChE,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,wBAAwB;IACtD,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,2BAA2B;IACxD,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,sBAAsB;IACvD,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,yBAAyB;IACxD,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,4BAA4B;CAC5D,CAAC;AAuBF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAkB,EAAE,OAAgB;IACtE,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC;QACrC,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AA8BD,iDAAiD;AAEjD;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,2BAA2B,CAAC;AACrC,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @fileoverview Application state type definitions
3
+ */
4
+ import type { SessionState } from './session.js';
5
+ import type { TaskState } from './task.js';
6
+ import type { RalphLoopState } from './ralph.js';
7
+ import type { RespawnConfig } from './respawn.js';
8
+ /**
9
+ * Global statistics across all sessions (including deleted ones).
10
+ * Persisted to track cumulative usage over time.
11
+ */
12
+ export interface GlobalStats {
13
+ /** Total input tokens used across all sessions */
14
+ totalInputTokens: number;
15
+ /** Total output tokens used across all sessions */
16
+ totalOutputTokens: number;
17
+ /** Total cost in USD across all sessions */
18
+ totalCost: number;
19
+ /** Total number of sessions created (lifetime) */
20
+ totalSessionsCreated: number;
21
+ /** Timestamp when stats were first recorded */
22
+ firstRecordedAt: number;
23
+ /** Timestamp of last update */
24
+ lastUpdatedAt: number;
25
+ }
26
+ /**
27
+ * Daily token usage entry for historical tracking.
28
+ */
29
+ export interface TokenUsageEntry {
30
+ /** Date in YYYY-MM-DD format */
31
+ date: string;
32
+ /** Input tokens used on this day */
33
+ inputTokens: number;
34
+ /** Output tokens used on this day */
35
+ outputTokens: number;
36
+ /** Estimated cost in USD */
37
+ estimatedCost: number;
38
+ /** Number of sessions that contributed to this day's usage */
39
+ sessions: number;
40
+ }
41
+ /**
42
+ * Token usage statistics with daily tracking.
43
+ */
44
+ export interface TokenStats {
45
+ /** Daily usage entries (most recent first) */
46
+ daily: TokenUsageEntry[];
47
+ /** Timestamp of last update */
48
+ lastUpdated: number;
49
+ }
50
+ /**
51
+ * Application configuration
52
+ */
53
+ export interface AppConfig {
54
+ /** Interval for polling session status (ms) */
55
+ pollIntervalMs: number;
56
+ /** Default timeout for tasks (ms) */
57
+ defaultTimeoutMs: number;
58
+ /** Maximum concurrent sessions allowed */
59
+ maxConcurrentSessions: number;
60
+ /** Path to state file */
61
+ stateFilePath: string;
62
+ /** Respawn controller configuration */
63
+ respawn: RespawnConfig;
64
+ /** Last used case name (for default selection) */
65
+ lastUsedCase: string | null;
66
+ /** Whether Ralph/Todo tracker is globally enabled for all new sessions */
67
+ ralphEnabled: boolean;
68
+ }
69
+ /**
70
+ * Complete application state
71
+ */
72
+ export interface AppState {
73
+ /** Map of session ID to session state */
74
+ sessions: Record<string, SessionState>;
75
+ /** Map of task ID to task state */
76
+ tasks: Record<string, TaskState>;
77
+ /** Ralph Loop controller state */
78
+ ralphLoop: RalphLoopState;
79
+ /** Application configuration */
80
+ config: AppConfig;
81
+ /** Global statistics (cumulative across all sessions) */
82
+ globalStats?: GlobalStats;
83
+ /** Daily token usage statistics */
84
+ tokenStats?: TokenStats;
85
+ }
86
+ /**
87
+ * Default application configuration values
88
+ */
89
+ export declare const DEFAULT_CONFIG: AppConfig;
90
+ /**
91
+ * Creates initial application state
92
+ * @returns Fresh application state with defaults
93
+ */
94
+ export declare function createInitialState(): AppState;
95
+ /**
96
+ * Creates initial global stats object
97
+ * @returns Fresh global stats with zero values
98
+ */
99
+ export declare function createInitialGlobalStats(): GlobalStats;
100
+ //# sourceMappingURL=app-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-state.d.ts","sourceRoot":"","sources":["../../src/types/app-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAID;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,yBAAyB;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,OAAO,EAAE,aAAa,CAAC;IACvB,kDAAkD;IAClD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0EAA0E;IAC1E,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvC,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,kCAAkC;IAClC,SAAS,EAAE,cAAc,CAAC;IAC1B,gCAAgC;IAChC,MAAM,EAAE,SAAS,CAAC;IAClB,yDAAyD;IACzD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mCAAmC;IACnC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAID;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,SAe5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,CAe7C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,WAAW,CAUtD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @fileoverview Application state type definitions
3
+ */
4
+ // ========== Default Configuration ==========
5
+ /**
6
+ * Default application configuration values
7
+ */
8
+ export const DEFAULT_CONFIG = {
9
+ pollIntervalMs: 1000,
10
+ defaultTimeoutMs: 300000, // 5 minutes
11
+ maxConcurrentSessions: 5,
12
+ stateFilePath: '',
13
+ respawn: {
14
+ idleTimeoutMs: 5000, // 5 seconds of no activity after prompt
15
+ updatePrompt: 'update all the docs and CLAUDE.md',
16
+ interStepDelayMs: 1000, // 1 second between steps
17
+ enabled: false, // disabled by default
18
+ sendClear: true, // send /clear after update prompt
19
+ sendInit: true, // send /init after /clear
20
+ },
21
+ lastUsedCase: null,
22
+ ralphEnabled: false,
23
+ };
24
+ /**
25
+ * Creates initial application state
26
+ * @returns Fresh application state with defaults
27
+ */
28
+ export function createInitialState() {
29
+ return {
30
+ sessions: {},
31
+ tasks: {},
32
+ ralphLoop: {
33
+ status: 'stopped',
34
+ startedAt: null,
35
+ minDurationMs: null,
36
+ tasksCompleted: 0,
37
+ tasksGenerated: 0,
38
+ lastCheckAt: null,
39
+ },
40
+ config: { ...DEFAULT_CONFIG },
41
+ globalStats: createInitialGlobalStats(),
42
+ };
43
+ }
44
+ /**
45
+ * Creates initial global stats object
46
+ * @returns Fresh global stats with zero values
47
+ */
48
+ export function createInitialGlobalStats() {
49
+ const now = Date.now();
50
+ return {
51
+ totalInputTokens: 0,
52
+ totalOutputTokens: 0,
53
+ totalCost: 0,
54
+ totalSessionsCreated: 0,
55
+ firstRecordedAt: now,
56
+ lastUpdatedAt: now,
57
+ };
58
+ }
59
+ //# sourceMappingURL=app-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-state.js","sourceRoot":"","sources":["../../src/types/app-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8FH,8CAA8C;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,MAAM,EAAE,YAAY;IACtC,qBAAqB,EAAE,CAAC;IACxB,aAAa,EAAE,EAAE;IACjB,OAAO,EAAE;QACP,aAAa,EAAE,IAAI,EAAE,wCAAwC;QAC7D,YAAY,EAAE,mCAAmC;QACjD,gBAAgB,EAAE,IAAI,EAAE,yBAAyB;QACjD,OAAO,EAAE,KAAK,EAAE,sBAAsB;QACtC,SAAS,EAAE,IAAI,EAAE,kCAAkC;QACnD,QAAQ,EAAE,IAAI,EAAE,0BAA0B;KAC3C;IACD,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,SAAS,EAAE;YACT,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE;QAC7B,WAAW,EAAE,wBAAwB,EAAE;KACxC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,gBAAgB,EAAE,CAAC;QACnB,iBAAiB,EAAE,CAAC;QACpB,SAAS,EAAE,CAAC;QACZ,oBAAoB,EAAE,CAAC;QACvB,eAAe,EAAE,GAAG;QACpB,aAAa,EAAE,GAAG;KACnB,CAAC;AACJ,CAAC"}