@xdevops/issue-auto-finish 1.0.85 → 1.0.87
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/AIRunnerRegistry-II3WWSFN.js +31 -0
- package/dist/PtyRunner-6UGI5STW.js +22 -0
- package/dist/TerminalManager-RT2N7N5R.js +8 -0
- package/dist/ai-runner/AIRunner.d.ts +9 -1
- package/dist/ai-runner/AIRunner.d.ts.map +1 -1
- package/dist/ai-runner/AIRunnerRegistry.d.ts +37 -1
- package/dist/ai-runner/AIRunnerRegistry.d.ts.map +1 -1
- package/dist/ai-runner/PtyRunner.d.ts +114 -0
- package/dist/ai-runner/PtyRunner.d.ts.map +1 -0
- package/dist/ai-runner/index.d.ts +3 -1
- package/dist/ai-runner/index.d.ts.map +1 -1
- package/dist/{ai-runner-SVUNA3FX.js → ai-runner-HLA44WI6.js} +12 -3
- package/dist/{analyze-SXXPE5XL.js → analyze-ZIXNC5GN.js} +10 -8
- package/dist/{analyze-SXXPE5XL.js.map → analyze-ZIXNC5GN.js.map} +1 -1
- package/dist/{braindump-4E5SDMSZ.js → braindump-56WAY2RD.js} +10 -8
- package/dist/{braindump-4E5SDMSZ.js.map → braindump-56WAY2RD.js.map} +1 -1
- package/dist/{chunk-JINMYD56.js → chunk-2MESXJEZ.js} +3 -3
- package/dist/{chunk-P4O4ZXEC.js → chunk-2YQHKXLL.js} +40 -19
- package/dist/chunk-2YQHKXLL.js.map +1 -0
- package/dist/chunk-AVGZH64A.js +211 -0
- package/dist/chunk-AVGZH64A.js.map +1 -0
- package/dist/{chunk-5UPYA6KH.js → chunk-IP3QTP5A.js} +1028 -763
- package/dist/chunk-IP3QTP5A.js.map +1 -0
- package/dist/chunk-KC5S66OZ.js +177 -0
- package/dist/chunk-KC5S66OZ.js.map +1 -0
- package/dist/{chunk-4QV6D34Y.js → chunk-M5C2WILQ.js} +8 -6
- package/dist/{chunk-4QV6D34Y.js.map → chunk-M5C2WILQ.js.map} +1 -1
- package/dist/{chunk-FWEW5E3B.js → chunk-NZHKAPU6.js} +35 -5
- package/dist/chunk-NZHKAPU6.js.map +1 -0
- package/dist/{chunk-KTYPZTF4.js → chunk-O3WEV5W3.js} +10 -2
- package/dist/chunk-O3WEV5W3.js.map +1 -0
- package/dist/{chunk-K2OTLYJI.js → chunk-QZZGIZWC.js} +457 -202
- package/dist/chunk-QZZGIZWC.js.map +1 -0
- package/dist/{chunk-4LFNFRCL.js → chunk-SAMTXC4A.js} +91 -214
- package/dist/chunk-SAMTXC4A.js.map +1 -0
- package/dist/chunk-U237JSLB.js +1 -0
- package/dist/chunk-U237JSLB.js.map +1 -0
- package/dist/chunk-U6GWFTKA.js +657 -0
- package/dist/chunk-U6GWFTKA.js.map +1 -0
- package/dist/{chunk-HOFYJEJ4.js → chunk-UBQLXQ7I.js} +11 -11
- package/dist/cli/setup/env-metadata.d.ts.map +1 -1
- package/dist/cli.js +8 -7
- package/dist/cli.js.map +1 -1
- package/dist/{config-QLINHCHD.js → config-WTRSZLOC.js} +4 -3
- package/dist/config-WTRSZLOC.js.map +1 -0
- package/dist/config-schema.d.ts +17 -1
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/errors/PhaseAbortedError.d.ts +3 -3
- package/dist/errors/PhaseAbortedError.d.ts.map +1 -1
- package/dist/errors-S3BWYA4I.js +43 -0
- package/dist/errors-S3BWYA4I.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -11
- package/dist/{init-TDKDC6YP.js → init-QQDXGTPB.js} +7 -6
- package/dist/{init-TDKDC6YP.js.map → init-QQDXGTPB.js.map} +1 -1
- package/dist/lib.js +9 -7
- package/dist/lib.js.map +1 -1
- package/dist/orchestrator/IssueProcessingContext.d.ts +39 -21
- package/dist/orchestrator/IssueProcessingContext.d.ts.map +1 -1
- package/dist/orchestrator/PipelineOrchestrator.d.ts +10 -1
- package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
- package/dist/orchestrator/steps/PhaseLoopStep.d.ts +1 -1
- package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
- package/dist/orchestrator/steps/SetupStep.d.ts.map +1 -1
- package/dist/persistence/PlanPersistence.d.ts +7 -1
- package/dist/persistence/PlanPersistence.d.ts.map +1 -1
- package/dist/phases/BasePhase.d.ts +31 -42
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/phases/BuildPhase.d.ts.map +1 -1
- package/dist/phases/PhaseFactory.d.ts +2 -3
- package/dist/phases/PhaseFactory.d.ts.map +1 -1
- package/dist/phases/PhaseOutcome.d.ts +42 -0
- package/dist/phases/PhaseOutcome.d.ts.map +1 -0
- package/dist/phases/PlanPhase.d.ts +1 -1
- package/dist/phases/PlanPhase.d.ts.map +1 -1
- package/dist/phases/ReleasePhase.d.ts +8 -18
- package/dist/phases/ReleasePhase.d.ts.map +1 -1
- package/dist/phases/UatPhase.d.ts +7 -24
- package/dist/phases/UatPhase.d.ts.map +1 -1
- package/dist/phases/VerifyPhase.d.ts +4 -4
- package/dist/phases/VerifyPhase.d.ts.map +1 -1
- package/dist/poller/IssuePoller.d.ts.map +1 -1
- package/dist/prompts/release-templates.d.ts.map +1 -1
- package/dist/prompts/templates.d.ts.map +1 -1
- package/dist/{restart-RNXGTDWZ.js → restart-BMILTP5X.js} +6 -5
- package/dist/{restart-RNXGTDWZ.js.map → restart-BMILTP5X.js.map} +1 -1
- package/dist/run.js +14 -11
- package/dist/run.js.map +1 -1
- package/dist/settings/ExperimentalSettings.d.ts +1 -1
- package/dist/settings/ExperimentalSettings.d.ts.map +1 -1
- package/dist/start-6QRW6IJI.js +15 -0
- package/dist/start-6QRW6IJI.js.map +1 -0
- package/dist/terminal/TerminalManager.d.ts +62 -0
- package/dist/terminal/TerminalManager.d.ts.map +1 -0
- package/dist/terminal/TerminalWebSocket.d.ts +9 -0
- package/dist/terminal/TerminalWebSocket.d.ts.map +1 -0
- package/dist/tracker/ExecutableTask.d.ts +4 -2
- package/dist/tracker/ExecutableTask.d.ts.map +1 -1
- package/dist/tracker/IssueState.d.ts +11 -1
- package/dist/tracker/IssueState.d.ts.map +1 -1
- package/dist/tracker/IssueTracker.d.ts +19 -1
- package/dist/tracker/IssueTracker.d.ts.map +1 -1
- package/dist/web/WebServer.d.ts +4 -0
- package/dist/web/WebServer.d.ts.map +1 -1
- package/dist/web/routes/terminal.d.ts +11 -0
- package/dist/web/routes/terminal.d.ts.map +1 -0
- package/dist/webhook/CommandExecutor.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/web/frontend/dist/assets/index-COYziOhv.css +1 -0
- package/src/web/frontend/dist/assets/index-D_oTMuJU.js +151 -0
- package/src/web/frontend/dist/index.html +2 -2
- package/dist/chunk-4LFNFRCL.js.map +0 -1
- package/dist/chunk-5UPYA6KH.js.map +0 -1
- package/dist/chunk-DADQSKPL.js +0 -1
- package/dist/chunk-FWEW5E3B.js.map +0 -1
- package/dist/chunk-K2OTLYJI.js.map +0 -1
- package/dist/chunk-KTYPZTF4.js.map +0 -1
- package/dist/chunk-P4O4ZXEC.js.map +0 -1
- package/dist/start-27GRO4DP.js +0 -14
- package/src/web/frontend/dist/assets/index-C4NXoH9S.js +0 -133
- package/src/web/frontend/dist/assets/index-C7lorIa0.css +0 -1
- /package/dist/{ai-runner-SVUNA3FX.js.map → AIRunnerRegistry-II3WWSFN.js.map} +0 -0
- /package/dist/{chunk-DADQSKPL.js.map → PtyRunner-6UGI5STW.js.map} +0 -0
- /package/dist/{config-QLINHCHD.js.map → TerminalManager-RT2N7N5R.js.map} +0 -0
- /package/dist/{start-27GRO4DP.js.map → ai-runner-HLA44WI6.js.map} +0 -0
- /package/dist/{chunk-JINMYD56.js.map → chunk-2MESXJEZ.js.map} +0 -0
- /package/dist/{chunk-HOFYJEJ4.js.map → chunk-UBQLXQ7I.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePhase.d.ts","sourceRoot":"","sources":["../../src/phases/BasePhase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BasePhase.d.ts","sourceRoot":"","sources":["../../src/phases/BasePhase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildPhase.d.ts","sourceRoot":"","sources":["../../src/phases/BuildPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"BuildPhase.d.ts","sourceRoot":"","sources":["../../src/phases/BuildPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKzD,qBAAa,UAAW,SAAQ,SAAS;IACvC,QAAQ,CAAC,SAAS,EAAG,OAAO,CAAU;cAEtB,mBAAmB,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BzF,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;CAmBjD"}
|
|
@@ -2,9 +2,8 @@ import type { AIRunner } from '../ai-runner/index.js';
|
|
|
2
2
|
import { GitOperations } from '../git/GitOperations.js';
|
|
3
3
|
import { PlanPersistence } from '../persistence/PlanPersistence.js';
|
|
4
4
|
import { Config } from '../config.js';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
type PhaseArgs = [AIRunner, GitOperations, PlanPersistence, Config, ActionLifecycleManager, PhaseLifecycleHooks];
|
|
5
|
+
import { BasePhase } from './BasePhase.js';
|
|
6
|
+
type PhaseArgs = [AIRunner, GitOperations, PlanPersistence, Config];
|
|
8
7
|
export type PhaseConstructor = new (...args: PhaseArgs) => BasePhase;
|
|
9
8
|
/** 注册一个阶段构造器。重复注册同一 name 会覆盖。 */
|
|
10
9
|
export declare function registerPhase(name: string, ctor: PhaseConstructor): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhaseFactory.d.ts","sourceRoot":"","sources":["../../src/phases/PhaseFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"PhaseFactory.d.ts","sourceRoot":"","sources":["../../src/phases/PhaseFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO3C,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AACpE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC;AAQrE,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAExE;AAED,4BAA4B;AAC5B,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAoBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,GAAG,SAAS,CAMvE;AAED,gDAAgD;AAChD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAKhE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { StreamEvent, InputRequest } from '../ai-runner/index.js';
|
|
2
|
+
import type { VerifyReportResult } from '../verify/index.js';
|
|
3
|
+
export type PhaseStatus = 'completed' | 'failed' | 'running';
|
|
4
|
+
/**
|
|
5
|
+
* 阶段的统一返回类型。
|
|
6
|
+
*
|
|
7
|
+
* 编排器根据 status 驱动后续流程,不关心阶段内部是同步 AI、缓存查找还是异步执行。
|
|
8
|
+
*/
|
|
9
|
+
export interface PhaseOutcome {
|
|
10
|
+
/** 执行状态 */
|
|
11
|
+
status: PhaseStatus;
|
|
12
|
+
/** AI 输出 / 摘要信息 */
|
|
13
|
+
output: string;
|
|
14
|
+
/** 会话 ID(用于下次 resume) */
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
exitCode?: number | null;
|
|
17
|
+
/** 失败详情(仅 status='failed') */
|
|
18
|
+
error?: {
|
|
19
|
+
message: string;
|
|
20
|
+
isRetryable: boolean;
|
|
21
|
+
/** 完整 AI 输出(供编排器构造 AIExecutionError) */
|
|
22
|
+
rawOutput?: string;
|
|
23
|
+
};
|
|
24
|
+
/** 异步完成句柄(仅 status='running')— 编排器 await 此 Promise 获取最终结果 */
|
|
25
|
+
awaitCompletion?: Promise<PhaseOutcome>;
|
|
26
|
+
/** 阶段特定数据 — 编排器按需读取 */
|
|
27
|
+
data?: {
|
|
28
|
+
verifyReport?: VerifyReportResult;
|
|
29
|
+
hasReleaseCapability?: boolean;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 编排器传入的回调 — 阶段通过回调与外部通信,而非直接依赖 eventBus/hooks。
|
|
35
|
+
*/
|
|
36
|
+
export interface PhaseCallbacks {
|
|
37
|
+
/** AI 输出流式推送(编排器转发到 eventBus) */
|
|
38
|
+
onStreamEvent?: (event: StreamEvent) => void;
|
|
39
|
+
/** ACP 权限委托(编排器连接到 review gate) */
|
|
40
|
+
onInputRequired?: (request: InputRequest) => Promise<string>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=PhaseOutcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseOutcome.d.ts","sourceRoot":"","sources":["../../src/phases/PhaseOutcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8BAA8B;IAC9B,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,OAAO,CAAC;QACrB,wCAAwC;QACxC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,uBAAuB;IACvB,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,kBAAkB,CAAC;QAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,mCAAmC;IACnC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanPhase.d.ts","sourceRoot":"","sources":["../../src/phases/PlanPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKzD,qBAAa,SAAU,SAAQ,SAAS;IACtC,QAAQ,CAAC,SAAS,EAAG,MAAM,CAAU;IAErC,
|
|
1
|
+
{"version":3,"file":"PlanPhase.d.ts","sourceRoot":"","sources":["../../src/phases/PlanPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKzD,qBAAa,SAAU,SAAQ,SAAS;IACtC,QAAQ,CAAC,SAAS,EAAG,MAAM,CAAU;IAErC,cAAc;;;;IAId,SAAS,CAAC,UAAU,IAAI,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpD,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;CA0BjD"}
|
|
@@ -1,38 +1,28 @@
|
|
|
1
|
-
import type { RunResult } from '../ai-runner/index.js';
|
|
2
1
|
import type { PhaseContext } from './BasePhase.js';
|
|
3
2
|
import { BasePhase } from './BasePhase.js';
|
|
3
|
+
import type { PhaseOutcome, PhaseCallbacks } from './PhaseOutcome.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*/
|
|
7
|
-
export interface ReleaseRunResult extends RunResult {
|
|
8
|
-
/** AI 检测完成后是否请求 gate 暂停(等待用户批准) */
|
|
9
|
-
gateRequested: boolean;
|
|
10
|
-
/** 检测模式下是否发现发布能力 */
|
|
11
|
-
hasReleaseCapability?: boolean;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* 发布阶段 — 单阶段双模式。
|
|
5
|
+
* 发布阶段 — 异步委托模型。
|
|
15
6
|
*
|
|
16
7
|
* 模式判定:plan 目录中是否已存在 05-release-detect.json。
|
|
17
|
-
* - 无 →
|
|
18
|
-
* - 有 →
|
|
8
|
+
* - 无 → 检测:先查全局缓存,未命中则 AI 检测
|
|
9
|
+
* - 有 → 执行:AI 读取检测结果执行发布
|
|
10
|
+
*
|
|
11
|
+
* 返回 `data.hasReleaseCapability`,编排器据此决定是否暂停等待审批。
|
|
19
12
|
*/
|
|
20
13
|
export declare class ReleasePhase extends BasePhase {
|
|
21
14
|
readonly phaseName: "release";
|
|
22
|
-
private get planDir();
|
|
23
|
-
/** 暂存当前 ctx 供 planDir getter 使用 */
|
|
24
|
-
private currentCtx?;
|
|
25
15
|
/**
|
|
26
16
|
* 检测结果是否已存在(即是否处于执行模式)。
|
|
27
17
|
*/
|
|
28
18
|
private hasDetectionResult;
|
|
29
19
|
private readDetectionFile;
|
|
30
20
|
private writeDetectionFile;
|
|
31
|
-
|
|
21
|
+
getResultFiles(_ctx?: PhaseContext): Array<{
|
|
32
22
|
filename: string;
|
|
33
23
|
label: string;
|
|
34
24
|
}>;
|
|
35
25
|
protected buildPrompt(ctx: PhaseContext): string;
|
|
36
|
-
|
|
26
|
+
run(ctx: PhaseContext, callbacks?: PhaseCallbacks): Promise<PhaseOutcome>;
|
|
37
27
|
}
|
|
38
28
|
//# sourceMappingURL=ReleasePhase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReleasePhase.d.ts","sourceRoot":"","sources":["../../src/phases/ReleasePhase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ReleasePhase.d.ts","sourceRoot":"","sources":["../../src/phases/ReleasePhase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAStE;;;;;;;;GAQG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC,QAAQ,CAAC,SAAS,EAAG,SAAS,CAAU;IAExC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,kBAAkB;IAI1B,cAAc,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAO/E,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;IAgB1C,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;CA+DhF"}
|
|
@@ -1,41 +1,24 @@
|
|
|
1
|
-
import type { RunResult } from '../ai-runner/index.js';
|
|
2
1
|
import { BasePhase, type PhaseContext } from './BasePhase.js';
|
|
2
|
+
import type { PhaseOutcome, PhaseCallbacks } from './PhaseOutcome.js';
|
|
3
3
|
/**
|
|
4
|
-
* UAT
|
|
5
|
-
*/
|
|
6
|
-
export interface UatRunResult extends RunResult {
|
|
7
|
-
/** 是否请求 gate 暂停(异步执行模式) */
|
|
8
|
-
gateRequested: boolean;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* UAT/E2E 验证阶段 — 异步双模式执行。
|
|
4
|
+
* UAT/E2E 验证阶段 — 异步委托模型。
|
|
12
5
|
*
|
|
13
6
|
* 模式判定:plan 目录中是否已存在 03-uat-report.md。
|
|
14
|
-
* -
|
|
15
|
-
* -
|
|
7
|
+
* - 有 → completed:验证产物并直接完成
|
|
8
|
+
* - 无 → running:启动异步 AI,返回 awaitCompletion Promise
|
|
16
9
|
*/
|
|
17
10
|
export declare class UatPhase extends BasePhase {
|
|
18
11
|
readonly phaseName: "uat";
|
|
19
|
-
|
|
20
|
-
protected getResultFiles(_ctx?: PhaseContext): {
|
|
12
|
+
getResultFiles(_ctx?: PhaseContext): {
|
|
21
13
|
filename: string;
|
|
22
14
|
label: string;
|
|
23
15
|
}[];
|
|
24
|
-
private get planDir();
|
|
25
16
|
/**
|
|
26
17
|
* 检查产物是否已存在且内容足够。
|
|
27
18
|
*/
|
|
28
19
|
private hasArtifact;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
* Mode 2 — 产物已就绪,验证并完成阶段。
|
|
32
|
-
*/
|
|
33
|
-
private completeWithExistingArtifact;
|
|
34
|
-
/**
|
|
35
|
-
* Mode 1 — Fire-and-forget 启动 codebuddy,请求 gate 暂停。
|
|
36
|
-
* codebuddy 的日志通过 onStreamEvent → EventBus → SSE 实时推送到前端。
|
|
37
|
-
*/
|
|
38
|
-
private launchAsyncUat;
|
|
20
|
+
run(ctx: PhaseContext, callbacks?: PhaseCallbacks): Promise<PhaseOutcome>;
|
|
21
|
+
private launchAsync;
|
|
39
22
|
protected buildPrompt(ctx: PhaseContext): string;
|
|
40
23
|
}
|
|
41
24
|
//# sourceMappingURL=UatPhase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UatPhase.d.ts","sourceRoot":"","sources":["../../src/phases/UatPhase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UatPhase.d.ts","sourceRoot":"","sources":["../../src/phases/UatPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQtE;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,QAAQ,CAAC,SAAS,EAAG,KAAK,CAAU;IAEpC,cAAc,CAAC,IAAI,CAAC,EAAE,YAAY;;;;IAIlC;;OAEG;IACH,OAAO,CAAC,WAAW;IAIb,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;YAsBjE,WAAW;IAgDzB,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;CAwCjD"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { BasePhase, PhaseContext } from './BasePhase.js';
|
|
2
|
-
import type { RunResult } from '../ai-runner/index.js';
|
|
3
2
|
import type { VerifyReportResult } from '../verify/index.js';
|
|
4
|
-
|
|
3
|
+
import type { PhaseOutcome, PhaseCallbacks } from './PhaseOutcome.js';
|
|
4
|
+
export interface VerifyRunResult {
|
|
5
5
|
verifyReport?: VerifyReportResult;
|
|
6
6
|
}
|
|
7
7
|
export declare class VerifyPhase extends BasePhase {
|
|
8
8
|
readonly phaseName: "verify";
|
|
9
9
|
private readonly reportParser;
|
|
10
|
-
|
|
10
|
+
getResultFiles(ctx?: PhaseContext): {
|
|
11
11
|
filename: string;
|
|
12
12
|
label: string;
|
|
13
13
|
}[];
|
|
14
|
-
|
|
14
|
+
run(ctx: PhaseContext, callbacks?: PhaseCallbacks): Promise<PhaseOutcome>;
|
|
15
15
|
protected buildPrompt(ctx: PhaseContext): string;
|
|
16
16
|
private readVerifyReport;
|
|
17
17
|
private readPlanFile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerifyPhase.d.ts","sourceRoot":"","sources":["../../src/phases/VerifyPhase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"VerifyPhase.d.ts","sourceRoot":"","sources":["../../src/phases/VerifyPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED,qBAAa,WAAY,SAAQ,SAAS;IACxC,QAAQ,CAAC,SAAS,EAAG,QAAQ,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IAEzD,cAAc,CAAC,GAAG,CAAC,EAAE,YAAY;;;;IAK3B,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IA2C/E,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;IAahD,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IssuePoller.d.ts","sourceRoot":"","sources":["../../src/poller/IssuePoller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"IssuePoller.d.ts","sourceRoot":"","sources":["../../src/poller/IssuePoller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAa/D,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAAQ;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAGxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,oBAAoB,EAClC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,MAAM;IAUnB,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;IAYZ,kBAAkB,IAAI,MAAM,EAAE;IAI9B,cAAc,IAAI,MAAM;IAIxB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAU5C,cAAc,IAAI,IAAI;IAKtB,eAAe,IAAI,IAAI;YAKT,QAAQ;IAgCtB,OAAO,CAAC,KAAK;IA6Cb,OAAO,CAAC,uBAAuB;YAkBjB,mBAAmB;YAiCnB,mBAAmB;YA8CnB,YAAY;IAQ1B,OAAO,CAAC,eAAe;CAoBxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-templates.d.ts","sourceRoot":"","sources":["../../src/prompts/release-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"release-templates.d.ts","sourceRoot":"","sources":["../../src/prompts/release-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAgE9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,GAAG,MAAM,CA6C/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/prompts/templates.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmC9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB,CAeA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,MAAM,CAwBzE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAUzD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAS1D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAW/D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAYrD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAWtD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAiBxF;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,KAAK,CAAC,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAKR;
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/prompts/templates.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmC9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB,CAeA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,MAAM,CAwBzE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAUzD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAS1D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAW/D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAYrD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAWtD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAiBxF;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,KAAK,CAAC,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAKR;AA2LD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAQzE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAa3F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
startCommand
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2MESXJEZ.js";
|
|
4
4
|
import {
|
|
5
5
|
stopCommand
|
|
6
6
|
} from "./chunk-WIEUIU6L.js";
|
|
@@ -8,11 +8,12 @@ import {
|
|
|
8
8
|
dim,
|
|
9
9
|
yellow
|
|
10
10
|
} from "./chunk-B7XUZJOK.js";
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-O3WEV5W3.js";
|
|
12
|
+
import "./chunk-NZHKAPU6.js";
|
|
13
13
|
import "./chunk-AKXDQH25.js";
|
|
14
14
|
import "./chunk-TN2SYADO.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-SAMTXC4A.js";
|
|
16
|
+
import "./chunk-AVGZH64A.js";
|
|
16
17
|
import "./chunk-GF2RRYHB.js";
|
|
17
18
|
|
|
18
19
|
// src/cli/commands/restart.ts
|
|
@@ -43,4 +44,4 @@ async function restartCommand(options) {
|
|
|
43
44
|
export {
|
|
44
45
|
restartCommand
|
|
45
46
|
};
|
|
46
|
-
//# sourceMappingURL=restart-
|
|
47
|
+
//# sourceMappingURL=restart-BMILTP5X.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/restart.ts"],"sourcesContent":["import { stopCommand } from './stop.js';\nimport { startCommand } from './start.js';\nimport { yellow, dim } from '../utils/format.js';\n\nexport interface RestartOptions {\n config?: string;\n host: string;\n port: number;\n daemon?: boolean;\n}\n\nexport async function restartCommand(options: RestartOptions): Promise<void> {\n // Detect PM2 environment\n if (process.env.PM2_HOME || process.env.pm_id) {\n console.log(`\\n ${yellow('PM2 detected.')} Use ${dim('pm2 restart issue-auto-finish')} instead.\\n`);\n process.exitCode = 1;\n return;\n }\n\n console.log(' Stopping service...');\n await stopCommand({\n host: options.host,\n port: options.port,\n force: false,\n });\n\n if (process.exitCode === 1) {\n // Stop failed — still try to start\n process.exitCode = undefined as unknown as number;\n console.log(' Previous stop had issues, attempting start anyway...');\n }\n\n console.log(' Starting service...');\n await startCommand({\n config: options.config,\n daemon: options.daemon,\n });\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/restart.ts"],"sourcesContent":["import { stopCommand } from './stop.js';\nimport { startCommand } from './start.js';\nimport { yellow, dim } from '../utils/format.js';\n\nexport interface RestartOptions {\n config?: string;\n host: string;\n port: number;\n daemon?: boolean;\n}\n\nexport async function restartCommand(options: RestartOptions): Promise<void> {\n // Detect PM2 environment\n if (process.env.PM2_HOME || process.env.pm_id) {\n console.log(`\\n ${yellow('PM2 detected.')} Use ${dim('pm2 restart issue-auto-finish')} instead.\\n`);\n process.exitCode = 1;\n return;\n }\n\n console.log(' Stopping service...');\n await stopCommand({\n host: options.host,\n port: options.port,\n force: false,\n });\n\n if (process.exitCode === 1) {\n // Stop failed — still try to start\n process.exitCode = undefined as unknown as number;\n console.log(' Previous stop had issues, attempting start anyway...');\n }\n\n console.log(' Starting service...');\n await startCommand({\n config: options.config,\n daemon: options.daemon,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAWA,eAAsB,eAAe,SAAwC;AAE3E,MAAI,QAAQ,IAAI,YAAY,QAAQ,IAAI,OAAO;AAC7C,YAAQ,IAAI;AAAA,IAAO,OAAO,eAAe,CAAC,QAAQ,IAAI,+BAA+B,CAAC;AAAA,CAAa;AACnG,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,UAAQ,IAAI,uBAAuB;AACnC,QAAM,YAAY;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,EACT,CAAC;AAED,MAAI,QAAQ,aAAa,GAAG;AAE1B,YAAQ,WAAW;AACnB,YAAQ,IAAI,wDAAwD;AAAA,EACtE;AAEA,UAAQ,IAAI,uBAAuB;AACnC,QAAM,aAAa;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;","names":[]}
|
package/dist/run.js
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
2
|
main
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-GXFG4JU6.js";
|
|
7
|
-
import "./chunk-KTYPZTF4.js";
|
|
3
|
+
} from "./chunk-QZZGIZWC.js";
|
|
4
|
+
import "./chunk-M5C2WILQ.js";
|
|
5
|
+
import "./chunk-UBQLXQ7I.js";
|
|
8
6
|
import "./chunk-HDFNMVRQ.js";
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-GXFG4JU6.js";
|
|
8
|
+
import "./chunk-KC5S66OZ.js";
|
|
9
|
+
import "./chunk-O3WEV5W3.js";
|
|
10
|
+
import "./chunk-IP3QTP5A.js";
|
|
11
|
+
import "./chunk-2YQHKXLL.js";
|
|
12
|
+
import "./chunk-U237JSLB.js";
|
|
13
|
+
import "./chunk-U6GWFTKA.js";
|
|
11
14
|
import "./chunk-ACVOOHAR.js";
|
|
15
|
+
import "./chunk-B7TVVODN.js";
|
|
12
16
|
import "./chunk-YCYVNRLF.js";
|
|
13
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-NZHKAPU6.js";
|
|
14
18
|
import "./chunk-AKXDQH25.js";
|
|
15
|
-
import "./chunk-B7TVVODN.js";
|
|
16
19
|
import "./chunk-TN2SYADO.js";
|
|
20
|
+
import "./chunk-SAMTXC4A.js";
|
|
21
|
+
import "./chunk-AVGZH64A.js";
|
|
17
22
|
import "./chunk-DAX3FD2O.js";
|
|
18
|
-
import "./chunk-DADQSKPL.js";
|
|
19
|
-
import "./chunk-4LFNFRCL.js";
|
|
20
23
|
import "./chunk-GF2RRYHB.js";
|
|
21
24
|
|
|
22
25
|
// src/run.ts
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/run.ts"],"sourcesContent":["import { main } from './index.js';\n\nmain().catch((err) => {\n console.error('Fatal error', (err as Error).message, (err as Error).stack);\n process.exit(1);\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/run.ts"],"sourcesContent":["import { main } from './index.js';\n\nmain().catch((err) => {\n console.error('Fatal error', (err as Error).message, (err as Error).stack);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,eAAgB,IAAc,SAAU,IAAc,KAAK;AACzE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Config } from '../config.js';
|
|
2
|
-
export type ExperimentalFeature = 'brainstorm' | 'chat' | 'braindump' | 'knowledge' | 'distill' | 'analytics';
|
|
2
|
+
export type ExperimentalFeature = 'brainstorm' | 'chat' | 'braindump' | 'knowledge' | 'distill' | 'analytics' | 'terminal';
|
|
3
3
|
export declare function getFeatureEnabled(key: ExperimentalFeature, cfg: Config): boolean;
|
|
4
4
|
export declare function setFeatureOverride(key: ExperimentalFeature, value: boolean): void;
|
|
5
5
|
//# sourceMappingURL=ExperimentalSettings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExperimentalSettings.d.ts","sourceRoot":"","sources":["../../src/settings/ExperimentalSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ExperimentalSettings.d.ts","sourceRoot":"","sources":["../../src/settings/ExperimentalSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAI3H,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAEjF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
startCommand
|
|
3
|
+
} from "./chunk-2MESXJEZ.js";
|
|
4
|
+
import "./chunk-B7XUZJOK.js";
|
|
5
|
+
import "./chunk-O3WEV5W3.js";
|
|
6
|
+
import "./chunk-NZHKAPU6.js";
|
|
7
|
+
import "./chunk-AKXDQH25.js";
|
|
8
|
+
import "./chunk-TN2SYADO.js";
|
|
9
|
+
import "./chunk-SAMTXC4A.js";
|
|
10
|
+
import "./chunk-AVGZH64A.js";
|
|
11
|
+
import "./chunk-GF2RRYHB.js";
|
|
12
|
+
export {
|
|
13
|
+
startCommand
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=start-6QRW6IJI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { IPty } from 'node-pty';
|
|
2
|
+
export interface TerminalSession {
|
|
3
|
+
id: string;
|
|
4
|
+
pty: IPty;
|
|
5
|
+
issueIid?: number;
|
|
6
|
+
workDir: string;
|
|
7
|
+
createdAt: Date;
|
|
8
|
+
lastActivityAt: Date;
|
|
9
|
+
cols: number;
|
|
10
|
+
rows: number;
|
|
11
|
+
/** true = PtyRunner 管理生命周期,WS 断开不销毁、idle check 不回收 */
|
|
12
|
+
managed: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface TerminalSessionInfo {
|
|
15
|
+
id: string;
|
|
16
|
+
issueIid?: number;
|
|
17
|
+
workDir: string;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
lastActivityAt: string;
|
|
20
|
+
cols: number;
|
|
21
|
+
rows: number;
|
|
22
|
+
pid: number;
|
|
23
|
+
}
|
|
24
|
+
export interface TerminalManagerOptions {
|
|
25
|
+
idleTimeoutMs: number;
|
|
26
|
+
maxSessions: number;
|
|
27
|
+
allowedBaseDirs: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface CreateSessionOptions {
|
|
30
|
+
workDir: string;
|
|
31
|
+
issueIid?: number;
|
|
32
|
+
cols?: number;
|
|
33
|
+
rows?: number;
|
|
34
|
+
/** PTY 执行的命令,默认 'claude' */
|
|
35
|
+
command?: string;
|
|
36
|
+
/** 命令参数,默认 [] */
|
|
37
|
+
args?: string[];
|
|
38
|
+
/** true = PtyRunner 管理生命周期 */
|
|
39
|
+
managed?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare class TerminalManager {
|
|
42
|
+
private sessions;
|
|
43
|
+
private idleCheckTimer;
|
|
44
|
+
private readonly options;
|
|
45
|
+
constructor(options: TerminalManagerOptions);
|
|
46
|
+
create(opts: CreateSessionOptions): TerminalSessionInfo;
|
|
47
|
+
get(id: string): TerminalSession | undefined;
|
|
48
|
+
list(): TerminalSessionInfo[];
|
|
49
|
+
write(id: string, data: string): void;
|
|
50
|
+
resize(id: string, cols: number, rows: number): void;
|
|
51
|
+
onData(id: string, callback: (data: string) => void): {
|
|
52
|
+
dispose: () => void;
|
|
53
|
+
};
|
|
54
|
+
onExit(id: string, callback: (exitCode: number, signal?: number) => void): void;
|
|
55
|
+
destroy(id: string): void;
|
|
56
|
+
destroyAll(): void;
|
|
57
|
+
findByWorkDir(workDir: string): TerminalSession | undefined;
|
|
58
|
+
private validateWorkDir;
|
|
59
|
+
private startIdleCheck;
|
|
60
|
+
private toInfo;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=TerminalManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalManager.d.ts","sourceRoot":"","sources":["../../src/terminal/TerminalManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAWrC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,IAAI,CAAC;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA8BD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,EAAE,sBAAsB;IAO3C,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,mBAAmB;IAyCvD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5C,IAAI,IAAI,mBAAmB,EAAE;IAI7B,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOrC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQpD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG;QAAE,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE;IAU7E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAU/E,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAYzB,UAAU,IAAI,IAAI;IAWlB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAS3D,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,MAAM;CAYf"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Server } from 'node:http';
|
|
2
|
+
import type { TerminalManager } from './TerminalManager.js';
|
|
3
|
+
export interface TerminalWebSocketOptions {
|
|
4
|
+
httpServer: Server;
|
|
5
|
+
terminalManager: TerminalManager;
|
|
6
|
+
isEnabled: () => boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function setupTerminalWebSocket(opts: TerminalWebSocketOptions): void;
|
|
9
|
+
//# sourceMappingURL=TerminalWebSocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalWebSocket.d.ts","sourceRoot":"","sources":["../../src/terminal/TerminalWebSocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAK5D,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,MAAM,OAAO,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAkH3E"}
|
|
@@ -40,12 +40,14 @@ export interface ExecutableTask {
|
|
|
40
40
|
/** 预计算的状态展示标签(由后端投影时通过 ActionLifecycleManager.resolveLabel 生成) */
|
|
41
41
|
readonly displayLabel?: string;
|
|
42
42
|
/** 阶段进度快照(由后端投影时预计算)。
|
|
43
|
-
*
|
|
43
|
+
* 各阶段按定义顺序排列,包含真实事件时间戳。
|
|
44
44
|
* 未提供时前端不渲染阶段进度列。 */
|
|
45
45
|
readonly phaseProgress?: {
|
|
46
46
|
name: string;
|
|
47
47
|
label: string;
|
|
48
|
-
status: 'pending' | 'in_progress' | 'completed' | 'failed';
|
|
48
|
+
status: 'pending' | 'in_progress' | 'completed' | 'failed' | 'gate_waiting';
|
|
49
|
+
startedAt?: string;
|
|
50
|
+
completedAt?: string;
|
|
49
51
|
}[];
|
|
50
52
|
}
|
|
51
53
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutableTask.d.ts","sourceRoot":"","sources":["../../src/tracker/ExecutableTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAGrF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,CAAC;AAEb;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC1C,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,WAAW;IACX,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,WAAW;IACX,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW;IACX,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW;IACX,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,aAAa;IACb,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,YAAY;IACZ,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;0BAEsB;IACtB,QAAQ,CAAC,aAAa,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"ExecutableTask.d.ts","sourceRoot":"","sources":["../../src/tracker/ExecutableTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAGrF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,CAAC;AAEb;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC1C,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,WAAW;IACX,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,WAAW;IACX,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW;IACX,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW;IACX,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,aAAa;IACb,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,YAAY;IACZ,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;0BAEsB;IACtB,QAAQ,CAAC,aAAa,CAAC,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;QAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,iBAAiB,CAkB3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAmBrE;AAED,mDAAmD;AACnD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAgBzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,sBAAsB,GAAG,MAAM,CAS1F;AAID,uCAAuC;AACvC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,sBAAsB,GACzB,cAAc,CAsChB;AAED,yCAAyC;AACzC,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC9C,cAAc,CAehB"}
|
|
@@ -35,6 +35,11 @@ export interface IssueLifecycle {
|
|
|
35
35
|
lastErrorRetryable?: boolean;
|
|
36
36
|
/** 中止时的阶段名(Paused 状态下有值) */
|
|
37
37
|
pausedAtPhase?: string;
|
|
38
|
+
/** 持久化处理锁,防止 poller 并发拾取同一 issue。向后兼容:旧记录无此字段 = 无锁 */
|
|
39
|
+
processingLock?: {
|
|
40
|
+
correlationId: string;
|
|
41
|
+
ts: string;
|
|
42
|
+
};
|
|
38
43
|
}
|
|
39
44
|
/** 流水线配置 */
|
|
40
45
|
export interface IssuePipeline {
|
|
@@ -73,8 +78,13 @@ export interface IssueAudit {
|
|
|
73
78
|
export interface IssueDemand {
|
|
74
79
|
demandSpec?: DemandSpec;
|
|
75
80
|
}
|
|
81
|
+
/** 阶段进度(真实事件记录,非推导) */
|
|
82
|
+
export interface IssuePhaseProgress {
|
|
83
|
+
/** 各阶段的实际进度记录,key 为阶段名 */
|
|
84
|
+
phaseProgress?: Record<string, PhaseProgress>;
|
|
85
|
+
}
|
|
76
86
|
/** 完整的 IssueRecord — 持久化格式不变 */
|
|
77
|
-
export type IssueRecord = IssueLifecycle & IssuePipeline & IssueBranch & IssueFeatureFlags & IssueDeployment & IssueResult & IssueDemand & IssueAudit;
|
|
87
|
+
export type IssueRecord = IssueLifecycle & IssuePipeline & IssueBranch & IssueFeatureFlags & IssueDeployment & IssueResult & IssueDemand & IssueAudit & IssuePhaseProgress;
|
|
78
88
|
export type PhaseStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'gate_waiting';
|
|
79
89
|
export interface PhaseProgress {
|
|
80
90
|
status: PhaseStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IssueState.d.ts","sourceRoot":"","sources":["../../src/tracker/IssueState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,aAAa,mBAAmB;IAEhC,mCAAmC;IACnC,YAAY,kBAAkB;IAC9B,oCAAoC;IACpC,SAAS,eAAe;IACxB,qCAAqC;IACrC,YAAY,kBAAkB;IAC9B,qCAAqC;IACrC,aAAa,mBAAmB;IAEhC,iBAAiB,uBAAuB;IACxC,2CAA2C;IAC3C,MAAM,WAAW;IAEjB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,iCAAiC;AACjC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"IssueState.d.ts","sourceRoot":"","sources":["../../src/tracker/IssueState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IssueRecord, IssueState } from './IssueState.js';
|
|
1
|
+
import { IssueRecord, IssueState, type PhaseProgress } from './IssueState.js';
|
|
2
2
|
import { type PipelineDef } from '../pipeline/PipelineDefinition.js';
|
|
3
3
|
import { ActionLifecycleManager } from '../lifecycle/ActionLifecycleManager.js';
|
|
4
4
|
import { BaseTracker } from './BaseTracker.js';
|
|
@@ -21,9 +21,27 @@ export declare class IssueTracker extends BaseTracker<IssueRecord> {
|
|
|
21
21
|
get(issueIid: number): IssueRecord | undefined;
|
|
22
22
|
create(record: Omit<IssueRecord, 'createdAt' | 'updatedAt' | 'attempts'>): IssueRecord;
|
|
23
23
|
updateState(issueIid: number, state: IssueState, extra?: Partial<IssueRecord>): void;
|
|
24
|
+
/** 初始化阶段进度(流水线启动时调用) */
|
|
25
|
+
initPhaseProgress(issueIid: number, def: PipelineDef): void;
|
|
26
|
+
/** 更新单个阶段的进度(原子保存 + SSE 推送) */
|
|
27
|
+
updatePhaseProgress(issueIid: number, phase: string, update: Partial<PhaseProgress>): void;
|
|
24
28
|
markFailed(issueIid: number, error: string, failedAtState: IssueState, isRetryable?: boolean): void;
|
|
25
29
|
pauseIssue(issueIid: number, currentPhase: string): void;
|
|
26
30
|
resumeFromPause(issueIid: number, def: PipelineDef, clearSession: boolean): boolean;
|
|
31
|
+
/** 持久化锁超时阈值(默认 30 分钟,与 PHASE_TIMEOUT 一致) */
|
|
32
|
+
private static readonly LOCK_TIMEOUT_MS;
|
|
33
|
+
/**
|
|
34
|
+
* 获取持久化处理锁。
|
|
35
|
+
* - 无锁或超时锁 → 写入并返回 true
|
|
36
|
+
* - 有未超时锁(其他 correlationId)→ 返回 false
|
|
37
|
+
*/
|
|
38
|
+
acquireProcessingLock(issueIid: number, correlationId: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 释放持久化处理锁。仅当 correlationId 匹配时才清除,防止旧协程误释放新锁。
|
|
41
|
+
*/
|
|
42
|
+
releaseProcessingLock(issueIid: number, correlationId: string): void;
|
|
43
|
+
/** 强制清除持久化处理锁(管理员操作:restart/cancel/retryFromPhase) */
|
|
44
|
+
clearProcessingLock(issueIid: number): void;
|
|
27
45
|
isProcessing(issueIid: number): boolean;
|
|
28
46
|
isCompleted(issueIid: number): boolean;
|
|
29
47
|
canRetry(issueIid: number, maxRetries: number): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IssueTracker.d.ts","sourceRoot":"","sources":["../../src/tracker/IssueTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"IssueTracker.d.ts","sourceRoot":"","sources":["../../src/tracker/IssueTracker.ts"],"names":[],"mappings":"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"}
|