botmux 2.93.1 → 2.94.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 (197) hide show
  1. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  2. package/dist/adapters/cli/claude-code.js +6 -1
  3. package/dist/adapters/cli/claude-code.js.map +1 -1
  4. package/dist/bot-registry.d.ts +10 -1
  5. package/dist/bot-registry.d.ts.map +1 -1
  6. package/dist/bot-registry.js +2 -0
  7. package/dist/bot-registry.js.map +1 -1
  8. package/dist/cli/workflow.d.ts.map +1 -1
  9. package/dist/cli/workflow.js +11 -4
  10. package/dist/cli/workflow.js.map +1 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +133 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  15. package/dist/core/dashboard-ipc-server.js +3 -0
  16. package/dist/core/dashboard-ipc-server.js.map +1 -1
  17. package/dist/core/inherit-peer.d.ts +5 -0
  18. package/dist/core/inherit-peer.d.ts.map +1 -1
  19. package/dist/core/inherit-peer.js +3 -0
  20. package/dist/core/inherit-peer.js.map +1 -1
  21. package/dist/core/worker-pool.d.ts.map +1 -1
  22. package/dist/core/worker-pool.js +29 -0
  23. package/dist/core/worker-pool.js.map +1 -1
  24. package/dist/daemon.d.ts.map +1 -1
  25. package/dist/daemon.js +282 -12
  26. package/dist/daemon.js.map +1 -1
  27. package/dist/dashboard/auth.d.ts.map +1 -1
  28. package/dist/dashboard/auth.js +7 -1
  29. package/dist/dashboard/auth.js.map +1 -1
  30. package/dist/dashboard/bot-payload.d.ts +1 -0
  31. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  32. package/dist/dashboard/bot-payload.js +1 -0
  33. package/dist/dashboard/bot-payload.js.map +1 -1
  34. package/dist/dashboard/v3-runs-api.d.ts +26 -0
  35. package/dist/dashboard/v3-runs-api.d.ts.map +1 -0
  36. package/dist/dashboard/v3-runs-api.js +67 -0
  37. package/dist/dashboard/v3-runs-api.js.map +1 -0
  38. package/dist/dashboard/web/app.js +21 -9
  39. package/dist/dashboard/web/app.js.map +1 -1
  40. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  41. package/dist/dashboard/web/bot-defaults.js +24 -1
  42. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  43. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  44. package/dist/dashboard/web/i18n.js +12 -4
  45. package/dist/dashboard/web/i18n.js.map +1 -1
  46. package/dist/dashboard/web/legacy-workflow-link.d.ts +2 -0
  47. package/dist/dashboard/web/legacy-workflow-link.d.ts.map +1 -0
  48. package/dist/dashboard/web/legacy-workflow-link.js +12 -0
  49. package/dist/dashboard/web/legacy-workflow-link.js.map +1 -0
  50. package/dist/dashboard/web/v3-terminal.d.ts +11 -0
  51. package/dist/dashboard/web/v3-terminal.d.ts.map +1 -0
  52. package/dist/dashboard/web/v3-terminal.js +143 -0
  53. package/dist/dashboard/web/v3-terminal.js.map +1 -0
  54. package/dist/dashboard/web/v3.d.ts +2 -0
  55. package/dist/dashboard/web/v3.d.ts.map +1 -0
  56. package/dist/dashboard/web/v3.js +564 -0
  57. package/dist/dashboard/web/v3.js.map +1 -0
  58. package/dist/dashboard/web/workflows.d.ts.map +1 -1
  59. package/dist/dashboard/web/workflows.js +12 -8
  60. package/dist/dashboard/web/workflows.js.map +1 -1
  61. package/dist/dashboard-web/app.js +787 -699
  62. package/dist/dashboard-web/index.html +1 -1
  63. package/dist/dashboard-web/style.css +223 -0
  64. package/dist/dashboard.js +7 -0
  65. package/dist/dashboard.js.map +1 -1
  66. package/dist/i18n/en.js +3 -3
  67. package/dist/i18n/zh.js +3 -3
  68. package/dist/im/lark/card-handler.d.ts +12 -0
  69. package/dist/im/lark/card-handler.d.ts.map +1 -1
  70. package/dist/im/lark/card-handler.js +28 -0
  71. package/dist/im/lark/card-handler.js.map +1 -1
  72. package/dist/im/lark/v3-blocked-card-handler.d.ts +28 -0
  73. package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -0
  74. package/dist/im/lark/v3-blocked-card-handler.js +134 -0
  75. package/dist/im/lark/v3-blocked-card-handler.js.map +1 -0
  76. package/dist/im/lark/v3-blocked-card.d.ts +75 -0
  77. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -0
  78. package/dist/im/lark/v3-blocked-card.js +206 -0
  79. package/dist/im/lark/v3-blocked-card.js.map +1 -0
  80. package/dist/im/lark/v3-gate-card-handler.d.ts +31 -0
  81. package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -0
  82. package/dist/im/lark/v3-gate-card-handler.js +110 -0
  83. package/dist/im/lark/v3-gate-card-handler.js.map +1 -0
  84. package/dist/im/lark/v3-gate-card.d.ts +47 -0
  85. package/dist/im/lark/v3-gate-card.d.ts.map +1 -0
  86. package/dist/im/lark/v3-gate-card.js +119 -0
  87. package/dist/im/lark/v3-gate-card.js.map +1 -0
  88. package/dist/im/lark/v3-loop-grant-card-handler.d.ts +28 -0
  89. package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -0
  90. package/dist/im/lark/v3-loop-grant-card-handler.js +90 -0
  91. package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -0
  92. package/dist/im/lark/v3-loop-grant-card.d.ts +46 -0
  93. package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -0
  94. package/dist/im/lark/v3-loop-grant-card.js +119 -0
  95. package/dist/im/lark/v3-loop-grant-card.js.map +1 -0
  96. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts +29 -0
  97. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -0
  98. package/dist/im/lark/v3-revisit-grant-card-handler.js +96 -0
  99. package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -0
  100. package/dist/im/lark/v3-revisit-grant-card.d.ts +52 -0
  101. package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -0
  102. package/dist/im/lark/v3-revisit-grant-card.js +123 -0
  103. package/dist/im/lark/v3-revisit-grant-card.js.map +1 -0
  104. package/dist/im/lark/workflow-cards.d.ts.map +1 -1
  105. package/dist/im/lark/workflow-cards.js +5 -1
  106. package/dist/im/lark/workflow-cards.js.map +1 -1
  107. package/dist/im/lark/workflow-progress-card.d.ts +1 -1
  108. package/dist/im/lark/workflow-progress-card.js +1 -1
  109. package/dist/im/lark/workflow-slash-command.d.ts +28 -0
  110. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
  111. package/dist/im/lark/workflow-slash-command.js +61 -5
  112. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  113. package/dist/services/card-prefs-store.d.ts +4 -0
  114. package/dist/services/card-prefs-store.d.ts.map +1 -1
  115. package/dist/services/card-prefs-store.js +19 -0
  116. package/dist/services/card-prefs-store.js.map +1 -1
  117. package/dist/skills/definitions.d.ts.map +1 -1
  118. package/dist/skills/definitions.js +208 -4
  119. package/dist/skills/definitions.js.map +1 -1
  120. package/dist/worker.js +10 -1
  121. package/dist/worker.js.map +1 -1
  122. package/dist/workflows/definition.d.ts +80 -80
  123. package/dist/workflows/events/payloads.d.ts +4 -4
  124. package/dist/workflows/events/schema.d.ts +16 -16
  125. package/dist/workflows/v3/architect.d.ts +37 -0
  126. package/dist/workflows/v3/architect.d.ts.map +1 -0
  127. package/dist/workflows/v3/architect.js +226 -0
  128. package/dist/workflows/v3/architect.js.map +1 -0
  129. package/dist/workflows/v3/bot-resolve.d.ts +21 -0
  130. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -0
  131. package/dist/workflows/v3/bot-resolve.js +47 -0
  132. package/dist/workflows/v3/bot-resolve.js.map +1 -0
  133. package/dist/workflows/v3/cli-run.d.ts +24 -0
  134. package/dist/workflows/v3/cli-run.d.ts.map +1 -0
  135. package/dist/workflows/v3/cli-run.js +265 -0
  136. package/dist/workflows/v3/cli-run.js.map +1 -0
  137. package/dist/workflows/v3/contract.d.ts +302 -0
  138. package/dist/workflows/v3/contract.d.ts.map +1 -0
  139. package/dist/workflows/v3/contract.js +91 -0
  140. package/dist/workflows/v3/contract.js.map +1 -0
  141. package/dist/workflows/v3/daemon-run.d.ts +311 -0
  142. package/dist/workflows/v3/daemon-run.d.ts.map +1 -0
  143. package/dist/workflows/v3/daemon-run.js +775 -0
  144. package/dist/workflows/v3/daemon-run.js.map +1 -0
  145. package/dist/workflows/v3/dag.d.ts +332 -0
  146. package/dist/workflows/v3/dag.d.ts.map +1 -0
  147. package/dist/workflows/v3/dag.js +1040 -0
  148. package/dist/workflows/v3/dag.js.map +1 -0
  149. package/dist/workflows/v3/ephemeral-pool.d.ts +29 -0
  150. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -0
  151. package/dist/workflows/v3/ephemeral-pool.js +331 -0
  152. package/dist/workflows/v3/ephemeral-pool.js.map +1 -0
  153. package/dist/workflows/v3/grill-state.d.ts +92 -0
  154. package/dist/workflows/v3/grill-state.d.ts.map +1 -0
  155. package/dist/workflows/v3/grill-state.js +151 -0
  156. package/dist/workflows/v3/grill-state.js.map +1 -0
  157. package/dist/workflows/v3/host.d.ts +88 -0
  158. package/dist/workflows/v3/host.d.ts.map +1 -0
  159. package/dist/workflows/v3/host.js +349 -0
  160. package/dist/workflows/v3/host.js.map +1 -0
  161. package/dist/workflows/v3/human-gate.d.ts +85 -0
  162. package/dist/workflows/v3/human-gate.d.ts.map +1 -0
  163. package/dist/workflows/v3/human-gate.js +153 -0
  164. package/dist/workflows/v3/human-gate.js.map +1 -0
  165. package/dist/workflows/v3/journal.d.ts +207 -0
  166. package/dist/workflows/v3/journal.d.ts.map +1 -0
  167. package/dist/workflows/v3/journal.js +74 -0
  168. package/dist/workflows/v3/journal.js.map +1 -0
  169. package/dist/workflows/v3/manifest.d.ts +17 -0
  170. package/dist/workflows/v3/manifest.d.ts.map +1 -0
  171. package/dist/workflows/v3/manifest.js +266 -0
  172. package/dist/workflows/v3/manifest.js.map +1 -0
  173. package/dist/workflows/v3/ops-projection.d.ts +110 -0
  174. package/dist/workflows/v3/ops-projection.d.ts.map +1 -0
  175. package/dist/workflows/v3/ops-projection.js +0 -0
  176. package/dist/workflows/v3/ops-projection.js.map +1 -0
  177. package/dist/workflows/v3/orchestrator.d.ts +168 -0
  178. package/dist/workflows/v3/orchestrator.d.ts.map +1 -0
  179. package/dist/workflows/v3/orchestrator.js +417 -0
  180. package/dist/workflows/v3/orchestrator.js.map +1 -0
  181. package/dist/workflows/v3/runtime.d.ts +193 -0
  182. package/dist/workflows/v3/runtime.d.ts.map +1 -0
  183. package/dist/workflows/v3/runtime.js +1284 -0
  184. package/dist/workflows/v3/runtime.js.map +1 -0
  185. package/dist/workflows/v3/spec.d.ts +32 -0
  186. package/dist/workflows/v3/spec.d.ts.map +1 -0
  187. package/dist/workflows/v3/spec.js +173 -0
  188. package/dist/workflows/v3/spec.js.map +1 -0
  189. package/dist/workflows/v3/state.d.ts +74 -0
  190. package/dist/workflows/v3/state.d.ts.map +1 -0
  191. package/dist/workflows/v3/state.js +353 -0
  192. package/dist/workflows/v3/state.js.map +1 -0
  193. package/package.json +1 -1
  194. package/dist/dashboard/web/workflow-catalog.d.ts +0 -2
  195. package/dist/dashboard/web/workflow-catalog.d.ts.map +0 -1
  196. package/dist/dashboard/web/workflow-catalog.js +0 -323
  197. package/dist/dashboard/web/workflow-catalog.js.map +0 -1
