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.
- package/README.md +118 -4
- package/dist/ai-idle-checker.d.ts.map +1 -1
- package/dist/ai-idle-checker.js +3 -2
- package/dist/ai-idle-checker.js.map +1 -1
- package/dist/ai-plan-checker.d.ts.map +1 -1
- package/dist/ai-plan-checker.js +3 -2
- package/dist/ai-plan-checker.js.map +1 -1
- package/dist/bash-tool-parser.d.ts +2 -3
- package/dist/bash-tool-parser.d.ts.map +1 -1
- package/dist/bash-tool-parser.js +14 -31
- package/dist/bash-tool-parser.js.map +1 -1
- package/dist/config/ai-defaults.d.ts +16 -0
- package/dist/config/ai-defaults.d.ts.map +1 -0
- package/dist/config/ai-defaults.js +16 -0
- package/dist/config/ai-defaults.js.map +1 -0
- package/dist/config/auth-config.d.ts +19 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +28 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/exec-timeout.d.ts +10 -0
- package/dist/config/exec-timeout.d.ts.map +1 -0
- package/dist/config/exec-timeout.js +10 -0
- package/dist/config/exec-timeout.js.map +1 -0
- package/dist/config/map-limits.d.ts +4 -0
- package/dist/config/map-limits.d.ts.map +1 -1
- package/dist/config/map-limits.js +7 -0
- package/dist/config/map-limits.js.map +1 -1
- package/dist/config/server-timing.d.ts +42 -0
- package/dist/config/server-timing.d.ts.map +1 -0
- package/dist/config/server-timing.js +57 -0
- package/dist/config/server-timing.js.map +1 -0
- package/dist/config/team-config.d.ts +16 -0
- package/dist/config/team-config.d.ts.map +1 -0
- package/dist/config/team-config.js +16 -0
- package/dist/config/team-config.js.map +1 -0
- package/dist/config/terminal-limits.d.ts +18 -0
- package/dist/config/terminal-limits.d.ts.map +1 -0
- package/dist/config/terminal-limits.js +18 -0
- package/dist/config/terminal-limits.js.map +1 -0
- package/dist/config/tunnel-config.d.ts +27 -0
- package/dist/config/tunnel-config.d.ts.map +1 -0
- package/dist/config/tunnel-config.js +36 -0
- package/dist/config/tunnel-config.js.map +1 -0
- package/dist/hooks-config.d.ts +21 -6
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +28 -12
- package/dist/hooks-config.js.map +1 -1
- package/dist/image-watcher.d.ts +4 -4
- package/dist/image-watcher.d.ts.map +1 -1
- package/dist/image-watcher.js +17 -30
- package/dist/image-watcher.js.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/plan-orchestrator.d.ts +2 -24
- package/dist/plan-orchestrator.d.ts.map +1 -1
- package/dist/plan-orchestrator.js.map +1 -1
- package/dist/prompts/planner.d.ts +7 -8
- package/dist/prompts/planner.d.ts.map +1 -1
- package/dist/prompts/planner.js +7 -8
- package/dist/prompts/planner.js.map +1 -1
- package/dist/prompts/research-agent.d.ts +6 -4
- package/dist/prompts/research-agent.d.ts.map +1 -1
- package/dist/prompts/research-agent.js +6 -4
- package/dist/prompts/research-agent.js.map +1 -1
- package/dist/push-store.d.ts +1 -1
- package/dist/push-store.d.ts.map +1 -1
- package/dist/push-store.js +4 -12
- package/dist/push-store.js.map +1 -1
- package/dist/ralph-fix-plan-watcher.d.ts +91 -0
- package/dist/ralph-fix-plan-watcher.d.ts.map +1 -0
- package/dist/ralph-fix-plan-watcher.js +326 -0
- package/dist/ralph-fix-plan-watcher.js.map +1 -0
- package/dist/ralph-loop.d.ts +14 -4
- package/dist/ralph-loop.d.ts.map +1 -1
- package/dist/ralph-loop.js +14 -4
- package/dist/ralph-loop.js.map +1 -1
- package/dist/ralph-plan-tracker.d.ts +201 -0
- package/dist/ralph-plan-tracker.d.ts.map +1 -0
- package/dist/ralph-plan-tracker.js +325 -0
- package/dist/ralph-plan-tracker.js.map +1 -0
- package/dist/ralph-stall-detector.d.ts +84 -0
- package/dist/ralph-stall-detector.d.ts.map +1 -0
- package/dist/ralph-stall-detector.js +139 -0
- package/dist/ralph-stall-detector.js.map +1 -0
- package/dist/ralph-status-parser.d.ts +141 -0
- package/dist/ralph-status-parser.d.ts.map +1 -0
- package/dist/ralph-status-parser.js +478 -0
- package/dist/ralph-status-parser.js.map +1 -0
- package/dist/ralph-tracker.d.ts +218 -692
- package/dist/ralph-tracker.d.ts.map +1 -1
- package/dist/ralph-tracker.js +389 -1723
- package/dist/ralph-tracker.js.map +1 -1
- package/dist/respawn-adaptive-timing.d.ts +61 -0
- package/dist/respawn-adaptive-timing.d.ts.map +1 -0
- package/dist/respawn-adaptive-timing.js +105 -0
- package/dist/respawn-adaptive-timing.js.map +1 -0
- package/dist/respawn-controller.d.ts +35 -115
- package/dist/respawn-controller.d.ts.map +1 -1
- package/dist/respawn-controller.js +167 -607
- package/dist/respawn-controller.js.map +1 -1
- package/dist/respawn-health.d.ts +54 -0
- package/dist/respawn-health.d.ts.map +1 -0
- package/dist/respawn-health.js +183 -0
- package/dist/respawn-health.js.map +1 -0
- package/dist/respawn-metrics.d.ts +81 -0
- package/dist/respawn-metrics.d.ts.map +1 -0
- package/dist/respawn-metrics.js +198 -0
- package/dist/respawn-metrics.js.map +1 -0
- package/dist/respawn-patterns.d.ts +45 -0
- package/dist/respawn-patterns.d.ts.map +1 -0
- package/dist/respawn-patterns.js +125 -0
- package/dist/respawn-patterns.js.map +1 -0
- package/dist/session-auto-ops.d.ts +89 -0
- package/dist/session-auto-ops.d.ts.map +1 -0
- package/dist/session-auto-ops.js +224 -0
- package/dist/session-auto-ops.js.map +1 -0
- package/dist/session-cli-builder.d.ts +62 -0
- package/dist/session-cli-builder.d.ts.map +1 -0
- package/dist/session-cli-builder.js +121 -0
- package/dist/session-cli-builder.js.map +1 -0
- package/dist/session-manager.d.ts +17 -5
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +17 -5
- package/dist/session-manager.js.map +1 -1
- package/dist/session-task-cache.d.ts +52 -0
- package/dist/session-task-cache.d.ts.map +1 -0
- package/dist/session-task-cache.js +90 -0
- package/dist/session-task-cache.js.map +1 -0
- package/dist/session.d.ts +23 -41
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +79 -317
- package/dist/session.js.map +1 -1
- package/dist/state-store.d.ts +19 -9
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +29 -30
- package/dist/state-store.js.map +1 -1
- package/dist/subagent-watcher.d.ts +26 -7
- package/dist/subagent-watcher.d.ts.map +1 -1
- package/dist/subagent-watcher.js +47 -64
- package/dist/subagent-watcher.js.map +1 -1
- package/dist/team-watcher.d.ts.map +1 -1
- package/dist/team-watcher.js +2 -5
- package/dist/team-watcher.js.map +1 -1
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +1 -2
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tunnel-manager.d.ts +26 -0
- package/dist/tunnel-manager.d.ts.map +1 -1
- package/dist/tunnel-manager.js +126 -7
- package/dist/tunnel-manager.js.map +1 -1
- package/dist/types/api.d.ts +108 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +98 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/app-state.d.ts +117 -0
- package/dist/types/app-state.d.ts.map +1 -0
- package/dist/types/app-state.js +76 -0
- package/dist/types/app-state.js.map +1 -0
- package/dist/types/common.d.ts +79 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +17 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +66 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +66 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lifecycle.d.ts +28 -0
- package/dist/types/lifecycle.d.ts.map +1 -0
- package/dist/types/lifecycle.js +16 -0
- package/dist/types/lifecycle.js.map +1 -0
- package/dist/types/plan.d.ts +45 -0
- package/dist/types/plan.d.ts.map +1 -0
- package/dist/types/plan.js +18 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/push.d.ts +36 -0
- package/dist/types/push.d.ts.map +1 -0
- package/dist/types/push.js +18 -0
- package/dist/types/push.js.map +1 -0
- package/dist/types/ralph.d.ts +262 -0
- package/dist/types/ralph.d.ts.map +1 -0
- package/dist/types/ralph.js +70 -0
- package/dist/types/ralph.js.map +1 -0
- package/dist/types/respawn.d.ts +271 -0
- package/dist/types/respawn.d.ts.map +1 -0
- package/dist/types/respawn.js +26 -0
- package/dist/types/respawn.js.map +1 -0
- package/dist/types/run-summary.d.ts +96 -0
- package/dist/types/run-summary.d.ts.map +1 -0
- package/dist/types/run-summary.js +37 -0
- package/dist/types/run-summary.js.map +1 -0
- package/dist/types/session.d.ts +152 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +27 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/task.d.ts +72 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +19 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/teams.d.ts +73 -0
- package/dist/types/teams.d.ts.map +1 -0
- package/dist/types/teams.js +23 -0
- package/dist/types/teams.js.map +1 -0
- package/dist/types/tools.d.ts +61 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +20 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types.d.ts +8 -1134
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -210
- package/dist/types.js.map +1 -1
- package/dist/utils/claude-cli-resolver.d.ts.map +1 -1
- package/dist/utils/claude-cli-resolver.js +1 -2
- package/dist/utils/claude-cli-resolver.js.map +1 -1
- package/dist/utils/debouncer.d.ts +111 -0
- package/dist/utils/debouncer.d.ts.map +1 -0
- package/dist/utils/debouncer.js +162 -0
- package/dist/utils/debouncer.js.map +1 -0
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/opencode-cli-resolver.d.ts.map +1 -1
- package/dist/utils/opencode-cli-resolver.js +1 -2
- package/dist/utils/opencode-cli-resolver.js.map +1 -1
- package/dist/utils/string-similarity.d.ts +0 -57
- package/dist/utils/string-similarity.d.ts.map +1 -1
- package/dist/utils/string-similarity.js +3 -18
- package/dist/utils/string-similarity.js.map +1 -1
- package/dist/web/middleware/auth.d.ts +31 -0
- package/dist/web/middleware/auth.d.ts.map +1 -0
- package/dist/web/middleware/auth.js +154 -0
- package/dist/web/middleware/auth.js.map +1 -0
- package/dist/web/ports/auth-port.d.ts +18 -0
- package/dist/web/ports/auth-port.d.ts.map +1 -0
- package/dist/web/ports/auth-port.js +6 -0
- package/dist/web/ports/auth-port.js.map +1 -0
- package/dist/web/ports/config-port.d.ts +28 -0
- package/dist/web/ports/config-port.d.ts.map +1 -0
- package/dist/web/ports/config-port.js +6 -0
- package/dist/web/ports/config-port.js.map +1 -0
- package/dist/web/ports/event-port.d.ts +13 -0
- package/dist/web/ports/event-port.d.ts.map +1 -0
- package/dist/web/ports/event-port.js +6 -0
- package/dist/web/ports/event-port.js.map +1 -0
- package/dist/web/ports/index.d.ts +14 -0
- package/dist/web/ports/index.d.ts.map +1 -0
- package/dist/web/ports/index.js +9 -0
- package/dist/web/ports/index.js.map +1 -0
- package/dist/web/ports/infra-port.d.ts +36 -0
- package/dist/web/ports/infra-port.d.ts.map +1 -0
- package/dist/web/ports/infra-port.js +6 -0
- package/dist/web/ports/infra-port.js.map +1 -0
- package/dist/web/ports/respawn-port.d.ts +20 -0
- package/dist/web/ports/respawn-port.d.ts.map +1 -0
- package/dist/web/ports/respawn-port.js +6 -0
- package/dist/web/ports/respawn-port.js.map +1 -0
- package/dist/web/ports/session-port.d.ts +15 -0
- package/dist/web/ports/session-port.d.ts.map +1 -0
- package/dist/web/ports/session-port.js +6 -0
- package/dist/web/ports/session-port.js.map +1 -0
- package/dist/web/public/api-client.js +82 -0
- package/dist/web/public/api-client.js.br +0 -0
- package/dist/web/public/api-client.js.gz +0 -0
- package/dist/web/public/app.js +117 -201
- package/dist/web/public/app.js.br +0 -0
- package/dist/web/public/app.js.gz +0 -0
- package/dist/web/public/constants.js +365 -0
- package/dist/web/public/constants.js.br +0 -0
- package/dist/web/public/constants.js.gz +0 -0
- package/dist/web/public/index.html +15 -3
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/keyboard-accessory.js +302 -0
- package/dist/web/public/keyboard-accessory.js.br +0 -0
- package/dist/web/public/keyboard-accessory.js.gz +0 -0
- package/dist/web/public/mobile-handlers.js +491 -0
- package/dist/web/public/mobile-handlers.js.br +0 -0
- package/dist/web/public/mobile-handlers.js.gz +0 -0
- package/dist/web/public/mobile.css.gz +0 -0
- package/dist/web/public/notification-manager.js +472 -0
- package/dist/web/public/notification-manager.js.br +0 -0
- package/dist/web/public/notification-manager.js.gz +0 -0
- package/dist/web/public/ralph-wizard.js +33 -9
- package/dist/web/public/ralph-wizard.js.br +0 -0
- package/dist/web/public/ralph-wizard.js.gz +0 -0
- package/dist/web/public/styles.css.gz +0 -0
- package/dist/web/public/subagent-windows.js +1149 -0
- package/dist/web/public/subagent-windows.js.br +0 -0
- package/dist/web/public/subagent-windows.js.gz +0 -0
- package/dist/web/public/sw.js +15 -0
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.js +4 -0
- package/dist/web/public/vendor/xterm-zerolag-input.js.br +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.js +882 -0
- package/dist/web/public/voice-input.js.br +0 -0
- package/dist/web/public/voice-input.js.gz +0 -0
- package/dist/web/route-helpers.d.ts +38 -0
- package/dist/web/route-helpers.d.ts.map +1 -0
- package/dist/web/route-helpers.js +144 -0
- package/dist/web/route-helpers.js.map +1 -0
- package/dist/web/routes/case-routes.d.ts +9 -0
- package/dist/web/routes/case-routes.d.ts.map +1 -0
- package/dist/web/routes/case-routes.js +426 -0
- package/dist/web/routes/case-routes.js.map +1 -0
- package/dist/web/routes/file-routes.d.ts +8 -0
- package/dist/web/routes/file-routes.d.ts.map +1 -0
- package/dist/web/routes/file-routes.js +337 -0
- package/dist/web/routes/file-routes.js.map +1 -0
- package/dist/web/routes/hook-event-routes.d.ts +9 -0
- package/dist/web/routes/hook-event-routes.d.ts.map +1 -0
- package/dist/web/routes/hook-event-routes.js +57 -0
- package/dist/web/routes/hook-event-routes.js.map +1 -0
- package/dist/web/routes/index.d.ts +16 -0
- package/dist/web/routes/index.d.ts.map +1 -0
- package/dist/web/routes/index.js +16 -0
- package/dist/web/routes/index.js.map +1 -0
- package/dist/web/routes/mux-routes.d.ts +8 -0
- package/dist/web/routes/mux-routes.d.ts.map +1 -0
- package/dist/web/routes/mux-routes.js +32 -0
- package/dist/web/routes/mux-routes.js.map +1 -0
- package/dist/web/routes/plan-routes.d.ts +9 -0
- package/dist/web/routes/plan-routes.d.ts.map +1 -0
- package/dist/web/routes/plan-routes.js +385 -0
- package/dist/web/routes/plan-routes.js.map +1 -0
- package/dist/web/routes/push-routes.d.ts +8 -0
- package/dist/web/routes/push-routes.d.ts.map +1 -0
- package/dist/web/routes/push-routes.js +49 -0
- package/dist/web/routes/push-routes.js.map +1 -0
- package/dist/web/routes/ralph-routes.d.ts +9 -0
- package/dist/web/routes/ralph-routes.d.ts.map +1 -0
- package/dist/web/routes/ralph-routes.js +485 -0
- package/dist/web/routes/ralph-routes.js.map +1 -0
- package/dist/web/routes/respawn-routes.d.ts +8 -0
- package/dist/web/routes/respawn-routes.d.ts.map +1 -0
- package/dist/web/routes/respawn-routes.js +270 -0
- package/dist/web/routes/respawn-routes.js.map +1 -0
- package/dist/web/routes/scheduled-routes.d.ts +8 -0
- package/dist/web/routes/scheduled-routes.d.ts.map +1 -0
- package/dist/web/routes/scheduled-routes.js +51 -0
- package/dist/web/routes/scheduled-routes.js.map +1 -0
- package/dist/web/routes/session-routes.d.ts +9 -0
- package/dist/web/routes/session-routes.d.ts.map +1 -0
- package/dist/web/routes/session-routes.js +751 -0
- package/dist/web/routes/session-routes.js.map +1 -0
- package/dist/web/routes/system-routes.d.ts +9 -0
- package/dist/web/routes/system-routes.d.ts.map +1 -0
- package/dist/web/routes/system-routes.js +699 -0
- package/dist/web/routes/system-routes.js.map +1 -0
- package/dist/web/routes/team-routes.d.ts +8 -0
- package/dist/web/routes/team-routes.d.ts.map +1 -0
- package/dist/web/routes/team-routes.js +14 -0
- package/dist/web/routes/team-routes.js.map +1 -0
- package/dist/web/schemas.d.ts +43 -3
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +6 -2
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +35 -15
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +563 -3971
- package/dist/web/server.js.map +1 -1
- package/dist/web/sse-events.d.ts +361 -0
- package/dist/web/sse-events.d.ts.map +1 -0
- package/dist/web/sse-events.js +396 -0
- package/dist/web/sse-events.js.map +1 -0
- package/package.json +2 -1
- 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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"}
|