@litmers/cursorflow-orchestrator 0.1.40 → 0.2.2

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 (207) hide show
  1. package/CHANGELOG.md +0 -2
  2. package/README.md +7 -3
  3. package/commands/cursorflow-init.md +0 -4
  4. package/dist/cli/logs.js +108 -9
  5. package/dist/cli/logs.js.map +1 -1
  6. package/dist/cli/models.js +20 -3
  7. package/dist/cli/models.js.map +1 -1
  8. package/dist/cli/monitor.d.ts +7 -10
  9. package/dist/cli/monitor.js +1088 -1240
  10. package/dist/cli/monitor.js.map +1 -1
  11. package/dist/cli/resume.js +21 -1
  12. package/dist/cli/resume.js.map +1 -1
  13. package/dist/cli/run.js +28 -9
  14. package/dist/cli/run.js.map +1 -1
  15. package/dist/cli/signal.d.ts +6 -1
  16. package/dist/cli/signal.js +94 -12
  17. package/dist/cli/signal.js.map +1 -1
  18. package/dist/cli/tasks.js +3 -46
  19. package/dist/cli/tasks.js.map +1 -1
  20. package/dist/core/agent-supervisor.d.ts +23 -0
  21. package/dist/core/agent-supervisor.js +42 -0
  22. package/dist/core/agent-supervisor.js.map +1 -0
  23. package/dist/core/auto-recovery.d.ts +2 -1
  24. package/dist/core/auto-recovery.js +6 -1
  25. package/dist/core/auto-recovery.js.map +1 -1
  26. package/dist/core/failure-policy.d.ts +0 -1
  27. package/dist/core/failure-policy.js +0 -1
  28. package/dist/core/failure-policy.js.map +1 -1
  29. package/dist/core/git-lifecycle-manager.d.ts +284 -0
  30. package/dist/core/git-lifecycle-manager.js +778 -0
  31. package/dist/core/git-lifecycle-manager.js.map +1 -0
  32. package/dist/core/git-pipeline-coordinator.d.ts +21 -0
  33. package/dist/core/git-pipeline-coordinator.js +205 -0
  34. package/dist/core/git-pipeline-coordinator.js.map +1 -0
  35. package/dist/core/intervention.d.ts +176 -0
  36. package/dist/core/intervention.js +424 -0
  37. package/dist/core/intervention.js.map +1 -0
  38. package/dist/core/lane-state-machine.d.ts +423 -0
  39. package/dist/core/lane-state-machine.js +890 -0
  40. package/dist/core/lane-state-machine.js.map +1 -0
  41. package/dist/core/orchestrator.d.ts +4 -1
  42. package/dist/core/orchestrator.js +29 -62
  43. package/dist/core/orchestrator.js.map +1 -1
  44. package/dist/core/runner/agent.d.ts +7 -1
  45. package/dist/core/runner/agent.js +45 -30
  46. package/dist/core/runner/agent.js.map +1 -1
  47. package/dist/core/runner/pipeline.js +283 -123
  48. package/dist/core/runner/pipeline.js.map +1 -1
  49. package/dist/core/runner/task.d.ts +4 -5
  50. package/dist/core/runner/task.js +6 -80
  51. package/dist/core/runner/task.js.map +1 -1
  52. package/dist/core/runner.js +8 -2
  53. package/dist/core/runner.js.map +1 -1
  54. package/dist/core/stall-detection.d.ts +11 -4
  55. package/dist/core/stall-detection.js +62 -27
  56. package/dist/core/stall-detection.js.map +1 -1
  57. package/dist/hooks/contexts/index.d.ts +104 -0
  58. package/dist/hooks/contexts/index.js +134 -0
  59. package/dist/hooks/contexts/index.js.map +1 -0
  60. package/dist/hooks/data-accessor.d.ts +86 -0
  61. package/dist/hooks/data-accessor.js +410 -0
  62. package/dist/hooks/data-accessor.js.map +1 -0
  63. package/dist/hooks/flow-controller.d.ts +136 -0
  64. package/dist/hooks/flow-controller.js +351 -0
  65. package/dist/hooks/flow-controller.js.map +1 -0
  66. package/dist/hooks/index.d.ts +68 -0
  67. package/dist/hooks/index.js +105 -0
  68. package/dist/hooks/index.js.map +1 -0
  69. package/dist/hooks/manager.d.ts +129 -0
  70. package/dist/hooks/manager.js +389 -0
  71. package/dist/hooks/manager.js.map +1 -0
  72. package/dist/hooks/types.d.ts +463 -0
  73. package/dist/hooks/types.js +45 -0
  74. package/dist/hooks/types.js.map +1 -0
  75. package/dist/services/logging/buffer.d.ts +2 -2
  76. package/dist/services/logging/buffer.js +95 -42
  77. package/dist/services/logging/buffer.js.map +1 -1
  78. package/dist/services/logging/console.js +6 -1
  79. package/dist/services/logging/console.js.map +1 -1
  80. package/dist/services/logging/formatter.d.ts +9 -4
  81. package/dist/services/logging/formatter.js +64 -18
  82. package/dist/services/logging/formatter.js.map +1 -1
  83. package/dist/services/logging/index.d.ts +0 -1
  84. package/dist/services/logging/index.js +0 -1
  85. package/dist/services/logging/index.js.map +1 -1
  86. package/dist/services/logging/paths.d.ts +8 -0
  87. package/dist/services/logging/paths.js +48 -0
  88. package/dist/services/logging/paths.js.map +1 -0
  89. package/dist/services/logging/raw-log.d.ts +6 -0
  90. package/dist/services/logging/raw-log.js +37 -0
  91. package/dist/services/logging/raw-log.js.map +1 -0
  92. package/dist/services/process/index.js +1 -1
  93. package/dist/services/process/index.js.map +1 -1
  94. package/dist/types/agent.d.ts +15 -0
  95. package/dist/types/config.d.ts +22 -1
  96. package/dist/types/event-categories.d.ts +601 -0
  97. package/dist/types/event-categories.js +233 -0
  98. package/dist/types/event-categories.js.map +1 -0
  99. package/dist/types/events.d.ts +0 -20
  100. package/dist/types/flow.d.ts +10 -6
  101. package/dist/types/index.d.ts +1 -1
  102. package/dist/types/index.js +17 -3
  103. package/dist/types/index.js.map +1 -1
  104. package/dist/types/lane.d.ts +1 -1
  105. package/dist/types/logging.d.ts +1 -1
  106. package/dist/types/task.d.ts +12 -1
  107. package/dist/ui/log-viewer.d.ts +3 -0
  108. package/dist/ui/log-viewer.js +3 -0
  109. package/dist/ui/log-viewer.js.map +1 -1
  110. package/dist/utils/config.js +10 -1
  111. package/dist/utils/config.js.map +1 -1
  112. package/dist/utils/cursor-agent.d.ts +11 -1
  113. package/dist/utils/cursor-agent.js +63 -16
  114. package/dist/utils/cursor-agent.js.map +1 -1
  115. package/dist/utils/enhanced-logger.d.ts +5 -1
  116. package/dist/utils/enhanced-logger.js +98 -19
  117. package/dist/utils/enhanced-logger.js.map +1 -1
  118. package/dist/utils/event-registry.d.ts +222 -0
  119. package/dist/utils/event-registry.js +463 -0
  120. package/dist/utils/event-registry.js.map +1 -0
  121. package/dist/utils/events.d.ts +1 -13
  122. package/dist/utils/events.js.map +1 -1
  123. package/dist/utils/flow.d.ts +10 -0
  124. package/dist/utils/flow.js +75 -0
  125. package/dist/utils/flow.js.map +1 -1
  126. package/dist/utils/log-constants.d.ts +1 -0
  127. package/dist/utils/log-constants.js +2 -1
  128. package/dist/utils/log-constants.js.map +1 -1
  129. package/dist/utils/log-formatter.d.ts +2 -1
  130. package/dist/utils/log-formatter.js +10 -10
  131. package/dist/utils/log-formatter.js.map +1 -1
  132. package/dist/utils/logger.d.ts +11 -0
  133. package/dist/utils/logger.js +82 -3
  134. package/dist/utils/logger.js.map +1 -1
  135. package/dist/utils/repro-thinking-logs.js +0 -13
  136. package/dist/utils/repro-thinking-logs.js.map +1 -1
  137. package/dist/utils/run-service.js +1 -1
  138. package/dist/utils/run-service.js.map +1 -1
  139. package/examples/README.md +0 -2
  140. package/examples/demo-project/README.md +1 -2
  141. package/package.json +18 -28
  142. package/scripts/setup-security.sh +0 -1
  143. package/scripts/test-log-parser.ts +171 -0
  144. package/scripts/verify-change.sh +272 -0
  145. package/src/cli/logs.ts +121 -10
  146. package/src/cli/models.ts +20 -3
  147. package/src/cli/monitor.ts +1257 -1342
  148. package/src/cli/resume.ts +27 -1
  149. package/src/cli/run.ts +29 -11
  150. package/src/cli/signal.ts +115 -17
  151. package/src/cli/tasks.ts +2 -59
  152. package/src/core/agent-supervisor.ts +64 -0
  153. package/src/core/auto-recovery.ts +7 -1
  154. package/src/core/failure-policy.ts +0 -1
  155. package/src/core/git-lifecycle-manager.ts +1011 -0
  156. package/src/core/git-pipeline-coordinator.ts +221 -0
  157. package/src/core/intervention.ts +481 -0
  158. package/src/core/lane-state-machine.ts +1097 -0
  159. package/src/core/orchestrator.ts +35 -61
  160. package/src/core/runner/agent.ts +66 -33
  161. package/src/core/runner/pipeline.ts +318 -138
  162. package/src/core/runner/task.ts +12 -97
  163. package/src/core/runner.ts +8 -2
  164. package/src/core/stall-detection.ts +72 -27
  165. package/src/hooks/contexts/index.ts +256 -0
  166. package/src/hooks/data-accessor.ts +488 -0
  167. package/src/hooks/flow-controller.ts +425 -0
  168. package/src/hooks/index.ts +154 -0
  169. package/src/hooks/manager.ts +434 -0
  170. package/src/hooks/types.ts +544 -0
  171. package/src/services/logging/buffer.ts +104 -43
  172. package/src/services/logging/console.ts +7 -1
  173. package/src/services/logging/formatter.ts +74 -18
  174. package/src/services/logging/index.ts +0 -2
  175. package/src/services/logging/paths.ts +14 -0
  176. package/src/services/logging/raw-log.ts +43 -0
  177. package/src/services/process/index.ts +1 -1
  178. package/src/types/agent.ts +15 -0
  179. package/src/types/config.ts +23 -1
  180. package/src/types/event-categories.ts +663 -0
  181. package/src/types/events.ts +0 -25
  182. package/src/types/flow.ts +10 -6
  183. package/src/types/index.ts +50 -4
  184. package/src/types/lane.ts +1 -2
  185. package/src/types/logging.ts +2 -1
  186. package/src/types/task.ts +12 -1
  187. package/src/ui/log-viewer.ts +3 -0
  188. package/src/utils/config.ts +11 -1
  189. package/src/utils/cursor-agent.ts +68 -16
  190. package/src/utils/enhanced-logger.ts +105 -19
  191. package/src/utils/event-registry.ts +595 -0
  192. package/src/utils/events.ts +0 -16
  193. package/src/utils/flow.ts +83 -0
  194. package/src/utils/log-constants.ts +2 -1
  195. package/src/utils/log-formatter.ts +10 -11
  196. package/src/utils/logger.ts +49 -3
  197. package/src/utils/repro-thinking-logs.ts +0 -15
  198. package/src/utils/run-service.ts +1 -1
  199. package/dist/services/logging/file-writer.d.ts +0 -71
  200. package/dist/services/logging/file-writer.js +0 -516
  201. package/dist/services/logging/file-writer.js.map +0 -1
  202. package/dist/types/review.d.ts +0 -17
  203. package/dist/types/review.js +0 -6
  204. package/dist/types/review.js.map +0 -1
  205. package/scripts/ai-security-check.js +0 -233
  206. package/src/services/logging/file-writer.ts +0 -526
  207. package/src/types/review.ts +0 -20
