@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,40 @@
1
+ /**
2
+ * sequence() —— 顺序执行步骤,上一步结果作为下一步入参
3
+ * (P1.3 失败语义 / P2.2 journal 记录与恢复)
4
+ *
5
+ * onFailure 两种模式:
6
+ * "fail-fast"(默认):第一个失败步骤抛 WorkflowSequenceError,剩余步骤不再执行。
7
+ * "continue" :失败步骤被记录,后续步骤仍执行(prev = 最后一次成功值),
8
+ * 全部执行完后若存在失败,仍抛 WorkflowSequenceError(累积全部错误)。
9
+ *
10
+ * journal(可选):传入 RunJournal 后每次状态变更落盘,
11
+ * 配合 resumeSequence() 可在 run 中断后从 completed 前缀恢复续跑。
12
+ *
13
+ * resumeSequence()(P2.2):从 journal 恢复——
14
+ * Step1 ✅ Step2 ✅ Step3 ❌ Step4 -
15
+ * -> restart -> 跳过 1/2(prev 取 journal 输出),从 Step3 重跑
16
+ * 注意:重跑意味着 Step3 的副作用会再次发生(非幂等步骤需自行保证安全)。
17
+ * 仅支持 sequence 的恢复;parallel/nested 的恢复不在 P2.2 范围。
18
+ */
19
+ import { RunJournal } from "../state/recorder.js";
20
+ import type { ExecutionStore } from "../state/store.js";
21
+ export interface SequenceOptions {
22
+ /** 失败模式,默认 "fail-fast" */
23
+ onFailure?: "fail-fast" | "continue";
24
+ /** 步骤名(用于错误定位),可选 */
25
+ stepNames?: string[];
26
+ /** 可选 journal:记录本次执行(持久化;配合 resumeSequence 可恢复) */
27
+ journal?: RunJournal;
28
+ }
29
+ type Step<T> = (prev?: T) => Promise<T>;
30
+ /** 可注入的步骤编排入口(registry ctx.runSteps 的结构类型;缺省 = sequence 直跑) */
31
+ export type RunStepsFn = <T>(steps: Array<Step<T>>, options?: SequenceOptions) => Promise<T | undefined>;
32
+ export declare function sequence<T>(steps: Array<Step<T>>, options?: SequenceOptions): Promise<T | undefined>;
33
+ /**
34
+ * 从 journal 恢复执行 sequence:
35
+ * - run 已 completed:直接返回最后一步的 journal 输出(幂等,不执行任何步骤)
36
+ * - 否则:跳过 completed 前缀(prev 取 journal 输出),从第一个未完成步骤重跑
37
+ * - steps 必须与原 run 步骤数一致(同一 workflow 定义重新声明)
38
+ */
39
+ export declare function resumeSequence<T>(store: ExecutionStore, runId: string, steps: Array<Step<T>>, options?: SequenceOptions): Promise<T | undefined>;
40
+ export {};
@@ -0,0 +1,100 @@
1
+ /**
2
+ * sequence() —— 顺序执行步骤,上一步结果作为下一步入参
3
+ * (P1.3 失败语义 / P2.2 journal 记录与恢复)
4
+ *
5
+ * onFailure 两种模式:
6
+ * "fail-fast"(默认):第一个失败步骤抛 WorkflowSequenceError,剩余步骤不再执行。
7
+ * "continue" :失败步骤被记录,后续步骤仍执行(prev = 最后一次成功值),
8
+ * 全部执行完后若存在失败,仍抛 WorkflowSequenceError(累积全部错误)。
9
+ *
10
+ * journal(可选):传入 RunJournal 后每次状态变更落盘,
11
+ * 配合 resumeSequence() 可在 run 中断后从 completed 前缀恢复续跑。
12
+ *
13
+ * resumeSequence()(P2.2):从 journal 恢复——
14
+ * Step1 ✅ Step2 ✅ Step3 ❌ Step4 -
15
+ * -> restart -> 跳过 1/2(prev 取 journal 输出),从 Step3 重跑
16
+ * 注意:重跑意味着 Step3 的副作用会再次发生(非幂等步骤需自行保证安全)。
17
+ * 仅支持 sequence 的恢复;parallel/nested 的恢复不在 P2.2 范围。
18
+ */
19
+ import { WorkflowSequenceError, WorkflowStepError } from "../runtime/errors.js";
20
+ import { emitEvent } from "../observability/events.js";
21
+ import { RunJournal } from "../state/recorder.js";
22
+ function assertStepCount(journal, steps) {
23
+ if (journal && journal.run.steps.length !== steps) {
24
+ throw new Error(`[agentic-workflow] journal step count mismatch: journal ` +
25
+ `${journal.run.steps.length} vs steps ${steps} (run ${journal.run.runId})`);
26
+ }
27
+ }
28
+ async function runLoop(steps, options, journal, fromIndex, initialPrev) {
29
+ const onFailure = options?.onFailure ?? "fail-fast";
30
+ const errors = [];
31
+ let result = initialPrev;
32
+ for (let i = fromIndex; i < steps.length; i++) {
33
+ const step = steps[i];
34
+ if (!step)
35
+ continue;
36
+ const stepStartedAt = Date.now();
37
+ try {
38
+ emitEvent({ type: "step.started", index: i });
39
+ await journal?.stepStarted(i, result);
40
+ result = await step(result);
41
+ await journal?.stepCompleted(i, result);
42
+ emitEvent({ type: "step.completed", index: i, durationMs: Date.now() - stepStartedAt });
43
+ }
44
+ catch (cause) {
45
+ const stepError = new WorkflowStepError(i, cause, options?.stepNames?.[i]);
46
+ await journal?.stepFailed(i, cause);
47
+ emitEvent({
48
+ type: "step.failed",
49
+ index: i,
50
+ error: cause instanceof Error ? cause.message : String(cause),
51
+ });
52
+ if (onFailure === "fail-fast") {
53
+ const sequenceError = new WorkflowSequenceError([stepError], result);
54
+ await journal?.fail(sequenceError);
55
+ throw sequenceError;
56
+ }
57
+ errors.push(stepError);
58
+ // continue 模式:result 保持为最后一次成功值
59
+ }
60
+ }
61
+ if (errors.length > 0) {
62
+ const sequenceError = new WorkflowSequenceError(errors, result);
63
+ await journal?.fail(sequenceError);
64
+ throw sequenceError;
65
+ }
66
+ await journal?.complete();
67
+ return result;
68
+ }
69
+ export async function sequence(steps, options) {
70
+ assertStepCount(options?.journal, steps.length);
71
+ return runLoop(steps, options, options?.journal, 0, undefined);
72
+ }
73
+ /**
74
+ * 从 journal 恢复执行 sequence:
75
+ * - run 已 completed:直接返回最后一步的 journal 输出(幂等,不执行任何步骤)
76
+ * - 否则:跳过 completed 前缀(prev 取 journal 输出),从第一个未完成步骤重跑
77
+ * - steps 必须与原 run 步骤数一致(同一 workflow 定义重新声明)
78
+ */
79
+ export async function resumeSequence(store, runId, steps, options) {
80
+ const journal = await RunJournal.attach(store, runId);
81
+ if (!journal) {
82
+ throw new Error(`[agentic-workflow] cannot resume: run not found: ${runId}`);
83
+ }
84
+ assertStepCount(journal, steps.length);
85
+ const run = journal.run;
86
+ if (run.status === "completed") {
87
+ const last = run.steps[run.steps.length - 1];
88
+ return last?.output;
89
+ }
90
+ await journal.reopen();
91
+ // 恢复 completed 前缀的 prev 链,从第一个未完成步骤重跑
92
+ let fromIndex = 0;
93
+ let prev = undefined;
94
+ while (fromIndex < run.steps.length && run.steps[fromIndex]?.status === "completed") {
95
+ prev = run.steps[fromIndex]?.output;
96
+ fromIndex += 1;
97
+ }
98
+ return runLoop(steps, options, journal, fromIndex, prev);
99
+ }
100
+ //# sourceMappingURL=sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/workflow/sequence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * P0 Smoke Workflow —— 3 个并行分析 agent + 1 个汇总 agent
3
+ *
4
+ * 只使用 Workflow Core 组合子,不含任何 OpenCode 依赖,
5
+ * 因此可以在 MockExecutor(单测)与 OpenCodeV2Executor(真实运行)下复用。
6
+ *
7
+ * 验收链路:
8
+ * Main Session -> workflow tool -> Workflow Engine
9
+ * -> Session A / B / C(并行)
10
+ * -> Summary Agent
11
+ * -> Result -> Main Session
12
+ *
13
+ * P2.5:步骤化(research -> summary)+ 可注入 runSteps,可被 journal 记录与 resume。
14
+ */
15
+ import type { AgentResult } from "../runtime/executor.js";
16
+ import { type RunStepsFn } from "./sequence.js";
17
+ export declare function runSmokeWorkflow(topic: string, runSteps?: RunStepsFn): Promise<AgentResult>;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * P0 Smoke Workflow —— 3 个并行分析 agent + 1 个汇总 agent
3
+ *
4
+ * 只使用 Workflow Core 组合子,不含任何 OpenCode 依赖,
5
+ * 因此可以在 MockExecutor(单测)与 OpenCodeV2Executor(真实运行)下复用。
6
+ *
7
+ * 验收链路:
8
+ * Main Session -> workflow tool -> Workflow Engine
9
+ * -> Session A / B / C(并行)
10
+ * -> Summary Agent
11
+ * -> Result -> Main Session
12
+ *
13
+ * P2.5:步骤化(research -> summary)+ 可注入 runSteps,可被 journal 记录与 resume。
14
+ */
15
+ import { agent } from "./agent.js";
16
+ import { parallel } from "./parallel.js";
17
+ import { phase } from "./phase.js";
18
+ import { observeWorkflow } from "../observability/observe.js";
19
+ import { sequence } from "./sequence.js";
20
+ export async function runSmokeWorkflow(topic, runSteps) {
21
+ const run = runSteps ?? ((steps, options) => sequence(steps, options));
22
+ return observeWorkflow("smoke", async () => {
23
+ phase("Research");
24
+ const result = (await run([
25
+ async () => parallel([
26
+ () => agent(`针对主题「${topic}」,从架构设计角度进行分析,给出要点。直接用你自己的知识回答,禁止调用 workflow 或其他任何工具。`),
27
+ () => agent(`针对主题「${topic}」,从风险与约束角度进行分析,给出要点。直接用你自己的知识回答,禁止调用 workflow 或其他任何工具。`),
28
+ () => agent(`针对主题「${topic}」,从实施步骤角度进行分析,给出要点。直接用你自己的知识回答,禁止调用 workflow 或其他任何工具。`),
29
+ ]),
30
+ async (prev) => {
31
+ phase("Summary");
32
+ return agent(`根据下面三份分析结果生成一份总结(保留关键要点,去除重复)。直接用你自己的知识回答,禁止调用 workflow 或其他任何工具:\n\n${JSON.stringify(prev, null, 2)}`);
33
+ },
34
+ ], { stepNames: ["research", "summary"] }));
35
+ return result;
36
+ }, { topic });
37
+ }
38
+ //# sourceMappingURL=smoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.js","sourceRoot":"","sources":["../../src/workflow/smoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAmB,MAAM,eAAe,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,QAAqB;IAErB,MAAM,GAAG,GACP,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;IAE5D,OAAO,eAAe,CACpB,OAAO,EACP,KAAK,IAAI,EAAE;QACT,KAAK,CAAC,UAAU,CAAC,CAAA;QAEjB,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CACvB;YACE,KAAK,IAAI,EAAE,CACT,QAAQ,CAAC;gBACP,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,uDAAuD,CAAC;gBACjF,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,wDAAwD,CAAC;gBAClF,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,uDAAuD,CAAC;aAClF,CAAC;YACJ,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,KAAK,CAAC,SAAS,CAAC,CAAA;gBAChB,OAAO,KAAK,CACV,uEAAuE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CACvG,CAAA;YACH,CAAC;SACF,EACD,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CACvC,CAAgB,CAAA;QAEjB,OAAO,MAAM,CAAA;IACf,CAAC,EACD,EAAE,KAAK,EAAE,CACV,CAAA;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * artifact workflow 定义(P2.7 隔离演示与验收载体)
3
+ *
4
+ * 链路:agent 在 workspace 写文件 -> fileExists 检查(workspace 内)-> 审批。
5
+ * 用于真实验证「一个 run 一个稳定、隔离、可恢复的工作目录」:
6
+ * - 子 agent 的 cwd 已被 runner 绑定到 worktree 根;
7
+ * - 文件产物落在 worktree 内,不污染项目目录;
8
+ * - 失败后 resume 重新附着原 worktree,文件仍在。
9
+ */
10
+ import type { WorkflowDefinition } from "../registry/definition.js";
11
+ export interface ArtifactArgs {
12
+ topic: string;
13
+ /** 产物文件名(相对 workspace 根;默认 artifact.md) */
14
+ file?: string;
15
+ }
16
+ export interface ArtifactState {
17
+ file?: string;
18
+ absolutePath?: string;
19
+ verified?: boolean;
20
+ approved?: boolean;
21
+ }
22
+ export declare function artifactWorkflow(): WorkflowDefinition<ArtifactArgs, {
23
+ output: string;
24
+ }>;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * artifact workflow 定义(P2.7 隔离演示与验收载体)
3
+ *
4
+ * 链路:agent 在 workspace 写文件 -> fileExists 检查(workspace 内)-> 审批。
5
+ * 用于真实验证「一个 run 一个稳定、隔离、可恢复的工作目录」:
6
+ * - 子 agent 的 cwd 已被 runner 绑定到 worktree 根;
7
+ * - 文件产物落在 worktree 内,不污染项目目录;
8
+ * - 失败后 resume 重新附着原 worktree,文件仍在。
9
+ */
10
+ import path from "node:path";
11
+ import { observeWorkflow } from "../observability/observe.js";
12
+ import { agent } from "../workflow/agent.js";
13
+ import { assert } from "../quality/check.js";
14
+ import { fileExists } from "../quality/predicates.js";
15
+ import { checkpoint } from "../quality/checkpoint.js";
16
+ export function artifactWorkflow() {
17
+ return {
18
+ id: "artifact",
19
+ version: "1.0.0",
20
+ description: "在隔离 workspace 中生成文件产物并验证(agent 写文件 -> fileExists 检查 -> 审批)",
21
+ argsSchema: {
22
+ type: "object",
23
+ properties: {
24
+ topic: { type: "string", description: "产物主题" },
25
+ file: { type: "string", description: "产物文件名(默认 artifact.md)" },
26
+ },
27
+ required: ["topic"],
28
+ },
29
+ stepNames: ["write", "check", "checkpoint"],
30
+ async run(args, ctx) {
31
+ const file = args.file ?? "artifact.md";
32
+ return observeWorkflow("artifact", async () => {
33
+ const state = await ctx.runSteps([
34
+ // 1. 写文件:子 agent 的 cwd 已绑定 workspace 根
35
+ async () => {
36
+ await agent(`请在当前工作目录创建文件 ${file},内容为针对主题「${args.topic}」的 3-5 条要点分析(Markdown 格式,含一级标题)。` +
37
+ "使用你的文件写入工具直接创建,禁止调用 workflow 或 workflow_metrics 工具。完成后只回复 done。");
38
+ return {
39
+ file,
40
+ absolutePath: path.join(ctx.workspaceRoot ?? process.cwd(), file),
41
+ };
42
+ },
43
+ // 2. 确定性检查:文件真实存在于 workspace
44
+ async (prev) => {
45
+ const dir = ctx.workspaceRoot ?? process.cwd();
46
+ await assert(() => fileExists(path.join(dir, file)), `check: ${file} exists in workspace (${dir})`);
47
+ return { ...prev, verified: true };
48
+ },
49
+ // 3. 审批
50
+ async (prev) => {
51
+ await checkpoint("文件已写入并通过检查,是否继续?", {
52
+ label: "artifact-review",
53
+ });
54
+ return { ...prev, approved: true };
55
+ },
56
+ ], { stepNames: ["write", "check", "checkpoint"] });
57
+ const output = [
58
+ `# Artifact Workflow 报告:${args.topic}`,
59
+ "",
60
+ `- 文件:${state?.file ?? file}`,
61
+ `- 路径:${state?.absolutePath ?? "(未知)"}`,
62
+ `- 检查:${state?.verified ? "通过" : "未通过"}`,
63
+ `- 审批:${state?.approved ? "已批准" : "未批准"}`,
64
+ `- 隔离目录:${ctx.workspaceRoot ?? "(未启用隔离)"}`,
65
+ ].join("\n");
66
+ return { output };
67
+ }, { topic: args.topic, file });
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../src/workflows/artifact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 内置 workflow 定义(P2.5)
3
+ *
4
+ * workflows/ 目录 = workflow 资产(id/version/description/args/entry),
5
+ * 与 workflow/ 目录(组合子引擎)分离。新增 workflow = 新增一个定义文件 +
6
+ * 在插件入口注册,插件工具与路由零改动。
7
+ */
8
+ import type { WorkflowDefinition } from "../registry/registry.js";
9
+ /** smoke:3 路并行分析 + 汇总(P0 冒烟链) */
10
+ export declare function smokeWorkflow(): WorkflowDefinition<{
11
+ topic: string;
12
+ }>;
13
+ /** reliable:执行 -> check -> verify -> checkpoint 可靠链(P1 验收链) */
14
+ export declare function reliableWorkflow(options?: {
15
+ checkCommand?: string;
16
+ reviewers?: number;
17
+ }): WorkflowDefinition<{
18
+ topic: string;
19
+ }>;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 内置 workflow 定义(P2.5)
3
+ *
4
+ * workflows/ 目录 = workflow 资产(id/version/description/args/entry),
5
+ * 与 workflow/ 目录(组合子引擎)分离。新增 workflow = 新增一个定义文件 +
6
+ * 在插件入口注册,插件工具与路由零改动。
7
+ */
8
+ import { runSmokeWorkflow } from "../workflow/smoke.js";
9
+ import { runReliableWorkflow } from "../workflow/reliable.js";
10
+ const TOPIC_SCHEMA = {
11
+ type: "object",
12
+ properties: {
13
+ topic: { type: "string", description: "分析主题" },
14
+ },
15
+ required: ["topic"],
16
+ };
17
+ /** smoke:3 路并行分析 + 汇总(P0 冒烟链) */
18
+ export function smokeWorkflow() {
19
+ return {
20
+ id: "smoke",
21
+ version: "1.0.0",
22
+ description: "3 路并行分析 agent + 1 个汇总 agent(冒烟演示)",
23
+ args: TOPIC_SCHEMA,
24
+ entry: async ({ topic }) => runSmokeWorkflow(topic),
25
+ };
26
+ }
27
+ /** reliable:执行 -> check -> verify -> checkpoint 可靠链(P1 验收链) */
28
+ export function reliableWorkflow(options) {
29
+ return {
30
+ id: "reliable",
31
+ version: "1.0.0",
32
+ description: "agent -> 确定性检查 -> 多 reviewer 语义验证 -> 人工审批 的可靠链",
33
+ args: TOPIC_SCHEMA,
34
+ entry: async ({ topic }) => runReliableWorkflow(topic, {
35
+ checkCommand: options?.checkCommand,
36
+ reviewers: options?.reviewers,
37
+ }),
38
+ };
39
+ }
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D,MAAM,YAAY,GAAe;IAC/B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE;KAC/C;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAA;AAED,iCAAiC;AACjC,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,EAAE,EAAE,OAAO;QACX,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,mCAAmC;QAChD,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC;KACpD,CAAA;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAAC,OAGhC;IACC,OAAO;QACL,EAAE,EAAE,UAAU;QACd,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,gDAAgD;QAC7D,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CACzB,mBAAmB,CAAC,KAAK,EAAE;YACzB,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC;KACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * reliable workflow 定义(P2.5)
3
+ *
4
+ * 版本纪律(resume 安全约束):步骤结构(stepNames 的数量/顺序/语义)变更
5
+ * 必须升 version——resume 依赖 journal.workflow.version 精确解析定义。
6
+ */
7
+ import type { WorkflowDefinition } from "../registry/definition.js";
8
+ export interface ReliableArgs {
9
+ topic: string;
10
+ checkCommand?: string;
11
+ reviewers?: number;
12
+ }
13
+ export declare function reliableWorkflow(hostOptions?: {
14
+ checkCommand?: string;
15
+ reviewers?: number;
16
+ }): WorkflowDefinition<ReliableArgs, {
17
+ output: string;
18
+ }>;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * reliable workflow 定义(P2.5)
3
+ *
4
+ * 版本纪律(resume 安全约束):步骤结构(stepNames 的数量/顺序/语义)变更
5
+ * 必须升 version——resume 依赖 journal.workflow.version 精确解析定义。
6
+ */
7
+ import { runReliableWorkflow } from "../workflow/reliable.js";
8
+ export function reliableWorkflow(hostOptions) {
9
+ return {
10
+ id: "reliable",
11
+ version: "1.0.0",
12
+ description: "agent -> 确定性检查 -> 多 reviewer 语义验证 -> 人工审批 的可靠链",
13
+ argsSchema: {
14
+ type: "object",
15
+ properties: {
16
+ topic: { type: "string", description: "分析主题" },
17
+ checkCommand: { type: "string", description: "check 步骤执行的命令(可选)" },
18
+ reviewers: { type: "integer", description: "reviewer 数量(可选,默认 2)" },
19
+ },
20
+ required: ["topic"],
21
+ },
22
+ stepNames: ["execute", "check", "verify", "checkpoint"],
23
+ async run(args, ctx) {
24
+ return runReliableWorkflow(args.topic, {
25
+ checkCommand: args.checkCommand ?? hostOptions?.checkCommand,
26
+ reviewers: args.reviewers ?? hostOptions?.reviewers,
27
+ runSteps: ctx.runSteps,
28
+ });
29
+ },
30
+ };
31
+ }
32
+ //# sourceMappingURL=reliable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reliable.js","sourceRoot":"","sources":["../../src/workflows/reliable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAQ7D,MAAM,UAAU,gBAAgB,CAAC,WAGhC;IACC,OAAO;QACL,EAAE,EAAE,UAAU;QACd,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,gDAAgD;QAC7D,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE;gBAC9C,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;gBAClE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sBAAsB,EAAE;aACpE;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;QACD,SAAS,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC;QACvD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG;YACjB,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE;gBACrC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,YAAY;gBAC5D,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,WAAW,EAAE,SAAS;gBACnD,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * smoke workflow 定义(P2.5)
3
+ *
4
+ * workflows/ = workflow 资产(id/version/description/argsSchema/stepNames/run),
5
+ * workflow/ = 组合子引擎。新增 workflow = 新增定义文件 + 插件入口注册一行。
6
+ */
7
+ import type { WorkflowDefinition } from "../registry/definition.js";
8
+ export interface SmokeArgs {
9
+ topic: string;
10
+ }
11
+ export declare function smokeWorkflow(): WorkflowDefinition<SmokeArgs, {
12
+ output: string;
13
+ }>;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * smoke workflow 定义(P2.5)
3
+ *
4
+ * workflows/ = workflow 资产(id/version/description/argsSchema/stepNames/run),
5
+ * workflow/ = 组合子引擎。新增 workflow = 新增定义文件 + 插件入口注册一行。
6
+ */
7
+ import { runSmokeWorkflow } from "../workflow/smoke.js";
8
+ export function smokeWorkflow() {
9
+ return {
10
+ id: "smoke",
11
+ version: "1.0.0",
12
+ description: "3 路并行分析 agent + 1 个汇总 agent(冒烟演示)",
13
+ argsSchema: {
14
+ type: "object",
15
+ properties: {
16
+ topic: { type: "string", description: "分析主题" },
17
+ },
18
+ required: ["topic"],
19
+ },
20
+ stepNames: ["research", "summary"],
21
+ async run(args, ctx) {
22
+ return runSmokeWorkflow(args.topic, ctx.runSteps);
23
+ },
24
+ };
25
+ }
26
+ //# sourceMappingURL=smoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.js","sourceRoot":"","sources":["../../src/workflows/smoke.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAMvD,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,EAAE,EAAE,OAAO;QACX,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,mCAAmC;QAChD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE;aAC/C;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;QACD,SAAS,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG;YACjB,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnD,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 当前 workspace 的进程内环境态(P2.7)
3
+ *
4
+ * 与 setExecutor / setCheckpointGate 同一模式(ambient 绑定):
5
+ * runner 在 def.run 期间设置,agent() 读取并下发给 executor 作为子会话 cwd。
6
+ * workflow 原语不感知 runner 的存在。
7
+ */
8
+ import type { WorkspaceHandle } from "./provider.js";
9
+ /** 设置/清除当前 workspace(runner 在 run 生命周期内调用) */
10
+ export declare function setCurrentWorkspace(handle: WorkspaceHandle | undefined): void;
11
+ /** 当前 run 的 workspace(未启用隔离时为 undefined) */
12
+ export declare function currentWorkspace(): WorkspaceHandle | undefined;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 当前 workspace 的进程内环境态(P2.7)
3
+ *
4
+ * 与 setExecutor / setCheckpointGate 同一模式(ambient 绑定):
5
+ * runner 在 def.run 期间设置,agent() 读取并下发给 executor 作为子会话 cwd。
6
+ * workflow 原语不感知 runner 的存在。
7
+ */
8
+ let current;
9
+ /** 设置/清除当前 workspace(runner 在 run 生命周期内调用) */
10
+ export function setCurrentWorkspace(handle) {
11
+ current = handle;
12
+ }
13
+ /** 当前 run 的 workspace(未启用隔离时为 undefined) */
14
+ export function currentWorkspace() {
15
+ return current;
16
+ }
17
+ //# sourceMappingURL=ambient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ambient.js","sourceRoot":"","sources":["../../src/workspace/ambient.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,IAAI,OAAoC,CAAA;AAExC,8CAA8C;AAC9C,MAAM,UAAU,mBAAmB,CAAC,MAAmC;IACrE,OAAO,GAAG,MAAM,CAAA;AAClB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * GitWorktreeProvider(P2.7)—— WorkspaceProvider 的 git worktree 实现
3
+ *
4
+ * git -C <repo> worktree add -b agw/<runId> <dir>/<runId> [<baseRef>]
5
+ *
6
+ * - worktree 目录默认放在仓库**同级**目录(<项目名>-worktrees/<runId>),
7
+ * 不污染仓库本身(无需 .gitignore);
8
+ * - dispose 只移除 worktree(+prune),**不删分支**——分支是廉价 ref,
9
+ * 删除是破坏性操作,留给用户(git branch --list 'agw/*' 可批量清理);
10
+ * - attach 严格校验存在性,缺失即抛错(durable resume 纪律)。
11
+ */
12
+ import type { WorkspaceHandle, WorkspaceIdentity, WorkspaceOptions, WorkspaceProvider } from "./provider.js";
13
+ export interface GitWorktreeProviderOptions {
14
+ /** 起点目录(自动解析到 git 仓库根;通常是项目目录) */
15
+ startDir: string;
16
+ /** worktree 父目录;缺省 <repo 同级>/<项目名>-worktrees */
17
+ dir?: string;
18
+ }
19
+ export declare class GitWorktreeProvider implements WorkspaceProvider {
20
+ readonly kind = "git-worktree";
21
+ private readonly startDir;
22
+ private readonly dirOverride?;
23
+ private cache?;
24
+ constructor(options: GitWorktreeProviderOptions);
25
+ private resolvePaths;
26
+ create(runId: string, options?: WorkspaceOptions): Promise<WorkspaceHandle>;
27
+ attach(identity: WorkspaceIdentity): Promise<WorkspaceHandle>;
28
+ private removeWorktree;
29
+ }