@xdevops/issue-auto-finish 1.0.60 → 1.0.62
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/AIRunner.d.ts +5 -0
- package/dist/ai-runner/AIRunner.d.ts.map +1 -1
- package/dist/ai-runner/CodebuddyAcpRunner.d.ts +23 -0
- package/dist/ai-runner/CodebuddyAcpRunner.d.ts.map +1 -0
- package/dist/ai-runner/ModelMapping.d.ts.map +1 -1
- package/dist/ai-runner/acp/AcpProtocol.d.ts +98 -0
- package/dist/ai-runner/acp/AcpProtocol.d.ts.map +1 -0
- package/dist/ai-runner/index.d.ts +2 -1
- package/dist/ai-runner/index.d.ts.map +1 -1
- package/dist/{ai-runner-V5W2MNKT.js → ai-runner-DHH74B4O.js} +5 -3
- package/dist/{analyze-66JTH5BU.js → analyze-F5DFTM2A.js} +4 -4
- package/dist/{braindump-V2H26LEJ.js → braindump-JZ2CJC2I.js} +5 -5
- package/dist/{chunk-TZLOODIV.js → chunk-4D5GYH4P.js} +5 -3
- package/dist/chunk-4D5GYH4P.js.map +1 -0
- package/dist/{chunk-GT2ORJP5.js → chunk-BXCTN44G.js} +46 -4
- package/dist/chunk-BXCTN44G.js.map +1 -0
- package/dist/chunk-DADQSKPL.js +1 -0
- package/dist/{chunk-WNKWJZ3S.js → chunk-MSZQ3T4G.js} +2 -2
- package/dist/{chunk-OXTGJ5K6.js → chunk-NKJGLRZS.js} +2 -2
- package/dist/{chunk-DLNHF36B.js → chunk-NPCR4ZNN.js} +20 -15
- package/dist/chunk-NPCR4ZNN.js.map +1 -0
- package/dist/{chunk-EC5BMIE5.js → chunk-TASSKSJ3.js} +456 -1
- package/dist/chunk-TASSKSJ3.js.map +1 -0
- package/dist/{chunk-INTPETTB.js → chunk-WBHUOIEV.js} +4 -4
- package/dist/cli.js +7 -7
- package/dist/{config-2FWA2C7M.js → config-U4BU2FHH.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/coordination/IssueClaimer.d.ts +4 -0
- package/dist/coordination/IssueClaimer.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/{init-D7WC4CM5.js → init-USNTJBIC.js} +4 -4
- package/dist/lib.js +4 -4
- package/dist/phases/BasePhase.d.ts +7 -1
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/poller/IssuePoller.d.ts.map +1 -1
- package/dist/{restart-U4XXBQX5.js → restart-RUY67743.js} +4 -4
- package/dist/run.js +7 -7
- package/dist/{start-3ISG2D4L.js → start-DPGDJHIM.js} +4 -4
- package/package.json +1 -1
- package/src/web/frontend/dist/assets/{index-CNr_jnFX.css → index-BqzWCv1L.css} +1 -1
- package/src/web/frontend/dist/assets/{index-CsJhieIu.js → index-RawqoOth.js} +3 -3
- package/src/web/frontend/dist/index.html +2 -2
- package/dist/chunk-DLNHF36B.js.map +0 -1
- package/dist/chunk-EC5BMIE5.js.map +0 -1
- package/dist/chunk-GT2ORJP5.js.map +0 -1
- package/dist/chunk-RQUJ4UEW.js +0 -1
- package/dist/chunk-TZLOODIV.js.map +0 -1
- /package/dist/{ai-runner-V5W2MNKT.js.map → ai-runner-DHH74B4O.js.map} +0 -0
- /package/dist/{analyze-66JTH5BU.js.map → analyze-F5DFTM2A.js.map} +0 -0
- /package/dist/{braindump-V2H26LEJ.js.map → braindump-JZ2CJC2I.js.map} +0 -0
- /package/dist/{chunk-RQUJ4UEW.js.map → chunk-DADQSKPL.js.map} +0 -0
- /package/dist/{chunk-WNKWJZ3S.js.map → chunk-MSZQ3T4G.js.map} +0 -0
- /package/dist/{chunk-OXTGJ5K6.js.map → chunk-NKJGLRZS.js.map} +0 -0
- /package/dist/{chunk-INTPETTB.js.map → chunk-WBHUOIEV.js.map} +0 -0
- /package/dist/{config-2FWA2C7M.js.map → config-U4BU2FHH.js.map} +0 -0
- /package/dist/{init-D7WC4CM5.js.map → init-USNTJBIC.js.map} +0 -0
- /package/dist/{restart-U4XXBQX5.js.map → restart-RUY67743.js.map} +0 -0
- /package/dist/{start-3ISG2D4L.js.map → start-DPGDJHIM.js.map} +0 -0
|
@@ -6,6 +6,10 @@ export interface StreamEvent {
|
|
|
6
6
|
content: unknown;
|
|
7
7
|
timestamp: string;
|
|
8
8
|
}
|
|
9
|
+
export interface InputRequest {
|
|
10
|
+
type: 'plan-approval' | 'generic';
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
9
13
|
export interface RunOptions {
|
|
10
14
|
prompt: string;
|
|
11
15
|
workDir: string;
|
|
@@ -15,6 +19,7 @@ export interface RunOptions {
|
|
|
15
19
|
continueSession?: boolean;
|
|
16
20
|
mode?: 'plan' | 'agent';
|
|
17
21
|
onStreamEvent?: (event: StreamEvent) => void;
|
|
22
|
+
onInputRequired?: (request: InputRequest) => Promise<string>;
|
|
18
23
|
}
|
|
19
24
|
export interface RunResult {
|
|
20
25
|
success: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIRunner.d.ts","sourceRoot":"","sources":["../../src/ai-runner/AIRunner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"AIRunner.d.ts","sourceRoot":"","sources":["../../src/ai-runner/AIRunner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC;IAChB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RunOptions, RunResult } from './AIRunner.js';
|
|
2
|
+
import { BaseAIRunner } from './BaseAIRunner.js';
|
|
3
|
+
export declare class CodebuddyAcpRunner extends BaseAIRunner {
|
|
4
|
+
private readonly binary;
|
|
5
|
+
private readonly nvmNodeVersion;
|
|
6
|
+
private readonly model?;
|
|
7
|
+
private acpActiveChildren;
|
|
8
|
+
constructor(binary: string, nvmNodeVersion: string, model?: string);
|
|
9
|
+
protected getBinary(): string;
|
|
10
|
+
protected buildArgs(_options: RunOptions): string[];
|
|
11
|
+
protected getSpawnOptions(options: RunOptions): Record<string, unknown>;
|
|
12
|
+
run(options: RunOptions): Promise<RunResult>;
|
|
13
|
+
private handleMessage;
|
|
14
|
+
private handleResponse;
|
|
15
|
+
private handleNotification;
|
|
16
|
+
private handleAgentRequest;
|
|
17
|
+
private autoApprove;
|
|
18
|
+
private mapUpdateToStreamEvent;
|
|
19
|
+
killAll(): void;
|
|
20
|
+
killByWorkDir(targetWorkDir: string): number;
|
|
21
|
+
private forceKill;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=CodebuddyAcpRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodebuddyAcpRunner.d.ts","sourceRoot":"","sources":["../../src/ai-runner/CodebuddyAcpRunner.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAe,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA4BjD,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,iBAAiB,CAAwC;gBAErD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IASlE,SAAS,CAAC,SAAS,IAAI,MAAM;IAI7B,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,EAAE;IAMnD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAWjE,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA8KlD,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,cAAc;IA6DtB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,kBAAkB;IAoD1B,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,sBAAsB;IAiD9B,OAAO,IAAI,IAAI;IAOf,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAc5C,OAAO,CAAC,SAAS;CAUlB"}
|
|
@@ -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":"AAkCA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/E"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP (Agent Client Protocol) JSON-RPC 2.0 codec.
|
|
3
|
+
*
|
|
4
|
+
* Handles line-buffered parsing of newline-delimited JSON messages from
|
|
5
|
+
* CodeBuddy's stdin/stdout ACP transport and encoding of outbound requests/responses.
|
|
6
|
+
*
|
|
7
|
+
* Protocol reference: https://agentclientprotocol.com/protocol/schema
|
|
8
|
+
*/
|
|
9
|
+
export interface AcpUpdateChunk {
|
|
10
|
+
sessionUpdate: 'agent_message_chunk';
|
|
11
|
+
content: {
|
|
12
|
+
type: 'text' | 'thinking';
|
|
13
|
+
text: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface AcpUpdateToolCall {
|
|
17
|
+
sessionUpdate: 'tool_call';
|
|
18
|
+
toolCallId: string;
|
|
19
|
+
title: string;
|
|
20
|
+
kind: string;
|
|
21
|
+
status: string;
|
|
22
|
+
content?: Array<{
|
|
23
|
+
type: string;
|
|
24
|
+
path?: string;
|
|
25
|
+
oldText?: string | null;
|
|
26
|
+
newText?: string;
|
|
27
|
+
text?: string;
|
|
28
|
+
}>;
|
|
29
|
+
rawInput?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface AcpUpdateToolCallUpdate {
|
|
32
|
+
sessionUpdate: 'tool_call_update';
|
|
33
|
+
toolCallId: string;
|
|
34
|
+
status: string;
|
|
35
|
+
}
|
|
36
|
+
export interface AcpUpdateGeneric {
|
|
37
|
+
sessionUpdate: string;
|
|
38
|
+
[key: string]: unknown;
|
|
39
|
+
}
|
|
40
|
+
export type AcpUpdatePayload = AcpUpdateChunk | AcpUpdateToolCall | AcpUpdateToolCallUpdate | AcpUpdateGeneric;
|
|
41
|
+
export interface AcpSessionUpdate {
|
|
42
|
+
jsonrpc: '2.0';
|
|
43
|
+
method: 'session/update';
|
|
44
|
+
params: {
|
|
45
|
+
sessionId: string;
|
|
46
|
+
update: AcpUpdatePayload;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export interface AcpPermissionOption {
|
|
50
|
+
optionId: string;
|
|
51
|
+
name: string;
|
|
52
|
+
kind: string;
|
|
53
|
+
}
|
|
54
|
+
export interface AcpPermissionRequest {
|
|
55
|
+
jsonrpc: '2.0';
|
|
56
|
+
id: number;
|
|
57
|
+
method: 'session/request_permission';
|
|
58
|
+
params: {
|
|
59
|
+
sessionId: string;
|
|
60
|
+
options: AcpPermissionOption[];
|
|
61
|
+
toolCall: {
|
|
62
|
+
toolCallId: string;
|
|
63
|
+
rawInput?: Record<string, unknown>;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface AcpResponse {
|
|
68
|
+
jsonrpc: '2.0';
|
|
69
|
+
id: number;
|
|
70
|
+
result: Record<string, unknown>;
|
|
71
|
+
}
|
|
72
|
+
export interface AcpError {
|
|
73
|
+
jsonrpc: '2.0';
|
|
74
|
+
id: number;
|
|
75
|
+
error: {
|
|
76
|
+
code: number;
|
|
77
|
+
message: string;
|
|
78
|
+
data?: unknown;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export type AcpInboundMessage = Record<string, unknown>;
|
|
82
|
+
export declare function isNotification(msg: AcpInboundMessage): boolean;
|
|
83
|
+
export declare function isAgentRequest(msg: AcpInboundMessage): boolean;
|
|
84
|
+
export declare function isResponse(msg: AcpInboundMessage): boolean;
|
|
85
|
+
export declare function isPermissionRequest(msg: AcpInboundMessage): msg is AcpPermissionRequest & AcpInboundMessage;
|
|
86
|
+
export declare function isSessionUpdate(msg: AcpInboundMessage): msg is AcpSessionUpdate & AcpInboundMessage;
|
|
87
|
+
export declare class AcpProtocol {
|
|
88
|
+
private lineBuffer;
|
|
89
|
+
/** Parse incoming data chunk into zero or more complete JSON-RPC messages. */
|
|
90
|
+
parseChunk(chunk: Buffer | string): AcpInboundMessage[];
|
|
91
|
+
/** Flush any remaining buffered data (e.g. on stream end). */
|
|
92
|
+
flush(): AcpInboundMessage[];
|
|
93
|
+
/** Encode a JSON-RPC request (Client → Agent). */
|
|
94
|
+
encodeRequest(method: string, params: Record<string, unknown>, id: number): string;
|
|
95
|
+
/** Encode a JSON-RPC response (Client → Agent, replying to agent request). */
|
|
96
|
+
encodeResponse(id: number, result: Record<string, unknown>): string;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=AcpProtocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpProtocol.d.ts","sourceRoot":"","sources":["../../../src/ai-runner/acp/AcpProtocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export type { AIRunner, RunOptions, RunResult, StreamEvent } from './AIRunner.js';
|
|
1
|
+
export type { AIRunner, RunOptions, RunResult, StreamEvent, InputRequest } from './AIRunner.js';
|
|
2
2
|
export { BaseAIRunner } from './BaseAIRunner.js';
|
|
3
3
|
export { ClaudeInternalRunner } from './ClaudeInternalRunner.js';
|
|
4
4
|
export { CodebuddyRunner } from './CodebuddyRunner.js';
|
|
5
|
+
export { CodebuddyAcpRunner } from './CodebuddyAcpRunner.js';
|
|
5
6
|
export { CursorAgentRunner } from './CursorAgentRunner.js';
|
|
6
7
|
export { resolveModelForRunner } from './ModelMapping.js';
|
|
7
8
|
export { createAIRunner, registerAIRunner, validateRunnerRegistry, getRegisteredRunnerModes, isRegisteredRunner, resolveRunnerMode, getDefaultBinary, getBinaryEnvKey, getRunnerCapabilities, } from './AIRunnerRegistry.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-runner/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-runner/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import "./chunk-
|
|
1
|
+
import "./chunk-DADQSKPL.js";
|
|
2
2
|
import {
|
|
3
3
|
BaseAIRunner,
|
|
4
4
|
ClaudeInternalRunner,
|
|
5
|
+
CodebuddyAcpRunner,
|
|
5
6
|
CodebuddyRunner,
|
|
6
7
|
CursorAgentRunner,
|
|
7
8
|
createAIRunner,
|
|
@@ -14,11 +15,12 @@ import {
|
|
|
14
15
|
resolveModelForRunner,
|
|
15
16
|
resolveRunnerMode,
|
|
16
17
|
validateRunnerRegistry
|
|
17
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-TASSKSJ3.js";
|
|
18
19
|
import "./chunk-GF2RRYHB.js";
|
|
19
20
|
export {
|
|
20
21
|
BaseAIRunner,
|
|
21
22
|
ClaudeInternalRunner,
|
|
23
|
+
CodebuddyAcpRunner,
|
|
22
24
|
CodebuddyRunner,
|
|
23
25
|
CursorAgentRunner,
|
|
24
26
|
createAIRunner,
|
|
@@ -32,4 +34,4 @@ export {
|
|
|
32
34
|
resolveRunnerMode,
|
|
33
35
|
validateRunnerRegistry
|
|
34
36
|
};
|
|
35
|
-
//# sourceMappingURL=ai-runner-
|
|
37
|
+
//# sourceMappingURL=ai-runner-DHH74B4O.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4D5GYH4P.js";
|
|
4
4
|
import {
|
|
5
5
|
analyze
|
|
6
6
|
} from "./chunk-B7TVVODN.js";
|
|
@@ -8,10 +8,10 @@ import {
|
|
|
8
8
|
getGlobalDir
|
|
9
9
|
} from "./chunk-TN2SYADO.js";
|
|
10
10
|
import "./chunk-DAX3FD2O.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-DADQSKPL.js";
|
|
12
12
|
import {
|
|
13
13
|
createAIRunner
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-TASSKSJ3.js";
|
|
15
15
|
import "./chunk-GF2RRYHB.js";
|
|
16
16
|
|
|
17
17
|
// src/cli/commands/analyze.ts
|
|
@@ -72,4 +72,4 @@ async function analyzeCommand(opts) {
|
|
|
72
72
|
export {
|
|
73
73
|
analyzeCommand
|
|
74
74
|
};
|
|
75
|
-
//# sourceMappingURL=analyze-
|
|
75
|
+
//# sourceMappingURL=analyze-F5DFTM2A.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
BraindumpOrchestrator,
|
|
11
11
|
BraindumpTracker
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NKJGLRZS.js";
|
|
13
13
|
import {
|
|
14
14
|
AsyncMutex,
|
|
15
15
|
GitOperations
|
|
@@ -18,14 +18,14 @@ import "./chunk-ACVOOHAR.js";
|
|
|
18
18
|
import "./chunk-MEDXZ5JM.js";
|
|
19
19
|
import {
|
|
20
20
|
loadConfig
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4D5GYH4P.js";
|
|
22
22
|
import "./chunk-B7TVVODN.js";
|
|
23
23
|
import "./chunk-TN2SYADO.js";
|
|
24
24
|
import "./chunk-DAX3FD2O.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-DADQSKPL.js";
|
|
26
26
|
import {
|
|
27
27
|
createAIRunner
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-TASSKSJ3.js";
|
|
29
29
|
import "./chunk-GF2RRYHB.js";
|
|
30
30
|
|
|
31
31
|
// src/cli/commands/braindump.ts
|
|
@@ -204,4 +204,4 @@ ${bold("\u786E\u8BA4\u6267\u884C\uFF1F")} (${green("y")}=\u786E\u8BA4 / ${red("q
|
|
|
204
204
|
export {
|
|
205
205
|
braindumpCommand
|
|
206
206
|
};
|
|
207
|
-
//# sourceMappingURL=braindump-
|
|
207
|
+
//# sourceMappingURL=braindump-JZ2CJC2I.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
getBinaryEnvKey,
|
|
6
6
|
getDefaultBinary
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-TASSKSJ3.js";
|
|
8
8
|
|
|
9
9
|
// src/config.ts
|
|
10
10
|
import { config as loadDotenv } from "dotenv";
|
|
@@ -72,6 +72,7 @@ var envSchema = z.object({
|
|
|
72
72
|
CLAUDE_BINARY: z.string().optional(),
|
|
73
73
|
CURSOR_BINARY: z.string().optional(),
|
|
74
74
|
CODEBUDDY_BINARY: z.string().optional(),
|
|
75
|
+
CODEBUDDY_ACP_AUTO_APPROVE: envBoolean("true"),
|
|
75
76
|
CLAUDE_PHASE_TIMEOUT_MS: envMs("1800000"),
|
|
76
77
|
AI_IDLE_TIMEOUT_MS: z.coerce.number().int().min(0, "AI_IDLE_TIMEOUT_MS must be >= 0 (0 to disable)").optional().default(12e5),
|
|
77
78
|
NVM_NODE_VERSION: z.string().optional().default("20"),
|
|
@@ -234,7 +235,8 @@ function transformEnvToConfig(env, dirname) {
|
|
|
234
235
|
phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS,
|
|
235
236
|
idleTimeoutMs: env.AI_IDLE_TIMEOUT_MS || void 0,
|
|
236
237
|
nvmNodeVersion: env.NVM_NODE_VERSION,
|
|
237
|
-
model: env.AI_MODEL
|
|
238
|
+
model: env.AI_MODEL,
|
|
239
|
+
codebuddyAcpAutoApprove: env.CODEBUDDY_ACP_AUTO_APPROVE
|
|
238
240
|
},
|
|
239
241
|
poll: {
|
|
240
242
|
discoveryIntervalMs: env.POLL_DISCOVERY_INTERVAL_MS,
|
|
@@ -415,4 +417,4 @@ export {
|
|
|
415
417
|
resetDotenvCache,
|
|
416
418
|
reloadConfig
|
|
417
419
|
};
|
|
418
|
-
//# sourceMappingURL=chunk-
|
|
420
|
+
//# sourceMappingURL=chunk-4D5GYH4P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/config-schema.ts","../src/utils/network.ts"],"sourcesContent":["import { config as loadDotenv } from 'dotenv';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport {\n envSchema,\n extractEnvSubset,\n transformEnvToConfig,\n ConfigValidationError,\n} from './config-schema.js';\nimport { getGlobalDir } from './paths.js';\n\nexport type {\n Config,\n AIRunnerMode,\n BrainstormAgentConfig,\n ChatAgentConfig,\n // Sub-type aliases for interface segregation\n GongfengConfig,\n ProjectConfig,\n AIConfig,\n PollConfig,\n PipelineConfig,\n ReviewConfig,\n WebConfig,\n IssueNoteSyncConfig,\n WebhookConfig,\n E2eConfig,\n PreviewConfig,\n BrainstormConfig,\n ChatConfig,\n BraindumpConfig,\n AutoUpdateConfig,\n IWikiConfig,\n KnowledgeConfig,\n DistillConfig,\n SyncConfig,\n} from './config-schema.js';\nexport { ConfigValidationError } from './config-schema.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Resolve the path to the .env configuration file.\n *\n * Priority (first match wins):\n * 1. Explicit `configPath` argument (e.g. --config CLI flag)\n * 2. `IAF_CONFIG_PATH` environment variable\n * 3. Source-mode: `.env` next to compiled output (`dist/../.env`)\n * 4. Global config written by `issue-auto-finish init` (`{IAF_HOME}/.env`)\n * 5. CWD `.env` (legacy / manual setup)\n * 6. Fallback: global path (even if it doesn't exist yet)\n *\n * `IAF_HOME` defaults to `~/.issue-auto-finish` and can be overridden via env.\n *\n * This is the **single source of truth** for .env path resolution.\n * CLI commands and route handlers should call this instead of\n * rolling their own lookup logic.\n */\nexport function resolveConfigFilePath(configPath?: string): string {\n if (configPath) return configPath;\n if (process.env.IAF_CONFIG_PATH) return process.env.IAF_CONFIG_PATH;\n\n // Source-mode: .env next to the compiled output\n const localEnv = path.resolve(__dirname, '../.env');\n if (fs.existsSync(localEnv)) return localEnv;\n\n // Global config written by `issue-auto-finish init`\n // Checked before CWD to avoid picking up unrelated project .env files\n const globalEnv = path.join(getGlobalDir(), '.env');\n if (fs.existsSync(globalEnv)) return globalEnv;\n\n // Fallback: CWD .env (legacy / manual setup)\n const cwdEnv = path.resolve(process.cwd(), '.env');\n if (fs.existsSync(cwdEnv)) return cwdEnv;\n\n return globalEnv;\n}\n\nlet _dotenvLoaded = false;\nfunction ensureDotenvLoaded(): void {\n if (_dotenvLoaded) return;\n _dotenvLoaded = true;\n loadDotenv({ path: resolveConfigFilePath() });\n}\n\nexport function loadConfig() {\n ensureDotenvLoaded();\n\n const subset = extractEnvSubset(process.env);\n const result = envSchema.safeParse(subset);\n\n if (!result.success) {\n throw new ConfigValidationError(result.error);\n }\n\n return transformEnvToConfig(result.data, __dirname);\n}\n\n/**\n * Reset dotenv cache so the next loadConfig() re-reads the .env file.\n */\nexport function resetDotenvCache(): void {\n _dotenvLoaded = false;\n}\n\n/**\n * Reload config from .env file.\n * Clears dotenv cache, removes stale IAF env vars from process.env,\n * then re-reads and re-parses everything.\n */\nexport function reloadConfig() {\n resetDotenvCache();\n // Clear process.env of IAF-related keys so dotenv can overwrite them\n const iafKeys = extractEnvSubset(process.env);\n for (const key of Object.keys(iafKeys)) {\n delete process.env[key];\n }\n return loadConfig();\n}\n","/**\n * Zod-based configuration schema and transformation layer.\n *\n * Architecture:\n * process.env → extractEnvSubset() → envSchema.safeParse() → transformEnvToConfig() → Config\n *\n * The schema is kept flat (keys = env var names) so that validation errors\n * directly reference environment variable names without extra mapping.\n */\nimport { z } from 'zod';\nimport { getDefaultBinary, getBinaryEnvKey } from './ai-runner/AIRunnerRegistry.js';\nimport { getLocalIP } from './utils/network.js';\nimport path from 'node:path';\n\n// ---------------------------------------------------------------------------\n// Reusable zod helpers\n// ---------------------------------------------------------------------------\n\n/** Boolean env var: only `'true'` (case-sensitive) is truthy. */\nfunction envBoolean(defaultValue: string = 'false') {\n return z\n .string()\n .optional()\n .default(defaultValue)\n .transform((v) => v === 'true');\n}\n\n/** Integer env var with optional min/max bounds. */\nfunction envInt(defaultValue: string, opts?: { min?: number; max?: number }) {\n let schema = z.coerce.number().int();\n if (opts?.min !== undefined) schema = schema.min(opts.min);\n if (opts?.max !== undefined) schema = schema.max(opts.max);\n return schema.optional().default(Number(defaultValue));\n}\n\n/** Port number: integer 1–65535. */\nfunction envPort(defaultValue: string) {\n return z.coerce\n .number()\n .int()\n .min(1, 'Port must be >= 1')\n .max(65535, 'Port must be <= 65535')\n .optional()\n .default(Number(defaultValue));\n}\n\n/** Millisecond duration: integer >= 1000. */\nfunction envMs(defaultValue: string) {\n return z.coerce\n .number()\n .int()\n .min(1000, 'Duration must be >= 1000ms')\n .optional()\n .default(Number(defaultValue));\n}\n\n// ---------------------------------------------------------------------------\n// Flat environment schema\n// ---------------------------------------------------------------------------\n\nexport const envSchema = z.object({\n // --- Required ---\n GONGFENG_API_URL: z.string().url('GONGFENG_API_URL must be a valid URL'),\n GONGFENG_PRIVATE_TOKEN: z.string().min(1, 'GONGFENG_PRIVATE_TOKEN is required'),\n GONGFENG_PROJECT_PATH: z.string().min(1, 'GONGFENG_PROJECT_PATH is required'),\n PROJECT_WORK_DIR: z.string().min(1, 'PROJECT_WORK_DIR is required'),\n\n // --- Paths (override auto-detected data/logs directories) ---\n DATA_DIR: z.string().optional(),\n LOGS_DIR: z.string().optional(),\n\n // --- Project ---\n GIT_ROOT_DIR: z.string().optional(),\n BASE_BRANCH: z.string().optional().default('master'),\n BRANCH_PREFIX: z.string().optional().default('feat/issue'),\n WORKTREE_BASE_DIR: z.string().optional().default(''),\n PROJECT_SUBDIR: z.string().optional().default(''),\n\n // --- AI ---\n AI_RUNNER_MODE: z\n .string()\n .optional()\n .default('claude-internal'),\n AI_MODEL: z.string().optional().default('Claude-4.6-Opus'),\n CLAUDE_BINARY: z.string().optional(),\n CURSOR_BINARY: z.string().optional(),\n CODEBUDDY_BINARY: z.string().optional(),\n CODEBUDDY_ACP_AUTO_APPROVE: envBoolean('true'),\n CLAUDE_PHASE_TIMEOUT_MS: envMs('1800000'),\n AI_IDLE_TIMEOUT_MS: z.coerce\n .number()\n .int()\n .min(0, 'AI_IDLE_TIMEOUT_MS must be >= 0 (0 to disable)')\n .optional()\n .default(1200000),\n NVM_NODE_VERSION: z.string().optional().default('20'),\n\n // --- Pipeline ---\n PIPELINE_MODE: z\n .string()\n .optional()\n .default('auto'),\n\n // --- Poll ---\n POLL_DISCOVERY_INTERVAL_MS: envMs('60000'),\n POLL_DRIVE_INTERVAL_MS: envMs('15000'),\n MAX_RETRIES: envInt('3', { min: 0, max: 100 }),\n MAX_CONCURRENT_ISSUES: envInt('3', { min: 1 }),\n\n // --- Review ---\n REVIEW_ENABLED: envBoolean('true'),\n REVIEW_AUTO_APPROVE_LABELS: z.string().optional().default(''),\n\n // --- Web ---\n WEB_ENABLED: envBoolean('true'),\n WEB_HOST: z.string().optional().default('0.0.0.0'),\n WEB_PORT: envPort('3000'),\n FRONTEND_DIST_DIR: z.string().optional(),\n\n // --- Issue Note Sync ---\n ISSUE_NOTE_SYNC_ENABLED: envBoolean('true'),\n WEB_BASE_URL: z.string().optional(),\n\n // --- Webhook ---\n WEBHOOK_ENABLED: envBoolean('false'),\n WEBHOOK_HOST: z.string().optional().default('0.0.0.0'),\n WEBHOOK_PORT: envPort('8081'),\n WEBHOOK_SECRET: z.string().optional().default(''),\n WEBHOOK_LLM_FALLBACK: envBoolean('true'),\n WEBHOOK_LLM_BINARY: z.string().optional().default('claude-internal'),\n\n // --- E2E ---\n E2E_UI_ENABLED: envBoolean('false'),\n E2E_BASE_URL: z.string().optional().default('https://localhost:8890'),\n E2E_BACKEND_URL: z.string().optional().default('http://127.0.0.1:3000'),\n E2E_AUTH_COOKIES: z.string().optional().default('[]'),\n E2E_BACKEND_PORT_BASE: envPort('4000'),\n E2E_FRONTEND_PORT_BASE: envPort('9000'),\n\n // --- Preview ---\n PREVIEW_ENABLED: envBoolean('false'),\n PREVIEW_HOST: z.string().optional().default(''),\n PREVIEW_TTL_MS: envMs(String(24 * 60 * 60 * 1000)),\n PREVIEW_KEEP_AFTER_COMPLETE: envBoolean('true'),\n\n // --- Brainstorm ---\n BRAINSTORM_ENABLED: envBoolean('false'),\n BRAINSTORM_MAX_ROUNDS: envInt('5', { min: 1, max: 20 }),\n BRAINSTORM_TIMEOUT_MS: envMs('600000'),\n BRAINSTORM_GENERATOR_MODE: z\n .string()\n .optional(),\n BRAINSTORM_GENERATOR_BINARY: z.string().optional(),\n BRAINSTORM_GENERATOR_MODEL: z.string().optional(),\n BRAINSTORM_REVIEWER_MODE: z\n .string()\n .optional(),\n BRAINSTORM_REVIEWER_BINARY: z.string().optional(),\n BRAINSTORM_REVIEWER_MODEL: z.string().optional(),\n\n // --- Chat ---\n CHAT_ENABLED: envBoolean('false'),\n CHAT_TIMEOUT_MS: envMs('300000'),\n CHAT_MAX_SESSION_MESSAGES: envInt('100', { min: 1 }),\n CHAT_AGENT_MODE: z\n .string()\n .optional(),\n CHAT_AGENT_BINARY: z.string().optional(),\n CHAT_AGENT_MODEL: z.string().optional(),\n\n // --- Braindump ---\n BRAINDUMP_ENABLED: envBoolean('false'),\n BRAINDUMP_MAX_CONCURRENT: z.coerce.number().int().min(1).optional(),\n BRAINDUMP_SPLIT_TIMEOUT_MS: envMs('300000'),\n BRAINDUMP_TASK_TIMEOUT_MS: z.coerce.number().int().min(1000).optional(),\n BRAINDUMP_MAX_CONFLICT_ATTEMPTS: envInt('20', { min: 1 }),\n BRAINDUMP_CREATE_MR: envBoolean('false'),\n\n // --- Auto Update ---\n AUTO_UPDATE_ENABLED: envBoolean('true'),\n AUTO_UPDATE_INTERVAL_MS: envMs('600000'),\n AUTO_UPDATE_REGISTRY: z\n .string()\n .url('AUTO_UPDATE_REGISTRY must be a valid URL')\n .optional()\n .default('https://registry.npmjs.org'),\n AUTO_UPDATE_DRAIN_TIMEOUT_MS: envMs('300000'),\n\n // --- iWiki ---\n IWIKI_AUTH_COOKIE: z.string().optional(),\n IWIKI_AUTH_TOKEN: z.string().optional(),\n IWIKI_BASE_URL: z.string().optional(),\n\n // --- Locale ---\n LOCALE: z.enum(['zh-CN', 'en']).optional().default('zh-CN'),\n\n // --- Knowledge ---\n KNOWLEDGE_ENABLED: envBoolean('false'),\n KNOWLEDGE_PATH: z.string().optional(),\n KNOWLEDGE_ORPHAN_BRANCH: z.string().optional().default('iaf/knowledge'),\n KNOWLEDGE_SYNC_VECTORS: envBoolean('false'),\n KNOWLEDGE_AUTO_RESTORE: envBoolean('true'),\n\n // --- Distill (知识蒸馏) ---\n DISTILL_ENABLED: envBoolean('false'),\n DISTILL_INTERVAL_MS: envMs('86400000'),\n DISTILL_DIARY_SUMMARIZE: envBoolean('false'),\n DISTILL_MIN_DIARIES_FOR_DISTILL: envInt('3', { min: 1 }),\n DISTILL_MEMORY_CONFIDENCE_THRESHOLD: z.coerce.number().min(0).max(1).optional().default(0.7),\n DISTILL_VECTOR_ENABLED: envBoolean('true'),\n\n // --- Sync (生成文件同步到目标项目) ---\n SYNC_KNOWLEDGE_TO_PROJECT: envBoolean('false'),\n SYNC_RULES_TO_PROJECT: envBoolean('false'),\n\n // --- Verify-Fix Loop (验证-修复循环) ---\n VERIFY_FIX_LOOP_ENABLED: envBoolean('true'),\n VERIFY_FIX_MAX_ITERATIONS: envInt('3', { min: 1, max: 10 }),\n VERIFY_TODOLIST_CHECK_ENABLED: envBoolean('true'),\n\n // --- Analytics (运营分析) ---\n ANALYTICS_ENABLED: envBoolean('false'),\n ANALYTICS_TARGET_API_URL: z.string().url().optional(),\n ANALYTICS_TARGET_API_TOKEN: z.string().optional(),\n ANALYTICS_CACHE_TTL_MS: envMs('300000'),\n ANALYTICS_SKILL_AUTO_DISCOVER: envBoolean('true'),\n\n // --- Coordination (多节点协调) ---\n NODE_ID: z.string().optional(),\n});\n\nexport type ParsedEnv = z.infer<typeof envSchema>;\n\n// ---------------------------------------------------------------------------\n// Extract env subset\n// ---------------------------------------------------------------------------\n\n/**\n * Picks only the keys declared in `envSchema` from the given env object.\n * Empty strings are converted to `undefined` to preserve the existing\n * \"empty = unset\" behavior.\n */\nexport function extractEnvSubset(\n env: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n const keys = Object.keys(envSchema.shape) as (keyof typeof envSchema.shape)[];\n const subset: Record<string, string | undefined> = {};\n for (const key of keys) {\n const val = env[key as string];\n subset[key as string] = val || undefined; // empty string → undefined\n }\n return subset;\n}\n\n// ---------------------------------------------------------------------------\n// AI Runner helpers\n// ---------------------------------------------------------------------------\n\nexport type AIRunnerMode = string;\n\nfunction resolveAIBinary(\n mode: AIRunnerMode,\n env: ParsedEnv,\n): string {\n const envKey = getBinaryEnvKey(mode);\n if (envKey) {\n const envVal = (env as Record<string, unknown>)[envKey];\n if (typeof envVal === 'string' && envVal) return envVal;\n }\n return getDefaultBinary(mode);\n}\n\nexport interface BrainstormAgentConfig {\n mode: AIRunnerMode;\n binary: string;\n nvmNodeVersion: string;\n model?: string;\n}\n\nexport type ChatAgentConfig = BrainstormAgentConfig;\n\nfunction buildBrainstormAgent(\n role: 'GENERATOR' | 'REVIEWER',\n env: ParsedEnv,\n): BrainstormAgentConfig {\n const roleMode =\n (role === 'GENERATOR' ? env.BRAINSTORM_GENERATOR_MODE : env.BRAINSTORM_REVIEWER_MODE) ??\n env.AI_RUNNER_MODE;\n return {\n mode: roleMode,\n binary:\n (role === 'GENERATOR' ? env.BRAINSTORM_GENERATOR_BINARY : env.BRAINSTORM_REVIEWER_BINARY) ??\n resolveAIBinary(roleMode, env),\n nvmNodeVersion: env.NVM_NODE_VERSION,\n model:\n (role === 'GENERATOR' ? env.BRAINSTORM_GENERATOR_MODEL : env.BRAINSTORM_REVIEWER_MODEL) ??\n env.AI_MODEL,\n };\n}\n\nfunction buildChatAgent(env: ParsedEnv): ChatAgentConfig {\n // Chat defaults to claude-internal for lightweight conversational use,\n // independent of the global AI_RUNNER_MODE (which may be cursor-agent).\n const chatMode = env.CHAT_AGENT_MODE ?? 'claude-internal';\n return {\n mode: chatMode,\n binary: env.CHAT_AGENT_BINARY ?? resolveAIBinary(chatMode, env),\n nvmNodeVersion: env.NVM_NODE_VERSION,\n model: env.CHAT_AGENT_MODEL ?? env.AI_MODEL,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Transform parsed env → nested Config\n// ---------------------------------------------------------------------------\n\nexport function transformEnvToConfig(env: ParsedEnv, dirname: string) {\n const aiMode = env.AI_RUNNER_MODE;\n const webPort = env.WEB_PORT;\n\n return {\n gongfeng: {\n apiUrl: env.GONGFENG_API_URL,\n privateToken: env.GONGFENG_PRIVATE_TOKEN,\n projectPath: env.GONGFENG_PROJECT_PATH,\n },\n project: {\n workDir: env.PROJECT_WORK_DIR,\n gitRootDir: env.GIT_ROOT_DIR ?? env.PROJECT_WORK_DIR,\n baseBranch: env.BASE_BRANCH,\n branchPrefix: env.BRANCH_PREFIX,\n worktreeBaseDir: env.WORKTREE_BASE_DIR,\n projectSubDir: env.PROJECT_SUBDIR,\n },\n ai: {\n mode: aiMode,\n binary: resolveAIBinary(aiMode, env),\n phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS,\n idleTimeoutMs: env.AI_IDLE_TIMEOUT_MS || undefined,\n nvmNodeVersion: env.NVM_NODE_VERSION,\n model: env.AI_MODEL,\n codebuddyAcpAutoApprove: env.CODEBUDDY_ACP_AUTO_APPROVE,\n },\n poll: {\n discoveryIntervalMs: env.POLL_DISCOVERY_INTERVAL_MS,\n driveIntervalMs: env.POLL_DRIVE_INTERVAL_MS,\n maxRetries: env.MAX_RETRIES,\n maxConcurrent: env.MAX_CONCURRENT_ISSUES,\n },\n pipeline: {\n mode: env.PIPELINE_MODE,\n },\n review: {\n enabled: env.REVIEW_ENABLED,\n autoApproveLabels: env.REVIEW_AUTO_APPROVE_LABELS\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n },\n web: {\n enabled: env.WEB_ENABLED,\n host: env.WEB_HOST,\n port: webPort,\n frontendDistDir:\n env.FRONTEND_DIST_DIR ??\n path.resolve(dirname, '..', 'src/web/frontend/dist'),\n },\n issueNoteSync: {\n enabled: env.ISSUE_NOTE_SYNC_ENABLED,\n webBaseUrl: env.WEB_BASE_URL ?? `http://${getLocalIP()}:${webPort}`,\n },\n webhook: {\n enabled: env.WEBHOOK_ENABLED,\n host: env.WEBHOOK_HOST,\n port: env.WEBHOOK_PORT,\n secret: env.WEBHOOK_SECRET,\n llmFallback: env.WEBHOOK_LLM_FALLBACK,\n llmBinary: env.WEBHOOK_LLM_BINARY,\n },\n e2e: {\n enabled: env.E2E_UI_ENABLED,\n baseUrl: env.E2E_BASE_URL,\n backendUrl: env.E2E_BACKEND_URL,\n authCookies: env.E2E_AUTH_COOKIES,\n backendPortBase: env.E2E_BACKEND_PORT_BASE,\n frontendPortBase: env.E2E_FRONTEND_PORT_BASE,\n },\n preview: {\n enabled: env.PREVIEW_ENABLED,\n host: env.PREVIEW_HOST,\n ttlMs: env.PREVIEW_TTL_MS,\n keepAfterComplete: env.PREVIEW_KEEP_AFTER_COMPLETE,\n },\n brainstorm: {\n enabled: env.BRAINSTORM_ENABLED,\n maxRefinementRounds: env.BRAINSTORM_MAX_ROUNDS,\n timeoutMs: env.BRAINSTORM_TIMEOUT_MS,\n generator: buildBrainstormAgent('GENERATOR', env),\n reviewer: buildBrainstormAgent('REVIEWER', env),\n },\n chat: {\n enabled: env.CHAT_ENABLED,\n timeoutMs: env.CHAT_TIMEOUT_MS,\n maxSessionMessages: env.CHAT_MAX_SESSION_MESSAGES,\n agent: buildChatAgent(env),\n },\n braindump: {\n enabled: env.BRAINDUMP_ENABLED,\n maxConcurrent: env.BRAINDUMP_MAX_CONCURRENT ?? env.MAX_CONCURRENT_ISSUES,\n splitTimeoutMs: env.BRAINDUMP_SPLIT_TIMEOUT_MS,\n taskTimeoutMs: env.BRAINDUMP_TASK_TIMEOUT_MS ?? env.CLAUDE_PHASE_TIMEOUT_MS,\n maxConflictAttempts: env.BRAINDUMP_MAX_CONFLICT_ATTEMPTS,\n createMr: env.BRAINDUMP_CREATE_MR,\n },\n autoUpdate: {\n enabled: env.AUTO_UPDATE_ENABLED,\n intervalMs: env.AUTO_UPDATE_INTERVAL_MS,\n registry: env.AUTO_UPDATE_REGISTRY,\n drainTimeoutMs: env.AUTO_UPDATE_DRAIN_TIMEOUT_MS,\n },\n iwiki: {\n authCookie: env.IWIKI_AUTH_COOKIE,\n authToken: env.IWIKI_AUTH_TOKEN,\n baseUrl: env.IWIKI_BASE_URL,\n },\n locale: env.LOCALE,\n knowledge: {\n enabled: env.KNOWLEDGE_ENABLED,\n path: env.KNOWLEDGE_PATH,\n orphanBranch: env.KNOWLEDGE_ORPHAN_BRANCH,\n syncVectors: env.KNOWLEDGE_SYNC_VECTORS,\n autoRestore: env.KNOWLEDGE_AUTO_RESTORE,\n },\n distill: {\n enabled: env.DISTILL_ENABLED,\n intervalMs: env.DISTILL_INTERVAL_MS,\n diarySummarize: env.DISTILL_DIARY_SUMMARIZE,\n minDiariesForDistill: env.DISTILL_MIN_DIARIES_FOR_DISTILL,\n memoryConfidenceThreshold: env.DISTILL_MEMORY_CONFIDENCE_THRESHOLD,\n vectorEnabled: env.DISTILL_VECTOR_ENABLED,\n },\n coordination: {\n nodeId: env.NODE_ID,\n },\n sync: {\n knowledgeToProject: env.SYNC_KNOWLEDGE_TO_PROJECT,\n rulesToProject: env.SYNC_RULES_TO_PROJECT,\n },\n verifyFixLoop: {\n enabled: env.VERIFY_FIX_LOOP_ENABLED,\n maxIterations: env.VERIFY_FIX_MAX_ITERATIONS,\n todolistCheckEnabled: env.VERIFY_TODOLIST_CHECK_ENABLED,\n },\n analytics: {\n enabled: env.ANALYTICS_ENABLED,\n targetApiUrl: env.ANALYTICS_TARGET_API_URL,\n targetApiToken: env.ANALYTICS_TARGET_API_TOKEN,\n cacheTtlMs: env.ANALYTICS_CACHE_TTL_MS,\n skillAutoDiscover: env.ANALYTICS_SKILL_AUTO_DISCOVER,\n },\n } as const;\n}\n\n// ---------------------------------------------------------------------------\n// Config type (derived from transform)\n// ---------------------------------------------------------------------------\n\n// We use a widened version so the type is writable and compatible with existing\n// code that assigns to Config properties.\ntype TransformResult = ReturnType<typeof transformEnvToConfig>;\n\n// Deeply writable version of the transform result\ntype DeepWritable<T> = {\n -readonly [K in keyof T]: T[K] extends object ? DeepWritable<T[K]> : T[K];\n};\n\nexport type Config = DeepWritable<TransformResult>;\n\n// ---------------------------------------------------------------------------\n// Sub-type aliases for interface segregation\n// ---------------------------------------------------------------------------\n\n/** Gongfeng API connection settings. */\nexport type GongfengConfig = Config['gongfeng'];\n/** Project / repository settings. */\nexport type ProjectConfig = Config['project'];\n/** AI runner settings. */\nexport type AIConfig = Config['ai'];\n/** Polling intervals and concurrency limits. */\nexport type PollConfig = Config['poll'];\n/** Pipeline mode settings. */\nexport type PipelineConfig = Config['pipeline'];\n/** Review / gate settings. */\nexport type ReviewConfig = Config['review'];\n/** Web dashboard settings. */\nexport type WebConfig = Config['web'];\n/** Issue note-sync settings. */\nexport type IssueNoteSyncConfig = Config['issueNoteSync'];\n/** Webhook settings. */\nexport type WebhookConfig = Config['webhook'];\n/** E2E test settings. */\nexport type E2eConfig = Config['e2e'];\n/** Preview environment settings. */\nexport type PreviewConfig = Config['preview'];\n/** Brainstorm agent settings. */\nexport type BrainstormConfig = Config['brainstorm'];\n/** Chat agent settings. */\nexport type ChatConfig = Config['chat'];\n/** Braindump batch settings. */\nexport type BraindumpConfig = Config['braindump'];\n/** Auto-update settings. */\nexport type AutoUpdateConfig = Config['autoUpdate'];\n/** iWiki settings. */\nexport type IWikiConfig = Config['iwiki'];\n/** Knowledge settings. */\nexport type KnowledgeConfig = Config['knowledge'];\n/** Distill (knowledge distillation) settings. */\nexport type DistillConfig = Config['distill'];\n/** Coordination (multi-node claiming) settings. */\nexport type CoordinationConfig = Config['coordination'];\n/** Sync (generated files sync to project) settings. */\nexport type SyncConfig = Config['sync'];\n/** Verify-fix loop settings. */\nexport type VerifyFixLoopConfig = Config['verifyFixLoop'];\n/** Analytics (operational analysis) settings. */\nexport type AnalyticsConfig = Config['analytics'];\n\n// ---------------------------------------------------------------------------\n// ConfigValidationError\n// ---------------------------------------------------------------------------\n\nexport class ConfigValidationError extends Error {\n public readonly issues: z.ZodIssue[];\n\n constructor(zodError: z.ZodError) {\n const lines = zodError.issues.map((issue) => {\n const envVar = issue.path.length > 0 ? issue.path.join('.') : '(root)';\n return ` - ${envVar}: ${issue.message}`;\n });\n super(\n `Configuration validation failed:\\n${lines.join('\\n')}`,\n );\n this.name = 'ConfigValidationError';\n this.issues = zodError.issues;\n }\n}\n","import os from 'node:os';\n\n/** 获取本机第一个非回环 IPv4 地址,无则返回 'localhost' */\nexport function getLocalIP(): string {\n const interfaces = os.networkInterfaces();\n for (const addrs of Object.values(interfaces)) {\n if (!addrs) continue;\n for (const addr of addrs) {\n if (addr.family === 'IPv4' && !addr.internal) return addr.address;\n }\n }\n return 'localhost';\n}\n\n/** 将 0.0.0.0 / 127.0.0.1 / localhost 替换为真实 IP,用于面向用户展示的 URL */\nexport function resolveDisplayHost(host: string): string {\n if (host === '0.0.0.0' || host === '127.0.0.1' || host === 'localhost') {\n return getLocalIP();\n }\n return host;\n}\n"],"mappings":"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","names":["path","path"]}
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
} from "./chunk-MEDXZ5JM.js";
|
|
26
26
|
import {
|
|
27
27
|
getLocalIP
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-4D5GYH4P.js";
|
|
29
29
|
import {
|
|
30
30
|
KNOWLEDGE_DEFAULTS
|
|
31
31
|
} from "./chunk-B7TVVODN.js";
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
createAIRunner,
|
|
44
44
|
getRunnerCapabilities,
|
|
45
45
|
isShuttingDown
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-TASSKSJ3.js";
|
|
47
47
|
import {
|
|
48
48
|
logger,
|
|
49
49
|
runWithIssueContext
|
|
@@ -1182,6 +1182,7 @@ var BasePhase = class _BasePhase {
|
|
|
1182
1182
|
const prompt = matchedRulesText ? `${basePrompt}
|
|
1183
1183
|
|
|
1184
1184
|
${t("basePhase.rulesSection", { rules: matchedRulesText })}` : basePrompt;
|
|
1185
|
+
const onInputRequired = this.buildInputRequiredHandler(displayId);
|
|
1185
1186
|
const result = await this.aiRunner.run({
|
|
1186
1187
|
prompt,
|
|
1187
1188
|
workDir: this.plan.baseDir,
|
|
@@ -1194,7 +1195,8 @@ ${t("basePhase.rulesSection", { rules: matchedRulesText })}` : basePrompt;
|
|
|
1194
1195
|
phase: this.phaseName,
|
|
1195
1196
|
event
|
|
1196
1197
|
});
|
|
1197
|
-
}
|
|
1198
|
+
},
|
|
1199
|
+
onInputRequired
|
|
1198
1200
|
});
|
|
1199
1201
|
if (!result.success) {
|
|
1200
1202
|
const failReason = (result.errorMessage || result.output).slice(0, 500);
|
|
@@ -1234,6 +1236,46 @@ ${t("basePhase.rulesSection", { rules: matchedRulesText })}` : basePrompt;
|
|
|
1234
1236
|
this.logger.warn("Hook onComment failed", { error: err.message });
|
|
1235
1237
|
}
|
|
1236
1238
|
}
|
|
1239
|
+
/**
|
|
1240
|
+
* Build an onInputRequired handler for ACP permission delegation.
|
|
1241
|
+
* Only returns a handler when codebuddyAcpAutoApprove is false,
|
|
1242
|
+
* enabling review gate delegation for permission requests.
|
|
1243
|
+
*/
|
|
1244
|
+
buildInputRequiredHandler(displayId) {
|
|
1245
|
+
if (this.config.ai.codebuddyAcpAutoApprove !== false) return void 0;
|
|
1246
|
+
return (request) => {
|
|
1247
|
+
if (request.type !== "plan-approval") {
|
|
1248
|
+
return Promise.resolve("allow");
|
|
1249
|
+
}
|
|
1250
|
+
this.logger.info("ACP plan-approval requested, delegating to review gate", {
|
|
1251
|
+
issueIid: displayId,
|
|
1252
|
+
phase: this.phaseName
|
|
1253
|
+
});
|
|
1254
|
+
eventBus.emitTyped("review:requested", { issueIid: displayId });
|
|
1255
|
+
return new Promise((resolve) => {
|
|
1256
|
+
const onApproved = (payload) => {
|
|
1257
|
+
const data = payload.data;
|
|
1258
|
+
if (data.issueIid !== displayId) return;
|
|
1259
|
+
cleanup();
|
|
1260
|
+
this.logger.info("ACP plan-approval approved via review gate", { issueIid: displayId });
|
|
1261
|
+
resolve("allow");
|
|
1262
|
+
};
|
|
1263
|
+
const onRejected = (payload) => {
|
|
1264
|
+
const data = payload.data;
|
|
1265
|
+
if (data.issueIid !== displayId) return;
|
|
1266
|
+
cleanup();
|
|
1267
|
+
this.logger.info("ACP plan-approval rejected via review gate", { issueIid: displayId });
|
|
1268
|
+
resolve("reject");
|
|
1269
|
+
};
|
|
1270
|
+
const cleanup = () => {
|
|
1271
|
+
eventBus.removeListener("review:approved", onApproved);
|
|
1272
|
+
eventBus.removeListener("review:rejected", onRejected);
|
|
1273
|
+
};
|
|
1274
|
+
eventBus.on("review:approved", onApproved);
|
|
1275
|
+
eventBus.on("review:rejected", onRejected);
|
|
1276
|
+
});
|
|
1277
|
+
};
|
|
1278
|
+
}
|
|
1237
1279
|
async resolveRules(ctx) {
|
|
1238
1280
|
try {
|
|
1239
1281
|
const rulesDir = path4.join(this.plan.baseDir, ".cursor", "rules");
|
|
@@ -3958,4 +4000,4 @@ export {
|
|
|
3958
4000
|
PipelineOrchestrator,
|
|
3959
4001
|
BrainstormService
|
|
3960
4002
|
};
|
|
3961
|
-
//# sourceMappingURL=chunk-
|
|
4003
|
+
//# sourceMappingURL=chunk-BXCTN44G.js.map
|