@xdevops/issue-auto-finish 1.0.74 → 1.0.76
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/dist/ai-runner/ModelMapping.d.ts +3 -2
- package/dist/ai-runner/ModelMapping.d.ts.map +1 -1
- package/dist/{ai-runner-U4WLO5GZ.js → ai-runner-RUE5D72W.js} +2 -2
- package/dist/{analyze-67N2EEJY.js → analyze-IZFTWCNR.js} +3 -3
- package/dist/{braindump-6NNPGVFV.js → braindump-SXLAURR4.js} +4 -4
- package/dist/{chunk-XAMJNIXE.js → chunk-66OK4LG3.js} +40 -28
- package/dist/chunk-66OK4LG3.js.map +1 -0
- package/dist/{chunk-ZPHUJTZP.js → chunk-JL6ALTPS.js} +6 -6
- package/dist/{chunk-SXRMGTQF.js → chunk-KWOM6URK.js} +16 -12
- package/dist/chunk-KWOM6URK.js.map +1 -0
- package/dist/{chunk-MY5XUQKB.js → chunk-MC7YPVJG.js} +50 -13
- package/dist/chunk-MC7YPVJG.js.map +1 -0
- package/dist/{chunk-PGTOY4YU.js → chunk-NBX5LNCU.js} +3 -3
- package/dist/{chunk-SKA53TLK.js → chunk-OOJNTGB5.js} +5 -3
- package/dist/chunk-OOJNTGB5.js.map +1 -0
- package/dist/{chunk-WR3O4ATI.js → chunk-URE5IBQE.js} +2 -2
- package/dist/{chunk-C4NES56F.js → chunk-VYNKAT4P.js} +3 -2
- package/dist/{chunk-C4NES56F.js.map → chunk-VYNKAT4P.js.map} +1 -1
- package/dist/cli/setup/env-metadata.d.ts.map +1 -1
- package/dist/cli.js +7 -7
- package/dist/{config-C6QBYWFQ.js → config-LLOHFS6J.js} +3 -3
- package/dist/config-schema.d.ts +2 -0
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/errors/AIExecutionError.d.ts +2 -0
- package/dist/errors/AIExecutionError.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/{init-J26XGSST.js → init-EQWSE5FX.js} +5 -5
- package/dist/lib.js +3 -3
- package/dist/lifecycle/ActionLifecycleManager.d.ts +2 -2
- package/dist/lifecycle/ActionLifecycleManager.d.ts.map +1 -1
- package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
- package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
- package/dist/phases/BasePhase.d.ts +5 -0
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/{restart-P56E4WML.js → restart-24AKNL74.js} +5 -5
- package/dist/run.js +7 -7
- package/dist/{start-5AXLAE7J.js → start-YUT6GSVS.js} +5 -5
- package/dist/tracker/IssueState.d.ts +2 -0
- package/dist/tracker/IssueState.d.ts.map +1 -1
- package/dist/tracker/IssueTracker.d.ts +1 -1
- package/dist/tracker/IssueTracker.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/web/frontend/dist/assets/{index-CtY1m1Qk.js → index--KDAivOo.js} +40 -40
- package/src/web/frontend/dist/index.html +1 -1
- package/dist/chunk-MY5XUQKB.js.map +0 -1
- package/dist/chunk-SKA53TLK.js.map +0 -1
- package/dist/chunk-SXRMGTQF.js.map +0 -1
- package/dist/chunk-XAMJNIXE.js.map +0 -1
- /package/dist/{ai-runner-U4WLO5GZ.js.map → ai-runner-RUE5D72W.js.map} +0 -0
- /package/dist/{analyze-67N2EEJY.js.map → analyze-IZFTWCNR.js.map} +0 -0
- /package/dist/{braindump-6NNPGVFV.js.map → braindump-SXLAURR4.js.map} +0 -0
- /package/dist/{chunk-ZPHUJTZP.js.map → chunk-JL6ALTPS.js.map} +0 -0
- /package/dist/{chunk-PGTOY4YU.js.map → chunk-NBX5LNCU.js.map} +0 -0
- /package/dist/{chunk-WR3O4ATI.js.map → chunk-URE5IBQE.js.map} +0 -0
- /package/dist/{config-C6QBYWFQ.js.map → config-LLOHFS6J.js.map} +0 -0
- /package/dist/{init-J26XGSST.js.map → init-EQWSE5FX.js.map} +0 -0
- /package/dist/{restart-P56E4WML.js.map → restart-24AKNL74.js.map} +0 -0
- /package/dist/{start-5AXLAE7J.js.map → start-YUT6GSVS.js.map} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 根据 runner mode 将规范模型名映射为该 CLI 接受的模型 ID。
|
|
3
|
-
* 如果该 runner
|
|
3
|
+
* 如果该 runner 没有映射表,则原样返回。
|
|
4
|
+
* 如果有映射表但找不到对应条目,返回 undefined(由调用方使用默认模型)。
|
|
4
5
|
*/
|
|
5
|
-
export declare function resolveModelForRunner(runnerMode: string, model: string): string;
|
|
6
|
+
export declare function resolveModelForRunner(runnerMode: string, model: string): string | undefined;
|
|
6
7
|
//# sourceMappingURL=ModelMapping.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelMapping.d.ts","sourceRoot":"","sources":["../../src/ai-runner/ModelMapping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ModelMapping.d.ts","sourceRoot":"","sources":["../../src/ai-runner/ModelMapping.ts"],"names":[],"mappings":"AAwCA;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW3F"}
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
resolveModelForRunner,
|
|
17
17
|
resolveRunnerMode,
|
|
18
18
|
validateRunnerRegistry
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-66OK4LG3.js";
|
|
20
20
|
import "./chunk-GF2RRYHB.js";
|
|
21
21
|
export {
|
|
22
22
|
BaseAIRunner,
|
|
@@ -36,4 +36,4 @@ export {
|
|
|
36
36
|
resolveRunnerMode,
|
|
37
37
|
validateRunnerRegistry
|
|
38
38
|
};
|
|
39
|
-
//# sourceMappingURL=ai-runner-
|
|
39
|
+
//# sourceMappingURL=ai-runner-RUE5D72W.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OOJNTGB5.js";
|
|
4
4
|
import "./chunk-AKXDQH25.js";
|
|
5
5
|
import {
|
|
6
6
|
analyze
|
|
@@ -12,7 +12,7 @@ import "./chunk-DAX3FD2O.js";
|
|
|
12
12
|
import "./chunk-DADQSKPL.js";
|
|
13
13
|
import {
|
|
14
14
|
createAIRunner
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-66OK4LG3.js";
|
|
16
16
|
import "./chunk-GF2RRYHB.js";
|
|
17
17
|
|
|
18
18
|
// src/cli/commands/analyze.ts
|
|
@@ -73,4 +73,4 @@ async function analyzeCommand(opts) {
|
|
|
73
73
|
export {
|
|
74
74
|
analyzeCommand
|
|
75
75
|
};
|
|
76
|
-
//# sourceMappingURL=analyze-
|
|
76
|
+
//# sourceMappingURL=analyze-IZFTWCNR.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
BraindumpOrchestrator,
|
|
11
11
|
BraindumpTracker
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-URE5IBQE.js";
|
|
13
13
|
import {
|
|
14
14
|
AsyncMutex,
|
|
15
15
|
GitOperations
|
|
@@ -18,7 +18,7 @@ import "./chunk-ACVOOHAR.js";
|
|
|
18
18
|
import "./chunk-KWODU7HB.js";
|
|
19
19
|
import {
|
|
20
20
|
loadConfig
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-OOJNTGB5.js";
|
|
22
22
|
import "./chunk-AKXDQH25.js";
|
|
23
23
|
import "./chunk-B7TVVODN.js";
|
|
24
24
|
import "./chunk-TN2SYADO.js";
|
|
@@ -26,7 +26,7 @@ import "./chunk-DAX3FD2O.js";
|
|
|
26
26
|
import "./chunk-DADQSKPL.js";
|
|
27
27
|
import {
|
|
28
28
|
createAIRunner
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-66OK4LG3.js";
|
|
30
30
|
import "./chunk-GF2RRYHB.js";
|
|
31
31
|
|
|
32
32
|
// src/cli/commands/braindump.ts
|
|
@@ -205,4 +205,4 @@ ${bold("\u786E\u8BA4\u6267\u884C\uFF1F")} (${green("y")}=\u786E\u8BA4 / ${red("q
|
|
|
205
205
|
export {
|
|
206
206
|
braindumpCommand
|
|
207
207
|
};
|
|
208
|
-
//# sourceMappingURL=braindump-
|
|
208
|
+
//# sourceMappingURL=braindump-SXLAURR4.js.map
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-GF2RRYHB.js";
|
|
4
4
|
|
|
5
5
|
// src/ai-runner/ModelMapping.ts
|
|
6
|
+
var logger2 = logger.child("ModelMapping");
|
|
6
7
|
var MODEL_MAPS = {
|
|
7
8
|
codebuddy: {
|
|
8
9
|
// Claude 系列
|
|
@@ -14,6 +15,8 @@ var MODEL_MAPS = {
|
|
|
14
15
|
"Claude-Opus-4.5": "claude-opus-4.5",
|
|
15
16
|
"Claude-Haiku-4.5": "claude-haiku-4.5",
|
|
16
17
|
// GPT 系列
|
|
18
|
+
"GPT-5.4": "gpt-5.4",
|
|
19
|
+
"GPT-5.3": "gpt-5.3",
|
|
17
20
|
"GPT-5.2": "gpt-5.2",
|
|
18
21
|
"GPT-5.1": "gpt-5.1",
|
|
19
22
|
// Gemini 系列
|
|
@@ -27,7 +30,14 @@ MODEL_MAPS["codebuddy-acp"] = MODEL_MAPS["codebuddy"];
|
|
|
27
30
|
function resolveModelForRunner(runnerMode, model) {
|
|
28
31
|
const map = MODEL_MAPS[runnerMode];
|
|
29
32
|
if (!map) return model;
|
|
30
|
-
|
|
33
|
+
const resolved = map[model];
|
|
34
|
+
if (resolved) return resolved;
|
|
35
|
+
logger2.warn("Model not in mapping table, will use runner default", {
|
|
36
|
+
runnerMode,
|
|
37
|
+
requestedModel: model,
|
|
38
|
+
availableModels: Object.keys(map)
|
|
39
|
+
});
|
|
40
|
+
return void 0;
|
|
31
41
|
}
|
|
32
42
|
|
|
33
43
|
// src/shutdown/ShutdownSignal.ts
|
|
@@ -41,7 +51,7 @@ function setShuttingDown() {
|
|
|
41
51
|
|
|
42
52
|
// src/ai-runner/BaseAIRunner.ts
|
|
43
53
|
import { spawn } from "child_process";
|
|
44
|
-
var
|
|
54
|
+
var logger3 = logger.child("AIRunner");
|
|
45
55
|
var SIGKILL_GRACE_MS = 1e4;
|
|
46
56
|
var IDLE_CHECK_INTERVAL_MS = 5e3;
|
|
47
57
|
var RESULT_EXIT_GRACE_MS = 3e4;
|
|
@@ -49,11 +59,11 @@ var BaseAIRunner = class {
|
|
|
49
59
|
activeChildren = /* @__PURE__ */ new Map();
|
|
50
60
|
async run(options) {
|
|
51
61
|
if (isShuttingDown()) {
|
|
52
|
-
|
|
62
|
+
logger3.warn("AI runner skipped \u2014 service is shutting down");
|
|
53
63
|
return { success: false, output: "Service shutting down", exitCode: null };
|
|
54
64
|
}
|
|
55
65
|
const { prompt, workDir, timeoutMs, sessionId, continueSession, idleTimeoutMs, onStreamEvent } = options;
|
|
56
|
-
|
|
66
|
+
logger3.info("Running AI runner", {
|
|
57
67
|
workDir,
|
|
58
68
|
timeoutMs,
|
|
59
69
|
idleTimeoutMs,
|
|
@@ -81,13 +91,13 @@ var BaseAIRunner = class {
|
|
|
81
91
|
timedOut = true;
|
|
82
92
|
timeoutType = "wall-clock";
|
|
83
93
|
child.kill("SIGTERM");
|
|
84
|
-
|
|
94
|
+
logger3.warn("AI runner timed out", { timeoutMs });
|
|
85
95
|
killTimer = setTimeout(() => {
|
|
86
96
|
if (child.exitCode === null) {
|
|
87
97
|
child.kill("SIGKILL");
|
|
88
98
|
child.stdout?.destroy();
|
|
89
99
|
child.stderr?.destroy();
|
|
90
|
-
|
|
100
|
+
logger3.warn("AI runner force-killed (SIGKILL fallback)", { workDir });
|
|
91
101
|
}
|
|
92
102
|
}, SIGKILL_GRACE_MS);
|
|
93
103
|
}, timeoutMs);
|
|
@@ -97,7 +107,7 @@ var BaseAIRunner = class {
|
|
|
97
107
|
timedOut = true;
|
|
98
108
|
timeoutType = "idle";
|
|
99
109
|
child.kill("SIGTERM");
|
|
100
|
-
|
|
110
|
+
logger3.warn("AI runner idle timed out", {
|
|
101
111
|
idleTimeoutMs,
|
|
102
112
|
idleSinceMs: idleMs
|
|
103
113
|
});
|
|
@@ -107,7 +117,7 @@ var BaseAIRunner = class {
|
|
|
107
117
|
child.kill("SIGKILL");
|
|
108
118
|
child.stdout?.destroy();
|
|
109
119
|
child.stderr?.destroy();
|
|
110
|
-
|
|
120
|
+
logger3.warn("AI runner force-killed after idle timeout (SIGKILL fallback)", { workDir });
|
|
111
121
|
}
|
|
112
122
|
}, SIGKILL_GRACE_MS);
|
|
113
123
|
}
|
|
@@ -135,7 +145,7 @@ var BaseAIRunner = class {
|
|
|
135
145
|
if (parsed.type === "result") {
|
|
136
146
|
resultGraceTimer = setTimeout(() => {
|
|
137
147
|
if (child.exitCode === null) {
|
|
138
|
-
|
|
148
|
+
logger3.warn("AI runner process did not exit after result event, sending SIGTERM", {
|
|
139
149
|
graceMs: RESULT_EXIT_GRACE_MS
|
|
140
150
|
});
|
|
141
151
|
child.kill("SIGTERM");
|
|
@@ -144,7 +154,7 @@ var BaseAIRunner = class {
|
|
|
144
154
|
child.kill("SIGKILL");
|
|
145
155
|
child.stdout?.destroy();
|
|
146
156
|
child.stderr?.destroy();
|
|
147
|
-
|
|
157
|
+
logger3.warn("AI runner force-killed after result grace (SIGKILL fallback)", { workDir });
|
|
148
158
|
}
|
|
149
159
|
}, SIGKILL_GRACE_MS);
|
|
150
160
|
}
|
|
@@ -159,7 +169,7 @@ var BaseAIRunner = class {
|
|
|
159
169
|
lastActivityTime = Date.now();
|
|
160
170
|
stderrChunks.push(chunk);
|
|
161
171
|
const text = chunk.toString();
|
|
162
|
-
|
|
172
|
+
logger3.debug("AI runner stderr: " + text);
|
|
163
173
|
if (onStreamEvent) {
|
|
164
174
|
onStreamEvent({ type: "stderr", content: text, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
165
175
|
}
|
|
@@ -177,7 +187,7 @@ var BaseAIRunner = class {
|
|
|
177
187
|
const rawOutput = Buffer.concat(chunks).toString("utf-8");
|
|
178
188
|
const { output, resolvedSessionId, hasError, errorMessage: parsedErrorMessage } = this.parseOutput(rawOutput, sessionId);
|
|
179
189
|
const success = code === 0 && !timedOut && !hasError;
|
|
180
|
-
|
|
190
|
+
logger3.info("AI runner finished", { exitCode: code, success, timedOut });
|
|
181
191
|
const stderrText = stderrChunks.length > 0 ? Buffer.concat(stderrChunks).toString("utf-8").trim() : "";
|
|
182
192
|
const finalOutput = !success && !output.trim() && stderrText ? stderrText : output;
|
|
183
193
|
let errorMessage;
|
|
@@ -205,7 +215,7 @@ var BaseAIRunner = class {
|
|
|
205
215
|
if (resultGraceTimer) clearTimeout(resultGraceTimer);
|
|
206
216
|
if (idleCheckInterval) clearInterval(idleCheckInterval);
|
|
207
217
|
if (flushInterval) clearInterval(flushInterval);
|
|
208
|
-
|
|
218
|
+
logger3.error("AI runner spawn error", { error: err.message });
|
|
209
219
|
resolve({
|
|
210
220
|
success: false,
|
|
211
221
|
output: err.message,
|
|
@@ -221,7 +231,7 @@ var BaseAIRunner = class {
|
|
|
221
231
|
for (const [child] of this.activeChildren) {
|
|
222
232
|
this.forceKillChild(child);
|
|
223
233
|
}
|
|
224
|
-
|
|
234
|
+
logger3.info("Killed all active AI runner children", { count: this.activeChildren.size });
|
|
225
235
|
}
|
|
226
236
|
killByWorkDir(targetWorkDir) {
|
|
227
237
|
let killed = 0;
|
|
@@ -232,7 +242,7 @@ var BaseAIRunner = class {
|
|
|
232
242
|
}
|
|
233
243
|
}
|
|
234
244
|
if (killed > 0) {
|
|
235
|
-
|
|
245
|
+
logger3.info("Killed AI runner children by workDir", { workDir: targetWorkDir, killed });
|
|
236
246
|
}
|
|
237
247
|
return killed;
|
|
238
248
|
}
|
|
@@ -554,7 +564,7 @@ var AcpProtocol = class {
|
|
|
554
564
|
};
|
|
555
565
|
|
|
556
566
|
// src/ai-runner/CodebuddyAcpRunner.ts
|
|
557
|
-
var
|
|
567
|
+
var logger4 = logger.child("CodebuddyAcpRunner");
|
|
558
568
|
var SIGKILL_GRACE_MS2 = 1e4;
|
|
559
569
|
var IDLE_CHECK_INTERVAL_MS2 = 5e3;
|
|
560
570
|
var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
@@ -588,11 +598,11 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
588
598
|
// ── Main entry: override BaseAIRunner.run() for ACP session lifecycle ──
|
|
589
599
|
async run(options) {
|
|
590
600
|
if (isShuttingDown()) {
|
|
591
|
-
|
|
601
|
+
logger4.warn("ACP runner skipped \u2014 service is shutting down");
|
|
592
602
|
return { success: false, output: "Service shutting down", exitCode: null };
|
|
593
603
|
}
|
|
594
604
|
const { prompt, workDir, timeoutMs, idleTimeoutMs, onStreamEvent } = options;
|
|
595
|
-
|
|
605
|
+
logger4.info("Starting CodeBuddy ACP session", {
|
|
596
606
|
workDir,
|
|
597
607
|
timeoutMs,
|
|
598
608
|
idleTimeoutMs,
|
|
@@ -626,7 +636,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
626
636
|
const wallTimer = setTimeout(() => {
|
|
627
637
|
timedOut = true;
|
|
628
638
|
timeoutType = "wall-clock";
|
|
629
|
-
|
|
639
|
+
logger4.warn("ACP runner wall-clock timeout", { timeoutMs });
|
|
630
640
|
killChild(child);
|
|
631
641
|
}, timeoutMs);
|
|
632
642
|
let killTimer;
|
|
@@ -634,7 +644,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
634
644
|
if (Date.now() - lastActivityTime >= idleTimeoutMs) {
|
|
635
645
|
timedOut = true;
|
|
636
646
|
timeoutType = "idle";
|
|
637
|
-
|
|
647
|
+
logger4.warn("ACP runner idle timeout", { idleTimeoutMs });
|
|
638
648
|
clearInterval(idleInterval);
|
|
639
649
|
killChild(child);
|
|
640
650
|
}
|
|
@@ -689,7 +699,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
689
699
|
lastActivityTime = Date.now();
|
|
690
700
|
const text = chunk.toString();
|
|
691
701
|
stderrChunks.push(text);
|
|
692
|
-
|
|
702
|
+
logger4.debug("ACP runner stderr: " + text.slice(0, 500));
|
|
693
703
|
if (onStreamEvent) {
|
|
694
704
|
onStreamEvent({ type: "stderr", content: text, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
695
705
|
}
|
|
@@ -729,7 +739,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
729
739
|
if (!parts.length && stderrText) parts.push(stderrText.slice(0, 500));
|
|
730
740
|
errorMessage = parts.join(" | ") || void 0;
|
|
731
741
|
}
|
|
732
|
-
|
|
742
|
+
logger4.info("ACP runner finished", { exitCode: code, success, timedOut });
|
|
733
743
|
safeResolve({
|
|
734
744
|
success,
|
|
735
745
|
output: output || stderrText,
|
|
@@ -740,7 +750,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
740
750
|
});
|
|
741
751
|
});
|
|
742
752
|
child.on("error", (err) => {
|
|
743
|
-
|
|
753
|
+
logger4.error("ACP runner spawn error", { error: err.message });
|
|
744
754
|
safeResolve({
|
|
745
755
|
success: false,
|
|
746
756
|
output: err.message,
|
|
@@ -799,7 +809,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
799
809
|
} else if (state === "prompting") {
|
|
800
810
|
setHandshake("done");
|
|
801
811
|
const stopReason = result?.stopReason;
|
|
802
|
-
|
|
812
|
+
logger4.info("ACP session/prompt completed", {
|
|
803
813
|
stopReason,
|
|
804
814
|
sessionId: getSessionId()
|
|
805
815
|
});
|
|
@@ -851,7 +861,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
851
861
|
})
|
|
852
862
|
);
|
|
853
863
|
}).catch((err) => {
|
|
854
|
-
|
|
864
|
+
logger4.warn("onInputRequired callback failed, auto-approving", { error: err.message });
|
|
855
865
|
this.autoApprove(child, protocol, msg.id, msg.params.options);
|
|
856
866
|
});
|
|
857
867
|
return;
|
|
@@ -914,7 +924,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
914
924
|
for (const [child] of this.acpActiveChildren) {
|
|
915
925
|
this.forceKill(child);
|
|
916
926
|
}
|
|
917
|
-
|
|
927
|
+
logger4.info("Killed all ACP runner children", { count: this.acpActiveChildren.size });
|
|
918
928
|
}
|
|
919
929
|
killByWorkDir(targetWorkDir) {
|
|
920
930
|
let killed = 0;
|
|
@@ -925,7 +935,7 @@ var CodebuddyAcpRunner = class extends BaseAIRunner {
|
|
|
925
935
|
}
|
|
926
936
|
}
|
|
927
937
|
if (killed > 0) {
|
|
928
|
-
|
|
938
|
+
logger4.info("Killed ACP runner children by workDir", { workDir: targetWorkDir, killed });
|
|
929
939
|
}
|
|
930
940
|
return killed;
|
|
931
941
|
}
|
|
@@ -994,11 +1004,13 @@ var AIExecutionError = class extends AppError {
|
|
|
994
1004
|
phase;
|
|
995
1005
|
output;
|
|
996
1006
|
exitCode;
|
|
1007
|
+
isRetryable;
|
|
997
1008
|
constructor(phase, message, opts) {
|
|
998
1009
|
super("AI_EXECUTION_ERROR", message, opts?.cause);
|
|
999
1010
|
this.phase = phase;
|
|
1000
1011
|
this.output = opts?.output;
|
|
1001
1012
|
this.exitCode = opts?.exitCode;
|
|
1013
|
+
this.isRetryable = opts?.isRetryable ?? true;
|
|
1002
1014
|
}
|
|
1003
1015
|
};
|
|
1004
1016
|
|
|
@@ -1230,4 +1242,4 @@ export {
|
|
|
1230
1242
|
validateRunnerRegistry,
|
|
1231
1243
|
isBinaryAvailable
|
|
1232
1244
|
};
|
|
1233
|
-
//# sourceMappingURL=chunk-
|
|
1245
|
+
//# sourceMappingURL=chunk-66OK4LG3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ai-runner/ModelMapping.ts","../src/shutdown/ShutdownSignal.ts","../src/ai-runner/BaseAIRunner.ts","../src/ai-runner/ClaudeInternalRunner.ts","../src/ai-runner/CursorAgentRunner.ts","../src/ai-runner/CodebuddyRunner.ts","../src/ai-runner/CodebuddyAcpRunner.ts","../src/ai-runner/acp/AcpProtocol.ts","../src/ai-runner/AIRunnerRegistry.ts","../src/errors/BaseError.ts","../src/errors/ApiError.ts","../src/errors/AIExecutionError.ts","../src/errors/NotFoundError.ts","../src/errors/InvalidOperationError.ts","../src/errors/ShutdownError.ts","../src/errors/ParseError.ts","../src/errors/RegistryError.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// 模型名称映射:规范名 (AI_MODEL 配置值) → 各 Runner CLI 接受的模型 ID\n// ---------------------------------------------------------------------------\n\nimport { logger as rootLogger } from '../logger.js';\n\nconst logger = rootLogger.child('ModelMapping');\n\ntype RunnerModelMap = Record<string, string>;\n\n/**\n * 每个 Runner 的模型名映射表。\n * key = runner mode(如 'codebuddy'),value = { 规范名 → CLI 模型名 }。\n * 未列出的 runner(如 claude-internal、cursor-agent)表示无需映射,直接透传。\n */\nconst MODEL_MAPS: Record<string, RunnerModelMap> = {\n codebuddy: {\n // Claude 系列\n 'Claude-4.6-Opus': 'claude-opus-4.6',\n 'claude-4.6-opus-high-thinking': 'claude-opus-4.6', // high-thinking 变体映射到基础模型\n 'Claude-4.5': 'claude-4.5',\n 'Claude-Sonnet-4.6': 'claude-sonnet-4.6',\n 'Claude-Opus-4.5': 'claude-opus-4.5',\n 'Claude-Haiku-4.5': 'claude-haiku-4.5',\n // GPT 系列\n 'GPT-5.4': 'gpt-5.4',\n 'GPT-5.3': 'gpt-5.3',\n 'GPT-5.2': 'gpt-5.2',\n 'GPT-5.1': 'gpt-5.1',\n // Gemini 系列\n 'Gemini-2.5-Pro': 'gemini-2.5-pro',\n 'Gemini-3.0-Flash': 'gemini-3.0-flash',\n 'Gemini-3.1-Pro': 'gemini-3.1-pro',\n },\n // claude-internal 和 cursor-agent 无需映射,直接透传\n};\n\n// codebuddy-acp 复用 codebuddy 的模型映射\nMODEL_MAPS['codebuddy-acp'] = MODEL_MAPS['codebuddy'];\n\n/**\n * 根据 runner mode 将规范模型名映射为该 CLI 接受的模型 ID。\n * 如果该 runner 没有映射表,则原样返回。\n * 如果有映射表但找不到对应条目,返回 undefined(由调用方使用默认模型)。\n */\nexport function resolveModelForRunner(runnerMode: string, model: string): string | undefined {\n const map = MODEL_MAPS[runnerMode];\n if (!map) return model;\n const resolved = map[model];\n if (resolved) return resolved;\n logger.warn('Model not in mapping table, will use runner default', {\n runnerMode,\n requestedModel: model,\n availableModels: Object.keys(map),\n });\n return undefined;\n}\n","let _shuttingDown = false;\n\nexport function isShuttingDown(): boolean {\n return _shuttingDown;\n}\n\nexport function setShuttingDown(): void {\n _shuttingDown = true;\n}\n","import { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process';\nimport { logger as rootLogger } from '../logger.js';\nimport { isShuttingDown } from '../shutdown/ShutdownSignal.js';\nimport type { RunOptions, RunResult, StreamEvent } from './AIRunner.js';\n\nconst logger = rootLogger.child('AIRunner');\n\nconst SIGKILL_GRACE_MS = 10_000;\nconst IDLE_CHECK_INTERVAL_MS = 5_000;\nconst RESULT_EXIT_GRACE_MS = 30_000;\n\ninterface ActiveChild {\n child: ChildProcess;\n workDir: string;\n}\n\nexport abstract class BaseAIRunner {\n protected abstract getBinary(): string;\n protected abstract buildArgs(options: RunOptions): string[];\n protected abstract getSpawnOptions(options: RunOptions): SpawnOptions;\n\n private activeChildren = new Map<ChildProcess, ActiveChild>();\n\n async run(options: RunOptions): Promise<RunResult> {\n if (isShuttingDown()) {\n logger.warn('AI runner skipped — service is shutting down');\n return { success: false, output: 'Service shutting down', exitCode: null };\n }\n\n const { prompt, workDir, timeoutMs, sessionId, continueSession, idleTimeoutMs, onStreamEvent } = options;\n\n logger.info('Running AI runner', {\n workDir,\n timeoutMs,\n idleTimeoutMs,\n continueSession: !!continueSession,\n sessionId,\n });\n\n return new Promise<RunResult>((resolve) => {\n const chunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let timedOut = false;\n let timeoutType: 'wall-clock' | 'idle' | undefined;\n let lineBuffer = '';\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n let lastActivityTime = Date.now();\n let resultGraceTimer: ReturnType<typeof setTimeout> | undefined;\n\n const binary = this.getBinary();\n const args = this.buildArgs(options);\n const spawnOpts = this.getSpawnOptions(options);\n\n const child = spawn(binary, args, {\n ...spawnOpts,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.activeChildren.set(child, { child, workDir });\n\n const timer = setTimeout(() => {\n timedOut = true;\n timeoutType = 'wall-clock';\n child.kill('SIGTERM');\n logger.warn('AI runner timed out', { timeoutMs });\n\n killTimer = setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n child.stdout?.destroy();\n child.stderr?.destroy();\n logger.warn('AI runner force-killed (SIGKILL fallback)', { workDir });\n }\n }, SIGKILL_GRACE_MS);\n }, timeoutMs);\n\n // Idle timeout: kill process if no stdout/stderr activity for idleTimeoutMs\n const idleCheckInterval = idleTimeoutMs\n ? setInterval(() => {\n const idleMs = Date.now() - lastActivityTime;\n if (idleMs >= idleTimeoutMs) {\n timedOut = true;\n timeoutType = 'idle';\n child.kill('SIGTERM');\n logger.warn('AI runner idle timed out', {\n idleTimeoutMs,\n idleSinceMs: idleMs,\n });\n clearInterval(idleCheckInterval!);\n\n killTimer = setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n child.stdout?.destroy();\n child.stderr?.destroy();\n logger.warn('AI runner force-killed after idle timeout (SIGKILL fallback)', { workDir });\n }\n }, SIGKILL_GRACE_MS);\n }\n }, IDLE_CHECK_INTERVAL_MS)\n : undefined;\n\n const flushInterval = onStreamEvent\n ? setInterval(() => {\n if (lineBuffer.trim()) {\n onStreamEvent({ type: 'partial', content: lineBuffer.trim(), timestamp: new Date().toISOString() });\n }\n }, 200)\n : undefined;\n\n child.stdout.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n chunks.push(chunk);\n\n lineBuffer += chunk.toString();\n let newlineIdx: number;\n while ((newlineIdx = lineBuffer.indexOf('\\n')) !== -1) {\n const line = lineBuffer.slice(0, newlineIdx).trim();\n lineBuffer = lineBuffer.slice(newlineIdx + 1);\n if (!line) continue;\n\n if (onStreamEvent) {\n this.emitStreamLine(line, onStreamEvent);\n }\n\n // Detect result event: start grace timer to kill hanging process\n if (!resultGraceTimer) {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (parsed.type === 'result') {\n resultGraceTimer = setTimeout(() => {\n if (child.exitCode === null) {\n logger.warn('AI runner process did not exit after result event, sending SIGTERM', {\n graceMs: RESULT_EXIT_GRACE_MS,\n });\n child.kill('SIGTERM');\n\n killTimer = setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n child.stdout?.destroy();\n child.stderr?.destroy();\n logger.warn('AI runner force-killed after result grace (SIGKILL fallback)', { workDir });\n }\n }, SIGKILL_GRACE_MS);\n }\n }, RESULT_EXIT_GRACE_MS);\n }\n } catch {\n // not JSON, ignore\n }\n }\n }\n });\n\n child.stderr.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n stderrChunks.push(chunk);\n const text = chunk.toString();\n logger.debug('AI runner stderr: ' + text);\n if (onStreamEvent) {\n onStreamEvent({ type: 'stderr', content: text, timestamp: new Date().toISOString() });\n }\n });\n\n child.on('close', (code) => {\n this.activeChildren.delete(child);\n clearTimeout(timer);\n if (killTimer) clearTimeout(killTimer);\n if (resultGraceTimer) clearTimeout(resultGraceTimer);\n if (idleCheckInterval) clearInterval(idleCheckInterval);\n if (flushInterval) clearInterval(flushInterval);\n\n if (onStreamEvent && lineBuffer.trim()) {\n this.emitStreamLine(lineBuffer.trim(), onStreamEvent);\n }\n\n const rawOutput = Buffer.concat(chunks as unknown as Uint8Array[]).toString('utf-8');\n const { output, resolvedSessionId, hasError, errorMessage: parsedErrorMessage } = this.parseOutput(rawOutput, sessionId);\n\n const success = code === 0 && !timedOut && !hasError;\n logger.info('AI runner finished', { exitCode: code, success, timedOut });\n\n const stderrText = stderrChunks.length > 0 ? Buffer.concat(stderrChunks as unknown as Uint8Array[]).toString('utf-8').trim() : '';\n const finalOutput = (!success && !output.trim() && stderrText) ? stderrText : output;\n\n // 组装真正的错误原因\n let errorMessage: string | undefined;\n if (!success) {\n const parts: string[] = [];\n if (timedOut) parts.push(timeoutType === 'idle' ? 'AI 长时间无响应,已超时终止' : '执行超时');\n if (parsedErrorMessage) parts.push(parsedErrorMessage);\n if (code !== 0 && code !== null) parts.push(`进程退出码: ${code}`);\n if (!parts.length && stderrText) parts.push(stderrText.slice(0, 500));\n errorMessage = parts.join(' | ') || undefined;\n }\n\n resolve({\n success,\n output: finalOutput,\n errorMessage,\n sessionId: resolvedSessionId ?? sessionId,\n exitCode: code,\n timeoutType,\n });\n });\n\n child.on('error', (err) => {\n this.activeChildren.delete(child);\n clearTimeout(timer);\n if (killTimer) clearTimeout(killTimer);\n if (resultGraceTimer) clearTimeout(resultGraceTimer);\n if (idleCheckInterval) clearInterval(idleCheckInterval);\n if (flushInterval) clearInterval(flushInterval);\n logger.error('AI runner spawn error', { error: err.message });\n resolve({\n success: false,\n output: err.message,\n errorMessage: err.message,\n exitCode: null,\n });\n });\n\n child.stdin.write(prompt);\n child.stdin.end();\n });\n }\n\n killAll(): void {\n for (const [child] of this.activeChildren) {\n this.forceKillChild(child);\n }\n logger.info('Killed all active AI runner children', { count: this.activeChildren.size });\n }\n\n killByWorkDir(targetWorkDir: string): number {\n let killed = 0;\n for (const [child, entry] of this.activeChildren) {\n if (entry.workDir === targetWorkDir) {\n this.forceKillChild(child);\n killed++;\n }\n }\n if (killed > 0) {\n logger.info('Killed AI runner children by workDir', { workDir: targetWorkDir, killed });\n }\n return killed;\n }\n\n private forceKillChild(child: ChildProcess): void {\n try {\n if (child.exitCode === null) {\n child.kill('SIGTERM');\n setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n }\n }, SIGKILL_GRACE_MS);\n }\n } catch {\n // process may have already exited\n }\n }\n\n private emitStreamLine(line: string, onStreamEvent: (event: StreamEvent) => void): void {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n onStreamEvent({\n type: (typeof parsed.type === 'string' ? parsed.type : 'raw'),\n content: parsed,\n timestamp: new Date().toISOString(),\n });\n } catch {\n onStreamEvent({ type: 'raw', content: line, timestamp: new Date().toISOString() });\n }\n }\n\n /**\n * Handles both stream-json (one JSON object per line) and legacy single-JSON formats.\n */\n parseOutput(rawOutput: string, _sessionId?: string): { output: string; resolvedSessionId?: string; hasError?: boolean; errorMessage?: string } {\n let output = rawOutput;\n let resolvedSessionId: string | undefined;\n\n const events = this.tryParseStreamJson(rawOutput);\n if (events) {\n output = events\n .filter((item: { type?: string }) => item.type === 'result')\n .map((item: { result?: string }) => item.result ?? '')\n .join('\\n');\n const sessionItem = events.find(\n (item: { type?: string; session_id?: string }) => item.session_id != null,\n );\n if (sessionItem) {\n resolvedSessionId = (sessionItem as { session_id: string }).session_id;\n }\n if (!output) {\n output = this.extractAssistantText(events);\n }\n if (!output) {\n output = this.summarizeStreamEvents(events);\n }\n\n // 始终检查 error 事件,不论 output 是否有值\n const hasError = this.hasErrorEvents(events);\n const errorMessage = hasError ? this.extractErrorMessage(events) : undefined;\n return { output, resolvedSessionId, hasError, errorMessage };\n }\n\n try {\n const parsed = JSON.parse(rawOutput);\n if (Array.isArray(parsed)) {\n output = parsed\n .filter((item: { type?: string }) => item.type === 'result')\n .map((item: { result?: string }) => item.result ?? '')\n .join('\\n');\n const sessionItem = parsed.find(\n (item: { type?: string; session_id?: string }) => item.session_id != null,\n );\n if (sessionItem) {\n resolvedSessionId = sessionItem.session_id;\n }\n if (!output) {\n output = this.extractAssistantText(parsed);\n }\n // 始终检查 error 事件\n const hasError = this.hasErrorEvents(parsed);\n const errorMessage = hasError ? this.extractErrorMessage(parsed) : undefined;\n return { output, resolvedSessionId, hasError, errorMessage };\n } else if (parsed.result != null) {\n output = parsed.result;\n resolvedSessionId = parsed.session_id;\n }\n } catch {\n // raw text output\n }\n\n return { output, resolvedSessionId };\n }\n\n /**\n * Extract plain text from assistant events as fallback when result.result is empty.\n * Looks for message.content[].text in assistant-type events.\n */\n private extractAssistantText(events: Record<string, unknown>[]): string {\n const texts: string[] = [];\n for (const evt of events) {\n if (evt.type !== 'assistant') continue;\n const message = evt.message as { content?: Array<{ type?: string; text?: string }> } | undefined;\n if (!message?.content || !Array.isArray(message.content)) continue;\n for (const block of message.content) {\n if (block.type === 'text' && block.text) {\n texts.push(block.text);\n }\n }\n }\n return texts.join('');\n }\n\n private hasErrorEvents(events: Record<string, unknown>[]): boolean {\n return events.some(e => e.type === 'error' || e.subtype === 'error');\n }\n\n /** 提取 error 事件中的错误描述信息 */\n private extractErrorMessage(events: Record<string, unknown>[]): string {\n const errorEvents = events.filter(e => e.type === 'error' || e.subtype === 'error');\n if (errorEvents.length === 0) return '';\n return errorEvents.map(e => String(e.message ?? e.error ?? JSON.stringify(e))).join('; ');\n }\n\n private summarizeStreamEvents(events: Record<string, unknown>[]): string {\n const errorEvents = events.filter(\n (e) => e.type === 'error' || e.subtype === 'error',\n );\n if (errorEvents.length > 0) {\n const messages = errorEvents.map(\n (e) => String(e.message ?? e.error ?? JSON.stringify(e)),\n );\n return `AI runner 错误: ${messages.join('; ')}`;\n }\n\n const types = events.map((e) => String(e.type ?? 'unknown'));\n const typeCounts: Record<string, number> = {};\n for (const t of types) {\n typeCounts[t] = (typeCounts[t] ?? 0) + 1;\n }\n const summary = Object.entries(typeCounts)\n .map(([t, c]) => `${t}(${c})`)\n .join(', ');\n return `AI runner 未返回结果 (收到 ${events.length} 个事件: ${summary})`;\n }\n\n private tryParseStreamJson(raw: string): Record<string, unknown>[] | null {\n const lines = raw.split('\\n').filter((l) => l.trim());\n if (lines.length < 2) return null;\n\n const objects: Record<string, unknown>[] = [];\n for (const line of lines) {\n try {\n objects.push(JSON.parse(line) as Record<string, unknown>);\n } catch {\n return null;\n }\n }\n return objects;\n }\n}\n","import type { SpawnOptions } from 'node:child_process';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport type { RunOptions } from './AIRunner.js';\n\nexport class ClaudeInternalRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(options: RunOptions): string[] {\n const args = ['-p', '-', '--output-format', 'stream-json', '--verbose'];\n if (options.mode === 'plan') {\n args.push('--permission-mode', 'plan', '--allowedTools', 'Read,Grep,Glob,WebSearch');\n } else {\n args.push('--dangerously-skip-permissions');\n }\n if (this.model) {\n args.push('--model', this.model);\n }\n if (options.continueSession && options.sessionId) {\n args.push('--resume', options.sessionId);\n }\n return args;\n }\n\n protected getSpawnOptions(options: RunOptions): SpawnOptions {\n const { CLAUDECODE, ...env } = process.env;\n return {\n cwd: options.workDir,\n env: {\n ...env,\n NODE_VERSION: this.nvmNodeVersion,\n },\n };\n }\n}\n","import type { SpawnOptions } from 'node:child_process';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport type { RunOptions } from './AIRunner.js';\n\nexport class CursorAgentRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(options: RunOptions): string[] {\n const args = [\n 'agent',\n '-p',\n '--force',\n '--trust',\n '--output-format',\n 'stream-json',\n '--workspace',\n options.workDir,\n ];\n if (options.mode === 'plan') {\n args.push('--mode', 'plan');\n }\n if (this.model) {\n args.push('--model', this.model);\n }\n if (options.continueSession && options.sessionId) {\n args.push('--resume', options.sessionId);\n }\n return args;\n }\n\n protected getSpawnOptions(_options: RunOptions): SpawnOptions {\n return {\n cwd: process.cwd(),\n env: {\n ...process.env,\n NODE_VERSION: this.nvmNodeVersion,\n },\n };\n }\n}\n","import type { SpawnOptions } from 'node:child_process';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport type { RunOptions } from './AIRunner.js';\n\nexport class CodebuddyRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(options: RunOptions): string[] {\n const args = ['-p', '-', '--output-format', 'stream-json', '--verbose'];\n if (this.model) {\n args.push('--model', this.model);\n }\n if (options.continueSession && options.sessionId) {\n args.push('--resume', options.sessionId);\n }\n // CodeBuddy 的 --permission-mode plan 设计为交互式审批,与 -p 非交互模式不兼容,\n // 会导致进程卡死。plan 阶段的行为约束通过 Prompt 层(planModeFallback)控制。\n args.push('-y');\n return args;\n }\n\n protected getSpawnOptions(options: RunOptions): SpawnOptions {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { CLAUDECODE, ...env } = process.env;\n return {\n cwd: options.workDir,\n env: {\n ...env,\n NODE_VERSION: this.nvmNodeVersion,\n },\n };\n }\n}\n","/**\n * CodeBuddy ACP Runner — uses the Agent Client Protocol (JSON-RPC 2.0 over stdio)\n * for native plan-mode support with programmatic input/output control.\n *\n * Unlike CodebuddyRunner (pipe mode), this runner maintains a persistent session\n * with three-step handshake (initialize → session/new → session/prompt) and handles\n * permission requests from the agent.\n */\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { logger as rootLogger } from '../logger.js';\nimport { isShuttingDown } from '../shutdown/ShutdownSignal.js';\nimport type { RunOptions, RunResult, StreamEvent } from './AIRunner.js';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport {\n AcpProtocol,\n isNotification,\n isAgentRequest,\n isResponse,\n isPermissionRequest,\n isSessionUpdate,\n type AcpInboundMessage,\n type AcpUpdatePayload,\n type AcpUpdateChunk,\n type AcpUpdateToolCall,\n type AcpUpdateToolCallUpdate,\n} from './acp/AcpProtocol.js';\n\nconst logger = rootLogger.child('CodebuddyAcpRunner');\n\nconst SIGKILL_GRACE_MS = 10_000;\nconst IDLE_CHECK_INTERVAL_MS = 5_000;\n\ninterface ActiveChild {\n child: ChildProcess;\n workDir: string;\n}\n\n/** Handshake FSM states */\ntype HandshakeState = 'init' | 'session_new' | 'prompting' | 'done';\n\nexport class CodebuddyAcpRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n private acpActiveChildren = new Map<ChildProcess, ActiveChild>();\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n // ── Overrides required by BaseAIRunner (kept for compatibility) ──\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(_options: RunOptions): string[] {\n const args = ['--acp', '--acp-transport', 'stdio', '--permission-mode', 'plan', '--verbose'];\n if (this.model) args.push('--model', this.model);\n return args;\n }\n\n protected getSpawnOptions(options: RunOptions): Record<string, unknown> {\n const { CLAUDECODE, ...env } = process.env;\n void CLAUDECODE;\n return {\n cwd: options.workDir,\n env: { ...env, NODE_VERSION: this.nvmNodeVersion },\n };\n }\n\n // ── Main entry: override BaseAIRunner.run() for ACP session lifecycle ──\n\n async run(options: RunOptions): Promise<RunResult> {\n if (isShuttingDown()) {\n logger.warn('ACP runner skipped — service is shutting down');\n return { success: false, output: 'Service shutting down', exitCode: null };\n }\n\n const { prompt, workDir, timeoutMs, idleTimeoutMs, onStreamEvent } = options;\n\n logger.info('Starting CodeBuddy ACP session', {\n workDir,\n timeoutMs,\n idleTimeoutMs,\n model: this.model,\n });\n\n return new Promise<RunResult>((resolve) => {\n const protocol = new AcpProtocol();\n let rpcId = 1;\n let sessionId: string | undefined;\n let handshake: HandshakeState = 'init';\n const outputChunks: string[] = [];\n let timedOut = false;\n let timeoutType: 'wall-clock' | 'idle' | undefined;\n let lastActivityTime = Date.now();\n let resolved = false;\n const stderrChunks: string[] = [];\n\n const safeResolve = (result: RunResult) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n resolve(result);\n };\n\n const binary = this.getBinary();\n const args = this.buildArgs(options);\n const spawnOpts = this.getSpawnOptions(options);\n\n const child = spawn(binary, args, {\n ...(spawnOpts as Record<string, unknown>),\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.acpActiveChildren.set(child, { child, workDir });\n\n // ── Timers ──\n\n const wallTimer = setTimeout(() => {\n timedOut = true;\n timeoutType = 'wall-clock';\n logger.warn('ACP runner wall-clock timeout', { timeoutMs });\n killChild(child);\n }, timeoutMs);\n\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n\n const idleInterval = idleTimeoutMs\n ? setInterval(() => {\n if (Date.now() - lastActivityTime >= idleTimeoutMs) {\n timedOut = true;\n timeoutType = 'idle';\n logger.warn('ACP runner idle timeout', { idleTimeoutMs });\n clearInterval(idleInterval!);\n killChild(child);\n }\n }, IDLE_CHECK_INTERVAL_MS)\n : undefined;\n\n const cleanup = () => {\n clearTimeout(wallTimer);\n if (killTimer) clearTimeout(killTimer);\n if (idleInterval) clearInterval(idleInterval);\n this.acpActiveChildren.delete(child);\n };\n\n const killChild = (proc: ChildProcess) => {\n try {\n proc.kill('SIGTERM');\n killTimer = setTimeout(() => {\n if (proc.exitCode === null) {\n proc.kill('SIGKILL');\n proc.stdout?.destroy();\n proc.stderr?.destroy();\n }\n }, SIGKILL_GRACE_MS);\n } catch { /* already exited */ }\n };\n\n // ── Send initialize as first message ──\n child.stdin!.write(protocol.encodeRequest('initialize', { protocolVersion: 1 }, rpcId++));\n\n // ── Stdout handler ──\n child.stdout!.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n\n for (const msg of protocol.parseChunk(chunk)) {\n this.handleMessage(\n msg, child, protocol, handshake,\n () => rpcId++,\n (s) => { sessionId = s; },\n () => sessionId,\n (h) => { handshake = h; },\n () => handshake,\n workDir, prompt, outputChunks, onStreamEvent,\n (result) => safeResolve(result),\n options,\n );\n }\n });\n\n child.stderr!.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n const text = chunk.toString();\n stderrChunks.push(text);\n logger.debug('ACP runner stderr: ' + text.slice(0, 500));\n if (onStreamEvent) {\n onStreamEvent({ type: 'stderr', content: text, timestamp: new Date().toISOString() });\n }\n });\n\n child.on('close', (code) => {\n // Flush remaining buffer\n for (const msg of protocol.flush()) {\n this.handleMessage(\n msg, child, protocol, handshake,\n () => rpcId++,\n (s) => { sessionId = s; },\n () => sessionId,\n (h) => { handshake = h; },\n () => handshake,\n workDir, prompt, outputChunks, onStreamEvent,\n (result) => safeResolve(result),\n options,\n );\n }\n\n const output = outputChunks.join('');\n const stderrText = stderrChunks.join('').trim();\n const success = code === 0 && !timedOut;\n\n let errorMessage: string | undefined;\n if (!success) {\n const parts: string[] = [];\n if (timedOut) parts.push(timeoutType === 'idle' ? 'AI 长时间无响应,已超时终止' : '执行超时');\n if (code !== 0 && code !== null) parts.push(`进程退出码: ${code}`);\n if (!parts.length && stderrText) parts.push(stderrText.slice(0, 500));\n errorMessage = parts.join(' | ') || undefined;\n }\n\n logger.info('ACP runner finished', { exitCode: code, success, timedOut });\n safeResolve({\n success,\n output: output || stderrText,\n errorMessage,\n sessionId,\n exitCode: code,\n timeoutType,\n });\n });\n\n child.on('error', (err) => {\n logger.error('ACP runner spawn error', { error: err.message });\n safeResolve({\n success: false,\n output: err.message,\n errorMessage: err.message,\n exitCode: null,\n });\n });\n });\n }\n\n // ── Message dispatch ──\n\n private handleMessage(\n msg: AcpInboundMessage,\n child: ChildProcess,\n protocol: AcpProtocol,\n _handshake: HandshakeState,\n nextId: () => number,\n setSessionId: (s: string) => void,\n getSessionId: () => string | undefined,\n setHandshake: (h: HandshakeState) => void,\n getHandshake: () => HandshakeState,\n workDir: string,\n prompt: string,\n outputChunks: string[],\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n onComplete: (result: RunResult) => void,\n options: RunOptions,\n ): void {\n if (isResponse(msg)) {\n this.handleResponse(\n msg, child, protocol, nextId, setSessionId, getSessionId,\n setHandshake, getHandshake, workDir, prompt, outputChunks,\n onStreamEvent, onComplete, options,\n );\n } else if (isNotification(msg)) {\n this.handleNotification(msg, outputChunks, onStreamEvent);\n } else if (isAgentRequest(msg)) {\n this.handleAgentRequest(msg, child, protocol, onStreamEvent, options);\n }\n }\n\n private handleResponse(\n msg: AcpInboundMessage,\n child: ChildProcess,\n protocol: AcpProtocol,\n nextId: () => number,\n setSessionId: (s: string) => void,\n getSessionId: () => string | undefined,\n setHandshake: (h: HandshakeState) => void,\n getHandshake: () => HandshakeState,\n workDir: string,\n prompt: string,\n outputChunks: string[],\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n _onComplete: (result: RunResult) => void,\n _options: RunOptions,\n ): void {\n const result = msg.result as Record<string, unknown> | undefined;\n const state = getHandshake();\n\n if (state === 'init' && result?.protocolVersion !== undefined) {\n // initialize response → send session/new\n setHandshake('session_new');\n child.stdin!.write(\n protocol.encodeRequest('session/new', { cwd: workDir, mcpServers: [] }, nextId()),\n );\n } else if (state === 'session_new' && result?.sessionId) {\n // session/new response → send session/prompt\n setSessionId(result.sessionId as string);\n setHandshake('prompting');\n child.stdin!.write(\n protocol.encodeRequest(\n 'session/prompt',\n {\n sessionId: result.sessionId,\n prompt: [{ type: 'text', text: prompt }],\n },\n nextId(),\n ),\n );\n } else if (state === 'prompting') {\n // session/prompt final response\n setHandshake('done');\n const stopReason = (result as Record<string, unknown> | undefined)?.stopReason as string | undefined;\n logger.info('ACP session/prompt completed', {\n stopReason,\n sessionId: getSessionId(),\n });\n if (onStreamEvent) {\n onStreamEvent({\n type: 'system',\n content: `ACP session completed: ${stopReason ?? 'unknown'}`,\n timestamp: new Date().toISOString(),\n });\n }\n // Collect final output text\n if (stopReason === 'refusal') {\n outputChunks.push('[REFUSED] Agent 拒绝执行');\n }\n }\n }\n\n private handleNotification(\n msg: AcpInboundMessage,\n outputChunks: string[],\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n ): void {\n if (!isSessionUpdate(msg)) return;\n\n const update = msg.params?.update as AcpUpdatePayload | undefined;\n if (!update) return;\n\n const event = this.mapUpdateToStreamEvent(update, outputChunks);\n if (event && onStreamEvent) {\n onStreamEvent(event);\n }\n }\n\n private handleAgentRequest(\n msg: AcpInboundMessage,\n child: ChildProcess,\n protocol: AcpProtocol,\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n options: RunOptions,\n ): void {\n if (!isPermissionRequest(msg)) {\n // Unknown agent request — send empty result to avoid blocking\n child.stdin!.write(protocol.encodeResponse(msg.id as number, {}));\n return;\n }\n\n const toolTitle = msg.params.toolCall.rawInput\n ? JSON.stringify(msg.params.toolCall.rawInput).slice(0, 200)\n : msg.params.toolCall.toolCallId;\n\n if (onStreamEvent) {\n onStreamEvent({\n type: 'system',\n content: `Permission requested: ${toolTitle}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n if (options.onInputRequired) {\n const permissionContent = JSON.stringify({\n toolCallId: msg.params.toolCall.toolCallId,\n options: msg.params.options,\n rawInput: msg.params.toolCall.rawInput,\n });\n\n options.onInputRequired({ type: 'plan-approval', content: permissionContent })\n .then((decision) => {\n const optionId = decision === 'reject' ? 'reject' : 'allow';\n child.stdin!.write(\n protocol.encodeResponse(msg.id, {\n outcome: { outcome: 'selected', optionId },\n }),\n );\n })\n .catch((err) => {\n logger.warn('onInputRequired callback failed, auto-approving', { error: (err as Error).message });\n this.autoApprove(child, protocol, msg.id, msg.params.options);\n });\n return;\n }\n\n // No callback: auto-approve all permissions\n this.autoApprove(child, protocol, msg.id, msg.params.options);\n }\n\n private autoApprove(\n child: ChildProcess,\n protocol: AcpProtocol,\n requestId: number,\n options: Array<{ optionId: string; kind: string }>,\n ): void {\n const allowOption = options.find(\n (o) => o.kind === 'allow_always' || o.kind === 'allow_once',\n );\n child.stdin!.write(\n protocol.encodeResponse(requestId, {\n outcome: { outcome: 'selected', optionId: allowOption?.optionId ?? 'allow' },\n }),\n );\n }\n\n // ── StreamEvent mapping (reuses existing frontend log pipeline) ──\n\n private mapUpdateToStreamEvent(\n update: AcpUpdatePayload,\n outputChunks: string[],\n ): StreamEvent | null {\n switch (update.sessionUpdate) {\n case 'agent_message_chunk': {\n const chunk = update as AcpUpdateChunk;\n if (chunk.content.type === 'thinking') {\n return {\n type: 'thinking',\n content: { text: chunk.content.text },\n timestamp: new Date().toISOString(),\n };\n }\n outputChunks.push(chunk.content.text);\n return {\n type: 'assistant',\n content: {\n message: { content: [{ type: 'text', text: chunk.content.text }] },\n },\n timestamp: new Date().toISOString(),\n };\n }\n\n case 'tool_call': {\n const tc = update as AcpUpdateToolCall;\n return {\n type: 'tool_use',\n content: { tool: { name: tc.title, input: tc.rawInput ?? {} } },\n timestamp: new Date().toISOString(),\n };\n }\n\n case 'tool_call_update': {\n const tcu = update as AcpUpdateToolCallUpdate;\n return {\n type: 'tool_result',\n content: tcu.status,\n timestamp: new Date().toISOString(),\n };\n }\n\n default:\n return null;\n }\n }\n\n // ── Process management ──\n\n killAll(): void {\n for (const [child] of this.acpActiveChildren) {\n this.forceKill(child);\n }\n logger.info('Killed all ACP runner children', { count: this.acpActiveChildren.size });\n }\n\n killByWorkDir(targetWorkDir: string): number {\n let killed = 0;\n for (const [child, entry] of this.acpActiveChildren) {\n if (entry.workDir === targetWorkDir) {\n this.forceKill(child);\n killed++;\n }\n }\n if (killed > 0) {\n logger.info('Killed ACP runner children by workDir', { workDir: targetWorkDir, killed });\n }\n return killed;\n }\n\n private forceKill(child: ChildProcess): void {\n try {\n if (child.exitCode === null) {\n child.kill('SIGTERM');\n setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, SIGKILL_GRACE_MS);\n }\n } catch { /* already exited */ }\n }\n}\n","/**\n * ACP (Agent Client Protocol) JSON-RPC 2.0 codec.\n *\n * Handles line-buffered parsing of newline-delimited JSON messages from\n * CodeBuddy's stdin/stdout ACP transport and encoding of outbound requests/responses.\n *\n * Protocol reference: https://agentclientprotocol.com/protocol/schema\n */\n\n// ---------------------------------------------------------------------------\n// Outbound types (Agent → Client)\n// ---------------------------------------------------------------------------\n\nexport interface AcpUpdateChunk {\n sessionUpdate: 'agent_message_chunk';\n content: { type: 'text' | 'thinking'; text: string };\n}\n\nexport interface AcpUpdateToolCall {\n sessionUpdate: 'tool_call';\n toolCallId: string;\n title: string;\n kind: string;\n status: string;\n content?: Array<{\n type: string;\n path?: string;\n oldText?: string | null;\n newText?: string;\n text?: string;\n }>;\n rawInput?: Record<string, unknown>;\n}\n\nexport interface AcpUpdateToolCallUpdate {\n sessionUpdate: 'tool_call_update';\n toolCallId: string;\n status: string;\n}\n\nexport interface AcpUpdateGeneric {\n sessionUpdate: string;\n [key: string]: unknown;\n}\n\nexport type AcpUpdatePayload =\n | AcpUpdateChunk\n | AcpUpdateToolCall\n | AcpUpdateToolCallUpdate\n | AcpUpdateGeneric;\n\nexport interface AcpSessionUpdate {\n jsonrpc: '2.0';\n method: 'session/update';\n params: {\n sessionId: string;\n update: AcpUpdatePayload;\n };\n}\n\nexport interface AcpPermissionOption {\n optionId: string;\n name: string;\n kind: string;\n}\n\nexport interface AcpPermissionRequest {\n jsonrpc: '2.0';\n id: number;\n method: 'session/request_permission';\n params: {\n sessionId: string;\n options: AcpPermissionOption[];\n toolCall: {\n toolCallId: string;\n rawInput?: Record<string, unknown>;\n };\n };\n}\n\nexport interface AcpResponse {\n jsonrpc: '2.0';\n id: number;\n result: Record<string, unknown>;\n}\n\nexport interface AcpError {\n jsonrpc: '2.0';\n id: number;\n error: { code: number; message: string; data?: unknown };\n}\n\n// Discriminated message type from the agent\nexport type AcpInboundMessage = Record<string, unknown>;\n\n// ---------------------------------------------------------------------------\n// Message classification helpers\n// ---------------------------------------------------------------------------\n\nexport function isNotification(msg: AcpInboundMessage): boolean {\n return typeof msg.method === 'string' && msg.id === undefined;\n}\n\nexport function isAgentRequest(msg: AcpInboundMessage): boolean {\n return typeof msg.method === 'string' && msg.id !== undefined;\n}\n\nexport function isResponse(msg: AcpInboundMessage): boolean {\n return msg.method === undefined && msg.id !== undefined;\n}\n\nexport function isPermissionRequest(msg: AcpInboundMessage): msg is AcpPermissionRequest & AcpInboundMessage {\n return isAgentRequest(msg) && msg.method === 'session/request_permission';\n}\n\nexport function isSessionUpdate(msg: AcpInboundMessage): msg is AcpSessionUpdate & AcpInboundMessage {\n return isNotification(msg) && msg.method === 'session/update';\n}\n\n// ---------------------------------------------------------------------------\n// Protocol codec\n// ---------------------------------------------------------------------------\n\nexport class AcpProtocol {\n private lineBuffer = '';\n\n /** Parse incoming data chunk into zero or more complete JSON-RPC messages. */\n parseChunk(chunk: Buffer | string): AcpInboundMessage[] {\n this.lineBuffer += typeof chunk === 'string' ? chunk : chunk.toString('utf-8');\n\n const messages: AcpInboundMessage[] = [];\n let newlineIdx: number;\n\n while ((newlineIdx = this.lineBuffer.indexOf('\\n')) !== -1) {\n const line = this.lineBuffer.slice(0, newlineIdx).trim();\n this.lineBuffer = this.lineBuffer.slice(newlineIdx + 1);\n\n if (!line) continue;\n\n try {\n messages.push(JSON.parse(line) as AcpInboundMessage);\n } catch {\n // Malformed line — skip silently (could be debug output from --verbose)\n }\n }\n\n return messages;\n }\n\n /** Flush any remaining buffered data (e.g. on stream end). */\n flush(): AcpInboundMessage[] {\n const remaining = this.lineBuffer.trim();\n this.lineBuffer = '';\n if (!remaining) return [];\n\n try {\n return [JSON.parse(remaining) as AcpInboundMessage];\n } catch {\n return [];\n }\n }\n\n /** Encode a JSON-RPC request (Client → Agent). */\n encodeRequest(method: string, params: Record<string, unknown>, id: number): string {\n return JSON.stringify({ jsonrpc: '2.0', method, params, id }) + '\\n';\n }\n\n /** Encode a JSON-RPC response (Client → Agent, replying to agent request). */\n encodeResponse(id: number, result: Record<string, unknown>): string {\n return JSON.stringify({ jsonrpc: '2.0', id, result }) + '\\n';\n }\n}\n","import { spawn } from 'node:child_process';\nimport type { AIRunner } from './AIRunner.js';\nimport type { BaseAIRunner } from './BaseAIRunner.js';\nimport { RunnerNotRegisteredError } from '../errors/index.js';\nimport { resolveModelForRunner } from './ModelMapping.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AIConfig {\n mode: string;\n binary: string;\n phaseTimeoutMs: number;\n nvmNodeVersion: string;\n model?: string;\n}\n\ntype RunnerConstructor = new (binary: string, nvmNodeVersion: string, model?: string) => BaseAIRunner;\n\nexport interface RunnerCapabilities {\n /** Whether the runner natively supports plan mode (AI enters planning mindset) */\n nativePlanMode: boolean;\n}\n\nexport interface RunnerRegistryEntry {\n ctor: RunnerConstructor;\n defaultBinary: string;\n binaryEnvKey: string;\n capabilities: RunnerCapabilities;\n}\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst AI_RUNNER_REGISTRY: Record<string, RunnerRegistryEntry> = {};\n\nexport function registerAIRunner(mode: string, entry: RunnerRegistryEntry): void {\n AI_RUNNER_REGISTRY[mode] = entry;\n}\n\nexport function getRegisteredRunnerModes(): string[] {\n return Object.keys(AI_RUNNER_REGISTRY);\n}\n\nexport function isRegisteredRunner(mode: string): boolean {\n return mode in AI_RUNNER_REGISTRY;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve helpers (replace config.ts switch/case)\n// ---------------------------------------------------------------------------\n\nexport function resolveRunnerMode(raw: string): string {\n return raw || 'claude-internal';\n}\n\nexport function getDefaultBinary(mode: string): string {\n const entry = AI_RUNNER_REGISTRY[mode];\n return entry?.defaultBinary ?? mode;\n}\n\nexport function getBinaryEnvKey(mode: string): string | undefined {\n return AI_RUNNER_REGISTRY[mode]?.binaryEnvKey;\n}\n\nexport function getRunnerCapabilities(mode: string): RunnerCapabilities | undefined {\n return AI_RUNNER_REGISTRY[mode]?.capabilities;\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createAIRunner(ai: AIConfig): AIRunner {\n const entry = AI_RUNNER_REGISTRY[ai.mode];\n if (!entry) {\n throw new RunnerNotRegisteredError(ai.mode, getRegisteredRunnerModes());\n }\n const resolvedModel = ai.model ? resolveModelForRunner(ai.mode, ai.model) : undefined;\n return new entry.ctor(ai.binary, ai.nvmNodeVersion, resolvedModel);\n}\n\n// ---------------------------------------------------------------------------\n// Startup validation\n// ---------------------------------------------------------------------------\n\nexport function validateRunnerRegistry(modes: string[]): void {\n const missing = modes.filter((m) => !isRegisteredRunner(m));\n if (missing.length > 0) {\n throw new RunnerNotRegisteredError(\n missing.join(', '),\n getRegisteredRunnerModes(),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Binary availability check\n// ---------------------------------------------------------------------------\n\n/** Check if a binary is available on the system PATH. */\nexport function isBinaryAvailable(binary: string): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('which', [binary], { stdio: ['ignore', 'pipe', 'ignore'] });\n proc.on('close', (code) => resolve(code === 0));\n proc.on('error', () => resolve(false));\n });\n}\n\n// ---------------------------------------------------------------------------\n// Built-in registrations\n// ---------------------------------------------------------------------------\n\nimport { ClaudeInternalRunner } from './ClaudeInternalRunner.js';\nimport { CursorAgentRunner } from './CursorAgentRunner.js';\nimport { CodebuddyRunner } from './CodebuddyRunner.js';\nimport { CodebuddyAcpRunner } from './CodebuddyAcpRunner.js';\n\nregisterAIRunner('claude-internal', {\n ctor: ClaudeInternalRunner,\n defaultBinary: 'claude-internal',\n binaryEnvKey: 'CLAUDE_BINARY',\n capabilities: { nativePlanMode: false },\n});\n\nregisterAIRunner('cursor-agent', {\n ctor: CursorAgentRunner,\n defaultBinary: 'cursor-agent',\n binaryEnvKey: 'CURSOR_BINARY',\n capabilities: { nativePlanMode: true },\n});\n\nregisterAIRunner('codebuddy', {\n ctor: CodebuddyRunner,\n defaultBinary: 'codebuddy',\n binaryEnvKey: 'CODEBUDDY_BINARY',\n capabilities: { nativePlanMode: false },\n});\n\nregisterAIRunner('codebuddy-acp', {\n ctor: CodebuddyAcpRunner,\n defaultBinary: 'codebuddy',\n binaryEnvKey: 'CODEBUDDY_BINARY',\n capabilities: { nativePlanMode: true },\n});\n","/**\n * Base application error with structured error code and cause chain.\n */\nexport class AppError extends Error {\n /** Unique error code for programmatic matching (e.g. 'GONGFENG_API_ERROR'). */\n public readonly code: string;\n /** Original cause, if any. */\n public override readonly cause?: Error;\n\n constructor(code: string, message: string, cause?: Error) {\n super(message, { cause });\n this.name = this.constructor.name;\n this.code = code;\n this.cause = cause;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n ...(this.cause ? { cause: this.cause.message } : {}),\n };\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class GongfengApiError extends AppError {\n public readonly statusCode: number;\n public readonly responseBody?: string;\n\n constructor(statusCode: number, message: string, responseBody?: string) {\n super('GONGFENG_API_ERROR', message);\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n\n /** Whether this error is potentially retryable (5xx or network). */\n get isRetryable(): boolean {\n return this.statusCode >= 500 || this.statusCode === 0;\n }\n}\n\nexport class GongfengUploadError extends GongfengApiError {\n constructor(statusCode: number, message: string, responseBody?: string) {\n super(statusCode, message, responseBody);\n this.name = 'GongfengUploadError';\n // Override code\n Object.defineProperty(this, 'code', { value: 'GONGFENG_UPLOAD_ERROR' });\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class AIExecutionError extends AppError {\n public readonly phase: string;\n public readonly output?: string;\n public readonly exitCode?: number | null;\n public readonly isRetryable: boolean;\n\n constructor(phase: string, message: string, opts?: { output?: string; exitCode?: number | null; cause?: Error; isRetryable?: boolean }) {\n super('AI_EXECUTION_ERROR', message, opts?.cause);\n this.phase = phase;\n this.output = opts?.output;\n this.exitCode = opts?.exitCode;\n this.isRetryable = opts?.isRetryable ?? true;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class IssueNotFoundError extends AppError {\n public readonly issueIid: number;\n constructor(issueIid: number) {\n super('ISSUE_NOT_FOUND', `Issue ${issueIid} not found in tracker`);\n this.issueIid = issueIid;\n }\n}\n\nexport class BatchNotFoundError extends AppError {\n public readonly batchId: string;\n constructor(batchId: string) {\n super('BATCH_NOT_FOUND', `Braindump batch not found: ${batchId}`);\n this.batchId = batchId;\n }\n}\n\nexport class SessionNotFoundError extends AppError {\n public readonly sessionId: string;\n constructor(sessionId: string) {\n super('SESSION_NOT_FOUND', `Chat session not found: ${sessionId}`);\n this.sessionId = sessionId;\n }\n}\n\nexport class TaskNotFoundError extends AppError {\n public readonly taskId: string;\n constructor(taskId: string) {\n super('TASK_NOT_FOUND', `Braindump task not found: ${taskId}`);\n this.taskId = taskId;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class InvalidPhaseError extends AppError {\n public readonly phase: string;\n constructor(phase: string, message?: string) {\n super('INVALID_PHASE', message ?? `Invalid phase for retry: ${phase}`);\n this.phase = phase;\n }\n}\n\nexport class InvalidStateError extends AppError {\n public readonly state: string;\n constructor(state: string, message?: string) {\n super('INVALID_STATE', message ?? `Invalid state: ${state}`);\n this.state = state;\n }\n}\n\nexport class PortExhaustionError extends AppError {\n constructor(message?: string) {\n super('PORT_EXHAUSTION', message ?? 'No available ports in the configured range');\n }\n}\n\nexport class SessionLimitError extends AppError {\n public readonly limit: number;\n constructor(limit: number) {\n super('SESSION_LIMIT', `Session message limit reached (${limit})`);\n this.limit = limit;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class ServiceShutdownError extends AppError {\n constructor() {\n super('SERVICE_SHUTDOWN', 'Service shutting down');\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class AIOutputParseError extends AppError {\n public readonly rawOutput?: string;\n constructor(message: string, rawOutput?: string) {\n super('AI_OUTPUT_PARSE_ERROR', message);\n this.rawOutput = rawOutput;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class PhaseNotRegisteredError extends AppError {\n public readonly phaseName: string;\n public readonly registeredPhases: string[];\n constructor(phaseName: string, registeredPhases: string[]) {\n super(\n 'PHASE_NOT_REGISTERED',\n `Unknown phase: ${phaseName}. Registered phases: ${registeredPhases.join(', ')}`,\n );\n this.phaseName = phaseName;\n this.registeredPhases = registeredPhases;\n }\n}\n\nexport class RunnerNotRegisteredError extends AppError {\n public readonly mode: string;\n public readonly registeredModes: string[];\n constructor(mode: string, registeredModes: string[]) {\n super(\n 'RUNNER_NOT_REGISTERED',\n `Unknown AI runner mode: ${mode}. Registered modes: ${registeredModes.join(', ')}`,\n );\n this.mode = mode;\n this.registeredModes = registeredModes;\n }\n}\n\nexport class PipelineNotFoundError extends AppError {\n public readonly pipelineMode: string;\n constructor(pipelineMode: string) {\n super('PIPELINE_NOT_FOUND', `Unknown pipeline mode: ${pipelineMode}`);\n this.pipelineMode = pipelineMode;\n }\n}\n\nexport class UnregisteredPhasesError extends AppError {\n public readonly missingPhases: string[];\n public readonly registeredPhases: string[];\n constructor(missingPhases: string[], registeredPhases: string[]) {\n super(\n 'UNREGISTERED_PHASES',\n `Pipeline defines unregistered phases: ${missingPhases.join(', ')}. Registered: ${registeredPhases.join(', ')}`,\n );\n this.missingPhases = missingPhases;\n this.registeredPhases = registeredPhases;\n }\n}\n"],"mappings":"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","names":["logger","logger","spawn","logger","SIGKILL_GRACE_MS","IDLE_CHECK_INTERVAL_MS","spawn","spawn","spawn"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ConfigGenerator,
|
|
3
3
|
PreflightChecker
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VYNKAT4P.js";
|
|
5
5
|
import {
|
|
6
6
|
DependencyChecker
|
|
7
7
|
} from "./chunk-3V3GQCB7.js";
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-ACVOOHAR.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveConfigFilePath
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-OOJNTGB5.js";
|
|
14
14
|
import {
|
|
15
15
|
analyze,
|
|
16
16
|
collectStaticInfo
|
|
@@ -172,7 +172,7 @@ var E2ESetupRunner = class {
|
|
|
172
172
|
const step = "reload";
|
|
173
173
|
yield { step, status: "running", message: "Reloading configuration..." };
|
|
174
174
|
try {
|
|
175
|
-
const { reloadConfig } = await import("./config-
|
|
175
|
+
const { reloadConfig } = await import("./config-LLOHFS6J.js");
|
|
176
176
|
reloadConfig();
|
|
177
177
|
yield { step, status: "done", message: "Configuration reloaded" };
|
|
178
178
|
} catch (err) {
|
|
@@ -468,8 +468,8 @@ function createSetupRouter(deps = {}) {
|
|
|
468
468
|
sse.write({ step: "collected", message: "Static info collected" });
|
|
469
469
|
sse.write({ step: "analyzing", message: "Running AI analysis..." });
|
|
470
470
|
try {
|
|
471
|
-
const { loadConfig } = await import("./config-
|
|
472
|
-
const { createAIRunner } = await import("./ai-runner-
|
|
471
|
+
const { loadConfig } = await import("./config-LLOHFS6J.js");
|
|
472
|
+
const { createAIRunner } = await import("./ai-runner-RUE5D72W.js");
|
|
473
473
|
const config = loadConfig();
|
|
474
474
|
const runner = createAIRunner(config.ai);
|
|
475
475
|
const knowledge = await analyze({ workDir, aiRunner: runner });
|
|
@@ -549,4 +549,4 @@ function createSetupRouter(deps = {}) {
|
|
|
549
549
|
export {
|
|
550
550
|
createSetupRouter
|
|
551
551
|
};
|
|
552
|
-
//# sourceMappingURL=chunk-
|
|
552
|
+
//# sourceMappingURL=chunk-JL6ALTPS.js.map
|