@@ -0,0 +1,226 @@
1
+ /**
2
+ * v3 architect runner.
3
+ *
4
+ * The grill layer produces `spec.md` + canonical `spec.json`; architect is a
5
+ * single autonomous goal-worker that compiles those files into `dag.json` plus
6
+ * `architect-notes.md`. This helper keeps that fixed execution contract in one
7
+ * place so host commands do not hand-roll goal-mode env/layout details.
8
+ */
9
+ import { mkdirSync, readFileSync, rmSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { createEphemeralPool } from './ephemeral-pool.js';
12
+ import { readAndValidateManifest, ManifestValidationError } from './manifest.js';
13
+ import { GOAL_ENV, SPEC_SCHEMA_VERSION, } from './contract.js';
14
+ const ARCHITECT_NODE_ID = 'architect';
15
+ const ARCHITECT_ATTEMPT_ID = 'architect/attempts/001';
16
+ export function buildArchitectGoal(specPath, specJsonPath) {
17
+ const sketchFields = [
18
+ 'sketchId',
19
+ 'goal',
20
+ 'input_needs',
21
+ 'expected_outputs',
22
+ 'acceptance',
23
+ 'risk_gate',
24
+ 'unknowns',
25
+ ].join(', ');
26
+ return [
27
+ 'You are the botmux v3 workflow architect.',
28
+ '',
29
+ 'Inputs:',
30
+ `- Canonical machine-readable spec: ${specJsonPath}`,
31
+ `- Human narrative spec: ${specPath}`,
32
+ '',
33
+ 'Task:',
34
+ `- Read the canonical spec first; it must use schemaVersion ${SPEC_SCHEMA_VERSION}. Use the narrative spec only for context.`,
35
+ `- Each node sketch has these fields: ${sketchFields}.`,
36
+ '- Compile the spec into a valid botmux v3 DAG JSON.',
37
+ '- Write exactly two primary files under the output directory:',
38
+ ' 1. dag.json',
39
+ ' 2. architect-notes.md',
40
+ '- Do not start or run the workflow. Do not call botmux v3 run.',
41
+ '- The host will validate dag.json with botmux v3 DAG validation and ask the human to review it.',
42
+ '',
43
+ 'dag.json requirements:',
44
+ '- Use the v3 DAG schema: { runId, nodes: [{ id, type:"goal", goal, bot?, depends, inputs, timeoutSec?, humanGate?, resultSchema?, triggerRule? }] }.',
45
+ '- Convert each spec node sketch into one goal node unless the spec explicitly says to merge or drop it.',
46
+ '- Treat input_needs as free-text requirements, NOT as pre-authored edges. Infer depends/inputs only when the dependency is justified by the spec.',
47
+ '- An inputs entry may select ONE named product instead of the whole manifest: { "from": "<nodeId>", "select": { "name": "<manifest file name>" } } (or { "path": ... }). Prefer a selector when the downstream goal only needs a specific file — it keeps the worker\'s context small.',
48
+ '- Preserve risk_gate=true as a humanGate prompt on the corresponding node.',
49
+ '- Estimate a per-node timeoutSec from the task size — err on the GENEROUS side (completion is detected early via the manifest, so an oversized budget costs nothing): quick single-file edits ~600, typical research/writing ~1800, long research / refactor / audit tasks 3600-7200. Hard ceiling 14400 (4h). Omit it only for trivially small nodes (default is 1800).',
50
+ '- Keep node ids path-safe: [A-Za-z0-9._-].',
51
+ '- Ensure the graph is acyclic and every inputs.from also appears in depends.',
52
+ '',
53
+ 'Structured rework loops (type:"loop"):',
54
+ '- When the spec means "rework until verification passes" (fix→test, implement→review, generate→critique→revise), model it as ONE composite loop node — NEVER as a back-edge (the outer graph must stay acyclic; the validator rejects cycles).',
55
+ '- Loop shape: { id, type:"loop", depends, inputs, maxIterations, body:{ nodes:[ <goal nodes> ] }, exit:{ node:"<verifier>", when:{ path:"result.<key>", equals:true } }, feedback:[ "<verifier>.result", "<verifier>.files" ], output:{ from:"<worker>" } }.',
56
+ '- The exit node MUST declare a resultSchema covering the exit key (flat object subset; the key must be in `required`). When the predicate does not match, the loop continues automatically until maxIterations, then blocks for a human (who can grant +1 rounds).',
57
+ '- `output.from` is what downstream consumes — usually the WORKER node\'s product (the fixed code/report), not the verifier\'s.',
58
+ '- Pick maxIterations honestly from how many rework rounds are plausibly useful (typical 3; ceiling 20). Do NOT use a loop when the verification result IS the final product (a one-shot audit/report) — a plain node chain is correct there.',
59
+ '- Cost note: a loop costs up to maxIterations × body-node-count worker runs. State this estimate in architect-notes.md for the Gate-2 reviewer.',
60
+ '',
61
+ 'Conditional branching (edge activation):',
62
+ '- When the spec means "decide once, then take ONE of several FORWARD paths" (review passes → deploy, review fails → report; classify → route by category), model it with conditional edges — NOT a loop (loops are for rework on the SAME work) and NEVER a back-edge.',
63
+ '- A `depends` entry can be either a plain "<nodeId>" (unconditional) or { "from": "<nodeId>", "when": { "path": "result.<key>", <op>: <value> } } where <op> is one of equals/notEquals/gt/gte/lt/lte. The edge activates only when the predicate matches the source\'s result.json.',
64
+ '- The judge pattern: give the deciding node a resultSchema with a string `enum` decision field, e.g. { "decision": { "type": "string", "enum": ["pass", "fail"] } } (required). Predicate values are validated against the enum at authoring time, so a typo fails validation, not the run.',
65
+ '- The source of a conditional edge MUST be a goal node declaring a resultSchema covering the predicate key (key in `required`). To branch on a loop\'s outcome, put a verifier goal node AFTER the loop and branch on ITS result.',
66
+ '- At most ONE edge per (from, to) pair. Express OR over outcomes inside the decision field\'s vocabulary, not as parallel edges.',
67
+ '- Nodes on a branch that is not taken are SKIPPED (no worker runs, zero cost) and skip cascades to their downstream. COVER EVERY decision value with some path: if every final (sink) node ends up skipped the run FAILS as an authoring error (allSinksSkipped) — when in doubt, give the "nothing to do" outcome a cheap terminal node.',
68
+ '- `triggerRule` controls a join over multiple incoming edges: default "all_success" (every edge active); "one_success" (any one active — racing alternatives); { "quorum": N } (at least N active — voting). One_success/quorum nodes receive only the products of ACTIVE upstream edges; the omitted rest is listed for the agent, so write their goal text to tolerate partial inputs.',
69
+ '- Conditional edges are not allowed inside a loop body (first cut).',
70
+ '',
71
+ 'Per-node capability override (optional):',
72
+ '- A goal node (incl. loop body nodes) may set `override: { model?, permissionMode?, systemPromptAppend? }` — restrict or redirect only, never escalate.',
73
+ '- `model`: pick a cheaper/faster model for light nodes (research, summarize, verify) and reserve the strong default for code/synthesis nodes — state the cost reasoning in architect-notes.md.',
74
+ '- `permissionMode: "restricted"`: use for read-only analysis/review nodes that must not modify files or run privileged commands. There is NO "bypass" value — a node can never gain more permission than its bot.',
75
+ '- `systemPromptAppend`: short node-specific guardrails (≤8000 bytes), e.g. "只读分析,不要修改文件". Do not duplicate the goal text here.',
76
+ '',
77
+ 'architect-notes.md requirements:',
78
+ '- Summarize the DAG structure and the reasoning for dependencies/gates.',
79
+ '- For each loop: why a loop, the exit condition, and the worst-case cost estimate (maxIterations × body nodes).',
80
+ '- For each conditional branch: the decision field + its enum, which path each value takes, and confirmation that every value reaches some sink (no allSinksSkipped hole).',
81
+ '- List any assumptions or unresolved risks for human review.',
82
+ ].join('\n');
83
+ }
84
+ export async function runArchitect(input) {
85
+ const attemptDir = join(input.runDir, 'architect', 'attempts', '001');
86
+ const outputDir = join(attemptDir, 'work');
87
+ const inputsPath = join(attemptDir, 'inputs.json');
88
+ const manifestPath = join(attemptDir, 'manifest.json');
89
+ const goalPath = join(attemptDir, 'goal.txt');
90
+ // Architect always reuses attempt 001 (no nextAttemptId increment). Wipe any
91
+ // prior attempt first: otherwise a `revise-dag` re-architect leaves the old
92
+ // manifest.json + work/dag.json in place, the pool's manifest watcher sees a
93
+ // stable manifest and immediately finishes 'ok' WITHOUT running the new
94
+ // worker, so the revision silently validates the previous dag and never takes.
95
+ rmSync(attemptDir, { recursive: true, force: true });
96
+ mkdirSync(outputDir, { recursive: true });
97
+ const goal = buildArchitectGoal(input.specPath, input.specJsonPath);
98
+ const inputs = {
99
+ inputs: [
100
+ { from: 'grill', name: 'spec.json', path: input.specJsonPath, kind: 'json' },
101
+ { from: 'grill', name: 'spec.md', path: input.specPath, kind: 'markdown' },
102
+ ],
103
+ };
104
+ const req = {
105
+ runId: input.runId,
106
+ attemptId: ARCHITECT_ATTEMPT_ID,
107
+ node: {
108
+ id: ARCHITECT_NODE_ID,
109
+ type: 'goal',
110
+ goal,
111
+ bot: input.botSnapshot.larkAppId,
112
+ depends: [],
113
+ inputs: [],
114
+ timeoutSec: Math.ceil((input.timeoutMs ?? 10 * 60_000) / 1000),
115
+ humanGate: null,
116
+ },
117
+ botSnapshot: input.botSnapshot,
118
+ runDir: input.runDir,
119
+ attemptDir,
120
+ inputsPath,
121
+ outputDir,
122
+ env: {
123
+ [GOAL_ENV.GOAL_PATH]: goalPath,
124
+ [GOAL_ENV.INPUTS_PATH]: inputsPath,
125
+ [GOAL_ENV.OUTPUT_DIR]: outputDir,
126
+ [GOAL_ENV.MANIFEST_PATH]: manifestPath,
127
+ [GOAL_ENV.ATTEMPT_DIR]: attemptDir,
128
+ [GOAL_ENV.V3_MARKER]: '1',
129
+ },
130
+ timeoutMs: input.timeoutMs ?? 10 * 60_000,
131
+ cancelSignal: input.cancelSignal,
132
+ stdoutPath: join(attemptDir, 'stdout.log'),
133
+ stderrPath: join(attemptDir, 'stderr.log'),
134
+ };
135
+ await writeJsonFile(goalPath, goal);
136
+ await writeJsonFile(inputsPath, inputs);
137
+ const runNode = input.runNode ?? realRunNode(input.resolveLarkAppSecret);
138
+ const validateManifest = input.validateManifest ?? defaultValidateManifest;
139
+ const runResult = await runNode(req);
140
+ const verdict = await validateManifest(runResult.manifestPath, outputDir);
141
+ if (runResult.status !== 'ok') {
142
+ return {
143
+ status: 'fail',
144
+ manifestPath: runResult.manifestPath,
145
+ problems: ['architect worker failed before producing a successful result'],
146
+ sessionInfo: runResult.sessionInfo,
147
+ };
148
+ }
149
+ if (!verdict.ok || !verdict.manifest) {
150
+ return {
151
+ status: 'fail',
152
+ manifestPath: runResult.manifestPath,
153
+ problems: verdict.problems ?? ['architect manifest is invalid'],
154
+ sessionInfo: runResult.sessionInfo,
155
+ };
156
+ }
157
+ if (verdict.manifest.status !== 'ok') {
158
+ return {
159
+ status: 'fail',
160
+ manifestPath: runResult.manifestPath,
161
+ problems: [formatManifestError(verdict.manifest)],
162
+ sessionInfo: runResult.sessionInfo,
163
+ };
164
+ }
165
+ const dagPath = manifestPathFor(verdict.manifest, outputDir, 'dag.json');
166
+ const notesPath = manifestPathFor(verdict.manifest, outputDir, 'architect-notes.md');
167
+ const problems = [
168
+ ...(dagPath ? [] : ['architect manifest must include dag.json']),
169
+ ...(notesPath ? [] : ['architect manifest must include architect-notes.md']),
170
+ ];
171
+ if (problems.length > 0) {
172
+ return {
173
+ status: 'fail',
174
+ manifestPath: runResult.manifestPath,
175
+ problems,
176
+ sessionInfo: runResult.sessionInfo,
177
+ };
178
+ }
179
+ return {
180
+ status: 'ok',
181
+ manifestPath: runResult.manifestPath,
182
+ dagPath,
183
+ notesPath,
184
+ sessionInfo: runResult.sessionInfo,
185
+ };
186
+ }
187
+ function realRunNode(resolveLarkAppSecret) {
188
+ if (!resolveLarkAppSecret) {
189
+ throw new Error('runArchitect requires resolveLarkAppSecret when runNode is not injected');
190
+ }
191
+ return createEphemeralPool({ resolveLarkAppSecret }).runNode;
192
+ }
193
+ async function defaultValidateManifest(manifestPath, outputDir) {
194
+ try {
195
+ return { ok: true, manifest: await readAndValidateManifest(manifestPath, outputDir) };
196
+ }
197
+ catch (e) {
198
+ return {
199
+ ok: false,
200
+ problems: e instanceof ManifestValidationError ? e.problems : [String(e)],
201
+ };
202
+ }
203
+ }
204
+ async function writeJsonFile(path, value) {
205
+ const { writeFile } = await import('node:fs/promises');
206
+ await writeFile(path, typeof value === 'string' ? value : JSON.stringify(value, null, 2));
207
+ }
208
+ function manifestPathFor(manifest, outputDir, expectedPath) {
209
+ const file = manifest.files.find((f) => f.path === expectedPath || f.name === expectedPath);
210
+ if (!file)
211
+ return undefined;
212
+ const path = join(outputDir, file.path);
213
+ try {
214
+ readFileSync(path);
215
+ }
216
+ catch {
217
+ return undefined;
218
+ }
219
+ return path;
220
+ }
221
+ function formatManifestError(manifest) {
222
+ if (!manifest.error)
223
+ return 'architect reported failure without error details';
224
+ return `${manifest.error.code}: ${manifest.error.message}`;
225
+ }
226
+ //# sourceMappingURL=architect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architect.js","sourceRoot":"","sources":["../../../src/workflows/v3/architect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared v3 bot resolution — selector → BotConfig → BotSnapshot.
3
+ *
4
+ * The daemon-driven run path (`daemon-run.ts`) and the standalone CLI path
5
+ * (`cli-run.ts`) both turn a `--bot`/node.bot selector into the `BotSnapshot`
6
+ * the runtime freezes per node. This module is the single source of that
7
+ * matching + working-dir fallback so the two entries can't drift.
8
+ *
9
+ * (cli-run.ts currently keeps equivalent local copies — codex's runtime file,
10
+ * which this feature doesn't touch; dedupe it to this module next time that
11
+ * file is edited.)
12
+ */
13
+ import type { BotConfig } from '../../bot-registry.js';
14
+ import type { BotSnapshot } from './contract.js';
15
+ export declare function resolveBotConfig(selector: string | undefined, bots: BotConfig[]): BotConfig;
16
+ /** The configured working dir for a bot, before `~` expansion (the pool
17
+ * expands). An explicit override wins over the bot's configured value. */
18
+ export declare function botWorkingDir(bot: BotConfig, override?: string): string;
19
+ /** BotConfig → BotSnapshot (the runtime-frozen, secret-free per-node identity). */
20
+ export declare function botToSnapshot(bot: BotConfig, workingDirOverride?: string): BotSnapshot;
21
+ //# sourceMappingURL=bot-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-resolve.d.ts","sourceRoot":"","sources":["../../../src/workflows/v3/bot-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,CAW3F;AAED;4EAC4E;AAC5E,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,WAAW,CAUtF"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared v3 bot resolution — selector → BotConfig → BotSnapshot.
3
+ *
4
+ * The daemon-driven run path (`daemon-run.ts`) and the standalone CLI path
5
+ * (`cli-run.ts`) both turn a `--bot`/node.bot selector into the `BotSnapshot`
6
+ * the runtime freezes per node. This module is the single source of that
7
+ * matching + working-dir fallback so the two entries can't drift.
8
+ *
9
+ * (cli-run.ts currently keeps equivalent local copies — codex's runtime file,
10
+ * which this feature doesn't touch; dedupe it to this module next time that
11
+ * file is edited.)
12
+ */
13
+ export function resolveBotConfig(selector, bots) {
14
+ if (!selector) {
15
+ if (bots.length === 0)
16
+ throw new Error('v3: bots.json has no bots — run `botmux setup` first');
17
+ return bots[0];
18
+ }
19
+ const match = bots.find((b) => b.larkAppId === selector || b.name === selector);
20
+ if (!match) {
21
+ const known = bots.map((b) => b.name ?? b.larkAppId).join(', ') || '(none)';
22
+ throw new Error(`v3: no bot matches "${selector}" (known: ${known})`);
23
+ }
24
+ return match;
25
+ }
26
+ /** The configured working dir for a bot, before `~` expansion (the pool
27
+ * expands). An explicit override wins over the bot's configured value. */
28
+ export function botWorkingDir(bot, override) {
29
+ return override
30
+ ?? bot.defaultWorkingDir
31
+ ?? bot.workingDir
32
+ ?? bot.workingDirs?.[0]
33
+ ?? '~';
34
+ }
35
+ /** BotConfig → BotSnapshot (the runtime-frozen, secret-free per-node identity). */
36
+ export function botToSnapshot(bot, workingDirOverride) {
37
+ return {
38
+ larkAppId: bot.larkAppId,
39
+ cliId: bot.cliId,
40
+ ...(bot.cliPathOverride ? { cliPathOverride: bot.cliPathOverride } : {}),
41
+ ...(bot.model ? { model: bot.model } : {}),
42
+ // 受限 bot 的全部节点保持受限(P2 不可提权红线的 bot 侧入口)。
43
+ ...(bot.disableCliBypass === true ? { disableCliBypass: true } : {}),
44
+ workingDir: botWorkingDir(bot, workingDirOverride),
45
+ };
46
+ }
47
+ //# sourceMappingURL=bot-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-resolve.js","sourceRoot":"","sources":["../../../src/workflows/v3/bot-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,UAAU,gBAAgB,CAAC,QAA4B,EAAE,IAAiB;IAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,aAAa,KAAK,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;4EAC4E;AAC5E,MAAM,UAAU,aAAa,CAAC,GAAc,EAAE,QAAiB;IAC7D,OAAO,QAAQ;WACV,GAAG,CAAC,iBAAiB;WACrB,GAAG,CAAC,UAAU;WACd,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;WACpB,GAAG,CAAC;AACX,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,GAAc,EAAE,kBAA2B;IACvE,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,wCAAwC;QACxC,GAAG,CAAC,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,UAAU,EAAE,aAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `botmux v3 run <dag.json>` — standalone CLI entry that runs a hand-written
3
+ * v3 DAG to terminal on the REAL ephemeral worker pool.
4
+ *
5
+ * This is the daemon-independent dogfood path: it wires the two injected seams
6
+ * (codex's `ephemeral-pool` + `manifest` validator) against live `bots.json`,
7
+ * so the whole engine can be exercised end-to-end without the daemon running.
8
+ *
9
+ * Secret handling follows the contract: secrets are NEVER frozen into the
10
+ * runDir. The pool re-resolves `larkAppSecret` by the frozen `larkAppId` at
11
+ * spawn time via `resolveLarkAppSecret`, which reads `bots.json` and
12
+ * process-fails (returns a fail result) if the bot is gone — it deliberately
13
+ * does NOT fall back to an environment variable.
14
+ *
15
+ * Gate handling: a CLI run has no Lark card layer, so `humanGate` nodes resolve
16
+ * through a terminal y/N prompt (or `--yes` to auto-approve). Wiring the gate
17
+ * to the v0.2 approval card is the daemon's job, deferred until the engine is
18
+ * proven on real workers.
19
+ */
20
+ /**
21
+ * `botmux v3 <sub> ...` dispatcher. MVP exposes only `run`.
22
+ */
23
+ export declare function cmdV3(sub: string, rest: string[]): Promise<void>;
24
+ //# sourceMappingURL=cli-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-run.d.ts","sourceRoot":"","sources":["../../../src/workflows/v3/cli-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyJH;;GAEG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgHtE"}
@@ -0,0 +1,265 @@
1
+ /**
2
+ * `botmux v3 run <dag.json>` — standalone CLI entry that runs a hand-written
3
+ * v3 DAG to terminal on the REAL ephemeral worker pool.
4
+ *
5
+ * This is the daemon-independent dogfood path: it wires the two injected seams
6
+ * (codex's `ephemeral-pool` + `manifest` validator) against live `bots.json`,
7
+ * so the whole engine can be exercised end-to-end without the daemon running.
8
+ *
9
+ * Secret handling follows the contract: secrets are NEVER frozen into the
10
+ * runDir. The pool re-resolves `larkAppSecret` by the frozen `larkAppId` at
11
+ * spawn time via `resolveLarkAppSecret`, which reads `bots.json` and
12
+ * process-fails (returns a fail result) if the bot is gone — it deliberately
13
+ * does NOT fall back to an environment variable.
14
+ *
15
+ * Gate handling: a CLI run has no Lark card layer, so `humanGate` nodes resolve
16
+ * through a terminal y/N prompt (or `--yes` to auto-approve). Wiring the gate
17
+ * to the v0.2 approval card is the daemon's job, deferred until the engine is
18
+ * proven on real workers.
19
+ */
20
+ import { resolve, join } from 'node:path';
21
+ import { homedir } from 'node:os';
22
+ import { existsSync } from 'node:fs';
23
+ import { createInterface } from 'node:readline';
24
+ import { loadDag } from './dag.js';
25
+ import { runWorkflow } from './runtime.js';
26
+ import { createEphemeralPool } from './ephemeral-pool.js';
27
+ import { readAndValidateManifest, ManifestValidationError } from './manifest.js';
28
+ import { createFileGate } from './human-gate.js';
29
+ import { V3_SUPPORTED_CLIS, } from './contract.js';
30
+ import { readJournal } from './journal.js';
31
+ import { loadBotConfigs } from '../../bot-registry.js';
32
+ /** Default run root: `~/.botmux/v3-runs/<runId>`. */
33
+ function defaultBaseDir() {
34
+ return join(homedir(), '.botmux', 'v3-runs');
35
+ }
36
+ function argValue(args, ...flags) {
37
+ for (let i = 0; i < args.length; i++) {
38
+ const a = args[i];
39
+ for (const f of flags) {
40
+ if (a === f && i + 1 < args.length)
41
+ return args[i + 1];
42
+ if (a.startsWith(f + '='))
43
+ return a.slice(f.length + 1);
44
+ }
45
+ }
46
+ return undefined;
47
+ }
48
+ function firstPositional(args, flagsWithValue) {
49
+ for (let i = 0; i < args.length; i++) {
50
+ const a = args[i];
51
+ if (flagsWithValue.includes(a)) {
52
+ i++;
53
+ continue;
54
+ }
55
+ if (flagsWithValue.some((f) => a.startsWith(f + '=')))
56
+ continue;
57
+ if (a.startsWith('-'))
58
+ continue;
59
+ return a;
60
+ }
61
+ return undefined;
62
+ }
63
+ /** Resolve which bot config drives a node: by larkAppId, by `name`, else the
64
+ * first bot when the selector is omitted (the run-level default). */
65
+ function resolveBotConfig(selector, bots) {
66
+ if (!selector) {
67
+ if (bots.length === 0)
68
+ throw new Error('v3: bots.json has no bots — run `botmux setup` first');
69
+ return bots[0];
70
+ }
71
+ const match = bots.find((b) => b.larkAppId === selector || b.name === selector);
72
+ if (!match) {
73
+ const known = bots.map((b) => b.name ?? b.larkAppId).join(', ') || '(none)';
74
+ throw new Error(`v3: no bot matches "${selector}" (known: ${known})`);
75
+ }
76
+ return match;
77
+ }
78
+ /** The configured working dir for a bot, before `~` expansion (the pool
79
+ * expands). CLI `--working-dir` overrides the bot's configured value. */
80
+ function botWorkingDir(bot, override) {
81
+ return override
82
+ ?? bot.defaultWorkingDir
83
+ ?? bot.workingDir
84
+ ?? bot.workingDirs?.[0]
85
+ ?? '~';
86
+ }
87
+ /** Terminal gate decision: prompt y/N on stdin, or auto-approve with `--yes`.
88
+ * Non-TTY without `--yes` rejects with a clear message (gates need a human or
89
+ * the daemon's card). */
90
+ function makeAwaitDecision(autoApprove) {
91
+ return async (wait) => {
92
+ if (autoApprove) {
93
+ console.log(`\n🔓 [gate ${wait.nodeId}] 自动批准 (--yes): ${wait.prompt}`);
94
+ return { resolution: 'approved', by: 'cli:--yes', selected: wait.approveOptions[0] };
95
+ }
96
+ if (!process.stdin.isTTY) {
97
+ console.error(`\n⛔ [gate ${wait.nodeId}] 需要人工批准但 stdin 非交互;用 --yes 自动批准,或在 daemon 内跑以走飞书审批卡片。`);
98
+ return { resolution: 'rejected', by: 'cli:non-tty', selected: firstRejectOption(wait) };
99
+ }
100
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
101
+ try {
102
+ const answer = (await new Promise((res) => {
103
+ rl.question(`\n🛑 [gate ${wait.nodeId}] ${wait.prompt}\n 批准? (y/N): `, res);
104
+ })).trim().toLowerCase();
105
+ const approved = answer === 'y' || answer === 'yes';
106
+ return {
107
+ resolution: approved ? 'approved' : 'rejected',
108
+ by: 'cli:tty',
109
+ selected: approved ? wait.approveOptions[0] : firstRejectOption(wait),
110
+ };
111
+ }
112
+ finally {
113
+ rl.close();
114
+ }
115
+ };
116
+ }
117
+ function firstRejectOption(wait) {
118
+ return wait.options.find((opt) => !wait.approveOptions.includes(opt));
119
+ }
120
+ function parseArgs(rest) {
121
+ const flagsWithValue = ['--bot', '--working-dir', '--base-dir', '--max-parallel'];
122
+ const dagPath = firstPositional(rest, flagsWithValue);
123
+ if (!dagPath) {
124
+ throw new Error('用法: botmux v3 run <dag.json> [--bot <larkAppId|name>] [--working-dir <dir>] [--base-dir <dir>] [--max-parallel <n>] [--yes]');
125
+ }
126
+ const maxParallelRaw = argValue(rest, '--max-parallel');
127
+ const maxParallel = maxParallelRaw ? Number(maxParallelRaw) : undefined;
128
+ if (maxParallel !== undefined && (!Number.isInteger(maxParallel) || maxParallel < 1)) {
129
+ throw new Error(`--max-parallel 必须是正整数,收到 "${maxParallelRaw}"`);
130
+ }
131
+ return {
132
+ dagPath: resolve(dagPath),
133
+ botSelector: argValue(rest, '--bot'),
134
+ workingDir: argValue(rest, '--working-dir'),
135
+ baseDir: argValue(rest, '--base-dir') ? resolve(argValue(rest, '--base-dir')) : defaultBaseDir(),
136
+ autoApproveGates: rest.includes('--yes') || rest.includes('-y'),
137
+ maxParallel,
138
+ };
139
+ }
140
+ /** Pretty-print the terminal journal so a CLI run shows what happened without
141
+ * the operator having to cat the ndjson. */
142
+ function printOutcome(runDir) {
143
+ const events = readJournal(join(runDir, 'journal.ndjson'));
144
+ console.log(`\n── 节点结果 ──`);
145
+ for (const e of events) {
146
+ if (e.type === 'nodeSucceeded') {
147
+ console.log(` ✅ ${e.nodeId} → ${e.manifestPath}`);
148
+ }
149
+ else if (e.type === 'nodeFailed') {
150
+ console.log(` ❌ ${e.nodeId} [${e.errorClass}] ${e.message}`);
151
+ }
152
+ else if (e.type === 'gateResolved') {
153
+ const ge = e;
154
+ console.log(` 🛑 ${ge.nodeId} gate → ${ge.resolution} (by ${ge.by})`);
155
+ }
156
+ }
157
+ }
158
+ /**
159
+ * `botmux v3 <sub> ...` dispatcher. MVP exposes only `run`.
160
+ */
161
+ export async function cmdV3(sub, rest) {
162
+ if (sub !== 'run') {
163
+ console.error(`未知子命令: ${sub || '(空)'}\n用法: botmux v3 run <dag.json> [--bot ...] [--working-dir ...] [--base-dir ...] [--yes]`);
164
+ process.exit(1);
165
+ }
166
+ let args;
167
+ try {
168
+ args = parseArgs(rest);
169
+ }
170
+ catch (err) {
171
+ console.error(`❌ ${err instanceof Error ? err.message : String(err)}`);
172
+ process.exit(1);
173
+ }
174
+ if (!existsSync(args.dagPath)) {
175
+ console.error(`❌ 找不到 dag.json: ${args.dagPath}`);
176
+ process.exit(1);
177
+ }
178
+ let bots;
179
+ try {
180
+ bots = loadBotConfigs();
181
+ }
182
+ catch (err) {
183
+ console.error(`❌ 读取 bots.json 失败: ${err instanceof Error ? err.message : String(err)}`);
184
+ process.exit(1);
185
+ }
186
+ if (bots.length === 0) {
187
+ console.error('❌ 未配置任何 bot,请先运行 `botmux setup`');
188
+ process.exit(1);
189
+ }
190
+ // Secret resolver: by larkAppId from live bots.json; no env fallback (contract).
191
+ const secretById = new Map(bots.map((b) => [b.larkAppId, b.larkAppSecret]));
192
+ const resolveLarkAppSecret = (larkAppId) => secretById.get(larkAppId);
193
+ // codex's throw-based validator → the runtime's result-style seam.
194
+ const validateManifest = async (manifestPath, outputDir) => {
195
+ try {
196
+ const manifest = await readAndValidateManifest(manifestPath, outputDir);
197
+ return { ok: true, manifest };
198
+ }
199
+ catch (e) {
200
+ return { ok: false, problems: e instanceof ManifestValidationError ? e.problems : [String(e)] };
201
+ }
202
+ };
203
+ const resolveBotSnapshot = (botId) => {
204
+ const bot = resolveBotConfig(botId ?? args.botSelector, bots);
205
+ return {
206
+ larkAppId: bot.larkAppId,
207
+ cliId: bot.cliId,
208
+ ...(bot.cliPathOverride ? { cliPathOverride: bot.cliPathOverride } : {}),
209
+ ...(bot.model ? { model: bot.model } : {}),
210
+ // 受限 bot 的全部节点保持受限(P2 不可提权红线的 bot 侧入口)。
211
+ ...(bot.disableCliBypass === true ? { disableCliBypass: true } : {}),
212
+ workingDir: botWorkingDir(bot, args.workingDir),
213
+ };
214
+ };
215
+ const { runNode } = createEphemeralPool({ resolveLarkAppSecret });
216
+ const resolveGate = createFileGate({ awaitDecision: makeAwaitDecision(args.autoApproveGates) });
217
+ let dag;
218
+ try {
219
+ dag = loadDag(args.dagPath);
220
+ }
221
+ catch (err) {
222
+ console.error(`❌ DAG 校验失败:\n ${err instanceof Error ? err.message : String(err)}`);
223
+ process.exit(1);
224
+ }
225
+ const deps = { runNode, validateManifest, resolveBotSnapshot, resolveGate };
226
+ const opts = {
227
+ baseDir: args.baseDir,
228
+ ...(args.maxParallel ? { globalConcurrency: args.maxParallel } : {}),
229
+ };
230
+ const defaultBot = resolveBotConfig(args.botSelector, bots);
231
+ console.log(`\n🚀 v3 run "${dag.runId}" (${dag.nodes.length} 节点)`);
232
+ console.log(` DAG: ${args.dagPath}`);
233
+ console.log(` runDir: ${join(args.baseDir, dag.runId)}`);
234
+ console.log(` 默认 bot: ${defaultBot.name ?? defaultBot.larkAppId} (${defaultBot.cliId})`);
235
+ console.log(` 支持 CLI: ${V3_SUPPORTED_CLIS.join(', ')}`);
236
+ let outcome;
237
+ try {
238
+ outcome = await runWorkflow(dag, deps, opts);
239
+ }
240
+ catch (err) {
241
+ console.error(`\n❌ run 失败(启动期): ${err instanceof Error ? err.message : String(err)}`);
242
+ process.exit(1);
243
+ }
244
+ printOutcome(outcome.runDir);
245
+ if (outcome.reason === 'awaitingGate') {
246
+ console.error(`\n⏸️ run 正在等待 humanGate:${outcome.pendingWaits.map(w => `${w.nodeId}(${w.waitId})`).join(', ')}`);
247
+ console.error(` CLI 默认应使用 blocking gate;若看到此消息,请改用 daemon 驱动或检查 gateMode。`);
248
+ process.exit(1);
249
+ }
250
+ if (outcome.runStatus === 'succeeded') {
251
+ console.log(`\n✅ run 成功 — 产物在 ${outcome.runDir}`);
252
+ process.exit(0);
253
+ }
254
+ else if (outcome.runStatus === 'blocked') {
255
+ // Blocked ≠ failed: a contract/semantic failure that a retry can fix —
256
+ // or an exhausted loop that a grant (+1 iteration) can re-open.
257
+ console.error(`\n⏸️ run 受阻${outcome.blockedNodeId ? `(节点 ${outcome.blockedNodeId})` : ''} — 节点受阻用 \`botmux workflow retry ${dag.runId}\` 重试;loop 轮数耗尽用 \`botmux workflow grant ${dag.runId}\` 追加一轮;详见 ${join(outcome.runDir, 'journal.ndjson')}`);
258
+ process.exit(1);
259
+ }
260
+ else {
261
+ console.error(`\n❌ run 失败${outcome.failedNodeId ? `(节点 ${outcome.failedNodeId})` : ''} — 详见 ${join(outcome.runDir, 'journal.ndjson')}`);
262
+ process.exit(1);
263
+ }
264
+ }
265
+ //# sourceMappingURL=cli-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-run.js","sourceRoot":"","sources":["../../../src/workflows/v3/cli-run.ts"],"names":[],"mappings":"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"}