@litmers/cursorflow-orchestrator 0.1.40 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -2
- package/README.md +8 -3
- package/commands/cursorflow-init.md +0 -4
- package/dist/cli/index.js +0 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/logs.js +108 -9
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/models.js +20 -3
- package/dist/cli/models.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -10
- package/dist/cli/monitor.js +1103 -1239
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/resume.js +21 -1
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +28 -9
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/signal.d.ts +6 -1
- package/dist/cli/signal.js +99 -13
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/tasks.js +3 -46
- package/dist/cli/tasks.js.map +1 -1
- package/dist/core/agent-supervisor.d.ts +23 -0
- package/dist/core/agent-supervisor.js +42 -0
- package/dist/core/agent-supervisor.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +3 -117
- package/dist/core/auto-recovery.js +4 -482
- package/dist/core/auto-recovery.js.map +1 -1
- package/dist/core/failure-policy.d.ts +0 -53
- package/dist/core/failure-policy.js +7 -175
- package/dist/core/failure-policy.js.map +1 -1
- package/dist/core/git-lifecycle-manager.d.ts +284 -0
- package/dist/core/git-lifecycle-manager.js +778 -0
- package/dist/core/git-lifecycle-manager.js.map +1 -0
- package/dist/core/git-pipeline-coordinator.d.ts +21 -0
- package/dist/core/git-pipeline-coordinator.js +205 -0
- package/dist/core/git-pipeline-coordinator.js.map +1 -0
- package/dist/core/intervention.d.ts +170 -0
- package/dist/core/intervention.js +408 -0
- package/dist/core/intervention.js.map +1 -0
- package/dist/core/lane-state-machine.d.ts +423 -0
- package/dist/core/lane-state-machine.js +890 -0
- package/dist/core/lane-state-machine.js.map +1 -0
- package/dist/core/orchestrator.d.ts +4 -1
- package/dist/core/orchestrator.js +39 -65
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/runner/agent.d.ts +7 -1
- package/dist/core/runner/agent.js +54 -36
- package/dist/core/runner/agent.js.map +1 -1
- package/dist/core/runner/pipeline.js +283 -123
- package/dist/core/runner/pipeline.js.map +1 -1
- package/dist/core/runner/task.d.ts +4 -5
- package/dist/core/runner/task.js +6 -80
- package/dist/core/runner/task.js.map +1 -1
- package/dist/core/runner.js +8 -2
- package/dist/core/runner.js.map +1 -1
- package/dist/core/stall-detection.d.ts +11 -4
- package/dist/core/stall-detection.js +64 -27
- package/dist/core/stall-detection.js.map +1 -1
- package/dist/hooks/contexts/index.d.ts +104 -0
- package/dist/hooks/contexts/index.js +134 -0
- package/dist/hooks/contexts/index.js.map +1 -0
- package/dist/hooks/data-accessor.d.ts +86 -0
- package/dist/hooks/data-accessor.js +410 -0
- package/dist/hooks/data-accessor.js.map +1 -0
- package/dist/hooks/flow-controller.d.ts +136 -0
- package/dist/hooks/flow-controller.js +351 -0
- package/dist/hooks/flow-controller.js.map +1 -0
- package/dist/hooks/index.d.ts +68 -0
- package/dist/hooks/index.js +105 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/manager.d.ts +129 -0
- package/dist/hooks/manager.js +389 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/types.d.ts +463 -0
- package/dist/hooks/types.js +45 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/services/logging/buffer.d.ts +2 -2
- package/dist/services/logging/buffer.js +95 -42
- package/dist/services/logging/buffer.js.map +1 -1
- package/dist/services/logging/console.js +6 -1
- package/dist/services/logging/console.js.map +1 -1
- package/dist/services/logging/formatter.d.ts +9 -4
- package/dist/services/logging/formatter.js +64 -18
- package/dist/services/logging/formatter.js.map +1 -1
- package/dist/services/logging/index.d.ts +0 -1
- package/dist/services/logging/index.js +0 -1
- package/dist/services/logging/index.js.map +1 -1
- package/dist/services/logging/paths.d.ts +8 -0
- package/dist/services/logging/paths.js +48 -0
- package/dist/services/logging/paths.js.map +1 -0
- package/dist/services/logging/raw-log.d.ts +6 -0
- package/dist/services/logging/raw-log.js +37 -0
- package/dist/services/logging/raw-log.js.map +1 -0
- package/dist/services/process/index.js +1 -1
- package/dist/services/process/index.js.map +1 -1
- package/dist/types/agent.d.ts +15 -0
- package/dist/types/config.d.ts +22 -1
- package/dist/types/event-categories.d.ts +601 -0
- package/dist/types/event-categories.js +233 -0
- package/dist/types/event-categories.js.map +1 -0
- package/dist/types/events.d.ts +0 -20
- package/dist/types/flow.d.ts +10 -6
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +17 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/lane.d.ts +1 -1
- package/dist/types/logging.d.ts +1 -1
- package/dist/types/task.d.ts +12 -1
- package/dist/ui/log-viewer.d.ts +3 -0
- package/dist/ui/log-viewer.js +3 -0
- package/dist/ui/log-viewer.js.map +1 -1
- package/dist/utils/config.js +10 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.d.ts +11 -1
- package/dist/utils/cursor-agent.js +63 -16
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +5 -1
- package/dist/utils/enhanced-logger.js +98 -19
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/event-registry.d.ts +222 -0
- package/dist/utils/event-registry.js +463 -0
- package/dist/utils/event-registry.js.map +1 -0
- package/dist/utils/events.d.ts +1 -13
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/flow.d.ts +10 -0
- package/dist/utils/flow.js +75 -0
- package/dist/utils/flow.js.map +1 -1
- package/dist/utils/log-constants.d.ts +1 -0
- package/dist/utils/log-constants.js +2 -1
- package/dist/utils/log-constants.js.map +1 -1
- package/dist/utils/log-formatter.d.ts +2 -1
- package/dist/utils/log-formatter.js +10 -10
- package/dist/utils/log-formatter.js.map +1 -1
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.js +82 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/repro-thinking-logs.js +0 -13
- package/dist/utils/repro-thinking-logs.js.map +1 -1
- package/dist/utils/run-service.js +1 -1
- package/dist/utils/run-service.js.map +1 -1
- package/examples/README.md +0 -2
- package/examples/demo-project/README.md +1 -2
- package/package.json +13 -34
- package/scripts/setup-security.sh +0 -1
- package/scripts/test-log-parser.ts +171 -0
- package/scripts/verify-change.sh +272 -0
- package/src/cli/index.ts +0 -6
- package/src/cli/logs.ts +121 -10
- package/src/cli/models.ts +20 -3
- package/src/cli/monitor.ts +1273 -1342
- package/src/cli/resume.ts +27 -1
- package/src/cli/run.ts +29 -11
- package/src/cli/signal.ts +120 -18
- package/src/cli/tasks.ts +2 -59
- package/src/core/agent-supervisor.ts +64 -0
- package/src/core/auto-recovery.ts +14 -590
- package/src/core/failure-policy.ts +7 -229
- package/src/core/git-lifecycle-manager.ts +1011 -0
- package/src/core/git-pipeline-coordinator.ts +221 -0
- package/src/core/intervention.ts +463 -0
- package/src/core/lane-state-machine.ts +1097 -0
- package/src/core/orchestrator.ts +48 -64
- package/src/core/runner/agent.ts +77 -39
- package/src/core/runner/pipeline.ts +318 -138
- package/src/core/runner/task.ts +12 -97
- package/src/core/runner.ts +8 -2
- package/src/core/stall-detection.ts +74 -27
- package/src/hooks/contexts/index.ts +256 -0
- package/src/hooks/data-accessor.ts +488 -0
- package/src/hooks/flow-controller.ts +425 -0
- package/src/hooks/index.ts +154 -0
- package/src/hooks/manager.ts +434 -0
- package/src/hooks/types.ts +544 -0
- package/src/services/logging/buffer.ts +104 -43
- package/src/services/logging/console.ts +7 -1
- package/src/services/logging/formatter.ts +74 -18
- package/src/services/logging/index.ts +0 -2
- package/src/services/logging/paths.ts +14 -0
- package/src/services/logging/raw-log.ts +43 -0
- package/src/services/process/index.ts +1 -1
- package/src/types/agent.ts +15 -0
- package/src/types/config.ts +23 -1
- package/src/types/event-categories.ts +663 -0
- package/src/types/events.ts +0 -25
- package/src/types/flow.ts +10 -6
- package/src/types/index.ts +50 -4
- package/src/types/lane.ts +1 -2
- package/src/types/logging.ts +2 -1
- package/src/types/task.ts +12 -1
- package/src/ui/log-viewer.ts +3 -0
- package/src/utils/config.ts +11 -1
- package/src/utils/cursor-agent.ts +68 -16
- package/src/utils/enhanced-logger.ts +105 -19
- package/src/utils/event-registry.ts +595 -0
- package/src/utils/events.ts +0 -16
- package/src/utils/flow.ts +83 -0
- package/src/utils/log-constants.ts +2 -1
- package/src/utils/log-formatter.ts +10 -11
- package/src/utils/logger.ts +49 -3
- package/src/utils/repro-thinking-logs.ts +0 -15
- package/src/utils/run-service.ts +1 -1
- package/dist/cli/prepare.d.ts +0 -7
- package/dist/cli/prepare.js +0 -690
- package/dist/cli/prepare.js.map +0 -1
- package/dist/services/logging/file-writer.d.ts +0 -71
- package/dist/services/logging/file-writer.js +0 -516
- package/dist/services/logging/file-writer.js.map +0 -1
- package/dist/types/review.d.ts +0 -17
- package/dist/types/review.js +0 -6
- package/dist/types/review.js.map +0 -1
- package/scripts/ai-security-check.js +0 -233
- package/src/cli/prepare.ts +0 -777
- package/src/services/logging/file-writer.ts +0 -526
- package/src/types/review.ts +0 -20
|
@@ -0,0 +1,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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"}
|