@@ -0,0 +1,663 @@
1
+ /**
2
+ * Event Categories & Registry System
3
+ *
4
+ * 이벤트를 출처와 책임에 따라 명확하게 분류합니다.
5
+ *
6
+ * 카테고리:
7
+ * - ORCHESTRATION: 전체 실행 흐름 관리 이벤트
8
+ * - LANE: 개별 Lane 생명주기 이벤트
9
+ * - TASK: Task 실행 관련 이벤트
10
+ * - GIT: Git 작업 관련 이벤트
11
+ * - RECOVERY: 복구 및 재시도 관련 이벤트
12
+ * - AGENT: AI Agent 통신 관련 이벤트
13
+ * - STATE: 상태 전이 관련 이벤트
14
+ * - SYSTEM: 시스템 수준 이벤트
15
+ */
16
+
17
+ // ============================================================================
18
+ // Event Categories (출처별 분류)
19
+ // ============================================================================
20
+
21
+ /**
22
+ * 이벤트 카테고리 - 이벤트의 출처와 책임을 정의
23
+ */
24
+ export enum EventCategory {
25
+ /** 전체 실행 흐름 관리 (Orchestrator 책임) */
26
+ ORCHESTRATION = 'orchestration',
27
+ /** 개별 Lane 생명주기 (Runner 책임) */
28
+ LANE = 'lane',
29
+ /** Task 실행 (Runner/Pipeline 책임) */
30
+ TASK = 'task',
31
+ /** Git 작업 (GitLifecycleManager 책임) */
32
+ GIT = 'git',
33
+ /** 복구 및 재시도 (RecoveryManager 책임) */
34
+ RECOVERY = 'recovery',
35
+ /** AI Agent 통신 (AgentSupervisor 책임) */
36
+ AGENT = 'agent',
37
+ /** 상태 전이 (StateMachine 책임) */
38
+ STATE = 'state',
39
+ /** 시스템 수준 (Infrastructure 책임) */
40
+ SYSTEM = 'system',
41
+ }
42
+
43
+ // ============================================================================
44
+ // Event Types per Category
45
+ // ============================================================================
46
+
47
+ /**
48
+ * Orchestration 이벤트 타입
49
+ */
50
+ export enum OrchestrationEventType {
51
+ /** 오케스트레이션 시작 */
52
+ STARTED = 'orchestration.started',
53
+ /** 모든 Lane 완료 */
54
+ COMPLETED = 'orchestration.completed',
55
+ /** 오케스트레이션 실패 */
56
+ FAILED = 'orchestration.failed',
57
+ /** 의존성 사이클 감지 */
58
+ CYCLE_DETECTED = 'orchestration.cycle_detected',
59
+ /** 교착 상태 감지 */
60
+ DEADLOCK_DETECTED = 'orchestration.deadlock_detected',
61
+ }
62
+
63
+ /**
64
+ * Lane 이벤트 타입
65
+ */
66
+ export enum LaneEventType {
67
+ /** Lane 시작 */
68
+ STARTED = 'lane.started',
69
+ /** Lane 완료 */
70
+ COMPLETED = 'lane.completed',
71
+ /** Lane 실패 */
72
+ FAILED = 'lane.failed',
73
+ /** Lane 일시 중지 */
74
+ PAUSED = 'lane.paused',
75
+ /** Lane 재개 */
76
+ RESUMED = 'lane.resumed',
77
+ /** 의존성 대기 시작 */
78
+ WAITING = 'lane.waiting',
79
+ /** 의존성 블록 (외부 개입 필요) */
80
+ BLOCKED = 'lane.blocked',
81
+ /** 의존성 요청 */
82
+ DEPENDENCY_REQUESTED = 'lane.dependency_requested',
83
+ }
84
+
85
+ /**
86
+ * Task 이벤트 타입
87
+ */
88
+ export enum TaskEventType {
89
+ /** Task 시작 */
90
+ STARTED = 'task.started',
91
+ /** Task 완료 */
92
+ COMPLETED = 'task.completed',
93
+ /** Task 실패 */
94
+ FAILED = 'task.failed',
95
+ /** Task 재시도 */
96
+ RETRY = 'task.retry',
97
+ /** Task 스킵 */
98
+ SKIPPED = 'task.skipped',
99
+ /** Task 의존성 대기 */
100
+ WAITING_DEPENDENCY = 'task.waiting_dependency',
101
+ /** Task 의존성 해결됨 */
102
+ DEPENDENCY_RESOLVED = 'task.dependency_resolved',
103
+ }
104
+
105
+ /**
106
+ * Git 이벤트 타입
107
+ */
108
+ export enum GitEventType {
109
+ /** 브랜치 생성 */
110
+ BRANCH_CREATED = 'git.branch_created',
111
+ /** 브랜치 체크아웃 */
112
+ BRANCH_CHECKED_OUT = 'git.branch_checked_out',
113
+ /** 워크트리 생성 */
114
+ WORKTREE_CREATED = 'git.worktree_created',
115
+ /** 워크트리 정리 */
116
+ WORKTREE_CLEANED = 'git.worktree_cleaned',
117
+ /** 커밋 생성 */
118
+ COMMITTED = 'git.committed',
119
+ /** 푸시 완료 */
120
+ PUSHED = 'git.pushed',
121
+ /** 머지 시작 */
122
+ MERGE_STARTED = 'git.merge_started',
123
+ /** 머지 완료 */
124
+ MERGE_COMPLETED = 'git.merge_completed',
125
+ /** 머지 충돌 감지 */
126
+ MERGE_CONFLICT = 'git.merge_conflict',
127
+ /** 푸시 거부 */
128
+ PUSH_REJECTED = 'git.push_rejected',
129
+ /** Git 오류 */
130
+ ERROR = 'git.error',
131
+ /** 의존성 브랜치 동기화 */
132
+ DEPENDENCY_SYNCED = 'git.dependency_synced',
133
+ }
134
+
135
+ /**
136
+ * Recovery 이벤트 타입
137
+ */
138
+ export enum RecoveryEventType {
139
+ /** 복구 시작 */
140
+ STARTED = 'recovery.started',
141
+ /** Continue 신호 발송 */
142
+ CONTINUE_SIGNAL = 'recovery.continue_signal',
143
+ /** Stronger prompt 발송 */
144
+ STRONGER_PROMPT = 'recovery.stronger_prompt',
145
+ /** 프로세스 재시작 */
146
+ RESTART = 'recovery.restart',
147
+ /** 진단 실행 */
148
+ DIAGNOSED = 'recovery.diagnosed',
149
+ /** 복구 성공 */
150
+ RECOVERED = 'recovery.recovered',
151
+ /** 복구 실패 (포기) */
152
+ ABORTED = 'recovery.aborted',
153
+ /** 충돌 해결 */
154
+ CONFLICT_RESOLVED = 'recovery.conflict_resolved',
155
+ }
156
+
157
+ /**
158
+ * Agent 이벤트 타입
159
+ */
160
+ export enum AgentEventType {
161
+ /** 프롬프트 전송 */
162
+ PROMPT_SENT = 'agent.prompt_sent',
163
+ /** 응답 수신 */
164
+ RESPONSE_RECEIVED = 'agent.response_received',
165
+ /** 스트리밍 시작 */
166
+ STREAMING_STARTED = 'agent.streaming_started',
167
+ /** 스트리밍 종료 */
168
+ STREAMING_ENDED = 'agent.streaming_ended',
169
+ /** 연결 오류 */
170
+ CONNECTION_ERROR = 'agent.connection_error',
171
+ /** 인증 오류 */
172
+ AUTH_ERROR = 'agent.auth_error',
173
+ /** Rate limit */
174
+ RATE_LIMITED = 'agent.rate_limited',
175
+ /** 타임아웃 */
176
+ TIMEOUT = 'agent.timeout',
177
+ }
178
+
179
+ /**
180
+ * State 이벤트 타입 (상태 머신 전이)
181
+ */
182
+ export enum StateEventType {
183
+ /** 상태 전이 */
184
+ TRANSITION = 'state.transition',
185
+ /** 상태 전이 실패 (잘못된 전이) */
186
+ TRANSITION_FAILED = 'state.transition_failed',
187
+ /** 상태 저장 */
188
+ PERSISTED = 'state.persisted',
189
+ /** 상태 복구 */
190
+ RESTORED = 'state.restored',
191
+ /** 상태 손상 감지 */
192
+ CORRUPTED = 'state.corrupted',
193
+ /** 상태 복구 완료 */
194
+ REPAIRED = 'state.repaired',
195
+ }
196
+
197
+ /**
198
+ * System 이벤트 타입
199
+ */
200
+ export enum SystemEventType {
201
+ /** 시스템 시작 */
202
+ STARTUP = 'system.startup',
203
+ /** 시스템 종료 */
204
+ SHUTDOWN = 'system.shutdown',
205
+ /** Health check 완료 */
206
+ HEALTH_CHECK = 'system.health_check',
207
+ /** 설정 로드 */
208
+ CONFIG_LOADED = 'system.config_loaded',
209
+ /** 로그 파일 로테이션 */
210
+ LOG_ROTATED = 'system.log_rotated',
211
+ /** 시그널 수신 (SIGINT, SIGTERM 등) */
212
+ SIGNAL_RECEIVED = 'system.signal_received',
213
+ }
214
+
215
+ // ============================================================================
216
+ // Union Type for All Event Types
217
+ // ============================================================================
218
+
219
+ export type AllEventTypes =
220
+ | OrchestrationEventType
221
+ | LaneEventType
222
+ | TaskEventType
223
+ | GitEventType
224
+ | RecoveryEventType
225
+ | AgentEventType
226
+ | StateEventType
227
+ | SystemEventType;
228
+
229
+ // ============================================================================
230
+ // Event Payloads per Category
231
+ // ============================================================================
232
+
233
+ // --- Orchestration Payloads ---
234
+
235
+ export interface OrchestrationStartedPayload {
236
+ runId: string;
237
+ tasksDir: string;
238
+ laneCount: number;
239
+ runRoot: string;
240
+ pipelineBranch?: string;
241
+ }
242
+
243
+ export interface OrchestrationCompletedPayload {
244
+ runId: string;
245
+ laneCount: number;
246
+ completedCount: number;
247
+ failedCount: number;
248
+ duration: number;
249
+ }
250
+
251
+ export interface OrchestrationFailedPayload {
252
+ runId: string;
253
+ error: string;
254
+ blockedLanes?: string[];
255
+ failedLanes?: string[];
256
+ }
257
+
258
+ export interface CycleDetectedPayload {
259
+ runId: string;
260
+ cycle: string[];
261
+ affectedLanes: string[];
262
+ }
263
+
264
+ // --- Lane Payloads ---
265
+
266
+ export interface LaneStartedPayload {
267
+ laneName: string;
268
+ pid?: number;
269
+ logPath: string;
270
+ worktreeDir?: string;
271
+ pipelineBranch?: string;
272
+ }
273
+
274
+ export interface LaneCompletedPayload {
275
+ laneName: string;
276
+ exitCode: number;
277
+ duration: number;
278
+ tasksCompleted: number;
279
+ }
280
+
281
+ export interface LaneFailedPayload {
282
+ laneName: string;
283
+ exitCode: number;
284
+ error: string;
285
+ taskIndex?: number;
286
+ taskName?: string;
287
+ }
288
+
289
+ export interface LaneWaitingPayload {
290
+ laneName: string;
291
+ waitingFor: string[];
292
+ timeout?: number;
293
+ }
294
+
295
+ export interface LaneBlockedPayload {
296
+ laneName: string;
297
+ dependencyRequest: {
298
+ commands?: string[];
299
+ changes?: string[];
300
+ reason: string;
301
+ };
302
+ }
303
+
304
+ // --- Task Payloads ---
305
+
306
+ export interface TaskStartedPayload {
307
+ laneName: string;
308
+ taskName: string;
309
+ taskIndex: number;
310
+ taskBranch: string;
311
+ dependencies?: string[];
312
+ }
313
+
314
+ export interface TaskCompletedPayload {
315
+ laneName: string;
316
+ taskName: string;
317
+ taskIndex: number;
318
+ taskBranch: string;
319
+ duration: number;
320
+ status: 'success' | 'partial';
321
+ }
322
+
323
+ export interface TaskFailedPayload {
324
+ laneName: string;
325
+ taskName: string;
326
+ taskIndex: number;
327
+ taskBranch: string;
328
+ error: string;
329
+ retryable: boolean;
330
+ }
331
+
332
+ export interface TaskRetryPayload {
333
+ laneName: string;
334
+ taskName: string;
335
+ taskIndex: number;
336
+ retryCount: number;
337
+ maxRetries: number;
338
+ reason: string;
339
+ }
340
+
341
+ export interface TaskWaitingDependencyPayload {
342
+ laneName: string;
343
+ taskName: string;
344
+ taskIndex: number;
345
+ waitingFor: string[];
346
+ startedAt: number;
347
+ }
348
+
349
+ // --- Git Payloads ---
350
+
351
+ export interface GitBranchCreatedPayload {
352
+ laneName?: string;
353
+ branchName: string;
354
+ baseBranch: string;
355
+ worktreeDir?: string;
356
+ }
357
+
358
+ export interface GitCommittedPayload {
359
+ laneName?: string;
360
+ branchName: string;
361
+ commitHash: string;
362
+ message: string;
363
+ filesChanged: number;
364
+ }
365
+
366
+ export interface GitPushedPayload {
367
+ laneName?: string;
368
+ branchName: string;
369
+ remote: string;
370
+ commitHash: string;
371
+ }
372
+
373
+ export interface GitMergeStartedPayload {
374
+ laneName?: string;
375
+ sourceBranch: string;
376
+ targetBranch: string;
377
+ mergeType: 'task_to_pipeline' | 'dependency' | 'final';
378
+ }
379
+
380
+ export interface GitMergeCompletedPayload {
381
+ laneName?: string;
382
+ sourceBranch: string;
383
+ targetBranch: string;
384
+ mergeCommit: string;
385
+ filesChanged: number;
386
+ }
387
+
388
+ export interface GitMergeConflictPayload {
389
+ laneName?: string;
390
+ sourceBranch: string;
391
+ targetBranch: string;
392
+ conflictingFiles: string[];
393
+ preCheck: boolean;
394
+ }
395
+
396
+ export interface GitPushRejectedPayload {
397
+ laneName?: string;
398
+ branchName: string;
399
+ reason: string;
400
+ hint?: string;
401
+ }
402
+
403
+ export interface GitErrorPayload {
404
+ laneName?: string;
405
+ operation: string;
406
+ error: string;
407
+ recoverable: boolean;
408
+ }
409
+
410
+ // --- Recovery Payloads ---
411
+
412
+ export interface RecoveryStartedPayload {
413
+ laneName: string;
414
+ reason: string;
415
+ phase: number;
416
+ }
417
+
418
+ export interface RecoveryContinueSignalPayload {
419
+ laneName: string;
420
+ idleSeconds: number;
421
+ signalCount: number;
422
+ }
423
+
424
+ export interface RecoveryStrongerPromptPayload {
425
+ laneName: string;
426
+ prompt?: string;
427
+ previousAttempts: number;
428
+ }
429
+
430
+ export interface RecoveryRestartPayload {
431
+ laneName: string;
432
+ restartCount: number;
433
+ maxRestarts: number;
434
+ reason: string;
435
+ }
436
+
437
+ export interface RecoveryDiagnosedPayload {
438
+ laneName: string;
439
+ diagnostic: {
440
+ timestamp: number;
441
+ agentHealthy: boolean;
442
+ authHealthy: boolean;
443
+ systemHealthy: boolean;
444
+ suggestedAction: string;
445
+ details: string;
446
+ issues?: string[];
447
+ };
448
+ }
449
+
450
+ export interface RecoveryConflictResolvedPayload {
451
+ laneName?: string;
452
+ strategy: string;
453
+ resolvedFiles: string[];
454
+ unresolvedFiles: string[];
455
+ success: boolean;
456
+ }
457
+
458
+ // --- Agent Payloads ---
459
+
460
+ export interface AgentPromptSentPayload {
461
+ laneName: string;
462
+ taskName: string;
463
+ model: string;
464
+ promptLength: number;
465
+ chatId?: string;
466
+ }
467
+
468
+ export interface AgentResponseReceivedPayload {
469
+ laneName: string;
470
+ taskName: string;
471
+ ok: boolean;
472
+ duration: number;
473
+ responseLength: number;
474
+ error?: string;
475
+ }
476
+
477
+ export interface AgentConnectionErrorPayload {
478
+ laneName: string;
479
+ error: string;
480
+ retryable: boolean;
481
+ }
482
+
483
+ // --- State Payloads ---
484
+
485
+ export interface StateTransitionPayload {
486
+ laneName: string;
487
+ fromState: string;
488
+ toState: string;
489
+ trigger: string;
490
+ timestamp: number;
491
+ }
492
+
493
+ export interface StateTransitionFailedPayload {
494
+ laneName: string;
495
+ fromState: string;
496
+ attemptedState: string;
497
+ trigger: string;
498
+ reason: string;
499
+ }
500
+
501
+ export interface StateCorruptedPayload {
502
+ laneName: string;
503
+ filePath: string;
504
+ issues: string[];
505
+ }
506
+
507
+ export interface StateRepairedPayload {
508
+ laneName: string;
509
+ filePath: string;
510
+ repairedFields: string[];
511
+ }
512
+
513
+ // --- System Payloads ---
514
+
515
+ export interface SystemHealthCheckPayload {
516
+ healthy: boolean;
517
+ checks: Array<{
518
+ name: string;
519
+ ok: boolean;
520
+ message: string;
521
+ }>;
522
+ }
523
+
524
+ export interface SystemSignalReceivedPayload {
525
+ signal: string;
526
+ action: 'shutdown' | 'restart' | 'ignore';
527
+ }
528
+
529
+ // ============================================================================
530
+ // Event Payload Map (타입-페이로드 매핑)
531
+ // ============================================================================
532
+
533
+ export interface EventPayloadMap {
534
+ // Orchestration
535
+ [OrchestrationEventType.STARTED]: OrchestrationStartedPayload;
536
+ [OrchestrationEventType.COMPLETED]: OrchestrationCompletedPayload;
537
+ [OrchestrationEventType.FAILED]: OrchestrationFailedPayload;
538
+ [OrchestrationEventType.CYCLE_DETECTED]: CycleDetectedPayload;
539
+ [OrchestrationEventType.DEADLOCK_DETECTED]: OrchestrationFailedPayload;
540
+
541
+ // Lane
542
+ [LaneEventType.STARTED]: LaneStartedPayload;
543
+ [LaneEventType.COMPLETED]: LaneCompletedPayload;
544
+ [LaneEventType.FAILED]: LaneFailedPayload;
545
+ [LaneEventType.PAUSED]: { laneName: string; reason: string };
546
+ [LaneEventType.RESUMED]: { laneName: string };
547
+ [LaneEventType.WAITING]: LaneWaitingPayload;
548
+ [LaneEventType.BLOCKED]: LaneBlockedPayload;
549
+ [LaneEventType.DEPENDENCY_REQUESTED]: LaneBlockedPayload;
550
+
551
+ // Task
552
+ [TaskEventType.STARTED]: TaskStartedPayload;
553
+ [TaskEventType.COMPLETED]: TaskCompletedPayload;
554
+ [TaskEventType.FAILED]: TaskFailedPayload;
555
+ [TaskEventType.RETRY]: TaskRetryPayload;
556
+ [TaskEventType.SKIPPED]: { laneName: string; taskName: string; reason: string };
557
+ [TaskEventType.WAITING_DEPENDENCY]: TaskWaitingDependencyPayload;
558
+ [TaskEventType.DEPENDENCY_RESOLVED]: { laneName: string; taskName: string; resolvedDependency: string };
559
+
560
+ // Git
561
+ [GitEventType.BRANCH_CREATED]: GitBranchCreatedPayload;
562
+ [GitEventType.BRANCH_CHECKED_OUT]: { laneName?: string; branchName: string };
563
+ [GitEventType.WORKTREE_CREATED]: { laneName?: string; worktreeDir: string; branchName: string };
564
+ [GitEventType.WORKTREE_CLEANED]: { laneName?: string; worktreeDir: string };
565
+ [GitEventType.COMMITTED]: GitCommittedPayload;
566
+ [GitEventType.PUSHED]: GitPushedPayload;
567
+ [GitEventType.MERGE_STARTED]: GitMergeStartedPayload;
568
+ [GitEventType.MERGE_COMPLETED]: GitMergeCompletedPayload;
569
+ [GitEventType.MERGE_CONFLICT]: GitMergeConflictPayload;
570
+ [GitEventType.PUSH_REJECTED]: GitPushRejectedPayload;
571
+ [GitEventType.ERROR]: GitErrorPayload;
572
+ [GitEventType.DEPENDENCY_SYNCED]: { laneName?: string; sourceBranch: string; targetBranch: string };
573
+
574
+ // Recovery
575
+ [RecoveryEventType.STARTED]: RecoveryStartedPayload;
576
+ [RecoveryEventType.CONTINUE_SIGNAL]: RecoveryContinueSignalPayload;
577
+ [RecoveryEventType.STRONGER_PROMPT]: RecoveryStrongerPromptPayload;
578
+ [RecoveryEventType.RESTART]: RecoveryRestartPayload;
579
+ [RecoveryEventType.DIAGNOSED]: RecoveryDiagnosedPayload;
580
+ [RecoveryEventType.RECOVERED]: { laneName: string; recoveryAction: string };
581
+ [RecoveryEventType.ABORTED]: { laneName: string; reason: string };
582
+ [RecoveryEventType.CONFLICT_RESOLVED]: RecoveryConflictResolvedPayload;
583
+
584
+ // Agent
585
+ [AgentEventType.PROMPT_SENT]: AgentPromptSentPayload;
586
+ [AgentEventType.RESPONSE_RECEIVED]: AgentResponseReceivedPayload;
587
+ [AgentEventType.STREAMING_STARTED]: { laneName: string; taskName: string };
588
+ [AgentEventType.STREAMING_ENDED]: { laneName: string; taskName: string; totalBytes: number };
589
+ [AgentEventType.CONNECTION_ERROR]: AgentConnectionErrorPayload;
590
+ [AgentEventType.AUTH_ERROR]: { laneName: string; message: string };
591
+ [AgentEventType.RATE_LIMITED]: { laneName: string; retryAfterMs: number };
592
+ [AgentEventType.TIMEOUT]: { laneName: string; taskName: string; timeoutMs: number };
593
+
594
+ // State
595
+ [StateEventType.TRANSITION]: StateTransitionPayload;
596
+ [StateEventType.TRANSITION_FAILED]: StateTransitionFailedPayload;
597
+ [StateEventType.PERSISTED]: { laneName: string; filePath: string };
598
+ [StateEventType.RESTORED]: { laneName: string; filePath: string; state: any };
599
+ [StateEventType.CORRUPTED]: StateCorruptedPayload;
600
+ [StateEventType.REPAIRED]: StateRepairedPayload;
601
+
602
+ // System
603
+ [SystemEventType.STARTUP]: { version: string; nodeVersion: string };
604
+ [SystemEventType.SHUTDOWN]: { reason: string; exitCode: number };
605
+ [SystemEventType.HEALTH_CHECK]: SystemHealthCheckPayload;
606
+ [SystemEventType.CONFIG_LOADED]: { configPath: string };
607
+ [SystemEventType.LOG_ROTATED]: { oldPath: string; newPath: string };
608
+ [SystemEventType.SIGNAL_RECEIVED]: SystemSignalReceivedPayload;
609
+ }
610
+
611
+ // ============================================================================
612
+ // Typed Event Interface
613
+ // ============================================================================
614
+
615
+ /**
616
+ * 타입이 지정된 CursorFlow 이벤트
617
+ */
618
+ export interface TypedCursorFlowEvent<T extends keyof EventPayloadMap = keyof EventPayloadMap> {
619
+ /** 고유 이벤트 ID */
620
+ id: string;
621
+ /** 이벤트 타입 */
622
+ type: T;
623
+ /** 이벤트 카테고리 */
624
+ category: EventCategory;
625
+ /** 발생 시간 (ISO 8601) */
626
+ timestamp: string;
627
+ /** 실행 ID */
628
+ runId: string;
629
+ /** Lane 이름 (해당하는 경우) */
630
+ laneName?: string;
631
+ /** 페이로드 */
632
+ payload: EventPayloadMap[T];
633
+ }
634
+
635
+ /**
636
+ * 이벤트 타입에서 카테고리 추출
637
+ */
638
+ export function getCategoryFromEventType(eventType: string): EventCategory {
639
+ const prefix = eventType.split('.')[0];
640
+ switch (prefix) {
641
+ case 'orchestration': return EventCategory.ORCHESTRATION;
642
+ case 'lane': return EventCategory.LANE;
643
+ case 'task': return EventCategory.TASK;
644
+ case 'git': return EventCategory.GIT;
645
+ case 'recovery': return EventCategory.RECOVERY;
646
+ case 'agent': return EventCategory.AGENT;
647
+ case 'state': return EventCategory.STATE;
648
+ case 'system': return EventCategory.SYSTEM;
649
+ default: return EventCategory.SYSTEM;
650
+ }
651
+ }
652
+
653
+ /**
654
+ * 타입화된 이벤트 핸들러
655
+ */
656
+ export type TypedEventHandler<T extends keyof EventPayloadMap> =
657
+ (event: TypedCursorFlowEvent<T>) => void | Promise<void>;
658
+
659
+ /**
660
+ * 범용 이벤트 핸들러
661
+ */
662
+ export type GenericEventHandler = (event: TypedCursorFlowEvent) => void | Promise<void>;
663
+
@@ -91,31 +91,6 @@ export interface AgentResponseReceivedPayload {
91
91
  error?: string;
92
92
  }
