botmux 2.93.1 → 2.95.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 (290) hide show
  1. package/dist/adapters/backend/tmux-backend.d.ts +18 -2
  2. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  3. package/dist/adapters/backend/tmux-backend.js +45 -3
  4. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  5. package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
  6. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  7. package/dist/adapters/backend/types.d.ts +8 -0
  8. package/dist/adapters/backend/types.d.ts.map +1 -1
  9. package/dist/adapters/backend/types.js.map +1 -1
  10. package/dist/adapters/backend/zellij-backend.js +1 -1
  11. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  12. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  13. package/dist/adapters/cli/claude-code.js +6 -1
  14. package/dist/adapters/cli/claude-code.js.map +1 -1
  15. package/dist/bot-registry.d.ts +50 -1
  16. package/dist/bot-registry.d.ts.map +1 -1
  17. package/dist/bot-registry.js +30 -0
  18. package/dist/bot-registry.js.map +1 -1
  19. package/dist/cli/workflow.d.ts.map +1 -1
  20. package/dist/cli/workflow.js +11 -4
  21. package/dist/cli/workflow.js.map +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +146 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/core/command-handler.d.ts.map +1 -1
  26. package/dist/core/command-handler.js +28 -3
  27. package/dist/core/command-handler.js.map +1 -1
  28. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  29. package/dist/core/dashboard-ipc-server.js +92 -0
  30. package/dist/core/dashboard-ipc-server.js.map +1 -1
  31. package/dist/core/inherit-peer.d.ts +5 -0
  32. package/dist/core/inherit-peer.d.ts.map +1 -1
  33. package/dist/core/inherit-peer.js +3 -0
  34. package/dist/core/inherit-peer.js.map +1 -1
  35. package/dist/core/session-discovery.d.ts +9 -0
  36. package/dist/core/session-discovery.d.ts.map +1 -1
  37. package/dist/core/session-discovery.js +24 -0
  38. package/dist/core/session-discovery.js.map +1 -1
  39. package/dist/core/session-manager.d.ts.map +1 -1
  40. package/dist/core/session-manager.js +7 -6
  41. package/dist/core/session-manager.js.map +1 -1
  42. package/dist/core/terminal-url.d.ts.map +1 -1
  43. package/dist/core/terminal-url.js +15 -0
  44. package/dist/core/terminal-url.js.map +1 -1
  45. package/dist/core/trigger-session.js +2 -2
  46. package/dist/core/trigger-session.js.map +1 -1
  47. package/dist/core/worker-pool.d.ts.map +1 -1
  48. package/dist/core/worker-pool.js +30 -0
  49. package/dist/core/worker-pool.js.map +1 -1
  50. package/dist/daemon.d.ts.map +1 -1
  51. package/dist/daemon.js +296 -23
  52. package/dist/daemon.js.map +1 -1
  53. package/dist/dashboard/aggregator.d.ts +5 -0
  54. package/dist/dashboard/aggregator.d.ts.map +1 -1
  55. package/dist/dashboard/aggregator.js +7 -0
  56. package/dist/dashboard/aggregator.js.map +1 -1
  57. package/dist/dashboard/auth.d.ts.map +1 -1
  58. package/dist/dashboard/auth.js +7 -1
  59. package/dist/dashboard/auth.js.map +1 -1
  60. package/dist/dashboard/bot-payload.d.ts +2 -0
  61. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  62. package/dist/dashboard/bot-payload.js +2 -0
  63. package/dist/dashboard/bot-payload.js.map +1 -1
  64. package/dist/dashboard/connector-api.d.ts.map +1 -1
  65. package/dist/dashboard/connector-api.js +14 -3
  66. package/dist/dashboard/connector-api.js.map +1 -1
  67. package/dist/dashboard/settings-write-applier.d.ts +2 -1
  68. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  69. package/dist/dashboard/settings-write-applier.js +7 -0
  70. package/dist/dashboard/settings-write-applier.js.map +1 -1
  71. package/dist/dashboard/v3-runs-api.d.ts +26 -0
  72. package/dist/dashboard/v3-runs-api.d.ts.map +1 -0
  73. package/dist/dashboard/v3-runs-api.js +67 -0
  74. package/dist/dashboard/v3-runs-api.js.map +1 -0
  75. package/dist/dashboard/web/app.js +21 -9
  76. package/dist/dashboard/web/app.js.map +1 -1
  77. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  78. package/dist/dashboard/web/bot-defaults.js +128 -33
  79. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  80. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  81. package/dist/dashboard/web/i18n.js +42 -6
  82. package/dist/dashboard/web/i18n.js.map +1 -1
  83. package/dist/dashboard/web/legacy-workflow-link.d.ts +2 -0
  84. package/dist/dashboard/web/legacy-workflow-link.d.ts.map +1 -0
  85. package/dist/dashboard/web/legacy-workflow-link.js +12 -0
  86. package/dist/dashboard/web/legacy-workflow-link.js.map +1 -0
  87. package/dist/dashboard/web/settings.d.ts.map +1 -1
  88. package/dist/dashboard/web/settings.js +11 -0
  89. package/dist/dashboard/web/settings.js.map +1 -1
  90. package/dist/dashboard/web/v3-terminal.d.ts +11 -0
  91. package/dist/dashboard/web/v3-terminal.d.ts.map +1 -0
  92. package/dist/dashboard/web/v3-terminal.js +143 -0
  93. package/dist/dashboard/web/v3-terminal.js.map +1 -0
  94. package/dist/dashboard/web/v3.d.ts +2 -0
  95. package/dist/dashboard/web/v3.d.ts.map +1 -0
  96. package/dist/dashboard/web/v3.js +564 -0
  97. package/dist/dashboard/web/v3.js.map +1 -0
  98. package/dist/dashboard/web/whiteboards.d.ts.map +1 -1
  99. package/dist/dashboard/web/whiteboards.js +14 -5
  100. package/dist/dashboard/web/whiteboards.js.map +1 -1
  101. package/dist/dashboard/web/workflows.d.ts.map +1 -1
  102. package/dist/dashboard/web/workflows.js +12 -8
  103. package/dist/dashboard/web/workflows.js.map +1 -1
  104. package/dist/dashboard-web/app.js +834 -724
  105. package/dist/dashboard-web/apple-touch-icon.png +0 -0
  106. package/dist/dashboard-web/favicon.png +0 -0
  107. package/dist/dashboard-web/index.html +3 -1
  108. package/dist/dashboard-web/style.css +223 -0
  109. package/dist/dashboard.js +170 -10
  110. package/dist/dashboard.js.map +1 -1
  111. package/dist/global-config.d.ts +10 -0
  112. package/dist/global-config.d.ts.map +1 -1
  113. package/dist/global-config.js +8 -0
  114. package/dist/global-config.js.map +1 -1
  115. package/dist/i18n/en.d.ts.map +1 -1
  116. package/dist/i18n/en.js +23 -3
  117. package/dist/i18n/en.js.map +1 -1
  118. package/dist/i18n/zh.d.ts.map +1 -1
  119. package/dist/i18n/zh.js +23 -3
  120. package/dist/i18n/zh.js.map +1 -1
  121. package/dist/im/lark/card-handler.d.ts +12 -0
  122. package/dist/im/lark/card-handler.d.ts.map +1 -1
  123. package/dist/im/lark/card-handler.js +28 -0
  124. package/dist/im/lark/card-handler.js.map +1 -1
  125. package/dist/im/lark/client.d.ts.map +1 -1
  126. package/dist/im/lark/client.js +3 -12
  127. package/dist/im/lark/client.js.map +1 -1
  128. package/dist/im/lark/event-dispatcher.d.ts +2 -1
  129. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  130. package/dist/im/lark/event-dispatcher.js +20 -6
  131. package/dist/im/lark/event-dispatcher.js.map +1 -1
  132. package/dist/im/lark/grant-command.js +4 -4
  133. package/dist/im/lark/grant-command.js.map +1 -1
  134. package/dist/im/lark/message-parser.d.ts +29 -1
  135. package/dist/im/lark/message-parser.d.ts.map +1 -1
  136. package/dist/im/lark/message-parser.js +35 -1
  137. package/dist/im/lark/message-parser.js.map +1 -1
  138. package/dist/im/lark/v3-blocked-card-handler.d.ts +28 -0
  139. package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -0
  140. package/dist/im/lark/v3-blocked-card-handler.js +134 -0
  141. package/dist/im/lark/v3-blocked-card-handler.js.map +1 -0
  142. package/dist/im/lark/v3-blocked-card.d.ts +75 -0
  143. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -0
  144. package/dist/im/lark/v3-blocked-card.js +206 -0
  145. package/dist/im/lark/v3-blocked-card.js.map +1 -0
  146. package/dist/im/lark/v3-gate-card-handler.d.ts +31 -0
  147. package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -0
  148. package/dist/im/lark/v3-gate-card-handler.js +110 -0
  149. package/dist/im/lark/v3-gate-card-handler.js.map +1 -0
  150. package/dist/im/lark/v3-gate-card.d.ts +47 -0
  151. package/dist/im/lark/v3-gate-card.d.ts.map +1 -0
  152. package/dist/im/lark/v3-gate-card.js +119 -0
  153. package/dist/im/lark/v3-gate-card.js.map +1 -0
  154. package/dist/im/lark/v3-loop-grant-card-handler.d.ts +28 -0
  155. package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -0
  156. package/dist/im/lark/v3-loop-grant-card-handler.js +90 -0
  157. package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -0
  158. package/dist/im/lark/v3-loop-grant-card.d.ts +46 -0
  159. package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -0
  160. package/dist/im/lark/v3-loop-grant-card.js +119 -0
  161. package/dist/im/lark/v3-loop-grant-card.js.map +1 -0
  162. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts +29 -0
  163. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -0
  164. package/dist/im/lark/v3-revisit-grant-card-handler.js +96 -0
  165. package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -0
  166. package/dist/im/lark/v3-revisit-grant-card.d.ts +52 -0
  167. package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -0
  168. package/dist/im/lark/v3-revisit-grant-card.js +123 -0
  169. package/dist/im/lark/v3-revisit-grant-card.js.map +1 -0
  170. package/dist/im/lark/workflow-cards.d.ts.map +1 -1
  171. package/dist/im/lark/workflow-cards.js +5 -1
  172. package/dist/im/lark/workflow-cards.js.map +1 -1
  173. package/dist/im/lark/workflow-progress-card.d.ts +1 -1
  174. package/dist/im/lark/workflow-progress-card.js +1 -1
  175. package/dist/im/lark/workflow-slash-command.d.ts +28 -0
  176. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
  177. package/dist/im/lark/workflow-slash-command.js +61 -5
  178. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  179. package/dist/platform/binding.d.ts +6 -0
  180. package/dist/platform/binding.d.ts.map +1 -1
  181. package/dist/platform/binding.js +17 -0
  182. package/dist/platform/binding.js.map +1 -1
  183. package/dist/platform/tunnel-client.d.ts +2 -0
  184. package/dist/platform/tunnel-client.d.ts.map +1 -1
  185. package/dist/platform/tunnel-client.js.map +1 -1
  186. package/dist/services/bot-config-store.d.ts.map +1 -1
  187. package/dist/services/bot-config-store.js +1 -0
  188. package/dist/services/bot-config-store.js.map +1 -1
  189. package/dist/services/card-prefs-store.d.ts +4 -0
  190. package/dist/services/card-prefs-store.d.ts.map +1 -1
  191. package/dist/services/card-prefs-store.js +19 -0
  192. package/dist/services/card-prefs-store.js.map +1 -1
  193. package/dist/services/oncall-store.d.ts +25 -0
  194. package/dist/services/oncall-store.d.ts.map +1 -1
  195. package/dist/services/oncall-store.js +56 -0
  196. package/dist/services/oncall-store.js.map +1 -1
  197. package/dist/services/transcript-resolver.d.ts.map +1 -1
  198. package/dist/services/transcript-resolver.js +21 -4
  199. package/dist/services/transcript-resolver.js.map +1 -1
  200. package/dist/setup/bot-config-editor.d.ts +7 -0
  201. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  202. package/dist/setup/bot-config-editor.js +33 -0
  203. package/dist/setup/bot-config-editor.js.map +1 -1
  204. package/dist/skills/definitions.d.ts.map +1 -1
  205. package/dist/skills/definitions.js +208 -4
  206. package/dist/skills/definitions.js.map +1 -1
  207. package/dist/types.d.ts +1 -0
  208. package/dist/types.d.ts.map +1 -1
  209. package/dist/utils/terminal-favicon.d.ts +2 -0
  210. package/dist/utils/terminal-favicon.d.ts.map +1 -0
  211. package/dist/utils/terminal-favicon.js +5 -0
  212. package/dist/utils/terminal-favicon.js.map +1 -0
  213. package/dist/worker.js +152 -8
  214. package/dist/worker.js.map +1 -1
  215. package/dist/workflows/definition.d.ts +80 -80
  216. package/dist/workflows/events/payloads.d.ts +4 -4
  217. package/dist/workflows/events/schema.d.ts +16 -16
  218. package/dist/workflows/v3/architect.d.ts +37 -0
  219. package/dist/workflows/v3/architect.d.ts.map +1 -0
  220. package/dist/workflows/v3/architect.js +226 -0
  221. package/dist/workflows/v3/architect.js.map +1 -0
  222. package/dist/workflows/v3/bot-resolve.d.ts +21 -0
  223. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -0
  224. package/dist/workflows/v3/bot-resolve.js +48 -0
  225. package/dist/workflows/v3/bot-resolve.js.map +1 -0
  226. package/dist/workflows/v3/cli-run.d.ts +24 -0
  227. package/dist/workflows/v3/cli-run.d.ts.map +1 -0
  228. package/dist/workflows/v3/cli-run.js +265 -0
  229. package/dist/workflows/v3/cli-run.js.map +1 -0
  230. package/dist/workflows/v3/contract.d.ts +302 -0
  231. package/dist/workflows/v3/contract.d.ts.map +1 -0
  232. package/dist/workflows/v3/contract.js +91 -0
  233. package/dist/workflows/v3/contract.js.map +1 -0
  234. package/dist/workflows/v3/daemon-run.d.ts +311 -0
  235. package/dist/workflows/v3/daemon-run.d.ts.map +1 -0
  236. package/dist/workflows/v3/daemon-run.js +775 -0
  237. package/dist/workflows/v3/daemon-run.js.map +1 -0
  238. package/dist/workflows/v3/dag.d.ts +332 -0
  239. package/dist/workflows/v3/dag.d.ts.map +1 -0
  240. package/dist/workflows/v3/dag.js +1040 -0
  241. package/dist/workflows/v3/dag.js.map +1 -0
  242. package/dist/workflows/v3/ephemeral-pool.d.ts +29 -0
  243. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -0
  244. package/dist/workflows/v3/ephemeral-pool.js +331 -0
  245. package/dist/workflows/v3/ephemeral-pool.js.map +1 -0
  246. package/dist/workflows/v3/grill-state.d.ts +92 -0
  247. package/dist/workflows/v3/grill-state.d.ts.map +1 -0
  248. package/dist/workflows/v3/grill-state.js +151 -0
  249. package/dist/workflows/v3/grill-state.js.map +1 -0
  250. package/dist/workflows/v3/host.d.ts +88 -0
  251. package/dist/workflows/v3/host.d.ts.map +1 -0
  252. package/dist/workflows/v3/host.js +349 -0
  253. package/dist/workflows/v3/host.js.map +1 -0
  254. package/dist/workflows/v3/human-gate.d.ts +85 -0
  255. package/dist/workflows/v3/human-gate.d.ts.map +1 -0
  256. package/dist/workflows/v3/human-gate.js +153 -0
  257. package/dist/workflows/v3/human-gate.js.map +1 -0
  258. package/dist/workflows/v3/journal.d.ts +207 -0
  259. package/dist/workflows/v3/journal.d.ts.map +1 -0
  260. package/dist/workflows/v3/journal.js +74 -0
  261. package/dist/workflows/v3/journal.js.map +1 -0
  262. package/dist/workflows/v3/manifest.d.ts +17 -0
  263. package/dist/workflows/v3/manifest.d.ts.map +1 -0
  264. package/dist/workflows/v3/manifest.js +266 -0
  265. package/dist/workflows/v3/manifest.js.map +1 -0
  266. package/dist/workflows/v3/ops-projection.d.ts +110 -0
  267. package/dist/workflows/v3/ops-projection.d.ts.map +1 -0
  268. package/dist/workflows/v3/ops-projection.js +0 -0
  269. package/dist/workflows/v3/ops-projection.js.map +1 -0
  270. package/dist/workflows/v3/orchestrator.d.ts +168 -0
  271. package/dist/workflows/v3/orchestrator.d.ts.map +1 -0
  272. package/dist/workflows/v3/orchestrator.js +417 -0
  273. package/dist/workflows/v3/orchestrator.js.map +1 -0
  274. package/dist/workflows/v3/runtime.d.ts +193 -0
  275. package/dist/workflows/v3/runtime.d.ts.map +1 -0
  276. package/dist/workflows/v3/runtime.js +1284 -0
  277. package/dist/workflows/v3/runtime.js.map +1 -0
  278. package/dist/workflows/v3/spec.d.ts +32 -0
  279. package/dist/workflows/v3/spec.d.ts.map +1 -0
  280. package/dist/workflows/v3/spec.js +173 -0
  281. package/dist/workflows/v3/spec.js.map +1 -0
  282. package/dist/workflows/v3/state.d.ts +74 -0
  283. package/dist/workflows/v3/state.d.ts.map +1 -0
  284. package/dist/workflows/v3/state.js +353 -0
  285. package/dist/workflows/v3/state.js.map +1 -0
  286. package/package.json +2 -2
  287. package/dist/dashboard/web/workflow-catalog.d.ts +0 -2
  288. package/dist/dashboard/web/workflow-catalog.d.ts.map +0 -1
  289. package/dist/dashboard/web/workflow-catalog.js +0 -323
  290. package/dist/dashboard/web/workflow-catalog.js.map +0 -1
