aicodeman 0.2.9 → 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.
- package/README.md +91 -0
- 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 +36 -0
- package/dist/config/server-timing.d.ts.map +1 -0
- package/dist/config/server-timing.js +51 -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.map +1 -1
- package/dist/hooks-config.js +7 -6
- 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/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-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 +194 -685
- package/dist/ralph-tracker.d.ts.map +1 -1
- package/dist/ralph-tracker.js +349 -1713
- 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 +12 -101
- package/dist/respawn-controller.d.ts.map +1 -1
- package/dist/respawn-controller.js +144 -593
- 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-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 +2 -33
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +58 -309
- package/dist/session.js.map +1 -1
- package/dist/state-store.d.ts +2 -2
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +12 -23
- package/dist/state-store.js.map +1 -1
- package/dist/subagent-watcher.d.ts +3 -4
- package/dist/subagent-watcher.d.ts.map +1 -1
- package/dist/subagent-watcher.js +24 -61
- 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 +127 -7
- package/dist/tunnel-manager.js.map +1 -1
- package/dist/types/api.d.ts +93 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +83 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/app-state.d.ts +100 -0
- package/dist/types/app-state.d.ts.map +1 -0
- package/dist/types/app-state.js +59 -0
- package/dist/types/app-state.js.map +1 -0
- package/dist/types/common.d.ts +70 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +8 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lifecycle.d.ts +17 -0
- package/dist/types/lifecycle.d.ts.map +1 -0
- package/dist/types/lifecycle.js +5 -0
- package/dist/types/lifecycle.js.map +1 -0
- package/dist/types/plan.d.ts +32 -0
- package/dist/types/plan.d.ts.map +1 -0
- package/dist/types/plan.js +5 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/push.d.ts +23 -0
- package/dist/types/push.d.ts.map +1 -0
- package/dist/types/push.js +5 -0
- package/dist/types/push.js.map +1 -0
- package/dist/types/ralph.d.ts +241 -0
- package/dist/types/ralph.d.ts.map +1 -0
- package/dist/types/ralph.js +49 -0
- package/dist/types/ralph.js.map +1 -0
- package/dist/types/respawn.d.ts +250 -0
- package/dist/types/respawn.d.ts.map +1 -0
- package/dist/types/respawn.js +5 -0
- package/dist/types/respawn.js.map +1 -0
- package/dist/types/run-summary.d.ts +81 -0
- package/dist/types/run-summary.d.ts.map +1 -0
- package/dist/types/run-summary.js +22 -0
- package/dist/types/run-summary.js.map +1 -0
- package/dist/types/session.d.ts +130 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +5 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/task.d.ts +58 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/teams.d.ts +55 -0
- package/dist/types/teams.d.ts.map +1 -0
- package/dist/types/teams.js +5 -0
- package/dist/types/teams.js.map +1 -0
- package/dist/types/tools.d.ts +46 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +5 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types.d.ts +1 -1138
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -214
- 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 +70 -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 +151 -235
- package/dist/web/public/app.js.br +0 -0
- package/dist/web/public/app.js.gz +0 -0
- package/dist/web/public/constants.js +238 -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 +11 -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 +279 -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 +467 -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 +445 -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 +3 -3
- 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 +1115 -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.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.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.js +858 -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 +143 -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 +419 -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 +381 -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 +475 -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 +260 -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 +729 -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 +678 -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 +10 -9
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +335 -3824
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RalphPlanTracker - Enhanced plan task management
|
|
3
|
+
*
|
|
4
|
+
* Manages plan tasks with verification criteria, dependencies,
|
|
5
|
+
* execution tracking, TDD workflow support, and plan versioning.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from ralph-tracker.ts as part of domain splitting.
|
|
8
|
+
*
|
|
9
|
+
* @module ralph-plan-tracker
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
import type { PlanTaskStatus, TddPhase } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Enhanced plan task with verification criteria, dependencies, and execution tracking.
|
|
15
|
+
* Supports TDD workflow, failure tracking, and plan versioning.
|
|
16
|
+
*/
|
|
17
|
+
export interface EnhancedPlanTask {
|
|
18
|
+
/** Unique identifier (e.g., "P0-001") */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Task description */
|
|
21
|
+
content: string;
|
|
22
|
+
/** Criticality level */
|
|
23
|
+
priority: 'P0' | 'P1' | 'P2' | null;
|
|
24
|
+
/** How to verify completion */
|
|
25
|
+
verificationCriteria?: string;
|
|
26
|
+
/** Command to run for verification */
|
|
27
|
+
testCommand?: string;
|
|
28
|
+
/** IDs of tasks that must complete first */
|
|
29
|
+
dependencies: string[];
|
|
30
|
+
/** Current execution status */
|
|
31
|
+
status: PlanTaskStatus;
|
|
32
|
+
/** How many times attempted */
|
|
33
|
+
attempts: number;
|
|
34
|
+
/** Most recent failure reason */
|
|
35
|
+
lastError?: string;
|
|
36
|
+
/** Timestamp of completion */
|
|
37
|
+
completedAt?: number;
|
|
38
|
+
/** Plan version this belongs to */
|
|
39
|
+
version: number;
|
|
40
|
+
/** TDD phase category */
|
|
41
|
+
tddPhase?: TddPhase;
|
|
42
|
+
/** ID of paired test/impl task */
|
|
43
|
+
pairedWith?: string;
|
|
44
|
+
/** Estimated complexity */
|
|
45
|
+
complexity?: 'low' | 'medium' | 'high';
|
|
46
|
+
/** Checklist items for review tasks (tddPhase: 'review') */
|
|
47
|
+
reviewChecklist?: string[];
|
|
48
|
+
}
|
|
49
|
+
/** Checkpoint review data */
|
|
50
|
+
export interface CheckpointReview {
|
|
51
|
+
iteration: number;
|
|
52
|
+
timestamp: number;
|
|
53
|
+
summary: {
|
|
54
|
+
total: number;
|
|
55
|
+
completed: number;
|
|
56
|
+
failed: number;
|
|
57
|
+
blocked: number;
|
|
58
|
+
pending: number;
|
|
59
|
+
inProgress: number;
|
|
60
|
+
};
|
|
61
|
+
stuckTasks: Array<{
|
|
62
|
+
id: string;
|
|
63
|
+
content: string;
|
|
64
|
+
attempts: number;
|
|
65
|
+
lastError?: string;
|
|
66
|
+
}>;
|
|
67
|
+
recommendations: string[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* RalphPlanTracker - Manages enhanced plan tasks with versioning and checkpoints.
|
|
71
|
+
*
|
|
72
|
+
* Events emitted:
|
|
73
|
+
* - `planInitialized` - When a new plan is initialized
|
|
74
|
+
* - `planTaskUpdate` - When a plan task is updated
|
|
75
|
+
* - `taskBlocked` - When a task becomes blocked after too many failures
|
|
76
|
+
* - `taskUnblocked` - When a task's dependencies are all met
|
|
77
|
+
* - `planCheckpoint` - When a checkpoint review is triggered
|
|
78
|
+
* - `planTaskAdded` - When a new task is added to the plan
|
|
79
|
+
* - `planRollback` - When the plan is rolled back to a previous version
|
|
80
|
+
*/
|
|
81
|
+
export declare class RalphPlanTracker extends EventEmitter {
|
|
82
|
+
/** Current version of the plan (incremented on changes) */
|
|
83
|
+
private _planVersion;
|
|
84
|
+
/** History of plan versions for rollback support */
|
|
85
|
+
private _planHistory;
|
|
86
|
+
/** Enhanced plan tasks with execution tracking */
|
|
87
|
+
private _planTasks;
|
|
88
|
+
/** Checkpoint intervals (iterations at which to trigger review) */
|
|
89
|
+
private _checkpointIterations;
|
|
90
|
+
/** Last checkpoint iteration */
|
|
91
|
+
private _lastCheckpointIteration;
|
|
92
|
+
/** Current cycle count (fed by parent via notifyCycleCount) */
|
|
93
|
+
private _cycleCount;
|
|
94
|
+
constructor();
|
|
95
|
+
/**
|
|
96
|
+
* Notify the plan tracker of the current cycle count.
|
|
97
|
+
* Called by parent when iteration changes (for checkpoint detection).
|
|
98
|
+
*/
|
|
99
|
+
notifyCycleCount(cycleCount: number): void;
|
|
100
|
+
/**
|
|
101
|
+
* Initialize plan tasks from generated plan items.
|
|
102
|
+
* Called when wizard generates a new plan.
|
|
103
|
+
*/
|
|
104
|
+
initializePlanTasks(items: Array<{
|
|
105
|
+
id?: string;
|
|
106
|
+
content: string;
|
|
107
|
+
priority?: 'P0' | 'P1' | 'P2' | null;
|
|
108
|
+
verificationCriteria?: string;
|
|
109
|
+
testCommand?: string;
|
|
110
|
+
dependencies?: string[];
|
|
111
|
+
tddPhase?: TddPhase;
|
|
112
|
+
pairedWith?: string;
|
|
113
|
+
complexity?: 'low' | 'medium' | 'high';
|
|
114
|
+
}>): void;
|
|
115
|
+
/**
|
|
116
|
+
* Update a specific plan task's status, attempts, or error.
|
|
117
|
+
*/
|
|
118
|
+
updatePlanTask(taskId: string, update: {
|
|
119
|
+
status?: PlanTaskStatus;
|
|
120
|
+
error?: string;
|
|
121
|
+
incrementAttempts?: boolean;
|
|
122
|
+
}): {
|
|
123
|
+
success: boolean;
|
|
124
|
+
task?: EnhancedPlanTask;
|
|
125
|
+
error?: string;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Add a new task to the plan (for runtime adaptation).
|
|
129
|
+
*/
|
|
130
|
+
addPlanTask(task: {
|
|
131
|
+
content: string;
|
|
132
|
+
priority?: 'P0' | 'P1' | 'P2';
|
|
133
|
+
verificationCriteria?: string;
|
|
134
|
+
dependencies?: string[];
|
|
135
|
+
insertAfter?: string;
|
|
136
|
+
}): {
|
|
137
|
+
task: EnhancedPlanTask;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Get all plan tasks.
|
|
141
|
+
*/
|
|
142
|
+
getPlanTasks(): EnhancedPlanTask[];
|
|
143
|
+
/**
|
|
144
|
+
* Generate a checkpoint review summarizing plan progress and stuck tasks.
|
|
145
|
+
*/
|
|
146
|
+
generateCheckpointReview(): CheckpointReview;
|
|
147
|
+
/**
|
|
148
|
+
* Get plan version history.
|
|
149
|
+
*/
|
|
150
|
+
getPlanHistory(): Array<{
|
|
151
|
+
version: number;
|
|
152
|
+
timestamp: number;
|
|
153
|
+
summary: string;
|
|
154
|
+
stats: {
|
|
155
|
+
total: number;
|
|
156
|
+
completed: number;
|
|
157
|
+
failed: number;
|
|
158
|
+
};
|
|
159
|
+
}>;
|
|
160
|
+
/**
|
|
161
|
+
* Rollback to a previous plan version.
|
|
162
|
+
*/
|
|
163
|
+
rollbackToVersion(version: number): {
|
|
164
|
+
success: boolean;
|
|
165
|
+
plan?: EnhancedPlanTask[];
|
|
166
|
+
error?: string;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Check if checkpoint review is due for current iteration.
|
|
170
|
+
*/
|
|
171
|
+
isCheckpointDue(): boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Get current plan version.
|
|
174
|
+
*/
|
|
175
|
+
get planVersion(): number;
|
|
176
|
+
/**
|
|
177
|
+
* Reset plan state (soft reset - keeps version history).
|
|
178
|
+
*/
|
|
179
|
+
reset(): void;
|
|
180
|
+
/**
|
|
181
|
+
* Full reset - clears all plan state.
|
|
182
|
+
*/
|
|
183
|
+
fullReset(): void;
|
|
184
|
+
/**
|
|
185
|
+
* Clean up all resources.
|
|
186
|
+
*/
|
|
187
|
+
destroy(): void;
|
|
188
|
+
/**
|
|
189
|
+
* Unblock tasks that were waiting on a completed dependency.
|
|
190
|
+
*/
|
|
191
|
+
private _unblockDependentTasks;
|
|
192
|
+
/**
|
|
193
|
+
* Check if current iteration is a checkpoint and emit review if so.
|
|
194
|
+
*/
|
|
195
|
+
private _checkForCheckpoint;
|
|
196
|
+
/**
|
|
197
|
+
* Save current plan state to history.
|
|
198
|
+
*/
|
|
199
|
+
private _savePlanToHistory;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=ralph-plan-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph-plan-tracker.d.ts","sourceRoot":"","sources":["../src/ralph-plan-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RalphPlanTracker - Enhanced plan task management
|
|
3
|
+
*
|
|
4
|
+
* Manages plan tasks with verification criteria, dependencies,
|
|
5
|
+
* execution tracking, TDD workflow support, and plan versioning.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from ralph-tracker.ts as part of domain splitting.
|
|
8
|
+
*
|
|
9
|
+
* @module ralph-plan-tracker
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
const MAX_PLAN_HISTORY = 10;
|
|
13
|
+
/**
|
|
14
|
+
* RalphPlanTracker - Manages enhanced plan tasks with versioning and checkpoints.
|
|
15
|
+
*
|
|
16
|
+
* Events emitted:
|
|
17
|
+
* - `planInitialized` - When a new plan is initialized
|
|
18
|
+
* - `planTaskUpdate` - When a plan task is updated
|
|
19
|
+
* - `taskBlocked` - When a task becomes blocked after too many failures
|
|
20
|
+
* - `taskUnblocked` - When a task's dependencies are all met
|
|
21
|
+
* - `planCheckpoint` - When a checkpoint review is triggered
|
|
22
|
+
* - `planTaskAdded` - When a new task is added to the plan
|
|
23
|
+
* - `planRollback` - When the plan is rolled back to a previous version
|
|
24
|
+
*/
|
|
25
|
+
export class RalphPlanTracker extends EventEmitter {
|
|
26
|
+
/** Current version of the plan (incremented on changes) */
|
|
27
|
+
_planVersion = 1;
|
|
28
|
+
/** History of plan versions for rollback support */
|
|
29
|
+
_planHistory = [];
|
|
30
|
+
/** Enhanced plan tasks with execution tracking */
|
|
31
|
+
_planTasks = new Map();
|
|
32
|
+
/** Checkpoint intervals (iterations at which to trigger review) */
|
|
33
|
+
_checkpointIterations = [5, 10, 20, 30, 50, 75, 100];
|
|
34
|
+
/** Last checkpoint iteration */
|
|
35
|
+
_lastCheckpointIteration = 0;
|
|
36
|
+
/** Current cycle count (fed by parent via notifyCycleCount) */
|
|
37
|
+
_cycleCount = 0;
|
|
38
|
+
constructor() {
|
|
39
|
+
super();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Notify the plan tracker of the current cycle count.
|
|
43
|
+
* Called by parent when iteration changes (for checkpoint detection).
|
|
44
|
+
*/
|
|
45
|
+
notifyCycleCount(cycleCount) {
|
|
46
|
+
this._cycleCount = cycleCount;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initialize plan tasks from generated plan items.
|
|
50
|
+
* Called when wizard generates a new plan.
|
|
51
|
+
*/
|
|
52
|
+
initializePlanTasks(items) {
|
|
53
|
+
// Save current plan to history before replacing
|
|
54
|
+
if (this._planTasks.size > 0) {
|
|
55
|
+
this._savePlanToHistory('Plan replaced with new generation');
|
|
56
|
+
}
|
|
57
|
+
// Clear and rebuild
|
|
58
|
+
this._planTasks.clear();
|
|
59
|
+
this._planVersion++;
|
|
60
|
+
items.forEach((item, idx) => {
|
|
61
|
+
const id = item.id || `task-${idx}`;
|
|
62
|
+
const task = {
|
|
63
|
+
id,
|
|
64
|
+
content: item.content,
|
|
65
|
+
priority: item.priority || null,
|
|
66
|
+
verificationCriteria: item.verificationCriteria,
|
|
67
|
+
testCommand: item.testCommand,
|
|
68
|
+
dependencies: item.dependencies || [],
|
|
69
|
+
status: 'pending',
|
|
70
|
+
attempts: 0,
|
|
71
|
+
version: this._planVersion,
|
|
72
|
+
tddPhase: item.tddPhase,
|
|
73
|
+
pairedWith: item.pairedWith,
|
|
74
|
+
complexity: item.complexity,
|
|
75
|
+
};
|
|
76
|
+
this._planTasks.set(id, task);
|
|
77
|
+
});
|
|
78
|
+
this.emit('planInitialized', { version: this._planVersion, taskCount: this._planTasks.size });
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Update a specific plan task's status, attempts, or error.
|
|
82
|
+
*/
|
|
83
|
+
updatePlanTask(taskId, update) {
|
|
84
|
+
const task = this._planTasks.get(taskId);
|
|
85
|
+
if (!task) {
|
|
86
|
+
return { success: false, error: 'Task not found' };
|
|
87
|
+
}
|
|
88
|
+
if (update.status) {
|
|
89
|
+
task.status = update.status;
|
|
90
|
+
if (update.status === 'completed') {
|
|
91
|
+
task.completedAt = Date.now();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (update.error) {
|
|
95
|
+
task.lastError = update.error;
|
|
96
|
+
}
|
|
97
|
+
if (update.incrementAttempts) {
|
|
98
|
+
task.attempts++;
|
|
99
|
+
// After 3 failed attempts, mark as blocked and emit warning
|
|
100
|
+
if (task.attempts >= 3 && task.status === 'failed') {
|
|
101
|
+
task.status = 'blocked';
|
|
102
|
+
this.emit('taskBlocked', {
|
|
103
|
+
taskId,
|
|
104
|
+
content: task.content,
|
|
105
|
+
attempts: task.attempts,
|
|
106
|
+
lastError: task.lastError,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Update blocked tasks when a dependency completes
|
|
111
|
+
if (update.status === 'completed') {
|
|
112
|
+
this._unblockDependentTasks(taskId);
|
|
113
|
+
}
|
|
114
|
+
// Check for checkpoint
|
|
115
|
+
this._checkForCheckpoint();
|
|
116
|
+
this.emit('planTaskUpdate', { taskId, task });
|
|
117
|
+
return { success: true, task };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Add a new task to the plan (for runtime adaptation).
|
|
121
|
+
*/
|
|
122
|
+
addPlanTask(task) {
|
|
123
|
+
// Generate unique ID
|
|
124
|
+
const existingIds = Array.from(this._planTasks.keys());
|
|
125
|
+
const prefix = task.priority || 'P1';
|
|
126
|
+
let counter = existingIds.filter((id) => id.startsWith(prefix)).length + 1;
|
|
127
|
+
let id = `${prefix}-${String(counter).padStart(3, '0')}`;
|
|
128
|
+
while (this._planTasks.has(id)) {
|
|
129
|
+
counter++;
|
|
130
|
+
id = `${prefix}-${String(counter).padStart(3, '0')}`;
|
|
131
|
+
}
|
|
132
|
+
const newTask = {
|
|
133
|
+
id,
|
|
134
|
+
content: task.content,
|
|
135
|
+
priority: task.priority || null,
|
|
136
|
+
verificationCriteria: task.verificationCriteria || 'Task completed successfully',
|
|
137
|
+
dependencies: task.dependencies || [],
|
|
138
|
+
status: 'pending',
|
|
139
|
+
attempts: 0,
|
|
140
|
+
version: this._planVersion,
|
|
141
|
+
};
|
|
142
|
+
this._planTasks.set(id, newTask);
|
|
143
|
+
this.emit('planTaskAdded', { task: newTask });
|
|
144
|
+
return { task: newTask };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get all plan tasks.
|
|
148
|
+
*/
|
|
149
|
+
getPlanTasks() {
|
|
150
|
+
return Array.from(this._planTasks.values());
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Generate a checkpoint review summarizing plan progress and stuck tasks.
|
|
154
|
+
*/
|
|
155
|
+
generateCheckpointReview() {
|
|
156
|
+
const tasks = Array.from(this._planTasks.values());
|
|
157
|
+
const summary = {
|
|
158
|
+
total: tasks.length,
|
|
159
|
+
completed: tasks.filter((t) => t.status === 'completed').length,
|
|
160
|
+
failed: tasks.filter((t) => t.status === 'failed').length,
|
|
161
|
+
blocked: tasks.filter((t) => t.status === 'blocked').length,
|
|
162
|
+
pending: tasks.filter((t) => t.status === 'pending').length,
|
|
163
|
+
inProgress: tasks.filter((t) => t.status === 'in_progress').length,
|
|
164
|
+
};
|
|
165
|
+
// Find stuck tasks (3+ attempts or blocked)
|
|
166
|
+
const stuckTasks = tasks
|
|
167
|
+
.filter((t) => t.attempts >= 3 || t.status === 'blocked')
|
|
168
|
+
.map((t) => ({
|
|
169
|
+
id: t.id,
|
|
170
|
+
content: t.content,
|
|
171
|
+
attempts: t.attempts,
|
|
172
|
+
lastError: t.lastError,
|
|
173
|
+
}));
|
|
174
|
+
// Generate recommendations
|
|
175
|
+
const recommendations = [];
|
|
176
|
+
if (stuckTasks.length > 0) {
|
|
177
|
+
recommendations.push(`${stuckTasks.length} task(s) are stuck. Consider breaking them into smaller steps.`);
|
|
178
|
+
}
|
|
179
|
+
if (summary.failed > summary.completed && summary.total > 5) {
|
|
180
|
+
recommendations.push('More tasks have failed than completed. Review approach and consider plan adjustment.');
|
|
181
|
+
}
|
|
182
|
+
const progressPercent = summary.total > 0 ? Math.round((summary.completed / summary.total) * 100) : 0;
|
|
183
|
+
if (progressPercent < 20 && this._cycleCount > 10) {
|
|
184
|
+
recommendations.push('Progress is slow. Consider simplifying tasks or reviewing dependencies.');
|
|
185
|
+
}
|
|
186
|
+
if (summary.total > 0 && summary.blocked > summary.total / 3) {
|
|
187
|
+
recommendations.push('Many tasks are blocked. Review dependency chain for bottlenecks.');
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
iteration: this._cycleCount,
|
|
191
|
+
timestamp: Date.now(),
|
|
192
|
+
summary,
|
|
193
|
+
stuckTasks,
|
|
194
|
+
recommendations,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get plan version history.
|
|
199
|
+
*/
|
|
200
|
+
getPlanHistory() {
|
|
201
|
+
return this._planHistory.map((h) => {
|
|
202
|
+
const tasks = Array.from(h.tasks.values());
|
|
203
|
+
return {
|
|
204
|
+
version: h.version,
|
|
205
|
+
timestamp: h.timestamp,
|
|
206
|
+
summary: h.summary,
|
|
207
|
+
stats: {
|
|
208
|
+
total: tasks.length,
|
|
209
|
+
completed: tasks.filter((t) => t.status === 'completed').length,
|
|
210
|
+
failed: tasks.filter((t) => t.status === 'failed').length,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Rollback to a previous plan version.
|
|
217
|
+
*/
|
|
218
|
+
rollbackToVersion(version) {
|
|
219
|
+
const historyEntry = this._planHistory.find((h) => h.version === version);
|
|
220
|
+
if (!historyEntry) {
|
|
221
|
+
return { success: false, error: `Version ${version} not found in history` };
|
|
222
|
+
}
|
|
223
|
+
// Save current state first
|
|
224
|
+
this._savePlanToHistory(`Rolled back from v${this._planVersion} to v${version}`);
|
|
225
|
+
// Restore the historical version
|
|
226
|
+
this._planTasks.clear();
|
|
227
|
+
for (const [id, task] of historyEntry.tasks) {
|
|
228
|
+
// Reset execution state for retry
|
|
229
|
+
this._planTasks.set(id, {
|
|
230
|
+
...task,
|
|
231
|
+
status: task.status === 'completed' ? 'completed' : 'pending',
|
|
232
|
+
attempts: task.status === 'completed' ? task.attempts : 0,
|
|
233
|
+
lastError: undefined,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
this._planVersion++;
|
|
237
|
+
this.emit('planRollback', { version, newVersion: this._planVersion });
|
|
238
|
+
return { success: true, plan: Array.from(this._planTasks.values()) };
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Check if checkpoint review is due for current iteration.
|
|
242
|
+
*/
|
|
243
|
+
isCheckpointDue() {
|
|
244
|
+
return this._checkpointIterations.includes(this._cycleCount) && this._cycleCount > this._lastCheckpointIteration;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get current plan version.
|
|
248
|
+
*/
|
|
249
|
+
get planVersion() {
|
|
250
|
+
return this._planVersion;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Reset plan state (soft reset - keeps version history).
|
|
254
|
+
*/
|
|
255
|
+
reset() {
|
|
256
|
+
// Don't clear history or version on soft reset
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Full reset - clears all plan state.
|
|
260
|
+
*/
|
|
261
|
+
fullReset() {
|
|
262
|
+
this._planTasks.clear();
|
|
263
|
+
this._planHistory.length = 0;
|
|
264
|
+
this._planVersion = 1;
|
|
265
|
+
this._lastCheckpointIteration = 0;
|
|
266
|
+
this._cycleCount = 0;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Clean up all resources.
|
|
270
|
+
*/
|
|
271
|
+
destroy() {
|
|
272
|
+
this._planTasks.clear();
|
|
273
|
+
this._planHistory.length = 0;
|
|
274
|
+
this.removeAllListeners();
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Unblock tasks that were waiting on a completed dependency.
|
|
278
|
+
*/
|
|
279
|
+
_unblockDependentTasks(completedTaskId) {
|
|
280
|
+
for (const [_, task] of this._planTasks) {
|
|
281
|
+
if (task.dependencies.includes(completedTaskId)) {
|
|
282
|
+
// Check if all dependencies are now complete
|
|
283
|
+
const allDepsComplete = task.dependencies.every((depId) => {
|
|
284
|
+
const dep = this._planTasks.get(depId);
|
|
285
|
+
return dep && dep.status === 'completed';
|
|
286
|
+
});
|
|
287
|
+
if (allDepsComplete && task.status === 'blocked') {
|
|
288
|
+
task.status = 'pending';
|
|
289
|
+
this.emit('taskUnblocked', { taskId: task.id });
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check if current iteration is a checkpoint and emit review if so.
|
|
296
|
+
*/
|
|
297
|
+
_checkForCheckpoint() {
|
|
298
|
+
if (this._checkpointIterations.includes(this._cycleCount) && this._cycleCount > this._lastCheckpointIteration) {
|
|
299
|
+
this._lastCheckpointIteration = this._cycleCount;
|
|
300
|
+
const checkpoint = this.generateCheckpointReview();
|
|
301
|
+
this.emit('planCheckpoint', checkpoint);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Save current plan state to history.
|
|
306
|
+
*/
|
|
307
|
+
_savePlanToHistory(summary) {
|
|
308
|
+
// Clone current tasks
|
|
309
|
+
const tasksCopy = new Map();
|
|
310
|
+
for (const [id, task] of this._planTasks) {
|
|
311
|
+
tasksCopy.set(id, { ...task });
|
|
312
|
+
}
|
|
313
|
+
this._planHistory.push({
|
|
314
|
+
version: this._planVersion,
|
|
315
|
+
timestamp: Date.now(),
|
|
316
|
+
tasks: tasksCopy,
|
|
317
|
+
summary,
|
|
318
|
+
});
|
|
319
|
+
// Limit history size
|
|
320
|
+
if (this._planHistory.length > MAX_PLAN_HISTORY) {
|
|
321
|
+
this._planHistory.shift();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=ralph-plan-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph-plan-tracker.js","sourceRoot":"","sources":["../src/ralph-plan-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RalphStallDetector - Iteration stall detection
|
|
3
|
+
*
|
|
4
|
+
* Monitors iteration progress and emits warnings when the loop
|
|
5
|
+
* appears to be stalled (no iteration changes for extended periods).
|
|
6
|
+
*
|
|
7
|
+
* Extracted from ralph-tracker.ts as part of domain splitting.
|
|
8
|
+
*
|
|
9
|
+
* @module ralph-stall-detector
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
/**
|
|
13
|
+
* RalphStallDetector - Detects iteration stalls in the Ralph loop.
|
|
14
|
+
*
|
|
15
|
+
* Events emitted:
|
|
16
|
+
* - `iterationStallWarning` - When iteration hasn't changed for warning threshold
|
|
17
|
+
* - `iterationStallCritical` - When iteration hasn't changed for critical threshold
|
|
18
|
+
*/
|
|
19
|
+
export declare class RalphStallDetector extends EventEmitter {
|
|
20
|
+
/** Timestamp when iteration count last changed */
|
|
21
|
+
private _lastIterationChangeTime;
|
|
22
|
+
/** Last observed iteration count for stall detection */
|
|
23
|
+
private _lastObservedIteration;
|
|
24
|
+
/** Timer for iteration stall detection */
|
|
25
|
+
private _iterationStallTimer;
|
|
26
|
+
/** Iteration stall warning threshold (ms) - default 10 minutes */
|
|
27
|
+
private _iterationStallWarningMs;
|
|
28
|
+
/** Iteration stall critical threshold (ms) - default 20 minutes */
|
|
29
|
+
private _iterationStallCriticalMs;
|
|
30
|
+
/** Whether stall warning has been emitted */
|
|
31
|
+
private _iterationStallWarned;
|
|
32
|
+
/** Whether the loop is currently active */
|
|
33
|
+
private _loopActive;
|
|
34
|
+
constructor();
|
|
35
|
+
/**
|
|
36
|
+
* Start iteration stall detection timer.
|
|
37
|
+
* Should be called when the loop becomes active.
|
|
38
|
+
*/
|
|
39
|
+
startIterationStallDetection(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Stop iteration stall detection timer.
|
|
42
|
+
*/
|
|
43
|
+
stopIterationStallDetection(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Notify the detector that the iteration has changed.
|
|
46
|
+
* Resets stall tracking state.
|
|
47
|
+
*/
|
|
48
|
+
notifyIterationChanged(iteration: number): void;
|
|
49
|
+
/**
|
|
50
|
+
* Set whether the loop is currently active.
|
|
51
|
+
* Stall detection only fires when loop is active.
|
|
52
|
+
*/
|
|
53
|
+
setLoopActive(active: boolean): void;
|
|
54
|
+
/**
|
|
55
|
+
* Check for iteration stall and emit appropriate events.
|
|
56
|
+
*/
|
|
57
|
+
private checkIterationStall;
|
|
58
|
+
/**
|
|
59
|
+
* Get iteration stall metrics for monitoring.
|
|
60
|
+
*/
|
|
61
|
+
getIterationStallMetrics(): {
|
|
62
|
+
lastIterationChangeTime: number;
|
|
63
|
+
stallDurationMs: number;
|
|
64
|
+
warningThresholdMs: number;
|
|
65
|
+
criticalThresholdMs: number;
|
|
66
|
+
isWarned: boolean;
|
|
67
|
+
currentIteration: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Configure iteration stall thresholds.
|
|
71
|
+
* @param warningMs - Warning threshold in milliseconds
|
|
72
|
+
* @param criticalMs - Critical threshold in milliseconds
|
|
73
|
+
*/
|
|
74
|
+
configureIterationStallThresholds(warningMs: number, criticalMs: number): void;
|
|
75
|
+
/**
|
|
76
|
+
* Reset stall detector state.
|
|
77
|
+
*/
|
|
78
|
+
reset(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Clean up all resources.
|
|
81
|
+
*/
|
|
82
|
+
destroy(): void;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=ralph-stall-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph-stall-detector.d.ts","sourceRoot":"","sources":["../src/ralph-stall-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,kDAAkD;IAClD,OAAO,CAAC,wBAAwB,CAAa;IAE7C,wDAAwD;IACxD,OAAO,CAAC,sBAAsB,CAAa;IAE3C,0CAA0C;IAC1C,OAAO,CAAC,oBAAoB,CAA+B;IAE3D,kEAAkE;IAClE,OAAO,CAAC,wBAAwB,CAA0B;IAE1D,mEAAmE;IACnE,OAAO,CAAC,yBAAyB,CAA0B;IAE3D,6CAA6C;IAC7C,OAAO,CAAC,qBAAqB,CAAkB;IAE/C,2CAA2C;IAC3C,OAAO,CAAC,WAAW,CAAkB;;IAOrC;;;OAGG;IACH,4BAA4B,IAAI,IAAI;IAWpC;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAOnC;;;OAGG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM/C;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAIpC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,wBAAwB,IAAI;QAC1B,uBAAuB,EAAE,MAAM,CAAC;QAChC,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,OAAO,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;KAC1B;IAWD;;;;OAIG;IACH,iCAAiC,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAK9E;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|