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