botmux 2.93.0 → 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 (227) 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/dashboard-endpoint.d.ts +1 -1
  9. package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
  10. package/dist/cli/dashboard-endpoint.js +3 -0
  11. package/dist/cli/dashboard-endpoint.js.map +1 -1
  12. package/dist/cli/workflow.d.ts.map +1 -1
  13. package/dist/cli/workflow.js +11 -4
  14. package/dist/cli/workflow.js.map +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +133 -1
  17. package/dist/cli.js.map +1 -1
  18. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  19. package/dist/core/dashboard-ipc-server.js +3 -0
  20. package/dist/core/dashboard-ipc-server.js.map +1 -1
  21. package/dist/core/inherit-peer.d.ts +5 -0
  22. package/dist/core/inherit-peer.d.ts.map +1 -1
  23. package/dist/core/inherit-peer.js +3 -0
  24. package/dist/core/inherit-peer.js.map +1 -1
  25. package/dist/core/trigger-session.d.ts +10 -0
  26. package/dist/core/trigger-session.d.ts.map +1 -1
  27. package/dist/core/trigger-session.js +22 -2
  28. package/dist/core/trigger-session.js.map +1 -1
  29. package/dist/core/worker-pool.d.ts +6 -0
  30. package/dist/core/worker-pool.d.ts.map +1 -1
  31. package/dist/core/worker-pool.js +49 -6
  32. package/dist/core/worker-pool.js.map +1 -1
  33. package/dist/daemon.d.ts.map +1 -1
  34. package/dist/daemon.js +297 -13
  35. package/dist/daemon.js.map +1 -1
  36. package/dist/dashboard/auth.d.ts.map +1 -1
  37. package/dist/dashboard/auth.js +7 -1
  38. package/dist/dashboard/auth.js.map +1 -1
  39. package/dist/dashboard/bot-payload.d.ts +1 -0
  40. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  41. package/dist/dashboard/bot-payload.js +1 -0
  42. package/dist/dashboard/bot-payload.js.map +1 -1
  43. package/dist/dashboard/federation-spoke-api.d.ts +31 -0
  44. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  45. package/dist/dashboard/federation-spoke-api.js +36 -14
  46. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  47. package/dist/dashboard/v3-runs-api.d.ts +26 -0
  48. package/dist/dashboard/v3-runs-api.d.ts.map +1 -0
  49. package/dist/dashboard/v3-runs-api.js +67 -0
  50. package/dist/dashboard/v3-runs-api.js.map +1 -0
  51. package/dist/dashboard/web/app.js +21 -9
  52. package/dist/dashboard/web/app.js.map +1 -1
  53. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  54. package/dist/dashboard/web/bot-defaults.js +24 -1
  55. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  56. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  57. package/dist/dashboard/web/i18n.js +12 -4
  58. package/dist/dashboard/web/i18n.js.map +1 -1
  59. package/dist/dashboard/web/legacy-workflow-link.d.ts +2 -0
  60. package/dist/dashboard/web/legacy-workflow-link.d.ts.map +1 -0
  61. package/dist/dashboard/web/legacy-workflow-link.js +12 -0
  62. package/dist/dashboard/web/legacy-workflow-link.js.map +1 -0
  63. package/dist/dashboard/web/v3-terminal.d.ts +11 -0
  64. package/dist/dashboard/web/v3-terminal.d.ts.map +1 -0
  65. package/dist/dashboard/web/v3-terminal.js +143 -0
  66. package/dist/dashboard/web/v3-terminal.js.map +1 -0
  67. package/dist/dashboard/web/v3.d.ts +2 -0
  68. package/dist/dashboard/web/v3.d.ts.map +1 -0
  69. package/dist/dashboard/web/v3.js +564 -0
  70. package/dist/dashboard/web/v3.js.map +1 -0
  71. package/dist/dashboard/web/workflows.d.ts.map +1 -1
  72. package/dist/dashboard/web/workflows.js +12 -8
  73. package/dist/dashboard/web/workflows.js.map +1 -1
  74. package/dist/dashboard-web/app.js +787 -699
  75. package/dist/dashboard-web/index.html +1 -1
  76. package/dist/dashboard-web/style.css +223 -0
  77. package/dist/dashboard.js +61 -40
  78. package/dist/dashboard.js.map +1 -1
  79. package/dist/i18n/en.d.ts.map +1 -1
  80. package/dist/i18n/en.js +6 -3
  81. package/dist/i18n/en.js.map +1 -1
  82. package/dist/i18n/zh.d.ts.map +1 -1
  83. package/dist/i18n/zh.js +6 -3
  84. package/dist/i18n/zh.js.map +1 -1
  85. package/dist/im/lark/card-handler.d.ts +12 -0
  86. package/dist/im/lark/card-handler.d.ts.map +1 -1
  87. package/dist/im/lark/card-handler.js +52 -2
  88. package/dist/im/lark/card-handler.js.map +1 -1
  89. package/dist/im/lark/doc-comment.d.ts +20 -0
  90. package/dist/im/lark/doc-comment.d.ts.map +1 -1
  91. package/dist/im/lark/doc-comment.js +23 -0
  92. package/dist/im/lark/doc-comment.js.map +1 -1
  93. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  94. package/dist/im/lark/event-dispatcher.js +13 -9
  95. package/dist/im/lark/event-dispatcher.js.map +1 -1
  96. package/dist/im/lark/v3-blocked-card-handler.d.ts +28 -0
  97. package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -0
  98. package/dist/im/lark/v3-blocked-card-handler.js +134 -0
  99. package/dist/im/lark/v3-blocked-card-handler.js.map +1 -0
  100. package/dist/im/lark/v3-blocked-card.d.ts +75 -0
  101. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -0
  102. package/dist/im/lark/v3-blocked-card.js +206 -0
  103. package/dist/im/lark/v3-blocked-card.js.map +1 -0
  104. package/dist/im/lark/v3-gate-card-handler.d.ts +31 -0
  105. package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -0
  106. package/dist/im/lark/v3-gate-card-handler.js +110 -0
  107. package/dist/im/lark/v3-gate-card-handler.js.map +1 -0
  108. package/dist/im/lark/v3-gate-card.d.ts +47 -0
  109. package/dist/im/lark/v3-gate-card.d.ts.map +1 -0
  110. package/dist/im/lark/v3-gate-card.js +119 -0
  111. package/dist/im/lark/v3-gate-card.js.map +1 -0
  112. package/dist/im/lark/v3-loop-grant-card-handler.d.ts +28 -0
  113. package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -0
  114. package/dist/im/lark/v3-loop-grant-card-handler.js +90 -0
  115. package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -0
  116. package/dist/im/lark/v3-loop-grant-card.d.ts +46 -0
  117. package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -0
  118. package/dist/im/lark/v3-loop-grant-card.js +119 -0
  119. package/dist/im/lark/v3-loop-grant-card.js.map +1 -0
  120. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts +29 -0
  121. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -0
  122. package/dist/im/lark/v3-revisit-grant-card-handler.js +96 -0
  123. package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -0
  124. package/dist/im/lark/v3-revisit-grant-card.d.ts +52 -0
  125. package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -0
  126. package/dist/im/lark/v3-revisit-grant-card.js +123 -0
  127. package/dist/im/lark/v3-revisit-grant-card.js.map +1 -0
  128. package/dist/im/lark/workflow-cards.d.ts.map +1 -1
  129. package/dist/im/lark/workflow-cards.js +5 -1
  130. package/dist/im/lark/workflow-cards.js.map +1 -1
  131. package/dist/im/lark/workflow-progress-card.d.ts +1 -1
  132. package/dist/im/lark/workflow-progress-card.js +1 -1
  133. package/dist/im/lark/workflow-slash-command.d.ts +28 -0
  134. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
  135. package/dist/im/lark/workflow-slash-command.js +61 -5
  136. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  137. package/dist/platform/bind.d.ts.map +1 -1
  138. package/dist/platform/bind.js +17 -3
  139. package/dist/platform/bind.js.map +1 -1
  140. package/dist/services/card-prefs-store.d.ts +4 -0
  141. package/dist/services/card-prefs-store.d.ts.map +1 -1
  142. package/dist/services/card-prefs-store.js +19 -0
  143. package/dist/services/card-prefs-store.js.map +1 -1
  144. package/dist/services/group-creator.d.ts.map +1 -1
  145. package/dist/services/group-creator.js +18 -2
  146. package/dist/services/group-creator.js.map +1 -1
  147. package/dist/skills/definitions.d.ts.map +1 -1
  148. package/dist/skills/definitions.js +208 -4
  149. package/dist/skills/definitions.js.map +1 -1
  150. package/dist/worker.js +79 -13
  151. package/dist/worker.js.map +1 -1
  152. package/dist/workflows/definition.d.ts +80 -80
  153. package/dist/workflows/events/payloads.d.ts +4 -4
  154. package/dist/workflows/events/schema.d.ts +16 -16
  155. package/dist/workflows/v3/architect.d.ts +37 -0
  156. package/dist/workflows/v3/architect.d.ts.map +1 -0
  157. package/dist/workflows/v3/architect.js +226 -0
  158. package/dist/workflows/v3/architect.js.map +1 -0
  159. package/dist/workflows/v3/bot-resolve.d.ts +21 -0
  160. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -0
  161. package/dist/workflows/v3/bot-resolve.js +47 -0
  162. package/dist/workflows/v3/bot-resolve.js.map +1 -0
  163. package/dist/workflows/v3/cli-run.d.ts +24 -0
  164. package/dist/workflows/v3/cli-run.d.ts.map +1 -0
  165. package/dist/workflows/v3/cli-run.js +265 -0
  166. package/dist/workflows/v3/cli-run.js.map +1 -0
  167. package/dist/workflows/v3/contract.d.ts +302 -0
  168. package/dist/workflows/v3/contract.d.ts.map +1 -0
  169. package/dist/workflows/v3/contract.js +91 -0
  170. package/dist/workflows/v3/contract.js.map +1 -0
  171. package/dist/workflows/v3/daemon-run.d.ts +311 -0
  172. package/dist/workflows/v3/daemon-run.d.ts.map +1 -0
  173. package/dist/workflows/v3/daemon-run.js +775 -0
  174. package/dist/workflows/v3/daemon-run.js.map +1 -0
  175. package/dist/workflows/v3/dag.d.ts +332 -0
  176. package/dist/workflows/v3/dag.d.ts.map +1 -0
  177. package/dist/workflows/v3/dag.js +1040 -0
  178. package/dist/workflows/v3/dag.js.map +1 -0
  179. package/dist/workflows/v3/ephemeral-pool.d.ts +29 -0
  180. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -0
  181. package/dist/workflows/v3/ephemeral-pool.js +331 -0
  182. package/dist/workflows/v3/ephemeral-pool.js.map +1 -0
  183. package/dist/workflows/v3/grill-state.d.ts +92 -0
  184. package/dist/workflows/v3/grill-state.d.ts.map +1 -0
  185. package/dist/workflows/v3/grill-state.js +151 -0
  186. package/dist/workflows/v3/grill-state.js.map +1 -0
  187. package/dist/workflows/v3/host.d.ts +88 -0
  188. package/dist/workflows/v3/host.d.ts.map +1 -0
  189. package/dist/workflows/v3/host.js +349 -0
  190. package/dist/workflows/v3/host.js.map +1 -0
  191. package/dist/workflows/v3/human-gate.d.ts +85 -0
  192. package/dist/workflows/v3/human-gate.d.ts.map +1 -0
  193. package/dist/workflows/v3/human-gate.js +153 -0
  194. package/dist/workflows/v3/human-gate.js.map +1 -0
  195. package/dist/workflows/v3/journal.d.ts +207 -0
  196. package/dist/workflows/v3/journal.d.ts.map +1 -0
  197. package/dist/workflows/v3/journal.js +74 -0
  198. package/dist/workflows/v3/journal.js.map +1 -0
  199. package/dist/workflows/v3/manifest.d.ts +17 -0
  200. package/dist/workflows/v3/manifest.d.ts.map +1 -0
  201. package/dist/workflows/v3/manifest.js +266 -0
  202. package/dist/workflows/v3/manifest.js.map +1 -0
  203. package/dist/workflows/v3/ops-projection.d.ts +110 -0
  204. package/dist/workflows/v3/ops-projection.d.ts.map +1 -0
  205. package/dist/workflows/v3/ops-projection.js +0 -0
  206. package/dist/workflows/v3/ops-projection.js.map +1 -0
  207. package/dist/workflows/v3/orchestrator.d.ts +168 -0
  208. package/dist/workflows/v3/orchestrator.d.ts.map +1 -0
  209. package/dist/workflows/v3/orchestrator.js +417 -0
  210. package/dist/workflows/v3/orchestrator.js.map +1 -0
  211. package/dist/workflows/v3/runtime.d.ts +193 -0
  212. package/dist/workflows/v3/runtime.d.ts.map +1 -0
  213. package/dist/workflows/v3/runtime.js +1284 -0
  214. package/dist/workflows/v3/runtime.js.map +1 -0
  215. package/dist/workflows/v3/spec.d.ts +32 -0
  216. package/dist/workflows/v3/spec.d.ts.map +1 -0
  217. package/dist/workflows/v3/spec.js +173 -0
  218. package/dist/workflows/v3/spec.js.map +1 -0
  219. package/dist/workflows/v3/state.d.ts +74 -0
  220. package/dist/workflows/v3/state.d.ts.map +1 -0
  221. package/dist/workflows/v3/state.js +353 -0
  222. package/dist/workflows/v3/state.js.map +1 -0
  223. package/package.json +1 -1
  224. package/dist/dashboard/web/workflow-catalog.d.ts +0 -2
  225. package/dist/dashboard/web/workflow-catalog.d.ts.map +0 -1
  226. package/dist/dashboard/web/workflow-catalog.js +0 -323
  227. package/dist/dashboard/web/workflow-catalog.js.map +0 -1
