@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.
Files changed (133) hide show
  1. package/README.md +306 -5
  2. package/dist/cli/config.d.ts +121 -0
  3. package/dist/cli/config.js +331 -0
  4. package/dist/cli/config.js.map +1 -0
  5. package/dist/cli/doctor.d.ts +5 -0
  6. package/dist/cli/doctor.js +141 -0
  7. package/dist/cli/doctor.js.map +1 -0
  8. package/dist/cli/index.d.ts +18 -0
  9. package/dist/cli/index.js +120 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/install.d.ts +19 -0
  12. package/dist/cli/install.js +135 -0
  13. package/dist/cli/install.js.map +1 -0
  14. package/dist/cli/uninstall.d.ts +16 -0
  15. package/dist/cli/uninstall.js +110 -0
  16. package/dist/cli/uninstall.js.map +1 -0
  17. package/dist/cli/update.d.ts +15 -0
  18. package/dist/cli/update.js +86 -0
  19. package/dist/cli/update.js.map +1 -0
  20. package/dist/core/index.d.ts +39 -0
  21. package/dist/core/index.js +38 -0
  22. package/dist/core/index.js.map +1 -0
  23. package/dist/observability/events.d.ts +43 -0
  24. package/dist/observability/events.js.map +1 -1
  25. package/dist/plugin/checkpoint-override.d.ts +26 -0
  26. package/dist/plugin/checkpoint-override.js +43 -0
  27. package/dist/plugin/checkpoint-override.js.map +1 -0
  28. package/dist/plugin/define-workflow.d.ts +33 -0
  29. package/dist/plugin/define-workflow.js +103 -0
  30. package/dist/plugin/define-workflow.js.map +1 -0
  31. package/dist/plugin/index.js +426 -23
  32. package/dist/plugin/index.js.map +1 -1
  33. package/dist/plugin/opencode-v2-executor.js +58 -46
  34. package/dist/plugin/opencode-v2-executor.js.map +1 -1
  35. package/dist/plugin/progress-board.d.ts +64 -0
  36. package/dist/plugin/progress-board.js +150 -0
  37. package/dist/plugin/progress-board.js.map +1 -0
  38. package/dist/plugin/progress-rpc.d.ts +390 -0
  39. package/dist/plugin/progress-rpc.js +318 -0
  40. package/dist/plugin/progress-rpc.js.map +1 -0
  41. package/dist/plugin/progress-view.d.ts +82 -0
  42. package/dist/plugin/progress-view.js +244 -0
  43. package/dist/plugin/progress-view.js.map +1 -0
  44. package/dist/plugin/run-sessions.d.ts +28 -0
  45. package/dist/plugin/run-sessions.js +46 -0
  46. package/dist/plugin/run-sessions.js.map +1 -0
  47. package/dist/plugin/tool-args.d.ts +15 -0
  48. package/dist/plugin/tool-args.js +28 -0
  49. package/dist/plugin/tool-args.js.map +1 -0
  50. package/dist/plugin/tui.d.ts +11 -4
  51. package/dist/plugin/tui.js +149 -5
  52. package/dist/plugin/tui.js.map +1 -1
  53. package/dist/plugin/workflow-control.d.ts +16 -0
  54. package/dist/plugin/workflow-control.js +85 -0
  55. package/dist/plugin/workflow-control.js.map +1 -0
  56. package/dist/plugin/workflow-schedule.d.ts +24 -0
  57. package/dist/plugin/workflow-schedule.js +97 -0
  58. package/dist/plugin/workflow-schedule.js.map +1 -0
  59. package/dist/quality/checkpoint.d.ts +7 -2
  60. package/dist/quality/checkpoint.js +13 -4
  61. package/dist/quality/checkpoint.js.map +1 -1
  62. package/dist/quality/verify.d.ts +21 -2
  63. package/dist/quality/verify.js +36 -14
  64. package/dist/quality/verify.js.map +1 -1
  65. package/dist/registry/definition.d.ts +12 -0
  66. package/dist/registry/definition.js.map +1 -1
  67. package/dist/registry/registry.d.ts +4 -0
  68. package/dist/registry/registry.js +20 -1
  69. package/dist/registry/registry.js.map +1 -1
  70. package/dist/registry/run-control.d.ts +27 -0
  71. package/dist/registry/run-control.js +51 -0
  72. package/dist/registry/run-control.js.map +1 -0
  73. package/dist/registry/runner.d.ts +29 -6
  74. package/dist/registry/runner.js +153 -35
  75. package/dist/registry/runner.js.map +1 -1
  76. package/dist/runtime/errors.d.ts +26 -0
  77. package/dist/runtime/errors.js +30 -0
  78. package/dist/runtime/errors.js.map +1 -1
  79. package/dist/runtime/executor.d.ts +22 -0
  80. package/dist/runtime/executor.js.map +1 -1
  81. package/dist/runtime/run-context.d.ts +44 -0
  82. package/dist/runtime/run-context.js +32 -0
  83. package/dist/runtime/run-context.js.map +1 -0
  84. package/dist/scheduler/cron.d.ts +29 -0
  85. package/dist/scheduler/cron.js +171 -0
  86. package/dist/scheduler/cron.js.map +1 -0
  87. package/dist/scheduler/service.d.ts +78 -0
  88. package/dist/scheduler/service.js +210 -0
  89. package/dist/scheduler/service.js.map +1 -0
  90. package/dist/scheduler/store.d.ts +26 -0
  91. package/dist/scheduler/store.js +94 -0
  92. package/dist/scheduler/store.js.map +1 -0
  93. package/dist/scheduler/types.d.ts +53 -0
  94. package/dist/scheduler/types.js +12 -0
  95. package/dist/scheduler/types.js.map +1 -0
  96. package/dist/state/journal.d.ts +23 -0
  97. package/dist/state/journal.js +2 -0
  98. package/dist/state/journal.js.map +1 -1
  99. package/dist/state/recorder.d.ts +67 -0
  100. package/dist/state/recorder.js +148 -2
  101. package/dist/state/recorder.js.map +1 -1
  102. package/dist/workflow/agent.d.ts +42 -1
  103. package/dist/workflow/agent.js +116 -6
  104. package/dist/workflow/agent.js.map +1 -1
  105. package/dist/workflow/judge-panel.d.ts +37 -0
  106. package/dist/workflow/judge-panel.js +66 -0
  107. package/dist/workflow/judge-panel.js.map +1 -0
  108. package/dist/workflow/pipeline.d.ts +21 -0
  109. package/dist/workflow/pipeline.js +71 -0
  110. package/dist/workflow/pipeline.js.map +1 -0
  111. package/dist/workflow/race.d.ts +16 -0
  112. package/dist/workflow/race.js +46 -0
  113. package/dist/workflow/race.js.map +1 -0
  114. package/dist/workflow/sequence.js +6 -0
  115. package/dist/workflow/sequence.js.map +1 -1
  116. package/dist/workflows/loader.d.ts +124 -0
  117. package/dist/workflows/loader.js +500 -0
  118. package/dist/workflows/loader.js.map +1 -0
  119. package/dist/workspace/ambient.d.ts +6 -4
  120. package/dist/workspace/ambient.js +10 -4
  121. package/dist/workspace/ambient.js.map +1 -1
  122. package/dist/workspace/in-place.d.ts +26 -0
  123. package/dist/workspace/in-place.js +48 -0
  124. package/dist/workspace/in-place.js.map +1 -0
  125. package/dist/workspace/index.d.ts +1 -0
  126. package/dist/workspace/index.js +1 -0
  127. package/dist/workspace/index.js.map +1 -1
  128. package/package.json +16 -6
  129. package/skills/workflow-authoring/SKILL.md +111 -0
  130. package/skills/workflow-optimize/SKILL.md +70 -0
  131. package/dist/workflows/index.d.ts +0 -19
  132. package/dist/workflows/index.js +0 -40
  133. package/dist/workflows/index.js.map +0 -1