93
93
 
94
- // Review Events
95
- export interface ReviewStartedPayload {
96
- taskName: string;
97
- taskBranch: string;
98
- }
99
-
100
- export interface ReviewCompletedPayload {
101
- taskName: string;
102
- status: 'approved' | 'needs_changes';
103
- issueCount: number;
104
- summary: string;
105
- raw: string;
106
- }
107
-
108
- export interface ReviewApprovedPayload {
109
- taskName: string;
110
- iterations: number;
111
- }
112
-
113
- export interface ReviewRejectedPayload {
114
- taskName: string;
115
- reason: string;
116
- iterations: number;
117
- }
118
-
119
94
  // Recovery Events
120
95
  export interface RecoveryContinueSignalPayload {
121
96
  laneName: string;
package/src/types/flow.ts CHANGED
@@ -77,15 +77,19 @@ export interface ParsedTaskSpec {
77
77
  * Flow directory info for listing
78
78
  */
79
79
  export interface FlowInfo {
80
- /** Flow ID */
80
+ /** Flow ID (sequential number) */
81
81
  id: string;
82
- /** Flow name */
82
+ /** Human-readable flow name */
83
83
  name: string;
84
84
  /** Full directory path */
85
85
  path: string;
86
- /** Flow metadata */
87
- meta: FlowMeta;
88
- /** Lane count */
89
- laneCount: number;
86
+ /** Creation timestamp */
87
+ timestamp: Date;
88
+ /** List of lane names */
89
+ lanes: string[];
90
+ /** Current flow status */
91
+ status: FlowStatus;
92
+ /** Full metadata from flow.meta.json */
93
+ meta?: FlowMeta;
90
94
  }
91
95