@xdevops/issue-auto-finish 1.0.90 → 1.0.92
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/{chunk-TDKTI363.js → chunk-2WDVTLVF.js} +1 -1
- package/dist/{chunk-Y62E72TA.js → chunk-6T7ZHAV2.js} +2 -2
- package/dist/{chunk-IWSMQXBL.js → chunk-WZGEYHCC.js} +1300 -600
- package/dist/chunk-WZGEYHCC.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/hooks/HookEventWatcher.d.ts +34 -0
- package/dist/hooks/HookEventWatcher.d.ts.map +1 -0
- package/dist/hooks/HookInjector.d.ts +85 -0
- package/dist/hooks/HookInjector.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/index.js +2 -2
- package/dist/lib.js +1 -1
- package/dist/lifecycle/DefaultLifecycleHook.d.ts +21 -0
- package/dist/lifecycle/DefaultLifecycleHook.d.ts.map +1 -0
- package/dist/lifecycle/FeedbackTypes.d.ts +52 -0
- package/dist/lifecycle/FeedbackTypes.d.ts.map +1 -0
- package/dist/lifecycle/PhaseLifecycleHook.d.ts +70 -0
- package/dist/lifecycle/PhaseLifecycleHook.d.ts.map +1 -0
- package/dist/lifecycle/PhaseMiddleware.d.ts +47 -0
- package/dist/lifecycle/PhaseMiddleware.d.ts.map +1 -0
- package/dist/lifecycle/PhaseStateMachine.d.ts +111 -0
- package/dist/lifecycle/PhaseStateMachine.d.ts.map +1 -0
- package/dist/lifecycle/index.d.ts +8 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/orchestrator/steps/PhaseHelpers.d.ts +24 -0
- package/dist/orchestrator/steps/PhaseHelpers.d.ts.map +1 -0
- package/dist/orchestrator/steps/PhaseLoopStep.d.ts +10 -0
- package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
- package/dist/orchestrator/steps/SetupStep.d.ts.map +1 -1
- package/dist/orchestrator/strategies/AiPhaseStrategy.d.ts +17 -0
- package/dist/orchestrator/strategies/AiPhaseStrategy.d.ts.map +1 -0
- package/dist/orchestrator/strategies/GateStrategy.d.ts +15 -0
- package/dist/orchestrator/strategies/GateStrategy.d.ts.map +1 -0
- package/dist/orchestrator/strategies/PhaseStrategy.d.ts +16 -0
- package/dist/orchestrator/strategies/PhaseStrategy.d.ts.map +1 -0
- package/dist/orchestrator/strategies/VerifyFixStrategy.d.ts +15 -0
- package/dist/orchestrator/strategies/VerifyFixStrategy.d.ts.map +1 -0
- package/dist/orchestrator/strategies/index.d.ts +17 -0
- package/dist/orchestrator/strategies/index.d.ts.map +1 -0
- package/dist/phases/BasePhase.d.ts +2 -0
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/{restart-2BCP6AMK.js → restart-5D3ZDD5L.js} +2 -2
- package/dist/run.js +2 -2
- package/dist/{start-ECUOKGM2.js → start-IQBNXLEI.js} +2 -2
- package/package.json +1 -1
- package/src/web/frontend/dist/assets/{index-Dby4j-V_.js → index-BR0UoQER.js} +2 -2
- package/src/web/frontend/dist/index.html +1 -1
- package/dist/chunk-IWSMQXBL.js.map +0 -1
- /package/dist/{chunk-TDKTI363.js.map → chunk-2WDVTLVF.js.map} +0 -0
- /package/dist/{chunk-Y62E72TA.js.map → chunk-6T7ZHAV2.js.map} +0 -0
- /package/dist/{restart-2BCP6AMK.js.map → restart-5D3ZDD5L.js.map} +0 -0
- /package/dist/{start-ECUOKGM2.js.map → start-IQBNXLEI.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -93,7 +93,7 @@ program.command("init").description("Launch the interactive web setup wizard").o
|
|
|
93
93
|
await initCommand({ port: parseInt(opts.port, 10), config: opts.config });
|
|
94
94
|
});
|
|
95
95
|
program.command("start").description("Start the issue-auto-finish daemon service").option("-c, --config <path>", "Path to .env config file").option("-d, --daemon", "Run as a background daemon").action(async (opts) => {
|
|
96
|
-
const { startCommand } = await import("./start-
|
|
96
|
+
const { startCommand } = await import("./start-IQBNXLEI.js");
|
|
97
97
|
await startCommand({ config: opts.config, daemon: opts.daemon });
|
|
98
98
|
});
|
|
99
99
|
program.command("stop").description("Stop the running service").option("-p, --port <port>", "Web UI port", defaults.port).option("-H, --host <host>", "Service host", defaults.host).option("-f, --force", "Force kill via SIGKILL").action(async (opts) => {
|
|
@@ -105,7 +105,7 @@ program.command("stop").description("Stop the running service").option("-p, --po
|
|
|
105
105
|
});
|
|
106
106
|
});
|
|
107
107
|
program.command("restart").description("Restart the service (stop + start)").option("-c, --config <path>", "Path to .env config file").option("-p, --port <port>", "Web UI port", defaults.port).option("-H, --host <host>", "Service host", defaults.host).option("-d, --daemon", "Restart as a background daemon").action(async (opts) => {
|
|
108
|
-
const { restartCommand } = await import("./restart-
|
|
108
|
+
const { restartCommand } = await import("./restart-5D3ZDD5L.js");
|
|
109
109
|
await restartCommand({
|
|
110
110
|
config: opts.config,
|
|
111
111
|
host: opts.host,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { HookEvent } from './HookInjector.js';
|
|
2
|
+
export interface Disposable {
|
|
3
|
+
dispose(): void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* 监听 hook 事件文件(JSONL),解析新增行并回调。
|
|
7
|
+
*
|
|
8
|
+
* 使用 fs.watch + 文件偏移量追踪实现增量读取。
|
|
9
|
+
* 当 fs.watch 不可靠时(某些网络文件系统),通过定期 poll 兜底。
|
|
10
|
+
*/
|
|
11
|
+
export declare class HookEventWatcher {
|
|
12
|
+
private readonly eventsFile;
|
|
13
|
+
private watcher;
|
|
14
|
+
private pollTimer;
|
|
15
|
+
private offset;
|
|
16
|
+
private listeners;
|
|
17
|
+
private started;
|
|
18
|
+
constructor(eventsFile: string);
|
|
19
|
+
start(): void;
|
|
20
|
+
stop(): void;
|
|
21
|
+
onEvent(callback: (event: HookEvent) => void): Disposable;
|
|
22
|
+
/**
|
|
23
|
+
* 等待指定类型的事件,带超时。
|
|
24
|
+
* 对于 'stop' 事件,只有 blocked=false 时才 resolve。
|
|
25
|
+
*/
|
|
26
|
+
waitForEvent(eventType: HookEvent['event'], timeoutMs: number): Promise<HookEvent>;
|
|
27
|
+
/** 获取已记录的所有产物写入事件摘要 */
|
|
28
|
+
getArtifactSummary(): string;
|
|
29
|
+
private readNewEvents;
|
|
30
|
+
private readAll;
|
|
31
|
+
private emit;
|
|
32
|
+
private getCurrentSize;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=HookEventWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HookEventWatcher.d.ts","sourceRoot":"","sources":["../../src/hooks/HookEventWatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnD,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,OAAO,CAAS;gBAEZ,UAAU,EAAE,MAAM;IAI9B,KAAK,IAAI,IAAI;IAeb,IAAI,IAAI,IAAI;IAYZ,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,UAAU;IASzD;;;OAGG;IACH,YAAY,CACV,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC;IAiBrB,uBAAuB;IACvB,kBAAkB,IAAI,MAAM;IAY5B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export interface HookContext {
|
|
2
|
+
workDir: string;
|
|
3
|
+
planDir: string;
|
|
4
|
+
/** All pipeline artifacts (used by PostToolUse to track writes across phases). */
|
|
5
|
+
expectedArtifacts: string[];
|
|
6
|
+
/** Current phase artifacts only (used by Stop hook to gate completion). Falls back to expectedArtifacts if omitted. */
|
|
7
|
+
phaseExpectedArtifacts?: string[];
|
|
8
|
+
issueIid: number;
|
|
9
|
+
phaseName?: string;
|
|
10
|
+
issueTitle?: string;
|
|
11
|
+
issueDescription?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ArtifactEntry {
|
|
14
|
+
ts: string;
|
|
15
|
+
file: string;
|
|
16
|
+
path: string;
|
|
17
|
+
bytes: number;
|
|
18
|
+
event: 'write';
|
|
19
|
+
}
|
|
20
|
+
export interface StopEntry {
|
|
21
|
+
ts: string;
|
|
22
|
+
event: 'stop';
|
|
23
|
+
blocked: boolean;
|
|
24
|
+
missing?: string;
|
|
25
|
+
}
|
|
26
|
+
export type ManifestEntry = ArtifactEntry | StopEntry;
|
|
27
|
+
/**
|
|
28
|
+
* 在 worktree 中动态注入 Claude Code hooks。
|
|
29
|
+
*
|
|
30
|
+
* 在 SetupStep 中调用 inject(),生成:
|
|
31
|
+
* - {workDir}/.claude/settings.local.json(合并已有 permissions + 追加 hooks)
|
|
32
|
+
* - {workDir}/.claude-plan/.hooks/*.sh(hook 脚本,上下文以绝对路径嵌入)
|
|
33
|
+
* - {workDir}/.claude-plan/.hook-context.json(阶段上下文,供 compact restore 读取)
|
|
34
|
+
*
|
|
35
|
+
* Claude Code PTY 启动后自动加载 settings.local.json 中的 hooks。
|
|
36
|
+
*/
|
|
37
|
+
export declare class HookInjector {
|
|
38
|
+
inject(ctx: HookContext): void;
|
|
39
|
+
/**
|
|
40
|
+
* 阶段切换时更新 hooks 配置(重写脚本 + settings.local.json)。
|
|
41
|
+
* 保留 events/manifest 文件(不截断),仅更新脚本和配置。
|
|
42
|
+
*/
|
|
43
|
+
updateForPhase(ctx: HookContext): void;
|
|
44
|
+
readManifest(workDir: string): ManifestEntry[];
|
|
45
|
+
readEvents(workDir: string): HookEvent[];
|
|
46
|
+
getEventsFilePath(workDir: string): string;
|
|
47
|
+
getManifestFilePath(workDir: string): string;
|
|
48
|
+
cleanup(workDir: string): void;
|
|
49
|
+
private writeHookScripts;
|
|
50
|
+
private writeContextFile;
|
|
51
|
+
private writeSettingsLocal;
|
|
52
|
+
private initEventsFile;
|
|
53
|
+
}
|
|
54
|
+
export type HookEvent = {
|
|
55
|
+
ts: string;
|
|
56
|
+
event: 'session_start';
|
|
57
|
+
session_id: string;
|
|
58
|
+
} | {
|
|
59
|
+
ts: string;
|
|
60
|
+
event: 'compact_restore';
|
|
61
|
+
} | {
|
|
62
|
+
ts: string;
|
|
63
|
+
event: 'artifact_write';
|
|
64
|
+
file: string;
|
|
65
|
+
path: string;
|
|
66
|
+
bytes: number;
|
|
67
|
+
} | {
|
|
68
|
+
ts: string;
|
|
69
|
+
event: 'permission_request';
|
|
70
|
+
tool: string;
|
|
71
|
+
} | {
|
|
72
|
+
ts: string;
|
|
73
|
+
event: 'exit_plan_mode';
|
|
74
|
+
} | {
|
|
75
|
+
ts: string;
|
|
76
|
+
event: 'protect_blocked';
|
|
77
|
+
tool: string;
|
|
78
|
+
file: string;
|
|
79
|
+
} | {
|
|
80
|
+
ts: string;
|
|
81
|
+
event: 'stop';
|
|
82
|
+
blocked: boolean;
|
|
83
|
+
missing?: string;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=HookInjector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HookInjector.d.ts","sourceRoot":"","sources":["../../src/hooks/HookInjector.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,uHAAuH;IACvH,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,SAAS,CAAC;AAEtD;;;;;;;;;GASG;AACH,qBAAa,YAAY;IACvB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAa9B;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAWtC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;IAK9C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE;IAKxC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI1C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI5C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAe9B,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,cAAc;CAMvB;AAMD,MAAM,MAAM,SAAS,GACjB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GACxC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
main
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6T7ZHAV2.js";
|
|
4
4
|
import "./chunk-5M5SB6ZA.js";
|
|
5
5
|
import "./chunk-ENF24C44.js";
|
|
6
6
|
import "./chunk-Z3OBKODV.js";
|
|
7
7
|
import "./chunk-EU4XFZ2T.js";
|
|
8
8
|
import "./chunk-KC5S66OZ.js";
|
|
9
9
|
import "./chunk-SEO57UYI.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-WZGEYHCC.js";
|
|
11
11
|
import "./chunk-GPZX4DSY.js";
|
|
12
12
|
import "./chunk-MSL7ROVK.js";
|
|
13
13
|
import "./chunk-4XMYOXGZ.js";
|
package/dist/lib.js
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { StreamEvent } from '../ai-runner/AIRunner.js';
|
|
2
|
+
import type { PhaseOutcome } from '../phases/PhaseOutcome.js';
|
|
3
|
+
import type { PhaseLifecycleHook, PhaseExecutionContext } from './PhaseLifecycleHook.js';
|
|
4
|
+
import type { PhaseFeedback, FeedbackResponse, PhaseError, ErrorDecision } from './FeedbackTypes.js';
|
|
5
|
+
export declare class DefaultLifecycleHook implements PhaseLifecycleHook {
|
|
6
|
+
beforePhase(ctx: PhaseExecutionContext): Promise<void>;
|
|
7
|
+
onStream(ctx: PhaseExecutionContext, event: StreamEvent): void;
|
|
8
|
+
beforeExecute?: undefined;
|
|
9
|
+
afterExecute?: undefined;
|
|
10
|
+
onFeedback(ctx: PhaseExecutionContext, feedback: PhaseFeedback): Promise<FeedbackResponse>;
|
|
11
|
+
afterPhase(ctx: PhaseExecutionContext, outcome: PhaseOutcome): Promise<void>;
|
|
12
|
+
onError(ctx: PhaseExecutionContext, error: PhaseError): Promise<ErrorDecision>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 从 PhaseLifecycleHook 创建 PhaseCallbacks(供 BasePhase.run() 使用)。
|
|
16
|
+
*
|
|
17
|
+
* 将标准化的 hook 接口适配为 BasePhase 期望的旧式回调,
|
|
18
|
+
* 实现了 PhaseFeedback/FeedbackResponse ↔ InputRequest/string 的双向转换。
|
|
19
|
+
*/
|
|
20
|
+
export declare function createCallbacksFromHook(hook: PhaseLifecycleHook, ctx: PhaseExecutionContext): import('../phases/PhaseOutcome.js').PhaseCallbacks;
|
|
21
|
+
//# sourceMappingURL=DefaultLifecycleHook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultLifecycleHook.d.ts","sourceRoot":"","sources":["../../src/lifecycle/DefaultLifecycleHook.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAgBrG,qBAAa,oBAAqB,YAAW,kBAAkB;IACvD,WAAW,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5D,QAAQ,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAS9D,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,YAAY,CAAC,EAAE,SAAS,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwB1F,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5E,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;CAmBrF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,qBAAqB,GACzB,OAAO,2BAA2B,EAAE,cAAc,CAapD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { DialogOption, InputRequest } from '../ai-runner/AIRunner.js';
|
|
2
|
+
export type PhaseFeedback = InteractiveDialogFeedback | ApprovalRequiredFeedback | PermissionRequestFeedback | GenericFeedback;
|
|
3
|
+
export interface InteractiveDialogFeedback {
|
|
4
|
+
kind: 'interactive-dialog';
|
|
5
|
+
question: string;
|
|
6
|
+
options: DialogOption[];
|
|
7
|
+
}
|
|
8
|
+
export interface ApprovalRequiredFeedback {
|
|
9
|
+
kind: 'approval-required';
|
|
10
|
+
scope: 'plan' | 'release' | 'uat';
|
|
11
|
+
}
|
|
12
|
+
export interface PermissionRequestFeedback {
|
|
13
|
+
kind: 'permission-request';
|
|
14
|
+
tool: string;
|
|
15
|
+
detail: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface GenericFeedback {
|
|
18
|
+
kind: 'generic';
|
|
19
|
+
content: string;
|
|
20
|
+
}
|
|
21
|
+
export type FeedbackResponse = {
|
|
22
|
+
action: 'approve';
|
|
23
|
+
} | {
|
|
24
|
+
action: 'reject';
|
|
25
|
+
reason?: string;
|
|
26
|
+
} | {
|
|
27
|
+
action: 'select';
|
|
28
|
+
value: string;
|
|
29
|
+
} | {
|
|
30
|
+
action: 'dismiss';
|
|
31
|
+
} | {
|
|
32
|
+
action: 'pause';
|
|
33
|
+
};
|
|
34
|
+
export type ErrorDecision = {
|
|
35
|
+
action: 'fail';
|
|
36
|
+
softFail: boolean;
|
|
37
|
+
} | {
|
|
38
|
+
action: 'retry';
|
|
39
|
+
} | {
|
|
40
|
+
action: 'skip';
|
|
41
|
+
};
|
|
42
|
+
export interface PhaseError {
|
|
43
|
+
message: string;
|
|
44
|
+
isRetryable: boolean;
|
|
45
|
+
rawOutput: string;
|
|
46
|
+
wasActiveAtTimeout: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare function inputRequestToFeedback(request: InputRequest): PhaseFeedback;
|
|
49
|
+
export declare function feedbackToInputRequest(feedback: PhaseFeedback): InputRequest;
|
|
50
|
+
export declare function feedbackResponseToString(response: FeedbackResponse): string;
|
|
51
|
+
export declare function stringToFeedbackResponse(str: string, originalFeedback: PhaseFeedback): FeedbackResponse;
|
|
52
|
+
//# sourceMappingURL=FeedbackTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackTypes.d.ts","sourceRoot":"","sources":["../../src/lifecycle/FeedbackTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI3E,MAAM,MAAM,aAAa,GACrB,yBAAyB,GACzB,wBAAwB,GACxB,yBAAyB,GACzB,eAAe,CAAC;AAEpB,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAIxB,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAID,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAa3E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY,CAW5E;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAQ3E;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,GAAG,gBAAgB,CASvG"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { PhaseSpec } from '../pipeline/PipelineDefinition.js';
|
|
2
|
+
import type { GitOperations } from '../git/GitOperations.js';
|
|
3
|
+
import type { PlanPersistence } from '../persistence/PlanPersistence.js';
|
|
4
|
+
import type { StreamEvent } from '../ai-runner/AIRunner.js';
|
|
5
|
+
import type { BasePhase } from '../phases/BasePhase.js';
|
|
6
|
+
import type { PhaseOutcome } from '../phases/PhaseOutcome.js';
|
|
7
|
+
import type { IssueProcessingContext, OrchestratorDeps } from '../orchestrator/IssueProcessingContext.js';
|
|
8
|
+
import type { PhaseFeedback, FeedbackResponse, PhaseError, ErrorDecision } from './FeedbackTypes.js';
|
|
9
|
+
/**
|
|
10
|
+
* 阶段执行上下文 — 在 hook 方法之间共享的完整上下文。
|
|
11
|
+
*
|
|
12
|
+
* 由编排器在执行阶段前构造,包含当前阶段所需的所有依赖和状态。
|
|
13
|
+
*/
|
|
14
|
+
export interface PhaseExecutionContext {
|
|
15
|
+
/** 当前阶段规格 */
|
|
16
|
+
spec: PhaseSpec;
|
|
17
|
+
/** Issue 处理上下文(贯穿整个 pipeline) */
|
|
18
|
+
issueCtx: IssueProcessingContext;
|
|
19
|
+
/** 编排器依赖包 */
|
|
20
|
+
deps: OrchestratorDeps;
|
|
21
|
+
/** Worktree Git 操作 */
|
|
22
|
+
wtGit: GitOperations;
|
|
23
|
+
/** 计划文件持久化 */
|
|
24
|
+
wtPlan: PlanPersistence;
|
|
25
|
+
/** 多仓库 Git 操作映射(repo name → GitOperations) */
|
|
26
|
+
wtGitMap?: Map<string, GitOperations>;
|
|
27
|
+
/** 阶段实例(由策略或调用方创建后注入) */
|
|
28
|
+
phase?: BasePhase;
|
|
29
|
+
/** 便捷字段:issue.iid */
|
|
30
|
+
displayId: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 阶段生命周期 Hook — 标准化每个阶段的处理流程。
|
|
34
|
+
*
|
|
35
|
+
* 每个阶段的执行遵循统一生命周期:
|
|
36
|
+
*
|
|
37
|
+
* ```
|
|
38
|
+
* beforePhase → [beforeExecute] → Execute → [onStream/onFeedback]* → [afterExecute] → afterPhase
|
|
39
|
+
* ↘ onError
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* 实现此接口即可注入自定义的前置/后置/反馈处理逻辑,
|
|
43
|
+
* 而无需修改阶段或编排器的核心代码。
|
|
44
|
+
*/
|
|
45
|
+
export interface PhaseLifecycleHook {
|
|
46
|
+
/** 阶段开始前 — 更新状态、注入 hooks、准备上下文 */
|
|
47
|
+
beforePhase(ctx: PhaseExecutionContext): Promise<void>;
|
|
48
|
+
/** AI 开始执行前 — 最后一次修改 prompt/options 的机会 */
|
|
49
|
+
beforeExecute?(ctx: PhaseExecutionContext): Promise<void>;
|
|
50
|
+
/** 收到中间反馈(agent 提问、权限请求等) — 返回决策 */
|
|
51
|
+
onFeedback?(ctx: PhaseExecutionContext, feedback: PhaseFeedback): Promise<FeedbackResponse>;
|
|
52
|
+
/** 收到流式输出 — 转发到 SSE/日志等 */
|
|
53
|
+
onStream?(ctx: PhaseExecutionContext, event: StreamEvent): void;
|
|
54
|
+
/** AI 执行完成后,结果待校验前 — 可注入自定义验证逻辑 */
|
|
55
|
+
afterExecute?(ctx: PhaseExecutionContext, outcome: PhaseOutcome): Promise<PhaseOutcome>;
|
|
56
|
+
/** 阶段成功完成 — 提交产物、发评论、推送事件 */
|
|
57
|
+
afterPhase(ctx: PhaseExecutionContext, outcome: PhaseOutcome): Promise<void>;
|
|
58
|
+
/** 阶段失败 — 标记状态、决定重试策略 */
|
|
59
|
+
onError(ctx: PhaseExecutionContext, error: PhaseError): Promise<ErrorDecision>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 策略执行结果 — 策略返回此类型以指示流水线是否应暂停。
|
|
63
|
+
*/
|
|
64
|
+
export interface PhaseStepResult {
|
|
65
|
+
/** 流水线应暂停(gate 等待、异步阶段等) */
|
|
66
|
+
paused: boolean;
|
|
67
|
+
/** 预览服务器是否在此阶段启动 */
|
|
68
|
+
serversStarted?: boolean;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=PhaseLifecycleHook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseLifecycleHook.d.ts","sourceRoot":"","sources":["../../src/lifecycle/PhaseLifecycleHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErG;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,aAAa;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,sBAAsB;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,cAAc;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,yBAAyB;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,WAAW,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD,2CAA2C;IAC3C,aAAa,CAAC,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,oCAAoC;IACpC,UAAU,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE5F,2BAA2B;IAC3B,QAAQ,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAEhE,mCAAmC;IACnC,YAAY,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAExF,6BAA6B;IAC7B,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7E,yBAAyB;IACzB,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAChF;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 阶段 Middleware 链 — 类似 Koa/Express middleware 的洋葱模型。
|
|
3
|
+
*
|
|
4
|
+
* 每个 middleware 可以在执行前后注入逻辑(日志、metrics、审计等),
|
|
5
|
+
* 核心 AI 执行始终在最内层。middleware 可自由组合和排序。
|
|
6
|
+
*
|
|
7
|
+
* ```
|
|
8
|
+
* statusTracking → hookInjection → metrics → [core execution] → metrics → hookInjection → statusTracking
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
import type { PhaseOutcome } from '../phases/PhaseOutcome.js';
|
|
12
|
+
import type { PhaseExecutionContext } from './PhaseLifecycleHook.js';
|
|
13
|
+
/**
|
|
14
|
+
* 阶段 middleware 函数签名。
|
|
15
|
+
*
|
|
16
|
+
* @param ctx - 阶段执行上下文
|
|
17
|
+
* @param next - 调用下一个 middleware(最终到达核心执行逻辑)
|
|
18
|
+
* @returns 阶段执行结果
|
|
19
|
+
*/
|
|
20
|
+
export type PhaseMiddleware = (ctx: PhaseExecutionContext, next: () => Promise<PhaseOutcome>) => Promise<PhaseOutcome>;
|
|
21
|
+
/**
|
|
22
|
+
* 组合多个 middleware 为单一可执行函数(从外到内依次包裹)。
|
|
23
|
+
*
|
|
24
|
+
* 执行顺序:middleware[0] 最先进入、最后退出(洋葱模型)。
|
|
25
|
+
*
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const pipeline = composeMiddleware([loggingMw, metricsMw, coreMw]);
|
|
28
|
+
* const result = await pipeline(ctx, () => phase.run(ctx));
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function composeMiddleware(middlewares: PhaseMiddleware[]): PhaseMiddleware;
|
|
32
|
+
/**
|
|
33
|
+
* 日志 middleware — 记录阶段开始/完成/失败和耗时。
|
|
34
|
+
*/
|
|
35
|
+
export declare function loggingMiddleware(logFn: (message: string, meta?: Record<string, unknown>) => void): PhaseMiddleware;
|
|
36
|
+
/**
|
|
37
|
+
* Metrics middleware — 记录阶段执行次数和耗时直方图。
|
|
38
|
+
*/
|
|
39
|
+
export declare function metricsMiddleware(collector: {
|
|
40
|
+
incrementCounter(name: string, labels?: Record<string, string>): void;
|
|
41
|
+
observeHistogram(name: string, value: number, labels?: Record<string, string>): void;
|
|
42
|
+
}): PhaseMiddleware;
|
|
43
|
+
/**
|
|
44
|
+
* 超时 middleware — 为阶段执行增加额外的超时保护。
|
|
45
|
+
*/
|
|
46
|
+
export declare function timeoutMiddleware(timeoutMs: number): PhaseMiddleware;
|
|
47
|
+
//# sourceMappingURL=PhaseMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseMiddleware.d.ts","sourceRoot":"","sources":["../../src/lifecycle/PhaseMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,GAAG,EAAE,qBAAqB,EAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,KAC9B,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,eAAe,CAqBjF;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAC/D,eAAe,CAwBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE;IACT,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACtE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACtF,GACA,eAAe,CAoBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAmBpE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 轻量级阶段状态机 — 显式定义阶段内的状态流转和 guard 条件。
|
|
3
|
+
*
|
|
4
|
+
* 不依赖外部库(如 XState),而是通过简单的状态表 + transition 函数
|
|
5
|
+
* 实现可预测、可序列化、可测试的状态管理。
|
|
6
|
+
*
|
|
7
|
+
* 状态机管理的是**单个阶段内**的状态流转,而非全局 Issue 状态
|
|
8
|
+
* (全局状态由 ActionLifecycleManager + IssueTracker 管理)。
|
|
9
|
+
*/
|
|
10
|
+
export type PhaseInternalState = 'idle' | 'hooks_injected' | 'context_ready' | 'executing' | 'awaiting_feedback' | 'feedback_received' | 'validating' | 'completed' | 'failed' | 'skipped' | 'paused';
|
|
11
|
+
export type PhaseEvent = {
|
|
12
|
+
type: 'INJECT_HOOKS';
|
|
13
|
+
} | {
|
|
14
|
+
type: 'CONTEXT_READY';
|
|
15
|
+
} | {
|
|
16
|
+
type: 'START_EXECUTE';
|
|
17
|
+
} | {
|
|
18
|
+
type: 'FEEDBACK_REQUIRED';
|
|
19
|
+
question: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'FEEDBACK_RECEIVED';
|
|
22
|
+
response: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'EXECUTE_DONE';
|
|
25
|
+
success: boolean;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'VALIDATION_PASSED';
|
|
28
|
+
} | {
|
|
29
|
+
type: 'VALIDATION_FAILED';
|
|
30
|
+
reason: string;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'COMPLETE';
|
|
33
|
+
} | {
|
|
34
|
+
type: 'FAIL';
|
|
35
|
+
reason: string;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'SKIP';
|
|
38
|
+
} | {
|
|
39
|
+
type: 'PAUSE';
|
|
40
|
+
} | {
|
|
41
|
+
type: 'RESUME';
|
|
42
|
+
};
|
|
43
|
+
export interface TransitionGuard {
|
|
44
|
+
(ctx: StateMachineContext, event: PhaseEvent): boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface StateMachineContext {
|
|
47
|
+
phaseName: string;
|
|
48
|
+
issueIid: number;
|
|
49
|
+
retryCount: number;
|
|
50
|
+
maxRetries: number;
|
|
51
|
+
lastError?: string;
|
|
52
|
+
feedbackHistory: Array<{
|
|
53
|
+
question: string;
|
|
54
|
+
response: string;
|
|
55
|
+
timestamp: string;
|
|
56
|
+
}>;
|
|
57
|
+
startedAt?: string;
|
|
58
|
+
completedAt?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface TransitionDef {
|
|
61
|
+
from: PhaseInternalState;
|
|
62
|
+
event: PhaseEvent['type'];
|
|
63
|
+
to: PhaseInternalState;
|
|
64
|
+
guard?: TransitionGuard;
|
|
65
|
+
action?: (ctx: StateMachineContext, event: PhaseEvent) => void;
|
|
66
|
+
}
|
|
67
|
+
export interface PhaseStateMachineSnapshot {
|
|
68
|
+
state: PhaseInternalState;
|
|
69
|
+
context: StateMachineContext;
|
|
70
|
+
}
|
|
71
|
+
export declare class PhaseStateMachine {
|
|
72
|
+
private _state;
|
|
73
|
+
private _context;
|
|
74
|
+
private readonly transitions;
|
|
75
|
+
private readonly listeners;
|
|
76
|
+
constructor(phaseName: string, issueIid: number, opts?: {
|
|
77
|
+
maxRetries?: number;
|
|
78
|
+
initialState?: PhaseInternalState;
|
|
79
|
+
transitions?: TransitionDef[];
|
|
80
|
+
});
|
|
81
|
+
get state(): PhaseInternalState;
|
|
82
|
+
get context(): Readonly<StateMachineContext>;
|
|
83
|
+
/** 发送事件触发状态转换。返回新状态,如果无匹配 transition 则抛异常。 */
|
|
84
|
+
send(event: PhaseEvent): PhaseInternalState;
|
|
85
|
+
/** 尝试发送事件,如果无匹配 transition 则返回 false 而非抛异常。 */
|
|
86
|
+
trySend(event: PhaseEvent): boolean;
|
|
87
|
+
/** 检查当前状态下是否可以处理某事件。 */
|
|
88
|
+
canSend(eventType: PhaseEvent['type']): boolean;
|
|
89
|
+
/** 获取当前状态下所有可用的事件类型。 */
|
|
90
|
+
availableEvents(): PhaseEvent['type'][];
|
|
91
|
+
/** 是否处于终态。 */
|
|
92
|
+
get isTerminal(): boolean;
|
|
93
|
+
/** 是否处于失败态(可能可重试)。 */
|
|
94
|
+
get isFailed(): boolean;
|
|
95
|
+
/** 是否可重试。 */
|
|
96
|
+
get canRetry(): boolean;
|
|
97
|
+
/** 订阅状态变化。返回取消订阅函数。 */
|
|
98
|
+
subscribe(listener: (snapshot: PhaseStateMachineSnapshot) => void): () => void;
|
|
99
|
+
/** 快照(可序列化 / 可用于断点恢复)。 */
|
|
100
|
+
snapshot(): PhaseStateMachineSnapshot;
|
|
101
|
+
/** 从快照恢复。 */
|
|
102
|
+
static fromSnapshot(snap: PhaseStateMachineSnapshot, transitions?: TransitionDef[]): PhaseStateMachine;
|
|
103
|
+
private notify;
|
|
104
|
+
}
|
|
105
|
+
export declare class InvalidTransitionError extends Error {
|
|
106
|
+
readonly currentState: PhaseInternalState;
|
|
107
|
+
readonly eventType: string;
|
|
108
|
+
readonly phaseName: string;
|
|
109
|
+
constructor(currentState: PhaseInternalState, eventType: string, phaseName: string);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=PhaseStateMachine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseStateMachine.d.ts","sourceRoot":"","sources":["../../src/lifecycle/PhaseStateMachine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,gBAAgB,GAChB,eAAe,GACf,WAAW,GACX,mBAAmB,GACnB,mBAAmB,GACnB,YAAY,GACZ,WAAW,GACX,QAAQ,GACR,SAAS,GACT,QAAQ,CAAC;AAIb,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAIvB,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;CACxD;AAID,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1B,EAAE,EAAE,kBAAkB,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAChE;AA6DD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4D;gBAGpF,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,kBAAkB,CAAC;QAClC,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;KAC/B;IAaH,IAAI,KAAK,IAAI,kBAAkB,CAE9B;IAED,IAAI,OAAO,IAAI,QAAQ,CAAC,mBAAmB,CAAC,CAE3C;IAED,8CAA8C;IAC9C,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,kBAAkB;IAyB3C,+CAA+C;IAC/C,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IASnC,wBAAwB;IACxB,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,OAAO;IAO/C,wBAAwB;IACxB,eAAe,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE;IASvC,cAAc;IACd,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,sBAAsB;IACtB,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,aAAa;IACb,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,uBAAuB;IACvB,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,GAAG,MAAM,IAAI;IAQ9E,0BAA0B;IAC1B,QAAQ,IAAI,yBAAyB;IAOrC,aAAa;IACb,MAAM,CAAC,YAAY,CACjB,IAAI,EAAE,yBAAyB,EAC/B,WAAW,CAAC,EAAE,aAAa,EAAE,GAC5B,iBAAiB;IAcpB,OAAO,CAAC,MAAM;CAOf;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,YAAY,EAAE,kBAAkB;aAChC,SAAS,EAAE,MAAM;aACjB,SAAS,EAAE,MAAM;gBAFjB,YAAY,EAAE,kBAAkB,EAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;CAOpC"}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
export type { ActionStatus, Action, ActionState, StateCategory } from './ActionLifecycle.js';
|
|
2
2
|
export { ActionLifecycleManager } from './ActionLifecycleManager.js';
|
|
3
|
+
export type { PhaseFeedback, InteractiveDialogFeedback, ApprovalRequiredFeedback, PermissionRequestFeedback, GenericFeedback, FeedbackResponse, ErrorDecision, PhaseError, } from './FeedbackTypes.js';
|
|
4
|
+
export { inputRequestToFeedback, feedbackToInputRequest, feedbackResponseToString, stringToFeedbackResponse, } from './FeedbackTypes.js';
|
|
5
|
+
export type { PhaseExecutionContext, PhaseLifecycleHook, PhaseStepResult, } from './PhaseLifecycleHook.js';
|
|
6
|
+
export { DefaultLifecycleHook, createCallbacksFromHook } from './DefaultLifecycleHook.js';
|
|
7
|
+
export type { PhaseMiddleware } from './PhaseMiddleware.js';
|
|
8
|
+
export { composeMiddleware, loggingMiddleware, metricsMiddleware, timeoutMiddleware, } from './PhaseMiddleware.js';
|
|
9
|
+
export type { PhaseInternalState, PhaseEvent, TransitionGuard, StateMachineContext, TransitionDef, PhaseStateMachineSnapshot, } from './PhaseStateMachine.js';
|
|
10
|
+
export { PhaseStateMachine, InvalidTransitionError } from './PhaseStateMachine.js';
|
|
3
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,YAAY,EACV,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAE1F,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 从 PhaseLoopStep 提取的编排级辅助函数。
|
|
3
|
+
*
|
|
4
|
+
* 供 PhaseLoopStep、DefaultLifecycleHook、各 PhaseStrategy 共用,
|
|
5
|
+
* 避免循环依赖。
|
|
6
|
+
*/
|
|
7
|
+
import type { GitOperations } from '../../git/GitOperations.js';
|
|
8
|
+
import type { PlanPersistence } from '../../persistence/PlanPersistence.js';
|
|
9
|
+
import type { AIRunner, InputRequest } from '../../ai-runner/index.js';
|
|
10
|
+
import type { BasePhase, PhaseContext } from '../../phases/BasePhase.js';
|
|
11
|
+
import type { PhaseSpec, PipelineDef } from '../../pipeline/PipelineDefinition.js';
|
|
12
|
+
import type { IssueProcessingContext, OrchestratorDeps } from '../IssueProcessingContext.js';
|
|
13
|
+
export declare function safeComment(deps: OrchestratorDeps, issueId: number, message: string): Promise<void>;
|
|
14
|
+
export declare function resolveVerifyRunner(deps: OrchestratorDeps): AIRunner;
|
|
15
|
+
export declare function resolveUatRunner(deps: OrchestratorDeps, issueIid: number): AIRunner;
|
|
16
|
+
export declare function commitPlanFiles(ctx: PhaseContext, wtGit: GitOperations, wtGitMap: Map<string, GitOperations> | undefined, phaseName: string, displayId: number): Promise<void>;
|
|
17
|
+
export declare function syncResultToIssue(phase: BasePhase, ctx: PhaseContext, displayId: number, phaseName: string, deps: OrchestratorDeps, issueId: number, wtPlan: PlanPersistence): Promise<void>;
|
|
18
|
+
export declare function handlePlanApproval(displayId: number, phaseName: string, deps: OrchestratorDeps): Promise<string>;
|
|
19
|
+
export declare function handleInteractiveDialog(displayId: number, phaseName: string, deps: OrchestratorDeps, request: InputRequest): Promise<string>;
|
|
20
|
+
export declare function updateHooksForPhase(spec: PhaseSpec, pipelineDef: PipelineDef, ctx: IssueProcessingContext, wtPlan: PlanPersistence): void;
|
|
21
|
+
export declare function findPreviousAiPhaseIndex(phases: readonly {
|
|
22
|
+
kind: string;
|
|
23
|
+
}[], currentIdx: number): number;
|
|
24
|
+
//# sourceMappingURL=PhaseHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseHelpers.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAc7F,wBAAsB,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzG;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,QAAQ,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAKnF;AAID,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,EAChD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAID,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAID,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC,CAoDjB;AAID,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,sBAAsB,EAC3B,MAAM,EAAE,eAAe,GACtB,IAAI,CAyBN;AAID,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EACnC,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { GitOperations } from '../../git/GitOperations.js';
|
|
2
2
|
import type { PlanPersistence } from '../../persistence/PlanPersistence.js';
|
|
3
|
+
import type { BasePhase } from '../../phases/BasePhase.js';
|
|
4
|
+
import type { PhaseOutcome } from '../../phases/PhaseOutcome.js';
|
|
5
|
+
import type { PhaseSpec } from '../../pipeline/PipelineDefinition.js';
|
|
3
6
|
import type { IssueProcessingContext, OrchestratorDeps, PhaseLoopResult } from '../IssueProcessingContext.js';
|
|
7
|
+
import type { PhaseLifecycleHook } from '../../lifecycle/PhaseLifecycleHook.js';
|
|
8
|
+
/**
|
|
9
|
+
* 统一的阶段执行包装器 — 通过 PhaseLifecycleHook 驱动完整生命周期。
|
|
10
|
+
*
|
|
11
|
+
* beforePhase → Execute (phase.run with callbacks) → afterPhase / onError
|
|
12
|
+
*/
|
|
13
|
+
export declare function runPhaseWithLifecycle(phase: BasePhase, phaseCtx: import('../../phases/BasePhase.js').PhaseContext, spec: PhaseSpec, ctx: IssueProcessingContext, deps: OrchestratorDeps, wtGit: GitOperations, wtPlan: PlanPersistence, wtGitMap?: Map<string, GitOperations>, hook?: PhaseLifecycleHook): Promise<PhaseOutcome>;
|
|
4
14
|
/**
|
|
5
15
|
* 执行流水线阶段循环:
|
|
6
16
|
* - 确定恢复阶段索引
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhaseLoopStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseLoopStep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"PhaseLoopStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseLoopStep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9G,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,uCAAuC,CAAC;AASvG;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,OAAO,2BAA2B,EAAE,YAAY,EAC1D,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EACrC,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,YAAY,CAAC,CA6DvB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACpC,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CA6GhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/SetupStep.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"SetupStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/SetupStep.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAO1G;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,WAAW,CAAC,CAuGtB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PhaseExecutionContext, PhaseLifecycleHook, PhaseStepResult } from '../../lifecycle/PhaseLifecycleHook.js';
|
|
2
|
+
import type { PhaseStrategy } from './PhaseStrategy.js';
|
|
3
|
+
/**
|
|
4
|
+
* 标准 AI 阶段策略 — 处理所有 kind='ai' 的阶段。
|
|
5
|
+
*
|
|
6
|
+
* 覆盖:plan、build、uat(非 verify-fix 循环的 verify 也走这里)。
|
|
7
|
+
* 处理异步阶段(awaitCompletion)、gate 请求(hasReleaseCapability)。
|
|
8
|
+
*/
|
|
9
|
+
export declare class AiPhaseStrategy implements PhaseStrategy {
|
|
10
|
+
readonly name = "ai";
|
|
11
|
+
shouldSkip(ctx: PhaseExecutionContext): boolean;
|
|
12
|
+
execute(ctx: PhaseExecutionContext, hooks: PhaseLifecycleHook): Promise<PhaseStepResult>;
|
|
13
|
+
private resolveRunner;
|
|
14
|
+
private handleAsyncOutcome;
|
|
15
|
+
private handleGateRequest;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=AiPhaseStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AiPhaseStrategy.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/strategies/AiPhaseStrategy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAexD;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,IAAI,QAAQ;IAErB,UAAU,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO;IASzC,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IA4C9F,OAAO,CAAC,aAAa;YAOP,kBAAkB;IAiEhC,OAAO,CAAC,iBAAiB;CAY1B"}
|