@@ -0,0 +1,500 @@
1
+ /**
2
+ * 声明式 workflow 装载器(P4)—— 用户自定义流程的 JSON 形态
3
+ *
4
+ * 装载契约(详见 dev-docs/planning/P4-custom-workflows.md):
5
+ * - 入口:.json 文件路径 或 目录(扫一层 *.json);相对项目目录
6
+ * - 步骤七类(互斥键):agent / checkpoint / verify / fileExists / subflow /
7
+ * pipeline(条目并发 fan-out,{{item}} 引用条目)/ race(≥2 提示竞速取首胜)
8
+ * - 模板:{{topic}}、{{args.x}}、{{steps.<name>}};pipeline 提示额外支持
9
+ * {{item}}(条目字面替换,先于通用模板解析);未知变量 = 步骤失败
10
+ * - 并发步骤的 resume 粒度:pipeline/race 各占一个 journal 步骤单元
11
+ * (completed 即整体跳过;中断重跑整步——与 sequence 前缀语义一致)
12
+ * - 错误语义:装载期文件级 skip+warn(不阻断其他文件与内置流程);
13
+ * 运行期步骤级 failed(走既有 journal/resume 语义)
14
+ *
15
+ * 纪律:本文件属于 Core 侧资产装载,禁止 import OpenCode API
16
+ * (架构不变量);路径解析基准由调用方(plugin)传入。
17
+ */
18
+ import { existsSync, statSync } from "node:fs";
19
+ import { readdir, readFile } from "node:fs/promises";
20
+ import path from "node:path";
21
+ import { pathToFileURL } from "node:url";
22
+ import { agent } from "../workflow/agent.js";
23
+ import { pipeline } from "../workflow/pipeline.js";
24
+ import { race } from "../workflow/race.js";
25
+ import { assert } from "../quality/check.js";
26
+ import { assertVerify } from "../quality/verify.js";
27
+ import { checkpoint } from "../quality/checkpoint.js";
28
+ import { fileExists as fileExistsPredicate } from "../quality/predicates.js";
29
+ const ID_PATTERN = /^[a-z][a-z0-9-]*$/;
30
+ const STEP_KEYS = ["agent", "checkpoint", "verify", "fileExists", "subflow", "pipeline", "race"];
31
+ /** 各步骤键开放的可选键(未知键拒绝;无则仅 name + 步骤键本身) */
32
+ const OPTION_KEYS_BY_KIND = {
33
+ agent: ["model", "timeoutMs", "retries"],
34
+ subflow: ["args"],
35
+ pipeline: ["items", "outputAs", "onFailure", "model", "timeoutMs", "retries"],
36
+ race: ["outputAs"],
37
+ };
38
+ /** agent 调用级选项校验(agent 步与 pipeline 步共用同一规则) */
39
+ function checkAgentOptions(step, index) {
40
+ if (step.model !== undefined && (typeof step.model !== "string" || !step.model.includes("/"))) {
41
+ return `steps[${index}].model must be "providerID/modelId"`;
42
+ }
43
+ if (step.timeoutMs !== undefined &&
44
+ (typeof step.timeoutMs !== "number" || !Number.isFinite(step.timeoutMs) || step.timeoutMs <= 0)) {
45
+ return `steps[${index}].timeoutMs must be a positive number (ms)`;
46
+ }
47
+ if (step.retries !== undefined &&
48
+ (typeof step.retries !== "number" || !Number.isInteger(step.retries) || step.retries < 0)) {
49
+ return `steps[${index}].retries must be a non-negative integer`;
50
+ }
51
+ return undefined;
52
+ }
53
+ /** 代码流程模块扩展名(P2-14:flows 目录可放 JS 模块,恢复 v1 自定义逻辑能力) */
54
+ const CODE_EXTENSIONS = [".js", ".mjs", ".cjs"];
55
+ function isWorkflowFileName(name) {
56
+ return name.endsWith(".json") || CODE_EXTENSIONS.some((ext) => name.endsWith(ext));
57
+ }
58
+ /** 解析入口路径列表为流程文件列表(目录 = 一层扫描;不存在的入口报错) */
59
+ async function expandEntries(entries, baseDir) {
60
+ const files = [];
61
+ const errors = [];
62
+ for (const entry of entries) {
63
+ const resolved = path.isAbsolute(entry) ? entry : path.join(baseDir, entry);
64
+ if (!existsSync(resolved)) {
65
+ errors.push(`${entry}: no such file or directory (${resolved})`);
66
+ continue;
67
+ }
68
+ const stat = statSync(resolved);
69
+ if (stat.isDirectory()) {
70
+ const names = (await readdir(resolved)).filter(isWorkflowFileName).sort();
71
+ if (names.length === 0) {
72
+ errors.push(`${entry}: directory has no workflow files (.json/.js/.mjs/.cjs)`);
73
+ continue;
74
+ }
75
+ files.push(...names.map((n) => path.join(resolved, n)));
76
+ }
77
+ else {
78
+ files.push(resolved);
79
+ }
80
+ }
81
+ return { files, errors };
82
+ }
83
+ /** 单文件校验:返回声明对象或错误文案(含文件名前缀) */
84
+ export function validateWorkflow(raw, file) {
85
+ const at = (msg) => `${path.basename(file)}: ${msg}`;
86
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
87
+ return { ok: false, error: at("workflow file must be a JSON object") };
88
+ }
89
+ const dw = raw;
90
+ for (const key of Object.keys(dw)) {
91
+ if (!["id", "version", "description", "args", "steps", "output"].includes(key)) {
92
+ return { ok: false, error: at(`unknown top-level key "${key}" (allowed: id, version, description, args, steps, output)`) };
93
+ }
94
+ }
95
+ if (typeof dw.id !== "string" || !ID_PATTERN.test(dw.id)) {
96
+ return { ok: false, error: at(`"id" must match ${ID_PATTERN} (kebab-case, tool flow 参数直接用它)`) };
97
+ }
98
+ const version = typeof dw.version === "string" && dw.version.length > 0 ? dw.version : "1.0.0";
99
+ if (dw.version !== undefined && version !== dw.version) {
100
+ return { ok: false, error: at(`"version" must be a non-empty string`) };
101
+ }
102
+ if (dw.description !== undefined && typeof dw.description !== "string") {
103
+ return { ok: false, error: at(`"description" must be a string`) };
104
+ }
105
+ if (dw.args !== undefined && (typeof dw.args !== "object" || dw.args === null)) {
106
+ return { ok: false, error: at(`"args" must be a JSON Schema object`) };
107
+ }
108
+ if (!Array.isArray(dw.steps) || dw.steps.length === 0) {
109
+ return { ok: false, error: at(`"steps" must be a non-empty array`) };
110
+ }
111
+ const names = new Set();
112
+ for (const [index, stepRaw] of dw.steps.entries()) {
113
+ if (typeof stepRaw !== "object" || stepRaw === null) {
114
+ return { ok: false, error: at(`steps[${index}] must be an object`) };
115
+ }
116
+ const step = stepRaw;
117
+ if (typeof step.name !== "string" || !ID_PATTERN.test(step.name)) {
118
+ return { ok: false, error: at(`steps[${index}].name must match ${ID_PATTERN}`) };
119
+ }
120
+ if (names.has(step.name)) {
121
+ return { ok: false, error: at(`duplicate step name "${step.name}"`) };
122
+ }
123
+ names.add(step.name);
124
+ const present = STEP_KEYS.filter((k) => step[k] !== undefined);
125
+ if (present.length !== 1) {
126
+ return {
127
+ ok: false,
128
+ error: at(`steps[${index}] ("${step.name}") must have exactly one of ${STEP_KEYS.join("/")}, got [${present.join("/") || "none"}]`),
129
+ };
130
+ }
131
+ const kind = present[0];
132
+ // 各步骤键开放的可选键(P1-4 agent 调用级选项;P2-9 subflow args;
133
+ // pipeline items/outputAs/onFailure + 调用级选项;race outputAs)
134
+ const optionKeys = OPTION_KEYS_BY_KIND[kind] ?? [];
135
+ if (kind === "agent" || kind === "pipeline") {
136
+ const optionError = checkAgentOptions(step, index);
137
+ if (optionError) {
138
+ return { ok: false, error: at(optionError) };
139
+ }
140
+ }
141
+ if (kind === "verify") {
142
+ const v = step.verify;
143
+ if (typeof v !== "object" || v === null || typeof v.artifact !== "string") {
144
+ return { ok: false, error: at(`steps[${index}].verify must be { artifact: string, criteria?, reviewers?, label?, threshold?, lenses? }`) };
145
+ }
146
+ const vo = v;
147
+ for (const k of Object.keys(vo)) {
148
+ if (!["artifact", "criteria", "reviewers", "label", "threshold", "lenses"].includes(k)) {
149
+ return { ok: false, error: at(`steps[${index}].verify has unknown key "${k}"`) };
150
+ }
151
+ }
152
+ if (vo.reviewers !== undefined && typeof vo.reviewers !== "number") {
153
+ return { ok: false, error: at(`steps[${index}].verify.reviewers must be a number`) };
154
+ }
155
+ // P2-11 投票阈值:数值且在 (0, 1]
156
+ if (vo.threshold !== undefined &&
157
+ (typeof vo.threshold !== "number" || !Number.isFinite(vo.threshold) || vo.threshold <= 0 || vo.threshold > 1)) {
158
+ return { ok: false, error: at(`steps[${index}].verify.threshold must be a number in (0, 1]`) };
159
+ }
160
+ // P2-11 多视角:非空数组,每项 { name, criteria } 均为非空字符串
161
+ if (vo.lenses !== undefined) {
162
+ if (!Array.isArray(vo.lenses) || vo.lenses.length === 0) {
163
+ return { ok: false, error: at(`steps[${index}].verify.lenses must be a non-empty array of { name, criteria }`) };
164
+ }
165
+ for (const [li, lens] of vo.lenses.entries()) {
166
+ const lo = lens;
167
+ if (typeof lo !== "object" || lo === null || typeof lo.name !== "string" || lo.name.length === 0 || typeof lo.criteria !== "string" || lo.criteria.length === 0) {
168
+ return { ok: false, error: at(`steps[${index}].verify.lenses[${li}] must be { name: non-empty string, criteria: non-empty string }`) };
169
+ }
170
+ for (const k of Object.keys(lo)) {
171
+ if (!["name", "criteria"].includes(k)) {
172
+ return { ok: false, error: at(`steps[${index}].verify.lenses[${li}] has unknown key "${k}"`) };
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+ else if (kind === "subflow") {
179
+ // P2-9:args = 原始值(number/boolean)或字符串模板的对象
180
+ if (step.args !== undefined) {
181
+ if (typeof step.args !== "object" || step.args === null || Array.isArray(step.args)) {
182
+ return { ok: false, error: at(`steps[${index}].args must be an object of primitives or templates`) };
183
+ }
184
+ for (const [argKey, argValue] of Object.entries(step.args)) {
185
+ if (typeof argValue !== "string" && typeof argValue !== "number" && typeof argValue !== "boolean") {
186
+ return { ok: false, error: at(`steps[${index}].args.${argKey} must be a string (template), number, or boolean`) };
187
+ }
188
+ }
189
+ }
190
+ }
191
+ else if (kind === "pipeline") {
192
+ // 声明式 pipeline:payload 非空提示模板 + items 非空模板数组 + 可选键类型
193
+ if (typeof step.pipeline !== "string" || step.pipeline.length === 0) {
194
+ return { ok: false, error: at(`steps[${index}].pipeline must be a non-empty string (prompt template, {{item}} references the entry)`) };
195
+ }
196
+ if (!Array.isArray(step.items) ||
197
+ step.items.length === 0 ||
198
+ !step.items.every((it) => typeof it === "string" && it.length > 0)) {
199
+ return { ok: false, error: at(`steps[${index}].items must be a non-empty array of non-empty string templates`) };
200
+ }
201
+ if (step.outputAs !== undefined && (typeof step.outputAs !== "string" || !ID_PATTERN.test(step.outputAs))) {
202
+ return { ok: false, error: at(`steps[${index}].outputAs must match ${ID_PATTERN}`) };
203
+ }
204
+ if (step.onFailure !== undefined && step.onFailure !== "fail-fast" && step.onFailure !== "continue") {
205
+ return { ok: false, error: at(`steps[${index}].onFailure must be "fail-fast" | "continue"`) };
206
+ }
207
+ }
208
+ else if (kind === "race") {
209
+ // 声明式 race:≥2 个非空提示模板(单分支无竞速意义,fail-loud)+ outputAs
210
+ if (!Array.isArray(step.race) ||
211
+ step.race.length < 2 ||
212
+ !step.race.every((p) => typeof p === "string" && p.length > 0)) {
213
+ return { ok: false, error: at(`steps[${index}].race must be an array of at least 2 non-empty prompt templates`) };
214
+ }
215
+ if (step.outputAs !== undefined && (typeof step.outputAs !== "string" || !ID_PATTERN.test(step.outputAs))) {
216
+ return { ok: false, error: at(`steps[${index}].outputAs must match ${ID_PATTERN}`) };
217
+ }
218
+ }
219
+ else if (typeof step[kind] !== "string") {
220
+ return { ok: false, error: at(`steps[${index}].${kind} must be a string (template)`) };
221
+ }
222
+ const unknownStepKeys = Object.keys(step).filter((k) => k !== "name" &&
223
+ !STEP_KEYS.includes(k) &&
224
+ !optionKeys.includes(k));
225
+ if (unknownStepKeys.length > 0) {
226
+ return {
227
+ ok: false,
228
+ error: at(`steps[${index}] has unknown key(s) [${unknownStepKeys.join(", ")}] ` +
229
+ `(allowed: name + exactly one step key (${STEP_KEYS.join("/")})` +
230
+ `${optionKeys.length > 0 ? ` + optional ${optionKeys.join("/")}` : ""})`),
231
+ };
232
+ }
233
+ }
234
+ if (dw.output !== undefined && typeof dw.output !== "string") {
235
+ return { ok: false, error: at(`"output" must be a string (template)`) };
236
+ }
237
+ return {
238
+ ok: true,
239
+ value: {
240
+ id: dw.id,
241
+ version,
242
+ description: dw.description,
243
+ args: dw.args,
244
+ steps: dw.steps,
245
+ output: dw.output,
246
+ },
247
+ };
248
+ }
249
+ /**
250
+ * 模板解析:{{topic}} / {{args.x}} / {{steps.<name>}}(允许空白)。
251
+ * 未知变量抛错(步骤级失败、journal 可见,绝不静默空串)。
252
+ */
253
+ export function resolveTemplate(template, args, stepOutputs) {
254
+ return template.replace(/\{\{\s*([\w.-]+)\s*\}\}/g, (_match, ref) => {
255
+ if (ref === "topic") {
256
+ const topic = args.topic;
257
+ if (topic === undefined)
258
+ throw new Error(`[agentic-workflow] template variable {{topic}} is not provided (flow args lack topic)`);
259
+ return String(topic);
260
+ }
261
+ if (ref.startsWith("args.")) {
262
+ const key = ref.slice("args.".length);
263
+ const value = args[key];
264
+ if (value === undefined)
265
+ throw new Error(`[agentic-workflow] template variable {{args.${key}}} is not provided`);
266
+ return String(value);
267
+ }
268
+ if (ref.startsWith("steps.")) {
269
+ const name = ref.slice("steps.".length);
270
+ const value = stepOutputs.get(name);
271
+ if (value === undefined) {
272
+ throw new Error(`[agentic-workflow] template variable {{steps.${name}}} not found ` +
273
+ `(available step outputs: [${[...stepOutputs.keys()].join(", ") || "none"}])`);
274
+ }
275
+ return value;
276
+ }
277
+ throw new Error(`[agentic-workflow] unknown template variable {{${ref}}} (supported: {{topic}}, {{args.x}}, {{steps.<name>}})`);
278
+ });
279
+ }
280
+ /** P0-2:声明对象 -> 可注册 definition(workflow_define 内联定义复用同一转换) */
281
+ export function toDefinition(dw) {
282
+ // 默认输出来源:最后一个「产出型」步骤(agent 原文 / race 胜者原文;
283
+ // pipeline 为结果数组的 JSON 串——需要可读输出就显式写 output 模板)
284
+ const lastProducerName = [...dw.steps]
285
+ .reverse()
286
+ .find((s) => "agent" in s || "pipeline" in s || "race" in s)?.name;
287
+ return {
288
+ id: dw.id,
289
+ version: dw.version ?? "1.0.0",
290
+ description: dw.description ?? `custom workflow (${dw.steps.length} steps)`,
291
+ argsSchema: dw.args ?? {
292
+ type: "object",
293
+ properties: { topic: { type: "string", description: "主题(工具恒传参数)" } },
294
+ required: ["topic"],
295
+ },
296
+ stepNames: dw.steps.map((s) => s.name),
297
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
298
+ async run(args, ctx) {
299
+ const flowArgs = (args ?? {});
300
+ const stepOutputs = new Map();
301
+ const resolve = (template) => resolveTemplate(template, flowArgs, stepOutputs);
302
+ const root = ctx.workspaceRoot ?? process.cwd();
303
+ const built = dw.steps.map((step) => {
304
+ if ("agent" in step) {
305
+ return async (prev) => {
306
+ // P1-4:声明级调用选项透传(model/timeoutMs/retries)
307
+ const result = await agent(resolve(step.agent), {
308
+ ...(step.model !== undefined ? { model: step.model } : {}),
309
+ ...(step.timeoutMs !== undefined ? { timeoutMs: step.timeoutMs } : {}),
310
+ ...(step.retries !== undefined ? { retries: step.retries } : {}),
311
+ });
312
+ stepOutputs.set(step.name, result.output);
313
+ return { ...prev, [step.name]: result.output };
314
+ };
315
+ }
316
+ if ("checkpoint" in step) {
317
+ return async (prev) => {
318
+ await checkpoint(resolve(step.checkpoint), { label: step.name });
319
+ return { ...prev, [step.name]: "approved" };
320
+ };
321
+ }
322
+ if ("verify" in step) {
323
+ return async (prev) => {
324
+ const result = await assertVerify(resolve(step.verify.artifact), {
325
+ criteria: step.verify.criteria,
326
+ reviewers: step.verify.reviewers,
327
+ label: step.verify.label ?? step.name,
328
+ // P2-11:投票阈值 + 多视角透传
329
+ ...(step.verify.threshold !== undefined
330
+ ? { passThreshold: step.verify.threshold }
331
+ : {}),
332
+ ...(step.verify.lenses !== undefined ? { lenses: step.verify.lenses } : {}),
333
+ });
334
+ return { ...prev, [step.name]: result.passed ? "passed" : "failed" };
335
+ };
336
+ }
337
+ if ("subflow" in step) {
338
+ return async (prev) => {
339
+ if (typeof ctx.subflow !== "function") {
340
+ throw new Error(`[agentic-workflow] subflow step "${step.name}" requires the journalDir ` +
341
+ "plugin option (subflow runs are journaled with lineage)");
342
+ }
343
+ // args 值:字符串走模板解析,原始值直传
344
+ const subArgs = {};
345
+ for (const [key, value] of Object.entries(step.args ?? {})) {
346
+ subArgs[key] = typeof value === "string" ? resolve(value) : value;
347
+ }
348
+ const result = await ctx.subflow(resolve(step.subflow), subArgs);
349
+ stepOutputs.set(step.name, result.output);
350
+ return { ...prev, [step.name]: result.output };
351
+ };
352
+ }
353
+ if ("pipeline" in step) {
354
+ return async (prev) => {
355
+ // 条目 = 模板数组逐项解析({{topic}}/{{args.x}}/{{steps.x}})
356
+ const items = step.items.map((tpl) => resolve(tpl));
357
+ // 每条目一次 agent 调用;{{item}} 先字面替换(replace 用函数形参,
358
+ // 条目含 $ 等特殊字符不受 replacement pattern 影响)再走通用模板
359
+ const results = await pipeline(items, [
360
+ async (item) => {
361
+ const prompt = resolveTemplate(step.pipeline.replace(/\{\{\s*item\s*\}\}/g, () => item), flowArgs, stepOutputs);
362
+ const result = await agent(prompt, {
363
+ ...(step.model !== undefined ? { model: step.model } : {}),
364
+ ...(step.timeoutMs !== undefined ? { timeoutMs: step.timeoutMs } : {}),
365
+ ...(step.retries !== undefined ? { retries: step.retries } : {}),
366
+ });
367
+ return result.output;
368
+ },
369
+ ], { ...(step.onFailure !== undefined ? { onFailure: step.onFailure } : {}) });
370
+ stepOutputs.set(step.name, JSON.stringify(results));
371
+ return { ...prev, [step.outputAs ?? step.name]: results };
372
+ };
373
+ }
374
+ if ("race" in step) {
375
+ return async (prev) => {
376
+ // 并发起跑,首个成功者的输出胜出(全败抛 WorkflowRaceError)
377
+ const winner = await race(step.race.map((tpl) => async () => {
378
+ const result = await agent(resolve(tpl));
379
+ return result.output;
380
+ }));
381
+ stepOutputs.set(step.name, winner);
382
+ return { ...prev, [step.outputAs ?? step.name]: winner };
383
+ };
384
+ }
385
+ return async (prev) => {
386
+ const target = path.resolve(root, resolve(step.fileExists));
387
+ await assert(() => fileExistsPredicate(target), `${step.name}: ${target} exists in workspace (${root})`);
388
+ return { ...prev, [step.name]: target };
389
+ };
390
+ });
391
+ await ctx.runSteps(built, { stepNames: dw.steps.map((s) => s.name) });
392
+ const output = dw.output !== undefined
393
+ ? resolve(dw.output)
394
+ : stepOutputs.get(lastProducerName ?? "") ?? `workflow ${dw.id} completed`;
395
+ return { output };
396
+ },
397
+ };
398
+ }
399
+ /**
400
+ * 装载入口:读取 + 校验 + 转换。文件级错误收集返回(调用方 warn+跳过),
401
+ * 绝不因单个坏文件中断装载。reservedIds 命中即拒(避免遮蔽内置流程)。
402
+ */
403
+ /**
404
+ * 装载代码流程模块(P2-14):.js/.mjs/.cjs 动态 import,取
405
+ * default / definition / workflow 三种导出形态之一,校验
406
+ * WorkflowDefinition 最小形状(id/version 字符串 + run 函数)。
407
+ * 返回定义或错误文案(含文件名前缀);不抛出。
408
+ */
409
+ async function loadCodeWorkflowModule(file) {
410
+ const at = (msg) => `${path.basename(file)}: ${msg}`;
411
+ let mod;
412
+ try {
413
+ mod = await import(pathToFileURL(file).href);
414
+ }
415
+ catch (error) {
416
+ return { ok: false, error: at(`failed to import (${error instanceof Error ? error.message : String(error)})`) };
417
+ }
418
+ if (typeof mod !== "object" || mod === null) {
419
+ return { ok: false, error: at("module must export a workflow (default export or named `definition`)") };
420
+ }
421
+ const candidate = mod.default ?? mod.definition ?? mod.workflow;
422
+ if (typeof candidate !== "object" || candidate === null) {
423
+ return {
424
+ ok: false,
425
+ error: at("module must export a workflow (default export or named `definition`): export defineWorkflow({...}) result"),
426
+ };
427
+ }
428
+ const def = candidate;
429
+ if (typeof def.id !== "string" || def.id.length === 0) {
430
+ return { ok: false, error: at("workflow.id must be a non-empty string") };
431
+ }
432
+ if (typeof def.version !== "string" || def.version.length === 0) {
433
+ return { ok: false, error: at("workflow.version must be a non-empty string (semver; bump on structure change)") };
434
+ }
435
+ if (typeof def.run !== "function") {
436
+ return { ok: false, error: at("workflow.run must be a function: async run(args, ctx)") };
437
+ }
438
+ return { ok: true, definition: candidate };
439
+ }
440
+ /**
441
+ * 装载自定义流程(声明式 JSON + 代码式 JS 模块,P2-14 起统一入口)。
442
+ * 文件级错误 warn+跳过(与装载纪律一致:观测/装载不能成为主链路故障源)。
443
+ */
444
+ export async function loadCustomWorkflows(entries, baseDir, reservedIds = []) {
445
+ const { files, errors } = await expandEntries(entries, baseDir);
446
+ const definitions = [];
447
+ const reserved = new Set(reservedIds);
448
+ const seenIds = new Map();
449
+ for (const file of files) {
450
+ if (CODE_EXTENSIONS.some((ext) => file.endsWith(ext))) {
451
+ const loaded = await loadCodeWorkflowModule(file);
452
+ if (!loaded.ok) {
453
+ errors.push(loaded.error);
454
+ continue;
455
+ }
456
+ if (reserved.has(loaded.definition.id)) {
457
+ errors.push(`${path.basename(file)}: id "${loaded.definition.id}" is reserved by a built-in workflow`);
458
+ continue;
459
+ }
460
+ const key = `${loaded.definition.id}@${loaded.definition.version}`;
461
+ const seenIn = seenIds.get(key);
462
+ if (seenIn) {
463
+ errors.push(`${path.basename(file)}: duplicate ${key} (already loaded from ${seenIn})`);
464
+ continue;
465
+ }
466
+ seenIds.set(key, path.basename(file));
467
+ definitions.push(loaded.definition);
468
+ continue;
469
+ }
470
+ let raw;
471
+ try {
472
+ raw = JSON.parse(await readFile(file, "utf8"));
473
+ }
474
+ catch (error) {
475
+ errors.push(`${path.basename(file)}: invalid JSON (${error instanceof Error ? error.message : String(error)})`);
476
+ continue;
477
+ }
478
+ const validated = validateWorkflow(raw, file);
479
+ if (!validated.ok) {
480
+ errors.push(validated.error);
481
+ continue;
482
+ }
483
+ const dw = validated.value;
484
+ if (reserved.has(dw.id)) {
485
+ errors.push(`${path.basename(file)}: id "${dw.id}" is reserved by a built-in workflow`);
486
+ continue;
487
+ }
488
+ const seenIn = seenIds.get(`${dw.id}@${dw.version}`);
489
+ if (seenIn) {
490
+ errors.push(`${path.basename(file)}: duplicate ${dw.id}@${dw.version} (already loaded from ${seenIn})`);
491
+ continue;
492
+ }
493
+ seenIds.set(`${dw.id}@${dw.version}`, path.basename(file));
494
+ definitions.push(toDefinition(dw));
495
+ }
496
+ return { definitions, errors };
497
+ }
498
+ /** @deprecated 旧名(P2-14 起装载范围扩展到代码流程),等价 loadCustomWorkflows */
499
+ export const loadDeclarativeWorkflows = loadCustomWorkflows;
500
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/workflows/loader.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,14 @@
1
1
  /**
2
- * 当前 workspace 的进程内环境态(P2.7)
2
+ * 当前 workspace 的进程内环境态(P2.7;P2-9 起 run 级化)
3
3
  *
4
- * 与 setExecutor / setCheckpointGate 同一模式(ambient 绑定):
5
- * runner 在 def.run 期间设置,agent() 读取并下发给 executor 作为子会话 cwd。
4
+ * 读取顺序:run 上下文(AsyncLocalStorage)优先,回落模块级绑定。
5
+ * runner 经 runWith 把 workspace 放进 run 上下文;subflow 子 run 未显式
6
+ * 覆盖时继承父作用域——子 agent 的 cwd 落在父 run 的工作区。
7
+ * agent() 读取并下发给 executor 作为子会话 cwd;
6
8
  * workflow 原语不感知 runner 的存在。
7
9
  */
8
10
  import type { WorkspaceHandle } from "./provider.js";
9
- /** 设置/清除当前 workspace(runner 在 run 生命周期内调用) */
11
+ /** 设置/清除模块级 workspace(兼容路径;runner 现在走 run 上下文) */
10
12
  export declare function setCurrentWorkspace(handle: WorkspaceHandle | undefined): void;
11
13
  /** 当前 run 的 workspace(未启用隔离时为 undefined) */
12
14
  export declare function currentWorkspace(): WorkspaceHandle | undefined;
@@ -1,17 +1,23 @@
1
1
  /**
2
- * 当前 workspace 的进程内环境态(P2.7)
2
+ * 当前 workspace 的进程内环境态(P2.7;P2-9 起 run 级化)
3
3
  *
4
- * 与 setExecutor / setCheckpointGate 同一模式(ambient 绑定):
5
- * runner 在 def.run 期间设置,agent() 读取并下发给 executor 作为子会话 cwd。
4
+ * 读取顺序:run 上下文(AsyncLocalStorage)优先,回落模块级绑定。
5
+ * runner 经 runWith 把 workspace 放进 run 上下文;subflow 子 run 未显式
6
+ * 覆盖时继承父作用域——子 agent 的 cwd 落在父 run 的工作区。
7
+ * agent() 读取并下发给 executor 作为子会话 cwd;
6
8
  * workflow 原语不感知 runner 的存在。
7
9
  */
10
+ import { currentRunContext } from "../runtime/run-context.js";
8
11
  let current;
9
- /** 设置/清除当前 workspace(runner 在 run 生命周期内调用) */
12
+ /** 设置/清除模块级 workspace(兼容路径;runner 现在走 run 上下文) */
10
13
  export function setCurrentWorkspace(handle) {
11
14
  current = handle;
12
15
  }
13
16
  /** 当前 run 的 workspace(未启用隔离时为 undefined) */
14
17
  export function currentWorkspace() {
18
+ const ctx = currentRunContext();
19
+ if (ctx)
20
+ return ctx.workspace;
15
21
  return current;
16
22
  }
17
23
  //# sourceMappingURL=ambient.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"ambient.js","sourceRoot":"","sources":["../../src/workspace/ambient.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,IAAI,OAAoC,CAAA;AAExC,kDAAkD;AAClD,MAAM,UAAU,mBAAmB,CAAC,MAAmC;IACrE,OAAO,GAAG,MAAM,CAAA;AAClB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAA;IAC/B,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,SAAS,CAAA;IAC7B,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * InPlaceWorkspaceProvider —— 无隔离模式的默认工作区(P3 Blocker 修复)
3
+ *
4
+ * 背景:workspaceRoot 之前只在配置 git-worktree 隔离时才存在;无隔离时
5
+ * 流程落到 process.cwd()——在 OpenCode 托管进程里 cwd **不是**项目目录
6
+ * (长驻 server 场景实测为 HOME),导致 artifact/reliable 等以
7
+ * 「workspace 根」为前提的流程假失败(文件写对位置、check 查错位置)。
8
+ *
9
+ * 语义:
10
+ * - create():root = 项目目录(原地,不创建任何东西)
11
+ * - dispose():必须 no-op——原地工作区就是用户的项目目录,绝不能删
12
+ * - attach():resume 时回到 journal 记录的原目录;目录消失必须抛错
13
+ * (绝不静默重建,与 worktree 纪律一致)
14
+ */
15
+ import type { WorkspaceHandle, WorkspaceIdentity, WorkspaceProvider } from "./provider.js";
16
+ export interface InPlaceWorkspaceProviderOptions {
17
+ /** 项目目录(workspaceRoot 解析到这里) */
18
+ startDir: string;
19
+ }
20
+ export declare class InPlaceWorkspaceProvider implements WorkspaceProvider {
21
+ readonly kind = "in-place";
22
+ private readonly startDir;
23
+ constructor(options: InPlaceWorkspaceProviderOptions);
24
+ create(): Promise<WorkspaceHandle>;
25
+ attach(identity: WorkspaceIdentity): Promise<WorkspaceHandle>;
26
+ }