@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.
Files changed (214) hide show
  1. package/CHANGELOG.md +0 -2
  2. package/README.md +8 -3
  3. package/commands/cursorflow-init.md +0 -4
  4. package/dist/cli/index.js +0 -6
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/logs.js +108 -9
  7. package/dist/cli/logs.js.map +1 -1
  8. package/dist/cli/models.js +20 -3
  9. package/dist/cli/models.js.map +1 -1
  10. package/dist/cli/monitor.d.ts +7 -10
  11. package/dist/cli/monitor.js +1103 -1239
  12. package/dist/cli/monitor.js.map +1 -1
  13. package/dist/cli/resume.js +21 -1
  14. package/dist/cli/resume.js.map +1 -1
  15. package/dist/cli/run.js +28 -9
  16. package/dist/cli/run.js.map +1 -1
  17. package/dist/cli/signal.d.ts +6 -1
  18. package/dist/cli/signal.js +99 -13
  19. package/dist/cli/signal.js.map +1 -1
  20. package/dist/cli/tasks.js +3 -46
  21. package/dist/cli/tasks.js.map +1 -1
  22. package/dist/core/agent-supervisor.d.ts +23 -0
  23. package/dist/core/agent-supervisor.js +42 -0
  24. package/dist/core/agent-supervisor.js.map +1 -0
  25. package/dist/core/auto-recovery.d.ts +3 -117
  26. package/dist/core/auto-recovery.js +4 -482
  27. package/dist/core/auto-recovery.js.map +1 -1
  28. package/dist/core/failure-policy.d.ts +0 -53
  29. package/dist/core/failure-policy.js +7 -175
  30. package/dist/core/failure-policy.js.map +1 -1
  31. package/dist/core/git-lifecycle-manager.d.ts +284 -0
  32. package/dist/core/git-lifecycle-manager.js +778 -0
  33. package/dist/core/git-lifecycle-manager.js.map +1 -0
  34. package/dist/core/git-pipeline-coordinator.d.ts +21 -0
  35. package/dist/core/git-pipeline-coordinator.js +205 -0
  36. package/dist/core/git-pipeline-coordinator.js.map +1 -0
  37. package/dist/core/intervention.d.ts +170 -0
  38. package/dist/core/intervention.js +408 -0
  39. package/dist/core/intervention.js.map +1 -0
  40. package/dist/core/lane-state-machine.d.ts +423 -0
  41. package/dist/core/lane-state-machine.js +890 -0
  42. package/dist/core/lane-state-machine.js.map +1 -0
  43. package/dist/core/orchestrator.d.ts +4 -1
  44. package/dist/core/orchestrator.js +39 -65
  45. package/dist/core/orchestrator.js.map +1 -1
  46. package/dist/core/runner/agent.d.ts +7 -1
  47. package/dist/core/runner/agent.js +54 -36
  48. package/dist/core/runner/agent.js.map +1 -1
  49. package/dist/core/runner/pipeline.js +283 -123
  50. package/dist/core/runner/pipeline.js.map +1 -1
  51. package/dist/core/runner/task.d.ts +4 -5
  52. package/dist/core/runner/task.js +6 -80
  53. package/dist/core/runner/task.js.map +1 -1
  54. package/dist/core/runner.js +8 -2
  55. package/dist/core/runner.js.map +1 -1
  56. package/dist/core/stall-detection.d.ts +11 -4
  57. package/dist/core/stall-detection.js +64 -27
  58. package/dist/core/stall-detection.js.map +1 -1
  59. package/dist/hooks/contexts/index.d.ts +104 -0
  60. package/dist/hooks/contexts/index.js +134 -0
  61. package/dist/hooks/contexts/index.js.map +1 -0
  62. package/dist/hooks/data-accessor.d.ts +86 -0
  63. package/dist/hooks/data-accessor.js +410 -0
  64. package/dist/hooks/data-accessor.js.map +1 -0
  65. package/dist/hooks/flow-controller.d.ts +136 -0
  66. package/dist/hooks/flow-controller.js +351 -0
  67. package/dist/hooks/flow-controller.js.map +1 -0
  68. package/dist/hooks/index.d.ts +68 -0
  69. package/dist/hooks/index.js +105 -0
  70. package/dist/hooks/index.js.map +1 -0
  71. package/dist/hooks/manager.d.ts +129 -0
  72. package/dist/hooks/manager.js +389 -0
  73. package/dist/hooks/manager.js.map +1 -0
  74. package/dist/hooks/types.d.ts +463 -0
  75. package/dist/hooks/types.js +45 -0
  76. package/dist/hooks/types.js.map +1 -0
  77. package/dist/services/logging/buffer.d.ts +2 -2
  78. package/dist/services/logging/buffer.js +95 -42
  79. package/dist/services/logging/buffer.js.map +1 -1
  80. package/dist/services/logging/console.js +6 -1
  81. package/dist/services/logging/console.js.map +1 -1
  82. package/dist/services/logging/formatter.d.ts +9 -4
  83. package/dist/services/logging/formatter.js +64 -18
  84. package/dist/services/logging/formatter.js.map +1 -1
  85. package/dist/services/logging/index.d.ts +0 -1
  86. package/dist/services/logging/index.js +0 -1
  87. package/dist/services/logging/index.js.map +1 -1
  88. package/dist/services/logging/paths.d.ts +8 -0
  89. package/dist/services/logging/paths.js +48 -0
  90. package/dist/services/logging/paths.js.map +1 -0
  91. package/dist/services/logging/raw-log.d.ts +6 -0
  92. package/dist/services/logging/raw-log.js +37 -0
  93. package/dist/services/logging/raw-log.js.map +1 -0
  94. package/dist/services/process/index.js +1 -1
  95. package/dist/services/process/index.js.map +1 -1
  96. package/dist/types/agent.d.ts +15 -0
  97. package/dist/types/config.d.ts +22 -1
  98. package/dist/types/event-categories.d.ts +601 -0
  99. package/dist/types/event-categories.js +233 -0
  100. package/dist/types/event-categories.js.map +1 -0
  101. package/dist/types/events.d.ts +0 -20
  102. package/dist/types/flow.d.ts +10 -6
  103. package/dist/types/index.d.ts +1 -1
  104. package/dist/types/index.js +17 -3
  105. package/dist/types/index.js.map +1 -1
  106. package/dist/types/lane.d.ts +1 -1
  107. package/dist/types/logging.d.ts +1 -1
  108. package/dist/types/task.d.ts +12 -1
  109. package/dist/ui/log-viewer.d.ts +3 -0
  110. package/dist/ui/log-viewer.js +3 -0
  111. package/dist/ui/log-viewer.js.map +1 -1
  112. package/dist/utils/config.js +10 -1
  113. package/dist/utils/config.js.map +1 -1
  114. package/dist/utils/cursor-agent.d.ts +11 -1
  115. package/dist/utils/cursor-agent.js +63 -16
  116. package/dist/utils/cursor-agent.js.map +1 -1
  117. package/dist/utils/enhanced-logger.d.ts +5 -1
  118. package/dist/utils/enhanced-logger.js +98 -19
  119. package/dist/utils/enhanced-logger.js.map +1 -1
  120. package/dist/utils/event-registry.d.ts +222 -0
  121. package/dist/utils/event-registry.js +463 -0
  122. package/dist/utils/event-registry.js.map +1 -0
  123. package/dist/utils/events.d.ts +1 -13
  124. package/dist/utils/events.js.map +1 -1
  125. package/dist/utils/flow.d.ts +10 -0
  126. package/dist/utils/flow.js +75 -0
  127. package/dist/utils/flow.js.map +1 -1
  128. package/dist/utils/log-constants.d.ts +1 -0
  129. package/dist/utils/log-constants.js +2 -1
  130. package/dist/utils/log-constants.js.map +1 -1
  131. package/dist/utils/log-formatter.d.ts +2 -1
  132. package/dist/utils/log-formatter.js +10 -10
  133. package/dist/utils/log-formatter.js.map +1 -1
  134. package/dist/utils/logger.d.ts +11 -0
  135. package/dist/utils/logger.js +82 -3
  136. package/dist/utils/logger.js.map +1 -1
  137. package/dist/utils/repro-thinking-logs.js +0 -13
  138. package/dist/utils/repro-thinking-logs.js.map +1 -1
  139. package/dist/utils/run-service.js +1 -1
  140. package/dist/utils/run-service.js.map +1 -1
  141. package/examples/README.md +0 -2
  142. package/examples/demo-project/README.md +1 -2
  143. package/package.json +13 -34
  144. package/scripts/setup-security.sh +0 -1
  145. package/scripts/test-log-parser.ts +171 -0
  146. package/scripts/verify-change.sh +272 -0
  147. package/src/cli/index.ts +0 -6
  148. package/src/cli/logs.ts +121 -10
  149. package/src/cli/models.ts +20 -3
  150. package/src/cli/monitor.ts +1273 -1342
  151. package/src/cli/resume.ts +27 -1
  152. package/src/cli/run.ts +29 -11
  153. package/src/cli/signal.ts +120 -18
  154. package/src/cli/tasks.ts +2 -59
  155. package/src/core/agent-supervisor.ts +64 -0
  156. package/src/core/auto-recovery.ts +14 -590
  157. package/src/core/failure-policy.ts +7 -229
  158. package/src/core/git-lifecycle-manager.ts +1011 -0
  159. package/src/core/git-pipeline-coordinator.ts +221 -0
  160. package/src/core/intervention.ts +463 -0
  161. package/src/core/lane-state-machine.ts +1097 -0
  162. package/src/core/orchestrator.ts +48 -64
  163. package/src/core/runner/agent.ts +77 -39
  164. package/src/core/runner/pipeline.ts +318 -138
  165. package/src/core/runner/task.ts +12 -97
  166. package/src/core/runner.ts +8 -2
  167. package/src/core/stall-detection.ts +74 -27
  168. package/src/hooks/contexts/index.ts +256 -0
  169. package/src/hooks/data-accessor.ts +488 -0
  170. package/src/hooks/flow-controller.ts +425 -0
  171. package/src/hooks/index.ts +154 -0
  172. package/src/hooks/manager.ts +434 -0
  173. package/src/hooks/types.ts +544 -0
  174. package/src/services/logging/buffer.ts +104 -43
  175. package/src/services/logging/console.ts +7 -1
  176. package/src/services/logging/formatter.ts +74 -18
  177. package/src/services/logging/index.ts +0 -2
  178. package/src/services/logging/paths.ts +14 -0
  179. package/src/services/logging/raw-log.ts +43 -0
  180. package/src/services/process/index.ts +1 -1
  181. package/src/types/agent.ts +15 -0
  182. package/src/types/config.ts +23 -1
  183. package/src/types/event-categories.ts +663 -0
  184. package/src/types/events.ts +0 -25
  185. package/src/types/flow.ts +10 -6
  186. package/src/types/index.ts +50 -4
  187. package/src/types/lane.ts +1 -2
  188. package/src/types/logging.ts +2 -1
  189. package/src/types/task.ts +12 -1
  190. package/src/ui/log-viewer.ts +3 -0
  191. package/src/utils/config.ts +11 -1
  192. package/src/utils/cursor-agent.ts +68 -16
  193. package/src/utils/enhanced-logger.ts +105 -19
  194. package/src/utils/event-registry.ts +595 -0
  195. package/src/utils/events.ts +0 -16
  196. package/src/utils/flow.ts +83 -0
  197. package/src/utils/log-constants.ts +2 -1
  198. package/src/utils/log-formatter.ts +10 -11
  199. package/src/utils/logger.ts +49 -3
  200. package/src/utils/repro-thinking-logs.ts +0 -15
  201. package/src/utils/run-service.ts +1 -1
  202. package/dist/cli/prepare.d.ts +0 -7
  203. package/dist/cli/prepare.js +0 -690
  204. package/dist/cli/prepare.js.map +0 -1
  205. package/dist/services/logging/file-writer.d.ts +0 -71
  206. package/dist/services/logging/file-writer.js +0 -516
  207. package/dist/services/logging/file-writer.js.map +0 -1
  208. package/dist/types/review.d.ts +0 -17
  209. package/dist/types/review.js +0 -6
  210. package/dist/types/review.js.map +0 -1
  211. package/scripts/ai-security-check.js +0 -233
  212. package/src/cli/prepare.ts +0 -777
  213. package/src/services/logging/file-writer.ts +0 -526
  214. package/src/types/review.ts +0 -20
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Event Registry - 타입화된 이벤트 버스
3
+ *
4
+ * 기존 events.ts를 확장하여 타입 안전한 이벤트 발행/구독을 제공합니다.
5
+ *
6
+ * 특징:
7
+ * - 타입 안전한 이벤트 발행/구독
8
+ * - 카테고리별 이벤트 필터링
9
+ * - 이벤트 히스토리 관리
10
+ * - 이벤트 직렬화/역직렬화
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ import { EventCategory, EventPayloadMap, TypedCursorFlowEvent, TypedEventHandler, GenericEventHandler, OrchestrationEventType, LaneEventType, TaskEventType, GitEventType, RecoveryEventType, AgentEventType, StateEventType, SystemEventType } from '../types/event-categories';
14
+ /**
15
+ * 이벤트 레지스트리 설정
16
+ */
17
+ export interface EventRegistryConfig {
18
+ /** 이벤트 히스토리 최대 크기 (0 = 무제한) */
19
+ maxHistorySize: number;
20
+ /** 이벤트 히스토리 유지 시간 (ms, 0 = 영구) */
21
+ historyTtlMs: number;
22
+ /** 디버그 모드 */
23
+ debug: boolean;
24
+ /** 이벤트 발행 시 콘솔 출력 */
25
+ logEvents: boolean;
26
+ /** 로그할 이벤트 카테고리 (빈 배열 = 모두) */
27
+ logCategories: EventCategory[];
28
+ }
29
+ /**
30
+ * 타입화된 이벤트 레지스트리
31
+ *
32
+ * 사용 예:
33
+ * ```typescript
34
+ * const registry = EventRegistry.getInstance();
35
+ *
36
+ * // 타입 안전한 이벤트 발행
37
+ * registry.emit(OrchestrationEventType.STARTED, {
38
+ * runId: 'run-123',
39
+ * tasksDir: '/path/to/tasks',
40
+ * laneCount: 3,
41
+ * runRoot: '/path/to/run'
42
+ * });
43
+ *
44
+ * // 타입 안전한 이벤트 구독
45
+ * registry.on(LaneEventType.COMPLETED, (event) => {
46
+ * console.log(event.payload.laneName, event.payload.exitCode);
47
+ * });
48
+ *
49
+ * // 카테고리별 구독
50
+ * registry.onCategory(EventCategory.GIT, (event) => {
51
+ * console.log('Git event:', event.type);
52
+ * });
53
+ *
54
+ * // 와일드카드 구독
55
+ * registry.onAny((event) => {
56
+ * console.log('Any event:', event.type);
57
+ * });
58
+ * ```
59
+ */
60
+ export declare class EventRegistry extends EventEmitter {
61
+ private static instance;
62
+ private config;
63
+ private runId;
64
+ private eventHistory;
65
+ private categoryHandlers;
66
+ private constructor();
67
+ /**
68
+ * 싱글톤 인스턴스 획득
69
+ */
70
+ static getInstance(config?: Partial<EventRegistryConfig>): EventRegistry;
71
+ /**
72
+ * 인스턴스 리셋 (테스트용)
73
+ */
74
+ static resetInstance(): void;
75
+ /**
76
+ * 설정 업데이트
77
+ */
78
+ updateConfig(config: Partial<EventRegistryConfig>): void;
79
+ /**
80
+ * Run ID 설정
81
+ */
82
+ setRunId(id: string): void;
83
+ /**
84
+ * Run ID 조회
85
+ */
86
+ getRunId(): string;
87
+ /**
88
+ * 타입 안전한 이벤트 발행
89
+ */
90
+ emit<T extends keyof EventPayloadMap>(type: T, payload: EventPayloadMap[T], options?: {
91
+ laneName?: string;
92
+ }): boolean;
93
+ /**
94
+ * 이벤트 ID 생성
95
+ */
96
+ private generateEventId;
97
+ /**
98
+ * 페이로드에서 laneName 추출
99
+ */
100
+ private extractLaneName;
101
+ /**
102
+ * 타입 안전한 이벤트 구독
103
+ */
104
+ on<T extends keyof EventPayloadMap>(type: T, handler: TypedEventHandler<T>): this;
105
+ /**
106
+ * 일회성 이벤트 구독
107
+ */
108
+ once<T extends keyof EventPayloadMap>(type: T, handler: TypedEventHandler<T>): this;
109
+ /**
110
+ * 이벤트 구독 해제
111
+ */
112
+ off<T extends keyof EventPayloadMap>(type: T, handler: TypedEventHandler<T>): this;
113
+ /**
114
+ * 카테고리별 이벤트 구독
115
+ */
116
+ onCategory(category: EventCategory, handler: GenericEventHandler): () => void;
117
+ /**
118
+ * 모든 이벤트 구독
119
+ */
120
+ onAny(handler: GenericEventHandler): () => void;
121
+ /**
122
+ * 히스토리에 이벤트 추가
123
+ */
124
+ private addToHistory;
125
+ /**
126
+ * 이벤트 히스토리 조회
127
+ */
128
+ getHistory(options?: {
129
+ category?: EventCategory;
130
+ laneName?: string;
131
+ type?: string;
132
+ since?: number;
133
+ limit?: number;
134
+ }): TypedCursorFlowEvent[];
135
+ /**
136
+ * Lane별 이벤트 히스토리 조회
137
+ */
138
+ getLaneHistory(laneName: string, limit?: number): TypedCursorFlowEvent[];
139
+ /**
140
+ * 카테고리별 이벤트 히스토리 조회
141
+ */
142
+ getCategoryHistory(category: EventCategory, limit?: number): TypedCursorFlowEvent[];
143
+ /**
144
+ * 히스토리 초기화
145
+ */
146
+ clearHistory(): void;
147
+ /**
148
+ * 이벤트 로깅 여부 결정
149
+ */
150
+ private shouldLogEvent;
151
+ /**
152
+ * 이벤트 로깅
153
+ */
154
+ private logEvent;
155
+ /**
156
+ * 이벤트를 JSON으로 직렬화
157
+ */
158
+ serializeEvent(event: TypedCursorFlowEvent): string;
159
+ /**
160
+ * JSON에서 이벤트 역직렬화
161
+ */
162
+ deserializeEvent(json: string): TypedCursorFlowEvent | null;
163
+ /**
164
+ * 히스토리를 JSONL 형식으로 내보내기
165
+ */
166
+ exportHistory(): string;
167
+ /**
168
+ * JSONL에서 히스토리 가져오기
169
+ */
170
+ importHistory(jsonl: string): number;
171
+ /**
172
+ * 마지막 이벤트 조회
173
+ */
174
+ getLastEvent(laneName?: string): TypedCursorFlowEvent | undefined;
175
+ /**
176
+ * 이벤트 카운트 조회
177
+ */
178
+ getEventCount(options?: {
179
+ category?: EventCategory;
180
+ laneName?: string;
181
+ }): number;
182
+ /**
183
+ * 특정 이벤트 대기 (Promise)
184
+ */
185
+ waitFor<T extends keyof EventPayloadMap>(type: T, options?: {
186
+ timeout?: number;
187
+ filter?: (event: TypedCursorFlowEvent<T>) => boolean;
188
+ }): Promise<TypedCursorFlowEvent<T>>;
189
+ }
190
+ /**
191
+ * Orchestration 이벤트인지 확인
192
+ */
193
+ export declare function isOrchestrationEvent(event: TypedCursorFlowEvent): boolean;
194
+ /**
195
+ * Lane 이벤트인지 확인
196
+ */
197
+ export declare function isLaneEvent(event: TypedCursorFlowEvent): boolean;
198
+ /**
199
+ * Task 이벤트인지 확인
200
+ */
201
+ export declare function isTaskEvent(event: TypedCursorFlowEvent): boolean;
202
+ /**
203
+ * Git 이벤트인지 확인
204
+ */
205
+ export declare function isGitEvent(event: TypedCursorFlowEvent): boolean;
206
+ /**
207
+ * Recovery 이벤트인지 확인
208
+ */
209
+ export declare function isRecoveryEvent(event: TypedCursorFlowEvent): boolean;
210
+ /**
211
+ * 오류 이벤트인지 확인
212
+ */
213
+ export declare function isErrorEvent(event: TypedCursorFlowEvent): boolean;
214
+ /**
215
+ * 싱글톤 인스턴스 획득
216
+ */
217
+ export declare function getEventRegistry(config?: Partial<EventRegistryConfig>): EventRegistry;
218
+ /**
219
+ * 인스턴스 리셋 (테스트용)
220
+ */
221
+ export declare function resetEventRegistry(): void;
222
+ export { EventCategory, OrchestrationEventType, LaneEventType, TaskEventType, GitEventType, RecoveryEventType, AgentEventType, StateEventType, SystemEventType, };
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+ /**
3
+ * Event Registry - 타입화된 이벤트 버스
4
+ *
5
+ * 기존 events.ts를 확장하여 타입 안전한 이벤트 발행/구독을 제공합니다.
6
+ *
7
+ * 특징:
8
+ * - 타입 안전한 이벤트 발행/구독
9
+ * - 카테고리별 이벤트 필터링
10
+ * - 이벤트 히스토리 관리
11
+ * - 이벤트 직렬화/역직렬화
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.SystemEventType = exports.StateEventType = exports.AgentEventType = exports.RecoveryEventType = exports.GitEventType = exports.TaskEventType = exports.LaneEventType = exports.OrchestrationEventType = exports.EventCategory = exports.EventRegistry = void 0;
15
+ exports.isOrchestrationEvent = isOrchestrationEvent;
16
+ exports.isLaneEvent = isLaneEvent;
17
+ exports.isTaskEvent = isTaskEvent;
18
+ exports.isGitEvent = isGitEvent;
19
+ exports.isRecoveryEvent = isRecoveryEvent;
20
+ exports.isErrorEvent = isErrorEvent;
21
+ exports.getEventRegistry = getEventRegistry;
22
+ exports.resetEventRegistry = resetEventRegistry;
23
+ const events_1 = require("events");
24
+ const event_categories_1 = require("../types/event-categories");
25
+ Object.defineProperty(exports, "EventCategory", { enumerable: true, get: function () { return event_categories_1.EventCategory; } });
26
+ Object.defineProperty(exports, "OrchestrationEventType", { enumerable: true, get: function () { return
27
+ // Event Types
28
+ event_categories_1.OrchestrationEventType; } });
29
+ Object.defineProperty(exports, "LaneEventType", { enumerable: true, get: function () { return event_categories_1.LaneEventType; } });
30
+ Object.defineProperty(exports, "TaskEventType", { enumerable: true, get: function () { return event_categories_1.TaskEventType; } });
31
+ Object.defineProperty(exports, "GitEventType", { enumerable: true, get: function () { return event_categories_1.GitEventType; } });
32
+ Object.defineProperty(exports, "RecoveryEventType", { enumerable: true, get: function () { return event_categories_1.RecoveryEventType; } });
33
+ Object.defineProperty(exports, "AgentEventType", { enumerable: true, get: function () { return event_categories_1.AgentEventType; } });
34
+ Object.defineProperty(exports, "StateEventType", { enumerable: true, get: function () { return event_categories_1.StateEventType; } });
35
+ Object.defineProperty(exports, "SystemEventType", { enumerable: true, get: function () { return event_categories_1.SystemEventType; } });
36
+ const DEFAULT_CONFIG = {
37
+ maxHistorySize: 1000,
38
+ historyTtlMs: 30 * 60 * 1000, // 30분
39
+ debug: false,
40
+ logEvents: false,
41
+ logCategories: [],
42
+ };
43
+ // ============================================================================
44
+ // Event Registry
45
+ // ============================================================================
46
+ /**
47
+ * 타입화된 이벤트 레지스트리
48
+ *
49
+ * 사용 예:
50
+ * ```typescript
51
+ * const registry = EventRegistry.getInstance();
52
+ *
53
+ * // 타입 안전한 이벤트 발행
54
+ * registry.emit(OrchestrationEventType.STARTED, {
55
+ * runId: 'run-123',
56
+ * tasksDir: '/path/to/tasks',
57
+ * laneCount: 3,
58
+ * runRoot: '/path/to/run'
59
+ * });
60
+ *
61
+ * // 타입 안전한 이벤트 구독
62
+ * registry.on(LaneEventType.COMPLETED, (event) => {
63
+ * console.log(event.payload.laneName, event.payload.exitCode);
64
+ * });
65
+ *
66
+ * // 카테고리별 구독
67
+ * registry.onCategory(EventCategory.GIT, (event) => {
68
+ * console.log('Git event:', event.type);
69
+ * });
70
+ *
71
+ * // 와일드카드 구독
72
+ * registry.onAny((event) => {
73
+ * console.log('Any event:', event.type);
74
+ * });
75
+ * ```
76
+ */
77
+ class EventRegistry extends events_1.EventEmitter {
78
+ static instance = null;
79
+ config;
80
+ runId = '';
81
+ eventHistory = [];
82
+ categoryHandlers = new Map();
83
+ constructor(config = {}) {
84
+ super();
85
+ this.config = { ...DEFAULT_CONFIG, ...config };
86
+ this.setMaxListeners(100); // 많은 리스너 허용
87
+ }
88
+ /**
89
+ * 싱글톤 인스턴스 획득
90
+ */
91
+ static getInstance(config) {
92
+ if (!EventRegistry.instance) {
93
+ EventRegistry.instance = new EventRegistry(config);
94
+ }
95
+ else if (config) {
96
+ EventRegistry.instance.updateConfig(config);
97
+ }
98
+ return EventRegistry.instance;
99
+ }
100
+ /**
101
+ * 인스턴스 리셋 (테스트용)
102
+ */
103
+ static resetInstance() {
104
+ EventRegistry.instance = null;
105
+ }
106
+ /**
107
+ * 설정 업데이트
108
+ */
109
+ updateConfig(config) {
110
+ this.config = { ...this.config, ...config };
111
+ }
112
+ /**
113
+ * Run ID 설정
114
+ */
115
+ setRunId(id) {
116
+ this.runId = id;
117
+ }
118
+ /**
119
+ * Run ID 조회
120
+ */
121
+ getRunId() {
122
+ return this.runId;
123
+ }
124
+ // --------------------------------------------------------------------------
125
+ // Type-safe Event Emission
126
+ // --------------------------------------------------------------------------
127
+ /**
128
+ * 타입 안전한 이벤트 발행
129
+ */
130
+ emit(type, payload, options = {}) {
131
+ const category = (0, event_categories_1.getCategoryFromEventType)(type);
132
+ const event = {
133
+ id: this.generateEventId(),
134
+ type,
135
+ category,
136
+ timestamp: new Date().toISOString(),
137
+ runId: this.runId,
138
+ laneName: options.laneName || this.extractLaneName(payload),
139
+ payload,
140
+ };
141
+ // 히스토리에 추가
142
+ this.addToHistory(event);
143
+ // 디버그 로깅
144
+ if (this.config.logEvents && this.shouldLogEvent(category)) {
145
+ this.logEvent(event);
146
+ }
147
+ // 이벤트 발행
148
+ super.emit(type, event);
149
+ // 카테고리별 핸들러 호출
150
+ const categoryHandlers = this.categoryHandlers.get(category);
151
+ if (categoryHandlers) {
152
+ for (const handler of categoryHandlers) {
153
+ try {
154
+ handler(event);
155
+ }
156
+ catch (error) {
157
+ console.error(`Event handler error for ${type}:`, error);
158
+ }
159
+ }
160
+ }
161
+ // 와일드카드 패턴 발행
162
+ super.emit(`${category}.*`, event);
163
+ super.emit('*', event);
164
+ return true;
165
+ }
166
+ /**
167
+ * 이벤트 ID 생성
168
+ */
169
+ generateEventId() {
170
+ return `evt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
171
+ }
172
+ /**
173
+ * 페이로드에서 laneName 추출
174
+ */
175
+ extractLaneName(payload) {
176
+ if (typeof payload === 'object' && payload !== null) {
177
+ return payload.laneName;
178
+ }
179
+ return undefined;
180
+ }
181
+ // --------------------------------------------------------------------------
182
+ // Type-safe Event Subscription
183
+ // --------------------------------------------------------------------------
184
+ /**
185
+ * 타입 안전한 이벤트 구독
186
+ */
187
+ on(type, handler) {
188
+ return super.on(type, handler);
189
+ }
190
+ /**
191
+ * 일회성 이벤트 구독
192
+ */
193
+ once(type, handler) {
194
+ return super.once(type, handler);
195
+ }
196
+ /**
197
+ * 이벤트 구독 해제
198
+ */
199
+ off(type, handler) {
200
+ return super.off(type, handler);
201
+ }
202
+ /**
203
+ * 카테고리별 이벤트 구독
204
+ */
205
+ onCategory(category, handler) {
206
+ if (!this.categoryHandlers.has(category)) {
207
+ this.categoryHandlers.set(category, []);
208
+ }
209
+ this.categoryHandlers.get(category).push(handler);
210
+ // 와일드카드 패턴도 등록
211
+ super.on(`${category}.*`, handler);
212
+ // 구독 해제 함수 반환
213
+ return () => {
214
+ const handlers = this.categoryHandlers.get(category);
215
+ if (handlers) {
216
+ const index = handlers.indexOf(handler);
217
+ if (index > -1) {
218
+ handlers.splice(index, 1);
219
+ }
220
+ }
221
+ super.off(`${category}.*`, handler);
222
+ };
223
+ }
224
+ /**
225
+ * 모든 이벤트 구독
226
+ */
227
+ onAny(handler) {
228
+ super.on('*', handler);
229
+ return () => {
230
+ super.off('*', handler);
231
+ };
232
+ }
233
+ // --------------------------------------------------------------------------
234
+ // Event History
235
+ // --------------------------------------------------------------------------
236
+ /**
237
+ * 히스토리에 이벤트 추가
238
+ */
239
+ addToHistory(event) {
240
+ this.eventHistory.push(event);
241
+ // 크기 제한 적용
242
+ if (this.config.maxHistorySize > 0 && this.eventHistory.length > this.config.maxHistorySize) {
243
+ this.eventHistory = this.eventHistory.slice(-this.config.maxHistorySize);
244
+ }
245
+ // TTL 적용
246
+ if (this.config.historyTtlMs > 0) {
247
+ const cutoffTime = Date.now() - this.config.historyTtlMs;
248
+ this.eventHistory = this.eventHistory.filter(e => new Date(e.timestamp).getTime() > cutoffTime);
249
+ }
250
+ }
251
+ /**
252
+ * 이벤트 히스토리 조회
253
+ */
254
+ getHistory(options = {}) {
255
+ let result = this.eventHistory;
256
+ if (options.category) {
257
+ result = result.filter(e => e.category === options.category);
258
+ }
259
+ if (options.laneName) {
260
+ result = result.filter(e => e.laneName === options.laneName);
261
+ }
262
+ if (options.type) {
263
+ result = result.filter(e => e.type === options.type);
264
+ }
265
+ if (options.since) {
266
+ result = result.filter(e => new Date(e.timestamp).getTime() >= options.since);
267
+ }
268
+ if (options.limit) {
269
+ result = result.slice(-options.limit);
270
+ }
271
+ return result;
272
+ }
273
+ /**
274
+ * Lane별 이벤트 히스토리 조회
275
+ */
276
+ getLaneHistory(laneName, limit) {
277
+ return this.getHistory({ laneName, limit });
278
+ }
279
+ /**
280
+ * 카테고리별 이벤트 히스토리 조회
281
+ */
282
+ getCategoryHistory(category, limit) {
283
+ return this.getHistory({ category, limit });
284
+ }
285
+ /**
286
+ * 히스토리 초기화
287
+ */
288
+ clearHistory() {
289
+ this.eventHistory = [];
290
+ }
291
+ // --------------------------------------------------------------------------
292
+ // Event Logging
293
+ // --------------------------------------------------------------------------
294
+ /**
295
+ * 이벤트 로깅 여부 결정
296
+ */
297
+ shouldLogEvent(category) {
298
+ if (this.config.logCategories.length === 0) {
299
+ return true;
300
+ }
301
+ return this.config.logCategories.includes(category);
302
+ }
303
+ /**
304
+ * 이벤트 로깅
305
+ */
306
+ logEvent(event) {
307
+ const { type, category, laneName, timestamp } = event;
308
+ const laneLabel = laneName ? `[${laneName}]` : '';
309
+ console.log(`[Event] ${timestamp} ${category}.${type.split('.')[1]} ${laneLabel}`);
310
+ if (this.config.debug) {
311
+ console.log(' Payload:', JSON.stringify(event.payload, null, 2));
312
+ }
313
+ }
314
+ // --------------------------------------------------------------------------
315
+ // Event Serialization
316
+ // --------------------------------------------------------------------------
317
+ /**
318
+ * 이벤트를 JSON으로 직렬화
319
+ */
320
+ serializeEvent(event) {
321
+ return JSON.stringify(event);
322
+ }
323
+ /**
324
+ * JSON에서 이벤트 역직렬화
325
+ */
326
+ deserializeEvent(json) {
327
+ try {
328
+ return JSON.parse(json);
329
+ }
330
+ catch {
331
+ return null;
332
+ }
333
+ }
334
+ /**
335
+ * 히스토리를 JSONL 형식으로 내보내기
336
+ */
337
+ exportHistory() {
338
+ return this.eventHistory.map(e => JSON.stringify(e)).join('\n');
339
+ }
340
+ /**
341
+ * JSONL에서 히스토리 가져오기
342
+ */
343
+ importHistory(jsonl) {
344
+ const lines = jsonl.split('\n').filter(l => l.trim());
345
+ let imported = 0;
346
+ for (const line of lines) {
347
+ const event = this.deserializeEvent(line);
348
+ if (event) {
349
+ this.eventHistory.push(event);
350
+ imported++;
351
+ }
352
+ }
353
+ return imported;
354
+ }
355
+ // --------------------------------------------------------------------------
356
+ // Convenience Methods
357
+ // --------------------------------------------------------------------------
358
+ /**
359
+ * 마지막 이벤트 조회
360
+ */
361
+ getLastEvent(laneName) {
362
+ if (laneName) {
363
+ const laneHistory = this.getLaneHistory(laneName, 1);
364
+ return laneHistory[0];
365
+ }
366
+ return this.eventHistory[this.eventHistory.length - 1];
367
+ }
368
+ /**
369
+ * 이벤트 카운트 조회
370
+ */
371
+ getEventCount(options = {}) {
372
+ return this.getHistory(options).length;
373
+ }
374
+ /**
375
+ * 특정 이벤트 대기 (Promise)
376
+ */
377
+ waitFor(type, options = {}) {
378
+ return new Promise((resolve, reject) => {
379
+ const timeout = options.timeout || 30000;
380
+ const timer = setTimeout(() => {
381
+ this.off(type, handler);
382
+ reject(new Error(`Timeout waiting for event: ${type}`));
383
+ }, timeout);
384
+ const handler = (event) => {
385
+ if (!options.filter || options.filter(event)) {
386
+ clearTimeout(timer);
387
+ this.off(type, handler);
388
+ resolve(event);
389
+ }
390
+ };
391
+ this.on(type, handler);
392
+ });
393
+ }
394
+ }
395
+ exports.EventRegistry = EventRegistry;
396
+ // ============================================================================
397
+ // Event Type Guards
398
+ // ============================================================================
399
+ /**
400
+ * Orchestration 이벤트인지 확인
401
+ */
402
+ function isOrchestrationEvent(event) {
403
+ return event.category === event_categories_1.EventCategory.ORCHESTRATION;
404
+ }
405
+ /**
406
+ * Lane 이벤트인지 확인
407
+ */
408
+ function isLaneEvent(event) {
409
+ return event.category === event_categories_1.EventCategory.LANE;
410
+ }
411
+ /**
412
+ * Task 이벤트인지 확인
413
+ */
414
+ function isTaskEvent(event) {
415
+ return event.category === event_categories_1.EventCategory.TASK;
416
+ }
417
+ /**
418
+ * Git 이벤트인지 확인
419
+ */
420
+ function isGitEvent(event) {
421
+ return event.category === event_categories_1.EventCategory.GIT;
422
+ }
423
+ /**
424
+ * Recovery 이벤트인지 확인
425
+ */
426
+ function isRecoveryEvent(event) {
427
+ return event.category === event_categories_1.EventCategory.RECOVERY;
428
+ }
429
+ /**
430
+ * 오류 이벤트인지 확인
431
+ */
432
+ function isErrorEvent(event) {
433
+ const errorTypes = [
434
+ event_categories_1.OrchestrationEventType.FAILED,
435
+ event_categories_1.LaneEventType.FAILED,
436
+ event_categories_1.TaskEventType.FAILED,
437
+ event_categories_1.GitEventType.ERROR,
438
+ event_categories_1.GitEventType.MERGE_CONFLICT,
439
+ event_categories_1.GitEventType.PUSH_REJECTED,
440
+ event_categories_1.AgentEventType.CONNECTION_ERROR,
441
+ event_categories_1.AgentEventType.AUTH_ERROR,
442
+ event_categories_1.AgentEventType.TIMEOUT,
443
+ event_categories_1.StateEventType.TRANSITION_FAILED,
444
+ event_categories_1.StateEventType.CORRUPTED,
445
+ ];
446
+ return errorTypes.includes(event.type);
447
+ }
448
+ // ============================================================================
449
+ // Convenience Functions
450
+ // ============================================================================
451
+ /**
452
+ * 싱글톤 인스턴스 획득
453
+ */
454
+ function getEventRegistry(config) {
455
+ return EventRegistry.getInstance(config);
456
+ }
457
+ /**
458
+ * 인스턴스 리셋 (테스트용)
459
+ */
460
+ function resetEventRegistry() {
461
+ EventRegistry.resetInstance();
462
+ }
463
+ //# sourceMappingURL=event-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-registry.js","sourceRoot":"","sources":["../../src/utils/event-registry.ts"],"names":[],"mappings":"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"}