@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,424 @@
1
+ "use strict";
2
+ /**
3
+ * Intervention Executor - 즉각적인 에이전트 개입을 위한 통합 모듈
4
+ *
5
+ * 핵심 기능:
6
+ * - 실행 중인 cursor-agent 프로세스 종료
7
+ * - 개입 메시지와 함께 세션 resume
8
+ * - signal, stall-detection에서 일관된 방식으로 사용
9
+ *
10
+ * 동작 원리:
11
+ * 1. 개입 요청 시 pending-intervention.json 파일 생성
12
+ * 2. 현재 프로세스 SIGTERM으로 종료
13
+ * 3. Orchestrator/Runner가 프로세스 종료 감지
14
+ * 4. pending-intervention.json 읽어서 개입 메시지 포함하여 resume
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.LEGACY_INTERVENTION_FILE = exports.PENDING_INTERVENTION_FILE = exports.InterventionType = void 0;
51
+ exports.createContinueMessage = createContinueMessage;
52
+ exports.createStrongerPromptMessage = createStrongerPromptMessage;
53
+ exports.createRestartMessage = createRestartMessage;
54
+ exports.wrapUserIntervention = wrapUserIntervention;
55
+ exports.getPendingInterventionPath = getPendingInterventionPath;
56
+ exports.getLegacyInterventionPath = getLegacyInterventionPath;
57
+ exports.createInterventionRequest = createInterventionRequest;
58
+ exports.readPendingIntervention = readPendingIntervention;
59
+ exports.clearPendingIntervention = clearPendingIntervention;
60
+ exports.hasPendingIntervention = hasPendingIntervention;
61
+ exports.killProcess = killProcess;
62
+ exports.isProcessAlive = isProcessAlive;
63
+ exports.killAndWait = killAndWait;
64
+ exports.killChildProcess = killChildProcess;
65
+ exports.executeIntervention = executeIntervention;
66
+ exports.executeUserIntervention = executeUserIntervention;
67
+ exports.executeContinueSignal = executeContinueSignal;
68
+ exports.executeStrongerPrompt = executeStrongerPrompt;
69
+ exports.executeGitGuidance = executeGitGuidance;
70
+ exports.buildResumePromptWithIntervention = buildResumePromptWithIntervention;
71
+ exports.isInterventionRestart = isInterventionRestart;
72
+ const fs = __importStar(require("fs"));
73
+ const logger = __importStar(require("../utils/logger"));
74
+ const path_1 = require("../utils/path");
75
+ const state_1 = require("../utils/state");
76
+ // ============================================================================
77
+ // Types
78
+ // ============================================================================
79
+ /**
80
+ * 개입 요청 타입
81
+ */
82
+ var InterventionType;
83
+ (function (InterventionType) {
84
+ /** 사용자가 직접 보낸 메시지 */
85
+ InterventionType["USER_MESSAGE"] = "user_message";
86
+ /** Stall 감지로 인한 continue 신호 */
87
+ InterventionType["CONTINUE_SIGNAL"] = "continue_signal";
88
+ /** Stall 감지로 인한 stronger prompt */
89
+ InterventionType["STRONGER_PROMPT"] = "stronger_prompt";
90
+ /** 시스템 재시작 요청 */
91
+ InterventionType["SYSTEM_RESTART"] = "system_restart";
92
+ /** Git 에러 가이던스 */
93
+ InterventionType["GIT_GUIDANCE"] = "git_guidance";
94
+ })(InterventionType || (exports.InterventionType = InterventionType = {}));
95
+ // ============================================================================
96
+ // Constants
97
+ // ============================================================================
98
+ /** 개입 요청 파일명 */
99
+ exports.PENDING_INTERVENTION_FILE = 'pending-intervention.json';
100
+ /** 기존 intervention.txt 파일명 (호환성 유지) */
101
+ exports.LEGACY_INTERVENTION_FILE = 'intervention.txt';
102
+ /** 프로세스 종료 대기 시간 (ms) */
103
+ const KILL_TIMEOUT_MS = 5000;
104
+ // ============================================================================
105
+ // Intervention Messages
106
+ // ============================================================================
107
+ /**
108
+ * Continue 신호 메시지 생성
109
+ */
110
+ function createContinueMessage() {
111
+ return `[SYSTEM] Please continue with your current task. If you're waiting for something, explain what you need and proceed with what you can do now.`;
112
+ }
113
+ /**
114
+ * Stronger prompt 메시지 생성
115
+ */
116
+ function createStrongerPromptMessage() {
117
+ return `[SYSTEM INTERVENTION] You appear to be stuck or unresponsive. Please:
118
+ 1. If you've completed the current task, summarize your work and proceed to the next task.
119
+ 2. If you encountered an error, describe it and attempt to resolve it.
120
+ 3. If you're waiting for something, explain what and continue with available work.
121
+ 4. If you encountered a git error, resolve it (pull/rebase/merge) and continue.
122
+
123
+ Respond immediately with your current status and next action.`;
124
+ }
125
+ /**
126
+ * 시스템 재시작 메시지 생성
127
+ */
128
+ function createRestartMessage(reason) {
129
+ return `[SYSTEM] Your previous session was interrupted due to: ${reason}. Please continue from where you left off. Review your progress and proceed with the current task.`;
130
+ }
131
+ /**
132
+ * 사용자 개입 메시지 래핑
133
+ */
134
+ function wrapUserIntervention(message) {
135
+ return `[USER INTERVENTION] ${message}`;
136
+ }
137
+ // ============================================================================
138
+ // Core Functions
139
+ // ============================================================================
140
+ /**
141
+ * 개입 요청 파일 경로 가져오기
142
+ */
143
+ function getPendingInterventionPath(laneRunDir) {
144
+ return (0, path_1.safeJoin)(laneRunDir, exports.PENDING_INTERVENTION_FILE);
145
+ }
146
+ /**
147
+ * 기존 intervention.txt 경로 가져오기 (호환성)
148
+ */
149
+ function getLegacyInterventionPath(laneRunDir) {
150
+ return (0, path_1.safeJoin)(laneRunDir, exports.LEGACY_INTERVENTION_FILE);
151
+ }
152
+ /**
153
+ * 개입 요청 생성 및 저장
154
+ *
155
+ * @param laneRunDir Lane 실행 디렉토리
156
+ * @param request 개입 요청 데이터
157
+ * @returns 저장된 파일 경로
158
+ */
159
+ function createInterventionRequest(laneRunDir, request) {
160
+ const fullRequest = {
161
+ ...request,
162
+ timestamp: Date.now(),
163
+ priority: request.priority ?? 0,
164
+ };
165
+ const filePath = getPendingInterventionPath(laneRunDir);
166
+ // 기존 요청이 있으면 우선순위 비교
167
+ const existing = readPendingIntervention(laneRunDir);
168
+ if (existing && (existing.priority ?? 0) > (fullRequest.priority ?? 0)) {
169
+ logger.debug(`[Intervention] Existing request has higher priority, skipping`);
170
+ return filePath;
171
+ }
172
+ fs.writeFileSync(filePath, JSON.stringify(fullRequest, null, 2), 'utf8');
173
+ logger.debug(`[Intervention] Created request: ${filePath}`);
174
+ // 기존 intervention.txt에도 기록 (호환성 및 로깅용)
175
+ const legacyPath = getLegacyInterventionPath(laneRunDir);
176
+ fs.writeFileSync(legacyPath, fullRequest.message, 'utf8');
177
+ return filePath;
178
+ }
179
+ /**
180
+ * 대기 중인 개입 요청 읽기
181
+ */
182
+ function readPendingIntervention(laneRunDir) {
183
+ const filePath = getPendingInterventionPath(laneRunDir);
184
+ if (!fs.existsSync(filePath)) {
185
+ return null;
186
+ }
187
+ try {
188
+ const content = fs.readFileSync(filePath, 'utf8');
189
+ return JSON.parse(content);
190
+ }
191
+ catch (error) {
192
+ logger.warn(`[Intervention] Failed to read pending intervention: ${error}`);
193
+ return null;
194
+ }
195
+ }
196
+ /**
197
+ * 대기 중인 개입 요청 삭제 (처리 완료 후)
198
+ */
199
+ function clearPendingIntervention(laneRunDir) {
200
+ const filePath = getPendingInterventionPath(laneRunDir);
201
+ const legacyPath = getLegacyInterventionPath(laneRunDir);
202
+ try {
203
+ if (fs.existsSync(filePath)) {
204
+ fs.unlinkSync(filePath);
205
+ }
206
+ if (fs.existsSync(legacyPath)) {
207
+ fs.unlinkSync(legacyPath);
208
+ }
209
+ }
210
+ catch (error) {
211
+ // Ignore cleanup errors
212
+ }
213
+ }
214
+ /**
215
+ * 대기 중인 개입 요청이 있는지 확인
216
+ */
217
+ function hasPendingIntervention(laneRunDir) {
218
+ return fs.existsSync(getPendingInterventionPath(laneRunDir));
219
+ }
220
+ // ============================================================================
221
+ // Process Control
222
+ // ============================================================================
223
+ /**
224
+ * PID로 프로세스 종료
225
+ *
226
+ * @param pid 종료할 프로세스 PID
227
+ * @param signal 종료 시그널 (기본: SIGTERM)
228
+ * @returns 성공 여부
229
+ */
230
+ function killProcess(pid, signal = 'SIGTERM') {
231
+ try {
232
+ process.kill(pid, signal);
233
+ logger.info(`[Intervention] Sent ${signal} to process ${pid}`);
234
+ return true;
235
+ }
236
+ catch (error) {
237
+ if (error.code === 'ESRCH') {
238
+ logger.debug(`[Intervention] Process ${pid} already terminated`);
239
+ return true; // Process doesn't exist, consider it killed
240
+ }
241
+ logger.error(`[Intervention] Failed to kill process ${pid}: ${error.message}`);
242
+ return false;
243
+ }
244
+ }
245
+ /**
246
+ * 프로세스가 살아있는지 확인
247
+ */
248
+ function isProcessAlive(pid) {
249
+ try {
250
+ process.kill(pid, 0); // Signal 0 = check existence
251
+ return true;
252
+ }
253
+ catch {
254
+ return false;
255
+ }
256
+ }
257
+ /**
258
+ * 프로세스 종료 후 대기
259
+ *
260
+ * @param pid 종료할 프로세스 PID
261
+ * @param timeoutMs 최대 대기 시간
262
+ * @returns 종료 성공 여부
263
+ */
264
+ async function killAndWait(pid, timeoutMs = KILL_TIMEOUT_MS) {
265
+ // 먼저 SIGTERM 시도
266
+ if (!killProcess(pid, 'SIGTERM')) {
267
+ return false;
268
+ }
269
+ // 종료 대기
270
+ const startTime = Date.now();
271
+ while (Date.now() - startTime < timeoutMs) {
272
+ if (!isProcessAlive(pid)) {
273
+ return true;
274
+ }
275
+ await new Promise(resolve => setTimeout(resolve, 100));
276
+ }
277
+ // SIGTERM이 안 먹히면 SIGKILL
278
+ logger.warn(`[Intervention] Process ${pid} didn't respond to SIGTERM, sending SIGKILL`);
279
+ killProcess(pid, 'SIGKILL');
280
+ // SIGKILL 후 잠시 대기
281
+ await new Promise(resolve => setTimeout(resolve, 500));
282
+ return !isProcessAlive(pid);
283
+ }
284
+ /**
285
+ * ChildProcess 종료
286
+ */
287
+ async function killChildProcess(child) {
288
+ if (!child.pid) {
289
+ return false;
290
+ }
291
+ if (child.killed) {
292
+ return true;
293
+ }
294
+ return killAndWait(child.pid);
295
+ }
296
+ // ============================================================================
297
+ // High-Level API
298
+ // ============================================================================
299
+ /**
300
+ * 즉각 개입 실행 - 프로세스 종료 및 개입 요청 생성
301
+ *
302
+ * 이 함수는 다음을 수행합니다:
303
+ * 1. 개입 요청 파일 생성 (pending-intervention.json)
304
+ * 2. 현재 프로세스 종료 (SIGTERM → SIGKILL)
305
+ * 3. 결과 반환 (Orchestrator가 resume 처리)
306
+ *
307
+ * @param laneRunDir Lane 실행 디렉토리
308
+ * @param request 개입 요청 데이터
309
+ * @param pid 종료할 프로세스 PID (없으면 state.json에서 읽음)
310
+ */
311
+ async function executeIntervention(laneRunDir, request, pid) {
312
+ // 1. 대상 PID 확인
313
+ let targetPid = pid;
314
+ if (!targetPid) {
315
+ const statePath = (0, path_1.safeJoin)(laneRunDir, 'state.json');
316
+ if (fs.existsSync(statePath)) {
317
+ const state = (0, state_1.loadState)(statePath);
318
+ targetPid = state?.pid;
319
+ }
320
+ }
321
+ if (!targetPid) {
322
+ return {
323
+ success: false,
324
+ error: 'No process PID found to interrupt',
325
+ };
326
+ }
327
+ // 2. 프로세스가 살아있는지 확인
328
+ if (!isProcessAlive(targetPid)) {
329
+ logger.info(`[Intervention] Process ${targetPid} is not running, just creating request`);
330
+ const pendingFile = createInterventionRequest(laneRunDir, request);
331
+ return {
332
+ success: true,
333
+ pendingFile,
334
+ };
335
+ }
336
+ // 3. 개입 요청 파일 생성 (프로세스 종료 전에)
337
+ const pendingFile = createInterventionRequest(laneRunDir, request);
338
+ // 4. 프로세스 종료
339
+ const killed = await killAndWait(targetPid);
340
+ if (!killed) {
341
+ return {
342
+ success: false,
343
+ error: `Failed to kill process ${targetPid}`,
344
+ pendingFile,
345
+ };
346
+ }
347
+ logger.info(`[Intervention] Successfully interrupted process ${targetPid}`);
348
+ return {
349
+ success: true,
350
+ killedPid: targetPid,
351
+ pendingFile,
352
+ };
353
+ }
354
+ /**
355
+ * 사용자 개입 실행 (cursorflow signal 명령용)
356
+ */
357
+ async function executeUserIntervention(laneRunDir, message, pid) {
358
+ return executeIntervention(laneRunDir, {
359
+ type: InterventionType.USER_MESSAGE,
360
+ message: wrapUserIntervention(message),
361
+ source: 'user',
362
+ priority: 10, // 사용자 개입은 높은 우선순위
363
+ }, pid);
364
+ }
365
+ /**
366
+ * Continue 신호 실행 (stall-detection용)
367
+ */
368
+ async function executeContinueSignal(laneRunDir, pid) {
369
+ return executeIntervention(laneRunDir, {
370
+ type: InterventionType.CONTINUE_SIGNAL,
371
+ message: createContinueMessage(),
372
+ source: 'stall-detector',
373
+ priority: 5,
374
+ }, pid);
375
+ }
376
+ /**
377
+ * Stronger prompt 실행 (stall-detection용)
378
+ */
379
+ async function executeStrongerPrompt(laneRunDir, pid) {
380
+ return executeIntervention(laneRunDir, {
381
+ type: InterventionType.STRONGER_PROMPT,
382
+ message: createStrongerPromptMessage(),
383
+ source: 'stall-detector',
384
+ priority: 7,
385
+ }, pid);
386
+ }
387
+ /**
388
+ * Git 가이던스 실행
389
+ */
390
+ async function executeGitGuidance(laneRunDir, guidance, pid) {
391
+ return executeIntervention(laneRunDir, {
392
+ type: InterventionType.GIT_GUIDANCE,
393
+ message: guidance,
394
+ source: 'system',
395
+ priority: 8,
396
+ }, pid);
397
+ }
398
+ // ============================================================================
399
+ // Resume Integration
400
+ // ============================================================================
401
+ /**
402
+ * 개입 메시지를 포함한 resume 프롬프트 생성
403
+ *
404
+ * Runner가 resume 시 호출하여 개입 메시지를 프롬프트에 포함
405
+ */
406
+ function buildResumePromptWithIntervention(laneRunDir, originalPrompt) {
407
+ const intervention = readPendingIntervention(laneRunDir);
408
+ if (!intervention) {
409
+ return { prompt: originalPrompt, hadIntervention: false };
410
+ }
411
+ // 개입 메시지를 프롬프트 앞에 추가
412
+ const combinedPrompt = `${intervention.message}\n\n---\n\nOriginal Task:\n${originalPrompt}`;
413
+ // 개입 요청 파일 삭제 (처리 완료)
414
+ clearPendingIntervention(laneRunDir);
415
+ logger.info(`[Intervention] Applied pending intervention (type: ${intervention.type})`);
416
+ return { prompt: combinedPrompt, hadIntervention: true };
417
+ }
418
+ /**
419
+ * 개입으로 인한 재시작인지 확인
420
+ */
421
+ function isInterventionRestart(laneRunDir) {
422
+ return hasPendingIntervention(laneRunDir);
423
+ }
424
+ //# sourceMappingURL=intervention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intervention.js","sourceRoot":"","sources":["../../src/core/intervention.ts"],"names":[],"mappings":"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"}