@@ -0,0 +1,353 @@
1
+ /**
2
+ * v3 state — materialize the journal into a run snapshot + STATE checkpoint.
3
+ *
4
+ * Two-layer truth (codex v1-review blocker #1):
5
+ * - `journal.ndjson` (journal.ts) = append-only audit truth
6
+ * - `STATE` (this file) = materialized checkpoint, derived by replaying the
7
+ * journal. Cheap to grep, fast for the dashboard / a human to read, and
8
+ * re-derivable at any time so it never becomes an independent source of
9
+ * truth that can drift from the journal.
10
+ *
11
+ * Resume after a daemon restart replays the journal through `materialize`
12
+ * (correctness first); the on-disk STATE file is an observability artifact and
13
+ * a fast-path the runtime refreshes after every event.
14
+ */
15
+ import { writeFileSync, renameSync, readFileSync, existsSync, mkdirSync } from 'node:fs';
16
+ import { dirname } from 'node:path';
17
+ // ─── Materialize (replay) ────────────────────────────────────────────────
18
+ /**
19
+ * Fold the journal into a snapshot. Pure — same events always yield the same
20
+ * snapshot, which is what makes STATE safe to throw away and re-derive.
21
+ *
22
+ * Node status transitions:
23
+ * nodeDispatched → running (preserve gateCleared across the transition)
24
+ * nodeSucceeded → done
25
+ * nodeFailed → failed
26
+ * nodeBlocked → blocked
27
+ * nodeRetryRequested → pending (+ attempt reservation; run blocked→running)
28
+ * gateDispatched → gateWaiting
29
+ * gateResolved/ok → pending + gateCleared (next tick dispatches work)
30
+ * gateResolved/no → failed
31
+ * edgeResolved → edges[first `${from}->${to}`] (first-wins)
32
+ * nodeSkipped → skipped
33
+ * nodeCancelled → cancelled (settle-wins; late same-attempt settle ignored)
34
+ */
35
+ export function materialize(events) {
36
+ const nodes = new Map();
37
+ const instances = new Map();
38
+ const attempts = new Map();
39
+ const loops = new Map();
40
+ const edges = new Map();
41
+ let runStatus = 'running';
42
+ let failedNodeId;
43
+ let failureReason;
44
+ let failureDetail;
45
+ let blockedNodeId;
46
+ const cancelledAttempts = new Map();
47
+ const set = (id, status, gateCleared) => {
48
+ const prev = nodes.get(id);
49
+ const next = { status };
50
+ // Carry an approved-gate flag forward unless this transition sets it.
51
+ const carried = gateCleared ?? prev?.gateCleared;
52
+ if (carried)
53
+ next.gateCleared = true;
54
+ // Preserve the node's effective instance pointer across status changes.
55
+ if (prev?.effectiveInstanceId)
56
+ next.effectiveInstanceId = prev.effectiveInstanceId;
57
+ nodes.set(id, next);
58
+ };
59
+ // Instance-layer mirror (instance restoration 2026-06-08): when a lifecycle
60
+ // event carries `instanceId`, record that instance's status AND point the
61
+ // definition node's `effectiveInstanceId` at it. Events without instanceId
62
+ // (loop body expansions, pre-instance-layer) skip this entirely and keep the
63
+ // plain nodeId-keyed behavior above.
64
+ const recordInstance = (nodeId, instanceId, status, makeEffective) => {
65
+ // A superseded instance is FROZEN: a stale late settle from its old worker
66
+ // (nodeSucceeded/Failed/Blocked) must NOT revive it to done/failed — the
67
+ // refresh state is what the dashboard shows (review blocker 1).
68
+ if (instances.get(instanceId)?.status === 'superseded')
69
+ return;
70
+ instances.set(instanceId, { status });
71
+ if (makeEffective) {
72
+ const prev = nodes.get(nodeId);
73
+ nodes.set(nodeId, { ...(prev ?? { status }), status, effectiveInstanceId: instanceId });
74
+ }
75
+ else if (nodes.get(nodeId)?.effectiveInstanceId === instanceId) {
76
+ // settle of the CURRENT effective instance → reflect on the node view.
77
+ const prev = nodes.get(nodeId);
78
+ nodes.set(nodeId, { ...prev, status });
79
+ }
80
+ };
81
+ const loop = (id) => {
82
+ let ls = loops.get(id);
83
+ if (!ls) {
84
+ ls = { iteration: 0, decided: false, granted: 0, pendingGrant: false };
85
+ loops.set(id, ls);
86
+ }
87
+ return ls;
88
+ };
89
+ const terminal = (id) => {
90
+ const status = nodes.get(id)?.status;
91
+ return status === 'done' ||
92
+ status === 'skipped' ||
93
+ status === 'cancelled' ||
94
+ status === 'failed' ||
95
+ status === 'blocked';
96
+ };
97
+ // Keyed by `(instanceId ?? nodeId)` so cancelling `A#001` (an early-release
98
+ // loser) never suppresses `A#002`'s settle after a revisit re-dispatch.
99
+ const cancelledCovers = (key, attemptId) => {
100
+ if (!cancelledAttempts.has(key))
101
+ return false;
102
+ const cancelledAttemptId = cancelledAttempts.get(key);
103
+ return cancelledAttemptId === undefined || cancelledAttemptId === attemptId;
104
+ };
105
+ for (const e of events) {
106
+ switch (e.type) {
107
+ case 'runStarted':
108
+ runStatus = 'running';
109
+ break;
110
+ case 'nodeDispatched':
111
+ // Don't resurrect a cancelled early-release loser via a late dispatch.
112
+ // Instance-aware: only the SAME cancelled instance is blocked — a fresh
113
+ // instance (`A#002` after a revisit) dispatches even though `A#001` was
114
+ // cancelled. Legacy (no instance) keeps the node-view guard.
115
+ if (e.instanceId) {
116
+ if (instances.get(e.instanceId)?.status === 'cancelled')
117
+ break;
118
+ }
119
+ else if (nodes.get(e.nodeId)?.status === 'cancelled')
120
+ break;
121
+ // Dispatch makes this instance the node's effective one.
122
+ if (e.instanceId)
123
+ recordInstance(e.nodeId, e.instanceId, 'running', true);
124
+ else
125
+ set(e.nodeId, 'running');
126
+ attempts.set(e.instanceId ?? e.nodeId, e.attemptId); // constraint 3: key by instance when present
127
+ break;
128
+ case 'nodeSucceeded':
129
+ if (cancelledCovers(e.instanceId ?? e.nodeId, e.attemptId))
130
+ break;
131
+ if (e.instanceId)
132
+ recordInstance(e.nodeId, e.instanceId, 'done', false);
133
+ else
134
+ set(e.nodeId, 'done');
135
+ break;
136
+ case 'nodeFailed':
137
+ if (cancelledCovers(e.instanceId ?? e.nodeId, e.attemptId))
138
+ break;
139
+ if (e.instanceId)
140
+ recordInstance(e.nodeId, e.instanceId, 'failed', false);
141
+ else
142
+ set(e.nodeId, 'failed');
143
+ break;
144
+ case 'nodeBlocked':
145
+ if (cancelledCovers(e.instanceId ?? e.nodeId, e.attemptId))
146
+ break;
147
+ if (e.instanceId)
148
+ recordInstance(e.nodeId, e.instanceId, 'blocked', false);
149
+ else
150
+ set(e.nodeId, 'blocked');
151
+ break;
152
+ case 'nodeRetryRequested':
153
+ // Replay-correct unblock (codex blocker #1 of the blocked design):
154
+ // the retry is a journal event, so a fresh materialize() yields
155
+ // pending — NOT a memory-only patch that evaporates on next replay.
156
+ // Constraint 5: retry is a new ATTEMPT inside the SAME instance — the
157
+ // node keeps its effectiveInstanceId; only its status goes pending.
158
+ set(e.nodeId, 'pending');
159
+ if (e.instanceId)
160
+ instances.set(e.instanceId, { status: 'pending' });
161
+ attempts.set(e.instanceId ?? e.nodeId, e.nextAttemptId); // constraint 3
162
+ if (runStatus === 'blocked') {
163
+ runStatus = 'running';
164
+ blockedNodeId = undefined;
165
+ }
166
+ break;
167
+ // ── cross-node revisit / instance refresh ──
168
+ case 'nodeRevisitRequested':
169
+ // Audit only: the nodeInstanceSuperseded events the runtime appends
170
+ // right after do the actual state change. Recorded for replay /
171
+ // dashboard "why did this node refresh".
172
+ break;
173
+ case 'nodeInstanceSuperseded': {
174
+ instances.set(e.instanceId, { status: 'superseded' });
175
+ // If the superseded instance was the node's live one, the node re-
176
+ // dispatches a fresh instance: drop effectiveInstanceId + gateCleared
177
+ // (constraint 6: the fresh instance must re-approve its gate) and go
178
+ // pending so decideNext re-dispatches.
179
+ if (nodes.get(e.nodeId)?.effectiveInstanceId === e.instanceId) {
180
+ nodes.set(e.nodeId, { status: 'pending' });
181
+ }
182
+ // A refresh during a blocked run re-opens scheduling (analogue of
183
+ // nodeRetryRequested / loopIterationGranted).
184
+ if (runStatus === 'blocked' && blockedNodeId === e.nodeId) {
185
+ runStatus = 'running';
186
+ blockedNodeId = undefined;
187
+ }
188
+ break;
189
+ }
190
+ case 'gateDispatched':
191
+ if (nodes.get(e.nodeId)?.status === 'cancelled')
192
+ break;
193
+ // Gate is per-INSTANCE (constraint 6): A#001's approval must not clear
194
+ // A#002. When the event carries instanceId, the gate state lives on
195
+ // the instance + (when effective) mirrors to the node.
196
+ if (e.instanceId) {
197
+ instances.set(e.instanceId, { status: 'gateWaiting' });
198
+ nodes.set(e.nodeId, { ...(nodes.get(e.nodeId) ?? {}), status: 'gateWaiting', effectiveInstanceId: e.instanceId });
199
+ }
200
+ else
201
+ set(e.nodeId, 'gateWaiting');
202
+ break;
203
+ case 'gateResolved': {
204
+ if (nodes.get(e.nodeId)?.status === 'cancelled')
205
+ break;
206
+ const approved = e.resolution === 'approved';
207
+ if (e.instanceId) {
208
+ instances.set(e.instanceId, approved ? { status: 'pending', gateCleared: true } : { status: 'failed' });
209
+ // Only mirror to the node view if this instance is the live one.
210
+ if (nodes.get(e.nodeId)?.effectiveInstanceId === e.instanceId) {
211
+ const prev = nodes.get(e.nodeId);
212
+ nodes.set(e.nodeId, approved ? { ...prev, status: 'pending', gateCleared: true } : { ...prev, status: 'failed' });
213
+ }
214
+ }
215
+ else if (approved)
216
+ set(e.nodeId, 'pending', true);
217
+ else
218
+ set(e.nodeId, 'failed');
219
+ break;
220
+ }
221
+ case 'edgeResolved': {
222
+ // Verdict is bound to the SOURCE effective instance only (code review):
223
+ // the edge resolves BEFORE the target dispatches, so the target has no
224
+ // instance yet — key is `<sourceInstance>-><targetNodeId>`. This makes
225
+ // `A#001->B` and `A#002->B` distinct, so a SOURCE revisit's fresh verdict
226
+ // is never first-wins-shadowed by the superseded one. KNOWN LIMITATION:
227
+ // a TARGET-only revisit (B refreshed, A unchanged) reuses `A#001->B` — to
228
+ // be upgraded when target-specific edge semantics actually arise.
229
+ // `toInstanceId` stays on the event as record-only, NOT part of the key.
230
+ const key = `${e.fromInstanceId ?? e.from}->${e.to}`;
231
+ if (!edges.has(key)) {
232
+ edges.set(key, { active: e.active, sourceAttemptId: e.sourceAttemptId });
233
+ }
234
+ break;
235
+ }
236
+ case 'nodeSkipped':
237
+ if (terminal(e.nodeId))
238
+ break;
239
+ set(e.nodeId, 'skipped');
240
+ break;
241
+ case 'nodeCancelled':
242
+ if (terminal(e.nodeId))
243
+ break;
244
+ // Suppress by instance (or nodeId fallback) so a later instance settles freely.
245
+ cancelledAttempts.set(e.instanceId ?? e.nodeId, e.attemptId);
246
+ if (e.instanceId)
247
+ recordInstance(e.nodeId, e.instanceId, 'cancelled', false);
248
+ else
249
+ set(e.nodeId, 'cancelled');
250
+ break;
251
+ case 'runSucceeded':
252
+ runStatus = 'succeeded';
253
+ break;
254
+ case 'runFailed':
255
+ runStatus = 'failed';
256
+ failedNodeId = e.failedNodeId;
257
+ failureReason = e.reason;
258
+ failureDetail = e.detail;
259
+ break;
260
+ case 'runBlocked':
261
+ runStatus = 'blocked';
262
+ blockedNodeId = e.blockedNodeId;
263
+ break;
264
+ // ── structured loop lifecycle ──
265
+ case 'loopStarted':
266
+ loop(e.loopId);
267
+ set(e.loopId, 'running');
268
+ break;
269
+ case 'loopIterationStarted': {
270
+ const ls = loop(e.loopId);
271
+ ls.iteration = e.iteration;
272
+ ls.decided = false;
273
+ ls.pendingGrant = false; // an unconsumed grant is consumed here
274
+ set(e.loopId, 'running');
275
+ break;
276
+ }
277
+ case 'loopIterationDecision': {
278
+ const ls = loop(e.loopId);
279
+ ls.decided = true;
280
+ ls.lastDecision = e.decision;
281
+ // 'exhausted' blocks the LOOP node (the run-level runBlocked is
282
+ // appended by the orchestrator's blocked sweep on the next tick).
283
+ // 'exit' keeps the node 'running' until the orchestrator seals it
284
+ // with a nodeSucceeded on the loop id (output projection manifest).
285
+ if (e.decision === 'exhausted')
286
+ set(e.loopId, 'blocked');
287
+ break;
288
+ }
289
+ case 'loopIterationGranted': {
290
+ // Replay-correct unblock — the loop analogue of nodeRetryRequested:
291
+ // a journal event, so a fresh materialize() yields a running loop.
292
+ const ls = loop(e.loopId);
293
+ ls.granted += 1;
294
+ ls.pendingGrant = true;
295
+ set(e.loopId, 'running');
296
+ if (runStatus === 'blocked') {
297
+ runStatus = 'running';
298
+ blockedNodeId = undefined;
299
+ }
300
+ break;
301
+ }
302
+ }
303
+ }
304
+ return { runStatus, failedNodeId, failureReason, failureDetail, blockedNodeId, nodes, instances, attempts, loops, edges };
305
+ }
306
+ /**
307
+ * Write the snapshot to `statePath` atomically: write a sibling `.tmp` then
308
+ * `rename` over the target (rename is atomic on the same filesystem), so a
309
+ * crash mid-write never leaves a half-written STATE — readers see either the
310
+ * old or the new file, never a torn one.
311
+ */
312
+ export function writeState(statePath, snap) {
313
+ const dir = dirname(statePath);
314
+ if (!existsSync(dir))
315
+ mkdirSync(dir, { recursive: true });
316
+ const file = {
317
+ runStatus: snap.runStatus,
318
+ failedNodeId: snap.failedNodeId,
319
+ failureReason: snap.failureReason,
320
+ failureDetail: snap.failureDetail,
321
+ blockedNodeId: snap.blockedNodeId,
322
+ nodes: Object.fromEntries(snap.nodes),
323
+ instances: snap.instances.size > 0 ? Object.fromEntries(snap.instances) : undefined,
324
+ attempts: Object.fromEntries(snap.attempts),
325
+ loops: snap.loops.size > 0 ? Object.fromEntries(snap.loops) : undefined,
326
+ edges: snap.edges.size > 0 ? Object.fromEntries(snap.edges) : undefined,
327
+ updatedAt: Date.now(),
328
+ };
329
+ const tmp = `${statePath}.tmp`;
330
+ writeFileSync(tmp, JSON.stringify(file, null, 2));
331
+ renameSync(tmp, statePath);
332
+ }
333
+ /** Read a previously-written STATE checkpoint back into a snapshot. Returns
334
+ * `undefined` when absent. Resume normally prefers `materialize(readJournal)`
335
+ * (the journal is authoritative); this is for fast reads / observability. */
336
+ export function readState(statePath) {
337
+ if (!existsSync(statePath))
338
+ return undefined;
339
+ const file = JSON.parse(readFileSync(statePath, 'utf-8'));
340
+ return {
341
+ runStatus: file.runStatus,
342
+ failedNodeId: file.failedNodeId,
343
+ failureReason: file.failureReason,
344
+ failureDetail: file.failureDetail,
345
+ blockedNodeId: file.blockedNodeId,
346
+ nodes: new Map(Object.entries(file.nodes)),
347
+ instances: new Map(Object.entries(file.instances ?? {})),
348
+ attempts: new Map(Object.entries(file.attempts)),
349
+ loops: new Map(Object.entries(file.loops ?? {})),
350
+ edges: new Map(Object.entries(file.edges ?? {})),
351
+ };
352
+ }
353
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/workflows/v3/state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botmux",
3
- "version": "2.93.1",
3
+ "version": "2.95.0",
4
4
  "description": "Bridge between IM platforms and AI coding CLIs — one topic, one CLI session with live streaming",
