botmux 2.33.0 → 2.34.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 (281) hide show
  1. package/README.en.md +12 -1
  2. package/README.md +45 -1
  3. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  4. package/dist/adapters/cli/claude-code.js +11 -0
  5. package/dist/adapters/cli/claude-code.js.map +1 -1
  6. package/dist/cli/bots-list-output.d.ts +21 -0
  7. package/dist/cli/bots-list-output.d.ts.map +1 -0
  8. package/dist/cli/bots-list-output.js +23 -0
  9. package/dist/cli/bots-list-output.js.map +1 -0
  10. package/dist/cli/workflow.d.ts +13 -0
  11. package/dist/cli/workflow.d.ts.map +1 -0
  12. package/dist/cli/workflow.js +781 -0
  13. package/dist/cli/workflow.js.map +1 -0
  14. package/dist/cli.js +69 -14
  15. package/dist/cli.js.map +1 -1
  16. package/dist/core/command-handler.d.ts.map +1 -1
  17. package/dist/core/command-handler.js +219 -6
  18. package/dist/core/command-handler.js.map +1 -1
  19. package/dist/core/session-manager.d.ts +6 -1
  20. package/dist/core/session-manager.d.ts.map +1 -1
  21. package/dist/core/session-manager.js +22 -12
  22. package/dist/core/session-manager.js.map +1 -1
  23. package/dist/core/worker-pool.d.ts +13 -0
  24. package/dist/core/worker-pool.d.ts.map +1 -1
  25. package/dist/core/worker-pool.js +100 -6
  26. package/dist/core/worker-pool.js.map +1 -1
  27. package/dist/daemon.d.ts +3 -0
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +884 -3
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/auth.d.ts +36 -0
  32. package/dist/dashboard/auth.d.ts.map +1 -1
  33. package/dist/dashboard/auth.js +22 -0
  34. package/dist/dashboard/auth.js.map +1 -1
  35. package/dist/dashboard/web/app.js +20 -1
  36. package/dist/dashboard/web/app.js.map +1 -1
  37. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  38. package/dist/dashboard/web/i18n.js +356 -0
  39. package/dist/dashboard/web/i18n.js.map +1 -1
  40. package/dist/dashboard/web/workflow-catalog.d.ts +2 -0
  41. package/dist/dashboard/web/workflow-catalog.d.ts.map +1 -0
  42. package/dist/dashboard/web/workflow-catalog.js +323 -0
  43. package/dist/dashboard/web/workflow-catalog.js.map +1 -0
  44. package/dist/dashboard/web/workflows.d.ts +2 -0
  45. package/dist/dashboard/web/workflows.d.ts.map +1 -0
  46. package/dist/dashboard/web/workflows.js +1618 -0
  47. package/dist/dashboard/web/workflows.js.map +1 -0
  48. package/dist/dashboard/workflow-api.d.ts +23 -0
  49. package/dist/dashboard/workflow-api.d.ts.map +1 -0
  50. package/dist/dashboard/workflow-api.js +463 -0
  51. package/dist/dashboard/workflow-api.js.map +1 -0
  52. package/dist/dashboard-web/app.js +494 -199
  53. package/dist/dashboard-web/index.html +1 -0
  54. package/dist/dashboard-web/style.css +160 -6
  55. package/dist/dashboard-web/terminal-replay.html +227 -0
  56. package/dist/dashboard.js +29 -12
  57. package/dist/dashboard.js.map +1 -1
  58. package/dist/i18n/en.d.ts.map +1 -1
  59. package/dist/i18n/en.js +12 -0
  60. package/dist/i18n/en.js.map +1 -1
  61. package/dist/i18n/zh.d.ts.map +1 -1
  62. package/dist/i18n/zh.js +12 -0
  63. package/dist/i18n/zh.js.map +1 -1
  64. package/dist/im/lark/card-handler.d.ts +3 -0
  65. package/dist/im/lark/card-handler.d.ts.map +1 -1
  66. package/dist/im/lark/card-handler.js +27 -1
  67. package/dist/im/lark/card-handler.js.map +1 -1
  68. package/dist/im/lark/client.d.ts +19 -2
  69. package/dist/im/lark/client.d.ts.map +1 -1
  70. package/dist/im/lark/client.js +21 -2
  71. package/dist/im/lark/client.js.map +1 -1
  72. package/dist/im/lark/workflow-card-handler.d.ts +50 -0
  73. package/dist/im/lark/workflow-card-handler.d.ts.map +1 -0
  74. package/dist/im/lark/workflow-card-handler.js +152 -0
  75. package/dist/im/lark/workflow-card-handler.js.map +1 -0
  76. package/dist/im/lark/workflow-cards.d.ts +46 -0
  77. package/dist/im/lark/workflow-cards.d.ts.map +1 -0
  78. package/dist/im/lark/workflow-cards.js +226 -0
  79. package/dist/im/lark/workflow-cards.js.map +1 -0
  80. package/dist/im/lark/workflow-progress-card.d.ts +76 -0
  81. package/dist/im/lark/workflow-progress-card.d.ts.map +1 -0
  82. package/dist/im/lark/workflow-progress-card.js +279 -0
  83. package/dist/im/lark/workflow-progress-card.js.map +1 -0
  84. package/dist/im/lark/workflow-slash-command.d.ts +92 -0
  85. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -0
  86. package/dist/im/lark/workflow-slash-command.js +185 -0
  87. package/dist/im/lark/workflow-slash-command.js.map +1 -0
  88. package/dist/services/group-creator.d.ts.map +1 -1
  89. package/dist/services/group-creator.js +17 -4
  90. package/dist/services/group-creator.js.map +1 -1
  91. package/dist/services/groups-store.d.ts +11 -0
  92. package/dist/services/groups-store.d.ts.map +1 -1
  93. package/dist/services/groups-store.js +26 -0
  94. package/dist/services/groups-store.js.map +1 -1
  95. package/dist/services/jsonl-cursor.d.ts +12 -0
  96. package/dist/services/jsonl-cursor.d.ts.map +1 -0
  97. package/dist/services/jsonl-cursor.js +45 -0
  98. package/dist/services/jsonl-cursor.js.map +1 -0
  99. package/dist/services/schedule-store.d.ts +35 -0
  100. package/dist/services/schedule-store.d.ts.map +1 -1
  101. package/dist/services/schedule-store.js +108 -1
  102. package/dist/services/schedule-store.js.map +1 -1
  103. package/dist/skills/definitions.d.ts.map +1 -1
  104. package/dist/skills/definitions.js +399 -0
  105. package/dist/skills/definitions.js.map +1 -1
  106. package/dist/types.d.ts +4 -0
  107. package/dist/types.d.ts.map +1 -1
  108. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  109. package/dist/utils/cli-usage-limit.js +4 -0
  110. package/dist/utils/cli-usage-limit.js.map +1 -1
  111. package/dist/worker.js +118 -14
  112. package/dist/worker.js.map +1 -1
  113. package/dist/workflows/attempt-resume.d.ts +114 -0
  114. package/dist/workflows/attempt-resume.d.ts.map +1 -0
  115. package/dist/workflows/attempt-resume.js +385 -0
  116. package/dist/workflows/attempt-resume.js.map +1 -0
  117. package/dist/workflows/attempt-terminal.d.ts +21 -0
  118. package/dist/workflows/attempt-terminal.d.ts.map +1 -0
  119. package/dist/workflows/attempt-terminal.js +7 -0
  120. package/dist/workflows/attempt-terminal.js.map +1 -0
  121. package/dist/workflows/blob.d.ts +27 -0
  122. package/dist/workflows/blob.d.ts.map +1 -0
  123. package/dist/workflows/blob.js +39 -0
  124. package/dist/workflows/blob.js.map +1 -0
  125. package/dist/workflows/cancel-run.d.ts +45 -0
  126. package/dist/workflows/cancel-run.d.ts.map +1 -0
  127. package/dist/workflows/cancel-run.js +99 -0
  128. package/dist/workflows/cancel-run.js.map +1 -0
  129. package/dist/workflows/cancel.d.ts +111 -0
  130. package/dist/workflows/cancel.d.ts.map +1 -0
  131. package/dist/workflows/cancel.js +120 -0
  132. package/dist/workflows/cancel.js.map +1 -0
  133. package/dist/workflows/catalog.d.ts +60 -0
  134. package/dist/workflows/catalog.d.ts.map +1 -0
  135. package/dist/workflows/catalog.js +119 -0
  136. package/dist/workflows/catalog.js.map +1 -0
  137. package/dist/workflows/cold-attach.d.ts +30 -0
  138. package/dist/workflows/cold-attach.d.ts.map +1 -0
  139. package/dist/workflows/cold-attach.js +40 -0
  140. package/dist/workflows/cold-attach.js.map +1 -0
  141. package/dist/workflows/cold-scan.d.ts +21 -0
  142. package/dist/workflows/cold-scan.d.ts.map +1 -0
  143. package/dist/workflows/cold-scan.js +70 -0
  144. package/dist/workflows/cold-scan.js.map +1 -0
  145. package/dist/workflows/daemon-spawn.d.ts +117 -0
  146. package/dist/workflows/daemon-spawn.d.ts.map +1 -0
  147. package/dist/workflows/daemon-spawn.js +551 -0
  148. package/dist/workflows/daemon-spawn.js.map +1 -0
  149. package/dist/workflows/definition.d.ts +1309 -0
  150. package/dist/workflows/definition.d.ts.map +1 -0
  151. package/dist/workflows/definition.js +334 -0
  152. package/dist/workflows/definition.js.map +1 -0
  153. package/dist/workflows/effect-input.d.ts +4 -0
  154. package/dist/workflows/effect-input.d.ts.map +1 -0
  155. package/dist/workflows/effect-input.js +18 -0
  156. package/dist/workflows/effect-input.js.map +1 -0
  157. package/dist/workflows/events/append.d.ts +77 -0
  158. package/dist/workflows/events/append.d.ts.map +1 -0
  159. package/dist/workflows/events/append.js +214 -0
  160. package/dist/workflows/events/append.js.map +1 -0
  161. package/dist/workflows/events/idempotency.d.ts +77 -0
  162. package/dist/workflows/events/idempotency.d.ts.map +1 -0
  163. package/dist/workflows/events/idempotency.js +116 -0
  164. package/dist/workflows/events/idempotency.js.map +1 -0
  165. package/dist/workflows/events/index.d.ts +7 -0
  166. package/dist/workflows/events/index.d.ts.map +1 -0
  167. package/dist/workflows/events/index.js +7 -0
  168. package/dist/workflows/events/index.js.map +1 -0
  169. package/dist/workflows/events/payloads.d.ts +917 -0
  170. package/dist/workflows/events/payloads.d.ts.map +1 -0
  171. package/dist/workflows/events/payloads.js +337 -0
  172. package/dist/workflows/events/payloads.js.map +1 -0
  173. package/dist/workflows/events/replay.d.ts +238 -0
  174. package/dist/workflows/events/replay.d.ts.map +1 -0
  175. package/dist/workflows/events/replay.js +608 -0
  176. package/dist/workflows/events/replay.js.map +1 -0
  177. package/dist/workflows/events/schema.d.ts +5242 -0
  178. package/dist/workflows/events/schema.d.ts.map +1 -0
  179. package/dist/workflows/events/schema.js +295 -0
  180. package/dist/workflows/events/schema.js.map +1 -0
  181. package/dist/workflows/events/types.d.ts +34 -0
  182. package/dist/workflows/events/types.d.ts.map +1 -0
  183. package/dist/workflows/events/types.js +2 -0
  184. package/dist/workflows/events/types.js.map +1 -0
  185. package/dist/workflows/fanout.d.ts +36 -0
  186. package/dist/workflows/fanout.d.ts.map +1 -0
  187. package/dist/workflows/fanout.js +114 -0
  188. package/dist/workflows/fanout.js.map +1 -0
  189. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +41 -0
  190. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -0
  191. package/dist/workflows/hostExecutors/botmux-schedule.js +121 -0
  192. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -0
  193. package/dist/workflows/hostExecutors/feishu-im.d.ts +12 -0
  194. package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -0
  195. package/dist/workflows/hostExecutors/feishu-im.js +49 -0
  196. package/dist/workflows/hostExecutors/feishu-im.js.map +1 -0
  197. package/dist/workflows/hostExecutors/feishu-reply.d.ts +24 -0
  198. package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -0
  199. package/dist/workflows/hostExecutors/feishu-reply.js +88 -0
  200. package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -0
  201. package/dist/workflows/hostExecutors/feishu-send.d.ts +23 -0
  202. package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -0
  203. package/dist/workflows/hostExecutors/feishu-send.js +124 -0
  204. package/dist/workflows/hostExecutors/feishu-send.js.map +1 -0
  205. package/dist/workflows/hostExecutors/index.d.ts +8 -0
  206. package/dist/workflows/hostExecutors/index.d.ts.map +1 -0
  207. package/dist/workflows/hostExecutors/index.js +8 -0
  208. package/dist/workflows/hostExecutors/index.js.map +1 -0
  209. package/dist/workflows/hostExecutors/protocol.d.ts +42 -0
  210. package/dist/workflows/hostExecutors/protocol.d.ts.map +1 -0
  211. package/dist/workflows/hostExecutors/protocol.js +181 -0
  212. package/dist/workflows/hostExecutors/protocol.js.map +1 -0
  213. package/dist/workflows/hostExecutors/registry.d.ts +10 -0
  214. package/dist/workflows/hostExecutors/registry.d.ts.map +1 -0
  215. package/dist/workflows/hostExecutors/registry.js +36 -0
  216. package/dist/workflows/hostExecutors/registry.js.map +1 -0
  217. package/dist/workflows/hostExecutors/types.d.ts +78 -0
  218. package/dist/workflows/hostExecutors/types.d.ts.map +1 -0
  219. package/dist/workflows/hostExecutors/types.js +2 -0
  220. package/dist/workflows/hostExecutors/types.js.map +1 -0
  221. package/dist/workflows/loader.d.ts +16 -0
  222. package/dist/workflows/loader.d.ts.map +1 -0
  223. package/dist/workflows/loader.js +56 -0
  224. package/dist/workflows/loader.js.map +1 -0
  225. package/dist/workflows/loop.d.ts +50 -0
  226. package/dist/workflows/loop.d.ts.map +1 -0
  227. package/dist/workflows/loop.js +350 -0
  228. package/dist/workflows/loop.js.map +1 -0
  229. package/dist/workflows/ops-projection.d.ts +168 -0
  230. package/dist/workflows/ops-projection.d.ts.map +1 -0
  231. package/dist/workflows/ops-projection.js +707 -0
  232. package/dist/workflows/ops-projection.js.map +1 -0
  233. package/dist/workflows/orchestrator.d.ts +107 -0
  234. package/dist/workflows/orchestrator.d.ts.map +1 -0
  235. package/dist/workflows/orchestrator.js +197 -0
  236. package/dist/workflows/orchestrator.js.map +1 -0
  237. package/dist/workflows/output-binding.d.ts +70 -0
  238. package/dist/workflows/output-binding.d.ts.map +1 -0
  239. package/dist/workflows/output-binding.js +265 -0
  240. package/dist/workflows/output-binding.js.map +1 -0
  241. package/dist/workflows/params.d.ts +61 -0
  242. package/dist/workflows/params.d.ts.map +1 -0
  243. package/dist/workflows/params.js +195 -0
  244. package/dist/workflows/params.js.map +1 -0
  245. package/dist/workflows/resume.d.ts +263 -0
  246. package/dist/workflows/resume.d.ts.map +1 -0
  247. package/dist/workflows/resume.js +808 -0
  248. package/dist/workflows/resume.js.map +1 -0
  249. package/dist/workflows/run-id.d.ts +2 -0
  250. package/dist/workflows/run-id.d.ts.map +1 -0
  251. package/dist/workflows/run-id.js +7 -0
  252. package/dist/workflows/run-id.js.map +1 -0
  253. package/dist/workflows/run-init.d.ts +48 -0
  254. package/dist/workflows/run-init.d.ts.map +1 -0
  255. package/dist/workflows/run-init.js +99 -0
  256. package/dist/workflows/run-init.js.map +1 -0
  257. package/dist/workflows/runs-dir.d.ts +4 -0
  258. package/dist/workflows/runs-dir.d.ts.map +1 -0
  259. package/dist/workflows/runs-dir.js +15 -0
  260. package/dist/workflows/runs-dir.js.map +1 -0
  261. package/dist/workflows/runtime.d.ts +211 -0
  262. package/dist/workflows/runtime.d.ts.map +1 -0
  263. package/dist/workflows/runtime.js +594 -0
  264. package/dist/workflows/runtime.js.map +1 -0
  265. package/dist/workflows/spawn-bot.d.ts +165 -0
  266. package/dist/workflows/spawn-bot.d.ts.map +1 -0
  267. package/dist/workflows/spawn-bot.js +215 -0
  268. package/dist/workflows/spawn-bot.js.map +1 -0
  269. package/dist/workflows/system.d.ts +49 -0
  270. package/dist/workflows/system.d.ts.map +1 -0
  271. package/dist/workflows/system.js +48 -0
  272. package/dist/workflows/system.js.map +1 -0
  273. package/dist/workflows/trigger-run.d.ts +70 -0
  274. package/dist/workflows/trigger-run.d.ts.map +1 -0
  275. package/dist/workflows/trigger-run.js +88 -0
  276. package/dist/workflows/trigger-run.js.map +1 -0
  277. package/dist/workflows/wait.d.ts +120 -0
  278. package/dist/workflows/wait.d.ts.map +1 -0
  279. package/dist/workflows/wait.js +181 -0
  280. package/dist/workflows/wait.js.map +1 -0
  281. package/package.json +3 -3
