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
@@ -0,0 +1,141 @@
1
+ /**
2
+ * @fileoverview RalphStatusParser - RALPH_STATUS block parsing and circuit breaker
3
+ *
4
+ * Parses structured RALPH_STATUS blocks from Claude Code output
5
+ * and manages the circuit breaker state machine.
6
+ *
7
+ * Extracted from ralph-tracker.ts as part of domain splitting.
8
+ *
9
+ * @module ralph-status-parser
10
+ */
11
+ import { EventEmitter } from 'node:events';
12
+ import type { RalphStatusBlock, CircuitBreakerStatus } from './types.js';
13
+ /**
14
+ * RalphStatusParser - Parses RALPH_STATUS blocks and manages circuit breaker.
15
+ *
16
+ * Events emitted:
17
+ * - `statusBlockDetected` - When a complete RALPH_STATUS block is parsed
18
+ * - `circuitBreakerUpdate` - When circuit breaker state changes
19
+ * - `exitGateMet` - When dual-condition exit gate is met
20
+ */
21
+ export declare class RalphStatusParser extends EventEmitter {
22
+ /** Circuit breaker state tracking */
23
+ private _circuitBreaker;
24
+ /** Buffer for RALPH_STATUS block lines */
25
+ private _statusBlockBuffer;
26
+ /** Flag indicating we're inside a RALPH_STATUS block */
27
+ private _inStatusBlock;
28
+ /** Last parsed RALPH_STATUS block */
29
+ private _lastStatusBlock;
30
+ /** Count of completion indicators detected (for dual-condition exit) */
31
+ private _completionIndicators;
32
+ /** Whether dual-condition exit gate has been met */
33
+ private _exitGateMet;
34
+ /** Cumulative files modified across all iterations */
35
+ private _totalFilesModified;
36
+ /** Cumulative tasks completed across all iterations */
37
+ private _totalTasksCompleted;
38
+ /** Current cycle count (fed by parent) */
39
+ private _cycleCount;
40
+ constructor();
41
+ /**
42
+ * Process a line for status block detection and completion indicators.
43
+ * Main entry point - call this for each trimmed line.
44
+ */
45
+ processLine(line: string): void;
46
+ /**
47
+ * Set the current cycle count (fed by parent for circuit breaker tracking).
48
+ */
49
+ setCycleCount(cycleCount: number): void;
50
+ /**
51
+ * Notify of iteration progress (for circuit breaker reset on progress).
52
+ * Called by parent when iteration count changes.
53
+ */
54
+ notifyIterationProgress(currentIteration: number): void;
55
+ /**
56
+ * Get current circuit breaker status.
57
+ */
58
+ get circuitBreakerStatus(): CircuitBreakerStatus;
59
+ /**
60
+ * Get last parsed RALPH_STATUS block.
61
+ */
62
+ get lastStatusBlock(): RalphStatusBlock | null;
63
+ /**
64
+ * Get cumulative stats from status blocks.
65
+ */
66
+ get cumulativeStats(): {
67
+ filesModified: number;
68
+ tasksCompleted: number;
69
+ completionIndicators: number;
70
+ };
71
+ /**
72
+ * Whether dual-condition exit gate has been met.
73
+ */
74
+ get exitGateMet(): boolean;
75
+ /**
76
+ * Manually reset circuit breaker to CLOSED state.
77
+ * Use when user acknowledges the issue is resolved.
78
+ *
79
+ * @fires circuitBreakerUpdate
80
+ */
81
+ resetCircuitBreaker(): void;
82
+ /**
83
+ * Reset status parser state (soft reset).
84
+ * Clears status block buffer and completion indicators.
85
+ * Keeps circuit breaker state (it tracks across iterations).
86
+ */
87
+ reset(): void;
88
+ /**
89
+ * Full reset - clears all state including circuit breaker.
90
+ */
91
+ fullReset(): void;
92
+ /**
93
+ * Clean up all resources.
94
+ */
95
+ destroy(): void;
96
+ /**
97
+ * Process a line for RALPH_STATUS block detection.
98
+ * Buffers lines between ---RALPH_STATUS--- and ---END_RALPH_STATUS---
99
+ * then parses the complete block.
100
+ *
101
+ * @param line - Single line to process (already trimmed)
102
+ * @fires statusBlockDetected - When a complete block is parsed
103
+ */
104
+ private processStatusBlockLine;
105
+ /**
106
+ * Parse buffered RALPH_STATUS block lines into structured data.
107
+ *
108
+ * P1-004: Enhanced with schema validation and error recovery
109
+ *
110
+ * @param lines - Array of lines between block markers
111
+ * @fires statusBlockDetected - When parsing succeeds
112
+ */
113
+ private parseStatusBlock;
114
+ /**
115
+ * Handle a parsed RALPH_STATUS block.
116
+ * Updates circuit breaker, checks exit conditions.
117
+ *
118
+ * @param block - Parsed status block
119
+ * @fires statusBlockDetected - With the block data
120
+ * @fires circuitBreakerUpdate - If state changes
121
+ * @fires exitGateMet - If dual-condition exit triggered
122
+ */
123
+ private handleStatusBlock;
124
+ /**
125
+ * Update circuit breaker state based on iteration results.
126
+ *
127
+ * @param hasProgress - Whether this iteration made progress
128
+ * @param testsStatus - Current test status
129
+ * @param status - Overall status from RALPH_STATUS
130
+ * @fires circuitBreakerUpdate - If state changes
131
+ */
132
+ private updateCircuitBreaker;
133
+ /**
134
+ * Check line for completion indicators (natural language patterns).
135
+ * Used for dual-condition exit gate.
136
+ *
137
+ * @param line - Line to check
138
+ */
139
+ private detectCompletionIndicators;
140
+ }
141
+ //# sourceMappingURL=ralph-status-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-status-parser.d.ts","sourceRoot":"","sources":["../src/ralph-status-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,gBAAgB,EAIhB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AA2EpB;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,qCAAqC;IACrC,OAAO,CAAC,eAAe,CAAuB;IAE9C,0CAA0C;IAC1C,OAAO,CAAC,kBAAkB,CAAgB;IAE1C,wDAAwD;IACxD,OAAO,CAAC,cAAc,CAAkB;IAExC,qCAAqC;IACrC,OAAO,CAAC,gBAAgB,CAAiC;IAEzD,wEAAwE;IACxE,OAAO,CAAC,qBAAqB,CAAa;IAE1C,oDAAoD;IACpD,OAAO,CAAC,YAAY,CAAkB;IAEtC,sDAAsD;IACtD,OAAO,CAAC,mBAAmB,CAAa;IAExC,uDAAuD;IACvD,OAAO,CAAC,oBAAoB,CAAa;IAEzC,0CAA0C;IAC1C,OAAO,CAAC,WAAW,CAAa;;IAOhC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC;;;OAGG;IACH,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAmBvD;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,CAE/C;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,gBAAgB,GAAG,IAAI,CAE7C;IAED;;OAEG;IACH,IAAI,eAAe,IAAI;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAMA;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;;;;OAKG;IACH,mBAAmB,IAAI,IAAI;IAO3B;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAqIxB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAgE5B;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;CAQnC"}
@@ -0,0 +1,478 @@
1
+ /**
2
+ * @fileoverview RalphStatusParser - RALPH_STATUS block parsing and circuit breaker
3
+ *
4
+ * Parses structured RALPH_STATUS blocks from Claude Code output
5
+ * and manages the circuit breaker state machine.
6
+ *
7
+ * Extracted from ralph-tracker.ts as part of domain splitting.
8
+ *
9
+ * @module ralph-status-parser
10
+ */
11
+ import { EventEmitter } from 'node:events';
12
+ import { createInitialCircuitBreakerStatus } from './types.js';
13
+ // ---------- RALPH_STATUS Block Patterns ----------
14
+ // Based on Ralph Claude Code structured status reporting
15
+ /**
16
+ * Matches the start of a RALPH_STATUS block
17
+ * Pattern: ---RALPH_STATUS---
18
+ */
19
+ const RALPH_STATUS_START_PATTERN = /^---RALPH_STATUS---\s*$/;
20
+ /**
21
+ * Matches the end of a RALPH_STATUS block
22
+ * Pattern: ---END_RALPH_STATUS---
23
+ */
24
+ const RALPH_STATUS_END_PATTERN = /^---END_RALPH_STATUS---\s*$/;
25
+ /**
26
+ * Matches STATUS field in RALPH_STATUS block
27
+ * Captures: IN_PROGRESS | COMPLETE | BLOCKED
28
+ */
29
+ const RALPH_STATUS_FIELD_PATTERN = /^STATUS:\s*(IN_PROGRESS|COMPLETE|BLOCKED)\s*$/i;
30
+ /**
31
+ * Matches TASKS_COMPLETED_THIS_LOOP field
32
+ * Captures: number
33
+ */
34
+ const RALPH_TASKS_COMPLETED_PATTERN = /^TASKS_COMPLETED_THIS_LOOP:\s*(\d+)\s*$/i;
35
+ /**
36
+ * Matches FILES_MODIFIED field
37
+ * Captures: number
38
+ */
39
+ const RALPH_FILES_MODIFIED_PATTERN = /^FILES_MODIFIED:\s*(\d+)\s*$/i;
40
+ /**
41
+ * Matches TESTS_STATUS field
42
+ * Captures: PASSING | FAILING | NOT_RUN
43
+ */
44
+ const RALPH_TESTS_STATUS_PATTERN = /^TESTS_STATUS:\s*(PASSING|FAILING|NOT_RUN)\s*$/i;
45
+ /**
46
+ * Matches WORK_TYPE field
47
+ * Captures: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING
48
+ */
49
+ const RALPH_WORK_TYPE_PATTERN = /^WORK_TYPE:\s*(IMPLEMENTATION|TESTING|DOCUMENTATION|REFACTORING)\s*$/i;
50
+ /**
51
+ * Matches EXIT_SIGNAL field
52
+ * Captures: true | false
53
+ */
54
+ const RALPH_EXIT_SIGNAL_PATTERN = /^EXIT_SIGNAL:\s*(true|false)\s*$/i;
55
+ /**
56
+ * Matches RECOMMENDATION field
57
+ * Captures: any text
58
+ */
59
+ const RALPH_RECOMMENDATION_PATTERN = /^RECOMMENDATION:\s*(.+)$/i;
60
+ // ---------- Completion Indicator Patterns (for dual-condition exit) ----------
61
+ /**
62
+ * Patterns that indicate potential completion (natural language)
63
+ * Count >= 2 along with EXIT_SIGNAL: true triggers exit
64
+ */
65
+ const COMPLETION_INDICATOR_PATTERNS = [
66
+ /all\s+(?:tasks?|items?|work)\s+(?:are\s+)?(?:completed?|done|finished)/i,
67
+ /(?:completed?|finished)\s+all\s+(?:tasks?|items?|work)/i,
68
+ /nothing\s+(?:left|remaining)\s+to\s+do/i,
69
+ /no\s+more\s+(?:tasks?|items?|work)/i,
70
+ /everything\s+(?:is\s+)?(?:completed?|done)/i,
71
+ /project\s+(?:is\s+)?(?:completed?|done|finished)/i,
72
+ ];
73
+ /**
74
+ * RalphStatusParser - Parses RALPH_STATUS blocks and manages circuit breaker.
75
+ *
76
+ * Events emitted:
77
+ * - `statusBlockDetected` - When a complete RALPH_STATUS block is parsed
78
+ * - `circuitBreakerUpdate` - When circuit breaker state changes
79
+ * - `exitGateMet` - When dual-condition exit gate is met
80
+ */
81
+ export class RalphStatusParser extends EventEmitter {
82
+ /** Circuit breaker state tracking */
83
+ _circuitBreaker;
84
+ /** Buffer for RALPH_STATUS block lines */
85
+ _statusBlockBuffer = [];
86
+ /** Flag indicating we're inside a RALPH_STATUS block */
87
+ _inStatusBlock = false;
88
+ /** Last parsed RALPH_STATUS block */
89
+ _lastStatusBlock = null;
90
+ /** Count of completion indicators detected (for dual-condition exit) */
91
+ _completionIndicators = 0;
92
+ /** Whether dual-condition exit gate has been met */
93
+ _exitGateMet = false;
94
+ /** Cumulative files modified across all iterations */
95
+ _totalFilesModified = 0;
96
+ /** Cumulative tasks completed across all iterations */
97
+ _totalTasksCompleted = 0;
98
+ /** Current cycle count (fed by parent) */
99
+ _cycleCount = 0;
100
+ constructor() {
101
+ super();
102
+ this._circuitBreaker = createInitialCircuitBreakerStatus();
103
+ }
104
+ /**
105
+ * Process a line for status block detection and completion indicators.
106
+ * Main entry point - call this for each trimmed line.
107
+ */
108
+ processLine(line) {
109
+ this.processStatusBlockLine(line);
110
+ this.detectCompletionIndicators(line);
111
+ }
112
+ /**
113
+ * Set the current cycle count (fed by parent for circuit breaker tracking).
114
+ */
115
+ setCycleCount(cycleCount) {
116
+ this._cycleCount = cycleCount;
117
+ }
118
+ /**
119
+ * Notify of iteration progress (for circuit breaker reset on progress).
120
+ * Called by parent when iteration count changes.
121
+ */
122
+ notifyIterationProgress(currentIteration) {
123
+ if (this._circuitBreaker.state === 'HALF_OPEN' ||
124
+ this._circuitBreaker.consecutiveNoProgress > 0 ||
125
+ this._circuitBreaker.consecutiveSameError > 0 ||
126
+ this._circuitBreaker.consecutiveTestsFailure > 0) {
127
+ this._circuitBreaker.consecutiveNoProgress = 0;
128
+ this._circuitBreaker.consecutiveSameError = 0;
129
+ this._circuitBreaker.lastProgressIteration = currentIteration;
130
+ if (this._circuitBreaker.state === 'HALF_OPEN') {
131
+ this._circuitBreaker.state = 'CLOSED';
132
+ this._circuitBreaker.reason = 'Iteration progress detected';
133
+ this._circuitBreaker.reasonCode = 'progress_detected';
134
+ this.emit('circuitBreakerUpdate', { ...this._circuitBreaker });
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Get current circuit breaker status.
140
+ */
141
+ get circuitBreakerStatus() {
142
+ return { ...this._circuitBreaker };
143
+ }
144
+ /**
145
+ * Get last parsed RALPH_STATUS block.
146
+ */
147
+ get lastStatusBlock() {
148
+ return this._lastStatusBlock ? { ...this._lastStatusBlock } : null;
149
+ }
150
+ /**
151
+ * Get cumulative stats from status blocks.
152
+ */
153
+ get cumulativeStats() {
154
+ return {
155
+ filesModified: this._totalFilesModified,
156
+ tasksCompleted: this._totalTasksCompleted,
157
+ completionIndicators: this._completionIndicators,
158
+ };
159
+ }
160
+ /**
161
+ * Whether dual-condition exit gate has been met.
162
+ */
163
+ get exitGateMet() {
164
+ return this._exitGateMet;
165
+ }
166
+ /**
167
+ * Manually reset circuit breaker to CLOSED state.
168
+ * Use when user acknowledges the issue is resolved.
169
+ *
170
+ * @fires circuitBreakerUpdate
171
+ */
172
+ resetCircuitBreaker() {
173
+ this._circuitBreaker = createInitialCircuitBreakerStatus();
174
+ this._circuitBreaker.reason = 'Manual reset';
175
+ this._circuitBreaker.reasonCode = 'manual_reset';
176
+ this.emit('circuitBreakerUpdate', { ...this._circuitBreaker });
177
+ }
178
+ /**
179
+ * Reset status parser state (soft reset).
180
+ * Clears status block buffer and completion indicators.
181
+ * Keeps circuit breaker state (it tracks across iterations).
182
+ */
183
+ reset() {
184
+ this._statusBlockBuffer = [];
185
+ this._inStatusBlock = false;
186
+ this._lastStatusBlock = null;
187
+ this._completionIndicators = 0;
188
+ this._exitGateMet = false;
189
+ this._totalFilesModified = 0;
190
+ this._totalTasksCompleted = 0;
191
+ // Keep circuit breaker state on soft reset (it tracks across iterations)
192
+ }
193
+ /**
194
+ * Full reset - clears all state including circuit breaker.
195
+ */
196
+ fullReset() {
197
+ this.reset();
198
+ this._circuitBreaker = createInitialCircuitBreakerStatus();
199
+ }
200
+ /**
201
+ * Clean up all resources.
202
+ */
203
+ destroy() {
204
+ this._statusBlockBuffer.length = 0;
205
+ this.removeAllListeners();
206
+ }
207
+ // ========== Private Methods ==========
208
+ /**
209
+ * Process a line for RALPH_STATUS block detection.
210
+ * Buffers lines between ---RALPH_STATUS--- and ---END_RALPH_STATUS---
211
+ * then parses the complete block.
212
+ *
213
+ * @param line - Single line to process (already trimmed)
214
+ * @fires statusBlockDetected - When a complete block is parsed
215
+ */
216
+ processStatusBlockLine(line) {
217
+ // Check for block start
218
+ if (RALPH_STATUS_START_PATTERN.test(line)) {
219
+ this._inStatusBlock = true;
220
+ this._statusBlockBuffer = [];
221
+ return;
222
+ }
223
+ // Check for block end
224
+ if (this._inStatusBlock && RALPH_STATUS_END_PATTERN.test(line)) {
225
+ this._inStatusBlock = false;
226
+ this.parseStatusBlock(this._statusBlockBuffer);
227
+ this._statusBlockBuffer = [];
228
+ return;
229
+ }
230
+ // Buffer lines while in block
231
+ if (this._inStatusBlock) {
232
+ this._statusBlockBuffer.push(line);
233
+ }
234
+ }
235
+ /**
236
+ * Parse buffered RALPH_STATUS block lines into structured data.
237
+ *
238
+ * P1-004: Enhanced with schema validation and error recovery
239
+ *
240
+ * @param lines - Array of lines between block markers
241
+ * @fires statusBlockDetected - When parsing succeeds
242
+ */
243
+ parseStatusBlock(lines) {
244
+ const block = {
245
+ parsedAt: Date.now(),
246
+ };
247
+ const parseErrors = [];
248
+ const unknownFields = [];
249
+ for (const line of lines) {
250
+ const trimmedLine = line.trim();
251
+ if (!trimmedLine)
252
+ continue;
253
+ // Track whether this line matched any known field
254
+ let matched = false;
255
+ // STATUS field (required)
256
+ const statusMatch = trimmedLine.match(RALPH_STATUS_FIELD_PATTERN);
257
+ if (statusMatch) {
258
+ const value = statusMatch[1].toUpperCase();
259
+ if (['IN_PROGRESS', 'COMPLETE', 'BLOCKED'].includes(value)) {
260
+ block.status = value;
261
+ }
262
+ else {
263
+ parseErrors.push(`Invalid STATUS value: "${value}". Expected: IN_PROGRESS, COMPLETE, or BLOCKED`);
264
+ }
265
+ matched = true;
266
+ }
267
+ // TASKS_COMPLETED_THIS_LOOP field
268
+ const tasksMatch = trimmedLine.match(RALPH_TASKS_COMPLETED_PATTERN);
269
+ if (tasksMatch) {
270
+ const value = parseInt(tasksMatch[1], 10);
271
+ if (!Number.isNaN(value) && value >= 0) {
272
+ block.tasksCompletedThisLoop = value;
273
+ }
274
+ else {
275
+ parseErrors.push(`Invalid TASKS_COMPLETED_THIS_LOOP value: "${tasksMatch[1]}". Expected: non-negative integer`);
276
+ }
277
+ matched = true;
278
+ }
279
+ // FILES_MODIFIED field
280
+ const filesMatch = trimmedLine.match(RALPH_FILES_MODIFIED_PATTERN);
281
+ if (filesMatch) {
282
+ const value = parseInt(filesMatch[1], 10);
283
+ if (!Number.isNaN(value) && value >= 0) {
284
+ block.filesModified = value;
285
+ }
286
+ else {
287
+ parseErrors.push(`Invalid FILES_MODIFIED value: "${filesMatch[1]}". Expected: non-negative integer`);
288
+ }
289
+ matched = true;
290
+ }
291
+ // TESTS_STATUS field
292
+ const testsMatch = trimmedLine.match(RALPH_TESTS_STATUS_PATTERN);
293
+ if (testsMatch) {
294
+ const value = testsMatch[1].toUpperCase();
295
+ if (['PASSING', 'FAILING', 'NOT_RUN'].includes(value)) {
296
+ block.testsStatus = value;
297
+ }
298
+ else {
299
+ parseErrors.push(`Invalid TESTS_STATUS value: "${value}". Expected: PASSING, FAILING, or NOT_RUN`);
300
+ }
301
+ matched = true;
302
+ }
303
+ // WORK_TYPE field
304
+ const workMatch = trimmedLine.match(RALPH_WORK_TYPE_PATTERN);
305
+ if (workMatch) {
306
+ const value = workMatch[1].toUpperCase();
307
+ if (['IMPLEMENTATION', 'TESTING', 'DOCUMENTATION', 'REFACTORING'].includes(value)) {
308
+ block.workType = value;
309
+ }
310
+ else {
311
+ parseErrors.push(`Invalid WORK_TYPE value: "${value}". Expected: IMPLEMENTATION, TESTING, DOCUMENTATION, or REFACTORING`);
312
+ }
313
+ matched = true;
314
+ }
315
+ // EXIT_SIGNAL field
316
+ const exitMatch = trimmedLine.match(RALPH_EXIT_SIGNAL_PATTERN);
317
+ if (exitMatch) {
318
+ block.exitSignal = exitMatch[1].toLowerCase() === 'true';
319
+ matched = true;
320
+ }
321
+ // RECOMMENDATION field
322
+ const recMatch = trimmedLine.match(RALPH_RECOMMENDATION_PATTERN);
323
+ if (recMatch) {
324
+ block.recommendation = recMatch[1].trim();
325
+ matched = true;
326
+ }
327
+ // Track unknown fields for debugging (only if looks like a field)
328
+ if (!matched && trimmedLine.includes(':')) {
329
+ const fieldName = trimmedLine.split(':')[0].trim().toUpperCase();
330
+ if (fieldName && !['#', '//'].some((c) => fieldName.startsWith(c))) {
331
+ unknownFields.push(fieldName);
332
+ }
333
+ }
334
+ }
335
+ // Log parse errors if any
336
+ if (parseErrors.length > 0) {
337
+ console.warn(`[RalphStatusParser] RALPH_STATUS parse errors:\n - ${parseErrors.join('\n - ')}`);
338
+ }
339
+ // Log unknown fields if any
340
+ if (unknownFields.length > 0) {
341
+ console.warn(`[RalphStatusParser] RALPH_STATUS unknown fields: ${unknownFields.join(', ')}`);
342
+ }
343
+ // Validate required field: STATUS
344
+ if (block.status === undefined) {
345
+ console.warn('[RalphStatusParser] RALPH_STATUS block missing required STATUS field, skipping');
346
+ return;
347
+ }
348
+ // Fill in defaults for missing optional fields
349
+ const fullBlock = {
350
+ status: block.status,
351
+ tasksCompletedThisLoop: block.tasksCompletedThisLoop ?? 0,
352
+ filesModified: block.filesModified ?? 0,
353
+ testsStatus: block.testsStatus ?? 'NOT_RUN',
354
+ workType: block.workType ?? 'IMPLEMENTATION',
355
+ exitSignal: block.exitSignal ?? false,
356
+ recommendation: block.recommendation ?? '',
357
+ parsedAt: block.parsedAt,
358
+ };
359
+ this._lastStatusBlock = fullBlock;
360
+ this.handleStatusBlock(fullBlock);
361
+ }
362
+ /**
363
+ * Handle a parsed RALPH_STATUS block.
364
+ * Updates circuit breaker, checks exit conditions.
365
+ *
366
+ * @param block - Parsed status block
367
+ * @fires statusBlockDetected - With the block data
368
+ * @fires circuitBreakerUpdate - If state changes
369
+ * @fires exitGateMet - If dual-condition exit triggered
370
+ */
371
+ handleStatusBlock(block) {
372
+ // Update cumulative counts
373
+ this._totalFilesModified += block.filesModified;
374
+ this._totalTasksCompleted += block.tasksCompletedThisLoop;
375
+ // Check for progress (for circuit breaker)
376
+ const hasProgress = block.filesModified > 0 || block.tasksCompletedThisLoop > 0;
377
+ // Update circuit breaker
378
+ this.updateCircuitBreaker(hasProgress, block.testsStatus, block.status);
379
+ // Check completion indicators
380
+ if (block.status === 'COMPLETE') {
381
+ this._completionIndicators++;
382
+ }
383
+ // Check dual-condition exit gate
384
+ if (block.exitSignal && this._completionIndicators >= 2 && !this._exitGateMet) {
385
+ this._exitGateMet = true;
386
+ this.emit('exitGateMet', {
387
+ completionIndicators: this._completionIndicators,
388
+ exitSignal: true,
389
+ });
390
+ }
391
+ // Emit the status block
392
+ this.emit('statusBlockDetected', block);
393
+ }
394
+ /**
395
+ * Update circuit breaker state based on iteration results.
396
+ *
397
+ * @param hasProgress - Whether this iteration made progress
398
+ * @param testsStatus - Current test status
399
+ * @param status - Overall status from RALPH_STATUS
400
+ * @fires circuitBreakerUpdate - If state changes
401
+ */
402
+ updateCircuitBreaker(hasProgress, testsStatus, status) {
403
+ const prevState = this._circuitBreaker.state;
404
+ if (hasProgress) {
405
+ // Progress detected - reset counters, possibly close circuit
406
+ this._circuitBreaker.consecutiveNoProgress = 0;
407
+ this._circuitBreaker.consecutiveSameError = 0;
408
+ this._circuitBreaker.lastProgressIteration = this._cycleCount;
409
+ if (this._circuitBreaker.state === 'HALF_OPEN') {
410
+ this._circuitBreaker.state = 'CLOSED';
411
+ this._circuitBreaker.reason = 'Progress detected, circuit closed';
412
+ this._circuitBreaker.reasonCode = 'progress_detected';
413
+ }
414
+ }
415
+ else {
416
+ // No progress
417
+ this._circuitBreaker.consecutiveNoProgress++;
418
+ // State transitions based on consecutive no-progress
419
+ if (this._circuitBreaker.state === 'CLOSED') {
420
+ if (this._circuitBreaker.consecutiveNoProgress >= 3) {
421
+ this._circuitBreaker.state = 'OPEN';
422
+ this._circuitBreaker.reason = `No progress for ${this._circuitBreaker.consecutiveNoProgress} iterations`;
423
+ this._circuitBreaker.reasonCode = 'no_progress_open';
424
+ }
425
+ else if (this._circuitBreaker.consecutiveNoProgress >= 2) {
426
+ this._circuitBreaker.state = 'HALF_OPEN';
427
+ this._circuitBreaker.reason = 'Warning: no progress detected';
428
+ this._circuitBreaker.reasonCode = 'no_progress_warning';
429
+ }
430
+ }
431
+ else if (this._circuitBreaker.state === 'HALF_OPEN') {
432
+ if (this._circuitBreaker.consecutiveNoProgress >= 3) {
433
+ this._circuitBreaker.state = 'OPEN';
434
+ this._circuitBreaker.reason = `No progress for ${this._circuitBreaker.consecutiveNoProgress} iterations`;
435
+ this._circuitBreaker.reasonCode = 'no_progress_open';
436
+ }
437
+ }
438
+ }
439
+ // Track tests failure
440
+ if (testsStatus === 'FAILING') {
441
+ this._circuitBreaker.consecutiveTestsFailure++;
442
+ if (this._circuitBreaker.consecutiveTestsFailure >= 5 && this._circuitBreaker.state !== 'OPEN') {
443
+ this._circuitBreaker.state = 'OPEN';
444
+ this._circuitBreaker.reason = `Tests failing for ${this._circuitBreaker.consecutiveTestsFailure} iterations`;
445
+ this._circuitBreaker.reasonCode = 'tests_failing_too_long';
446
+ }
447
+ }
448
+ else {
449
+ this._circuitBreaker.consecutiveTestsFailure = 0;
450
+ }
451
+ // Track blocked status
452
+ if (status === 'BLOCKED' && this._circuitBreaker.state !== 'OPEN') {
453
+ this._circuitBreaker.state = 'OPEN';
454
+ this._circuitBreaker.reason = 'Claude reported BLOCKED status';
455
+ this._circuitBreaker.reasonCode = 'same_error_repeated';
456
+ }
457
+ // Emit if state changed
458
+ if (prevState !== this._circuitBreaker.state) {
459
+ this._circuitBreaker.lastTransitionAt = Date.now();
460
+ this.emit('circuitBreakerUpdate', { ...this._circuitBreaker });
461
+ }
462
+ }
463
+ /**
464
+ * Check line for completion indicators (natural language patterns).
465
+ * Used for dual-condition exit gate.
466
+ *
467
+ * @param line - Line to check
468
+ */
469
+ detectCompletionIndicators(line) {
470
+ for (const pattern of COMPLETION_INDICATOR_PATTERNS) {
471
+ if (pattern.test(line)) {
472
+ this._completionIndicators++;
473
+ break; // Only count once per line
474
+ }
475
+ }
476
+ }
477
+ }
478
+ //# sourceMappingURL=ralph-status-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-status-parser.js","sourceRoot":"","sources":["../src/ralph-status-parser.ts"],"names":[],"mappings":"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"}