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.
- package/LICENSE +21 -0
- package/README.md +327 -0
- package/bin/ghcralph.js +2 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +92 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +118 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.d.ts +11 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +116 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/rollback.d.ts +8 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +238 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/run.d.ts +28 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +407 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +399 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/action-executor.d.ts +96 -0
- package/dist/core/action-executor.d.ts.map +1 -0
- package/dist/core/action-executor.js +289 -0
- package/dist/core/action-executor.js.map +1 -0
- package/dist/core/checkpoint-manager.d.ts +94 -0
- package/dist/core/checkpoint-manager.d.ts.map +1 -0
- package/dist/core/checkpoint-manager.js +236 -0
- package/dist/core/checkpoint-manager.js.map +1 -0
- package/dist/core/config-manager.d.ts +62 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +184 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/config-schema.d.ts +74 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +84 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/context-builder.d.ts +116 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +388 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/feedback-builder.d.ts +94 -0
- package/dist/core/feedback-builder.d.ts.map +1 -0
- package/dist/core/feedback-builder.js +226 -0
- package/dist/core/feedback-builder.js.map +1 -0
- package/dist/core/file-safeguard.d.ts +109 -0
- package/dist/core/file-safeguard.d.ts.map +1 -0
- package/dist/core/file-safeguard.js +200 -0
- package/dist/core/file-safeguard.js.map +1 -0
- package/dist/core/git-branch-manager.d.ts +122 -0
- package/dist/core/git-branch-manager.d.ts.map +1 -0
- package/dist/core/git-branch-manager.js +302 -0
- package/dist/core/git-branch-manager.js.map +1 -0
- package/dist/core/github-plan.d.ts +86 -0
- package/dist/core/github-plan.d.ts.map +1 -0
- package/dist/core/github-plan.js +333 -0
- package/dist/core/github-plan.js.map +1 -0
- package/dist/core/index.d.ts +43 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +26 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/local-markdown-plan.d.ts +65 -0
- package/dist/core/local-markdown-plan.d.ts.map +1 -0
- package/dist/core/local-markdown-plan.js +154 -0
- package/dist/core/local-markdown-plan.js.map +1 -0
- package/dist/core/loop-engine.d.ts +133 -0
- package/dist/core/loop-engine.d.ts.map +1 -0
- package/dist/core/loop-engine.js +420 -0
- package/dist/core/loop-engine.js.map +1 -0
- package/dist/core/loop-events.d.ts +48 -0
- package/dist/core/loop-events.d.ts.map +1 -0
- package/dist/core/loop-events.js +24 -0
- package/dist/core/loop-events.js.map +1 -0
- package/dist/core/loop-state.d.ts +51 -0
- package/dist/core/loop-state.d.ts.map +1 -0
- package/dist/core/loop-state.js +48 -0
- package/dist/core/loop-state.js.map +1 -0
- package/dist/core/markdown-parser.d.ts +51 -0
- package/dist/core/markdown-parser.d.ts.map +1 -0
- package/dist/core/markdown-parser.js +122 -0
- package/dist/core/markdown-parser.js.map +1 -0
- package/dist/core/plan-manager.d.ts +61 -0
- package/dist/core/plan-manager.d.ts.map +1 -0
- package/dist/core/plan-manager.js +7 -0
- package/dist/core/plan-manager.js.map +1 -0
- package/dist/core/progress-tracker.d.ts +74 -0
- package/dist/core/progress-tracker.d.ts.map +1 -0
- package/dist/core/progress-tracker.js +198 -0
- package/dist/core/progress-tracker.js.map +1 -0
- package/dist/core/prompt-examples.d.ts +52 -0
- package/dist/core/prompt-examples.d.ts.map +1 -0
- package/dist/core/prompt-examples.js +194 -0
- package/dist/core/prompt-examples.js.map +1 -0
- package/dist/core/response-parser.d.ts +90 -0
- package/dist/core/response-parser.d.ts.map +1 -0
- package/dist/core/response-parser.js +209 -0
- package/dist/core/response-parser.js.map +1 -0
- package/dist/core/verification-hooks.d.ts +103 -0
- package/dist/core/verification-hooks.d.ts.map +1 -0
- package/dist/core/verification-hooks.js +268 -0
- package/dist/core/verification-hooks.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/auth.d.ts +28 -0
- package/dist/integrations/auth.d.ts.map +1 -0
- package/dist/integrations/auth.js +76 -0
- package/dist/integrations/auth.js.map +1 -0
- package/dist/integrations/copilot-agent.d.ts +104 -0
- package/dist/integrations/copilot-agent.d.ts.map +1 -0
- package/dist/integrations/copilot-agent.js +235 -0
- package/dist/integrations/copilot-agent.js.map +1 -0
- package/dist/integrations/index.d.ts +18 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +14 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/mcp-tools.d.ts +129 -0
- package/dist/integrations/mcp-tools.d.ts.map +1 -0
- package/dist/integrations/mcp-tools.js +272 -0
- package/dist/integrations/mcp-tools.js.map +1 -0
- package/dist/integrations/tokens.d.ts +45 -0
- package/dist/integrations/tokens.d.ts.map +1 -0
- package/dist/integrations/tokens.js +50 -0
- package/dist/integrations/tokens.js.map +1 -0
- package/dist/types/index.d.ts +53 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +23 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +37 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/output.d.ts +59 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +96 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/paths.d.ts +34 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +67 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/shell.d.ts +26 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +65 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/validation.d.ts +27 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +43 -0
- package/dist/utils/validation.js.map +1 -0
- 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":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAA6B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAA6B,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAA2B,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAA8B,MAAM,uBAAuB,CAAC;AAuC1F;;GAEG;AACH,MAAM,cAAc,GAAqB;IACvC,aAAa,EAAE,EAAE;IACjB,SAAS,EAAE,MAAM;IACjB,kBAAkB,EAAE,CAAC;IACrB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,sBAAsB,EAAE,CAAC;IACzB,cAAc,EAAE,KAAK;IACrB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;CACrB,CAAC;AAeF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAmB;IACzB,KAAK,CAAe;IACpB,MAAM,CAAmB;IACzB,cAAc,CAAiB;IAC/B,cAAc,CAAiB;IAC/B,mBAAmB,CAAsB;IACzC,eAAe,CAAkB;IACjC,KAAK,GAAyB,IAAI,CAAC;IACnC,cAAc,GAAY,KAAK,CAAC;IAChC,aAAa,GAAY,KAAK,CAAC;IAC/B,mBAAmB,GAAW,CAAC,CAAC;IAChC,qBAAqB,GAAY,KAAK,CAAC;IACvC,iBAAiB,GAAY,KAAK,CAAC;IACnC,YAAY,GAAW,EAAE,CAAC;IAElC,YAAY,KAAmB,EAAE,SAAoC,EAAE;QACrE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAErC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAExC,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,cAAc,GAAG,oBAAoB,CAAC;YACzC,GAAG;YACH,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,KAAK;YAC7C,GAAG,MAAM,CAAC,oBAAoB;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,mBAAmB,GAAG,yBAAyB,CAAC;YACnD,GAAG;YACH,GAAG,MAAM,CAAC,kBAAkB;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC;YAC3C,GAAG;YACH,GAAG,MAAM,CAAC,cAAc;SACzB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,IAAU;QACpB,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,KAAK,CAAC,2BAA2B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,8BAA8B;YAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;gBAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBAClD,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YAED,eAAe;YACf,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7C,QAAQ,CAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACxF,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAExB,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC7B,0BAA0B;YAC1B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,yBAAyB;YACzB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,gBAAgB;YAChB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAE1B,iCAAiC;YACjC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAE9B,wBAAwB;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACtD,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAClE,KAAK,CAAC,mDAAmD,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACnD,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;YACjE,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;gBAC7B,KAAK,CAAC,yBAAyB,IAAI,CAAC,MAAM,CAAC,kBAAkB,WAAW,CAAC,CAAC;gBAC1E,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;YACnE,KAAK,CAAC,mCAAmC,IAAI,CAAC,mBAAmB,uBAAuB,CAAC,CAAC;YAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAC3C,GAAG,IAAI,CAAC,mBAAmB,kEAAkE,EAC7F,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3C,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAExB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACxD,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAEvF,8BAA8B;QAC9B,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,CAAC;QACjD,IAAI,cAAc,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAC/C,GAAG,SAAS,IAAI,aAAa,qBAAqB,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,IAAI,EACtF,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;QAC1C,IAAI,UAAU,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAC3C,kBAAkB,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,gBAAgB,UAAU,CAAC,cAAc,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,GAAG,EAC1H,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;QAED,6BAA6B;QAC7B,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,aAAa,GAAG,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;YACrD,MAAM,aAAa,GAAG,OAAO,GAAG,aAAa,CAAC;YAC9C,IAAI,aAAa,IAAI,gBAAgB,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,EAC9C,eAAe,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,YAAY,EAC1D,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAExB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE3D,KAAK,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,iDAAiD;YACjD,wDAAwD;YACxD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CACzD,IAAI,CAAC,KAAK,CAAC,IAAI,EACf,IAAI,CAAC,KAAK,CAAC,SAAS,EACpB,IAAI,CAAC,MAAM,CAAC,aAAa,EACzB,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB,IAAI,CAAC,YAAY,IAAI,SAAS,CAC/B,CAAC;YAEF,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAC3D,CAAC;YAED,KAAK,CAAC,oBAAoB,YAAY,CAAC,aAAa,CAAC,MAAM,YAAY,YAAY,CAAC,eAAe,SAAS,CAAC,CAAC;YAE9G,oBAAoB;YACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE7D,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACxC,gDAAgD;gBAChD,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBAE7B,qBAAqB;gBACrB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;gBAEvD,yBAAyB;gBACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;gBAE9E,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBAE7C,6DAA6D;gBAE7D,kDAAkD;gBAClD,MAAM,WAAW,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;gBACnD,KAAK,CAAC,UAAU,WAAW,CAAC,OAAO,CAAC,MAAM,wBAAwB,CAAC,CAAC;gBAEpE,yBAAyB;gBACzB,IAAI,eAAe,GAAG,IAAI,CAAC;gBAC3B,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBACjE,IAAI,CAAC,aAAa,WAAW,CAAC,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;oBAC7D,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;oBAEpE,KAAK,MAAM,YAAY,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;wBACnD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;wBAC9C,KAAK,CAAC,KAAK,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBAED,+BAA+B;gBAC/B,MAAM,cAAc,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBACtD,IAAI,oBAAoB,GAAG,KAAK,CAAC;gBAEjC,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC,4BAA4B,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;oBAE1D,uCAAuC;oBACvC,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;wBAChC,IAAI,CAAC,+BAA+B,CAAC,CAAC;wBACtC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;wBAEpE,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;wBAElF,KAAK,MAAM,EAAE,IAAI,mBAAmB,EAAE,CAAC;4BACrC,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;4BACnC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;wBACnD,CAAC;wBAED,IAAI,SAAS,EAAE,CAAC;4BACd,IAAI,CAAC,kDAAkD,CAAC,CAAC;4BACzD,oBAAoB,GAAG,IAAI,CAAC;4BAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;wBACvC,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,yCAAyC,CAAC,CAAC;4BAChD,4CAA4C;4BAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CACvD,eAAe,EACf,mBAAmB,EACnB,EAAE,UAAU,EAAE,sGAAsG,EAAE,CACvH,CAAC;4BACF,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC;wBACzC,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,8CAA8C;wBAC9C,oBAAoB,GAAG,IAAI,CAAC;wBAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;oBACvC,CAAC;gBACH,CAAC;qBAAM,IAAI,eAAe,EAAE,CAAC;oBAC3B,uCAAuC;oBACvC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;wBACrD,CAAC,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;wBACzC,CAAC,CAAC,EAAE,CAAC;oBAEP,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CACvD,eAAe,EACf,mBAAmB,CACpB,CAAC;oBACF,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,qEAAqE;oBACrE,kDAAkD;oBAClD,IAAI,CAAC,YAAY,GAAG;;;;;;;;;;yDAU2B,CAAC;gBAClD,CAAC;gBAED,gCAAgC;gBAChC,MAAM,OAAO,GAAG,oBAAoB;oBAClC,CAAC,CAAC,kBAAkB,cAAc,EAAE,MAAM,IAAI,UAAU,EAAE;oBAC1D,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;gBAEzC,MAAM,eAAe,GAAG,iBAAiB,CACvC,MAAM,EACN,IAAI,EACJ,MAAM,CAAC,UAAU,CAAC,WAAW,EAC7B,OAAO,CACR,CAAC;gBAEF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAE3B,mBAAmB;gBACnB,MAAM,eAAe,GAAG,iBAAiB,CACvC,MAAM,EACN,KAAK,EACL,CAAC,EACD,SAAS,EACT,MAAM,CAAC,KAAK,IAAI,eAAe,CAChC,CAAC;gBAEF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6BAA6B;YAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAe;QACpC,sCAAsC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -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"}
|