ghcralph 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +327 -0
  3. package/bin/ghcralph.js +2 -0
  4. package/dist/cli.d.ts +12 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +92 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/config.d.ts +8 -0
  9. package/dist/commands/config.d.ts.map +1 -0
  10. package/dist/commands/config.js +118 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/index.d.ts +11 -0
  13. package/dist/commands/index.d.ts.map +1 -0
  14. package/dist/commands/index.js +11 -0
  15. package/dist/commands/index.js.map +1 -0
  16. package/dist/commands/init.d.ts +15 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +116 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/rollback.d.ts +8 -0
  21. package/dist/commands/rollback.d.ts.map +1 -0
  22. package/dist/commands/rollback.js +238 -0
  23. package/dist/commands/rollback.js.map +1 -0
  24. package/dist/commands/run.d.ts +28 -0
  25. package/dist/commands/run.d.ts.map +1 -0
  26. package/dist/commands/run.js +407 -0
  27. package/dist/commands/run.js.map +1 -0
  28. package/dist/commands/status.d.ts +8 -0
  29. package/dist/commands/status.d.ts.map +1 -0
  30. package/dist/commands/status.js +399 -0
  31. package/dist/commands/status.js.map +1 -0
  32. package/dist/core/action-executor.d.ts +96 -0
  33. package/dist/core/action-executor.d.ts.map +1 -0
  34. package/dist/core/action-executor.js +289 -0
  35. package/dist/core/action-executor.js.map +1 -0
  36. package/dist/core/checkpoint-manager.d.ts +94 -0
  37. package/dist/core/checkpoint-manager.d.ts.map +1 -0
  38. package/dist/core/checkpoint-manager.js +236 -0
  39. package/dist/core/checkpoint-manager.js.map +1 -0
  40. package/dist/core/config-manager.d.ts +62 -0
  41. package/dist/core/config-manager.d.ts.map +1 -0
  42. package/dist/core/config-manager.js +184 -0
  43. package/dist/core/config-manager.js.map +1 -0
  44. package/dist/core/config-schema.d.ts +74 -0
  45. package/dist/core/config-schema.d.ts.map +1 -0
  46. package/dist/core/config-schema.js +84 -0
  47. package/dist/core/config-schema.js.map +1 -0
  48. package/dist/core/context-builder.d.ts +116 -0
  49. package/dist/core/context-builder.d.ts.map +1 -0
  50. package/dist/core/context-builder.js +388 -0
  51. package/dist/core/context-builder.js.map +1 -0
  52. package/dist/core/feedback-builder.d.ts +94 -0
  53. package/dist/core/feedback-builder.d.ts.map +1 -0
  54. package/dist/core/feedback-builder.js +226 -0
  55. package/dist/core/feedback-builder.js.map +1 -0
  56. package/dist/core/file-safeguard.d.ts +109 -0
  57. package/dist/core/file-safeguard.d.ts.map +1 -0
  58. package/dist/core/file-safeguard.js +200 -0
  59. package/dist/core/file-safeguard.js.map +1 -0
  60. package/dist/core/git-branch-manager.d.ts +122 -0
  61. package/dist/core/git-branch-manager.d.ts.map +1 -0
  62. package/dist/core/git-branch-manager.js +302 -0
  63. package/dist/core/git-branch-manager.js.map +1 -0
  64. package/dist/core/github-plan.d.ts +86 -0
  65. package/dist/core/github-plan.d.ts.map +1 -0
  66. package/dist/core/github-plan.js +333 -0
  67. package/dist/core/github-plan.js.map +1 -0
  68. package/dist/core/index.d.ts +43 -0
  69. package/dist/core/index.d.ts.map +1 -0
  70. package/dist/core/index.js +26 -0
  71. package/dist/core/index.js.map +1 -0
  72. package/dist/core/local-markdown-plan.d.ts +65 -0
  73. package/dist/core/local-markdown-plan.d.ts.map +1 -0
  74. package/dist/core/local-markdown-plan.js +154 -0
  75. package/dist/core/local-markdown-plan.js.map +1 -0
  76. package/dist/core/loop-engine.d.ts +133 -0
  77. package/dist/core/loop-engine.d.ts.map +1 -0
  78. package/dist/core/loop-engine.js +420 -0
  79. package/dist/core/loop-engine.js.map +1 -0
  80. package/dist/core/loop-events.d.ts +48 -0
  81. package/dist/core/loop-events.d.ts.map +1 -0
  82. package/dist/core/loop-events.js +24 -0
  83. package/dist/core/loop-events.js.map +1 -0
  84. package/dist/core/loop-state.d.ts +51 -0
  85. package/dist/core/loop-state.d.ts.map +1 -0
  86. package/dist/core/loop-state.js +48 -0
  87. package/dist/core/loop-state.js.map +1 -0
  88. package/dist/core/markdown-parser.d.ts +51 -0
  89. package/dist/core/markdown-parser.d.ts.map +1 -0
  90. package/dist/core/markdown-parser.js +122 -0
  91. package/dist/core/markdown-parser.js.map +1 -0
  92. package/dist/core/plan-manager.d.ts +61 -0
  93. package/dist/core/plan-manager.d.ts.map +1 -0
  94. package/dist/core/plan-manager.js +7 -0
  95. package/dist/core/plan-manager.js.map +1 -0
  96. package/dist/core/progress-tracker.d.ts +74 -0
  97. package/dist/core/progress-tracker.d.ts.map +1 -0
  98. package/dist/core/progress-tracker.js +198 -0
  99. package/dist/core/progress-tracker.js.map +1 -0
  100. package/dist/core/prompt-examples.d.ts +52 -0
  101. package/dist/core/prompt-examples.d.ts.map +1 -0
  102. package/dist/core/prompt-examples.js +194 -0
  103. package/dist/core/prompt-examples.js.map +1 -0
  104. package/dist/core/response-parser.d.ts +90 -0
  105. package/dist/core/response-parser.d.ts.map +1 -0
  106. package/dist/core/response-parser.js +209 -0
  107. package/dist/core/response-parser.js.map +1 -0
  108. package/dist/core/verification-hooks.d.ts +103 -0
  109. package/dist/core/verification-hooks.d.ts.map +1 -0
  110. package/dist/core/verification-hooks.js +268 -0
  111. package/dist/core/verification-hooks.js.map +1 -0
  112. package/dist/index.d.ts +13 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +17 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/integrations/auth.d.ts +28 -0
  117. package/dist/integrations/auth.d.ts.map +1 -0
  118. package/dist/integrations/auth.js +76 -0
  119. package/dist/integrations/auth.js.map +1 -0
  120. package/dist/integrations/copilot-agent.d.ts +104 -0
  121. package/dist/integrations/copilot-agent.d.ts.map +1 -0
  122. package/dist/integrations/copilot-agent.js +235 -0
  123. package/dist/integrations/copilot-agent.js.map +1 -0
  124. package/dist/integrations/index.d.ts +18 -0
  125. package/dist/integrations/index.d.ts.map +1 -0
  126. package/dist/integrations/index.js +14 -0
  127. package/dist/integrations/index.js.map +1 -0
  128. package/dist/integrations/mcp-tools.d.ts +129 -0
  129. package/dist/integrations/mcp-tools.d.ts.map +1 -0
  130. package/dist/integrations/mcp-tools.js +272 -0
  131. package/dist/integrations/mcp-tools.js.map +1 -0
  132. package/dist/integrations/tokens.d.ts +45 -0
  133. package/dist/integrations/tokens.d.ts.map +1 -0
  134. package/dist/integrations/tokens.js +50 -0
  135. package/dist/integrations/tokens.js.map +1 -0
  136. package/dist/types/index.d.ts +53 -0
  137. package/dist/types/index.d.ts.map +1 -0
  138. package/dist/types/index.js +7 -0
  139. package/dist/types/index.js.map +1 -0
  140. package/dist/utils/index.d.ts +23 -0
  141. package/dist/utils/index.d.ts.map +1 -0
  142. package/dist/utils/index.js +37 -0
  143. package/dist/utils/index.js.map +1 -0
  144. package/dist/utils/output.d.ts +59 -0
  145. package/dist/utils/output.d.ts.map +1 -0
  146. package/dist/utils/output.js +96 -0
  147. package/dist/utils/output.js.map +1 -0
  148. package/dist/utils/paths.d.ts +34 -0
  149. package/dist/utils/paths.d.ts.map +1 -0
  150. package/dist/utils/paths.js +67 -0
  151. package/dist/utils/paths.js.map +1 -0
  152. package/dist/utils/shell.d.ts +26 -0
  153. package/dist/utils/shell.d.ts.map +1 -0
  154. package/dist/utils/shell.js +65 -0
  155. package/dist/utils/shell.js.map +1 -0
  156. package/dist/utils/validation.d.ts +27 -0
  157. package/dist/utils/validation.d.ts.map +1 -0
  158. package/dist/utils/validation.js +43 -0
  159. package/dist/utils/validation.js.map +1 -0
  160. package/package.json +86 -0
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Loop Engine
3
+ *
4
+ * The core engine that runs the autonomous coding loop.
5
+ * Implements the Ralph pattern: parse → execute → verify → feedback.
6
+ */
7
+ import type { Task } from '../types/index.js';
8
+ import type { CopilotAgent } from '../integrations/index.js';
9
+ import { type TokenUsage } from '../integrations/index.js';
10
+ import { LoopEventEmitter } from './loop-events.js';
11
+ import { type FullLoopState } from './loop-state.js';
12
+ import { type ContextBuilderConfig } from './context-builder.js';
13
+ import { type ActionExecutorConfig } from './action-executor.js';
14
+ import { type VerificationConfig } from './verification-hooks.js';
15
+ import { type FeedbackBuilderConfig } from './feedback-builder.js';
16
+ /**
17
+ * Loop engine configuration
18
+ */
19
+ export interface LoopEngineConfig {
20
+ /** Maximum number of iterations */
21
+ maxIterations: number;
22
+ /** Maximum token budget */
23
+ maxTokens: number;
24
+ /** Maximum duration in minutes (0 = no limit) */
25
+ maxDurationMinutes: number;
26
+ /** Delay between iterations in ms */
27
+ iterationDelayMs: number;
28
+ /** Warning threshold percentage (default: 0.8 = 80%) */
29
+ warningThreshold: number;
30
+ /** Maximum consecutive failures before pausing */
31
+ maxConsecutiveFailures: number;
32
+ /** Whether unlimited iterations are allowed */
33
+ allowUnlimited: boolean;
34
+ /** Context builder configuration */
35
+ contextConfig?: Partial<ContextBuilderConfig>;
36
+ /** Action executor configuration */
37
+ actionExecutorConfig?: Partial<ActionExecutorConfig>;
38
+ /** Verification manager configuration */
39
+ verificationConfig?: Partial<VerificationConfig>;
40
+ /** Feedback builder configuration */
41
+ feedbackConfig?: Partial<FeedbackBuilderConfig>;
42
+ /** Working directory for file operations */
43
+ cwd?: string;
44
+ /** Whether to run verification hooks */
45
+ runVerification?: boolean;
46
+ /** Whether to execute actions (false = dry run) */
47
+ executeActions?: boolean;
48
+ }
49
+ /**
50
+ * Loop completion reason
51
+ */
52
+ export type LoopCompletionReason = 'task-complete' | 'max-iterations' | 'max-tokens' | 'max-duration' | 'circuit-breaker' | 'stopped' | 'paused' | 'error';
53
+ /**
54
+ * LoopEngine class - the heart of Ralph CLI
55
+ *
56
+ * Implements the Ralph pattern:
57
+ * 1. Send prompt to AI
58
+ * 2. Parse structured response for actions
59
+ * 3. Execute actions (CREATE, EDIT, DELETE, EXECUTE)
60
+ * 4. Run verification hooks (tests, build)
61
+ * 5. Build feedback for next iteration
62
+ * 6. Stop when COMPLETE action received AND verification passes
63
+ */
64
+ export declare class LoopEngine {
65
+ private config;
66
+ private agent;
67
+ private events;
68
+ private contextBuilder;
69
+ private actionExecutor;
70
+ private verificationManager;
71
+ private feedbackBuilder;
72
+ private state;
73
+ private pauseRequested;
74
+ private stopRequested;
75
+ private consecutiveFailures;
76
+ private iterationWarningShown;
77
+ private tokenWarningShown;
78
+ private lastFeedback;
79
+ constructor(agent: CopilotAgent, config?: Partial<LoopEngineConfig>);
80
+ /**
81
+ * Get the event emitter for subscribing to loop events
82
+ */
83
+ getEvents(): LoopEventEmitter;
84
+ /**
85
+ * Get the current loop state
86
+ */
87
+ getState(): FullLoopState | null;
88
+ /**
89
+ * Start the loop for a task
90
+ */
91
+ start(task: Task): Promise<FullLoopState>;
92
+ /**
93
+ * Pause the current loop
94
+ */
95
+ pause(): void;
96
+ /**
97
+ * Resume a paused loop
98
+ */
99
+ resume(): Promise<FullLoopState | null>;
100
+ /**
101
+ * Stop the current loop
102
+ */
103
+ stop(): void;
104
+ /**
105
+ * The main loop execution
106
+ */
107
+ private runLoop;
108
+ /**
109
+ * Check if the loop should continue
110
+ */
111
+ private shouldContinue;
112
+ /**
113
+ * Check thresholds and emit warnings
114
+ */
115
+ private checkThresholds;
116
+ /**
117
+ * Run a single iteration (Ralph pattern)
118
+ */
119
+ private runIteration;
120
+ /**
121
+ * Extract a summary from the response
122
+ */
123
+ private extractSummary;
124
+ /**
125
+ * Sleep utility
126
+ */
127
+ private sleep;
128
+ /**
129
+ * Get token usage summary
130
+ */
131
+ getTokenUsage(): TokenUsage;
132
+ }
133
+ //# sourceMappingURL=loop-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-engine.d.ts","sourceRoot":"","sources":["../../src/core/loop-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,420 @@
1
+ /**
2
+ * Loop Engine
3
+ *
4
+ * The core engine that runs the autonomous coding loop.
5
+ * Implements the Ralph pattern: parse → execute → verify → feedback.
6
+ */
7
+ import { debug, info, error as logError, warn } from '../utils/index.js';
8
+ import { LoopEventEmitter } from './loop-events.js';
9
+ import { createInitialState, createIterationRecord, completeIteration, } from './loop-state.js';
10
+ import { ContextBuilder } from './context-builder.js';
11
+ import { parseResponse, getCompleteAction } from './response-parser.js';
12
+ import { createActionExecutor } from './action-executor.js';
13
+ import { createVerificationManager } from './verification-hooks.js';
14
+ import { createFeedbackBuilder } from './feedback-builder.js';
15
+ /**
16
+ * Default engine configuration
17
+ */
18
+ const DEFAULT_CONFIG = {
19
+ maxIterations: 10,
20
+ maxTokens: 100000,
21
+ maxDurationMinutes: 0,
22
+ iterationDelayMs: 500,
23
+ warningThreshold: 0.8,
24
+ maxConsecutiveFailures: 3,
25
+ allowUnlimited: false,
26
+ runVerification: true,
27
+ executeActions: true,
28
+ };
29
+ /**
30
+ * LoopEngine class - the heart of Ralph CLI
31
+ *
32
+ * Implements the Ralph pattern:
33
+ * 1. Send prompt to AI
34
+ * 2. Parse structured response for actions
35
+ * 3. Execute actions (CREATE, EDIT, DELETE, EXECUTE)
36
+ * 4. Run verification hooks (tests, build)
37
+ * 5. Build feedback for next iteration
38
+ * 6. Stop when COMPLETE action received AND verification passes
39
+ */
40
+ export class LoopEngine {
41
+ config;
42
+ agent;
43
+ events;
44
+ contextBuilder;
45
+ actionExecutor;
46
+ verificationManager;
47
+ feedbackBuilder;
48
+ state = null;
49
+ pauseRequested = false;
50
+ stopRequested = false;
51
+ consecutiveFailures = 0;
52
+ iterationWarningShown = false;
53
+ tokenWarningShown = false;
54
+ lastFeedback = '';
55
+ constructor(agent, config = {}) {
56
+ this.config = { ...DEFAULT_CONFIG, ...config };
57
+ this.agent = agent;
58
+ this.events = new LoopEventEmitter();
59
+ const cwd = config.cwd ?? process.cwd();
60
+ this.contextBuilder = new ContextBuilder(config.contextConfig, cwd);
61
+ this.actionExecutor = createActionExecutor({
62
+ cwd,
63
+ execute: this.config.executeActions !== false,
64
+ ...config.actionExecutorConfig,
65
+ });
66
+ this.verificationManager = createVerificationManager({
67
+ cwd,
68
+ ...config.verificationConfig,
69
+ });
70
+ this.feedbackBuilder = createFeedbackBuilder({
71
+ cwd,
72
+ ...config.feedbackConfig,
73
+ });
74
+ }
75
+ /**
76
+ * Get the event emitter for subscribing to loop events
77
+ */
78
+ getEvents() {
79
+ return this.events;
80
+ }
81
+ /**
82
+ * Get the current loop state
83
+ */
84
+ getState() {
85
+ return this.state;
86
+ }
87
+ /**
88
+ * Start the loop for a task
89
+ */
90
+ async start(task) {
91
+ if (this.state?.status === 'running') {
92
+ throw new Error('Loop is already running');
93
+ }
94
+ // Initialize state
95
+ this.state = createInitialState(task);
96
+ this.state.task.status = 'in-progress';
97
+ this.pauseRequested = false;
98
+ this.stopRequested = false;
99
+ debug(`Starting loop for task: ${task.title}`);
100
+ this.events.emit('start', task);
101
+ try {
102
+ // Ensure agent is initialized
103
+ if (!this.agent.isInitialized()) {
104
+ const initialized = await this.agent.initialize();
105
+ if (!initialized) {
106
+ throw new Error('Failed to initialize Copilot agent');
107
+ }
108
+ }
109
+ // Run the loop
110
+ await this.runLoop();
111
+ }
112
+ catch (err) {
113
+ const error = err instanceof Error ? err : new Error(String(err));
114
+ this.state.status = 'failed';
115
+ this.state.endedAt = new Date();
116
+ this.events.emit('error', error, this.state);
117
+ logError(`Loop failed: ${error.message}`);
118
+ }
119
+ return this.state;
120
+ }
121
+ /**
122
+ * Pause the current loop
123
+ */
124
+ pause() {
125
+ if (this.state?.status !== 'running') {
126
+ warn('No running loop to pause');
127
+ return;
128
+ }
129
+ info('Pause requested...');
130
+ this.pauseRequested = true;
131
+ }
132
+ /**
133
+ * Resume a paused loop
134
+ */
135
+ async resume() {
136
+ if (this.state?.status !== 'paused') {
137
+ warn('No paused loop to resume');
138
+ return null;
139
+ }
140
+ info('Resuming loop...');
141
+ this.pauseRequested = false;
142
+ this.state.status = 'running';
143
+ this.events.emit('resume', this.state);
144
+ try {
145
+ await this.runLoop();
146
+ }
147
+ catch (err) {
148
+ const error = err instanceof Error ? err : new Error(String(err));
149
+ this.state.status = 'failed';
150
+ this.state.endedAt = new Date();
151
+ this.events.emit('error', error, this.state);
152
+ }
153
+ return this.state;
154
+ }
155
+ /**
156
+ * Stop the current loop
157
+ */
158
+ stop() {
159
+ if (!this.state || this.state.status === 'completed' || this.state.status === 'stopped') {
160
+ warn('No active loop to stop');
161
+ return;
162
+ }
163
+ info('Stop requested...');
164
+ this.stopRequested = true;
165
+ }
166
+ /**
167
+ * The main loop execution
168
+ */
169
+ async runLoop() {
170
+ if (!this.state)
171
+ return;
172
+ while (this.shouldContinue()) {
173
+ // Check for pause request
174
+ if (this.pauseRequested) {
175
+ this.state.status = 'paused';
176
+ this.events.emit('pause', this.state);
177
+ debug('Loop paused');
178
+ return;
179
+ }
180
+ // Check for stop request
181
+ if (this.stopRequested) {
182
+ this.state.status = 'stopped';
183
+ this.state.endedAt = new Date();
184
+ this.events.emit('stop', this.state);
185
+ debug('Loop stopped');
186
+ return;
187
+ }
188
+ // Run iteration
189
+ await this.runIteration();
190
+ // Brief delay between iterations
191
+ if (this.shouldContinue()) {
192
+ await this.sleep(this.config.iterationDelayMs);
193
+ }
194
+ }
195
+ // Loop completed
196
+ this.state.status = 'completed';
197
+ this.state.endedAt = new Date();
198
+ this.state.task.status = 'completed';
199
+ this.events.emit('complete', this.state);
200
+ }
201
+ /**
202
+ * Check if the loop should continue
203
+ */
204
+ shouldContinue() {
205
+ if (!this.state)
206
+ return false;
207
+ // Check iteration limit
208
+ if (this.state.iteration >= this.config.maxIterations) {
209
+ debug(`Max iterations reached (${this.config.maxIterations})`);
210
+ return false;
211
+ }
212
+ // Check for unlimited iterations (>50 requires explicit flag)
213
+ if (this.config.maxIterations > 50 && !this.config.allowUnlimited) {
214
+ debug('More than 50 iterations requires --unlimited flag');
215
+ return false;
216
+ }
217
+ // Check token limit
218
+ if (this.state.tokensUsed >= this.config.maxTokens) {
219
+ debug(`Max tokens reached (${this.config.maxTokens})`);
220
+ return false;
221
+ }
222
+ // Check duration limit
223
+ if (this.config.maxDurationMinutes > 0) {
224
+ const elapsed = Date.now() - this.state.startedAt.getTime();
225
+ const maxDurationMs = this.config.maxDurationMinutes * 60 * 1000;
226
+ if (elapsed >= maxDurationMs) {
227
+ debug(`Max duration reached (${this.config.maxDurationMinutes} minutes)`);
228
+ return false;
229
+ }
230
+ }
231
+ // Check circuit breaker
232
+ if (this.consecutiveFailures >= this.config.maxConsecutiveFailures) {
233
+ debug(`Circuit breaker triggered after ${this.consecutiveFailures} consecutive failures`);
234
+ this.events.emit('warning', 'circuit-breaker', `${this.consecutiveFailures} consecutive iterations produced no changes. Pausing for review.`, this.state);
235
+ return false;
236
+ }
237
+ // Check task status
238
+ if (this.state.task.status === 'completed') {
239
+ debug('Task marked as complete');
240
+ return false;
241
+ }
242
+ // Emit threshold warnings
243
+ this.checkThresholds();
244
+ return true;
245
+ }
246
+ /**
247
+ * Check thresholds and emit warnings
248
+ */
249
+ checkThresholds() {
250
+ if (!this.state)
251
+ return;
252
+ const { iteration, tokensUsed, startedAt } = this.state;
253
+ const { maxIterations, maxTokens, maxDurationMinutes, warningThreshold } = this.config;
254
+ // Iteration threshold warning
255
+ const iterationRatio = iteration / maxIterations;
256
+ if (iterationRatio >= warningThreshold && !this.iterationWarningShown) {
257
+ this.iterationWarningShown = true;
258
+ this.events.emit('warning', 'iteration-threshold', `${iteration}/${maxIterations} iterations used (${Math.round(iterationRatio * 100)}%)`, this.state);
259
+ }
260
+ // Token threshold warning
261
+ const tokenRatio = tokensUsed / maxTokens;
262
+ if (tokenRatio >= warningThreshold && !this.tokenWarningShown) {
263
+ this.tokenWarningShown = true;
264
+ this.events.emit('warning', 'token-threshold', `Token usage at ${Math.round(tokenRatio * 100)}% of budget (${tokensUsed.toLocaleString()}/${maxTokens.toLocaleString()})`, this.state);
265
+ }
266
+ // Duration threshold warning
267
+ if (maxDurationMinutes > 0) {
268
+ const elapsed = Date.now() - startedAt.getTime();
269
+ const maxDurationMs = maxDurationMinutes * 60 * 1000;
270
+ const durationRatio = elapsed / maxDurationMs;
271
+ if (durationRatio >= warningThreshold) {
272
+ this.events.emit('warning', 'duration-threshold', `Duration at ${Math.round(durationRatio * 100)}% of limit`, this.state);
273
+ }
274
+ }
275
+ }
276
+ /**
277
+ * Run a single iteration (Ralph pattern)
278
+ */
279
+ async runIteration() {
280
+ if (!this.state)
281
+ return;
282
+ this.state.iteration++;
283
+ const record = createIterationRecord(this.state.iteration);
284
+ debug(`Starting iteration ${this.state.iteration}`);
285
+ this.events.emit('iterationStart', this.state.iteration, this.state);
286
+ try {
287
+ // Build context/prompt using the context builder
288
+ // Include feedback from previous iteration if available
289
+ const builtContext = await this.contextBuilder.buildContext(this.state.task, this.state.iteration, this.config.maxIterations, this.state.tokensUsed, this.config.maxTokens, this.state.iterations, this.lastFeedback || undefined);
290
+ if (builtContext.truncated) {
291
+ warn('Context was truncated to fit within token limits');
292
+ }
293
+ debug(`Context includes ${builtContext.filesIncluded.length} files, ~${builtContext.estimatedTokens} tokens`);
294
+ // Execute via agent
295
+ const result = await this.agent.execute(builtContext.prompt);
296
+ if (result.success && result.tokenUsage) {
297
+ // Reset consecutive failures counter on success
298
+ this.consecutiveFailures = 0;
299
+ // Update token usage
300
+ this.state.tokensUsed += result.tokenUsage.totalTokens;
301
+ // Emit token usage event
302
+ this.events.emit('tokenUsage', result.tokenUsage, this.agent.getTokenUsage());
303
+ const responseContent = result.content ?? '';
304
+ // === RALPH PATTERN: Parse → Execute → Verify → Feedback ===
305
+ // 1. Parse the AI response for structured actions
306
+ const parseResult = parseResponse(responseContent);
307
+ debug(`Parsed ${parseResult.actions.length} actions from response`);
308
+ // 2. Execute the actions
309
+ let executionResult = null;
310
+ if (parseResult.actions.length > 0 && this.config.executeActions) {
311
+ info(`Executing ${parseResult.actions.length} action(s)...`);
312
+ executionResult = await this.actionExecutor.executeAll(parseResult);
313
+ for (const actionResult of executionResult.results) {
314
+ const icon = actionResult.success ? '✓' : '✗';
315
+ debug(` ${icon} ${actionResult.message}`);
316
+ }
317
+ }
318
+ // 3. Check for COMPLETE action
319
+ const completeAction = getCompleteAction(parseResult);
320
+ let taskVerifiedComplete = false;
321
+ if (completeAction) {
322
+ info(`AI marked task complete: ${completeAction.reason}`);
323
+ // 4. Run verification hooks if enabled
324
+ if (this.config.runVerification) {
325
+ info('Running verification hooks...');
326
+ const verificationResults = await this.verificationManager.runAll();
327
+ const allPassed = this.verificationManager.allRequiredPassed(verificationResults);
328
+ for (const vr of verificationResults) {
329
+ const icon = vr.passed ? '✓' : '✗';
330
+ debug(` ${icon} ${vr.hookType}: ${vr.message}`);
331
+ }
332
+ if (allPassed) {
333
+ info('✓ All verification hooks passed - task complete!');
334
+ taskVerifiedComplete = true;
335
+ this.state.task.status = 'completed';
336
+ }
337
+ else {
338
+ warn('✗ Verification failed - continuing loop');
339
+ // Build feedback about verification failure
340
+ const feedback = await this.feedbackBuilder.buildComplete(executionResult, verificationResults, { suggestion: 'The AI marked the task complete, but verification failed. Review the test output and fix the issues.' });
341
+ this.lastFeedback = feedback.formatted;
342
+ }
343
+ }
344
+ else {
345
+ // No verification - trust the COMPLETE action
346
+ taskVerifiedComplete = true;
347
+ this.state.task.status = 'completed';
348
+ }
349
+ }
350
+ else if (executionResult) {
351
+ // 5. Build feedback for next iteration
352
+ const verificationResults = this.config.runVerification
353
+ ? await this.verificationManager.runAll()
354
+ : [];
355
+ const feedback = await this.feedbackBuilder.buildComplete(executionResult, verificationResults);
356
+ this.lastFeedback = feedback.formatted;
357
+ }
358
+ else {
359
+ // No actions parsed - AI returned prose instead of structured output
360
+ // Provide feedback to encourage structured output
361
+ this.lastFeedback = `## Feedback from Previous Iteration
362
+
363
+ The AI response did not contain structured ACTION blocks.
364
+
365
+ Please respond using the ACTION format:
366
+ - [ACTION:CREATE] to create files
367
+ - [ACTION:EDIT] to modify files
368
+ - [ACTION:EXECUTE] to run commands
369
+ - [ACTION:COMPLETE] when done
370
+
371
+ Do not write prose explanations. Use only ACTION blocks.`;
372
+ }
373
+ // Complete the iteration record
374
+ const summary = taskVerifiedComplete
375
+ ? `Task complete: ${completeAction?.reason ?? 'verified'}`
376
+ : this.extractSummary(responseContent);
377
+ const completedRecord = completeIteration(record, true, result.tokenUsage.totalTokens, summary);
378
+ this.state.iterations.push(completedRecord);
379
+ this.events.emit('iterationEnd', completedRecord, this.state);
380
+ }
381
+ else {
382
+ // Track consecutive failures
383
+ this.consecutiveFailures++;
384
+ // Failed iteration
385
+ const completedRecord = completeIteration(record, false, 0, undefined, result.error ?? 'Unknown error');
386
+ this.state.iterations.push(completedRecord);
387
+ this.events.emit('iterationEnd', completedRecord, this.state);
388
+ }
389
+ }
390
+ catch (err) {
391
+ // Track consecutive failures
392
+ this.consecutiveFailures++;
393
+ const error = err instanceof Error ? err : new Error(String(err));
394
+ const completedRecord = completeIteration(record, false, 0, undefined, error.message);
395
+ this.state.iterations.push(completedRecord);
396
+ this.events.emit('iterationEnd', completedRecord, this.state);
397
+ }
398
+ }
399
+ /**
400
+ * Extract a summary from the response
401
+ */
402
+ extractSummary(content) {
403
+ // Simple extraction - first 100 chars
404
+ const firstLine = content.split('\n')[0] ?? '';
405
+ return firstLine.length > 100 ? firstLine.substring(0, 100) + '...' : firstLine;
406
+ }
407
+ /**
408
+ * Sleep utility
409
+ */
410
+ sleep(ms) {
411
+ return new Promise((resolve) => setTimeout(resolve, ms));
412
+ }
413
+ /**
414
+ * Get token usage summary
415
+ */
416
+ getTokenUsage() {
417
+ return this.agent.getTokenUsage();
418
+ }
419
+ }
420
+ //# sourceMappingURL=loop-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-engine.js","sourceRoot":"","sources":["../../src/core/loop-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Loop Events
3
+ *
4
+ * Event emitter for loop lifecycle events
5
+ */
6
+ import { EventEmitter } from 'node:events';
7
+ import type { Task } from '../types/index.js';
8
+ import type { FullLoopState, IterationRecord } from './loop-state.js';
9
+ import type { TokenUsage } from '../integrations/index.js';
10
+ /**
11
+ * Warning type for threshold warnings
12
+ */
13
+ export type WarningType = 'iteration-threshold' | 'token-threshold' | 'duration-threshold' | 'circuit-breaker';
14
+ /**
15
+ * Loop lifecycle events
16
+ */
17
+ export interface LoopEvents {
18
+ /** Emitted when the loop starts */
19
+ start: [task: Task];
20
+ /** Emitted at the beginning of each iteration */
21
+ iterationStart: [iteration: number, state: FullLoopState];
22
+ /** Emitted at the end of each iteration */
23
+ iterationEnd: [record: IterationRecord, state: FullLoopState];
24
+ /** Emitted when the loop pauses */
25
+ pause: [state: FullLoopState];
26
+ /** Emitted when the loop resumes */
27
+ resume: [state: FullLoopState];
28
+ /** Emitted when the loop completes successfully */
29
+ complete: [state: FullLoopState];
30
+ /** Emitted when the loop fails */
31
+ error: [error: Error, state: FullLoopState];
32
+ /** Emitted when the loop is stopped */
33
+ stop: [state: FullLoopState];
34
+ /** Emitted when tokens are consumed */
35
+ tokenUsage: [usage: TokenUsage, totalUsage: TokenUsage];
36
+ /** Emitted when a warning threshold is reached */
37
+ warning: [type: WarningType, message: string, state: FullLoopState];
38
+ }
39
+ /**
40
+ * Type-safe event emitter for loop events
41
+ */
42
+ export declare class LoopEventEmitter extends EventEmitter {
43
+ emit<K extends keyof LoopEvents>(event: K, ...args: LoopEvents[K]): boolean;
44
+ on<K extends keyof LoopEvents>(event: K, listener: (...args: LoopEvents[K]) => void): this;
45
+ once<K extends keyof LoopEvents>(event: K, listener: (...args: LoopEvents[K]) => void): this;
46
+ off<K extends keyof LoopEvents>(event: K, listener: (...args: LoopEvents[K]) => void): this;
47
+ }
48
+ //# sourceMappingURL=loop-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-events.d.ts","sourceRoot":"","sources":["../../src/core/loop-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,iBAAiB,CAAC;AAE/G;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpB,iDAAiD;IACjD,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IAC1D,2CAA2C;IAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IAC9D,mCAAmC;IACnC,KAAK,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC9B,oCAAoC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC/B,mDAAmD;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACjC,kCAAkC;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IAC5C,uCAAuC;IACvC,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC7B,uCAAuC;IACvC,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACxD,kDAAkD;IAClD,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;CACrE;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IACvC,IAAI,CAAC,CAAC,SAAS,MAAM,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO;IAI3E,EAAE,CAAC,CAAC,SAAS,MAAM,UAAU,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,GACzC,IAAI;IAIE,IAAI,CAAC,CAAC,SAAS,MAAM,UAAU,EACtC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,GACzC,IAAI;IAIE,GAAG,CAAC,CAAC,SAAS,MAAM,UAAU,EACrC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,GACzC,IAAI;CAGR"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Loop Events
3
+ *
4
+ * Event emitter for loop lifecycle events
5
+ */
6
+ import { EventEmitter } from 'node:events';
7
+ /**
8
+ * Type-safe event emitter for loop events
9
+ */
10
+ export class LoopEventEmitter extends EventEmitter {
11
+ emit(event, ...args) {
12
+ return super.emit(event, ...args);
13
+ }
14
+ on(event, listener) {
15
+ return super.on(event, listener);
16
+ }
17
+ once(event, listener) {
18
+ return super.once(event, listener);
19
+ }
20
+ off(event, listener) {
21
+ return super.off(event, listener);
22
+ }
23
+ }
24
+ //# sourceMappingURL=loop-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-events.js","sourceRoot":"","sources":["../../src/core/loop-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoC3C;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IACvC,IAAI,CAA6B,KAAQ,EAAE,GAAG,IAAmB;QACxE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;IAEQ,EAAE,CACT,KAAQ,EACR,QAA0C;QAE1C,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAwC,CAAC,CAAC;IACnE,CAAC;IAEQ,IAAI,CACX,KAAQ,EACR,QAA0C;QAE1C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAwC,CAAC,CAAC;IACrE,CAAC;IAEQ,GAAG,CACV,KAAQ,EACR,QAA0C;QAE1C,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAwC,CAAC,CAAC;IACpE,CAAC;CACF"}