@mickorz/opencode-agentic-workflow 0.3.2 → 0.5.0
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/README.md +306 -5
- package/dist/cli/config.d.ts +121 -0
- package/dist/cli/config.js +331 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/doctor.d.ts +5 -0
- package/dist/cli/doctor.js +141 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +18 -0
- package/dist/cli/index.js +120 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +19 -0
- package/dist/cli/install.js +135 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/uninstall.d.ts +16 -0
- package/dist/cli/uninstall.js +110 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/update.d.ts +15 -0
- package/dist/cli/update.js +86 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/core/index.d.ts +39 -0
- package/dist/core/index.js +38 -0
- package/dist/core/index.js.map +1 -0
- package/dist/observability/events.d.ts +43 -0
- package/dist/observability/events.js.map +1 -1
- package/dist/plugin/checkpoint-override.d.ts +26 -0
- package/dist/plugin/checkpoint-override.js +43 -0
- package/dist/plugin/checkpoint-override.js.map +1 -0
- package/dist/plugin/define-workflow.d.ts +33 -0
- package/dist/plugin/define-workflow.js +103 -0
- package/dist/plugin/define-workflow.js.map +1 -0
- package/dist/plugin/index.js +426 -23
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/opencode-v2-executor.js +58 -46
- package/dist/plugin/opencode-v2-executor.js.map +1 -1
- package/dist/plugin/progress-board.d.ts +64 -0
- package/dist/plugin/progress-board.js +150 -0
- package/dist/plugin/progress-board.js.map +1 -0
- package/dist/plugin/progress-rpc.d.ts +390 -0
- package/dist/plugin/progress-rpc.js +318 -0
- package/dist/plugin/progress-rpc.js.map +1 -0
- package/dist/plugin/progress-view.d.ts +82 -0
- package/dist/plugin/progress-view.js +244 -0
- package/dist/plugin/progress-view.js.map +1 -0
- package/dist/plugin/run-sessions.d.ts +28 -0
- package/dist/plugin/run-sessions.js +46 -0
- package/dist/plugin/run-sessions.js.map +1 -0
- package/dist/plugin/tool-args.d.ts +15 -0
- package/dist/plugin/tool-args.js +28 -0
- package/dist/plugin/tool-args.js.map +1 -0
- package/dist/plugin/tui.d.ts +11 -4
- package/dist/plugin/tui.js +149 -5
- package/dist/plugin/tui.js.map +1 -1
- package/dist/plugin/workflow-control.d.ts +16 -0
- package/dist/plugin/workflow-control.js +85 -0
- package/dist/plugin/workflow-control.js.map +1 -0
- package/dist/plugin/workflow-schedule.d.ts +24 -0
- package/dist/plugin/workflow-schedule.js +97 -0
- package/dist/plugin/workflow-schedule.js.map +1 -0
- package/dist/quality/checkpoint.d.ts +7 -2
- package/dist/quality/checkpoint.js +13 -4
- package/dist/quality/checkpoint.js.map +1 -1
- package/dist/quality/verify.d.ts +21 -2
- package/dist/quality/verify.js +36 -14
- package/dist/quality/verify.js.map +1 -1
- package/dist/registry/definition.d.ts +12 -0
- package/dist/registry/definition.js.map +1 -1
- package/dist/registry/registry.d.ts +4 -0
- package/dist/registry/registry.js +20 -1
- package/dist/registry/registry.js.map +1 -1
- package/dist/registry/run-control.d.ts +27 -0
- package/dist/registry/run-control.js +51 -0
- package/dist/registry/run-control.js.map +1 -0
- package/dist/registry/runner.d.ts +29 -6
- package/dist/registry/runner.js +153 -35
- package/dist/registry/runner.js.map +1 -1
- package/dist/runtime/errors.d.ts +26 -0
- package/dist/runtime/errors.js +30 -0
- package/dist/runtime/errors.js.map +1 -1
- package/dist/runtime/executor.d.ts +22 -0
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/run-context.d.ts +44 -0
- package/dist/runtime/run-context.js +32 -0
- package/dist/runtime/run-context.js.map +1 -0
- package/dist/scheduler/cron.d.ts +29 -0
- package/dist/scheduler/cron.js +171 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/scheduler/service.d.ts +78 -0
- package/dist/scheduler/service.js +210 -0
- package/dist/scheduler/service.js.map +1 -0
- package/dist/scheduler/store.d.ts +26 -0
- package/dist/scheduler/store.js +94 -0
- package/dist/scheduler/store.js.map +1 -0
- package/dist/scheduler/types.d.ts +53 -0
- package/dist/scheduler/types.js +12 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/state/journal.d.ts +23 -0
- package/dist/state/journal.js +2 -0
- package/dist/state/journal.js.map +1 -1
- package/dist/state/recorder.d.ts +67 -0
- package/dist/state/recorder.js +148 -2
- package/dist/state/recorder.js.map +1 -1
- package/dist/workflow/agent.d.ts +42 -1
- package/dist/workflow/agent.js +116 -6
- package/dist/workflow/agent.js.map +1 -1
- package/dist/workflow/judge-panel.d.ts +37 -0
- package/dist/workflow/judge-panel.js +66 -0
- package/dist/workflow/judge-panel.js.map +1 -0
- package/dist/workflow/pipeline.d.ts +21 -0
- package/dist/workflow/pipeline.js +71 -0
- package/dist/workflow/pipeline.js.map +1 -0
- package/dist/workflow/race.d.ts +16 -0
- package/dist/workflow/race.js +46 -0
- package/dist/workflow/race.js.map +1 -0
- package/dist/workflow/sequence.js +6 -0
- package/dist/workflow/sequence.js.map +1 -1
- package/dist/workflows/loader.d.ts +124 -0
- package/dist/workflows/loader.js +500 -0
- package/dist/workflows/loader.js.map +1 -0
- package/dist/workspace/ambient.d.ts +6 -4
- package/dist/workspace/ambient.js +10 -4
- package/dist/workspace/ambient.js.map +1 -1
- package/dist/workspace/in-place.d.ts +26 -0
- package/dist/workspace/in-place.js +48 -0
- package/dist/workspace/in-place.js.map +1 -0
- package/dist/workspace/index.d.ts +1 -0
- package/dist/workspace/index.js +1 -0
- package/dist/workspace/index.js.map +1 -1
- package/package.json +16 -6
- package/skills/workflow-authoring/SKILL.md +111 -0
- package/skills/workflow-optimize/SKILL.md +70 -0
- package/dist/workflows/index.d.ts +0 -19
- package/dist/workflows/index.js +0 -40
- package/dist/workflows/index.js.map +0 -1
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { WorkflowError } from "../runtime/errors.js";
|
|
14
14
|
import { emitEvent } from "../observability/events.js";
|
|
15
15
|
import { phase } from "../workflow/phase.js";
|
|
16
|
+
import { currentRunContext } from "../runtime/run-context.js";
|
|
16
17
|
/** checkpoint 被拒绝(或按策略判定不通过)时抛出 */
|
|
17
18
|
export class WorkflowCheckpointError extends WorkflowError {
|
|
18
19
|
label;
|
|
@@ -24,18 +25,26 @@ export class WorkflowCheckpointError extends WorkflowError {
|
|
|
24
25
|
this.reason = reason;
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
|
-
/** ---- gate
|
|
28
|
+
/** ---- gate 注册(P2-9 起支持 run 级覆盖,ALS 优先) ---- */
|
|
28
29
|
let gate;
|
|
29
|
-
/**
|
|
30
|
+
/** 注入全局 CheckpointGate(plugin 初始化时调用;传 undefined 表示解除绑定) */
|
|
30
31
|
export function setCheckpointGate(value) {
|
|
31
32
|
gate = value;
|
|
32
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* 当前生效的 gate:run 上下文(subflow/scheduler/调用级覆盖)优先,
|
|
36
|
+
* 回落全局绑定。嵌套 run 未显式覆盖时继承父作用域。
|
|
37
|
+
*/
|
|
38
|
+
export function getCheckpointGate() {
|
|
39
|
+
return currentRunContext()?.gate ?? gate;
|
|
40
|
+
}
|
|
33
41
|
/** 获取当前 gate;未注入时抛错 */
|
|
34
42
|
export function requireCheckpointGate() {
|
|
35
|
-
|
|
43
|
+
const current = getCheckpointGate();
|
|
44
|
+
if (!current) {
|
|
36
45
|
throw new Error("[agentic-workflow] no checkpoint gate bound: call setCheckpointGate() first");
|
|
37
46
|
}
|
|
38
|
-
return
|
|
47
|
+
return current;
|
|
39
48
|
}
|
|
40
49
|
/**
|
|
41
50
|
* 人工审批节点:阻塞等待批准;拒绝抛 WorkflowCheckpointError。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/quality/checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/quality/checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAiB7D,mCAAmC;AACnC,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IAC/C,KAAK,CAAQ;IACb,MAAM,CAAS;IAExB,YAAY,KAAa,EAAE,MAAe;QACxC,KAAK,CACH,wBAAwB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACjE,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAOD,iDAAiD;AAEjD,IAAI,IAAgC,CAAA;AAEpC,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAAC,KAAiC;IACjE,IAAI,GAAG,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,iBAAiB,EAAE,EAAE,IAAI,IAAI,IAAI,CAAA;AAC1C,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAA;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,OAA2B;IAE3B,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,YAAY,CAAA;IAC5C,KAAK,CAAC,cAAc,KAAK,GAAG,CAAC,CAAA;IAE7B,SAAS,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAEzD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAEtE,OAAO,CAAC,GAAG,CACT,iCAAiC,KAAK,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CACzF,CAAA;IAED,SAAS,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE/E,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC"}
|
package/dist/quality/verify.d.ts
CHANGED
|
@@ -27,15 +27,34 @@ import { WorkflowError } from "../runtime/errors.js";
|
|
|
27
27
|
export interface ReviewVerdict {
|
|
28
28
|
/** reviewer 序号(1 起) */
|
|
29
29
|
reviewer: number;
|
|
30
|
+
/** 评审视角名(lenses 模式下记录来源视角) */
|
|
31
|
+
lens?: string;
|
|
30
32
|
verdict: "pass" | "fail";
|
|
31
33
|
summary: string;
|
|
32
34
|
issues: string[];
|
|
33
35
|
}
|
|
36
|
+
/** 多视角评审(P2-11):每个 lens 独立一个评审员,只按自己的视角标准评 */
|
|
37
|
+
export interface VerifyLens {
|
|
38
|
+
/** 视角名(如 correctness / completeness / style),进评审 prompt 与结论 */
|
|
39
|
+
name: string;
|
|
40
|
+
/** 该视角的评审标准 */
|
|
41
|
+
criteria: string;
|
|
42
|
+
}
|
|
34
43
|
export interface VerifyOptions {
|
|
35
|
-
/** 并行评审人数,默认 1;至少 1 */
|
|
44
|
+
/** 并行评审人数,默认 1;至少 1(lenses 存在时忽略,以 lenses 数为准) */
|
|
36
45
|
reviewers?: number;
|
|
37
46
|
/** 验证标准(评审依据),例如「符合登录模块需求,无安全漏洞」 */
|
|
38
47
|
criteria?: string;
|
|
48
|
+
/**
|
|
49
|
+
* P2-11 投票阈值:pass 人数占比 >= threshold 才通过,默认 1(全票,
|
|
50
|
+
* 即旧行为)。取值 (0, 1],如 0.5 = 多数决
|
|
51
|
+
*/
|
|
52
|
+
passThreshold?: number;
|
|
53
|
+
/**
|
|
54
|
+
* P2-11 多视角评审:每个 { name, criteria } 独立一个评审员。
|
|
55
|
+
* 存在时覆盖 reviewers 数量与全局 criteria(各视角只看自己的标准)
|
|
56
|
+
*/
|
|
57
|
+
lenses?: VerifyLens[];
|
|
39
58
|
/** 结果标签,默认 "semantic verify" */
|
|
40
59
|
label?: string;
|
|
41
60
|
/** reviewer 协议容错:解析失败时的局部重试策略(默认 attempts=2) */
|
|
@@ -48,7 +67,7 @@ export interface ReviewerProtocolOptions {
|
|
|
48
67
|
}
|
|
49
68
|
export interface VerifyResult {
|
|
50
69
|
label: string;
|
|
51
|
-
/**
|
|
70
|
+
/** pass 人数占比 >= passThreshold(默认 1 = 全票)才为 true */
|
|
52
71
|
passed: boolean;
|
|
53
72
|
verdicts: ReviewVerdict[];
|
|
54
73
|
}
|
package/dist/quality/verify.js
CHANGED
|
@@ -72,10 +72,16 @@ function artifactToText(artifact) {
|
|
|
72
72
|
return record.output;
|
|
73
73
|
return JSON.stringify(artifact, null, 2);
|
|
74
74
|
}
|
|
75
|
-
function buildReviewerPrompt(artifact, reviewerNo, reviewers, criteria) {
|
|
75
|
+
function buildReviewerPrompt(artifact, reviewerNo, reviewers, criteria, lens) {
|
|
76
76
|
return [
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
lens
|
|
78
|
+
? `你是「${lens.name}」视角评审员(第 ${reviewerNo}/${reviewers} 号)。只按本视角标准评审,给出严格 JSON 结论。`
|
|
79
|
+
: `你是第 ${reviewerNo}/${reviewers} 号独立评审员。请评审下面的产物,给出严格 JSON 结论。`,
|
|
80
|
+
lens
|
|
81
|
+
? `评审标准(视角 ${lens.name}):${lens.criteria}`
|
|
82
|
+
: criteria
|
|
83
|
+
? `评审标准:${criteria}`
|
|
84
|
+
: "评审标准:产物完整、正确、可交付。",
|
|
79
85
|
"",
|
|
80
86
|
"=== 待评审产物 ===",
|
|
81
87
|
artifact,
|
|
@@ -131,26 +137,39 @@ function buildRepairPrompt(originalPrompt, lastRaw) {
|
|
|
131
137
|
* 那不是评审结论,是运维事故:产物未被否定,可安全 resume 重试 verify。
|
|
132
138
|
*/
|
|
133
139
|
export async function verify(artifact, options) {
|
|
134
|
-
const
|
|
140
|
+
const threshold = options?.passThreshold ?? 1;
|
|
141
|
+
if (!Number.isFinite(threshold) || threshold <= 0 || threshold > 1) {
|
|
142
|
+
throw new Error("[agentic-workflow] verify passThreshold must be in (0, 1]");
|
|
143
|
+
}
|
|
144
|
+
// lenses 模式:一个视角一个评审员(覆盖 reviewers 数量与全局 criteria)
|
|
145
|
+
const slots = options?.lenses && options.lenses.length > 0
|
|
146
|
+
? options.lenses.map((lens, i) => ({ no: i + 1, lens }))
|
|
147
|
+
: Array.from({ length: Math.max(1, Math.floor(options?.reviewers ?? 1)) }, (_, i) => ({
|
|
148
|
+
no: i + 1,
|
|
149
|
+
}));
|
|
150
|
+
const reviewers = slots.length;
|
|
135
151
|
const label = options?.label ?? "semantic verify";
|
|
136
152
|
const attempts = Math.max(1, Math.floor(options?.reviewerProtocol?.attempts ?? 2));
|
|
137
|
-
phase(`Verify(${label}, ${reviewers} reviewer${reviewers > 1 ? "s" : ""})`);
|
|
153
|
+
phase(`Verify(${label}, ${reviewers} reviewer${reviewers > 1 ? "s" : ""}${slots[0]?.lens ? " (lenses)" : ""}${threshold < 1 ? `, threshold ${threshold}` : ""})`);
|
|
138
154
|
const text = artifactToText(artifact);
|
|
139
155
|
// 单 reviewer:仅解析失败局部重试(修复格式,不重新评审);语义结论不重试
|
|
140
|
-
const runReviewer = async (
|
|
141
|
-
const basePrompt = buildReviewerPrompt(text, no, reviewers, options?.criteria);
|
|
156
|
+
const runReviewer = async (slot) => {
|
|
157
|
+
const basePrompt = buildReviewerPrompt(text, slot.no, reviewers, options?.criteria, slot.lens);
|
|
142
158
|
let lastRaw = "";
|
|
143
159
|
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
144
160
|
const result = await agent(attempt === 1 ? basePrompt : buildRepairPrompt(basePrompt, lastRaw));
|
|
145
161
|
lastRaw = result.output;
|
|
146
|
-
const verdict = toVerdict(no, result.output);
|
|
147
|
-
if (verdict)
|
|
162
|
+
const verdict = toVerdict(slot.no, result.output);
|
|
163
|
+
if (verdict) {
|
|
164
|
+
if (slot.lens)
|
|
165
|
+
verdict.lens = slot.lens.name;
|
|
148
166
|
return { status: "reviewed", verdict };
|
|
167
|
+
}
|
|
149
168
|
}
|
|
150
|
-
return { status: "invalid-response", reviewer: no, attempts, lastRaw };
|
|
169
|
+
return { status: "invalid-response", reviewer: slot.no, attempts, lastRaw };
|
|
151
170
|
};
|
|
152
171
|
// 协议失败以哨兵值穿透 parallel(避免被 WorkflowParallelError 包装),在外层统一抛
|
|
153
|
-
const outcomes = await parallel(
|
|
172
|
+
const outcomes = await parallel(slots.map((slot) => () => runReviewer(slot)));
|
|
154
173
|
const protocolFailure = outcomes.find((o) => o.status === "invalid-response");
|
|
155
174
|
if (protocolFailure) {
|
|
156
175
|
emitEvent({
|
|
@@ -163,15 +182,18 @@ export async function verify(artifact, options) {
|
|
|
163
182
|
throw new ReviewerProtocolError(label, protocolFailure.reviewer, protocolFailure.attempts, protocolFailure.lastRaw);
|
|
164
183
|
}
|
|
165
184
|
const verdicts = outcomes.map((o) => o.verdict);
|
|
166
|
-
const
|
|
185
|
+
const passCount = verdicts.filter((v) => v.verdict === "pass").length;
|
|
186
|
+
// 投票阈值(P2-11):占比 >= threshold 才通过(默认 1 = 全票,旧行为)
|
|
187
|
+
const passed = passCount / verdicts.length >= threshold;
|
|
167
188
|
console.log(`[agentic-workflow] verify ${passed ? "ok" : "FAIL"}: ${label} ` +
|
|
168
|
-
`(${verdicts.
|
|
189
|
+
`(${passCount}/${verdicts.length} pass${threshold < 1 ? `, threshold ${threshold}` : ""})`);
|
|
169
190
|
emitEvent({
|
|
170
191
|
type: "verify.completed",
|
|
171
192
|
label,
|
|
172
193
|
passed,
|
|
173
|
-
passedCount:
|
|
194
|
+
passedCount: passCount,
|
|
174
195
|
totalCount: verdicts.length,
|
|
196
|
+
...(threshold < 1 ? { threshold } : {}),
|
|
175
197
|
});
|
|
176
198
|
return { label, passed, verdicts };
|
|
177
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/quality/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/quality/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,18 @@ export interface WorkflowContext {
|
|
|
38
38
|
workspaceRoot?: string;
|
|
39
39
|
/** 编排步骤的统一入口(自动处理 start/resume 与 journal 记录) */
|
|
40
40
|
runSteps<T>(steps: Array<StepFn<T>>, options?: RunStepsOptions): Promise<T | undefined>;
|
|
41
|
+
/**
|
|
42
|
+
* P2-9 子工作流:在本 run 内同步运行另一个已注册 workflow。
|
|
43
|
+
* 子 run 有独立 journal(parentRunId 指回本 run);gate/workspace 继承
|
|
44
|
+
* 本 run 作用域;嵌套深度上限 3(防失控递归)。需要 journalDir——
|
|
45
|
+
* 未配置 ExecutionStore 的 run 不提供此方法(undefined)。
|
|
46
|
+
*/
|
|
47
|
+
subflow?<TArgs = unknown>(id: string, args?: TArgs, options?: {
|
|
48
|
+
version?: string;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
runId: string;
|
|
51
|
+
output: string;
|
|
52
|
+
}>;
|
|
41
53
|
}
|
|
42
54
|
export interface RunStepsOptions {
|
|
43
55
|
/** 失败模式,默认 fail-fast */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/registry/definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/registry/definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqEH,sCAAsC;AACtC,MAAM,UAAU,cAAc,CAC5B,UAA8C;IAE9C,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* 第一版仅支持代码注册;动态发现 / marketplace / 热加载明确不做(P2 范围外)。
|
|
13
13
|
*/
|
|
14
|
+
import type { ArgsSchema } from "./schema.js";
|
|
14
15
|
import type { WorkflowDefinition } from "./definition.js";
|
|
15
16
|
/** 注册边界类型:注册表存异构定义,run 的 args 参数逆变,故边界用 any(仅此边界) */
|
|
16
17
|
export type AnyWorkflowDefinition = WorkflowDefinition<any>;
|
|
@@ -41,5 +42,8 @@ export declare class WorkflowRegistry {
|
|
|
41
42
|
/** 每个 id 的最新版本各一条(工具枚举/描述用) */
|
|
42
43
|
listLatest(): AnyWorkflowDefinition[];
|
|
43
44
|
/** 摘要(工具描述用):`id@version: description` 每行一条(按最新版本) */
|
|
45
|
+
/** args 摘要:只列 topic 之外的声明参数(topic 工具恒传,列出只是噪声) */
|
|
44
46
|
summarize(): string;
|
|
45
47
|
}
|
|
48
|
+
/** 从 argsSchema 提取非 topic 参数提示:`name(type[, required])` 逗号拼接 */
|
|
49
|
+
export declare function summarizeArgsHint(schema: ArgsSchema | undefined): string;
|
|
@@ -108,10 +108,29 @@ export class WorkflowRegistry {
|
|
|
108
108
|
.filter((d) => d !== undefined);
|
|
109
109
|
}
|
|
110
110
|
/** 摘要(工具描述用):`id@version: description` 每行一条(按最新版本) */
|
|
111
|
+
/** args 摘要:只列 topic 之外的声明参数(topic 工具恒传,列出只是噪声) */
|
|
111
112
|
summarize() {
|
|
112
113
|
return this.listLatest()
|
|
113
|
-
.map((d) =>
|
|
114
|
+
.map((d) => {
|
|
115
|
+
const extra = summarizeArgsHint(d.argsSchema);
|
|
116
|
+
return (`- ${d.id}@${d.version}` +
|
|
117
|
+
`${d.description ? `: ${d.description}` : ""}` +
|
|
118
|
+
`${extra ? ` [args: ${extra}]` : ""}`);
|
|
119
|
+
})
|
|
114
120
|
.join("\n");
|
|
115
121
|
}
|
|
116
122
|
}
|
|
123
|
+
/** 从 argsSchema 提取非 topic 参数提示:`name(type[, required])` 逗号拼接 */
|
|
124
|
+
export function summarizeArgsHint(schema) {
|
|
125
|
+
if (!schema || schema.type !== "object" || !schema.properties)
|
|
126
|
+
return "";
|
|
127
|
+
const required = new Set(schema.required ?? []);
|
|
128
|
+
return Object.entries(schema.properties)
|
|
129
|
+
.filter(([key]) => key !== "topic")
|
|
130
|
+
.map(([key, prop]) => {
|
|
131
|
+
const type = prop && typeof prop === "object" && "type" in prop ? String(prop.type) : "any";
|
|
132
|
+
return `${key}(${type}${required.has(key) ? ", required" : ""})`;
|
|
133
|
+
})
|
|
134
|
+
.join(", ");
|
|
135
|
+
}
|
|
117
136
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run 控制(v1-parity P1-3:后台运行 + status/stop)
|
|
3
|
+
*
|
|
4
|
+
* 进程内两本账:
|
|
5
|
+
* - live:本进程存活的 run(start/resume 开始时登记、收口时清除)
|
|
6
|
+
* - cancelled:已请求停止的 run(步骤边界检查并抛 RunAbortedError)
|
|
7
|
+
*
|
|
8
|
+
* stop 语义(协作式,如实告知):
|
|
9
|
+
* - 活着的 run:置取消标记,**下一个步骤边界**生效——正在执行的 LLM 调用
|
|
10
|
+
* 不会被硬杀(无 AbortSignal 注入点),收口为 aborted
|
|
11
|
+
* - 孤儿 run(journal 里 running 但进程已重启):无活体可停,直接把
|
|
12
|
+
* journal 收口为 aborted(外部测试 Watching「杀进程后 run 悬置」的解)
|
|
13
|
+
*
|
|
14
|
+
* 纪律:Core 侧模块,禁止 import OpenCode API(架构不变量)。
|
|
15
|
+
*/
|
|
16
|
+
/** 协作式停止:在步骤边界抛出,由 runner 收口 journal 为 aborted */
|
|
17
|
+
export declare class RunAbortedError extends Error {
|
|
18
|
+
constructor(runId: string);
|
|
19
|
+
}
|
|
20
|
+
export declare function markLive(runId: string): void;
|
|
21
|
+
export declare function clearLive(runId: string): void;
|
|
22
|
+
export declare function isLive(runId: string): boolean;
|
|
23
|
+
/** 本进程是否有任一存活 run(P2-7 调度器单飞检查用) */
|
|
24
|
+
export declare function anyLive(): boolean;
|
|
25
|
+
export declare function requestCancel(runId: string): void;
|
|
26
|
+
export declare function isCancelled(runId: string): boolean;
|
|
27
|
+
export declare function throwIfCancelled(runId: string): void;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run 控制(v1-parity P1-3:后台运行 + status/stop)
|
|
3
|
+
*
|
|
4
|
+
* 进程内两本账:
|
|
5
|
+
* - live:本进程存活的 run(start/resume 开始时登记、收口时清除)
|
|
6
|
+
* - cancelled:已请求停止的 run(步骤边界检查并抛 RunAbortedError)
|
|
7
|
+
*
|
|
8
|
+
* stop 语义(协作式,如实告知):
|
|
9
|
+
* - 活着的 run:置取消标记,**下一个步骤边界**生效——正在执行的 LLM 调用
|
|
10
|
+
* 不会被硬杀(无 AbortSignal 注入点),收口为 aborted
|
|
11
|
+
* - 孤儿 run(journal 里 running 但进程已重启):无活体可停,直接把
|
|
12
|
+
* journal 收口为 aborted(外部测试 Watching「杀进程后 run 悬置」的解)
|
|
13
|
+
*
|
|
14
|
+
* 纪律:Core 侧模块,禁止 import OpenCode API(架构不变量)。
|
|
15
|
+
*/
|
|
16
|
+
const liveRuns = new Set();
|
|
17
|
+
const cancelledRuns = new Set();
|
|
18
|
+
/** 协作式停止:在步骤边界抛出,由 runner 收口 journal 为 aborted */
|
|
19
|
+
export class RunAbortedError extends Error {
|
|
20
|
+
constructor(runId) {
|
|
21
|
+
super(`run ${runId} aborted by user (cooperative stop at step boundary)`);
|
|
22
|
+
this.name = "RunAbortedError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function markLive(runId) {
|
|
26
|
+
liveRuns.add(runId);
|
|
27
|
+
cancelledRuns.delete(runId);
|
|
28
|
+
}
|
|
29
|
+
export function clearLive(runId) {
|
|
30
|
+
liveRuns.delete(runId);
|
|
31
|
+
cancelledRuns.delete(runId);
|
|
32
|
+
}
|
|
33
|
+
export function isLive(runId) {
|
|
34
|
+
return liveRuns.has(runId);
|
|
35
|
+
}
|
|
36
|
+
/** 本进程是否有任一存活 run(P2-7 调度器单飞检查用) */
|
|
37
|
+
export function anyLive() {
|
|
38
|
+
return liveRuns.size > 0;
|
|
39
|
+
}
|
|
40
|
+
export function requestCancel(runId) {
|
|
41
|
+
cancelledRuns.add(runId);
|
|
42
|
+
}
|
|
43
|
+
export function isCancelled(runId) {
|
|
44
|
+
return cancelledRuns.has(runId);
|
|
45
|
+
}
|
|
46
|
+
export function throwIfCancelled(runId) {
|
|
47
|
+
if (cancelledRuns.has(runId)) {
|
|
48
|
+
throw new RunAbortedError(runId);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=run-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-control.js","sourceRoot":"","sources":["../../src/registry/run-control.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;AAClC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;AAEvC,kDAAkD;AAClD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,KAAa;QACvB,KAAK,CAAC,OAAO,KAAK,sDAAsD,CAAC,CAAA;QACzE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACnB,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,OAAO;IACrB,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -17,8 +17,20 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import type { WorkflowIdentity } from "../state/journal.js";
|
|
19
19
|
import type { ExecutionStore } from "../state/store.js";
|
|
20
|
+
import type { CheckpointGate } from "../quality/checkpoint.js";
|
|
20
21
|
import { type CleanupPolicy, type WorkspaceOptions, type WorkspaceProvider } from "../workspace/index.js";
|
|
21
22
|
import type { WorkflowRegistry } from "./registry.js";
|
|
23
|
+
/** subflow 嵌套深度上限(顶层 depth=0;防御失控递归,对齐 v1 事故教训) */
|
|
24
|
+
export declare const MAX_SUBFLOW_DEPTH = 3;
|
|
25
|
+
/** 启动选项(start / detached / resume 共用) */
|
|
26
|
+
export interface RunLaunchOptions {
|
|
27
|
+
workspace?: WorkspaceBinding;
|
|
28
|
+
/**
|
|
29
|
+
* P2-9 本 run 的 checkpoint gate(scheduler 无人值守 / 调用级覆盖用)。
|
|
30
|
+
* 缺省继承当前 run 上下文(subflow)或回落全局绑定。
|
|
31
|
+
*/
|
|
32
|
+
gate?: CheckpointGate;
|
|
33
|
+
}
|
|
22
34
|
export interface WorkflowRunResult {
|
|
23
35
|
runId: string;
|
|
24
36
|
workflow: WorkflowIdentity;
|
|
@@ -38,11 +50,24 @@ export interface WorkspaceBinding {
|
|
|
38
50
|
/** 缺省 "on-success"(成功清理;失败保留现场便于 debug/resume) */
|
|
39
51
|
cleanup?: CleanupPolicy;
|
|
40
52
|
}
|
|
41
|
-
/** 启动新 run(默认最新版本;可用 options.version
|
|
53
|
+
/** 启动新 run(默认最新版本;可用 options.version 精确指定)。阻塞至完成 */
|
|
42
54
|
export declare function startWorkflow(registry: WorkflowRegistry, store: ExecutionStore, id: string, args: unknown, options?: {
|
|
43
55
|
version?: string;
|
|
44
|
-
|
|
45
|
-
|
|
56
|
+
} & RunLaunchOptions): Promise<WorkflowRunResult>;
|
|
57
|
+
export interface DetachedWorkflowRun {
|
|
58
|
+
runId: string;
|
|
59
|
+
workflow: WorkflowIdentity;
|
|
60
|
+
/** 完成时 resolve;失败/中止 reject(journal 已收口,错误仅留痕) */
|
|
61
|
+
completion: Promise<WorkflowRunResult>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* P1-3 后台启动:begin(同步可抛验证错误)后立即返回 runId,
|
|
65
|
+
* 执行在后台继续。结果不自动回传会话——用 workflow_control status 轮询
|
|
66
|
+
* (journal 是唯一事实源)。
|
|
67
|
+
*/
|
|
68
|
+
export declare function startWorkflowDetached(registry: WorkflowRegistry, store: ExecutionStore, id: string, args: unknown, options?: {
|
|
69
|
+
version?: string;
|
|
70
|
+
} & RunLaunchOptions): Promise<DetachedWorkflowRun>;
|
|
46
71
|
/**
|
|
47
72
|
* 从 journal 恢复 run:
|
|
48
73
|
* - workflow {id, version} 来自 journal,registry 精确版本解析(找不到即报错并列版本)
|
|
@@ -51,6 +76,4 @@ export declare function startWorkflow(registry: WorkflowRegistry, store: Executi
|
|
|
51
76
|
* durable resume = journal 状态 + 文件系统状态同时恢复;缺失即报错)
|
|
52
77
|
* - 已完成的 run 幂等重放(不执行任何步骤,仅重建最终报告)
|
|
53
78
|
*/
|
|
54
|
-
export declare function resumeWorkflow(registry: WorkflowRegistry, store: ExecutionStore, runId: string, options?:
|
|
55
|
-
workspace?: WorkspaceBinding;
|
|
56
|
-
}): Promise<WorkflowRunResult>;
|
|
79
|
+
export declare function resumeWorkflow(registry: WorkflowRegistry, store: ExecutionStore, runId: string, options?: RunLaunchOptions): Promise<WorkflowRunResult>;
|