@mickorz/opencode-agentic-workflow 0.3.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.
Files changed (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +406 -0
  3. package/dist/metrics/collector.d.ts +98 -0
  4. package/dist/metrics/collector.js +246 -0
  5. package/dist/metrics/collector.js.map +1 -0
  6. package/dist/observability/events.d.ts +99 -0
  7. package/dist/observability/events.js +55 -0
  8. package/dist/observability/events.js.map +1 -0
  9. package/dist/observability/observe.d.ts +7 -0
  10. package/dist/observability/observe.js +29 -0
  11. package/dist/observability/observe.js.map +1 -0
  12. package/dist/observability/trace.d.ts +26 -0
  13. package/dist/observability/trace.js +52 -0
  14. package/dist/observability/trace.js.map +1 -0
  15. package/dist/plugin/checkpoint-rpc.d.ts +74 -0
  16. package/dist/plugin/checkpoint-rpc.js +73 -0
  17. package/dist/plugin/checkpoint-rpc.js.map +1 -0
  18. package/dist/plugin/index.d.ts +24 -0
  19. package/dist/plugin/index.js +271 -0
  20. package/dist/plugin/index.js.map +1 -0
  21. package/dist/plugin/interactive-checkpoint-gate.d.ts +35 -0
  22. package/dist/plugin/interactive-checkpoint-gate.js +86 -0
  23. package/dist/plugin/interactive-checkpoint-gate.js.map +1 -0
  24. package/dist/plugin/opencode-v2-executor.d.ts +55 -0
  25. package/dist/plugin/opencode-v2-executor.js +92 -0
  26. package/dist/plugin/opencode-v2-executor.js.map +1 -0
  27. package/dist/plugin/policy-checkpoint-gate.d.ts +18 -0
  28. package/dist/plugin/policy-checkpoint-gate.js +27 -0
  29. package/dist/plugin/policy-checkpoint-gate.js.map +1 -0
  30. package/dist/plugin/price-table.d.ts +46 -0
  31. package/dist/plugin/price-table.js +44 -0
  32. package/dist/plugin/price-table.js.map +1 -0
  33. package/dist/plugin/tui.d.ts +12 -0
  34. package/dist/plugin/tui.js +53 -0
  35. package/dist/plugin/tui.js.map +1 -0
  36. package/dist/quality/check.d.ts +30 -0
  37. package/dist/quality/check.js +51 -0
  38. package/dist/quality/check.js.map +1 -0
  39. package/dist/quality/checkpoint.d.ts +44 -0
  40. package/dist/quality/checkpoint.js +55 -0
  41. package/dist/quality/checkpoint.js.map +1 -0
  42. package/dist/quality/json.d.ts +10 -0
  43. package/dist/quality/json.js +31 -0
  44. package/dist/quality/json.js.map +1 -0
  45. package/dist/quality/predicates.d.ts +17 -0
  46. package/dist/quality/predicates.js +44 -0
  47. package/dist/quality/predicates.js.map +1 -0
  48. package/dist/quality/verify.d.ts +50 -0
  49. package/dist/quality/verify.js +110 -0
  50. package/dist/quality/verify.js.map +1 -0
  51. package/dist/registry/definition.d.ts +66 -0
  52. package/dist/registry/definition.js +19 -0
  53. package/dist/registry/definition.js.map +1 -0
  54. package/dist/registry/errors.d.ts +31 -0
  55. package/dist/registry/errors.js +48 -0
  56. package/dist/registry/errors.js.map +1 -0
  57. package/dist/registry/index.d.ts +9 -0
  58. package/dist/registry/index.js +9 -0
  59. package/dist/registry/index.js.map +1 -0
  60. package/dist/registry/registry.d.ts +45 -0
  61. package/dist/registry/registry.js +117 -0
  62. package/dist/registry/registry.js.map +1 -0
  63. package/dist/registry/runner.d.ts +56 -0
  64. package/dist/registry/runner.js +199 -0
  65. package/dist/registry/runner.js.map +1 -0
  66. package/dist/registry/schema.d.ts +18 -0
  67. package/dist/registry/schema.js +73 -0
  68. package/dist/registry/schema.js.map +1 -0
  69. package/dist/runtime/command.d.ts +38 -0
  70. package/dist/runtime/command.js +61 -0
  71. package/dist/runtime/command.js.map +1 -0
  72. package/dist/runtime/engine.d.ts +17 -0
  73. package/dist/runtime/engine.js +31 -0
  74. package/dist/runtime/engine.js.map +1 -0
  75. package/dist/runtime/errors.d.ts +56 -0
  76. package/dist/runtime/errors.js +88 -0
  77. package/dist/runtime/errors.js.map +1 -0
  78. package/dist/runtime/executor.d.ts +46 -0
  79. package/dist/runtime/executor.js +16 -0
  80. package/dist/runtime/executor.js.map +1 -0
  81. package/dist/runtime/semaphore.d.ts +24 -0
  82. package/dist/runtime/semaphore.js +57 -0
  83. package/dist/runtime/semaphore.js.map +1 -0
  84. package/dist/state/file-store.d.ts +25 -0
  85. package/dist/state/file-store.js +138 -0
  86. package/dist/state/file-store.js.map +1 -0
  87. package/dist/state/journal.d.ts +83 -0
  88. package/dist/state/journal.js +59 -0
  89. package/dist/state/journal.js.map +1 -0
  90. package/dist/state/recorder.d.ts +63 -0
  91. package/dist/state/recorder.js +138 -0
  92. package/dist/state/recorder.js.map +1 -0
  93. package/dist/state/store.d.ts +23 -0
  94. package/dist/state/store.js +14 -0
  95. package/dist/state/store.js.map +1 -0
  96. package/dist/workflow/agent.d.ts +8 -0
  97. package/dist/workflow/agent.js +38 -0
  98. package/dist/workflow/agent.js.map +1 -0
  99. package/dist/workflow/fallback.d.ts +15 -0
  100. package/dist/workflow/fallback.js +32 -0
  101. package/dist/workflow/fallback.js.map +1 -0
  102. package/dist/workflow/parallel.d.ts +14 -0
  103. package/dist/workflow/parallel.js +62 -0
  104. package/dist/workflow/parallel.js.map +1 -0
  105. package/dist/workflow/phase.d.ts +7 -0
  106. package/dist/workflow/phase.js +12 -0
  107. package/dist/workflow/phase.js.map +1 -0
  108. package/dist/workflow/reliable.d.ts +50 -0
  109. package/dist/workflow/reliable.js +92 -0
  110. package/dist/workflow/reliable.js.map +1 -0
  111. package/dist/workflow/retry.d.ts +28 -0
  112. package/dist/workflow/retry.js +53 -0
  113. package/dist/workflow/retry.js.map +1 -0
  114. package/dist/workflow/sequence.d.ts +40 -0
  115. package/dist/workflow/sequence.js +100 -0
  116. package/dist/workflow/sequence.js.map +1 -0
  117. package/dist/workflow/smoke.d.ts +17 -0
  118. package/dist/workflow/smoke.js +38 -0
  119. package/dist/workflow/smoke.js.map +1 -0
  120. package/dist/workflows/artifact.d.ts +24 -0
  121. package/dist/workflows/artifact.js +71 -0
  122. package/dist/workflows/artifact.js.map +1 -0
  123. package/dist/workflows/index.d.ts +19 -0
  124. package/dist/workflows/index.js +40 -0
  125. package/dist/workflows/index.js.map +1 -0
  126. package/dist/workflows/reliable.d.ts +18 -0
  127. package/dist/workflows/reliable.js +32 -0
  128. package/dist/workflows/reliable.js.map +1 -0
  129. package/dist/workflows/smoke.d.ts +13 -0
  130. package/dist/workflows/smoke.js +26 -0
  131. package/dist/workflows/smoke.js.map +1 -0
  132. package/dist/workspace/ambient.d.ts +12 -0
  133. package/dist/workspace/ambient.js +17 -0
  134. package/dist/workspace/ambient.js.map +1 -0
  135. package/dist/workspace/git-worktree.d.ts +29 -0
  136. package/dist/workspace/git-worktree.js +110 -0
  137. package/dist/workspace/git-worktree.js.map +1 -0
  138. package/dist/workspace/index.d.ts +6 -0
  139. package/dist/workspace/index.js +6 -0
  140. package/dist/workspace/index.js.map +1 -0
  141. package/dist/workspace/provider.d.ts +61 -0
  142. package/dist/workspace/provider.js +15 -0
  143. package/dist/workspace/provider.js.map +1 -0
  144. package/package.json +71 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * verify —— 语义质量验证节点(P1.2)
3
+ *
4
+ * 与 check 的职责边界:
5
+ * check = 确定性验证(谓词求值,可重复)
6
+ * verify = 语义质量验证(reviewer agent 评审「做得对不对/好不好」)
7
+ *
8
+ * 机制:
9
+ * verify(artifact, { reviewers: N, criteria })
10
+ * -> N 个 reviewer 子 agent 并行评审(复用 parallel() 组合子)
11
+ * -> 每个 reviewer 被要求输出 JSON verdict(宽松解析,解析失败按 fail)
12
+ * -> 全员 pass 才 passed=true(严格语义;后续失败策略在此之上构建)
13
+ *
14
+ * 与 check 对称的双 API:
15
+ * verify() -> 永不抛错,返回 VerifyResult
16
+ * assertVerify() -> 失败抛 WorkflowVerifyError
17
+ */
18
+ import type { AgentResult } from "../runtime/executor.js";
19
+ import { WorkflowError } from "../runtime/errors.js";
20
+ /** 单个 reviewer 的评审结论 */
21
+ export interface ReviewVerdict {
22
+ /** reviewer 序号(1 起) */
23
+ reviewer: number;
24
+ verdict: "pass" | "fail";
25
+ summary: string;
26
+ issues: string[];
27
+ }
28
+ export interface VerifyOptions {
29
+ /** 并行评审人数,默认 1;至少 1 */
30
+ reviewers?: number;
31
+ /** 验证标准(评审依据),例如「符合登录模块需求,无安全漏洞」 */
32
+ criteria?: string;
33
+ /** 结果标签,默认 "semantic verify" */
34
+ label?: string;
35
+ }
36
+ export interface VerifyResult {
37
+ label: string;
38
+ /** 所有 reviewer 均 pass 才为 true */
39
+ passed: boolean;
40
+ verdicts: ReviewVerdict[];
41
+ }
42
+ /** assertVerify 失败时抛出,携带完整 VerifyResult 供失败策略消费 */
43
+ export declare class WorkflowVerifyError extends WorkflowError {
44
+ readonly result: VerifyResult;
45
+ constructor(result: VerifyResult);
46
+ }
47
+ /** 语义质量验证:N 个 reviewer 并行评审,全员 pass 才通过;永不抛错 */
48
+ export declare function verify(artifact: string | AgentResult | object, options?: VerifyOptions): Promise<VerifyResult>;
49
+ /** verify 的严格版:失败抛 WorkflowVerifyError,成功原样返回 VerifyResult */
50
+ export declare function assertVerify(artifact: string | AgentResult | object, options?: VerifyOptions): Promise<VerifyResult>;
@@ -0,0 +1,110 @@
1
+ /**
2
+ * verify —— 语义质量验证节点(P1.2)
3
+ *
4
+ * 与 check 的职责边界:
5
+ * check = 确定性验证(谓词求值,可重复)
6
+ * verify = 语义质量验证(reviewer agent 评审「做得对不对/好不好」)
7
+ *
8
+ * 机制:
9
+ * verify(artifact, { reviewers: N, criteria })
10
+ * -> N 个 reviewer 子 agent 并行评审(复用 parallel() 组合子)
11
+ * -> 每个 reviewer 被要求输出 JSON verdict(宽松解析,解析失败按 fail)
12
+ * -> 全员 pass 才 passed=true(严格语义;后续失败策略在此之上构建)
13
+ *
14
+ * 与 check 对称的双 API:
15
+ * verify() -> 永不抛错,返回 VerifyResult
16
+ * assertVerify() -> 失败抛 WorkflowVerifyError
17
+ */
18
+ import { WorkflowError } from "../runtime/errors.js";
19
+ import { emitEvent } from "../observability/events.js";
20
+ import { agent } from "../workflow/agent.js";
21
+ import { parallel } from "../workflow/parallel.js";
22
+ import { phase } from "../workflow/phase.js";
23
+ import { parseJsonLoose } from "./json.js";
24
+ /** assertVerify 失败时抛出,携带完整 VerifyResult 供失败策略消费 */
25
+ export class WorkflowVerifyError extends WorkflowError {
26
+ result;
27
+ constructor(result) {
28
+ const failed = result.verdicts
29
+ .filter((v) => v.verdict === "fail")
30
+ .map((v) => `#${v.reviewer}: ${v.summary}`)
31
+ .join("; ");
32
+ super(`[workflow] verify failed: ${result.label}${failed ? ` (${failed})` : ""}`);
33
+ this.name = "WorkflowVerifyError";
34
+ this.result = result;
35
+ }
36
+ }
37
+ /** 输入产物归一化为文本:string 原样,对象取 output 字段或 JSON 序列化 */
38
+ function artifactToText(artifact) {
39
+ if (typeof artifact === "string")
40
+ return artifact;
41
+ const record = artifact;
42
+ if (typeof record.output === "string")
43
+ return record.output;
44
+ return JSON.stringify(artifact, null, 2);
45
+ }
46
+ function buildReviewerPrompt(artifact, reviewerNo, reviewers, criteria) {
47
+ return [
48
+ `你是第 ${reviewerNo}/${reviewers} 号独立评审员。请评审下面的产物,给出严格 JSON 结论。`,
49
+ criteria ? `评审标准:${criteria}` : "评审标准:产物完整、正确、可交付。",
50
+ "",
51
+ "=== 待评审产物 ===",
52
+ artifact,
53
+ "=== 产物结束 ===",
54
+ "",
55
+ '只输出 JSON,不要任何其他文字,也不要调用任何工具,直接给出结论,格式:',
56
+ '{"verdict":"pass|fail","summary":"一句话结论","issues":["问题1","问题2"]}',
57
+ "pass 与 fail 只能二选一;没有问题时 issues 为空数组。",
58
+ ].join("\n");
59
+ }
60
+ /** 解析单个 reviewer 的输出为 verdict;解析失败按 fail 处理 */
61
+ function toVerdict(reviewer, output) {
62
+ const parsed = parseJsonLoose(output);
63
+ if (parsed &&
64
+ (parsed.verdict === "pass" || parsed.verdict === "fail") &&
65
+ typeof parsed.summary === "string") {
66
+ return {
67
+ reviewer,
68
+ verdict: parsed.verdict,
69
+ summary: parsed.summary,
70
+ issues: Array.isArray(parsed.issues)
71
+ ? parsed.issues.filter((i) => typeof i === "string")
72
+ : [],
73
+ };
74
+ }
75
+ return {
76
+ reviewer,
77
+ verdict: "fail",
78
+ summary: "reviewer output was not valid JSON with verdict/summary",
79
+ issues: [output.slice(0, 200)],
80
+ };
81
+ }
82
+ /** 语义质量验证:N 个 reviewer 并行评审,全员 pass 才通过;永不抛错 */
83
+ export async function verify(artifact, options) {
84
+ const reviewers = Math.max(1, Math.floor(options?.reviewers ?? 1));
85
+ const label = options?.label ?? "semantic verify";
86
+ phase(`Verify(${label}, ${reviewers} reviewer${reviewers > 1 ? "s" : ""})`);
87
+ const text = artifactToText(artifact);
88
+ const outputs = await parallel(Array.from({ length: reviewers }, (_, i) => () => agent(buildReviewerPrompt(text, i + 1, reviewers, options?.criteria))));
89
+ const verdicts = outputs.map((result, i) => toVerdict(i + 1, result.output));
90
+ const passed = verdicts.every((v) => v.verdict === "pass");
91
+ console.log(`[agentic-workflow] verify ${passed ? "ok" : "FAIL"}: ${label} ` +
92
+ `(${verdicts.filter((v) => v.verdict === "pass").length}/${verdicts.length} pass)`);
93
+ emitEvent({
94
+ type: "verify.completed",
95
+ label,
96
+ passed,
97
+ passedCount: verdicts.filter((v) => v.verdict === "pass").length,
98
+ totalCount: verdicts.length,
99
+ });
100
+ return { label, passed, verdicts };
101
+ }
102
+ /** verify 的严格版:失败抛 WorkflowVerifyError,成功原样返回 VerifyResult */
103
+ export async function assertVerify(artifact, options) {
104
+ const result = await verify(artifact, options);
105
+ if (!result.passed) {
106
+ throw new WorkflowVerifyError(result);
107
+ }
108
+ return result;
109
+ }
110
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/quality/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;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;AA2B1C,mDAAmD;AACnD,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAC3C,MAAM,CAAc;IAE7B,YAAY,MAAoB;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,KAAK,CAAC,6BAA6B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACjF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED,mDAAmD;AACnD,SAAS,cAAc,CAAC,QAAuC;IAC7D,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAA;IACjD,MAAM,MAAM,GAAG,QAAgC,CAAA;IAC/C,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAA;IAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,UAAkB,EAClB,SAAiB,EACjB,QAAiB;IAEjB,OAAO;QACL,OAAO,UAAU,IAAI,SAAS,gCAAgC;QAC9D,QAAQ,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,mBAAmB;QACnD,EAAE;QACF,eAAe;QACf,QAAQ;QACR,cAAc;QACd,EAAE;QACF,wCAAwC;QACxC,kEAAkE;QAClE,sCAAsC;KACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,+CAA+C;AAC/C,SAAS,SAAS,CAAC,QAAgB,EAAE,MAAc;IACjD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAEvB,CAAA;IAEb,IACE,MAAM;QACN,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC;QACxD,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAClC,CAAC;QACD,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;gBAClC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBACjE,CAAC,CAAC,EAAE;SACP,CAAA;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,yDAAyD;QAClE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;KAC/B,CAAA;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,QAAuC,EACvC,OAAuB;IAEvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,iBAAiB,CAAA;IAEjD,KAAK,CAAC,UAAU,KAAK,KAAK,SAAS,YAAY,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAE3E,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IAErC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAC/C,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CACtE,CACF,CAAA;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAA;IAE1D,OAAO,CAAC,GAAG,CACT,6BAA6B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,GAAG;QAC9D,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,QAAQ,CACrF,CAAA;IAED,SAAS,CAAC;QACR,IAAI,EAAE,kBAAkB;QACxB,KAAK;QACL,MAAM;QACN,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM;QAChE,UAAU,EAAE,QAAQ,CAAC,MAAM;KAC5B,CAAC,CAAA;IAEF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AACpC,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAuC,EACvC,OAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * WorkflowDefinition —— workflow 的元数据契约(P2.5)
3
+ *
4
+ * 一个 workflow = 一份声明式定义:
5
+ * { id, version, description, argsSchema, stepNames, run }
6
+ *
7
+ * - version 是第一公民:journal 记录 {id, version},resume 经 registry
8
+ * 解析到**精确版本**(绝不隐式取最新),步骤结构变更必须升版本。
9
+ * - argsSchema 用项目既有的 JSON Schema 风格(最小依赖,不引入 Zod),
10
+ * 服务于:tool schema 生成 / args 校验 / 未来 TUI 表单与 Hub 展示。
11
+ * - run(args, ctx):ctx 携带执行身份(runId / mode / journal / runSteps),
12
+ * definition 内部统一用 ctx.runSteps(...) 编排步骤——
13
+ * start 与 resume 的差异被 ctx 完全封装。
14
+ */
15
+ import type { ArgsSchema } from "./schema.js";
16
+ import type { RunJournal } from "../state/recorder.js";
17
+ /** args 声明契约(JSON Schema 子集,见 schema.ts) */
18
+ export type { ArgsSchema };
19
+ /** 步骤函数(与 sequence 的 Step 兼容) */
20
+ export type StepFn<T> = (prev?: T) => Promise<T>;
21
+ /**
22
+ * 执行上下文:registry runner 构造并传给 definition.run。
23
+ *
24
+ * mode:
25
+ * - "start" 全新执行(runSteps = sequence + journal 记录)
26
+ * - "resume" 从 journal 恢复(runSteps = resumeSequence:跳过 completed
27
+ * 前缀,从首个未完成步骤重跑)
28
+ */
29
+ export interface WorkflowContext {
30
+ runId: string;
31
+ mode: "start" | "resume";
32
+ /** journal(配置了 ExecutionStore 时存在;definition 应传给 runSteps) */
33
+ journal?: RunJournal;
34
+ /**
35
+ * 隔离工作区根目录(P2.7;启用隔离且已创建/附着时存在)。
36
+ * 子 agent 的 cwd 会自动绑定到这里;文件产物应写到该目录下。
37
+ */
38
+ workspaceRoot?: string;
39
+ /** 编排步骤的统一入口(自动处理 start/resume 与 journal 记录) */
40
+ runSteps<T>(steps: Array<StepFn<T>>, options?: RunStepsOptions): Promise<T | undefined>;
41
+ }
42
+ export interface RunStepsOptions {
43
+ /** 失败模式,默认 fail-fast */
44
+ onFailure?: "fail-fast" | "continue";
45
+ /** 步骤名(错误定位与 journal 记录) */
46
+ stepNames?: string[];
47
+ }
48
+ export interface WorkflowDefinition<TArgs = unknown, TResult = unknown> {
49
+ /** 唯一标识(workflow tool 的 flow 参数值 / journal.workflow.id) */
50
+ id: string;
51
+ /** 语义化版本:步骤结构或行为变更时必须升版(resume 依赖精确版本解析) */
52
+ version: string;
53
+ /** 人读描述(进入工具描述,供主 agent 选择) */
54
+ description?: string;
55
+ /** 入参契约(JSON Schema 子集);undefined 表示无参 */
56
+ argsSchema?: ArgsSchema;
57
+ /**
58
+ * 步骤名(静态声明;同时决定 journal 的 stepCount/stepNames)。
59
+ * resume 依赖步骤序号稳定——增删/重排步骤必须升 version。
60
+ */
61
+ stepNames?: string[];
62
+ /** 入口:args(已经校验)+ ctx -> 结果(约定带 output 文本字段) */
63
+ run(args: TArgs, context: WorkflowContext): Promise<TResult>;
64
+ }
65
+ /** defineWorkflow:恒等函数,仅收紧类型(DX 糖) */
66
+ export declare function defineWorkflow<TArgs = unknown, TResult = unknown>(definition: WorkflowDefinition<TArgs, TResult>): WorkflowDefinition<TArgs, TResult>;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * WorkflowDefinition —— workflow 的元数据契约(P2.5)
3
+ *
4
+ * 一个 workflow = 一份声明式定义:
5
+ * { id, version, description, argsSchema, stepNames, run }
6
+ *
7
+ * - version 是第一公民:journal 记录 {id, version},resume 经 registry
8
+ * 解析到**精确版本**(绝不隐式取最新),步骤结构变更必须升版本。
9
+ * - argsSchema 用项目既有的 JSON Schema 风格(最小依赖,不引入 Zod),
10
+ * 服务于:tool schema 生成 / args 校验 / 未来 TUI 表单与 Hub 展示。
11
+ * - run(args, ctx):ctx 携带执行身份(runId / mode / journal / runSteps),
12
+ * definition 内部统一用 ctx.runSteps(...) 编排步骤——
13
+ * start 与 resume 的差异被 ctx 完全封装。
14
+ */
15
+ /** defineWorkflow:恒等函数,仅收紧类型(DX 糖) */
16
+ export function defineWorkflow(definition) {
17
+ return definition;
18
+ }
19
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/registry/definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0DH,sCAAsC;AACtC,MAAM,UAAU,cAAc,CAC5B,UAA8C;IAE9C,OAAO,UAAU,CAAA;AACnB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Registry 错误家族(P2.5)
3
+ *
4
+ * 全部继承 WorkflowError:注册/解析/校验失败与执行失败共用同一
5
+ * 错误家族,调用方(workflow tool)统一转文本。
6
+ */
7
+ import { WorkflowError } from "../runtime/errors.js";
8
+ /** 重复注册(同 id + 同 version) */
9
+ export declare class WorkflowRegistrationError extends WorkflowError {
10
+ constructor(id: string, version: string);
11
+ }
12
+ /** workflow(或精确版本)未注册;消息列出可用版本,供 resume 诊断 */
13
+ export declare class WorkflowNotFoundError extends WorkflowError {
14
+ constructor(id: string, version: string | undefined, available: string[]);
15
+ }
16
+ /** args 校验失败(JSON Schema 子集) */
17
+ export declare class WorkflowArgsError extends WorkflowError {
18
+ readonly problems: string[];
19
+ constructor(id: string, problems: string[]);
20
+ }
21
+ /** run 执行失败(携带 runId,供 resume) */
22
+ export declare class WorkflowExecutionError extends WorkflowError {
23
+ readonly runId: string;
24
+ readonly workflowId: string;
25
+ readonly workflowVersion: string;
26
+ constructor(identity: {
27
+ runId: string;
28
+ id: string;
29
+ version: string;
30
+ }, cause: unknown);
31
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Registry 错误家族(P2.5)
3
+ *
4
+ * 全部继承 WorkflowError:注册/解析/校验失败与执行失败共用同一
5
+ * 错误家族,调用方(workflow tool)统一转文本。
6
+ */
7
+ import { WorkflowError } from "../runtime/errors.js";
8
+ /** 重复注册(同 id + 同 version) */
9
+ export class WorkflowRegistrationError extends WorkflowError {
10
+ constructor(id, version) {
11
+ super(`workflow already registered: ${id}@${version}`);
12
+ this.name = "WorkflowRegistrationError";
13
+ }
14
+ }
15
+ /** workflow(或精确版本)未注册;消息列出可用版本,供 resume 诊断 */
16
+ export class WorkflowNotFoundError extends WorkflowError {
17
+ constructor(id, version, available) {
18
+ super(version === undefined
19
+ ? `workflow not found: ${id}. available: ${available.join(", ") || "(none)"}`
20
+ : `workflow version not found: ${id}@${version}. ` +
21
+ `available versions of ${id}: ${available.join(", ") || "(none)"}`);
22
+ this.name = "WorkflowNotFoundError";
23
+ }
24
+ }
25
+ /** args 校验失败(JSON Schema 子集) */
26
+ export class WorkflowArgsError extends WorkflowError {
27
+ problems;
28
+ constructor(id, problems) {
29
+ super(`invalid args for workflow ${id}: ${problems.join("; ")}`);
30
+ this.name = "WorkflowArgsError";
31
+ this.problems = problems;
32
+ }
33
+ }
34
+ /** run 执行失败(携带 runId,供 resume) */
35
+ export class WorkflowExecutionError extends WorkflowError {
36
+ runId;
37
+ workflowId;
38
+ workflowVersion;
39
+ constructor(identity, cause) {
40
+ const message = cause instanceof Error ? cause.message : String(cause);
41
+ super(`workflow ${identity.id}@${identity.version} run ${identity.runId} failed: ${message}`, { cause });
42
+ this.name = "WorkflowExecutionError";
43
+ this.runId = identity.runId;
44
+ this.workflowId = identity.id;
45
+ this.workflowVersion = identity.version;
46
+ }
47
+ }
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/registry/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,6BAA6B;AAC7B,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IAC1D,YAAY,EAAU,EAAE,OAAe;QACrC,KAAK,CAAC,gCAAgC,EAAE,IAAI,OAAO,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;IACzC,CAAC;CACF;AAED,8CAA8C;AAC9C,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,EAAU,EAAE,OAA2B,EAAE,SAAmB;QACtE,KAAK,CACH,OAAO,KAAK,SAAS;YACnB,CAAC,CAAC,uBAAuB,EAAE,gBAAgB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;YAC7E,CAAC,CAAC,+BAA+B,EAAE,IAAI,OAAO,IAAI;gBAChD,yBAAyB,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CACvE,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AAED,gCAAgC;AAChC,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACzC,QAAQ,CAAU;IAE3B,YAAY,EAAU,EAAE,QAAkB;QACxC,KAAK,CAAC,6BAA6B,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChE,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CACF;AAED,kCAAkC;AAClC,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IAC9C,KAAK,CAAQ;IACb,UAAU,CAAQ;IAClB,eAAe,CAAQ;IAEhC,YACE,QAAwD,EACxD,KAAc;QAEd,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,KAAK,CACH,YAAY,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,QAAQ,QAAQ,CAAC,KAAK,YAAY,OAAO,EAAE,EACtF,EAAE,KAAK,EAAE,CACV,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;QACpC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAA;QAC7B,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAA;IACzC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Registry 公共出口(P2.5)
3
+ */
4
+ export type { WorkflowDefinition, WorkflowContext, RunStepsOptions, StepFn, ArgsSchema, } from "./definition.js";
5
+ export { defineWorkflow } from "./definition.js";
6
+ export { validateArgs } from "./schema.js";
7
+ export { WorkflowRegistry, type AnyWorkflowDefinition, } from "./registry.js";
8
+ export { WorkflowArgsError, WorkflowExecutionError, WorkflowNotFoundError, WorkflowRegistrationError, } from "./errors.js";
9
+ export { resumeWorkflow, startWorkflow, type WorkflowRunResult, type WorkspaceBinding, } from "./runner.js";
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Registry 公共出口(P2.5)
3
+ */
4
+ export { defineWorkflow } from "./definition.js";
5
+ export { validateArgs } from "./schema.js";
6
+ export { WorkflowRegistry, } from "./registry.js";
7
+ export { WorkflowArgsError, WorkflowExecutionError, WorkflowNotFoundError, WorkflowRegistrationError, } from "./errors.js";
8
+ export { resumeWorkflow, startWorkflow, } from "./runner.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EACL,gBAAgB,GAEjB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,cAAc,EACd,aAAa,GAGd,MAAM,aAAa,CAAA"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * WorkflowRegistry(P2.5)—— 版本感知的 workflow 注册与发现
3
+ *
4
+ * - register:同 id 不同 version 允许共存(升级/回滚的关键);
5
+ * 同 id + 同 version 重复注册抛错(程序员错误,尽早暴露)。
6
+ * - get(id):取该 id 的**最新版本**(semver 最高;非 semver 按注册序最后者,
7
+ * 排在所有 semver 之后)——用于「启动新 run」。
8
+ * - get(id, version):**精确版本**解析——用于 resume:
9
+ * journal 记录的 {id, version} 必须精确命中,绝不隐式取最新,
10
+ * 否则步骤结构变更后旧 journal 恢复会错位(用户态安全约束)。
11
+ *
12
+ * 第一版仅支持代码注册;动态发现 / marketplace / 热加载明确不做(P2 范围外)。
13
+ */
14
+ import type { WorkflowDefinition } from "./definition.js";
15
+ /** 注册边界类型:注册表存异构定义,run 的 args 参数逆变,故边界用 any(仅此边界) */
16
+ export type AnyWorkflowDefinition = WorkflowDefinition<any>;
17
+ export declare class WorkflowRegistry {
18
+ /** key = `${id}@${version}`,插入序保留注册顺序 */
19
+ private readonly definitions;
20
+ /** 注册 workflow;同 id + 同 version 重复抛错 */
21
+ register(definition: AnyWorkflowDefinition): this;
22
+ /** 同一 id 的全部已注册版本(注册序) */
23
+ versions(id: string): AnyWorkflowDefinition[];
24
+ /** id 的最新版本(semver 最高;非 semver 按注册序最后,低于全部 semver) */
25
+ latest(id: string): AnyWorkflowDefinition | undefined;
26
+ /**
27
+ * 解析 workflow:
28
+ * - get(id) -> 最新版本(启动新 run 用)
29
+ * - get(id, version) -> 精确版本(resume 用;未命中抛 WorkflowNotFoundError)
30
+ */
31
+ get(id: string, version?: string): AnyWorkflowDefinition | undefined;
32
+ /**
33
+ * 解析(严格版):未命中直接抛错并列出可用版本(resume 诊断友好)。
34
+ * 工具层用它把「找不到」转成可读文本。
35
+ */
36
+ resolve(id: string, version?: string): AnyWorkflowDefinition;
37
+ /** 全部定义(注册序,含同 id 多版本) */
38
+ list(): AnyWorkflowDefinition[];
39
+ /** 全部 id(去重,注册序) */
40
+ ids(): string[];
41
+ /** 每个 id 的最新版本各一条(工具枚举/描述用) */
42
+ listLatest(): AnyWorkflowDefinition[];
43
+ /** 摘要(工具描述用):`id@version: description` 每行一条(按最新版本) */
44
+ summarize(): string;
45
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * WorkflowRegistry(P2.5)—— 版本感知的 workflow 注册与发现
3
+ *
4
+ * - register:同 id 不同 version 允许共存(升级/回滚的关键);
5
+ * 同 id + 同 version 重复注册抛错(程序员错误,尽早暴露)。
6
+ * - get(id):取该 id 的**最新版本**(semver 最高;非 semver 按注册序最后者,
7
+ * 排在所有 semver 之后)——用于「启动新 run」。
8
+ * - get(id, version):**精确版本**解析——用于 resume:
9
+ * journal 记录的 {id, version} 必须精确命中,绝不隐式取最新,
10
+ * 否则步骤结构变更后旧 journal 恢复会错位(用户态安全约束)。
11
+ *
12
+ * 第一版仅支持代码注册;动态发现 / marketplace / 热加载明确不做(P2 范围外)。
13
+ */
14
+ import { WorkflowNotFoundError, WorkflowRegistrationError } from "./errors.js";
15
+ /** 解析 semver "1.2.3" -> [1,2,3];非 semver 返回 null */
16
+ function parseSemver(version) {
17
+ const match = /^(\d+)\.(\d+)\.(\d+)/.exec(version.trim());
18
+ if (!match)
19
+ return null;
20
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
21
+ }
22
+ function compareSemver(a, b) {
23
+ const sa = parseSemver(a);
24
+ const sb = parseSemver(b);
25
+ // 非 semver 一律低于 semver;两个非 semver 之间按注册序(外层处理)
26
+ if (sa && !sb)
27
+ return 1;
28
+ if (!sa && sb)
29
+ return -1;
30
+ if (sa && sb) {
31
+ for (let i = 0; i < 3; i++) {
32
+ if (sa[i] !== sb[i])
33
+ return sa[i] - sb[i];
34
+ }
35
+ return 0;
36
+ }
37
+ return 0;
38
+ }
39
+ export class WorkflowRegistry {
40
+ /** key = `${id}@${version}`,插入序保留注册顺序 */
41
+ definitions = new Map();
42
+ /** 注册 workflow;同 id + 同 version 重复抛错 */
43
+ register(definition) {
44
+ if (!definition.id || typeof definition.id !== "string") {
45
+ throw new Error("[agentic-workflow] workflow definition requires a non-empty id");
46
+ }
47
+ if (!definition.version || typeof definition.version !== "string") {
48
+ throw new Error(`[agentic-workflow] workflow definition ${definition.id} requires a non-empty version`);
49
+ }
50
+ const key = `${definition.id}@${definition.version}`;
51
+ if (this.definitions.has(key)) {
52
+ throw new WorkflowRegistrationError(definition.id, definition.version);
53
+ }
54
+ this.definitions.set(key, definition);
55
+ return this;
56
+ }
57
+ /** 同一 id 的全部已注册版本(注册序) */
58
+ versions(id) {
59
+ return this.list().filter((d) => d.id === id);
60
+ }
61
+ /** id 的最新版本(semver 最高;非 semver 按注册序最后,低于全部 semver) */
62
+ latest(id) {
63
+ const versions = this.versions(id);
64
+ if (versions.length === 0)
65
+ return undefined;
66
+ return versions.reduce((best, current) => compareSemver(current.version, best.version) >= 0 ? current : best);
67
+ }
68
+ /**
69
+ * 解析 workflow:
70
+ * - get(id) -> 最新版本(启动新 run 用)
71
+ * - get(id, version) -> 精确版本(resume 用;未命中抛 WorkflowNotFoundError)
72
+ */
73
+ get(id, version) {
74
+ if (version === undefined)
75
+ return this.latest(id);
76
+ const exact = this.definitions.get(`${id}@${version}`);
77
+ return exact;
78
+ }
79
+ /**
80
+ * 解析(严格版):未命中直接抛错并列出可用版本(resume 诊断友好)。
81
+ * 工具层用它把「找不到」转成可读文本。
82
+ */
83
+ resolve(id, version) {
84
+ const found = this.get(id, version);
85
+ if (!found) {
86
+ const available = version === undefined ? this.ids() : this.versions(id).map((d) => d.version);
87
+ throw new WorkflowNotFoundError(id, version, available);
88
+ }
89
+ return found;
90
+ }
91
+ /** 全部定义(注册序,含同 id 多版本) */
92
+ list() {
93
+ return [...this.definitions.values()];
94
+ }
95
+ /** 全部 id(去重,注册序) */
96
+ ids() {
97
+ const seen = [];
98
+ for (const definition of this.definitions.values()) {
99
+ if (!seen.includes(definition.id))
100
+ seen.push(definition.id);
101
+ }
102
+ return seen;
103
+ }
104
+ /** 每个 id 的最新版本各一条(工具枚举/描述用) */
105
+ listLatest() {
106
+ return this.ids()
107
+ .map((id) => this.latest(id))
108
+ .filter((d) => d !== undefined);
109
+ }
110
+ /** 摘要(工具描述用):`id@version: description` 每行一条(按最新版本) */
111
+ summarize() {
112
+ return this.listLatest()
113
+ .map((d) => `- ${d.id}@${d.version}${d.description ? `: ${d.description}` : ""}`)
114
+ .join("\n");
115
+ }
116
+ }
117
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Registry Runner(P2.5 journal 集成)
3
+ *
4
+ * 把 Definition / Registry / Journal / Resume 正式串起来:
5
+ *
6
+ * startWorkflow: registry.resolve(id)[@version] -> args 校验 -> journal 落盘
7
+ * -> definition.run(args, ctx{mode:"start"})
8
+ * -> ctx.runSteps = sequence + journal 记录
9
+ *
10
+ * resumeWorkflow: store.getRun(runId) -> workflow {id, version}
11
+ * -> registry.resolve(id, version) ← 精确版本,绝不取最新
12
+ * -> definition.run(journal.args, ctx{mode:"resume"})
13
+ * -> ctx.runSteps = resumeSequence(跳过 completed 前缀)
14
+ *
15
+ * definition 只感知 ctx.runSteps——start/resume 差异被完全封装;
16
+ * 失败统一抛 WorkflowExecutionError(携带 runId,供工具层提示恢复入口)。
17
+ */
18
+ import type { WorkflowIdentity } from "../state/journal.js";
19
+ import type { ExecutionStore } from "../state/store.js";
20
+ import { type CleanupPolicy, type WorkspaceOptions, type WorkspaceProvider } from "../workspace/index.js";
21
+ import type { WorkflowRegistry } from "./registry.js";
22
+ export interface WorkflowRunResult {
23
+ runId: string;
24
+ workflow: WorkflowIdentity;
25
+ output: string;
26
+ }
27
+ /**
28
+ * 无持久化直跑(插件未配置 journalDir 时的兼容路径):
29
+ * 经注册表解析 + args 校验,但不落 journal、不可恢复。
30
+ */
31
+ export declare function runWorkflowInline(registry: WorkflowRegistry, id: string, args: unknown): Promise<{
32
+ output: string;
33
+ }>;
34
+ /** 隔离绑定:provider + 创建参数 + 清理策略(start/resume 均可传) */
35
+ export interface WorkspaceBinding {
36
+ provider: WorkspaceProvider;
37
+ options?: WorkspaceOptions;
38
+ /** 缺省 "on-success"(成功清理;失败保留现场便于 debug/resume) */
39
+ cleanup?: CleanupPolicy;
40
+ }
41
+ /** 启动新 run(默认最新版本;可用 options.version 精确指定) */
42
+ export declare function startWorkflow(registry: WorkflowRegistry, store: ExecutionStore, id: string, args: unknown, options?: {
43
+ version?: string;
44
+ workspace?: WorkspaceBinding;
45
+ }): Promise<WorkflowRunResult>;
46
+ /**
47
+ * 从 journal 恢复 run:
48
+ * - workflow {id, version} 来自 journal,registry 精确版本解析(找不到即报错并列版本)
49
+ * - args 取 journal 记录(无需调用方重新提供)
50
+ * - journal 记录了 workspace 身份时,**重新附着原工作区**(绝不重建——
51
+ * durable resume = journal 状态 + 文件系统状态同时恢复;缺失即报错)
52
+ * - 已完成的 run 幂等重放(不执行任何步骤,仅重建最终报告)
53
+ */
54
+ export declare function resumeWorkflow(registry: WorkflowRegistry, store: ExecutionStore, runId: string, options?: {
55
+ workspace?: WorkspaceBinding;
56
+ }): Promise<WorkflowRunResult>;