@@ -0,0 +1,594 @@
1
+ /**
2
+ * Workflow runtime — event-writing glue for orchestrator actions.
3
+ *
4
+ * `decideNextActions` in `orchestrator.ts` is pure; this module performs
5
+ * the actual side effects: writes events to the EventLog and (for
6
+ * subagent dispatch) invokes the worker spawn callback.
7
+ *
8
+ * The `WorkerSpawnFn` indirection keeps tests isolated from the real
9
+ * worker / bot-registry / daemon plumbing — Slice D wires the live
10
+ * spawn function; tests pass a fake.
11
+ *
12
+ * Scope (Slice B-1):
13
+ * - dispatchGate → writes attemptCreated(gate) + waitCreated
14
+ * - dispatchWork → writes attemptCreated(work) + invokes spawn
15
+ * - completeNode* / completeRun* → terminal node/run writes
16
+ * (rootCauseEventId resolved from the latest activityFailed event)
17
+ */
18
+ import { promises as fs } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { writeEffectInputSidecar } from './effect-input.js';
21
+ import { writeBlob, writeJsonBlob } from './blob.js';
22
+ import { BindingError, resolveBindings, resolveBoundString, } from './output-binding.js';
23
+ import { replay } from './events/replay.js';
24
+ import { createWait } from './wait.js';
25
+ import { executeSideEffect } from './hostExecutors/protocol.js';
26
+ function nowMs(ctx) {
27
+ return ctx.now ? ctx.now() : Date.now();
28
+ }
29
+ // ─── Helpers ──────────────────────────────────────────────────────────────
30
+ function gateAttemptId(activityId) {
31
+ return `${activityId}::att-1`;
32
+ }
33
+ function workAttemptId(activityId, attemptNumber) {
34
+ return `${activityId}::att-${attemptNumber}`;
35
+ }
36
+ /**
37
+ * Resolve the bot identity snapshot captured at runCreated.
38
+ *
39
+ * If caller supplies a Snapshot we read it directly (cheapest).
40
+ * Otherwise we replay the log — slower but always available. The
41
+ * runtime always passes a snapshot in practice; the fallback exists so
42
+ * tests that don't bother to compute one still get correct behavior.
43
+ */
44
+ async function resolveBotSnapshot(ctx, botName, snapshot) {
45
+ if (snapshot)
46
+ return snapshot.run.botSnapshots?.[botName];
47
+ const events = await ctx.log.readAll();
48
+ if (events.length === 0)
49
+ return undefined;
50
+ const first = events[0];
51
+ if (first.type !== 'runCreated')
52
+ return undefined;
53
+ const p = first.payload;
54
+ if (typeof p !== 'object' || p === null || 'ref' in p) {
55
+ return undefined;
56
+ }
57
+ const snaps = p.botSnapshots;
58
+ return snaps?.[botName];
59
+ }
60
+ async function attemptSidecarDir(log, activityId, attemptId) {
61
+ const dir = join(log.runDir, 'attempts', activityId, attemptId);
62
+ await fs.mkdir(dir, { recursive: true });
63
+ return dir;
64
+ }
65
+ async function writeSessionSidecar(log, activityId, attemptId, session) {
66
+ const dir = await attemptSidecarDir(log, activityId, attemptId);
67
+ const file = join(dir, 'session.json');
68
+ await fs.writeFile(file, JSON.stringify(session, null, 2), 'utf-8');
69
+ }
70
+ function withAttemptLogPath(session, attemptLogPath) {
71
+ return session.logPath ? session : { ...session, logPath: attemptLogPath };
72
+ }
73
+ async function resolveWorkflowIdentity(ctx, snapshot) {
74
+ const snap = snapshot ?? replay(await ctx.log.readAll());
75
+ if (!snap.run.workflowId || !snap.run.revisionId) {
76
+ throw new Error(`workflow identity missing for run ${ctx.log.runId}`);
77
+ }
78
+ return { workflowId: snap.run.workflowId, revisionId: snap.run.revisionId };
79
+ }
80
+ function bindingContext(ctx, snapshot) {
81
+ let paramsPromise;
82
+ return {
83
+ snapshot,
84
+ def: ctx.def,
85
+ log: ctx.log,
86
+ loadParams: () => {
87
+ paramsPromise ??= loadRunParamsFromSnapshot(snapshot);
88
+ return paramsPromise;
89
+ },
90
+ };
91
+ }
92
+ async function loadRunParamsFromSnapshot(snapshot) {
93
+ const inputPath = snapshot.run.input?.outputPath;
94
+ if (!inputPath) {
95
+ throw new BindingError('run input params missing outputPath');
96
+ }
97
+ const raw = await fs.readFile(inputPath, 'utf-8');
98
+ const parsed = JSON.parse(raw);
99
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
100
+ throw new BindingError('run input params blob is not an object');
101
+ }
102
+ return parsed;
103
+ }
104
+ async function failHostExecutor(ctx, activityId, attemptId, error) {
105
+ await ctx.log.append({
106
+ runId: ctx.log.runId,
107
+ type: 'activityFailed',
108
+ actor: 'scheduler',
109
+ payload: {
110
+ activityId,
111
+ attemptId,
112
+ error,
113
+ },
114
+ });
115
+ return {
116
+ kind: 'failed',
117
+ attemptId,
118
+ errorClass: error.errorClass,
119
+ errorCode: error.errorCode,
120
+ errorMessage: error.errorMessage,
121
+ };
122
+ }
123
+ function executeRegisteredHostExecutor(registered, hostCtx, input) {
124
+ return executeSideEffect(hostCtx, input, registered.executor);
125
+ }
126
+ export async function dispatchGate(ctx, action, options = {}) {
127
+ const attemptId = gateAttemptId(action.activityId);
128
+ const inputRef = await writeJsonBlob(ctx.log, {
129
+ kind: 'human-gate',
130
+ prompt: action.humanGate.prompt,
131
+ approvers: action.humanGate.approvers,
132
+ });
133
+ const attemptCreated = (await ctx.log.append({
134
+ runId: ctx.log.runId,
135
+ type: 'attemptCreated',
136
+ actor: 'scheduler',
137
+ payload: {
138
+ nodeId: action.nodeId,
139
+ activityId: action.activityId,
140
+ attemptId,
141
+ attemptNumber: 1,
142
+ inputRef,
143
+ },
144
+ }));
145
+ let resolvedPrompt;
146
+ try {
147
+ resolvedPrompt = await resolveBoundString(action.humanGate.prompt, bindingContext(ctx, options.snapshot ?? replay(await ctx.log.readAll())));
148
+ }
149
+ catch (err) {
150
+ if (err instanceof BindingError) {
151
+ const activityFailed = await writeBindingFailure(ctx, action.activityId, attemptId, err.message);
152
+ return { kind: 'failed', attemptId, attemptCreated, activityFailed };
153
+ }
154
+ throw err;
155
+ }
156
+ const deadlineAt = action.humanGate.deadlineMs
157
+ ? nowMs(ctx) + action.humanGate.deadlineMs
158
+ : undefined;
159
+ const promptField = await splitHumanGatePrompt(ctx, resolvedPrompt);
160
+ const waitCreated = await createWait(ctx.log, {
161
+ activityId: action.activityId,
162
+ attemptId,
163
+ nodeId: action.nodeId,
164
+ waitKind: 'human-gate',
165
+ deadlineAt,
166
+ ...promptField,
167
+ approvers: action.humanGate.approvers,
168
+ onTimeout: action.humanGate.onTimeout,
169
+ });
170
+ return { kind: 'wait', attemptId, attemptCreated, waitCreated };
171
+ }
172
+ /**
173
+ * Producer-side split for the humanGate prompt: small prompts stay inline
174
+ * on `waitCreated.payload.prompt`; anything over `PROMPT_INLINE_MAX_BYTES`
175
+ * spills to a content-addressed blob and the event carries `promptRef` +
176
+ * a short `promptPreview` for card / dashboard display.
177
+ *
178
+ * The schema accepts arbitrarily long inline prompts for historical
179
+ * compatibility, so this threshold is a runtime policy, not a wire
180
+ * contract. Cards and dashboards MUST NOT read the blob — they render
181
+ * `promptPreview` only — so the preview is the contract for "what an
182
+ * approver sees" when prompts are large.
183
+ */
184
+ async function splitHumanGatePrompt(ctx, resolvedPrompt) {
185
+ if (Buffer.byteLength(resolvedPrompt, 'utf-8') <= PROMPT_INLINE_MAX_BYTES) {
186
+ return { prompt: resolvedPrompt };
187
+ }
188
+ const buf = Buffer.from(resolvedPrompt, 'utf-8');
189
+ const promptRef = await writeBlob(ctx.log, buf, {
190
+ contentType: 'text/plain',
191
+ schemaVersion: 1,
192
+ });
193
+ return {
194
+ promptRef,
195
+ promptPreview: makePromptPreview(resolvedPrompt),
196
+ };
197
+ }
198
+ /**
199
+ * Producer policy: inline prompts <= 1 KiB; bigger spills to a blob.
200
+ * Chosen to leave headroom under the 4 KiB inline-event cap for
201
+ * activityId / nodeId / approvers / onTimeout and any future small
202
+ * fields.
203
+ */
204
+ export const PROMPT_INLINE_MAX_BYTES = 1024;
205
+ /**
206
+ * Build the preview string carried inline on `waitCreated` when the
207
+ * full prompt is in a blob. Two simultaneous budgets (codex peg 2):
208
+ * - chars ≤ 500: schema cap from WaitCreatedPayload.promptPreview
209
+ * - bytes ≤ 800: UTF-8 budget so 500 CJK chars (~1.5 KiB) don't bloat
210
+ * the envelope past the 4 KiB inline cap
211
+ * Whichever budget hits first wins; a trailing ellipsis flags truncation.
212
+ */
213
+ const PROMPT_PREVIEW_MAX_CHARS = 480; // 500 - ellipsis chars, safety
214
+ const PROMPT_PREVIEW_MAX_BYTES = 800;
215
+ export function makePromptPreview(full) {
216
+ const chars = [...full];
217
+ if (chars.length <= PROMPT_PREVIEW_MAX_CHARS && Buffer.byteLength(full, 'utf-8') <= PROMPT_PREVIEW_MAX_BYTES) {
218
+ return full;
219
+ }
220
+ const ELLIPSIS = '…(完整内容见 dashboard)';
221
+ const charBudget = PROMPT_PREVIEW_MAX_CHARS - [...ELLIPSIS].length;
222
+ const byteBudget = PROMPT_PREVIEW_MAX_BYTES - Buffer.byteLength(ELLIPSIS, 'utf-8');
223
+ let bytes = 0;
224
+ let cut = chars.length;
225
+ for (let i = 0; i < chars.length; i++) {
226
+ if (i >= charBudget) {
227
+ cut = i;
228
+ break;
229
+ }
230
+ bytes += Buffer.byteLength(chars[i], 'utf-8');
231
+ if (bytes > byteBudget) {
232
+ cut = i;
233
+ break;
234
+ }
235
+ }
236
+ return chars.slice(0, cut).join('') + ELLIPSIS;
237
+ }
238
+ async function writeBindingFailure(ctx, activityId, attemptId, message) {
239
+ return (await ctx.log.append({
240
+ runId: ctx.log.runId,
241
+ type: 'activityFailed',
242
+ actor: 'scheduler',
243
+ payload: {
244
+ activityId,
245
+ attemptId,
246
+ error: {
247
+ errorCode: 'InputBindingFailed',
248
+ errorClass: 'userFault',
249
+ errorMessage: truncateRuntimeErrorMessage(message),
250
+ },
251
+ },
252
+ }));
253
+ }
254
+ /**
255
+ * Run a work activity end-to-end:
256
+ * 1. write `attemptCreated{work}`
257
+ * 2. for `subagent`: invoke `spawnSubagent`, persist session sidecar,
258
+ * write `activitySucceeded` or `activityFailed`
259
+ * 3. for `hostExecutor`: v0 placeholder — returns `unsupported` until
260
+ * Slice E (executor registry) lands. Caller can decide to surface
261
+ * this as a manual error or skip the run.
262
+ *
263
+ * The function does not retry — that's resume.ts's job after a terminal
264
+ * `activityFailed` lands. Orchestrator will see the failed work
265
+ * activity on its next tick and emit `completeNodeFailed`.
266
+ */
267
+ export async function dispatchWork(ctx, action, options = {}) {
268
+ const attemptNumber = options.attemptNumber ?? 1;
269
+ const attemptId = workAttemptId(action.activityId, attemptNumber);
270
+ const node = action.node;
271
+ const bindingCtx = bindingContext(ctx, options.snapshot ?? replay(await ctx.log.readAll()));
272
+ if (node.type === 'hostExecutor') {
273
+ // attemptCreated carries the RAW (pre-binding) input. Operator-side
274
+ // debug can see the literal `$ref` the author wrote, while the
275
+ // effect-input sidecar (below) holds the resolved+parsed form.
276
+ const inputRef = await writeJsonBlob(ctx.log, {
277
+ kind: 'hostExecutor',
278
+ executor: node.executor,
279
+ input: node.input,
280
+ });
281
+ await ctx.log.append({
282
+ runId: ctx.log.runId,
283
+ type: 'attemptCreated',
284
+ actor: 'scheduler',
285
+ payload: {
286
+ nodeId: action.nodeId,
287
+ activityId: action.activityId,
288
+ attemptId,
289
+ attemptNumber,
290
+ inputRef,
291
+ },
292
+ });
293
+ const registered = ctx.hostExecutors?.get(node.executor);
294
+ if (!registered) {
295
+ return failHostExecutor(ctx, action.activityId, attemptId, {
296
+ errorCode: 'UnknownProviderError',
297
+ errorClass: 'manual',
298
+ errorMessage: `hostExecutor '${node.executor}' is not registered.`,
299
+ });
300
+ }
301
+ let resolvedInput;
302
+ try {
303
+ resolvedInput = await resolveBindings(node.input, bindingCtx);
304
+ }
305
+ catch (err) {
306
+ if (err instanceof BindingError) {
307
+ return failHostExecutor(ctx, action.activityId, attemptId, {
308
+ errorCode: 'InputBindingFailed',
309
+ errorClass: 'userFault',
310
+ errorMessage: truncateRuntimeErrorMessage(err.message),
311
+ });
312
+ }
313
+ throw err;
314
+ }
315
+ let parsedInput;
316
+ try {
317
+ parsedInput = registered.parseInput(resolvedInput);
318
+ }
319
+ catch (err) {
320
+ return failHostExecutor(ctx, action.activityId, attemptId, {
321
+ errorCode: 'InputValidationFailed',
322
+ errorClass: 'userFault',
323
+ errorMessage: truncateRuntimeErrorMessage(err instanceof Error ? err.message : String(err)),
324
+ });
325
+ }
326
+ await writeEffectInputSidecar(ctx.log, action.activityId, attemptId, parsedInput);
327
+ const identity = await resolveWorkflowIdentity(ctx, options.snapshot);
328
+ const result = await executeRegisteredHostExecutor(registered, {
329
+ log: ctx.log,
330
+ runId: ctx.log.runId,
331
+ workflowId: identity.workflowId,
332
+ revisionId: identity.revisionId,
333
+ nodeId: action.nodeId,
334
+ activityId: action.activityId,
335
+ attemptId,
336
+ }, parsedInput);
337
+ if (result.ok) {
338
+ if ('ref' in result.event.payload) {
339
+ throw new Error('hostExecutor activitySucceeded unexpectedly used payload ref');
340
+ }
341
+ return {
342
+ kind: 'succeeded',
343
+ attemptId,
344
+ outputRef: result.event.payload.outputRef,
345
+ session: {
346
+ sessionId: `host-${action.activityId}-${attemptId}`,
347
+ botName: node.executor,
348
+ startedAt: nowMs(ctx),
349
+ endedAt: nowMs(ctx),
350
+ },
351
+ };
352
+ }
353
+ return {
354
+ kind: 'failed',
355
+ attemptId,
356
+ errorClass: result.error.errorClass,
357
+ errorCode: result.error.errorCode,
358
+ errorMessage: result.error.errorMessage,
359
+ };
360
+ }
361
+ // Subagent path: serialize the RAW (pre-binding) prompt as the input
362
+ // blob so audit can see the literal `$ref` the author wrote. The
363
+ // resolved prompt is what we actually hand to the worker.
364
+ const inputRef = await writeJsonBlob(ctx.log, {
365
+ kind: 'subagent',
366
+ bot: node.bot,
367
+ prompt: node.prompt,
368
+ });
369
+ await ctx.log.append({
370
+ runId: ctx.log.runId,
371
+ type: 'attemptCreated',
372
+ actor: 'scheduler',
373
+ payload: {
374
+ nodeId: action.nodeId,
375
+ activityId: action.activityId,
376
+ attemptId,
377
+ attemptNumber,
378
+ inputRef,
379
+ },
380
+ });
381
+ let resolvedPrompt;
382
+ try {
383
+ resolvedPrompt = await resolveBoundString(node.prompt, bindingCtx);
384
+ }
385
+ catch (err) {
386
+ if (err instanceof BindingError) {
387
+ const activityFailed = await writeBindingFailure(ctx, action.activityId, attemptId, err.message);
388
+ return {
389
+ kind: 'failed',
390
+ attemptId,
391
+ errorClass: 'userFault',
392
+ errorCode: 'InputBindingFailed',
393
+ errorMessage: activityFailed.payload && !('ref' in activityFailed.payload)
394
+ ? activityFailed.payload.error.errorMessage
395
+ : err.message,
396
+ };
397
+ }
398
+ throw err;
399
+ }
400
+ // NB: still skipping `leaseSigned` in v0 — that's tied to the lease-
401
+ // timeout enforcement path (Step 6) which we don't engage when the
402
+ // spawn callback runs inline. Re-introduce when leases are wired
403
+ // (Slice D / runtime-loop slice).
404
+ //
405
+ // BUT we DO write `activityRunning` here (v0.1.5 slice 3 round 1):
406
+ // replay projects it into `activity.status = 'running'` AND
407
+ // `node.status = 'running'`, which the run-level Feishu progress card's
408
+ // `collectRunningRows()` + `buildAttemptDeeplinkEnricher()` both gate
409
+ // on to render the "查看当前终端" deeplink. Without this write the
410
+ // activity stays `pending` for the entire lifetime of a long-running
411
+ // subagent and the card never shows the link. `leaseId` is a stable
412
+ // inline token so cold-attach replay is deterministic; real leases
413
+ // arrive with Slice D.
414
+ const botSnapshot = await resolveBotSnapshot(ctx, node.bot, options.snapshot);
415
+ const sidecarDir = await attemptSidecarDir(ctx.log, action.activityId, attemptId);
416
+ const attemptLogPath = join(sidecarDir, 'terminal.log');
417
+ await ctx.log.append({
418
+ runId: ctx.log.runId,
419
+ type: 'activityRunning',
420
+ actor: 'scheduler',
421
+ payload: {
422
+ activityId: action.activityId,
423
+ attemptId,
424
+ leaseId: `lease-${attemptId}`,
425
+ },
426
+ });
427
+ const spawnResult = await ctx.spawnSubagent({
428
+ botName: node.bot,
429
+ botSnapshot,
430
+ // Per UI doc §3.4 "freeze identity": prefer the snapshot's workingDir
431
+ // (frozen at runCreated) over current bot-registry state. Node-level
432
+ // override still wins — author intent on a specific step beats the
433
+ // run-wide bot default.
434
+ workingDir: node.workingDir ?? botSnapshot?.workingDir,
435
+ prompt: resolvedPrompt,
436
+ modelOverrides: node.modelOverrides,
437
+ toolPolicy: node.toolPolicy,
438
+ activityId: action.activityId,
439
+ attemptId,
440
+ nodeId: action.nodeId,
441
+ runId: ctx.log.runId,
442
+ attemptLogPath,
443
+ cancelSignal: options.cancelSignal,
444
+ });
445
+ if (spawnResult.session) {
446
+ spawnResult.session = withAttemptLogPath(spawnResult.session, attemptLogPath);
447
+ await writeSessionSidecar(ctx.log, action.activityId, attemptId, spawnResult.session);
448
+ }
449
+ if (spawnResult.kind === 'success') {
450
+ const outputRef = await writeJsonBlob(ctx.log, spawnResult.output);
451
+ await ctx.log.append({
452
+ runId: ctx.log.runId,
453
+ type: 'activitySucceeded',
454
+ actor: 'worker',
455
+ payload: {
456
+ activityId: action.activityId,
457
+ attemptId,
458
+ outputRef,
459
+ },
460
+ });
461
+ return { kind: 'succeeded', attemptId, outputRef, session: spawnResult.session };
462
+ }
463
+ if (spawnResult.kind === 'cancelled') {
464
+ // Worker observed `cancelSignal.aborted` and shut down (gracefully via
465
+ // SIGINT or forcefully via SIGKILL). Echo `cancelOriginEventId` from
466
+ // the abort reason straight into `activityCanceled.payload` — we avoid
467
+ // re-replaying the log here, which would otherwise miss the origin if
468
+ // cancel landed mid-tick (the dispatch's snapshot is tick-start, before
469
+ // `cancelRequested` was appended).
470
+ await ctx.log.append({
471
+ runId: ctx.log.runId,
472
+ type: 'activityCanceled',
473
+ actor: 'worker',
474
+ payload: {
475
+ activityId: action.activityId,
476
+ attemptId,
477
+ cancelOriginEventId: spawnResult.cancelOriginEventId,
478
+ },
479
+ });
480
+ return {
481
+ kind: 'cancelled',
482
+ attemptId,
483
+ cancelOriginEventId: spawnResult.cancelOriginEventId,
484
+ session: spawnResult.session,
485
+ };
486
+ }
487
+ await ctx.log.append({
488
+ runId: ctx.log.runId,
489
+ type: 'activityFailed',
490
+ actor: 'worker',
491
+ payload: {
492
+ activityId: action.activityId,
493
+ attemptId,
494
+ error: {
495
+ errorCode: spawnResult.errorCode,
496
+ errorClass: spawnResult.errorClass,
497
+ errorMessage: spawnResult.errorMessage,
498
+ },
499
+ },
500
+ });
501
+ return {
502
+ kind: 'failed',
503
+ attemptId,
504
+ errorClass: spawnResult.errorClass,
505
+ errorCode: spawnResult.errorCode,
506
+ errorMessage: spawnResult.errorMessage,
507
+ session: spawnResult.session,
508
+ };
509
+ }
510
+ function truncateRuntimeErrorMessage(msg) {
511
+ const max = 2048;
512
+ return msg.length > max ? msg.slice(0, max - 3) + '...' : msg;
513
+ }
514
+ // ─── completeNodeSucceeded ───────────────────────────────────────────────
515
+ export async function completeNodeSucceeded(ctx, action) {
516
+ return (await ctx.log.append({
517
+ runId: ctx.log.runId,
518
+ type: 'nodeSucceeded',
519
+ actor: 'scheduler',
520
+ payload: {
521
+ nodeId: action.nodeId,
522
+ lastActivityId: action.lastActivityId,
523
+ },
524
+ }));
525
+ }
526
+ // ─── completeNodeFailed ───────────────────────────────────────────────────
527
+ // NB: nodeFailed payload (events doc v0.1.2) has no rootCauseEventId
528
+ // field — that lives on runFailed only. If/when the spec adds it to
529
+ // nodeFailed, lift `findRootCauseEventId` to take an activityId and
530
+ // reuse it here.
531
+ export async function completeNodeFailed(ctx, action) {
532
+ return (await ctx.log.append({
533
+ runId: ctx.log.runId,
534
+ type: 'nodeFailed',
535
+ actor: 'scheduler',
536
+ payload: {
537
+ nodeId: action.nodeId,
538
+ lastActivityId: action.lastActivityId,
539
+ errorClass: action.errorClass,
540
+ },
541
+ }));
542
+ }
543
+ // ─── completeRunSucceeded ─────────────────────────────────────────────────
544
+ export async function completeRunSucceeded(ctx, action) {
545
+ return (await ctx.log.append({
546
+ runId: ctx.log.runId,
547
+ type: 'runSucceeded',
548
+ actor: 'scheduler',
549
+ payload: { outputRef: action.outputRef },
550
+ }));
551
+ }
552
+ // ─── completeRunFailed ────────────────────────────────────────────────────
553
+ async function findRootCauseEventId(ctx, nodeId) {
554
+ const events = await ctx.log.readAll();
555
+ // Prefer the activityFailed under the failed node's last activity.
556
+ // Fall back to the nodeFailed event itself (always exists by now).
557
+ let nodeFailedEventId;
558
+ let activityFailedEventId;
559
+ const nodeActivities = new Set();
560
+ for (const e of events) {
561
+ if (e.type === 'attemptCreated') {
562
+ const p = e.payload;
563
+ if (!('ref' in p) && p.nodeId === nodeId)
564
+ nodeActivities.add(p.activityId);
565
+ }
566
+ else if (e.type === 'activityFailed') {
567
+ const p = e.payload;
568
+ if (!('ref' in p) && nodeActivities.has(p.activityId)) {
569
+ activityFailedEventId = e.eventId;
570
+ }
571
+ }
572
+ else if (e.type === 'nodeFailed') {
573
+ const p = e.payload;
574
+ if (!('ref' in p) && p.nodeId === nodeId) {
575
+ nodeFailedEventId = e.eventId;
576
+ }
577
+ }
578
+ }
579
+ return activityFailedEventId ?? nodeFailedEventId ?? events[0].eventId;
580
+ }
581
+ export async function completeRunFailed(ctx, action) {
582
+ const rootCauseEventId = await findRootCauseEventId(ctx, action.failedNodeId);
583
+ return (await ctx.log.append({
584
+ runId: ctx.log.runId,
585
+ type: 'runFailed',
586
+ actor: 'scheduler',
587
+ payload: {
588
+ failedNodeId: action.failedNodeId,
589
+ rootCauseEventId,
590
+ },
591
+ }));
592
+ }
593
+ export { replay };
594
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/workflows/runtime.ts"],"names":[],"mappings":"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"}