@@ -0,0 +1,151 @@
1
+ /**
2
+ * v3 grill-phase lifecycle state.
3
+ *
4
+ * The PRE-runtime "front matter" of a run: the status machine tracking
5
+ * grill → architect → human approvals, persisted to `<runDir>/grill.state.json`
6
+ * so a daemon/session restart resumes the right phase without guessing from
7
+ * chat context (codex review 2026-06-02). The seam is `dag_approved`: after
8
+ * it, the v3 runtime takes over with its own journal.ndjson + STATE (execution
9
+ * truth) and this file stops changing.
10
+ *
11
+ * Kept separate from `state.ts` (the runtime run snapshot) on purpose — grill
12
+ * state is a conversation/orchestration worktable, NOT execution state, and the
13
+ * grill layer must never write the runtime journal (codex 2026-06-02).
14
+ *
15
+ * This module is plain host-side code (CLI/daemon), so `new Date()` is fine —
16
+ * the `Date.now` ban is only inside Workflow() orchestration scripts.
17
+ */
18
+ import { writeFileSync, renameSync, readFileSync, existsSync, mkdirSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { homedir } from 'node:os';
21
+ export const GRILL_STATUS_FILE = 'grill.state.json';
22
+ export const GRILL_STATE_SCHEMA_VERSION = 1;
23
+ /**
24
+ * Legal forward transitions. Failures / human "改一下" can step BACK to an
25
+ * earlier phase (so grill can re-converge the spec); you can never skip a gate
26
+ * forward. In particular `spec_approved` is the only state from which
27
+ * `architect_running` is reachable — the backstop for codex assertion 1.
28
+ *
29
+ * Two self-loops exist on purpose (codex review 2026-06-02):
30
+ * - `spec_ready → spec_ready`: re-running `spec-finalize` to re-validate a
31
+ * Gate-1 re-draft in place (the user tweaked the requirement before
32
+ * approving) — see `hostSpecFinalize`.
33
+ * - `architect_running → architect_running`: crash-recovery re-entry. If a
34
+ * prior `architect` run was killed before it could retreat, the status is
35
+ * stuck mid-flight; re-running `architect` resumes from here instead of
36
+ * dead-ending behind the `spec_approved`-only guard.
37
+ */
38
+ const LEGAL = {
39
+ grilling: ['grilling', 'spec_ready'],
40
+ spec_ready: ['spec_ready', 'spec_approved', 'grilling'], // 自环=Gate-1 改稿重校验;回 grilling=revise-spec
41
+ spec_approved: ['architect_running', 'grilling'],
42
+ architect_running: ['architect_running', 'dag_ready', 'spec_approved', 'grilling'], // 自环=崩溃恢复重入;退回=architect/validate 失败
43
+ dag_ready: ['dag_approved', 'spec_approved', 'grilling'], // 退回 spec_approved=revise-dag;回 grilling=revise-spec
44
+ dag_approved: ['dag_approved'], // 终态(交给 runtime)
45
+ };
46
+ export class GrillTransitionError extends Error {
47
+ from;
48
+ to;
49
+ constructor(from, to) {
50
+ super(`非法 grill 状态转移:${from} → ${to}`);
51
+ this.from = from;
52
+ this.to = to;
53
+ this.name = 'GrillTransitionError';
54
+ }
55
+ }
56
+ /** Default run root, aligned with `cli-run.ts`'s `~/.botmux/v3-runs`. */
57
+ export function defaultBaseDir() {
58
+ return join(homedir(), '.botmux', 'v3-runs');
59
+ }
60
+ function statePath(runDir) {
61
+ return join(runDir, GRILL_STATUS_FILE);
62
+ }
63
+ /** Atomic write (tmp + rename), mirroring state.ts so a crash never leaves a
64
+ * half-written grill.state.json. */
65
+ export function writeGrillState(runDir, state) {
66
+ mkdirSync(runDir, { recursive: true });
67
+ const p = statePath(runDir);
68
+ const tmp = `${p}.tmp`;
69
+ writeFileSync(tmp, JSON.stringify(state, null, 2) + '\n');
70
+ renameSync(tmp, p);
71
+ }
72
+ /**
73
+ * Read a run's grill state, or `undefined` if it's missing OR corrupt
74
+ * (unparseable / mid-write torn JSON). Defensive-on-purpose (codex review):
75
+ * cold-attach reconcile scans every runDir, so one corrupt grill.state must not
76
+ * throw and kill the whole scan — it just makes that run look stateless.
77
+ */
78
+ export function readGrillState(runDir) {
79
+ const p = statePath(runDir);
80
+ if (!existsSync(p))
81
+ return undefined;
82
+ try {
83
+ return JSON.parse(readFileSync(p, 'utf-8'));
84
+ }
85
+ catch {
86
+ return undefined;
87
+ }
88
+ }
89
+ /** Slugify a (possibly CJK) goal into a path-safe runId prefix. */
90
+ function slug(goal) {
91
+ const s = goal.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 24);
92
+ return s || 'run';
93
+ }
94
+ function stamp(d) {
95
+ const p = (n) => String(n).padStart(2, '0');
96
+ return `${String(d.getFullYear()).slice(2)}${p(d.getMonth() + 1)}${p(d.getDate())}-${p(d.getHours())}${p(d.getMinutes())}`;
97
+ }
98
+ /**
99
+ * Birth a run: allocate a runId (`<slug>-<yymmdd-hhmm>` unless one is given —
100
+ * OQ-D), create its runDir, and write the initial `grilling` state. grill is
101
+ * the birth point of a run; spec.md and the later dag.json both live in runDir.
102
+ */
103
+ export function birthRun(opts) {
104
+ const baseDir = opts.baseDir ?? defaultBaseDir();
105
+ const now = opts.now ?? new Date();
106
+ const runId = opts.runId ?? `${slug(opts.goal)}-${stamp(now)}`;
107
+ const runDir = join(baseDir, runId);
108
+ const iso = now.toISOString();
109
+ const state = {
110
+ schemaVersion: GRILL_STATE_SCHEMA_VERSION,
111
+ runId,
112
+ goal: opts.goal,
113
+ status: 'grilling',
114
+ createdAt: iso,
115
+ updatedAt: iso,
116
+ specPath: join(runDir, 'spec.md'),
117
+ specJsonPath: join(runDir, 'spec.json'),
118
+ ...(opts.chatBinding ? { chatBinding: opts.chatBinding } : {}),
119
+ };
120
+ writeGrillState(runDir, state);
121
+ return { runId, runDir, state };
122
+ }
123
+ /**
124
+ * Read a run's chat binding off disk (from grill.state.json). The daemon's
125
+ * run driver + cold-attach recovery use this to know where to post / re-post a
126
+ * humanGate approval card. Returns undefined for CLI/dev runs (no binding) or
127
+ * a missing/unparseable state file.
128
+ */
129
+ export function readRunChatBinding(runDir) {
130
+ return readGrillState(runDir)?.chatBinding;
131
+ }
132
+ /**
133
+ * Apply a status transition with a legality check + field patch, atomically.
134
+ * Throws `GrillTransitionError` on an illegal transition (the state-machine
135
+ * backstop behind the friendlier guards the `workflow` subcommands surface).
136
+ */
137
+ export function transition(runDir, to, patch = {}, now = new Date()) {
138
+ const cur = readGrillState(runDir);
139
+ if (!cur)
140
+ throw new Error(`grill.state.json 不存在于 ${runDir}`);
141
+ if (!LEGAL[cur.status].includes(to)) {
142
+ throw new GrillTransitionError(cur.status, to);
143
+ }
144
+ const next = { ...cur, ...patch, status: to, updatedAt: now.toISOString() };
145
+ writeGrillState(runDir, next);
146
+ return next;
147
+ }
148
+ export function canTransition(from, to) {
149
+ return LEGAL[from].includes(to);
150
+ }
151
+ //# sourceMappingURL=grill-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grill-state.js","sourceRoot":"","sources":["../../../src/workflows/v3/grill-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { type BirthResult, type GrillState, type RunChatBinding } from './grill-state.js';
2
+ import { type RunArchitectInput, type RunArchitectResult } from './architect.js';
3
+ import type { BotSnapshot } from './contract.js';
4
+ export declare function hostNew(opts: {
5
+ goal: string;
6
+ baseDir?: string;
7
+ runId?: string;
8
+ now?: Date;
9
+ chatBinding?: RunChatBinding;
10
+ }): BirthResult;
11
+ /**
12
+ * Read the grill worker's injected env into a chat binding, or undefined when
13
+ * not running inside a daemon worker (CLI/dev — no card layer). The worker
14
+ * sets BOTMUX_CHAT_ID / _LARK_APP_ID / _ROOT_MESSAGE_ID / _SESSION_ID on every
15
+ * CLI subprocess (worker.ts). A binding needs at least larkAppId + chatId to
16
+ * be useful for posting a card; missing either → undefined.
17
+ */
18
+ export declare function chatBindingFromEnv(env?: NodeJS.ProcessEnv): RunChatBinding | undefined;
19
+ export interface SpecFinalizeOutcome {
20
+ ok: boolean;
21
+ state?: GrillState;
22
+ /** Present on failure — the parse/validate problems that BLOCK handoff. */
23
+ problems?: string[];
24
+ }
25
+ /** Parse + validate spec.md → write spec.json → status=spec_ready. On a
26
+ * SpecValidationError, returns {ok:false, problems} and leaves status untouched
27
+ * (grill stays grilling and relays the problems to the user). */
28
+ export declare function hostSpecFinalize(runDir: string, now?: Date): SpecFinalizeOutcome;
29
+ /** gate-1: spec_ready → spec_approved. Rejects unless status is spec_ready. */
30
+ export declare function hostApproveSpec(runDir: string, now?: Date): GrillState;
31
+ export interface ArchitectDeps {
32
+ runArchitect: (input: RunArchitectInput) => Promise<RunArchitectResult>;
33
+ /** Throws on an invalid dag (dag.ts loadDag). */
34
+ loadDag: (path: string) => unknown;
35
+ botSnapshot: BotSnapshot;
36
+ resolveLarkAppSecret: (larkAppId: string) => string | undefined | Promise<string | undefined>;
37
+ timeoutMs?: number;
38
+ cancelSignal?: AbortSignal;
39
+ }
40
+ export interface ArchitectOutcome {
41
+ ok: boolean;
42
+ state: GrillState;
43
+ problems?: string[];
44
+ }
45
+ /**
46
+ * spec_approved → architect_running → runArchitect → host loadDag/validateDag.
47
+ * Encodes codex's three assertions:
48
+ * 1. rejects unless status=spec_approved (don't skip gate-1);
49
+ * 2. runArchitect-fail OR validateDag-fail → retreat to spec_approved with the
50
+ * problems recorded in grill.state.json (so grill can fix the spec) — NOT
51
+ * dag_ready;
52
+ * 3. on success → dag_ready records dagPath/notesPath/architectManifestPath so
53
+ * approve-dag and the dashboard never re-guess paths.
54
+ */
55
+ export declare function hostArchitect(runDir: string, deps: ArchitectDeps, now?: Date): Promise<ArchitectOutcome>;
56
+ /** gate-2: dag_ready → dag_approved. Returns the recorded dagPath for the
57
+ * runner. Rejects unless status is dag_ready. */
58
+ export declare function hostApproveDag(runDir: string, now?: Date): {
59
+ state: GrillState;
60
+ dagPath: string;
61
+ };
62
+ /**
63
+ * 改稿·改需求:把任一 grilling 之后的阶段退回 `grilling`,并清掉已失效的
64
+ * architect 产物(dagPath/notesPath/architectManifestPath)+ problems,让用户
65
+ * 重新 grill / 改 spec.md 再 finalize。改需求意味着已编排的 DAG 作废,所以这里
66
+ * 必须把那些指针清空,否则后续 approve-dag / dashboard 会拿到过期的 dag
67
+ * (codex review 2026-06-02). 从 `grilling`(无可退)和 `dag_approved`(已交
68
+ * runtime)拒绝。
69
+ */
70
+ export declare function hostReviseSpec(runDir: string, now?: Date): GrillState;
71
+ /**
72
+ * 改稿·只改流程:需求没变、只是 DAG 编得不满意时,从 `dag_ready` 退回
73
+ * `spec_approved` 并清掉 stale 的 dag 产物,使 `architect` 在同一份已批准 spec
74
+ * 上重编一张,不必重新 grill。
75
+ */
76
+ export declare function hostReviseDag(runDir: string, now?: Date): GrillState;
77
+ export declare class HostGuardError extends Error {
78
+ constructor(message: string);
79
+ }
80
+ /**
81
+ * `botmux workflow <sub>` host-controller subcommands. Dispatched from
82
+ * `cmdWorkflow` for the v3-specific verbs (new/spec-finalize/approve-spec/
83
+ * architect/approve-dag); v0.2 verbs (run/create/validate/…) stay in workflow.ts.
84
+ */
85
+ export declare function cmdWorkflowHost(sub: string, rest: string[]): Promise<void>;
86
+ /** True when `sub` is a v3 host-controller verb (so cmdWorkflow routes here). */
87
+ export declare function isHostSub(sub: string): boolean;
88
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../src/workflows/v3/host.ts"],"names":[],"mappings":"AAqBA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAoC,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAInH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,cAAc,CAAC;CAC9B,GAAG,WAAW,CAEd;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,GAAG,SAAS,CAUnG;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;kEAEkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,mBAAmB,CAsB5F;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,UAAU,CAMlF;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxE,iDAAiD;IACjD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6D1H;AAED;mDACmD;AACnD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQ7G;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,UAAU,CAcjF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,UAAU,CAWhF;AAED,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAuBD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEhF;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * v3 grill host controller.
3
+ *
4
+ * The thin orchestration layer that drives a run through the grill → architect
5
+ * → human-approval pipeline. It is NOT the v3 runtime and NOT the ephemeral
6
+ * pool — it is the `botmux workflow <sub>` command surface the grill skill
7
+ * shells out to, plus the grill.state.json status machine (grill-state.ts).
8
+ *
9
+ * workflow new "<goal>" → birth run (runId/runDir), status=grilling
10
+ * workflow spec-finalize <id> → parse+validate spec.md → spec.json → spec_ready
11
+ * workflow approve-spec <id> → gate-1: spec_ready → spec_approved
12
+ * workflow architect <id> → spec_approved → architect_running → (runArchitect
13
+ * + host validateDag) → dag_ready | retreat
14
+ * workflow approve-dag <id> → gate-2: dag_ready → dag_approved → kick `v3 run`
15
+ *
16
+ * The CORE operations below take injected deps so they unit-test without a real
17
+ * worker; the CLI wrapper resolves real bot/secret + codex's `runArchitect` +
18
+ * dag.ts's `loadDag`. grill state is a conversation worktable — it does NOT
19
+ * write the runtime journal (codex 2026-06-02).
20
+ */
21
+ import { resolve, sep } from 'node:path';
22
+ import { birthRun, readGrillState, transition, defaultBaseDir, } from './grill-state.js';
23
+ import { finalizeSpec, SpecValidationError } from './spec.js';
24
+ import { runArchitect as realRunArchitect } from './architect.js';
25
+ import { loadDag } from './dag.js';
26
+ import { isValidRunId } from './ops-projection.js';
27
+ import { botToSnapshot } from './bot-resolve.js';
28
+ // ─── Core operations (dep-injected, pure of CLI / process concerns) ─────────
29
+ export function hostNew(opts) {
30
+ return birthRun(opts);
31
+ }
32
+ /**
33
+ * Read the grill worker's injected env into a chat binding, or undefined when
34
+ * not running inside a daemon worker (CLI/dev — no card layer). The worker
35
+ * sets BOTMUX_CHAT_ID / _LARK_APP_ID / _ROOT_MESSAGE_ID / _SESSION_ID on every
36
+ * CLI subprocess (worker.ts). A binding needs at least larkAppId + chatId to
37
+ * be useful for posting a card; missing either → undefined.
38
+ */
39
+ export function chatBindingFromEnv(env = process.env) {
40
+ const larkAppId = env.BOTMUX_LARK_APP_ID;
41
+ const chatId = env.BOTMUX_CHAT_ID;
42
+ if (!larkAppId || !chatId)
43
+ return undefined;
44
+ return {
45
+ larkAppId,
46
+ chatId,
47
+ ...(env.BOTMUX_ROOT_MESSAGE_ID ? { rootMessageId: env.BOTMUX_ROOT_MESSAGE_ID } : {}),
48
+ ...(env.BOTMUX_SESSION_ID ? { sessionId: env.BOTMUX_SESSION_ID } : {}),
49
+ };
50
+ }
51
+ /** Parse + validate spec.md → write spec.json → status=spec_ready. On a
52
+ * SpecValidationError, returns {ok:false, problems} and leaves status untouched
53
+ * (grill stays grilling and relays the problems to the user). */
54
+ export function hostSpecFinalize(runDir, now = new Date()) {
55
+ const cur = mustRead(runDir);
56
+ // Guard the status BEFORE finalizeSpec writes spec.json — otherwise an
57
+ // illegal-state call (e.g. re-finalizing after the spec was approved /
58
+ // architected) would overwrite spec.json and only THEN hit the rejected
59
+ // transition, leaving state ⇄ canonical-spec inconsistent (codex review).
60
+ // Legal from `grilling` (first finalize) and `spec_ready` (Gate-1 re-draft,
61
+ // re-validate in place). To revise after spec_approved/dag_ready, step back
62
+ // with `revise-spec` first.
63
+ if (cur.status !== 'grilling' && cur.status !== 'spec_ready') {
64
+ throw new HostGuardError(`spec-finalize 需要 status=grilling 或 spec_ready,当前 ${cur.status}(先 revise-spec 退回改稿)`);
65
+ }
66
+ try {
67
+ finalizeSpec(cur.specPath, cur.specJsonPath, cur.runId);
68
+ }
69
+ catch (err) {
70
+ if (err instanceof SpecValidationError)
71
+ return { ok: false, problems: err.problems };
72
+ throw err;
73
+ }
74
+ const state = transition(runDir, 'spec_ready', { problems: undefined }, now);
75
+ return { ok: true, state };
76
+ }
77
+ /** gate-1: spec_ready → spec_approved. Rejects unless status is spec_ready. */
78
+ export function hostApproveSpec(runDir, now = new Date()) {
79
+ const cur = mustRead(runDir);
80
+ if (cur.status !== 'spec_ready') {
81
+ throw new HostGuardError(`approve-spec 需要 status=spec_ready,当前 ${cur.status}`);
82
+ }
83
+ return transition(runDir, 'spec_approved', {}, now);
84
+ }
85
+ /**
86
+ * spec_approved → architect_running → runArchitect → host loadDag/validateDag.
87
+ * Encodes codex's three assertions:
88
+ * 1. rejects unless status=spec_approved (don't skip gate-1);
89
+ * 2. runArchitect-fail OR validateDag-fail → retreat to spec_approved with the
90
+ * problems recorded in grill.state.json (so grill can fix the spec) — NOT
91
+ * dag_ready;
92
+ * 3. on success → dag_ready records dagPath/notesPath/architectManifestPath so
93
+ * approve-dag and the dashboard never re-guess paths.
94
+ */
95
+ export async function hostArchitect(runDir, deps, now = new Date()) {
96
+ const cur = mustRead(runDir);
97
+ // Accept `spec_approved` (the normal entry) AND `architect_running`
98
+ // (crash-recovery): a prior architect run can be killed AFTER it persisted
99
+ // `architect_running` but BEFORE it could retreat to spec_approved, leaving
100
+ // the status stuck mid-flight. Without this, the only path out of
101
+ // `architect_running` would be a manual edit — re-running architect would
102
+ // dead-end behind a spec_approved-only guard (codex review 2026-06-02).
103
+ if (cur.status !== 'spec_approved' && cur.status !== 'architect_running') {
104
+ throw new HostGuardError(`architect 需要 status=spec_approved(先 approve-spec),当前 ${cur.status}`);
105
+ }
106
+ transition(runDir, 'architect_running', { problems: undefined }, now);
107
+ let res;
108
+ try {
109
+ res = await deps.runArchitect({
110
+ runId: cur.runId,
111
+ runDir,
112
+ specPath: cur.specPath,
113
+ specJsonPath: cur.specJsonPath,
114
+ botSnapshot: deps.botSnapshot,
115
+ resolveLarkAppSecret: deps.resolveLarkAppSecret,
116
+ timeoutMs: deps.timeoutMs,
117
+ cancelSignal: deps.cancelSignal,
118
+ });
119
+ }
120
+ catch (err) {
121
+ const problems = [err instanceof Error ? err.message : String(err)];
122
+ const state = transition(runDir, 'spec_approved', { problems }, now);
123
+ return { ok: false, state, problems };
124
+ }
125
+ if (res.status !== 'ok' || !res.dagPath || !res.notesPath) {
126
+ const problems = res.problems ?? [
127
+ !res.dagPath ? 'architect 未产出 dag.json' : undefined,
128
+ !res.notesPath ? 'architect 未产出 architect-notes.md' : undefined,
129
+ ].filter((p) => Boolean(p));
130
+ const state = transition(runDir, 'spec_approved', { problems }, now);
131
+ return { ok: false, state, problems };
132
+ }
133
+ // Assertion 2: do NOT trust architect's self-claim — host validates the dag.
134
+ try {
135
+ deps.loadDag(res.dagPath);
136
+ }
137
+ catch (err) {
138
+ const problems = err.problems ?? [err instanceof Error ? err.message : String(err)];
139
+ const state = transition(runDir, 'spec_approved', { problems }, now);
140
+ return { ok: false, state, problems };
141
+ }
142
+ const state = transition(runDir, 'dag_ready', {
143
+ dagPath: res.dagPath,
144
+ notesPath: res.notesPath,
145
+ architectManifestPath: res.manifestPath,
146
+ problems: undefined,
147
+ }, now);
148
+ return { ok: true, state };
149
+ }
150
+ /** gate-2: dag_ready → dag_approved. Returns the recorded dagPath for the
151
+ * runner. Rejects unless status is dag_ready. */
152
+ export function hostApproveDag(runDir, now = new Date()) {
153
+ const cur = mustRead(runDir);
154
+ if (cur.status !== 'dag_ready') {
155
+ throw new HostGuardError(`approve-dag 需要 status=dag_ready,当前 ${cur.status}`);
156
+ }
157
+ if (!cur.dagPath)
158
+ throw new Error('dag_ready 状态缺 dagPath(内部不一致)');
159
+ const state = transition(runDir, 'dag_approved', {}, now);
160
+ return { state, dagPath: cur.dagPath };
161
+ }
162
+ /**
163
+ * 改稿·改需求:把任一 grilling 之后的阶段退回 `grilling`,并清掉已失效的
164
+ * architect 产物(dagPath/notesPath/architectManifestPath)+ problems,让用户
165
+ * 重新 grill / 改 spec.md 再 finalize。改需求意味着已编排的 DAG 作废,所以这里
166
+ * 必须把那些指针清空,否则后续 approve-dag / dashboard 会拿到过期的 dag
167
+ * (codex review 2026-06-02). 从 `grilling`(无可退)和 `dag_approved`(已交
168
+ * runtime)拒绝。
169
+ */
170
+ export function hostReviseSpec(runDir, now = new Date()) {
171
+ const cur = mustRead(runDir);
172
+ if (cur.status === 'grilling') {
173
+ throw new HostGuardError('当前已在 grilling,直接改 spec.md 再 spec-finalize 即可');
174
+ }
175
+ if (cur.status === 'dag_approved') {
176
+ throw new HostGuardError('DAG 已批准并交给 runtime,无法再 revise(如需改动请新建 run)');
177
+ }
178
+ return transition(runDir, 'grilling', { dagPath: undefined, notesPath: undefined, architectManifestPath: undefined, problems: undefined }, now);
179
+ }
180
+ /**
181
+ * 改稿·只改流程:需求没变、只是 DAG 编得不满意时,从 `dag_ready` 退回
182
+ * `spec_approved` 并清掉 stale 的 dag 产物,使 `architect` 在同一份已批准 spec
183
+ * 上重编一张,不必重新 grill。
184
+ */
185
+ export function hostReviseDag(runDir, now = new Date()) {
186
+ const cur = mustRead(runDir);
187
+ if (cur.status !== 'dag_ready') {
188
+ throw new HostGuardError(`revise-dag 需要 status=dag_ready,当前 ${cur.status}`);
189
+ }
190
+ return transition(runDir, 'spec_approved', { dagPath: undefined, notesPath: undefined, architectManifestPath: undefined, problems: undefined }, now);
191
+ }
192
+ export class HostGuardError extends Error {
193
+ constructor(message) {
194
+ super(message);
195
+ this.name = 'HostGuardError';
196
+ }
197
+ }
198
+ function mustRead(runDir) {
199
+ const s = readGrillState(runDir);
200
+ if (!s)
201
+ throw new Error(`grill.state.json 不存在于 ${runDir}`);
202
+ return s;
203
+ }
204
+ // ─── CLI dispatch (resolves real deps) ──────────────────────────────────────
205
+ function runDirFor(runId, baseDir) {
206
+ // runId is already validated by `requireRunId` (isValidRunId rejects `/` and
207
+ // a leading `.`, so traversal can't get this far) — this resolve()+prefix
208
+ // check is a defense-in-depth backstop so a runDir can never escape baseDir
209
+ // even if a caller bypasses requireRunId (codex review 2026-06-02).
210
+ const base = resolve(baseDir);
211
+ const dir = resolve(base, runId);
212
+ if (dir !== base && !dir.startsWith(base + sep)) {
213
+ throw new Error(`runId 越界 baseDir:${runId}`);
214
+ }
215
+ return dir;
216
+ }
217
+ /**
218
+ * `botmux workflow <sub>` host-controller subcommands. Dispatched from
219
+ * `cmdWorkflow` for the v3-specific verbs (new/spec-finalize/approve-spec/
220
+ * architect/approve-dag); v0.2 verbs (run/create/validate/…) stay in workflow.ts.
221
+ */
222
+ export async function cmdWorkflowHost(sub, rest) {
223
+ const baseDir = argValue(rest, '--base-dir') ?? defaultBaseDir();
224
+ switch (sub) {
225
+ case 'new': {
226
+ const goal = firstPositional(rest);
227
+ if (!goal)
228
+ throw new Error('用法: botmux workflow new "<目标>" [--base-dir <dir>]');
229
+ // grill 经 daemon worker 出生时,env 带话题上下文 → 落 chatBinding,供后续
230
+ // daemon humanGate 发审批卡用(CLI/dev 出生无 env → undefined,不影响)。
231
+ const chatBinding = chatBindingFromEnv();
232
+ const { runId, runDir, state } = hostNew({ goal, baseDir, chatBinding });
233
+ console.log(JSON.stringify({
234
+ runId, runDir, status: state.status, specPath: state.specPath,
235
+ chatBound: !!chatBinding,
236
+ }, null, 2));
237
+ return;
238
+ }
239
+ case 'spec-finalize': {
240
+ const runId = requireRunId(rest);
241
+ const out = hostSpecFinalize(runDirFor(runId, baseDir));
242
+ if (!out.ok) {
243
+ console.error(`spec 校验失败(先修 spec.md 再 finalize):\n - ${out.problems.join('\n - ')}`);
244
+ process.exitCode = 1;
245
+ return;
246
+ }
247
+ console.log(JSON.stringify({ runId, status: out.state.status, specJsonPath: out.state.specJsonPath }, null, 2));
248
+ return;
249
+ }
250
+ case 'approve-spec': {
251
+ const runId = requireRunId(rest);
252
+ const state = hostApproveSpec(runDirFor(runId, baseDir));
253
+ console.log(JSON.stringify({ runId, status: state.status }, null, 2));
254
+ return;
255
+ }
256
+ case 'revise-spec': {
257
+ const runId = requireRunId(rest);
258
+ const state = hostReviseSpec(runDirFor(runId, baseDir));
259
+ console.log(JSON.stringify({ runId, status: state.status }, null, 2));
260
+ console.log('\n↩️ 已退回 grilling,可改 spec.md 再 spec-finalize(原 DAG 产物已作废)。');
261
+ return;
262
+ }
263
+ case 'revise-dag': {
264
+ const runId = requireRunId(rest);
265
+ const state = hostReviseDag(runDirFor(runId, baseDir));
266
+ console.log(JSON.stringify({ runId, status: state.status }, null, 2));
267
+ console.log('\n↩️ 已退回 spec_approved,可直接重跑 architect 重编 DAG(需求不变)。');
268
+ return;
269
+ }
270
+ case 'architect': {
271
+ const runId = requireRunId(rest);
272
+ const out = await runArchitectCli(runId, baseDir, rest);
273
+ if (!out.ok) {
274
+ console.error(`architect/validateDag 失败(已退回 spec_approved,可修 spec 重跑):\n - ${out.problems.join('\n - ')}`);
275
+ process.exitCode = 1;
276
+ return;
277
+ }
278
+ console.log(JSON.stringify({ runId, status: out.state.status, dagPath: out.state.dagPath, notesPath: out.state.notesPath }, null, 2));
279
+ return;
280
+ }
281
+ case 'approve-dag': {
282
+ const runId = requireRunId(rest);
283
+ const { state, dagPath } = hostApproveDag(runDirFor(runId, baseDir));
284
+ console.log(JSON.stringify({ runId, status: state.status, dagPath }, null, 2));
285
+ console.log(`\n✅ DAG 已批准。开跑:botmux v3 run ${dagPath}`);
286
+ return;
287
+ }
288
+ default:
289
+ throw new Error(`未知 workflow 子命令: ${sub}`);
290
+ }
291
+ }
292
+ /** True when `sub` is a v3 host-controller verb (so cmdWorkflow routes here). */
293
+ export function isHostSub(sub) {
294
+ return ['new', 'spec-finalize', 'approve-spec', 'revise-spec', 'architect', 'revise-dag', 'approve-dag'].includes(sub);
295
+ }
296
+ /** Resolve real bot/secret deps and run the architect step. */
297
+ async function runArchitectCli(runId, baseDir, rest) {
298
+ const { loadBotConfigs } = await import('../../bot-registry.js');
299
+ const bots = loadBotConfigs();
300
+ if (bots.length === 0)
301
+ throw new Error('没有可用 bot 配置(bots.json 为空)');
302
+ const selector = argValue(rest, '--bot');
303
+ const bot = selector
304
+ ? bots.find((b) => b.larkAppId === selector || b.name === selector)
305
+ : bots[0];
306
+ if (!bot)
307
+ throw new Error(`找不到 bot "${selector}"`);
308
+ const secretById = new Map(bots.map((b) => [b.larkAppId, b.larkAppSecret]));
309
+ // Use the authoritative BotConfig → BotSnapshot constructor so restricted bots
310
+ // keep `disableCliBypass` here too — a hand-rolled snapshot that drops it would
311
+ // let the architect goal-worker (writes files / runs commands / produces the
312
+ // dag.json that drives the whole run) silently start with --dangerously-skip-
313
+ // permissions, violating the "downgrade-only" capability invariant.
314
+ const botSnapshot = botToSnapshot(bot, argValue(rest, '--working-dir'));
315
+ return hostArchitect(runDirFor(runId, baseDir), {
316
+ runArchitect: realRunArchitect,
317
+ loadDag,
318
+ botSnapshot,
319
+ resolveLarkAppSecret: (id) => secretById.get(id),
320
+ });
321
+ }
322
+ // ─── Local arg parsers ──────────────────────────────────────────────────────
323
+ function argValue(args, flag) {
324
+ const i = args.indexOf(flag);
325
+ return i >= 0 && i + 1 < args.length ? args[i + 1] : undefined;
326
+ }
327
+ function firstPositional(args) {
328
+ for (let i = 0; i < args.length; i++) {
329
+ if (args[i].startsWith('--')) {
330
+ i++;
331
+ continue;
332
+ }
333
+ return args[i];
334
+ }
335
+ return undefined;
336
+ }
337
+ function requireRunId(rest) {
338
+ const runId = firstPositional(rest);
339
+ if (!runId)
340
+ throw new Error('用法: botmux workflow <sub> <runId> [--base-dir <dir>]');
341
+ // Reject anything that could escape baseDir (path separators, `..`, leading
342
+ // dot) — these verbs are skill-driven shell commands, so harden the runId
343
+ // before it reaches join/resolve (codex review 2026-06-02).
344
+ if (!isValidRunId(runId)) {
345
+ throw new Error(`非法 runId(只允许字母数字与 . _ -、不得含路径分隔符):${runId}`);
346
+ }
347
+ return runId;
348
+ }
349
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/workflows/v3/host.ts"],"names":[],"mappings":"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"}