5
5
  "type": "module",
6
6
  "main": "dist/index-daemon.js",
@@ -16,7 +16,7 @@
16
16
  ],
17
17
  "scripts": {
18
18
  "build": "tsc && cp src/setup/lark-scopes.json dist/setup/ && pnpm dashboard:bundle && chmod +x dist/cli.js",
19
- "dashboard:bundle": "esbuild src/dashboard/web/app.ts --bundle --outfile=dist/dashboard-web/app.js --platform=browser --format=iife --minify && cp src/dashboard/web/index.html dist/dashboard-web/index.html && cp src/dashboard/web/style.css dist/dashboard-web/style.css && cp src/dashboard/web/terminal-replay.html dist/dashboard-web/terminal-replay.html && rm -rf dist/dashboard-web/skins && cp -r src/dashboard/web/skins dist/dashboard-web/skins && rm -rf dist/dashboard-web/game && { [ ! -d src/dashboard/web/game ] || cp -r src/dashboard/web/game dist/dashboard-web/game; }",
19
+ "dashboard:bundle": "esbuild src/dashboard/web/app.ts --bundle --outfile=dist/dashboard-web/app.js --platform=browser --format=iife --minify && cp src/dashboard/web/index.html dist/dashboard-web/index.html && cp src/dashboard/web/style.css dist/dashboard-web/style.css && cp src/dashboard/web/favicon.png dist/dashboard-web/favicon.png && cp src/dashboard/web/apple-touch-icon.png dist/dashboard-web/apple-touch-icon.png && cp src/dashboard/web/terminal-replay.html dist/dashboard-web/terminal-replay.html && rm -rf dist/dashboard-web/skins && cp -r src/dashboard/web/skins dist/dashboard-web/skins && rm -rf dist/dashboard-web/game && { [ ! -d src/dashboard/web/game ] || cp -r src/dashboard/web/game dist/dashboard-web/game; }",
20
20
  "daemon": "tsx src/index-daemon.ts",
21
21
  "daemon:start": "node dist/cli.js start",
22
22
  "daemon:stop": "node dist/cli.js stop",
@@ -1,2 +0,0 @@
1
- export declare function renderWorkflowCatalogPage(root: HTMLElement): () => void;
2
- //# sourceMappingURL=workflow-catalog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow-catalog.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/workflow-catalog.ts"],"names":[],"mappings":"AA2DA,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CAWvE"}