@litmers/cursorflow-orchestrator 0.1.40 → 0.2.3
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/CHANGELOG.md +0 -2
- package/README.md +8 -3
- package/commands/cursorflow-init.md +0 -4
- package/dist/cli/index.js +0 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/logs.js +108 -9
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/models.js +20 -3
- package/dist/cli/models.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -10
- package/dist/cli/monitor.js +1103 -1239
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/resume.js +21 -1
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +28 -9
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/signal.d.ts +6 -1
- package/dist/cli/signal.js +99 -13
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/tasks.js +3 -46
- package/dist/cli/tasks.js.map +1 -1
- package/dist/core/agent-supervisor.d.ts +23 -0
- package/dist/core/agent-supervisor.js +42 -0
- package/dist/core/agent-supervisor.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +3 -117
- package/dist/core/auto-recovery.js +4 -482
- package/dist/core/auto-recovery.js.map +1 -1
- package/dist/core/failure-policy.d.ts +0 -53
- package/dist/core/failure-policy.js +7 -175
- package/dist/core/failure-policy.js.map +1 -1
- package/dist/core/git-lifecycle-manager.d.ts +284 -0
- package/dist/core/git-lifecycle-manager.js +778 -0
- package/dist/core/git-lifecycle-manager.js.map +1 -0
- package/dist/core/git-pipeline-coordinator.d.ts +21 -0
- package/dist/core/git-pipeline-coordinator.js +205 -0
- package/dist/core/git-pipeline-coordinator.js.map +1 -0
- package/dist/core/intervention.d.ts +170 -0
- package/dist/core/intervention.js +408 -0
- package/dist/core/intervention.js.map +1 -0
- package/dist/core/lane-state-machine.d.ts +423 -0
- package/dist/core/lane-state-machine.js +890 -0
- package/dist/core/lane-state-machine.js.map +1 -0
- package/dist/core/orchestrator.d.ts +4 -1
- package/dist/core/orchestrator.js +39 -65
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/runner/agent.d.ts +7 -1
- package/dist/core/runner/agent.js +54 -36
- package/dist/core/runner/agent.js.map +1 -1
- package/dist/core/runner/pipeline.js +283 -123
- package/dist/core/runner/pipeline.js.map +1 -1
- package/dist/core/runner/task.d.ts +4 -5
- package/dist/core/runner/task.js +6 -80
- package/dist/core/runner/task.js.map +1 -1
- package/dist/core/runner.js +8 -2
- package/dist/core/runner.js.map +1 -1
- package/dist/core/stall-detection.d.ts +11 -4
- package/dist/core/stall-detection.js +64 -27
- package/dist/core/stall-detection.js.map +1 -1
- package/dist/hooks/contexts/index.d.ts +104 -0
- package/dist/hooks/contexts/index.js +134 -0
- package/dist/hooks/contexts/index.js.map +1 -0
- package/dist/hooks/data-accessor.d.ts +86 -0
- package/dist/hooks/data-accessor.js +410 -0
- package/dist/hooks/data-accessor.js.map +1 -0
- package/dist/hooks/flow-controller.d.ts +136 -0
- package/dist/hooks/flow-controller.js +351 -0
- package/dist/hooks/flow-controller.js.map +1 -0
- package/dist/hooks/index.d.ts +68 -0
- package/dist/hooks/index.js +105 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/manager.d.ts +129 -0
- package/dist/hooks/manager.js +389 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/types.d.ts +463 -0
- package/dist/hooks/types.js +45 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/services/logging/buffer.d.ts +2 -2
- package/dist/services/logging/buffer.js +95 -42
- package/dist/services/logging/buffer.js.map +1 -1
- package/dist/services/logging/console.js +6 -1
- package/dist/services/logging/console.js.map +1 -1
- package/dist/services/logging/formatter.d.ts +9 -4
- package/dist/services/logging/formatter.js +64 -18
- package/dist/services/logging/formatter.js.map +1 -1
- package/dist/services/logging/index.d.ts +0 -1
- package/dist/services/logging/index.js +0 -1
- package/dist/services/logging/index.js.map +1 -1
- package/dist/services/logging/paths.d.ts +8 -0
- package/dist/services/logging/paths.js +48 -0
- package/dist/services/logging/paths.js.map +1 -0
- package/dist/services/logging/raw-log.d.ts +6 -0
- package/dist/services/logging/raw-log.js +37 -0
- package/dist/services/logging/raw-log.js.map +1 -0
- package/dist/services/process/index.js +1 -1
- package/dist/services/process/index.js.map +1 -1
- package/dist/types/agent.d.ts +15 -0
- package/dist/types/config.d.ts +22 -1
- package/dist/types/event-categories.d.ts +601 -0
- package/dist/types/event-categories.js +233 -0
- package/dist/types/event-categories.js.map +1 -0
- package/dist/types/events.d.ts +0 -20
- package/dist/types/flow.d.ts +10 -6
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +17 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/lane.d.ts +1 -1
- package/dist/types/logging.d.ts +1 -1
- package/dist/types/task.d.ts +12 -1
- package/dist/ui/log-viewer.d.ts +3 -0
- package/dist/ui/log-viewer.js +3 -0
- package/dist/ui/log-viewer.js.map +1 -1
- package/dist/utils/config.js +10 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.d.ts +11 -1
- package/dist/utils/cursor-agent.js +63 -16
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +5 -1
- package/dist/utils/enhanced-logger.js +98 -19
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/event-registry.d.ts +222 -0
- package/dist/utils/event-registry.js +463 -0
- package/dist/utils/event-registry.js.map +1 -0
- package/dist/utils/events.d.ts +1 -13
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/flow.d.ts +10 -0
- package/dist/utils/flow.js +75 -0
- package/dist/utils/flow.js.map +1 -1
- package/dist/utils/log-constants.d.ts +1 -0
- package/dist/utils/log-constants.js +2 -1
- package/dist/utils/log-constants.js.map +1 -1
- package/dist/utils/log-formatter.d.ts +2 -1
- package/dist/utils/log-formatter.js +10 -10
- package/dist/utils/log-formatter.js.map +1 -1
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.js +82 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/repro-thinking-logs.js +0 -13
- package/dist/utils/repro-thinking-logs.js.map +1 -1
- package/dist/utils/run-service.js +1 -1
- package/dist/utils/run-service.js.map +1 -1
- package/examples/README.md +0 -2
- package/examples/demo-project/README.md +1 -2
- package/package.json +13 -34
- package/scripts/setup-security.sh +0 -1
- package/scripts/test-log-parser.ts +171 -0
- package/scripts/verify-change.sh +272 -0
- package/src/cli/index.ts +0 -6
- package/src/cli/logs.ts +121 -10
- package/src/cli/models.ts +20 -3
- package/src/cli/monitor.ts +1273 -1342
- package/src/cli/resume.ts +27 -1
- package/src/cli/run.ts +29 -11
- package/src/cli/signal.ts +120 -18
- package/src/cli/tasks.ts +2 -59
- package/src/core/agent-supervisor.ts +64 -0
- package/src/core/auto-recovery.ts +14 -590
- package/src/core/failure-policy.ts +7 -229
- package/src/core/git-lifecycle-manager.ts +1011 -0
- package/src/core/git-pipeline-coordinator.ts +221 -0
- package/src/core/intervention.ts +463 -0
- package/src/core/lane-state-machine.ts +1097 -0
- package/src/core/orchestrator.ts +48 -64
- package/src/core/runner/agent.ts +77 -39
- package/src/core/runner/pipeline.ts +318 -138
- package/src/core/runner/task.ts +12 -97
- package/src/core/runner.ts +8 -2
- package/src/core/stall-detection.ts +74 -27
- package/src/hooks/contexts/index.ts +256 -0
- package/src/hooks/data-accessor.ts +488 -0
- package/src/hooks/flow-controller.ts +425 -0
- package/src/hooks/index.ts +154 -0
- package/src/hooks/manager.ts +434 -0
- package/src/hooks/types.ts +544 -0
- package/src/services/logging/buffer.ts +104 -43
- package/src/services/logging/console.ts +7 -1
- package/src/services/logging/formatter.ts +74 -18
- package/src/services/logging/index.ts +0 -2
- package/src/services/logging/paths.ts +14 -0
- package/src/services/logging/raw-log.ts +43 -0
- package/src/services/process/index.ts +1 -1
- package/src/types/agent.ts +15 -0
- package/src/types/config.ts +23 -1
- package/src/types/event-categories.ts +663 -0
- package/src/types/events.ts +0 -25
- package/src/types/flow.ts +10 -6
- package/src/types/index.ts +50 -4
- package/src/types/lane.ts +1 -2
- package/src/types/logging.ts +2 -1
- package/src/types/task.ts +12 -1
- package/src/ui/log-viewer.ts +3 -0
- package/src/utils/config.ts +11 -1
- package/src/utils/cursor-agent.ts +68 -16
- package/src/utils/enhanced-logger.ts +105 -19
- package/src/utils/event-registry.ts +595 -0
- package/src/utils/events.ts +0 -16
- package/src/utils/flow.ts +83 -0
- package/src/utils/log-constants.ts +2 -1
- package/src/utils/log-formatter.ts +10 -11
- package/src/utils/logger.ts +49 -3
- package/src/utils/repro-thinking-logs.ts +0 -15
- package/src/utils/run-service.ts +1 -1
- package/dist/cli/prepare.d.ts +0 -7
- package/dist/cli/prepare.js +0 -690
- package/dist/cli/prepare.js.map +0 -1
- package/dist/services/logging/file-writer.d.ts +0 -71
- package/dist/services/logging/file-writer.js +0 -516
- package/dist/services/logging/file-writer.js.map +0 -1
- package/dist/types/review.d.ts +0 -17
- package/dist/types/review.js +0 -6
- package/dist/types/review.js.map +0 -1
- package/scripts/ai-security-check.js +0 -233
- package/src/cli/prepare.ts +0 -777
- package/src/services/logging/file-writer.ts +0 -526
- package/src/types/review.ts +0 -20
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CursorFlow Hook System - Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* 외부 개발자가 Supervisor AI, 모니터링 시스템 등을 구현할 수 있도록
|
|
5
|
+
* 제공하는 Hook API의 타입 정의입니다.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { hooks, HookPoint, HookContext } from '@litmers/cursorflow-orchestrator';
|
|
10
|
+
*
|
|
11
|
+
* hooks.register({
|
|
12
|
+
* point: HookPoint.AFTER_TASK,
|
|
13
|
+
* mode: 'sync',
|
|
14
|
+
* handler: async (ctx) => {
|
|
15
|
+
* const files = await ctx.getData.git.getChangedFiles();
|
|
16
|
+
* // ... your logic
|
|
17
|
+
* },
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Hook Point Definitions
|
|
24
|
+
// ============================================================================
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Hook Point - Hook이 트리거되는 시점
|
|
28
|
+
*
|
|
29
|
+
* 5개의 핵심 Hook Point만 제공하여 단순성을 유지합니다.
|
|
30
|
+
*/
|
|
31
|
+
export enum HookPoint {
|
|
32
|
+
/** 태스크 실행 직전 - 프롬프트 검토/수정, 사전 조건 검증 */
|
|
33
|
+
BEFORE_TASK = 'beforeTask',
|
|
34
|
+
/** 태스크 완료 직후 - 결과 리뷰, 품질 검사, 추가 태스크 삽입 */
|
|
35
|
+
AFTER_TASK = 'afterTask',
|
|
36
|
+
/** 에러 발생 시 - 에러 분석, 복구 전략 결정 */
|
|
37
|
+
ON_ERROR = 'onError',
|
|
38
|
+
/** 응답 없음 감지 시 - 상황 분석, 개입 메시지 전송 */
|
|
39
|
+
ON_STALL = 'onStall',
|
|
40
|
+
/** Lane 종료 시 - 최종 리뷰, 보고서 생성 */
|
|
41
|
+
ON_LANE_END = 'onLaneEnd',
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Hook 실행 모드
|
|
46
|
+
*/
|
|
47
|
+
export type HookMode = 'sync' | 'async';
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Data Types
|
|
51
|
+
// ============================================================================
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Git 변경 파일 정보
|
|
55
|
+
*/
|
|
56
|
+
export interface ChangedFile {
|
|
57
|
+
/** 파일 경로 */
|
|
58
|
+
path: string;
|
|
59
|
+
/** 변경 상태 */
|
|
60
|
+
status: 'added' | 'modified' | 'deleted' | 'renamed';
|
|
61
|
+
/** 추가된 라인 수 */
|
|
62
|
+
additions: number;
|
|
63
|
+
/** 삭제된 라인 수 */
|
|
64
|
+
deletions: number;
|
|
65
|
+
/** 개별 파일 diff (선택적 로드) */
|
|
66
|
+
diff?: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Git 커밋 정보
|
|
71
|
+
*/
|
|
72
|
+
export interface Commit {
|
|
73
|
+
/** 커밋 해시 */
|
|
74
|
+
hash: string;
|
|
75
|
+
/** 커밋 메시지 */
|
|
76
|
+
message: string;
|
|
77
|
+
/** 작성자 */
|
|
78
|
+
author: string;
|
|
79
|
+
/** 작성 일시 */
|
|
80
|
+
date: string;
|
|
81
|
+
/** 변경된 파일 목록 */
|
|
82
|
+
files: string[];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 대화 메시지
|
|
87
|
+
*/
|
|
88
|
+
export interface Message {
|
|
89
|
+
/** 메시지 역할 */
|
|
90
|
+
role: 'user' | 'assistant' | 'system';
|
|
91
|
+
/** 메시지 내용 */
|
|
92
|
+
content: string;
|
|
93
|
+
/** 타임스탬프 (ISO 8601) */
|
|
94
|
+
timestamp: string;
|
|
95
|
+
/** 해당 태스크 이름 */
|
|
96
|
+
taskName?: string;
|
|
97
|
+
/** 추가 메타데이터 */
|
|
98
|
+
metadata?: Record<string, any>;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* 태스크 실행 결과
|
|
103
|
+
*/
|
|
104
|
+
export interface TaskResult {
|
|
105
|
+
/** 태스크 이름 */
|
|
106
|
+
name: string;
|
|
107
|
+
/** 실행 상태 */
|
|
108
|
+
status: 'success' | 'error' | 'blocked' | 'skipped';
|
|
109
|
+
/** 소요 시간 (ms) */
|
|
110
|
+
duration: number;
|
|
111
|
+
/** 출력 결과 */
|
|
112
|
+
output?: string;
|
|
113
|
+
/** 에러 메시지 */
|
|
114
|
+
error?: string;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 태스크 정의 (새 태스크 삽입 시 사용)
|
|
119
|
+
*/
|
|
120
|
+
export interface TaskDefinition {
|
|
121
|
+
/** 태스크 이름 */
|
|
122
|
+
name: string;
|
|
123
|
+
/** 프롬프트 */
|
|
124
|
+
prompt: string;
|
|
125
|
+
/** AI 모델 (선택) */
|
|
126
|
+
model?: string;
|
|
127
|
+
/** 타임아웃 (ms, 선택) */
|
|
128
|
+
timeout?: number;
|
|
129
|
+
/** 의존성 태스크 (선택) */
|
|
130
|
+
dependsOn?: string[];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Tool Call 정보 (AI가 호출한 도구)
|
|
135
|
+
*/
|
|
136
|
+
export interface ToolCall {
|
|
137
|
+
/** 도구 이름 */
|
|
138
|
+
name: string;
|
|
139
|
+
/** 파라미터 */
|
|
140
|
+
parameters: Record<string, any>;
|
|
141
|
+
/** 결과 */
|
|
142
|
+
result?: any;
|
|
143
|
+
/** 타임스탬프 */
|
|
144
|
+
timestamp: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* 에러 로그 항목
|
|
149
|
+
*/
|
|
150
|
+
export interface ErrorLog {
|
|
151
|
+
/** 로그 레벨 */
|
|
152
|
+
level: 'error' | 'warn';
|
|
153
|
+
/** 메시지 */
|
|
154
|
+
message: string;
|
|
155
|
+
/** 타임스탬프 */
|
|
156
|
+
timestamp: string;
|
|
157
|
+
/** 추가 컨텍스트 */
|
|
158
|
+
context?: Record<string, any>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 의존성 태스크 결과 (dependsOn으로 지정된 태스크의 결과)
|
|
163
|
+
*/
|
|
164
|
+
export interface DependencyResult {
|
|
165
|
+
/** 의존성 태스크 이름 */
|
|
166
|
+
taskName: string;
|
|
167
|
+
/** Lane 이름 */
|
|
168
|
+
laneName: string;
|
|
169
|
+
/** 실행 상태 */
|
|
170
|
+
status: 'success' | 'error' | 'pending';
|
|
171
|
+
/** 출력 결과 */
|
|
172
|
+
output?: string;
|
|
173
|
+
/** 브랜치 이름 */
|
|
174
|
+
branch?: string;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ============================================================================
|
|
178
|
+
// Data Accessor Interface
|
|
179
|
+
// ============================================================================
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Hook에서 데이터에 접근하기 위한 인터페이스
|
|
183
|
+
*
|
|
184
|
+
* 모든 메서드는 Lazy Loading으로 필요할 때만 데이터를 로드합니다.
|
|
185
|
+
*/
|
|
186
|
+
export interface HookDataAccessor {
|
|
187
|
+
/**
|
|
188
|
+
* Git 관련 데이터 접근
|
|
189
|
+
*/
|
|
190
|
+
git: {
|
|
191
|
+
/** 현재 태스크에서 수정된 파일 목록 */
|
|
192
|
+
getChangedFiles(): Promise<ChangedFile[]>;
|
|
193
|
+
/** 현재 브랜치의 전체 diff */
|
|
194
|
+
getDiff(): Promise<string>;
|
|
195
|
+
/** 최근 N개 커밋 (기본: 10) */
|
|
196
|
+
getRecentCommits(count?: number): Promise<Commit[]>;
|
|
197
|
+
/** 현재 브랜치 이름 */
|
|
198
|
+
getCurrentBranch(): string;
|
|
199
|
+
/** 충돌 파일 목록 (있는 경우) */
|
|
200
|
+
getConflictFiles(): Promise<string[]>;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* 대화 기록 접근
|
|
205
|
+
*/
|
|
206
|
+
conversation: {
|
|
207
|
+
/** 현재 태스크의 대화 기록 */
|
|
208
|
+
getCurrentTaskMessages(): Promise<Message[]>;
|
|
209
|
+
/** 전체 Lane의 대화 기록 */
|
|
210
|
+
getAllMessages(): Promise<Message[]>;
|
|
211
|
+
/** 최근 N개 메시지 (기본: 10) */
|
|
212
|
+
getRecentMessages(count?: number): Promise<Message[]>;
|
|
213
|
+
/** AI의 마지막 응답 */
|
|
214
|
+
getLastResponse(): Promise<string | null>;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* 태스크 상태 접근
|
|
219
|
+
*/
|
|
220
|
+
tasks: {
|
|
221
|
+
/** 완료된 태스크 목록 */
|
|
222
|
+
getCompletedTasks(): TaskResult[];
|
|
223
|
+
/** 남은 태스크 목록 */
|
|
224
|
+
getPendingTasks(): TaskDefinition[];
|
|
225
|
+
/** 특정 태스크의 결과 */
|
|
226
|
+
getTaskResult(taskName: string): TaskResult | null;
|
|
227
|
+
/** 의존성 태스크 결과 (dependsOn으로 지정된) */
|
|
228
|
+
getDependencyResults(): DependencyResult[];
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* 로그/출력 접근
|
|
233
|
+
*/
|
|
234
|
+
logs: {
|
|
235
|
+
/** 현재 태스크의 raw 출력 */
|
|
236
|
+
getRawOutput(): Promise<string>;
|
|
237
|
+
/** 파싱된 tool_call 목록 */
|
|
238
|
+
getToolCalls(): Promise<ToolCall[]>;
|
|
239
|
+
/** 에러 로그 */
|
|
240
|
+
getErrors(): Promise<ErrorLog[]>;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* 타이밍 정보
|
|
245
|
+
*/
|
|
246
|
+
timing: {
|
|
247
|
+
/** 태스크 시작 시간 (Unix timestamp) */
|
|
248
|
+
taskStartTime: number;
|
|
249
|
+
/** Lane 시작 시간 (Unix timestamp) */
|
|
250
|
+
laneStartTime: number;
|
|
251
|
+
/** 현재 태스크 소요 시간 (ms) */
|
|
252
|
+
getElapsedTime(): number;
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// ============================================================================
|
|
257
|
+
// Flow Controller Interface
|
|
258
|
+
// ============================================================================
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* AI 호출 옵션
|
|
262
|
+
*/
|
|
263
|
+
export interface AICallOptions {
|
|
264
|
+
/** 사용할 모델 */
|
|
265
|
+
model?: string;
|
|
266
|
+
/** 타임아웃 (ms) */
|
|
267
|
+
timeout?: number;
|
|
268
|
+
/** 추가 컨텍스트 */
|
|
269
|
+
context?: Record<string, any>;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* 플로우 제어 인터페이스
|
|
274
|
+
*
|
|
275
|
+
* Hook 핸들러에서 실행 플로우를 제어하기 위한 메서드들을 제공합니다.
|
|
276
|
+
*/
|
|
277
|
+
export interface FlowController {
|
|
278
|
+
// === 플로우 제어 ===
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* 플로우 일시 중지
|
|
282
|
+
* @param reason 중지 사유
|
|
283
|
+
*/
|
|
284
|
+
pause(reason: string): Promise<void>;
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* 플로우 재개
|
|
288
|
+
* @param data 재개 시 전달할 데이터 (선택)
|
|
289
|
+
*/
|
|
290
|
+
resume(data?: any): void;
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Lane 중단
|
|
294
|
+
* @param reason 중단 사유
|
|
295
|
+
*/
|
|
296
|
+
abort(reason: string): void;
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* 현재 태스크 재시도
|
|
300
|
+
* @param options 재시도 옵션
|
|
301
|
+
*/
|
|
302
|
+
retry(options?: { modifiedPrompt?: string }): void;
|
|
303
|
+
|
|
304
|
+
// === 태스크 조작 ===
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* 다음에 실행할 태스크 삽입
|
|
308
|
+
* @param task 삽입할 태스크 정의
|
|
309
|
+
*/
|
|
310
|
+
injectTask(task: TaskDefinition): void;
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* 현재 태스크 프롬프트 수정 (beforeTask에서만 유효)
|
|
314
|
+
* @param newPrompt 새 프롬프트
|
|
315
|
+
*/
|
|
316
|
+
modifyCurrentPrompt(newPrompt: string): void;
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* 다음 태스크 수정
|
|
320
|
+
* @param modifier 수정 함수
|
|
321
|
+
*/
|
|
322
|
+
modifyNextTask(modifier: (task: TaskDefinition) => TaskDefinition): void;
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* 남은 태스크 전체 교체
|
|
326
|
+
* @param tasks 새 태스크 목록
|
|
327
|
+
*/
|
|
328
|
+
replaceRemainingTasks(tasks: TaskDefinition[]): void;
|
|
329
|
+
|
|
330
|
+
// === 에이전트 통신 ===
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* AI 에이전트에게 메시지 전송 (현재 세션)
|
|
334
|
+
* @param message 전송할 메시지
|
|
335
|
+
* @returns AI 응답
|
|
336
|
+
*/
|
|
337
|
+
sendMessage(message: string): Promise<string>;
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* 별도 AI 호출 (새 세션)
|
|
341
|
+
* @param prompt 프롬프트
|
|
342
|
+
* @param options 옵션
|
|
343
|
+
* @returns AI 응답
|
|
344
|
+
*/
|
|
345
|
+
callAI(prompt: string, options?: AICallOptions): Promise<string>;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// ============================================================================
|
|
349
|
+
// Hook Context Interfaces
|
|
350
|
+
// ============================================================================
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* 기본 Hook 컨텍스트 (모든 Hook 공통)
|
|
354
|
+
*/
|
|
355
|
+
export interface HookContext {
|
|
356
|
+
// === 기본 정보 ===
|
|
357
|
+
|
|
358
|
+
/** Lane 이름 */
|
|
359
|
+
laneName: string;
|
|
360
|
+
/** Run ID */
|
|
361
|
+
runId: string;
|
|
362
|
+
/** 현재 태스크 인덱스 (0-based) */
|
|
363
|
+
taskIndex: number;
|
|
364
|
+
/** 전체 태스크 수 */
|
|
365
|
+
totalTasks: number;
|
|
366
|
+
|
|
367
|
+
// === 현재 태스크 정보 ===
|
|
368
|
+
|
|
369
|
+
/** 현재 태스크 */
|
|
370
|
+
task: {
|
|
371
|
+
/** 태스크 이름 */
|
|
372
|
+
name: string;
|
|
373
|
+
/** 원본 프롬프트 */
|
|
374
|
+
prompt: string;
|
|
375
|
+
/** AI 모델 */
|
|
376
|
+
model: string;
|
|
377
|
+
/** 의존성 태스크 목록 */
|
|
378
|
+
dependsOn?: string[];
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
// === 플로우 제어 ===
|
|
382
|
+
|
|
383
|
+
/** 플로우 컨트롤러 */
|
|
384
|
+
flow: FlowController;
|
|
385
|
+
|
|
386
|
+
// === 데이터 접근 ===
|
|
387
|
+
|
|
388
|
+
/** 데이터 접근자 */
|
|
389
|
+
getData: HookDataAccessor;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* beforeTask Hook 컨텍스트
|
|
394
|
+
*
|
|
395
|
+
* 태스크 실행 직전에 호출됩니다.
|
|
396
|
+
* `flow.modifyCurrentPrompt()`로 프롬프트를 수정할 수 있습니다.
|
|
397
|
+
*/
|
|
398
|
+
export interface BeforeTaskContext extends HookContext {
|
|
399
|
+
// 추가 필드 없음 - 기본 컨텍스트만 사용
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* afterTask Hook 컨텍스트
|
|
404
|
+
*
|
|
405
|
+
* 태스크 완료 직후에 호출됩니다.
|
|
406
|
+
* 결과를 분석하고 추가 태스크를 삽입하거나 재시도를 요청할 수 있습니다.
|
|
407
|
+
*/
|
|
408
|
+
export interface AfterTaskContext extends HookContext {
|
|
409
|
+
/** 태스크 실행 결과 */
|
|
410
|
+
result: {
|
|
411
|
+
/** 실행 상태 */
|
|
412
|
+
status: 'success' | 'error' | 'blocked';
|
|
413
|
+
/** 종료 코드 */
|
|
414
|
+
exitCode?: number;
|
|
415
|
+
/** 에러 메시지 */
|
|
416
|
+
error?: string;
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* onError Hook 컨텍스트
|
|
422
|
+
*
|
|
423
|
+
* 에러 발생 시 호출됩니다.
|
|
424
|
+
* 에러를 분석하고 복구 전략을 결정할 수 있습니다.
|
|
425
|
+
*/
|
|
426
|
+
export interface OnErrorContext extends HookContext {
|
|
427
|
+
/** 에러 정보 */
|
|
428
|
+
error: {
|
|
429
|
+
/** 에러 타입 */
|
|
430
|
+
type: 'agent_error' | 'git_error' | 'timeout' | 'unknown';
|
|
431
|
+
/** 에러 메시지 */
|
|
432
|
+
message: string;
|
|
433
|
+
/** 스택 트레이스 */
|
|
434
|
+
stack?: string;
|
|
435
|
+
/** 재시도 가능 여부 */
|
|
436
|
+
retryable: boolean;
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* onStall Hook 컨텍스트
|
|
442
|
+
*
|
|
443
|
+
* AI 응답이 없을 때(Stall) 호출됩니다.
|
|
444
|
+
* 상황을 분석하고 개입 메시지를 전송할 수 있습니다.
|
|
445
|
+
*/
|
|
446
|
+
export interface OnStallContext extends HookContext {
|
|
447
|
+
/** Stall 정보 */
|
|
448
|
+
stall: {
|
|
449
|
+
/** 유휴 시간 (ms) */
|
|
450
|
+
idleTimeMs: number;
|
|
451
|
+
/** 마지막 활동 내용 */
|
|
452
|
+
lastActivity: string;
|
|
453
|
+
/** 수신된 바이트 수 */
|
|
454
|
+
bytesReceived: number;
|
|
455
|
+
/** Stall 단계 */
|
|
456
|
+
phase: 'initial' | 'warning' | 'critical';
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* onLaneEnd Hook 컨텍스트
|
|
462
|
+
*
|
|
463
|
+
* Lane 종료 시 호출됩니다.
|
|
464
|
+
* 최종 리뷰나 보고서 생성에 활용할 수 있습니다.
|
|
465
|
+
*/
|
|
466
|
+
export interface OnLaneEndContext extends HookContext {
|
|
467
|
+
/** Lane 종료 요약 */
|
|
468
|
+
summary: {
|
|
469
|
+
/** 종료 상태 */
|
|
470
|
+
status: 'completed' | 'failed' | 'aborted';
|
|
471
|
+
/** 완료된 태스크 수 */
|
|
472
|
+
completedTasks: number;
|
|
473
|
+
/** 실패한 태스크 수 */
|
|
474
|
+
failedTasks: number;
|
|
475
|
+
/** 총 소요 시간 (ms) */
|
|
476
|
+
totalDuration: number;
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// ============================================================================
|
|
481
|
+
// Hook Registration Types
|
|
482
|
+
// ============================================================================
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Hook 핸들러 타입 맵
|
|
486
|
+
*/
|
|
487
|
+
export interface HookHandlerMap {
|
|
488
|
+
[HookPoint.BEFORE_TASK]: (ctx: BeforeTaskContext) => void | Promise<void>;
|
|
489
|
+
[HookPoint.AFTER_TASK]: (ctx: AfterTaskContext) => void | Promise<void>;
|
|
490
|
+
[HookPoint.ON_ERROR]: (ctx: OnErrorContext) => void | Promise<void>;
|
|
491
|
+
[HookPoint.ON_STALL]: (ctx: OnStallContext) => void | Promise<void>;
|
|
492
|
+
[HookPoint.ON_LANE_END]: (ctx: OnLaneEndContext) => void | Promise<void>;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Hook 등록 옵션
|
|
497
|
+
*/
|
|
498
|
+
export interface HookRegistration<T extends HookPoint = HookPoint> {
|
|
499
|
+
/** Hook Point */
|
|
500
|
+
point: T;
|
|
501
|
+
/** 실행 모드: 'sync' (블로킹) | 'async' (논블로킹) */
|
|
502
|
+
mode: HookMode;
|
|
503
|
+
/** 핸들러 함수 */
|
|
504
|
+
handler: HookHandlerMap[T];
|
|
505
|
+
/** 실행 우선순위 (낮을수록 먼저 실행, 기본: 50) */
|
|
506
|
+
priority?: number;
|
|
507
|
+
/** 핸들러 이름 (디버깅용) */
|
|
508
|
+
name?: string;
|
|
509
|
+
/** 활성화 여부 (기본: true) */
|
|
510
|
+
enabled?: boolean;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Hook 실행 결과
|
|
515
|
+
*/
|
|
516
|
+
export interface HookExecutionResult {
|
|
517
|
+
/** 성공 여부 */
|
|
518
|
+
success: boolean;
|
|
519
|
+
/** 에러 (실패 시) */
|
|
520
|
+
error?: Error;
|
|
521
|
+
/** 실행 시간 (ms) */
|
|
522
|
+
duration: number;
|
|
523
|
+
/** 핸들러 이름 */
|
|
524
|
+
handlerName?: string;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// ============================================================================
|
|
528
|
+
// Configuration Types
|
|
529
|
+
// ============================================================================
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Hook 시스템 설정 (cursorflow.json에서 사용)
|
|
533
|
+
*/
|
|
534
|
+
export interface HooksConfig {
|
|
535
|
+
/** Hook 정의 파일 경로 */
|
|
536
|
+
file?: string;
|
|
537
|
+
/** Hook 실행 타임아웃 (ms, 기본: 30000) */
|
|
538
|
+
timeout?: number;
|
|
539
|
+
/** 에러 시 계속 진행 여부 (기본: false) */
|
|
540
|
+
continueOnError?: boolean;
|
|
541
|
+
/** 디버그 모드 */
|
|
542
|
+
debug?: boolean;
|
|
543
|
+
}
|
|
544
|
+
|