botmux 2.111.0 → 2.112.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 (1041) hide show
  1. package/README.en.md +19 -7
  2. package/README.md +19 -7
  3. package/dist/adapters/adopt-route.d.ts.map +1 -1
  4. package/dist/adapters/adopt-route.js +2 -1
  5. package/dist/adapters/adopt-route.js.map +1 -1
  6. package/dist/adapters/backend/herdr-backend.d.ts +29 -0
  7. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  8. package/dist/adapters/backend/herdr-backend.js +167 -0
  9. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  10. package/dist/adapters/backend/riff-backend.js +2 -2
  11. package/dist/adapters/backend/sandbox.d.ts +61 -6
  12. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  13. package/dist/adapters/backend/sandbox.js +235 -43
  14. package/dist/adapters/backend/sandbox.js.map +1 -1
  15. package/dist/adapters/backend/tmux-backend.d.ts +1 -0
  16. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  17. package/dist/adapters/backend/tmux-backend.js +1 -0
  18. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  19. package/dist/adapters/cli/claude-code.d.ts +2 -0
  20. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  21. package/dist/adapters/cli/claude-code.js +7 -0
  22. package/dist/adapters/cli/claude-code.js.map +1 -1
  23. package/dist/adapters/cli/codex-app-turn.d.ts +16 -0
  24. package/dist/adapters/cli/codex-app-turn.d.ts.map +1 -1
  25. package/dist/adapters/cli/codex-app-turn.js +26 -0
  26. package/dist/adapters/cli/codex-app-turn.js.map +1 -1
  27. package/dist/adapters/cli/codex.d.ts.map +1 -1
  28. package/dist/adapters/cli/codex.js +1 -0
  29. package/dist/adapters/cli/codex.js.map +1 -1
  30. package/dist/adapters/cli/grok.d.ts +8 -6
  31. package/dist/adapters/cli/grok.d.ts.map +1 -1
  32. package/dist/adapters/cli/grok.js +14 -6
  33. package/dist/adapters/cli/grok.js.map +1 -1
  34. package/dist/adapters/cli/read-isolation.d.ts +40 -14
  35. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  36. package/dist/adapters/cli/read-isolation.js +116 -19
  37. package/dist/adapters/cli/read-isolation.js.map +1 -1
  38. package/dist/adapters/cli/runner-control-channel.d.ts +32 -0
  39. package/dist/adapters/cli/runner-control-channel.d.ts.map +1 -0
  40. package/dist/adapters/cli/runner-control-channel.js +104 -0
  41. package/dist/adapters/cli/runner-control-channel.js.map +1 -0
  42. package/dist/adapters/cli/shared-hints.d.ts +1 -1
  43. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  44. package/dist/adapters/cli/shared-hints.js +9 -0
  45. package/dist/adapters/cli/shared-hints.js.map +1 -1
  46. package/dist/adapters/cli/traex.d.ts.map +1 -1
  47. package/dist/adapters/cli/traex.js +100 -64
  48. package/dist/adapters/cli/traex.js.map +1 -1
  49. package/dist/adapters/cli/types.d.ts +13 -0
  50. package/dist/adapters/cli/types.d.ts.map +1 -1
  51. package/dist/bot-registry.d.ts +36 -27
  52. package/dist/bot-registry.d.ts.map +1 -1
  53. package/dist/bot-registry.js +354 -8
  54. package/dist/bot-registry.js.map +1 -1
  55. package/dist/cli/saved-workflow.d.ts +25 -0
  56. package/dist/cli/saved-workflow.d.ts.map +1 -0
  57. package/dist/cli/saved-workflow.js +338 -0
  58. package/dist/cli/saved-workflow.js.map +1 -0
  59. package/dist/cli/send-dispatch.d.ts +18 -3
  60. package/dist/cli/send-dispatch.d.ts.map +1 -1
  61. package/dist/cli/send-dispatch.js +22 -3
  62. package/dist/cli/send-dispatch.js.map +1 -1
  63. package/dist/cli/v3-run-cancel.d.ts +47 -0
  64. package/dist/cli/v3-run-cancel.d.ts.map +1 -0
  65. package/dist/cli/v3-run-cancel.js +96 -0
  66. package/dist/cli/v3-run-cancel.js.map +1 -0
  67. package/dist/cli/vc-agent.d.ts.map +1 -1
  68. package/dist/cli/vc-agent.js +54 -1
  69. package/dist/cli/vc-agent.js.map +1 -1
  70. package/dist/cli/workflow-migration.d.ts +39 -0
  71. package/dist/cli/workflow-migration.d.ts.map +1 -0
  72. package/dist/cli/workflow-migration.js +302 -0
  73. package/dist/cli/workflow-migration.js.map +1 -0
  74. package/dist/cli/workflow-run-archive.d.ts +29 -0
  75. package/dist/cli/workflow-run-archive.d.ts.map +1 -0
  76. package/dist/cli/workflow-run-archive.js +183 -0
  77. package/dist/cli/workflow-run-archive.js.map +1 -0
  78. package/dist/cli/workflow.d.ts +5 -10
  79. package/dist/cli/workflow.d.ts.map +1 -1
  80. package/dist/cli/workflow.js +85 -764
  81. package/dist/cli/workflow.js.map +1 -1
  82. package/dist/cli.d.ts.map +1 -1
  83. package/dist/cli.js +1018 -191
  84. package/dist/cli.js.map +1 -1
  85. package/dist/codex-app-runner.js +30 -21
  86. package/dist/codex-app-runner.js.map +1 -1
  87. package/dist/core/command-handler.d.ts.map +1 -1
  88. package/dist/core/command-handler.js +21 -9
  89. package/dist/core/command-handler.js.map +1 -1
  90. package/dist/core/current-turn-provenance.d.ts +39 -0
  91. package/dist/core/current-turn-provenance.d.ts.map +1 -0
  92. package/dist/core/current-turn-provenance.js +122 -0
  93. package/dist/core/current-turn-provenance.js.map +1 -0
  94. package/dist/core/daemon-ipc-auth.d.ts +20 -0
  95. package/dist/core/daemon-ipc-auth.d.ts.map +1 -0
  96. package/dist/core/daemon-ipc-auth.js +44 -0
  97. package/dist/core/daemon-ipc-auth.js.map +1 -0
  98. package/dist/core/daemon-ipc-session-auth.d.ts +37 -0
  99. package/dist/core/daemon-ipc-session-auth.d.ts.map +1 -0
  100. package/dist/core/daemon-ipc-session-auth.js +35 -0
  101. package/dist/core/daemon-ipc-session-auth.js.map +1 -0
  102. package/dist/core/dashboard-command/index.d.ts +0 -2
  103. package/dist/core/dashboard-command/index.d.ts.map +1 -1
  104. package/dist/core/dashboard-command/index.js +2 -2
  105. package/dist/core/dashboard-command/index.js.map +1 -1
  106. package/dist/core/dashboard-command/stub.d.ts +1 -1
  107. package/dist/core/dashboard-command/stub.d.ts.map +1 -1
  108. package/dist/core/dashboard-command/stub.js +0 -1
  109. package/dist/core/dashboard-command/stub.js.map +1 -1
  110. package/dist/core/dashboard-ipc-server.d.ts +11 -2
  111. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  112. package/dist/core/dashboard-ipc-server.js +266 -41
  113. package/dist/core/dashboard-ipc-server.js.map +1 -1
  114. package/dist/core/dashboard-secret.d.ts +3 -0
  115. package/dist/core/dashboard-secret.d.ts.map +1 -0
  116. package/dist/core/dashboard-secret.js +7 -0
  117. package/dist/core/dashboard-secret.js.map +1 -0
  118. package/dist/core/data-dir.d.ts +24 -0
  119. package/dist/core/data-dir.d.ts.map +1 -0
  120. package/dist/core/data-dir.js +48 -0
  121. package/dist/core/data-dir.js.map +1 -0
  122. package/dist/core/inflight-input-tracker.d.ts +4 -2
  123. package/dist/core/inflight-input-tracker.d.ts.map +1 -1
  124. package/dist/core/inflight-input-tracker.js +6 -5
  125. package/dist/core/inflight-input-tracker.js.map +1 -1
  126. package/dist/core/inject-queue-policy.d.ts +70 -0
  127. package/dist/core/inject-queue-policy.d.ts.map +1 -0
  128. package/dist/core/inject-queue-policy.js +30 -0
  129. package/dist/core/inject-queue-policy.js.map +1 -0
  130. package/dist/core/maintenance.d.ts +1 -1
  131. package/dist/core/maintenance.d.ts.map +1 -1
  132. package/dist/core/maintenance.js +3 -2
  133. package/dist/core/maintenance.js.map +1 -1
  134. package/dist/core/managed-origin-capability.d.ts +30 -0
  135. package/dist/core/managed-origin-capability.d.ts.map +1 -0
  136. package/dist/core/managed-origin-capability.js +88 -0
  137. package/dist/core/managed-origin-capability.js.map +1 -0
  138. package/dist/core/role-library.d.ts +15 -0
  139. package/dist/core/role-library.d.ts.map +1 -0
  140. package/dist/core/role-library.js +75 -0
  141. package/dist/core/role-library.js.map +1 -0
  142. package/dist/core/session-cwd.d.ts +14 -0
  143. package/dist/core/session-cwd.d.ts.map +1 -0
  144. package/dist/core/session-cwd.js +17 -0
  145. package/dist/core/session-cwd.js.map +1 -0
  146. package/dist/core/session-manager.d.ts +4 -1
  147. package/dist/core/session-manager.d.ts.map +1 -1
  148. package/dist/core/session-manager.js +27 -8
  149. package/dist/core/session-manager.js.map +1 -1
  150. package/dist/core/session-marker.d.ts +22 -0
  151. package/dist/core/session-marker.d.ts.map +1 -1
  152. package/dist/core/session-marker.js +185 -20
  153. package/dist/core/session-marker.js.map +1 -1
  154. package/dist/core/slash-inject.d.ts +15 -0
  155. package/dist/core/slash-inject.d.ts.map +1 -0
  156. package/dist/core/slash-inject.js +25 -0
  157. package/dist/core/slash-inject.js.map +1 -0
  158. package/dist/core/terminal-url.d.ts +1 -0
  159. package/dist/core/terminal-url.d.ts.map +1 -1
  160. package/dist/core/terminal-url.js +14 -8
  161. package/dist/core/terminal-url.js.map +1 -1
  162. package/dist/core/terminal-write-auth.d.ts +26 -0
  163. package/dist/core/terminal-write-auth.d.ts.map +1 -1
  164. package/dist/core/terminal-write-auth.js +48 -3
  165. package/dist/core/terminal-write-auth.js.map +1 -1
  166. package/dist/core/trigger-session.d.ts +24 -1
  167. package/dist/core/trigger-session.d.ts.map +1 -1
  168. package/dist/core/trigger-session.js +106 -15
  169. package/dist/core/trigger-session.js.map +1 -1
  170. package/dist/core/types.d.ts +26 -1
  171. package/dist/core/types.d.ts.map +1 -1
  172. package/dist/core/types.js +10 -0
  173. package/dist/core/types.js.map +1 -1
  174. package/dist/core/worker-pool.d.ts +65 -2
  175. package/dist/core/worker-pool.d.ts.map +1 -1
  176. package/dist/core/worker-pool.js +459 -39
  177. package/dist/core/worker-pool.js.map +1 -1
  178. package/dist/daemon.d.ts +249 -8
  179. package/dist/daemon.d.ts.map +1 -1
  180. package/dist/daemon.js +7383 -1195
  181. package/dist/daemon.js.map +1 -1
  182. package/dist/dashboard/aggregator.d.ts +1 -1
  183. package/dist/dashboard/aggregator.d.ts.map +1 -1
  184. package/dist/dashboard/aggregator.js +2 -2
  185. package/dist/dashboard/aggregator.js.map +1 -1
  186. package/dist/dashboard/auth.d.ts +3 -8
  187. package/dist/dashboard/auth.d.ts.map +1 -1
  188. package/dist/dashboard/auth.js +63 -22
  189. package/dist/dashboard/auth.js.map +1 -1
  190. package/dist/dashboard/bot-onboarding.d.ts +5 -0
  191. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  192. package/dist/dashboard/bot-onboarding.js +37 -0
  193. package/dist/dashboard/bot-onboarding.js.map +1 -1
  194. package/dist/dashboard/connector-api.d.ts.map +1 -1
  195. package/dist/dashboard/connector-api.js +42 -2
  196. package/dist/dashboard/connector-api.js.map +1 -1
  197. package/dist/dashboard/daemon-internal-api.d.ts +0 -2
  198. package/dist/dashboard/daemon-internal-api.d.ts.map +1 -1
  199. package/dist/dashboard/daemon-internal-api.js +26 -93
  200. package/dist/dashboard/daemon-internal-api.js.map +1 -1
  201. package/dist/dashboard/daemon-internal-client.d.ts.map +1 -1
  202. package/dist/dashboard/daemon-internal-client.js +2 -3
  203. package/dist/dashboard/daemon-internal-client.js.map +1 -1
  204. package/dist/dashboard/federation-api.js +1 -1
  205. package/dist/dashboard/federation-api.js.map +1 -1
  206. package/dist/dashboard/federation-spoke-api.js +1 -1
  207. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  208. package/dist/dashboard/history-senders.d.ts +3 -0
  209. package/dist/dashboard/history-senders.d.ts.map +1 -1
  210. package/dist/dashboard/history-senders.js.map +1 -1
  211. package/dist/dashboard/http.d.ts +4 -0
  212. package/dist/dashboard/http.d.ts.map +1 -0
  213. package/dist/dashboard/http.js +6 -0
  214. package/dist/dashboard/http.js.map +1 -0
  215. package/dist/dashboard/registry.d.ts +4 -0
  216. package/dist/dashboard/registry.d.ts.map +1 -1
  217. package/dist/dashboard/registry.js.map +1 -1
  218. package/dist/dashboard/trigger-api.js +1 -1
  219. package/dist/dashboard/trigger-api.js.map +1 -1
  220. package/dist/dashboard/v3-runs-api.d.ts +13 -10
  221. package/dist/dashboard/v3-runs-api.d.ts.map +1 -1
  222. package/dist/dashboard/v3-runs-api.js +121 -4
  223. package/dist/dashboard/v3-runs-api.js.map +1 -1
  224. package/dist/dashboard/vc-consumer-profiles-api.d.ts +105 -0
  225. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -0
  226. package/dist/dashboard/vc-consumer-profiles-api.js +312 -0
  227. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -0
  228. package/dist/dashboard/web/app.d.ts.map +1 -1
  229. package/dist/dashboard/web/app.js +7 -6
  230. package/dist/dashboard/web/app.js.map +1 -1
  231. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  232. package/dist/dashboard/web/bot-defaults-page.js +9 -14
  233. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  234. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  235. package/dist/dashboard/web/bot-onboarding.js +7 -3
  236. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  237. package/dist/dashboard/web/connectors-page.d.ts +5 -0
  238. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  239. package/dist/dashboard/web/connectors-page.js +16 -12
  240. package/dist/dashboard/web/connectors-page.js.map +1 -1
  241. package/dist/dashboard/web/create-session-entry.d.ts +4 -0
  242. package/dist/dashboard/web/create-session-entry.d.ts.map +1 -0
  243. package/dist/dashboard/web/create-session-entry.js +17 -0
  244. package/dist/dashboard/web/create-session-entry.js.map +1 -0
  245. package/dist/dashboard/web/dashboard-components.d.ts +5 -0
  246. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
  247. package/dist/dashboard/web/dashboard-components.js +29 -4
  248. package/dist/dashboard/web/dashboard-components.js.map +1 -1
  249. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  250. package/dist/dashboard/web/dashboard-routes.js +0 -1
  251. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  252. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  253. package/dist/dashboard/web/i18n.js +192 -382
  254. package/dist/dashboard/web/i18n.js.map +1 -1
  255. package/dist/dashboard/web/preferences.d.ts +3 -0
  256. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  257. package/dist/dashboard/web/preferences.js +18 -0
  258. package/dist/dashboard/web/preferences.js.map +1 -1
  259. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  260. package/dist/dashboard/web/schedules-page.js +4 -1
  261. package/dist/dashboard/web/schedules-page.js.map +1 -1
  262. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  263. package/dist/dashboard/web/sessions-page.js +64 -18
  264. package/dist/dashboard/web/sessions-page.js.map +1 -1
  265. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  266. package/dist/dashboard/web/settings-page.js +2 -1
  267. package/dist/dashboard/web/settings-page.js.map +1 -1
  268. package/dist/dashboard/web/v3-api.d.ts +12 -2
  269. package/dist/dashboard/web/v3-api.d.ts.map +1 -1
  270. package/dist/dashboard/web/v3-api.js +34 -6
  271. package/dist/dashboard/web/v3-api.js.map +1 -1
  272. package/dist/dashboard/web/v3-components.d.ts +6 -0
  273. package/dist/dashboard/web/v3-components.d.ts.map +1 -1
  274. package/dist/dashboard/web/v3-components.js +66 -23
  275. package/dist/dashboard/web/v3-components.js.map +1 -1
  276. package/dist/dashboard/web/v3-model.js +1 -1
  277. package/dist/dashboard/web/v3-model.js.map +1 -1
  278. package/dist/dashboard/web/v3-terminal.js +2 -2
  279. package/dist/dashboard/web/v3-terminal.js.map +1 -1
  280. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +19 -0
  281. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -0
  282. package/dist/dashboard/web/vc-consumer-profiles-section.js +382 -0
  283. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -0
  284. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  285. package/dist/dashboard/webhook-routes.js +29 -6
  286. package/dist/dashboard/webhook-routes.js.map +1 -1
  287. package/dist/dashboard-web/app.js +1 -1
  288. package/dist/dashboard-web/chunks/bot-defaults-page-RYBL4ZYE.js +4 -0
  289. package/dist/dashboard-web/chunks/{chunk-OEJIT66L.js → chunk-CMDPZOPK.js} +1 -1
  290. package/dist/dashboard-web/chunks/chunk-I35DXGM4.js +1 -0
  291. package/dist/dashboard-web/chunks/chunk-NYZHARIU.js +47 -0
  292. package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +1 -0
  293. package/dist/dashboard-web/chunks/{chunk-YQFXGRSD.js → chunk-YBOHL7T7.js} +1 -1
  294. package/dist/dashboard-web/chunks/chunk-YWCPDL4S.js +1 -0
  295. package/dist/dashboard-web/chunks/connectors-page-DAMP7TTV.js +1 -0
  296. package/dist/dashboard-web/chunks/{groups-page-5AJPPJH2.js → groups-page-BPFA356N.js} +1 -1
  297. package/dist/dashboard-web/chunks/{insights-page-R3DFECX4.js → insights-page-SHOPHTWY.js} +1 -1
  298. package/dist/dashboard-web/chunks/{monitor-room-NLMKJLDY.js → monitor-room-PXPJGZCN.js} +1 -1
  299. package/dist/dashboard-web/chunks/{monitoring-page-EHSOX4GV.js → monitoring-page-4DF54M5Y.js} +1 -1
  300. package/dist/dashboard-web/chunks/{office-page-OXJKFJ4R.js → office-page-6OHU6KMZ.js} +1 -1
  301. package/dist/dashboard-web/chunks/{overview-page-GJHIVXJF.js → overview-page-IHIZ6F5M.js} +1 -1
  302. package/dist/dashboard-web/chunks/{roles-page-6ZODQISW.js → roles-page-JYTBYKEF.js} +1 -1
  303. package/dist/dashboard-web/chunks/{schedules-page-DAGMHVCH.js → schedules-page-WJ72T7KV.js} +1 -1
  304. package/dist/dashboard-web/chunks/sessions-page-QC56OIAI.js +3 -0
  305. package/dist/dashboard-web/chunks/settings-page-TCKWEXTN.js +2 -0
  306. package/dist/dashboard-web/chunks/{skills-page-J7EVUHXP.js → skills-page-RJJNIECW.js} +1 -1
  307. package/dist/dashboard-web/chunks/{team-federation-page-YM5JBIII.js → team-federation-page-ZMDX3E7K.js} +1 -1
  308. package/dist/dashboard-web/chunks/v3-page-VLLAUQ33.js +94 -0
  309. package/dist/dashboard-web/chunks/{whiteboards-page-75N2U6W4.js → whiteboards-page-NAO53CKM.js} +1 -1
  310. package/dist/dashboard-web/style.css +363 -274
  311. package/dist/dashboard.js +194 -78
  312. package/dist/dashboard.js.map +1 -1
  313. package/dist/global-config.d.ts +1 -1
  314. package/dist/i18n/en.d.ts.map +1 -1
  315. package/dist/i18n/en.js +12 -87
  316. package/dist/i18n/en.js.map +1 -1
  317. package/dist/i18n/zh.d.ts.map +1 -1
  318. package/dist/i18n/zh.js +12 -87
  319. package/dist/i18n/zh.js.map +1 -1
  320. package/dist/im/lark/brand-template.d.ts +15 -0
  321. package/dist/im/lark/brand-template.d.ts.map +1 -0
  322. package/dist/im/lark/brand-template.js +114 -0
  323. package/dist/im/lark/brand-template.js.map +1 -0
  324. package/dist/im/lark/card-handler.d.ts +6 -3
  325. package/dist/im/lark/card-handler.d.ts.map +1 -1
  326. package/dist/im/lark/card-handler.js +23 -39
  327. package/dist/im/lark/card-handler.js.map +1 -1
  328. package/dist/im/lark/client.d.ts +8 -2
  329. package/dist/im/lark/client.d.ts.map +1 -1
  330. package/dist/im/lark/client.js +33 -31
  331. package/dist/im/lark/client.js.map +1 -1
  332. package/dist/im/lark/doc-comment.d.ts +18 -0
  333. package/dist/im/lark/doc-comment.d.ts.map +1 -1
  334. package/dist/im/lark/doc-comment.js +119 -5
  335. package/dist/im/lark/doc-comment.js.map +1 -1
  336. package/dist/im/lark/event-dispatcher.d.ts +18 -2
  337. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  338. package/dist/im/lark/event-dispatcher.js +41 -19
  339. package/dist/im/lark/event-dispatcher.js.map +1 -1
  340. package/dist/im/lark/merge-forward.d.ts.map +1 -1
  341. package/dist/im/lark/merge-forward.js +7 -2
  342. package/dist/im/lark/merge-forward.js.map +1 -1
  343. package/dist/im/lark/message-parser.d.ts.map +1 -1
  344. package/dist/im/lark/message-parser.js +7 -0
  345. package/dist/im/lark/message-parser.js.map +1 -1
  346. package/dist/im/lark/overview-card.d.ts +1 -2
  347. package/dist/im/lark/overview-card.d.ts.map +1 -1
  348. package/dist/im/lark/overview-card.js +1 -48
  349. package/dist/im/lark/overview-card.js.map +1 -1
  350. package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -1
  351. package/dist/im/lark/v3-blocked-card-handler.js +5 -5
  352. package/dist/im/lark/v3-blocked-card-handler.js.map +1 -1
  353. package/dist/im/lark/v3-blocked-card.d.ts +1 -0
  354. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
  355. package/dist/im/lark/v3-blocked-card.js +19 -2
  356. package/dist/im/lark/v3-blocked-card.js.map +1 -1
  357. package/dist/im/lark/v3-distillation-card-handler.d.ts +12 -0
  358. package/dist/im/lark/v3-distillation-card-handler.d.ts.map +1 -0
  359. package/dist/im/lark/v3-distillation-card-handler.js +107 -0
  360. package/dist/im/lark/v3-distillation-card-handler.js.map +1 -0
  361. package/dist/im/lark/v3-distillation-card.d.ts +42 -0
  362. package/dist/im/lark/v3-distillation-card.d.ts.map +1 -0
  363. package/dist/im/lark/v3-distillation-card.js +206 -0
  364. package/dist/im/lark/v3-distillation-card.js.map +1 -0
  365. package/dist/im/lark/v3-gate-card-handler.d.ts +1 -1
  366. package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -1
  367. package/dist/im/lark/v3-gate-card-handler.js +6 -5
  368. package/dist/im/lark/v3-gate-card-handler.js.map +1 -1
  369. package/dist/im/lark/v3-gate-card.d.ts +8 -1
  370. package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
  371. package/dist/im/lark/v3-gate-card.js +38 -7
  372. package/dist/im/lark/v3-gate-card.js.map +1 -1
  373. package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -1
  374. package/dist/im/lark/v3-loop-grant-card-handler.js +3 -4
  375. package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -1
  376. package/dist/im/lark/v3-loop-grant-card.js +1 -1
  377. package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
  378. package/dist/im/lark/v3-progress-card-manager.d.ts +79 -0
  379. package/dist/im/lark/v3-progress-card-manager.d.ts.map +1 -0
  380. package/dist/im/lark/v3-progress-card-manager.js +444 -0
  381. package/dist/im/lark/v3-progress-card-manager.js.map +1 -0
  382. package/dist/im/lark/v3-progress-card.d.ts +26 -0
  383. package/dist/im/lark/v3-progress-card.d.ts.map +1 -0
  384. package/dist/im/lark/v3-progress-card.js +211 -0
  385. package/dist/im/lark/v3-progress-card.js.map +1 -0
  386. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -1
  387. package/dist/im/lark/v3-revisit-grant-card-handler.js +3 -4
  388. package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -1
  389. package/dist/im/lark/v3-revisit-grant-card.js +1 -1
  390. package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
  391. package/dist/im/lark/v3-run-save-card-handler.d.ts +12 -0
  392. package/dist/im/lark/v3-run-save-card-handler.d.ts.map +1 -0
  393. package/dist/im/lark/v3-run-save-card-handler.js +160 -0
  394. package/dist/im/lark/v3-run-save-card-handler.js.map +1 -0
  395. package/dist/im/lark/v3-run-save-card.d.ts +38 -0
  396. package/dist/im/lark/v3-run-save-card.d.ts.map +1 -0
  397. package/dist/im/lark/v3-run-save-card.js +125 -0
  398. package/dist/im/lark/v3-run-save-card.js.map +1 -0
  399. package/dist/im/lark/v3-saved-workflow-command.d.ts +36 -0
  400. package/dist/im/lark/v3-saved-workflow-command.d.ts.map +1 -0
  401. package/dist/im/lark/v3-saved-workflow-command.js +186 -0
  402. package/dist/im/lark/v3-saved-workflow-command.js.map +1 -0
  403. package/dist/im/lark/v3-saved-workflow-handler.d.ts +89 -0
  404. package/dist/im/lark/v3-saved-workflow-handler.d.ts.map +1 -0
  405. package/dist/im/lark/v3-saved-workflow-handler.js +212 -0
  406. package/dist/im/lark/v3-saved-workflow-handler.js.map +1 -0
  407. package/dist/im/lark/workflow-slash-command.d.ts +7 -110
  408. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
  409. package/dist/im/lark/workflow-slash-command.js +16 -230
  410. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  411. package/dist/index-daemon.js +1 -1
  412. package/dist/index-daemon.js.map +1 -1
  413. package/dist/mir-runner.js +11 -15
  414. package/dist/mir-runner.js.map +1 -1
  415. package/dist/mira-runner.js +8 -12
  416. package/dist/mira-runner.js.map +1 -1
  417. package/dist/services/bridge-turn-queue.d.ts +29 -12
  418. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  419. package/dist/services/bridge-turn-queue.js +59 -23
  420. package/dist/services/bridge-turn-queue.js.map +1 -1
  421. package/dist/services/claude-transcript.d.ts +15 -0
  422. package/dist/services/claude-transcript.d.ts.map +1 -1
  423. package/dist/services/claude-transcript.js +24 -0
  424. package/dist/services/claude-transcript.js.map +1 -1
  425. package/dist/services/codex-bridge-queue.d.ts +13 -2
  426. package/dist/services/codex-bridge-queue.d.ts.map +1 -1
  427. package/dist/services/codex-bridge-queue.js +20 -3
  428. package/dist/services/codex-bridge-queue.js.map +1 -1
  429. package/dist/services/codex-transcript.d.ts +6 -0
  430. package/dist/services/codex-transcript.d.ts.map +1 -1
  431. package/dist/services/codex-transcript.js.map +1 -1
  432. package/dist/services/grok-transcript.d.ts +3 -2
  433. package/dist/services/grok-transcript.d.ts.map +1 -1
  434. package/dist/services/grok-transcript.js +73 -22
  435. package/dist/services/grok-transcript.js.map +1 -1
  436. package/dist/services/hook-runner.d.ts.map +1 -1
  437. package/dist/services/hook-runner.js +26 -3
  438. package/dist/services/hook-runner.js.map +1 -1
  439. package/dist/services/schedule-store.d.ts +37 -0
  440. package/dist/services/schedule-store.d.ts.map +1 -1
  441. package/dist/services/schedule-store.js +259 -141
  442. package/dist/services/schedule-store.js.map +1 -1
  443. package/dist/services/send-policy.d.ts +50 -0
  444. package/dist/services/send-policy.d.ts.map +1 -1
  445. package/dist/services/send-policy.js +65 -0
  446. package/dist/services/send-policy.js.map +1 -1
  447. package/dist/services/session-lifecycle-hooks.d.ts.map +1 -1
  448. package/dist/services/session-lifecycle-hooks.js +12 -0
  449. package/dist/services/session-lifecycle-hooks.js.map +1 -1
  450. package/dist/services/traex-transcript.d.ts +11 -2
  451. package/dist/services/traex-transcript.d.ts.map +1 -1
  452. package/dist/services/traex-transcript.js +142 -8
  453. package/dist/services/traex-transcript.js.map +1 -1
  454. package/dist/services/trigger-types.d.ts +6 -1
  455. package/dist/services/trigger-types.d.ts.map +1 -1
  456. package/dist/services/trigger-types.js.map +1 -1
  457. package/dist/services/turn-terminal-deduper.d.ts +14 -0
  458. package/dist/services/turn-terminal-deduper.d.ts.map +1 -0
  459. package/dist/services/turn-terminal-deduper.js +34 -0
  460. package/dist/services/turn-terminal-deduper.js.map +1 -0
  461. package/dist/services/vc-meeting-action-gate.d.ts +246 -0
  462. package/dist/services/vc-meeting-action-gate.d.ts.map +1 -0
  463. package/dist/services/vc-meeting-action-gate.js +756 -0
  464. package/dist/services/vc-meeting-action-gate.js.map +1 -0
  465. package/dist/services/vc-meeting-action-store.d.ts +222 -0
  466. package/dist/services/vc-meeting-action-store.d.ts.map +1 -0
  467. package/dist/services/vc-meeting-action-store.js +806 -0
  468. package/dist/services/vc-meeting-action-store.js.map +1 -0
  469. package/dist/services/vc-meeting-consumer-isolation.d.ts +27 -0
  470. package/dist/services/vc-meeting-consumer-isolation.d.ts.map +1 -0
  471. package/dist/services/vc-meeting-consumer-isolation.js +37 -0
  472. package/dist/services/vc-meeting-consumer-isolation.js.map +1 -0
  473. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +72 -0
  474. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -0
  475. package/dist/services/vc-meeting-consumer-profile-bootstrap.js +343 -0
  476. package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -0
  477. package/dist/services/vc-meeting-consumer-profile-store.d.ts +39 -0
  478. package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +1 -0
  479. package/dist/services/vc-meeting-consumer-profile-store.js +190 -0
  480. package/dist/services/vc-meeting-consumer-profile-store.js.map +1 -0
  481. package/dist/services/vc-meeting-daemon-auth.d.ts +29 -0
  482. package/dist/services/vc-meeting-daemon-auth.d.ts.map +1 -0
  483. package/dist/services/vc-meeting-daemon-auth.js +117 -0
  484. package/dist/services/vc-meeting-daemon-auth.js.map +1 -0
  485. package/dist/services/vc-meeting-delivery-feed.d.ts +52 -0
  486. package/dist/services/vc-meeting-delivery-feed.d.ts.map +1 -0
  487. package/dist/services/vc-meeting-delivery-feed.js +231 -0
  488. package/dist/services/vc-meeting-delivery-feed.js.map +1 -0
  489. package/dist/services/vc-meeting-delivery-hub-store.d.ts +213 -0
  490. package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +1 -0
  491. package/dist/services/vc-meeting-delivery-hub-store.js +1230 -0
  492. package/dist/services/vc-meeting-delivery-hub-store.js.map +1 -0
  493. package/dist/services/vc-meeting-delivery-protocol.d.ts +159 -0
  494. package/dist/services/vc-meeting-delivery-protocol.d.ts.map +1 -0
  495. package/dist/services/vc-meeting-delivery-protocol.js +443 -0
  496. package/dist/services/vc-meeting-delivery-protocol.js.map +1 -0
  497. package/dist/services/vc-meeting-delivery-receiver.d.ts +80 -0
  498. package/dist/services/vc-meeting-delivery-receiver.d.ts.map +1 -0
  499. package/dist/services/vc-meeting-delivery-receiver.js +543 -0
  500. package/dist/services/vc-meeting-delivery-receiver.js.map +1 -0
  501. package/dist/services/vc-meeting-delivery-store.d.ts +339 -0
  502. package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -0
  503. package/dist/services/vc-meeting-delivery-store.js +1024 -0
  504. package/dist/services/vc-meeting-delivery-store.js.map +1 -0
  505. package/dist/services/vc-meeting-feed-metadata-store.d.ts +58 -0
  506. package/dist/services/vc-meeting-feed-metadata-store.d.ts.map +1 -0
  507. package/dist/services/vc-meeting-feed-metadata-store.js +356 -0
  508. package/dist/services/vc-meeting-feed-metadata-store.js.map +1 -0
  509. package/dist/services/vc-meeting-im-reply.d.ts +55 -0
  510. package/dist/services/vc-meeting-im-reply.d.ts.map +1 -0
  511. package/dist/services/vc-meeting-im-reply.js +279 -0
  512. package/dist/services/vc-meeting-im-reply.js.map +1 -0
  513. package/dist/services/vc-meeting-im-routing.d.ts +131 -0
  514. package/dist/services/vc-meeting-im-routing.d.ts.map +1 -0
  515. package/dist/services/vc-meeting-im-routing.js +449 -0
  516. package/dist/services/vc-meeting-im-routing.js.map +1 -0
  517. package/dist/services/vc-meeting-listener-message-store.d.ts +23 -0
  518. package/dist/services/vc-meeting-listener-message-store.d.ts.map +1 -0
  519. package/dist/services/vc-meeting-listener-message-store.js +142 -0
  520. package/dist/services/vc-meeting-listener-message-store.js.map +1 -0
  521. package/dist/services/vc-meeting-member-policy.d.ts +37 -0
  522. package/dist/services/vc-meeting-member-policy.d.ts.map +1 -0
  523. package/dist/services/vc-meeting-member-policy.js +102 -0
  524. package/dist/services/vc-meeting-member-policy.js.map +1 -0
  525. package/dist/services/vc-meeting-profile-instructions.d.ts +22 -0
  526. package/dist/services/vc-meeting-profile-instructions.d.ts.map +1 -0
  527. package/dist/services/vc-meeting-profile-instructions.js +64 -0
  528. package/dist/services/vc-meeting-profile-instructions.js.map +1 -0
  529. package/dist/services/vc-meeting-runtime-store.d.ts +63 -0
  530. package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -1
  531. package/dist/services/vc-meeting-runtime-store.js +605 -116
  532. package/dist/services/vc-meeting-runtime-store.js.map +1 -1
  533. package/dist/services/vc-meeting-send-policy.d.ts +89 -0
  534. package/dist/services/vc-meeting-send-policy.d.ts.map +1 -0
  535. package/dist/services/vc-meeting-send-policy.js +150 -0
  536. package/dist/services/vc-meeting-send-policy.js.map +1 -0
  537. package/dist/services/vc-meeting-terminal-reconciler.d.ts +93 -0
  538. package/dist/services/vc-meeting-terminal-reconciler.d.ts.map +1 -0
  539. package/dist/services/vc-meeting-terminal-reconciler.js +198 -0
  540. package/dist/services/vc-meeting-terminal-reconciler.js.map +1 -0
  541. package/dist/setup/open-platform-automation.d.ts +2 -0
  542. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  543. package/dist/setup/open-platform-automation.js +1 -0
  544. package/dist/setup/open-platform-automation.js.map +1 -1
  545. package/dist/setup/open-platform-outcome.d.ts +50 -0
  546. package/dist/setup/open-platform-outcome.d.ts.map +1 -0
  547. package/dist/setup/open-platform-outcome.js +56 -0
  548. package/dist/setup/open-platform-outcome.js.map +1 -0
  549. package/dist/setup/setup-args.d.ts +7 -2
  550. package/dist/setup/setup-args.d.ts.map +1 -1
  551. package/dist/setup/setup-args.js +21 -5
  552. package/dist/setup/setup-args.js.map +1 -1
  553. package/dist/skills/definitions.d.ts.map +1 -1
  554. package/dist/skills/definitions.js +66 -54
  555. package/dist/skills/definitions.js.map +1 -1
  556. package/dist/skills/injection-mode.d.ts +5 -4
  557. package/dist/skills/injection-mode.d.ts.map +1 -1
  558. package/dist/skills/injection-mode.js +19 -10
  559. package/dist/skills/injection-mode.js.map +1 -1
  560. package/dist/types.d.ts +187 -0
  561. package/dist/types.d.ts.map +1 -1
  562. package/dist/utils/canonical-input-hash.d.ts +5 -0
  563. package/dist/utils/canonical-input-hash.d.ts.map +1 -0
  564. package/dist/utils/canonical-input-hash.js +43 -0
  565. package/dist/utils/canonical-input-hash.js.map +1 -0
  566. package/dist/utils/canonical-json.d.ts +10 -0
  567. package/dist/utils/canonical-json.d.ts.map +1 -0
  568. package/dist/utils/canonical-json.js +23 -0
  569. package/dist/utils/canonical-json.js.map +1 -0
  570. package/dist/utils/child-env.d.ts +1 -1
  571. package/dist/utils/child-env.d.ts.map +1 -1
  572. package/dist/utils/child-env.js +8 -0
  573. package/dist/utils/child-env.js.map +1 -1
  574. package/dist/utils/daemon-discovery.d.ts +4 -0
  575. package/dist/utils/daemon-discovery.d.ts.map +1 -1
  576. package/dist/utils/daemon-discovery.js +12 -6
  577. package/dist/utils/daemon-discovery.js.map +1 -1
  578. package/dist/utils/file-lock.d.ts.map +1 -1
  579. package/dist/utils/file-lock.js +696 -102
  580. package/dist/utils/file-lock.js.map +1 -1
  581. package/dist/utils/fs-durability.d.ts +20 -0
  582. package/dist/utils/fs-durability.d.ts.map +1 -0
  583. package/dist/utils/fs-durability.js +84 -0
  584. package/dist/utils/fs-durability.js.map +1 -0
  585. package/dist/utils/global-install.d.ts +5 -2
  586. package/dist/utils/global-install.d.ts.map +1 -1
  587. package/dist/utils/global-install.js +22 -4
  588. package/dist/utils/global-install.js.map +1 -1
  589. package/dist/utils/herdr-web-history.d.ts +12 -0
  590. package/dist/utils/herdr-web-history.d.ts.map +1 -0
  591. package/dist/utils/herdr-web-history.js +74 -0
  592. package/dist/utils/herdr-web-history.js.map +1 -0
  593. package/dist/utils/herdr-web-terminal-binding.d.ts +39 -0
  594. package/dist/utils/herdr-web-terminal-binding.d.ts.map +1 -0
  595. package/dist/utils/herdr-web-terminal-binding.js +56 -0
  596. package/dist/utils/herdr-web-terminal-binding.js.map +1 -0
  597. package/dist/utils/pending-input-queue.d.ts +30 -1
  598. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  599. package/dist/utils/pending-input-queue.js +45 -5
  600. package/dist/utils/pending-input-queue.js.map +1 -1
  601. package/dist/vc-agent/cards.d.ts +49 -4
  602. package/dist/vc-agent/cards.d.ts.map +1 -1
  603. package/dist/vc-agent/cards.js +460 -70
  604. package/dist/vc-agent/cards.js.map +1 -1
  605. package/dist/vc-agent/polling-source.d.ts +6 -1
  606. package/dist/vc-agent/polling-source.d.ts.map +1 -1
  607. package/dist/vc-agent/polling-source.js +17 -4
  608. package/dist/vc-agent/polling-source.js.map +1 -1
  609. package/dist/worker.js +1333 -283
  610. package/dist/worker.js.map +1 -1
  611. package/dist/workflows/definition.d.ts +28 -35
  612. package/dist/workflows/definition.d.ts.map +1 -1
  613. package/dist/workflows/definition.js +7 -24
  614. package/dist/workflows/definition.js.map +1 -1
  615. package/dist/workflows/events/payloads.d.ts +28 -28
  616. package/dist/workflows/events/replay.d.ts +5 -0
  617. package/dist/workflows/events/replay.d.ts.map +1 -1
  618. package/dist/workflows/events/replay.js +6 -1
  619. package/dist/workflows/events/replay.js.map +1 -1
  620. package/dist/workflows/events/schema.d.ts +663 -663
  621. package/dist/workflows/events/schema.d.ts.map +1 -1
  622. package/dist/workflows/events/schema.js +1 -4
  623. package/dist/workflows/events/schema.js.map +1 -1
  624. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +5 -4
  625. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  626. package/dist/workflows/hostExecutors/botmux-schedule.js +80 -35
  627. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  628. package/dist/workflows/hostExecutors/feishu-im.d.ts +3 -3
  629. package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -1
  630. package/dist/workflows/hostExecutors/feishu-im.js +3 -3
  631. package/dist/workflows/hostExecutors/feishu-im.js.map +1 -1
  632. package/dist/workflows/hostExecutors/feishu-reply.d.ts +1 -1
  633. package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -1
  634. package/dist/workflows/hostExecutors/feishu-reply.js +1 -1
  635. package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -1
  636. package/dist/workflows/hostExecutors/feishu-send.d.ts +1 -1
  637. package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -1
  638. package/dist/workflows/hostExecutors/feishu-send.js +1 -1
  639. package/dist/workflows/hostExecutors/feishu-send.js.map +1 -1
  640. package/dist/workflows/hostExecutors/index.d.ts +0 -1
  641. package/dist/workflows/hostExecutors/index.d.ts.map +1 -1
  642. package/dist/workflows/hostExecutors/index.js +0 -1
  643. package/dist/workflows/hostExecutors/index.js.map +1 -1
  644. package/dist/workflows/hostExecutors/registry.d.ts +1 -1
  645. package/dist/workflows/hostExecutors/registry.d.ts.map +1 -1
  646. package/dist/workflows/hostExecutors/types.d.ts +21 -29
  647. package/dist/workflows/hostExecutors/types.d.ts.map +1 -1
  648. package/dist/workflows/migration/v2-definition-paths.d.ts +3 -0
  649. package/dist/workflows/migration/v2-definition-paths.d.ts.map +1 -0
  650. package/dist/workflows/migration/v2-definition-paths.js +10 -0
  651. package/dist/workflows/migration/v2-definition-paths.js.map +1 -0
  652. package/dist/workflows/migration/v2-ledger.d.ts +138 -0
  653. package/dist/workflows/migration/v2-ledger.d.ts.map +1 -0
  654. package/dist/workflows/migration/v2-ledger.js +599 -0
  655. package/dist/workflows/migration/v2-ledger.js.map +1 -0
  656. package/dist/workflows/migration/v2-migration-service.d.ts +40 -0
  657. package/dist/workflows/migration/v2-migration-service.d.ts.map +1 -0
  658. package/dist/workflows/migration/v2-migration-service.js +454 -0
  659. package/dist/workflows/migration/v2-migration-service.js.map +1 -0
  660. package/dist/workflows/migration/v2-read-only-ids.d.ts +7 -0
  661. package/dist/workflows/migration/v2-read-only-ids.d.ts.map +1 -0
  662. package/dist/workflows/migration/v2-read-only-ids.js +9 -0
  663. package/dist/workflows/migration/v2-read-only-ids.js.map +1 -0
  664. package/dist/workflows/migration/v2-run-archive-schema.d.ts +976 -0
  665. package/dist/workflows/migration/v2-run-archive-schema.d.ts.map +1 -0
  666. package/dist/workflows/migration/v2-run-archive-schema.js +113 -0
  667. package/dist/workflows/migration/v2-run-archive-schema.js.map +1 -0
  668. package/dist/workflows/migration/v2-run-archive.d.ts +92 -0
  669. package/dist/workflows/migration/v2-run-archive.d.ts.map +1 -0
  670. package/dist/workflows/migration/v2-run-archive.js +1220 -0
  671. package/dist/workflows/migration/v2-run-archive.js.map +1 -0
  672. package/dist/workflows/migration/v2-scanner.d.ts +22 -0
  673. package/dist/workflows/migration/v2-scanner.d.ts.map +1 -0
  674. package/dist/workflows/migration/v2-scanner.js +114 -0
  675. package/dist/workflows/migration/v2-scanner.js.map +1 -0
  676. package/dist/workflows/migration/v2-to-v3.d.ts +32 -0
  677. package/dist/workflows/migration/v2-to-v3.d.ts.map +1 -0
  678. package/dist/workflows/migration/v2-to-v3.js +494 -0
  679. package/dist/workflows/migration/v2-to-v3.js.map +1 -0
  680. package/dist/workflows/ops-projection.d.ts.map +1 -1
  681. package/dist/workflows/ops-projection.js +4 -3
  682. package/dist/workflows/ops-projection.js.map +1 -1
  683. package/dist/workflows/shared/idempotency-key.d.ts +19 -0
  684. package/dist/workflows/shared/idempotency-key.d.ts.map +1 -0
  685. package/dist/workflows/shared/idempotency-key.js +23 -0
  686. package/dist/workflows/shared/idempotency-key.js.map +1 -0
  687. package/dist/workflows/{params.d.ts → shared/params.d.ts} +42 -6
  688. package/dist/workflows/shared/params.d.ts.map +1 -0
  689. package/dist/workflows/{params.js → shared/params.js} +91 -4
  690. package/dist/workflows/shared/params.js.map +1 -0
  691. package/dist/workflows/shared/provider-reconciler.d.ts +47 -0
  692. package/dist/workflows/shared/provider-reconciler.d.ts.map +1 -0
  693. package/dist/workflows/shared/provider-reconciler.js +17 -0
  694. package/dist/workflows/shared/provider-reconciler.js.map +1 -0
  695. package/dist/workflows/{spawn-policy.d.ts → shared/sandbox-policy.d.ts} +2 -2
  696. package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -0
  697. package/dist/workflows/{spawn-policy.js → shared/sandbox-policy.js} +1 -1
  698. package/dist/workflows/shared/sandbox-policy.js.map +1 -0
  699. package/dist/workflows/shared/worker-process.d.ts +29 -0
  700. package/dist/workflows/shared/worker-process.d.ts.map +1 -0
  701. package/dist/workflows/shared/worker-process.js +56 -0
  702. package/dist/workflows/shared/worker-process.js.map +1 -0
  703. package/dist/workflows/v3/architect.d.ts.map +1 -1
  704. package/dist/workflows/v3/architect.js +16 -4
  705. package/dist/workflows/v3/architect.js.map +1 -1
  706. package/dist/workflows/v3/attempt-ledger.d.ts +23 -0
  707. package/dist/workflows/v3/attempt-ledger.d.ts.map +1 -0
  708. package/dist/workflows/v3/attempt-ledger.js +74 -0
  709. package/dist/workflows/v3/attempt-ledger.js.map +1 -0
  710. package/dist/workflows/v3/bot-resolve.d.ts +19 -1
  711. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
  712. package/dist/workflows/v3/bot-resolve.js +129 -3
  713. package/dist/workflows/v3/bot-resolve.js.map +1 -1
  714. package/dist/workflows/v3/cli-daemon-command-authority.d.ts +59 -0
  715. package/dist/workflows/v3/cli-daemon-command-authority.d.ts.map +1 -0
  716. package/dist/workflows/v3/cli-daemon-command-authority.js +175 -0
  717. package/dist/workflows/v3/cli-daemon-command-authority.js.map +1 -0
  718. package/dist/workflows/v3/cli-run.d.ts +27 -0
  719. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  720. package/dist/workflows/v3/cli-run.js +113 -29
  721. package/dist/workflows/v3/cli-run.js.map +1 -1
  722. package/dist/workflows/v3/contract.d.ts +16 -16
  723. package/dist/workflows/v3/contract.d.ts.map +1 -1
  724. package/dist/workflows/v3/contract.js +15 -11
  725. package/dist/workflows/v3/contract.js.map +1 -1
  726. package/dist/workflows/v3/daemon-ipc-auth.d.ts +113 -0
  727. package/dist/workflows/v3/daemon-ipc-auth.d.ts.map +1 -0
  728. package/dist/workflows/v3/daemon-ipc-auth.js +294 -0
  729. package/dist/workflows/v3/daemon-ipc-auth.js.map +1 -0
  730. package/dist/workflows/v3/daemon-ipc-body.d.ts +30 -0
  731. package/dist/workflows/v3/daemon-ipc-body.d.ts.map +1 -0
  732. package/dist/workflows/v3/daemon-ipc-body.js +65 -0
  733. package/dist/workflows/v3/daemon-ipc-body.js.map +1 -0
  734. package/dist/workflows/v3/daemon-ipc-client.d.ts +32 -0
  735. package/dist/workflows/v3/daemon-ipc-client.d.ts.map +1 -0
  736. package/dist/workflows/v3/daemon-ipc-client.js +74 -0
  737. package/dist/workflows/v3/daemon-ipc-client.js.map +1 -0
  738. package/dist/workflows/v3/daemon-run.d.ts +87 -2
  739. package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
  740. package/dist/workflows/v3/daemon-run.js +863 -68
  741. package/dist/workflows/v3/daemon-run.js.map +1 -1
  742. package/dist/workflows/v3/dag.d.ts +22 -8
  743. package/dist/workflows/v3/dag.d.ts.map +1 -1
  744. package/dist/workflows/v3/dag.js +214 -22
  745. package/dist/workflows/v3/dag.js.map +1 -1
  746. package/dist/workflows/v3/distillation-compiler.d.ts +36 -0
  747. package/dist/workflows/v3/distillation-compiler.d.ts.map +1 -0
  748. package/dist/workflows/v3/distillation-compiler.js +704 -0
  749. package/dist/workflows/v3/distillation-compiler.js.map +1 -0
  750. package/dist/workflows/v3/distillation-private-root.d.ts +10 -0
  751. package/dist/workflows/v3/distillation-private-root.d.ts.map +1 -0
  752. package/dist/workflows/v3/distillation-private-root.js +34 -0
  753. package/dist/workflows/v3/distillation-private-root.js.map +1 -0
  754. package/dist/workflows/v3/distillation-runner.d.ts +64 -0
  755. package/dist/workflows/v3/distillation-runner.d.ts.map +1 -0
  756. package/dist/workflows/v3/distillation-runner.js +1028 -0
  757. package/dist/workflows/v3/distillation-runner.js.map +1 -0
  758. package/dist/workflows/v3/distillation-schema.d.ts +63 -0
  759. package/dist/workflows/v3/distillation-schema.d.ts.map +1 -0
  760. package/dist/workflows/v3/distillation-schema.js +184 -0
  761. package/dist/workflows/v3/distillation-schema.js.map +1 -0
  762. package/dist/workflows/v3/distillation-service.d.ts +78 -0
  763. package/dist/workflows/v3/distillation-service.d.ts.map +1 -0
  764. package/dist/workflows/v3/distillation-service.js +416 -0
  765. package/dist/workflows/v3/distillation-service.js.map +1 -0
  766. package/dist/workflows/v3/distillation-source.d.ts +35 -0
  767. package/dist/workflows/v3/distillation-source.d.ts.map +1 -0
  768. package/dist/workflows/v3/distillation-source.js +118 -0
  769. package/dist/workflows/v3/distillation-source.js.map +1 -0
  770. package/dist/workflows/v3/distillation-store.d.ts +185 -0
  771. package/dist/workflows/v3/distillation-store.d.ts.map +1 -0
  772. package/dist/workflows/v3/distillation-store.js +1127 -0
  773. package/dist/workflows/v3/distillation-store.js.map +1 -0
  774. package/dist/workflows/v3/drive-lease.d.ts +7 -0
  775. package/dist/workflows/v3/drive-lease.d.ts.map +1 -0
  776. package/dist/workflows/v3/drive-lease.js +10 -0
  777. package/dist/workflows/v3/drive-lease.js.map +1 -0
  778. package/dist/workflows/v3/ephemeral-pool.d.ts +1 -1
  779. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
  780. package/dist/workflows/v3/ephemeral-pool.js +222 -37
  781. package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
  782. package/dist/workflows/v3/grill-state.d.ts +18 -3
  783. package/dist/workflows/v3/grill-state.d.ts.map +1 -1
  784. package/dist/workflows/v3/grill-state.js +22 -5
  785. package/dist/workflows/v3/grill-state.js.map +1 -1
  786. package/dist/workflows/v3/host-bindings.d.ts +40 -0
  787. package/dist/workflows/v3/host-bindings.d.ts.map +1 -0
  788. package/dist/workflows/v3/host-bindings.js +272 -0
  789. package/dist/workflows/v3/host-bindings.js.map +1 -0
  790. package/dist/workflows/v3/host-effect-ledger.d.ts +22 -0
  791. package/dist/workflows/v3/host-effect-ledger.d.ts.map +1 -0
  792. package/dist/workflows/v3/host-effect-ledger.js +110 -0
  793. package/dist/workflows/v3/host-effect-ledger.js.map +1 -0
  794. package/dist/workflows/v3/host-execution.d.ts +142 -0
  795. package/dist/workflows/v3/host-execution.d.ts.map +1 -0
  796. package/dist/workflows/v3/host-execution.js +424 -0
  797. package/dist/workflows/v3/host-execution.js.map +1 -0
  798. package/dist/workflows/v3/host.d.ts +46 -10
  799. package/dist/workflows/v3/host.d.ts.map +1 -1
  800. package/dist/workflows/v3/host.js +419 -140
  801. package/dist/workflows/v3/host.js.map +1 -1
  802. package/dist/workflows/v3/human-gate.d.ts +19 -1
  803. package/dist/workflows/v3/human-gate.d.ts.map +1 -1
  804. package/dist/workflows/v3/human-gate.js +145 -19
  805. package/dist/workflows/v3/human-gate.js.map +1 -1
  806. package/dist/workflows/v3/journal.d.ts +125 -7
  807. package/dist/workflows/v3/journal.d.ts.map +1 -1
  808. package/dist/workflows/v3/journal.js +154 -38
  809. package/dist/workflows/v3/journal.js.map +1 -1
  810. package/dist/workflows/v3/library-materialize.d.ts +88 -0
  811. package/dist/workflows/v3/library-materialize.d.ts.map +1 -0
  812. package/dist/workflows/v3/library-materialize.js +294 -0
  813. package/dist/workflows/v3/library-materialize.js.map +1 -0
  814. package/dist/workflows/v3/library-schema.d.ts +138 -0
  815. package/dist/workflows/v3/library-schema.d.ts.map +1 -0
  816. package/dist/workflows/v3/library-schema.js +573 -0
  817. package/dist/workflows/v3/library-schema.js.map +1 -0
  818. package/dist/workflows/v3/library-service.d.ts +126 -0
  819. package/dist/workflows/v3/library-service.d.ts.map +1 -0
  820. package/dist/workflows/v3/library-service.js +542 -0
  821. package/dist/workflows/v3/library-service.js.map +1 -0
  822. package/dist/workflows/v3/library-store.d.ts +124 -0
  823. package/dist/workflows/v3/library-store.d.ts.map +1 -0
  824. package/dist/workflows/v3/library-store.js +665 -0
  825. package/dist/workflows/v3/library-store.js.map +1 -0
  826. package/dist/workflows/v3/orchestrator.d.ts +9 -1
  827. package/dist/workflows/v3/orchestrator.d.ts.map +1 -1
  828. package/dist/workflows/v3/orchestrator.js +2 -1
  829. package/dist/workflows/v3/orchestrator.js.map +1 -1
  830. package/dist/workflows/v3/progress-projection.d.ts +99 -0
  831. package/dist/workflows/v3/progress-projection.d.ts.map +1 -0
  832. package/dist/workflows/v3/progress-projection.js +197 -0
  833. package/dist/workflows/v3/progress-projection.js.map +1 -0
  834. package/dist/workflows/v3/run-envelope.d.ts +1279 -0
  835. package/dist/workflows/v3/run-envelope.d.ts.map +1 -0
  836. package/dist/workflows/v3/run-envelope.js +681 -0
  837. package/dist/workflows/v3/run-envelope.js.map +1 -0
  838. package/dist/workflows/v3/runtime.d.ts +39 -7
  839. package/dist/workflows/v3/runtime.d.ts.map +1 -1
  840. package/dist/workflows/v3/runtime.js +1992 -100
  841. package/dist/workflows/v3/runtime.js.map +1 -1
  842. package/dist/workflows/v3/session-relay-client.d.ts +61 -0
  843. package/dist/workflows/v3/session-relay-client.d.ts.map +1 -0
  844. package/dist/workflows/v3/session-relay-client.js +92 -0
  845. package/dist/workflows/v3/session-relay-client.js.map +1 -0
  846. package/dist/workflows/v3/session-relay.d.ts +66 -0
  847. package/dist/workflows/v3/session-relay.d.ts.map +1 -0
  848. package/dist/workflows/v3/session-relay.js +157 -0
  849. package/dist/workflows/v3/session-relay.js.map +1 -0
  850. package/dist/workflows/v3/start-intent.d.ts +8 -0
  851. package/dist/workflows/v3/start-intent.d.ts.map +1 -0
  852. package/dist/workflows/v3/start-intent.js +34 -0
  853. package/dist/workflows/v3/start-intent.js.map +1 -0
  854. package/dist/workflows/v3/state.d.ts +11 -2
  855. package/dist/workflows/v3/state.d.ts.map +1 -1
  856. package/dist/workflows/v3/state.js +182 -10
  857. package/dist/workflows/v3/state.js.map +1 -1
  858. package/dist/workflows/v3/template-bindings.d.ts +22 -0
  859. package/dist/workflows/v3/template-bindings.d.ts.map +1 -0
  860. package/dist/workflows/v3/template-bindings.js +204 -0
  861. package/dist/workflows/v3/template-bindings.js.map +1 -0
  862. package/dist/workflows/v3/worker-fence.d.ts +158 -0
  863. package/dist/workflows/v3/worker-fence.d.ts.map +1 -0
  864. package/dist/workflows/v3/worker-fence.js +685 -0
  865. package/dist/workflows/v3/worker-fence.js.map +1 -0
  866. package/package.json +3 -2
  867. package/dist/core/dashboard-command/workflows.d.ts +0 -20
  868. package/dist/core/dashboard-command/workflows.d.ts.map +0 -1
  869. package/dist/core/dashboard-command/workflows.js +0 -45
  870. package/dist/core/dashboard-command/workflows.js.map +0 -1
  871. package/dist/dashboard/web/legacy-workflow-link.d.ts +0 -2
  872. package/dist/dashboard/web/legacy-workflow-link.d.ts.map +0 -1
  873. package/dist/dashboard/web/legacy-workflow-link.js +0 -12
  874. package/dist/dashboard/web/legacy-workflow-link.js.map +0 -1
  875. package/dist/dashboard/web/legacy-workflow-page.d.ts +0 -3
  876. package/dist/dashboard/web/legacy-workflow-page.d.ts.map +0 -1
  877. package/dist/dashboard/web/legacy-workflow-page.js +0 -717
  878. package/dist/dashboard/web/legacy-workflow-page.js.map +0 -1
  879. package/dist/dashboard/web/workflow-version-switch.d.ts +0 -8
  880. package/dist/dashboard/web/workflow-version-switch.d.ts.map +0 -1
  881. package/dist/dashboard/web/workflow-version-switch.js +0 -9
  882. package/dist/dashboard/web/workflow-version-switch.js.map +0 -1
  883. package/dist/dashboard/web/workflows.d.ts +0 -273
  884. package/dist/dashboard/web/workflows.d.ts.map +0 -1
  885. package/dist/dashboard/web/workflows.js +0 -436
  886. package/dist/dashboard/web/workflows.js.map +0 -1
  887. package/dist/dashboard/workflow-api.d.ts +0 -30
  888. package/dist/dashboard/workflow-api.d.ts.map +0 -1
  889. package/dist/dashboard/workflow-api.js +0 -397
  890. package/dist/dashboard/workflow-api.js.map +0 -1
  891. package/dist/dashboard/workflow-card-model.d.ts +0 -127
  892. package/dist/dashboard/workflow-card-model.d.ts.map +0 -1
  893. package/dist/dashboard/workflow-card-model.js +0 -186
  894. package/dist/dashboard/workflow-card-model.js.map +0 -1
  895. package/dist/dashboard/workflows-action-helpers.d.ts +0 -105
  896. package/dist/dashboard/workflows-action-helpers.d.ts.map +0 -1
  897. package/dist/dashboard/workflows-action-helpers.js +0 -196
  898. package/dist/dashboard/workflows-action-helpers.js.map +0 -1
  899. package/dist/dashboard-web/chunks/bot-defaults-page-7T7DPOV6.js +0 -4
  900. package/dist/dashboard-web/chunks/chunk-IGXYYRYJ.js +0 -1
  901. package/dist/dashboard-web/chunks/chunk-ISOD7VDX.js +0 -1
  902. package/dist/dashboard-web/chunks/chunk-PNK3HQBI.js +0 -37
  903. package/dist/dashboard-web/chunks/chunk-SRIE4MLQ.js +0 -1
  904. package/dist/dashboard-web/chunks/connectors-page-UQ4QBE45.js +0 -1
  905. package/dist/dashboard-web/chunks/legacy-workflow-page-QMC7OZXH.js +0 -2
  906. package/dist/dashboard-web/chunks/sessions-page-NNZIDHZM.js +0 -3
  907. package/dist/dashboard-web/chunks/settings-page-LJIXX5LQ.js +0 -2
  908. package/dist/dashboard-web/chunks/v3-page-YLYVHGKD.js +0 -94
  909. package/dist/dashboard-web/terminal-replay.html +0 -227
  910. package/dist/im/lark/workflow-card-handler.d.ts +0 -51
  911. package/dist/im/lark/workflow-card-handler.d.ts.map +0 -1
  912. package/dist/im/lark/workflow-card-handler.js +0 -163
  913. package/dist/im/lark/workflow-card-handler.js.map +0 -1
  914. package/dist/im/lark/workflow-cards.d.ts +0 -47
  915. package/dist/im/lark/workflow-cards.d.ts.map +0 -1
  916. package/dist/im/lark/workflow-cards.js +0 -231
  917. package/dist/im/lark/workflow-cards.js.map +0 -1
  918. package/dist/im/lark/workflow-progress-card.d.ts +0 -81
  919. package/dist/im/lark/workflow-progress-card.d.ts.map +0 -1
  920. package/dist/im/lark/workflow-progress-card.js +0 -336
  921. package/dist/im/lark/workflow-progress-card.js.map +0 -1
  922. package/dist/im/lark/workflows-card.d.ts +0 -102
  923. package/dist/im/lark/workflows-card.d.ts.map +0 -1
  924. package/dist/im/lark/workflows-card.js +0 -737
  925. package/dist/im/lark/workflows-card.js.map +0 -1
  926. package/dist/workflows/attempt-resume.d.ts +0 -119
  927. package/dist/workflows/attempt-resume.d.ts.map +0 -1
  928. package/dist/workflows/attempt-resume.js +0 -392
  929. package/dist/workflows/attempt-resume.js.map +0 -1
  930. package/dist/workflows/blob.d.ts +0 -27
  931. package/dist/workflows/blob.d.ts.map +0 -1
  932. package/dist/workflows/blob.js +0 -40
  933. package/dist/workflows/blob.js.map +0 -1
  934. package/dist/workflows/cancel-run.d.ts +0 -45
  935. package/dist/workflows/cancel-run.d.ts.map +0 -1
  936. package/dist/workflows/cancel-run.js +0 -99
  937. package/dist/workflows/cancel-run.js.map +0 -1
  938. package/dist/workflows/cancel.d.ts +0 -111
  939. package/dist/workflows/cancel.d.ts.map +0 -1
  940. package/dist/workflows/cancel.js +0 -120
  941. package/dist/workflows/cancel.js.map +0 -1
  942. package/dist/workflows/catalog.d.ts +0 -60
  943. package/dist/workflows/catalog.d.ts.map +0 -1
  944. package/dist/workflows/catalog.js +0 -119
  945. package/dist/workflows/catalog.js.map +0 -1
  946. package/dist/workflows/cold-attach.d.ts +0 -30
  947. package/dist/workflows/cold-attach.d.ts.map +0 -1
  948. package/dist/workflows/cold-attach.js +0 -40
  949. package/dist/workflows/cold-attach.js.map +0 -1
  950. package/dist/workflows/cold-scan.d.ts +0 -21
  951. package/dist/workflows/cold-scan.d.ts.map +0 -1
  952. package/dist/workflows/cold-scan.js +0 -70
  953. package/dist/workflows/cold-scan.js.map +0 -1
  954. package/dist/workflows/daemon-spawn.d.ts +0 -119
  955. package/dist/workflows/daemon-spawn.d.ts.map +0 -1
  956. package/dist/workflows/daemon-spawn.js +0 -564
  957. package/dist/workflows/daemon-spawn.js.map +0 -1
  958. package/dist/workflows/effect-input.d.ts +0 -4
  959. package/dist/workflows/effect-input.d.ts.map +0 -1
  960. package/dist/workflows/effect-input.js +0 -19
  961. package/dist/workflows/effect-input.js.map +0 -1
  962. package/dist/workflows/events/append.d.ts +0 -77
  963. package/dist/workflows/events/append.d.ts.map +0 -1
  964. package/dist/workflows/events/append.js +0 -214
  965. package/dist/workflows/events/append.js.map +0 -1
  966. package/dist/workflows/events/idempotency.d.ts +0 -77
  967. package/dist/workflows/events/idempotency.d.ts.map +0 -1
  968. package/dist/workflows/events/idempotency.js +0 -116
  969. package/dist/workflows/events/idempotency.js.map +0 -1
  970. package/dist/workflows/events/index.d.ts +0 -7
  971. package/dist/workflows/events/index.d.ts.map +0 -1
  972. package/dist/workflows/events/index.js +0 -7
  973. package/dist/workflows/events/index.js.map +0 -1
  974. package/dist/workflows/fanout.d.ts +0 -36
  975. package/dist/workflows/fanout.d.ts.map +0 -1
  976. package/dist/workflows/fanout.js +0 -115
  977. package/dist/workflows/fanout.js.map +0 -1
  978. package/dist/workflows/hostExecutors/protocol.d.ts +0 -42
  979. package/dist/workflows/hostExecutors/protocol.d.ts.map +0 -1
  980. package/dist/workflows/hostExecutors/protocol.js +0 -181
  981. package/dist/workflows/hostExecutors/protocol.js.map +0 -1
  982. package/dist/workflows/loader.d.ts +0 -30
  983. package/dist/workflows/loader.d.ts.map +0 -1
  984. package/dist/workflows/loader.js +0 -84
  985. package/dist/workflows/loader.js.map +0 -1
  986. package/dist/workflows/loop.d.ts +0 -50
  987. package/dist/workflows/loop.d.ts.map +0 -1
  988. package/dist/workflows/loop.js +0 -408
  989. package/dist/workflows/loop.js.map +0 -1
  990. package/dist/workflows/orchestrator.d.ts +0 -171
  991. package/dist/workflows/orchestrator.d.ts.map +0 -1
  992. package/dist/workflows/orchestrator.js +0 -609
  993. package/dist/workflows/orchestrator.js.map +0 -1
  994. package/dist/workflows/output-binding.d.ts +0 -77
  995. package/dist/workflows/output-binding.d.ts.map +0 -1
  996. package/dist/workflows/output-binding.js +0 -329
  997. package/dist/workflows/output-binding.js.map +0 -1
  998. package/dist/workflows/params.d.ts.map +0 -1
  999. package/dist/workflows/params.js.map +0 -1
  1000. package/dist/workflows/resume.d.ts +0 -263
  1001. package/dist/workflows/resume.d.ts.map +0 -1
  1002. package/dist/workflows/resume.js +0 -808
  1003. package/dist/workflows/resume.js.map +0 -1
  1004. package/dist/workflows/run-id.d.ts +0 -2
  1005. package/dist/workflows/run-id.d.ts.map +0 -1
  1006. package/dist/workflows/run-id.js +0 -7
  1007. package/dist/workflows/run-id.js.map +0 -1
  1008. package/dist/workflows/run-init.d.ts +0 -48
  1009. package/dist/workflows/run-init.d.ts.map +0 -1
  1010. package/dist/workflows/run-init.js +0 -100
  1011. package/dist/workflows/run-init.js.map +0 -1
  1012. package/dist/workflows/runs-dir.d.ts +0 -4
  1013. package/dist/workflows/runs-dir.d.ts.map +0 -1
  1014. package/dist/workflows/runs-dir.js +0 -15
  1015. package/dist/workflows/runs-dir.js.map +0 -1
  1016. package/dist/workflows/runtime.d.ts +0 -215
  1017. package/dist/workflows/runtime.d.ts.map +0 -1
  1018. package/dist/workflows/runtime.js +0 -630
  1019. package/dist/workflows/runtime.js.map +0 -1
  1020. package/dist/workflows/spawn-bot.d.ts +0 -165
  1021. package/dist/workflows/spawn-bot.d.ts.map +0 -1
  1022. package/dist/workflows/spawn-bot.js +0 -215
  1023. package/dist/workflows/spawn-bot.js.map +0 -1
  1024. package/dist/workflows/spawn-policy.d.ts.map +0 -1
  1025. package/dist/workflows/spawn-policy.js.map +0 -1
  1026. package/dist/workflows/system.d.ts +0 -49
  1027. package/dist/workflows/system.d.ts.map +0 -1
  1028. package/dist/workflows/system.js +0 -48
  1029. package/dist/workflows/system.js.map +0 -1
  1030. package/dist/workflows/trigger-from-envelope.d.ts +0 -13
  1031. package/dist/workflows/trigger-from-envelope.d.ts.map +0 -1
  1032. package/dist/workflows/trigger-from-envelope.js +0 -68
  1033. package/dist/workflows/trigger-from-envelope.js.map +0 -1
  1034. package/dist/workflows/trigger-run.d.ts +0 -70
  1035. package/dist/workflows/trigger-run.d.ts.map +0 -1
  1036. package/dist/workflows/trigger-run.js +0 -88
  1037. package/dist/workflows/trigger-run.js.map +0 -1
  1038. package/dist/workflows/wait.d.ts +0 -141
  1039. package/dist/workflows/wait.d.ts.map +0 -1
  1040. package/dist/workflows/wait.js +0 -203
  1041. package/dist/workflows/wait.js.map +0 -1
@@ -15,20 +15,31 @@
15
15
  * The daemon owns a lightweight per-runId in-flight guard around this so two
16
16
  * concurrent clicks / start can't double-spawn.
17
17
  */
18
- import { dirname, join } from 'node:path';
19
- import { existsSync, mkdirSync, readdirSync, renameSync, statSync, writeFileSync } from 'node:fs';
18
+ import { randomUUID } from 'node:crypto';
19
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
20
+ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync } from 'node:fs';
20
21
  import { loadBotConfigs } from '../../bot-registry.js';
21
- import { isLoopNode, loadDag } from './dag.js';
22
+ import { atomicWriteFileSync } from '../../utils/atomic-write.js';
23
+ import { withFileLock, withFileLockSync } from '../../utils/file-lock.js';
24
+ import { isHostNode, isLoopNode, loadDag } from './dag.js';
22
25
  import { runWorkflow, nextAttemptIdFor, latestAttemptIdFor, revisitBudgetStatus, } from './runtime.js';
23
26
  import { createEphemeralPool } from './ephemeral-pool.js';
24
27
  import { readAndValidateManifest, ManifestValidationError } from './manifest.js';
25
- import { readGrillState, defaultBaseDir, } from './grill-state.js';
26
- import { resolveBotConfig, botToSnapshot } from './bot-resolve.js';
27
- import { canResolveGateWait, normalizeGateWaitInput, readWait, resolveWait, selectedResolution, writePendingWait, } from './human-gate.js';
28
- import { readJournal, appendEvent } from './journal.js';
28
+ import { readGrillState, defaultBaseDir, GRILL_STATUS_FILE, } from './grill-state.js';
29
+ import { resolveBotConfig, botToSnapshot, freezeDagBotSnapshots, parseFrozenBotSnapshots, serializeFrozenBotSnapshots, } from './bot-resolve.js';
30
+ import { loadAuthorizedV3Run, artifactRef, makeLegacyV3RunEnvelope, publishRunEnvelopeOnce, readRunEnvelope, RunEnvelopeIntegrityError, } from './run-envelope.js';
31
+ import { canResolveGateWait, normalizeGateWaitInput, readWait, resolveWaitOnce, selectedResolution, v3GateWaitId, writePendingWait, } from './human-gate.js';
32
+ import { readJournal, appendEvent, withJournalMutationSync, } from './journal.js';
29
33
  import { materialize } from './state.js';
34
+ import { openV3WorkerAttempts } from './attempt-ledger.js';
35
+ import { openV3HostEffects } from './host-effect-ledger.js';
36
+ import { readAndVerifyV3PreparedHostInput } from './host-execution.js';
37
+ import { composeV3HostGatePrompt, renderV3HostInputPreview } from './host-bindings.js';
38
+ import { V3_DRIVE_LEASE_MAX_WAIT_MS, v3DriveLeaseTarget } from './drive-lease.js';
39
+ import { createDefaultHostExecutorRegistry, createDefaultProviderReconcilers, } from '../hostExecutors/registry.js';
30
40
  import { isValidRunId } from './ops-projection.js';
31
41
  import { GOAL_ANSWER_FILE } from './contract.js';
42
+ import { validateSpec } from './spec.js';
32
43
  /**
33
44
  * runId → runDir with a path-traversal guard (codex review #2). runIds reach
34
45
  * the daemon from outside (start IPC, card clicks) — never trust them into a
@@ -39,6 +50,477 @@ export function safeRunDir(baseDir, runId) {
39
50
  throw new Error(`v3: invalid runId "${runId}"`);
40
51
  return join(baseDir, runId);
41
52
  }
53
+ function parseResolvedWorkflowData(raw) {
54
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
55
+ throw new Error('params.resolved.json must be an object');
56
+ }
57
+ const root = raw;
58
+ const extra = Object.keys(root).filter((key) => key !== 'params' && key !== 'context');
59
+ if (extra.length > 0)
60
+ throw new Error(`params.resolved.json has unsupported key(s): ${extra.join(', ')}`);
61
+ if (!root.params || typeof root.params !== 'object' || Array.isArray(root.params)) {
62
+ throw new Error('params.resolved.json.params must be an object');
63
+ }
64
+ if (!root.context || typeof root.context !== 'object' || Array.isArray(root.context)) {
65
+ throw new Error('params.resolved.json.context must be an object');
66
+ }
67
+ const context = root.context;
68
+ if (Object.values(context).some((value) => typeof value !== 'string')) {
69
+ throw new Error('params.resolved.json.context values must be strings');
70
+ }
71
+ return {
72
+ params: { ...root.params },
73
+ context: { ...context },
74
+ };
75
+ }
76
+ function assertResolvedWorkflowContextMatchesBinding(data, binding) {
77
+ if (!binding) {
78
+ throw new Error('saved definition run must carry an authorized chatBinding');
79
+ }
80
+ const expected = {
81
+ chatId: binding.chatId,
82
+ larkAppId: binding.larkAppId,
83
+ chatType: binding.chatType,
84
+ rootMessageId: binding.rootMessageId,
85
+ initiatorOpenId: binding.ownerOpenId,
86
+ };
87
+ for (const [key, actual] of Object.entries(data.context)) {
88
+ if (!Object.prototype.hasOwnProperty.call(expected, key))
89
+ continue;
90
+ if (!expected[key] || expected[key] !== actual) {
91
+ throw new Error(`params.resolved.json context.${key} does not match run.json chatBinding`);
92
+ }
93
+ }
94
+ }
95
+ function parseSavedDefinitionWorkflowData(raw, binding) {
96
+ const data = parseResolvedWorkflowData(raw);
97
+ assertResolvedWorkflowContextMatchesBinding(data, binding);
98
+ return data;
99
+ }
100
+ function bindingWorkflowData(binding) {
101
+ if (!binding)
102
+ return undefined;
103
+ return {
104
+ params: {},
105
+ context: {
106
+ chatId: binding.chatId,
107
+ larkAppId: binding.larkAppId,
108
+ ...(binding.chatType ? { chatType: binding.chatType } : {}),
109
+ ...(binding.rootMessageId ? { rootMessageId: binding.rootMessageId } : {}),
110
+ ...(binding.ownerOpenId ? { initiatorOpenId: binding.ownerOpenId } : {}),
111
+ },
112
+ };
113
+ }
114
+ function mutationIntegrityError(detail) {
115
+ return new RunEnvelopeIntegrityError('envelope_invalid', `v3 run mutation authorization failed: ${detail}`);
116
+ }
117
+ function assertLegacyMutationIdentity(runDir) {
118
+ const expectedRunId = basename(runDir);
119
+ const journalPath = join(runDir, 'journal.ndjson');
120
+ const events = readJournal(journalPath);
121
+ const starts = events.filter((event) => event.type === 'runStarted');
122
+ if (starts.length !== 1 || starts[0].runId !== expectedRunId) {
123
+ const seen = starts.map((event) => event.runId).join(', ') || '(none)';
124
+ throw mutationIntegrityError(`legacy journal identity mismatch: directory=${expectedRunId}, runStarted=${seen}`);
125
+ }
126
+ const grillPath = join(runDir, GRILL_STATUS_FILE);
127
+ const grill = readGrillState(runDir);
128
+ if (existsSync(grillPath) && !grill) {
129
+ throw mutationIntegrityError('legacy grill state exists but is unreadable');
130
+ }
131
+ if (grill) {
132
+ if (grill.runId !== expectedRunId) {
133
+ throw mutationIntegrityError(`legacy grill identity mismatch: directory=${expectedRunId}, grill=${grill.runId}`);
134
+ }
135
+ if (grill.status !== 'dag_approved') {
136
+ throw mutationIntegrityError(`legacy grill is not Gate-2 approved (status=${grill.status})`);
137
+ }
138
+ }
139
+ const candidateDagPaths = new Set();
140
+ const canonicalDagPath = join(runDir, 'dag.json');
141
+ if (existsSync(canonicalDagPath))
142
+ candidateDagPaths.add(canonicalDagPath);
143
+ if (grill?.dagPath) {
144
+ const runRoot = resolve(runDir);
145
+ const approvedDagPath = resolve(grill.dagPath);
146
+ const rel = relative(runRoot, approvedDagPath);
147
+ if (rel === '' || isAbsolute(rel) || rel === '..' || rel.startsWith(`..${sep}`)) {
148
+ throw mutationIntegrityError('legacy approved DAG path must stay inside its run directory');
149
+ }
150
+ if (!existsSync(approvedDagPath)) {
151
+ throw mutationIntegrityError('legacy approved DAG is missing');
152
+ }
153
+ candidateDagPaths.add(approvedDagPath);
154
+ }
155
+ if (candidateDagPaths.size === 0) {
156
+ throw mutationIntegrityError('legacy run has no verifiable DAG');
157
+ }
158
+ for (const dagPath of candidateDagPaths) {
159
+ let dag;
160
+ try {
161
+ dag = loadDag(dagPath);
162
+ }
163
+ catch (err) {
164
+ throw mutationIntegrityError(`legacy DAG is invalid (${dagPath}): ${err instanceof Error ? err.message : String(err)}`);
165
+ }
166
+ if (dag.runId !== expectedRunId) {
167
+ throw mutationIntegrityError(`legacy DAG identity mismatch: directory=${expectedRunId}, dag=${dag.runId}`);
168
+ }
169
+ }
170
+ }
171
+ /**
172
+ * Mutation authorization boundary for card/CLI recovery actions.
173
+ *
174
+ * Envelope-backed runs re-verify every pinned artifact immediately before a
175
+ * wait file or journal can change. Only a genuinely missing run.json may use
176
+ * the one-release legacy path, which still requires directory, journal, grill,
177
+ * and DAG identities to agree. An existing invalid/tampered envelope never
178
+ * falls back to legacy state.
179
+ */
180
+ export function assertV3RunIntegrityForMutation(runDir) {
181
+ const expectedRunId = basename(runDir);
182
+ const envelope = readRunEnvelope(runDir, expectedRunId);
183
+ if (envelope.kind === 'invalid') {
184
+ throw mutationIntegrityError(envelope.problems.join('; '));
185
+ }
186
+ if (envelope.kind === 'missing') {
187
+ assertLegacyMutationIdentity(runDir);
188
+ return;
189
+ }
190
+ const loaded = loadAuthorizedV3Run(runDir, { expectedRunId });
191
+ if (loaded.botSnapshots !== undefined) {
192
+ parseFrozenBotSnapshots(loaded.botSnapshots, loaded.dag);
193
+ }
194
+ if (loaded.envelope.source.kind === 'saved_definition') {
195
+ parseSavedDefinitionWorkflowData(loaded.resolvedParams, loaded.envelope.chatBinding);
196
+ }
197
+ }
198
+ function assertPathInsideRunDir(runDir, path, label) {
199
+ const runRoot = resolve(runDir);
200
+ const candidate = resolve(path);
201
+ const rel = relative(runRoot, candidate);
202
+ if (rel === '' || isAbsolute(rel) || rel === '..' || rel.startsWith(`..${sep}`)) {
203
+ throw new Error(`${label} must stay inside its run directory`);
204
+ }
205
+ return candidate;
206
+ }
207
+ function loadLegacyDagForStart(runDir, grill) {
208
+ const expectedRunId = basename(runDir);
209
+ if (grill.runId !== expectedRunId) {
210
+ throw new Error(`legacy run identity mismatch: directory=${expectedRunId}, grill=${grill.runId}`);
211
+ }
212
+ const approvedDagPath = assertPathInsideRunDir(runDir, grill.dagPath, 'legacy approved DAG path');
213
+ if (!existsSync(approvedDagPath))
214
+ throw new Error('legacy approved DAG is missing');
215
+ const journalPath = join(runDir, 'journal.ndjson');
216
+ const events = readJournal(journalPath);
217
+ if (events.length > 0) {
218
+ const starts = events.filter((event) => event.type === 'runStarted');
219
+ if (starts.length !== 1 || starts[0].runId !== expectedRunId) {
220
+ throw new Error(`legacy journal identity mismatch: directory=${expectedRunId}, ` +
221
+ `runStarted=${starts.map((event) => event.runId).join(', ') || '(none)'}`);
222
+ }
223
+ }
224
+ // Once runtime has created the canonical root DAG, it is execution truth.
225
+ // Before first dispatch the approved grill DAG is the only available source.
226
+ const canonicalDagPath = join(runDir, 'dag.json');
227
+ const dag = loadDag(existsSync(canonicalDagPath) ? canonicalDagPath : approvedDagPath);
228
+ if (dag.runId !== expectedRunId) {
229
+ throw new Error(`legacy DAG identity mismatch: directory=${expectedRunId}, dag=${dag.runId}`);
230
+ }
231
+ return dag;
232
+ }
233
+ /**
234
+ * Gate-2 authorization seam shared by the daemon IPC and the actual driver.
235
+ * Checking only `dagPath` is insufficient: architect writes that path while
236
+ * the run is still `dag_ready`, before the user has approved the DAG.
237
+ */
238
+ export function preflightV3RunStart(runDir) {
239
+ const envelopeRead = readRunEnvelope(runDir);
240
+ if (envelopeRead.kind === 'invalid') {
241
+ return {
242
+ ok: false,
243
+ error: 'run_envelope_invalid',
244
+ detail: envelopeRead.problems.join('; '),
245
+ };
246
+ }
247
+ if (envelopeRead.kind === 'ok') {
248
+ if (envelopeRead.envelope.source.kind === 'manual_cli') {
249
+ return {
250
+ ok: false,
251
+ error: 'run_source_not_daemon_startable',
252
+ detail: 'manual_cli runs are local-only',
253
+ };
254
+ }
255
+ try {
256
+ const loaded = loadAuthorizedV3Run(runDir, {
257
+ allowedSources: ['ad_hoc', 'saved_definition', 'legacy_v3'],
258
+ });
259
+ const botSnapshots = loaded.botSnapshots === undefined
260
+ ? undefined
261
+ : parseFrozenBotSnapshots(loaded.botSnapshots, loaded.dag);
262
+ const resolvedWorkflowData = loaded.envelope.source.kind === 'saved_definition'
263
+ ? parseSavedDefinitionWorkflowData(loaded.resolvedParams, loaded.envelope.chatBinding)
264
+ : bindingWorkflowData(loaded.envelope.chatBinding);
265
+ return {
266
+ ok: true,
267
+ context: {
268
+ dag: loaded.dag,
269
+ binding: loaded.envelope.chatBinding,
270
+ ...(botSnapshots ? { botSnapshots } : {}),
271
+ ...(resolvedWorkflowData ? { resolvedWorkflowData } : {}),
272
+ envelope: loaded.envelope,
273
+ authorizedArtifacts: true,
274
+ },
275
+ };
276
+ }
277
+ catch (err) {
278
+ return {
279
+ ok: false,
280
+ error: 'run_envelope_invalid',
281
+ detail: err instanceof Error ? err.message : String(err),
282
+ };
283
+ }
284
+ }
285
+ // One-version compatibility: a run created before run.json existed may still
286
+ // start from the old Gate-2 grill marker. Existing-but-corrupt envelopes
287
+ // never reach this fallback.
288
+ const grill = readGrillState(runDir);
289
+ if (!grill)
290
+ return { ok: false, error: 'no_grill_state' };
291
+ if (grill.status !== 'dag_approved') {
292
+ return { ok: false, error: 'dag_not_approved', status: grill.status };
293
+ }
294
+ if (!grill.dagPath) {
295
+ return { ok: false, error: 'approved_dag_missing', status: grill.status };
296
+ }
297
+ try {
298
+ const approvedGrill = grill;
299
+ const dag = loadLegacyDagForStart(runDir, approvedGrill);
300
+ return {
301
+ ok: true,
302
+ grill: approvedGrill,
303
+ context: {
304
+ dag,
305
+ binding: grill.chatBinding,
306
+ ...(bindingWorkflowData(grill.chatBinding)
307
+ ? { resolvedWorkflowData: bindingWorkflowData(grill.chatBinding) }
308
+ : {}),
309
+ authorizedArtifacts: false,
310
+ },
311
+ };
312
+ }
313
+ catch (err) {
314
+ if (err instanceof Error && err.message === 'legacy approved DAG is missing') {
315
+ return {
316
+ ok: false,
317
+ error: 'approved_dag_missing',
318
+ status: grill.status,
319
+ };
320
+ }
321
+ return {
322
+ ok: false,
323
+ error: 'approved_dag_invalid',
324
+ status: grill.status,
325
+ detail: err instanceof Error ? err.message : String(err),
326
+ };
327
+ }
328
+ }
329
+ /**
330
+ * Seal a pre-run.json grill run immediately before its first worker dispatch.
331
+ * Legacy Gate-2 bytes were never digest-pinned, so the envelope is honest
332
+ * about that historical limitation; from this point onward the canonical DAG
333
+ * and bot identities are immutable and every retry/resume verifies them.
334
+ */
335
+ function sealLegacyV3Run(runDir, grill, preflightDag, bots) {
336
+ return withFileLockSync(join(runDir, 'run.json'), () => {
337
+ const current = readRunEnvelope(runDir);
338
+ if (current.kind === 'invalid') {
339
+ throw new Error(`legacy run envelope is invalid: ${current.problems.join('; ')}`);
340
+ }
341
+ if (current.kind === 'ok') {
342
+ if (current.envelope.source.kind === 'manual_cli') {
343
+ throw new Error('manual_cli runs are local-only');
344
+ }
345
+ const loaded = loadAuthorizedV3Run(runDir, {
346
+ allowedSources: ['ad_hoc', 'saved_definition', 'legacy_v3'],
347
+ });
348
+ const botSnapshots = loaded.botSnapshots === undefined
349
+ ? undefined
350
+ : parseFrozenBotSnapshots(loaded.botSnapshots, loaded.dag);
351
+ const resolvedWorkflowData = loaded.envelope.source.kind === 'saved_definition'
352
+ ? parseSavedDefinitionWorkflowData(loaded.resolvedParams, loaded.envelope.chatBinding)
353
+ : bindingWorkflowData(loaded.envelope.chatBinding);
354
+ return {
355
+ dag: loaded.dag,
356
+ binding: loaded.envelope.chatBinding,
357
+ ...(botSnapshots ? { botSnapshots } : {}),
358
+ ...(resolvedWorkflowData ? { resolvedWorkflowData } : {}),
359
+ envelope: loaded.envelope,
360
+ authorizedArtifacts: true,
361
+ };
362
+ }
363
+ const runId = basename(runDir);
364
+ if (grill.runId !== runId || preflightDag.runId !== runId) {
365
+ throw new Error(`legacy run identity changed before sealing: directory=${runId}, ` +
366
+ `grill=${grill.runId}, dag=${preflightDag.runId}`);
367
+ }
368
+ const canonicalDagPath = join(runDir, 'dag.json');
369
+ if (existsSync(canonicalDagPath)) {
370
+ const canonicalDag = loadDag(canonicalDagPath);
371
+ if (JSON.stringify(canonicalDag) !== JSON.stringify(preflightDag)) {
372
+ throw new Error('legacy canonical DAG changed between preflight and sealing');
373
+ }
374
+ }
375
+ else {
376
+ atomicWriteFileSync(canonicalDagPath, `${JSON.stringify(preflightDag, null, 2)}\n`, { mode: 0o600 });
377
+ }
378
+ const dag = loadDag(canonicalDagPath);
379
+ const botPath = join(runDir, 'bots.snapshot.json');
380
+ let botSnapshots;
381
+ if (existsSync(botPath)) {
382
+ const raw = JSON.parse(readFileSync(botPath, 'utf-8'));
383
+ botSnapshots = parseFrozenBotSnapshots(raw, dag);
384
+ }
385
+ else {
386
+ botSnapshots = freezeDagBotSnapshots(dag, bots);
387
+ atomicWriteFileSync(botPath, `${JSON.stringify(serializeFrozenBotSnapshots(botSnapshots), null, 2)}\n`, { mode: 0o600 });
388
+ }
389
+ const artifacts = {
390
+ dag: artifactRef(runDir, 'dag.json'),
391
+ botSnapshots: artifactRef(runDir, 'bots.snapshot.json'),
392
+ };
393
+ const specPath = join(runDir, 'spec.json');
394
+ if (existsSync(specPath)) {
395
+ try {
396
+ const spec = validateSpec(JSON.parse(readFileSync(specPath, 'utf-8')));
397
+ if (spec.runId === runId)
398
+ artifacts.spec = artifactRef(runDir, 'spec.json');
399
+ }
400
+ catch {
401
+ // Historical specs were optional and not execution inputs. Omit an
402
+ // unverifiable/corrupt one rather than blessing it into the envelope.
403
+ }
404
+ }
405
+ const journalEvents = readJournal(join(runDir, 'journal.ndjson'));
406
+ const legacyEnvelope = makeLegacyV3RunEnvelope({
407
+ runId,
408
+ createdAt: grill.createdAt,
409
+ backfilledAt: new Date().toISOString(),
410
+ original: 'grill',
411
+ basis: journalEvents.length > 0 ? 'runtime_started' : 'grill_dag_approved',
412
+ ...(grill.chatBinding ? { chatBinding: grill.chatBinding } : {}),
413
+ artifacts,
414
+ });
415
+ publishRunEnvelopeOnce(runDir, legacyEnvelope);
416
+ const loaded = loadAuthorizedV3Run(runDir, { allowedSources: ['legacy_v3'] });
417
+ return {
418
+ dag: loaded.dag,
419
+ binding: loaded.envelope.chatBinding,
420
+ botSnapshots: parseFrozenBotSnapshots(loaded.botSnapshots, loaded.dag),
421
+ ...(bindingWorkflowData(loaded.envelope.chatBinding)
422
+ ? { resolvedWorkflowData: bindingWorkflowData(loaded.envelope.chatBinding) }
423
+ : {}),
424
+ envelope: loaded.envelope,
425
+ authorizedArtifacts: true,
426
+ };
427
+ });
428
+ }
429
+ /** Envelope-first binding lookup shared by daemon routes, card handlers, and
430
+ * cold attach. Corrupt run.json fails closed; only a genuinely missing
431
+ * envelope may use the one-version grill fallback. */
432
+ export function readV3RunChatBinding(runDir) {
433
+ const envelope = readRunEnvelope(runDir);
434
+ if (envelope.kind === 'ok')
435
+ return envelope.envelope.chatBinding;
436
+ if (envelope.kind === 'invalid')
437
+ return undefined;
438
+ return readGrillState(runDir)?.chatBinding;
439
+ }
440
+ /** Verified DAG for recovery/display logic, with the same missing-only legacy
441
+ * fallback as the start path. */
442
+ export function loadV3RunDagForRecovery(runDir) {
443
+ const envelope = readRunEnvelope(runDir);
444
+ if (envelope.kind === 'ok') {
445
+ try {
446
+ return loadAuthorizedV3Run(runDir).dag;
447
+ }
448
+ catch {
449
+ return undefined;
450
+ }
451
+ }
452
+ if (envelope.kind === 'invalid')
453
+ return undefined;
454
+ const grill = readGrillState(runDir);
455
+ if (!grill?.dagPath || !existsSync(grill.dagPath))
456
+ return undefined;
457
+ try {
458
+ return loadDag(grill.dagPath);
459
+ }
460
+ catch {
461
+ return undefined;
462
+ }
463
+ }
464
+ /** Rebuild the host approval UI from authorized DAG + durable prepared bytes.
465
+ * waits/*.json is mutable delivery state and is never trusted as the approval
466
+ * object by itself. */
467
+ function trustedHostGateMaterial(runDir, runId, nodeId, instanceId, events) {
468
+ const dag = loadV3RunDagForRecovery(runDir);
469
+ const node = dag?.nodes.find((candidate) => candidate.id === nodeId);
470
+ if (!node || !isHostNode(node) || !node.humanGate)
471
+ return undefined;
472
+ const dispatched = [...events].reverse().find((event) => event.type === 'gateDispatched' &&
473
+ event.nodeId === nodeId &&
474
+ event.instanceId === instanceId &&
475
+ !!event.hostApproval);
476
+ if (!dispatched?.hostApproval)
477
+ return undefined;
478
+ const prepared = [...events].reverse().find((event) => event.type === 'hostInputPrepared' &&
479
+ event.nodeId === nodeId &&
480
+ event.instanceId === instanceId &&
481
+ event.attemptId === dispatched.hostApproval.attemptId);
482
+ const registered = createDefaultHostExecutorRegistry().get(node.executor);
483
+ if (!prepared || !registered)
484
+ return undefined;
485
+ if (prepared.approvalDigest !== dispatched.hostApproval.approvalDigest ||
486
+ prepared.inputHash !== dispatched.hostApproval.inputHash)
487
+ return undefined;
488
+ try {
489
+ const artifact = readAndVerifyV3PreparedHostInput({
490
+ runDir,
491
+ inputRef: prepared.inputRef,
492
+ expected: { ...prepared, runId },
493
+ registered,
494
+ });
495
+ const authored = normalizeGateWaitInput(node.humanGate);
496
+ const hostApproval = {
497
+ attemptId: prepared.attemptId,
498
+ approvalDigest: prepared.approvalDigest,
499
+ inputHash: prepared.inputHash,
500
+ };
501
+ return {
502
+ nodeId,
503
+ instanceId,
504
+ waitId: v3GateWaitId(nodeId, instanceId, hostApproval),
505
+ ...authored,
506
+ prompt: composeV3HostGatePrompt(authored.prompt, renderV3HostInputPreview(node.executor, artifact.prepared.parsedInput, prepared.inputHash)),
507
+ hostApproval,
508
+ };
509
+ }
510
+ catch {
511
+ return undefined;
512
+ }
513
+ }
514
+ function waitMatchesTrustedHostGate(wait, trusted) {
515
+ return wait.waitId === trusted.waitId &&
516
+ wait.nodeId === trusted.nodeId &&
517
+ wait.instanceId === trusted.instanceId &&
518
+ wait.prompt === trusted.prompt &&
519
+ JSON.stringify(wait.options) === JSON.stringify(trusted.options) &&
520
+ JSON.stringify(wait.approveOptions) === JSON.stringify(trusted.approveOptions) &&
521
+ JSON.stringify(wait.approvers) === JSON.stringify(trusted.approvers) &&
522
+ JSON.stringify(wait.hostApproval) === JSON.stringify(trusted.hostApproval);
523
+ }
42
524
  /** Latest `nodeBlocked` details for a node (card content). Falls back to a
43
525
  * bare nodeId/attempt when the journal has no blocked event (shouldn't
44
526
  * happen for a blocked run, but the card must still render). */
@@ -56,6 +538,16 @@ export function blockedInfoFor(events, nodeId) {
56
538
  ...(e.revisitTo ? { revisitTo: e.revisitTo } : {}),
57
539
  };
58
540
  }
541
+ else if (e.type === 'hostEffectUncertain' && e.nodeId === nodeId) {
542
+ found = {
543
+ nodeId,
544
+ attemptId: e.attemptId,
545
+ errorClass: 'workerError',
546
+ errorCode: e.errorCode,
547
+ message: '外部操作的最终状态无法确认,请先在目标系统完成对账;为避免重复副作用,普通重试已禁用。',
548
+ retryForbidden: 'host-effect-uncertain',
549
+ };
550
+ }
59
551
  }
60
552
  return found ?? { nodeId, attemptId: latestAttemptIdFor(events, nodeId) ?? `${nodeId}/attempts/001` };
61
553
  }
@@ -92,21 +584,34 @@ export function loopExhaustedInfoFor(events, loopId) {
92
584
  export async function driveV3Run(runId, deps) {
93
585
  const baseDir = deps.baseDir ?? defaultBaseDir();
94
586
  const runDir = safeRunDir(baseDir, runId);
95
- const grill = readGrillState(runDir);
96
- if (!grill)
587
+ const preflight = preflightV3RunStart(runDir);
588
+ if (!preflight.ok && preflight.error === 'no_grill_state') {
97
589
  throw new Error(`v3 daemon run: no grill state for "${runId}" in ${runDir}`);
98
- if (!grill.dagPath || !existsSync(grill.dagPath)) {
99
- throw new Error(`v3 daemon run: "${runId}" has no approved dag (status=${grill.status})`);
100
590
  }
101
- const binding = grill.chatBinding;
591
+ if (!preflight.ok) {
592
+ if (preflight.error === 'run_envelope_invalid' ||
593
+ preflight.error === 'run_source_not_daemon_startable') {
594
+ throw new Error(`v3 daemon run: "${runId}" authorization failed (${preflight.error})` +
595
+ (preflight.detail ? `: ${preflight.detail}` : ''));
596
+ }
597
+ throw new Error(`v3 daemon run: "${runId}" has no approved dag (status=${preflight.status ?? 'unknown'})`);
598
+ }
599
+ let context = preflight.context;
102
600
  // Was the run ALREADY terminal before this (re-)drive? A coalesced re-drive or
103
601
  // a `/start` retry of a finished run re-runs no work (the journal is terminal),
104
602
  // but the notify block below would otherwise re-post cards / re-fire onTerminal
105
603
  // — duplicate "done/failed" messages. Capture now, short-circuit after runWorkflow.
106
604
  const journalPath = join(runDir, 'journal.ndjson');
107
605
  const wasAlreadyTerminal = existsSync(journalPath) &&
108
- ['succeeded', 'failed'].includes(materialize(readJournal(journalPath)).runStatus);
606
+ ['succeeded', 'failed', 'cancelled'].includes(materialize(readJournal(journalPath)).runStatus);
109
607
  const bots = (deps.loadBots ?? loadBotConfigs)();
608
+ if (!context.authorizedArtifacts) {
609
+ if (!preflight.grill) {
610
+ throw new Error(`v3 daemon run: legacy run "${runId}" has no approved grill basis`);
611
+ }
612
+ context = sealLegacyV3Run(runDir, preflight.grill, context.dag, bots);
613
+ }
614
+ const binding = context.binding;
110
615
  // Secret resolver by larkAppId from live bots.json; no env fallback (contract).
111
616
  const secretById = new Map(bots.map((b) => [b.larkAppId, b.larkAppSecret]));
112
617
  const resolveLarkAppSecret = (larkAppId) => secretById.get(larkAppId);
@@ -122,13 +627,23 @@ export async function driveV3Run(runId, deps) {
122
627
  });
123
628
  const resolveBotSnapshot = (botId) => botToSnapshot(resolveBotConfig(botId, bots));
124
629
  const runNode = (deps.makeRunNode ?? defaultMakeRunNode)(resolveLarkAppSecret);
125
- const dag = loadDag(grill.dagPath);
630
+ const dag = context.dag;
126
631
  // suspend mode → no resolveGate (runtime writes the wait + returns awaitingGate).
127
- const runtimeDeps = { runNode, validateManifest, resolveBotSnapshot };
632
+ const runtimeDeps = {
633
+ runNode,
634
+ validateManifest,
635
+ resolveBotSnapshot,
636
+ hostExecutors: createDefaultHostExecutorRegistry(),
637
+ hostReconcilers: createDefaultProviderReconcilers(),
638
+ };
128
639
  const opts = {
129
640
  baseDir,
130
641
  gateMode: 'suspend',
642
+ ...(context.botSnapshots ? { frozenBotSnapshots: context.botSnapshots } : {}),
643
+ ...(context.authorizedArtifacts ? { authorizedArtifacts: true } : {}),
644
+ ...(context.resolvedWorkflowData ? { resolvedWorkflowData: context.resolvedWorkflowData } : {}),
131
645
  ...(deps.maxParallel ? { globalConcurrency: deps.maxParallel } : {}),
646
+ ...(deps.cancelSignal ? { cancelSignal: deps.cancelSignal } : {}),
132
647
  };
133
648
  const outcome = await runWorkflow(dag, runtimeDeps, opts);
134
649
  if (wasAlreadyTerminal) {
@@ -202,6 +717,7 @@ export function resolveV3GateClick(baseDir, runId, input) {
202
717
  const journalPath = join(runDir, 'journal.ndjson');
203
718
  if (!existsSync(journalPath))
204
719
  return { kind: 'stale-run', reason: 'missing' };
720
+ assertV3RunIntegrityForMutation(runDir);
205
721
  const snap = materialize(readJournal(journalPath));
206
722
  if (snap.runStatus !== 'running')
207
723
  return { kind: 'stale-run', reason: 'terminal' };
@@ -219,27 +735,98 @@ export function resolveV3GateClick(baseDir, runId, input) {
219
735
  if (wait.instanceId && wait.instanceId !== snap.nodes.get(wait.nodeId)?.effectiveInstanceId) {
220
736
  return { kind: 'stale-run', reason: 'stale-node' };
221
737
  }
738
+ const dagNode = loadV3RunDagForRecovery(runDir)?.nodes.find((node) => node.id === wait.nodeId);
739
+ const trustedHost = dagNode && isHostNode(dagNode) && wait.instanceId
740
+ ? trustedHostGateMaterial(runDir, runId, wait.nodeId, wait.instanceId, readJournal(journalPath))
741
+ : undefined;
742
+ if (dagNode && isHostNode(dagNode)) {
743
+ if (!trustedHost || !waitMatchesTrustedHostGate(wait, trustedHost)) {
744
+ return { kind: 'stale-run', reason: 'no-wait' };
745
+ }
746
+ }
222
747
  if (!canResolveGateWait(wait, input.by))
223
748
  return { kind: 'unauthorized' };
224
749
  const resolution = selectedResolution(wait, input.selected);
225
750
  if (!resolution)
226
751
  return { kind: 'stale-run', reason: 'no-wait' };
227
- resolveWait(runDir, input.waitId, resolution, input.by, input.selected);
228
- const instanceId = snap.nodes.get(wait.nodeId)?.effectiveInstanceId;
752
+ const settled = resolveWaitOnce(runDir, input.waitId, resolution, input.by, input.selected);
753
+ if (!settled.changed) {
754
+ return { kind: 'already-settled', status: settled.wait.status };
755
+ }
756
+ const resolvedWait = settled.wait;
757
+ if (trustedHost && !waitMatchesTrustedHostGate(resolvedWait, trustedHost)) {
758
+ appendEvent(journalPath, {
759
+ type: 'gateResolved',
760
+ nodeId: trustedHost.nodeId,
761
+ instanceId: trustedHost.instanceId,
762
+ waitId: trustedHost.waitId,
763
+ resolution: 'rejected',
764
+ by: 'system-host-wait-integrity',
765
+ hostApproval: trustedHost.hostApproval,
766
+ });
767
+ return { kind: 'resolved', resolution: 'rejected' };
768
+ }
769
+ const instanceId = snap.nodes.get(resolvedWait.nodeId)?.effectiveInstanceId;
229
770
  appendEvent(journalPath, {
230
771
  type: 'gateResolved',
231
772
  // nodeId from the WAIT FILE, not caller input (codex review #1): the wait is
232
773
  // the authoritative state — a wrong/stale caller nodeId must not let us write
233
774
  // gateResolved for a different node.
234
- nodeId: wait.nodeId,
775
+ nodeId: resolvedWait.nodeId,
235
776
  ...(instanceId ? { instanceId } : {}),
236
777
  waitId: input.waitId,
237
778
  resolution,
238
779
  by: input.by,
239
780
  selected: input.selected,
781
+ ...(trustedHost
782
+ ? { hostApproval: trustedHost.hostApproval }
783
+ : resolvedWait.hostApproval ? { hostApproval: resolvedWait.hostApproval } : {}),
240
784
  });
241
785
  return { kind: 'resolved', resolution };
242
786
  }
787
+ const CANCEL_ACTOR_MAX = 128;
788
+ const CANCEL_REASON_MAX = 500;
789
+ /**
790
+ * Durable, idempotent run-cancel mutation shared by CLI, IM, cards and the
791
+ * dashboard daemon endpoint. The journal lock is the linearization boundary:
792
+ * a true terminal committed first wins; otherwise the first cancel request
793
+ * wins and every repeat reuses its id.
794
+ */
795
+ export function requestV3RunCancel(baseDir, runId, input) {
796
+ const runDir = safeRunDir(baseDir, runId);
797
+ if (!existsSync(runDir))
798
+ return { kind: 'stale-run', reason: 'missing' };
799
+ assertV3RunIntegrityForMutation(runDir);
800
+ const by = input.by.trim();
801
+ if (!by || by.length > CANCEL_ACTOR_MAX || /[\r\n\0]/.test(by)) {
802
+ throw new Error(`v3 cancel actor must be 1-${CANCEL_ACTOR_MAX} safe characters`);
803
+ }
804
+ const reason = input.reason?.trim();
805
+ if (reason !== undefined && (reason.length === 0 || reason.length > CANCEL_REASON_MAX || /[\0]/.test(reason))) {
806
+ throw new Error(`v3 cancel reason must be 1-${CANCEL_REASON_MAX} characters`);
807
+ }
808
+ const journalPath = join(runDir, 'journal.ndjson');
809
+ return withJournalMutationSync(journalPath, ({ events, append }) => {
810
+ const snap = materialize([...events]);
811
+ if (snap.runStatus === 'cancelled') {
812
+ return { kind: 'already-cancelled', cancelRequestId: snap.cancelRequestId };
813
+ }
814
+ if (snap.runStatus === 'succeeded' || snap.runStatus === 'failed') {
815
+ return { kind: 'already-terminal', status: snap.runStatus };
816
+ }
817
+ if (snap.runStatus === 'cancelling' && snap.cancelRequestId) {
818
+ return { kind: 'already-requested', cancelRequestId: snap.cancelRequestId };
819
+ }
820
+ const cancelRequestId = `cancel-${randomUUID()}`;
821
+ append({
822
+ type: 'runCancelRequested',
823
+ cancelRequestId,
824
+ by,
825
+ ...(reason ? { reason } : {}),
826
+ }, { durable: true });
827
+ return { kind: 'requested', cancelRequestId };
828
+ });
829
+ }
243
830
  function atomicWriteJson(path, value) {
244
831
  mkdirSync(dirname(path), { recursive: true });
245
832
  const tmp = `${path}.tmp`;
@@ -276,6 +863,7 @@ export function requestV3Retry(baseDir, runId, input = {}) {
276
863
  const journalPath = join(runDir, 'journal.ndjson');
277
864
  if (!existsSync(journalPath))
278
865
  return { kind: 'stale-run', reason: 'missing' };
866
+ assertV3RunIntegrityForMutation(runDir);
279
867
  const events = readJournal(journalPath);
280
868
  const snap = materialize(events);
281
869
  // Target resolution: explicit nodeId > the run's blocked pointer > a node
@@ -318,12 +906,17 @@ export function requestV3Retry(baseDir, runId, input = {}) {
318
906
  if (!previousAttemptId)
319
907
  return { kind: 'stale-run', reason: 'not-blocked' };
320
908
  const info = blockedInfoFor(events, nodeId);
909
+ if (events.some((event) => (event.type === 'hostEffectIntent' || event.type === 'hostEffectUncertain') &&
910
+ event.attemptId === previousAttemptId)) {
911
+ return { kind: 'stale-run', reason: 'host-effect-uncertain' };
912
+ }
321
913
  // Freshness gate (codex blocker): the click must target the CURRENTLY
322
914
  // blocked attempt, not an earlier one whose card survived in the chat.
323
915
  if (input.expectedAttemptId && input.expectedAttemptId !== info.attemptId) {
324
916
  return { kind: 'stale-run', reason: 'stale-attempt' };
325
917
  }
326
918
  const nextAttemptId = nextAttemptIdFor(events, attemptKey);
919
+ const resetGate = events.some((event) => event.type === 'hostInputPrepared' && event.attemptId === previousAttemptId);
327
920
  // Runtime human-ask answer: persist the chosen option next to the asked
328
921
  // attempt (answer.json) and carry its path on the retry event — buildInputs
329
922
  // injects it into the next attempt as `{from:'human', name:'answer'}`. Plain
@@ -365,6 +958,7 @@ export function requestV3Retry(baseDir, runId, input = {}) {
365
958
  reason: 'blockedRetry',
366
959
  previousErrorClass: info.errorClass,
367
960
  previousErrorCode: info.errorCode,
961
+ ...(resetGate ? { resetGate: true } : {}),
368
962
  ...(answer ? { answer } : {}),
369
963
  });
370
964
  return { kind: 'requested', nodeId, previousAttemptId, nextAttemptId };
@@ -386,6 +980,7 @@ export function requestRevisitGrant(baseDir, runId, input) {
386
980
  const journalPath = join(runDir, 'journal.ndjson');
387
981
  if (!existsSync(journalPath))
388
982
  return { kind: 'stale-run', reason: 'missing' };
983
+ assertV3RunIntegrityForMutation(runDir);
389
984
  // Reject a half-filled pair before touching state (never widen to run grant).
390
985
  const hasSource = input.sourceNodeId !== undefined;
391
986
  const hasTo = input.toNodeId !== undefined;
@@ -449,6 +1044,7 @@ export function requestV3LoopGrant(baseDir, runId, input = {}) {
449
1044
  const journalPath = join(runDir, 'journal.ndjson');
450
1045
  if (!existsSync(journalPath))
451
1046
  return { kind: 'stale-run', reason: 'missing' };
1047
+ assertV3RunIntegrityForMutation(runDir);
452
1048
  const events = readJournal(journalPath);
453
1049
  const snap = materialize(events);
454
1050
  // Target: explicit loopId > the run's blocked pointer when it IS a loop >
@@ -497,8 +1093,17 @@ function unconsumedRetryEvent(events, key) {
497
1093
  * source is always the runDir.
498
1094
  */
499
1095
  export function createV3GateRunner(deps) {
1096
+ const baseDir = deps.baseDir ?? defaultBaseDir();
500
1097
  const inFlight = new Set();
501
1098
  const rerunRequested = new Set();
1099
+ const activeControllers = new Map();
1100
+ const invokeLifecycleHook = (hook, runId, phase) => {
1101
+ if (!hook)
1102
+ return;
1103
+ void Promise.resolve()
1104
+ .then(() => hook(runId))
1105
+ .catch((err) => deps.onError?.(runId, new Error(`v3 progress ${phase} hook failed: ${err instanceof Error ? err.message : String(err)}`)));
1106
+ };
502
1107
  async function drive(runId) {
503
1108
  // Coalesce (codex blocker #2): if a drive is already in flight for this run,
504
1109
  // DON'T silently no-op — a click that resolved a gate + called driveDetached
@@ -513,18 +1118,61 @@ export function createV3GateRunner(deps) {
513
1118
  try {
514
1119
  do {
515
1120
  rerunRequested.delete(runId); // clear before the run; a request DURING re-sets it
516
- await driveV3Run(runId, {
517
- baseDir: deps.baseDir,
518
- loadBots: deps.loadBots,
519
- makeRunNode: deps.makeRunNode,
520
- validateManifest: deps.validateManifest,
521
- maxParallel: deps.maxParallel,
522
- postGateCard: (binding, gate, rid) => deps.postCard(binding, gate, rid),
523
- postBlockedCard: deps.postBlockedCard,
524
- postLoopGrantCard: deps.postLoopGrantCard,
525
- postRevisitGrantCard: deps.postRevisitGrantCard,
526
- onTerminal: (rid, outcome, binding) => deps.notifyTerminal ? deps.notifyTerminal(binding, rid, outcome) : Promise.resolve(),
527
- });
1121
+ invokeLifecycleHook(deps.onDriveBegin, runId, 'begin');
1122
+ const controller = new AbortController();
1123
+ activeControllers.set(runId, controller);
1124
+ try {
1125
+ // The in-memory guard above prevents duplicate drives inside one
1126
+ // daemon. This lease extends the same invariant across rolling
1127
+ // restarts / an accidental second daemon: only the process that owns
1128
+ // the live worker promises may schedule, drain peers, or publish a
1129
+ // run boundary.
1130
+ // A cancel request itself uses the independent journal lock, so it
1131
+ // can still wake the lease holder while a second daemon waits here.
1132
+ const leaseTarget = v3DriveLeaseTarget(baseDir, runId);
1133
+ let leaseSettled = false;
1134
+ while (!leaseSettled) {
1135
+ try {
1136
+ await withFileLock(leaseTarget, async () => {
1137
+ // A durable cancel can land while driveV3Run is no longer in
1138
+ // runtime (for example it is awaiting a slow gate-card POST).
1139
+ // Re-fold under the SAME lease before releasing ownership so
1140
+ // the request cannot be stranded between runtime and transport.
1141
+ do {
1142
+ await driveV3Run(runId, {
1143
+ baseDir,
1144
+ loadBots: deps.loadBots,
1145
+ makeRunNode: deps.makeRunNode,
1146
+ validateManifest: deps.validateManifest,
1147
+ maxParallel: deps.maxParallel,
1148
+ cancelSignal: controller.signal,
1149
+ postGateCard: (binding, gate, rid) => deps.postCard(binding, gate, rid),
1150
+ postBlockedCard: deps.postBlockedCard,
1151
+ postLoopGrantCard: deps.postLoopGrantCard,
1152
+ postRevisitGrantCard: deps.postRevisitGrantCard,
1153
+ onTerminal: (rid, outcome, binding) => deps.notifyTerminal ? deps.notifyTerminal(binding, rid, outcome) : Promise.resolve(),
1154
+ });
1155
+ } while (currentRunStatus(baseDir, runId) === 'cancelling');
1156
+ }, { maxWaitMs: V3_DRIVE_LEASE_MAX_WAIT_MS });
1157
+ leaseSettled = true;
1158
+ }
1159
+ catch (err) {
1160
+ // A second daemon may legitimately wait longer than one lock
1161
+ // window while the owner drains a wedged CLI or a Lark request.
1162
+ // Durable cancellation must keep a waiter alive until the lease
1163
+ // is released; ordinary duplicate drives may still fail fast.
1164
+ const lockTimedOut = err instanceof Error && err.message.includes('file-lock timeout waiting for');
1165
+ if (lockTimedOut && currentRunStatus(baseDir, runId) === 'cancelling')
1166
+ continue;
1167
+ throw err;
1168
+ }
1169
+ }
1170
+ }
1171
+ finally {
1172
+ if (activeControllers.get(runId) === controller)
1173
+ activeControllers.delete(runId);
1174
+ invokeLifecycleHook(deps.onDriveEnd, runId, 'end');
1175
+ }
528
1176
  } while (rerunRequested.has(runId));
529
1177
  }
530
1178
  catch (err) {
@@ -533,16 +1181,26 @@ export function createV3GateRunner(deps) {
533
1181
  finally {
534
1182
  inFlight.delete(runId);
535
1183
  rerunRequested.delete(runId);
1184
+ activeControllers.delete(runId);
536
1185
  }
537
1186
  }
538
1187
  /** Fire-and-forget drive (card-click / start IPC call this). */
539
1188
  function driveDetached(runId) {
540
1189
  void drive(runId);
541
1190
  }
1191
+ /** Deliver an already-durable cancel request to the active runtime and make
1192
+ * sure a fresh replay runs even when the request raced post-card/teardown. */
1193
+ function cancelAndDrive(runId, cancelRequestId) {
1194
+ const controller = activeControllers.get(runId);
1195
+ if (controller && !controller.signal.aborted) {
1196
+ controller.abort({ kind: 'run', cancelRequestId });
1197
+ }
1198
+ driveDetached(runId);
1199
+ }
542
1200
  async function coldAttach(ownerLarkAppId) {
543
1201
  let recs = [];
544
1202
  try {
545
- recs = reconcileV3PendingGates(deps.baseDir, ownerLarkAppId);
1203
+ recs = reconcileV3PendingGates(baseDir, ownerLarkAppId);
546
1204
  }
547
1205
  catch (err) {
548
1206
  deps.onError?.('(cold-attach)', err);
@@ -595,7 +1253,20 @@ export function createV3GateRunner(deps) {
595
1253
  driveDetached(rec.runId);
596
1254
  }
597
1255
  }
598
- return { drive, driveDetached, coldAttach };
1256
+ return { drive, driveDetached, cancelAndDrive, coldAttach };
1257
+ }
1258
+ function currentRunStatus(baseDir, runId) {
1259
+ try {
1260
+ const journalPath = join(safeRunDir(baseDir, runId), 'journal.ndjson');
1261
+ if (!existsSync(journalPath))
1262
+ return undefined;
1263
+ return materialize(readJournal(journalPath)).runStatus;
1264
+ }
1265
+ catch {
1266
+ // The actual drive path reports integrity/journal errors. This helper is
1267
+ // only a retry predicate and must never convert corruption into a spin.
1268
+ return undefined;
1269
+ }
599
1270
  }
600
1271
  /**
601
1272
  * Cold-attach reconcile (daemon startup, codex review #2/#3). Finds v3 runs
@@ -624,31 +1295,66 @@ export function reconcileV3PendingGates(baseDir = defaultBaseDir(), ownerLarkApp
624
1295
  const journalPath = join(runDir, 'journal.ndjson');
625
1296
  if (!existsSync(journalPath))
626
1297
  continue;
1298
+ // Recovery may recreate a missing wait or heal a resolved wait by
1299
+ // appending gateResolved. Apply the same authorization boundary as live
1300
+ // clicks before cold-attach can mutate or repost anything for this run.
1301
+ assertV3RunIntegrityForMutation(runDir);
627
1302
  const events = readJournal(journalPath);
628
1303
  const snap = materialize(events);
629
- if (snap.runStatus === 'succeeded' || snap.runStatus === 'failed')
1304
+ const hasOpenAttempts = openV3WorkerAttempts(events).length > 0 || openV3HostEffects(events).length > 0;
1305
+ if (snap.runStatus === 'succeeded' ||
1306
+ snap.runStatus === 'failed' ||
1307
+ snap.runStatus === 'cancelled') {
1308
+ if (!hasOpenAttempts)
1309
+ continue;
1310
+ const binding = readV3RunChatBinding(runDir);
1311
+ if (ownerLarkAppId && binding?.larkAppId !== ownerLarkAppId)
1312
+ continue;
1313
+ if (!binding)
1314
+ continue;
1315
+ // Pre-barrier histories may have published a terminal before a peer
1316
+ // outer process closed. Re-drive only to clean resources; driveV3Run's
1317
+ // already-terminal guard suppresses duplicate terminal notification.
1318
+ out.push({ runId, runDir, binding, repost: [], resume: true });
1319
+ continue;
1320
+ }
1321
+ if (snap.runStatus === 'cancelling') {
1322
+ const binding = readV3RunChatBinding(runDir);
1323
+ if (ownerLarkAppId && binding?.larkAppId !== ownerLarkAppId)
1324
+ continue;
1325
+ // Never repost stale gate/retry cards while cancellation is in
1326
+ // progress. A cold drive converges pending/gated nodes immediately;
1327
+ // workers from the dead daemon exit on IPC disconnect.
1328
+ out.push({ runId, runDir, binding, repost: [], resume: true });
630
1329
  continue;
1330
+ }
631
1331
  if (snap.runStatus === 'blocked') {
1332
+ if (hasOpenAttempts) {
1333
+ const binding = readV3RunChatBinding(runDir);
1334
+ if (ownerLarkAppId && binding?.larkAppId !== ownerLarkAppId)
1335
+ continue;
1336
+ if (!binding)
1337
+ continue;
1338
+ // Cleanup must finish before the retry/grant card is visible: an
1339
+ // immediate click must never overlap a pre-block bypass worker.
1340
+ out.push({ runId, runDir, binding, repost: [], resume: true });
1341
+ continue;
1342
+ }
632
1343
  // Blocked run: repost the recovery card (covers the crash window
633
1344
  // between the runBlocked append and the original card send) — grant
634
1345
  // card for an exhausted loop, retry card for a blocked node. Owner-
635
1346
  // filtered like gates; binding-less (CLI/dev) runs are left alone.
636
- const grill = readGrillState(runDir);
637
- const binding = grill?.chatBinding;
1347
+ const binding = readV3RunChatBinding(runDir);
638
1348
  if (ownerLarkAppId && binding?.larkAppId !== ownerLarkAppId)
639
1349
  continue;
640
1350
  if (!binding || !snap.blockedNodeId)
641
1351
  continue;
642
1352
  if (snap.loops.has(snap.blockedNodeId)) {
643
1353
  const info = loopExhaustedInfoFor(events, snap.blockedNodeId);
644
- if (grill?.dagPath && existsSync(grill.dagPath)) {
645
- try {
646
- const loopNode = loadDag(grill.dagPath).nodes.find((n) => n.id === snap.blockedNodeId);
647
- if (loopNode && isLoopNode(loopNode))
648
- info.maxIterations = loopNode.maxIterations;
649
- }
650
- catch { /* display-only enrichment — card renders without it */ }
651
- }
1354
+ const recoveryDag = loadV3RunDagForRecovery(runDir);
1355
+ const loopNode = recoveryDag?.nodes.find((n) => n.id === snap.blockedNodeId);
1356
+ if (loopNode && isLoopNode(loopNode))
1357
+ info.maxIterations = loopNode.maxIterations;
652
1358
  out.push({ runId, runDir, binding, repost: [], repostLoopGrant: info, resume: false });
653
1359
  }
654
1360
  else {
@@ -671,14 +1377,27 @@ export function reconcileV3PendingGates(baseDir = defaultBaseDir(), ownerLarkApp
671
1377
  // runStatus === 'running'
672
1378
  const rec = reconcileOneRun(runId, runDir, journalPath, snap, ownerLarkAppId);
673
1379
  if (rec) {
674
- out.push(rec);
1380
+ // A pending gate may coexist with an attempt owned by the dead daemon.
1381
+ // Let the drive fence/requeue it first; that drive will post every gate
1382
+ // still pending after resource convergence.
1383
+ out.push(hasOpenAttempts ? { ...rec, repost: [], resume: true } : rec);
1384
+ continue;
1385
+ }
1386
+ if (hasOpenAttempts) {
1387
+ const binding = readV3RunChatBinding(runDir);
1388
+ if (ownerLarkAppId && binding?.larkAppId !== ownerLarkAppId)
1389
+ continue;
1390
+ if (!binding)
1391
+ continue;
1392
+ out.push({ runId, runDir, binding, repost: [], resume: true });
675
1393
  continue;
676
1394
  }
677
- // No gate to reconcile. If nothing is (phantom-)running, the run died in
678
- // a resumable spot — e.g. crash right after a `nodeRetryRequested` append
679
- // (before the redrive) or right after start — so re-drive it. Runs with
680
- // phantom `running` nodes are the dangling-attempt recovery gap (worker
681
- // fencing backlog) and are deliberately left alone.
1395
+ // No gate or open attempt to reconcile. If nothing is materialized as
1396
+ // running, the run died in a resumable control spot — e.g. crash right
1397
+ // after `nodeRetryRequested` or start — so re-drive it. Open worker
1398
+ // attempts were handled above by the unified fence barrier; a remaining
1399
+ // running node without an open ledger record is malformed/legacy state
1400
+ // and stays fail-closed here.
682
1401
  //
683
1402
  // Composite LOOP nodes are excluded from the phantom check (codex loop
684
1403
  // review blocker): a loop is 'running' in PURE CONTROL states with no
@@ -689,8 +1408,7 @@ export function reconcileV3PendingGates(baseDir = defaultBaseDir(), ownerLarkApp
689
1408
  // before redrive). Body INSTANCES still count as real in-flight.
690
1409
  const hasRunning = [...snap.nodes.entries()].some(([id, s]) => s.status === 'running' && !snap.loops.has(id));
691
1410
  if (!hasRunning) {
692
- const grill = readGrillState(runDir);
693
- const binding = grill?.chatBinding;
1411
+ const binding = readV3RunChatBinding(runDir);
694
1412
  if (ownerLarkAppId && binding?.larkAppId !== ownerLarkAppId)
695
1413
  continue;
696
1414
  if (!binding)
@@ -707,13 +1425,13 @@ export function reconcileV3PendingGates(baseDir = defaultBaseDir(), ownerLarkApp
707
1425
  return out;
708
1426
  }
709
1427
  function reconcileOneRun(runId, runDir, journalPath, snap, ownerLarkAppId) {
1428
+ const events = readJournal(journalPath);
710
1429
  const gateWaitingNodes = [...snap.nodes.entries()]
711
1430
  .filter(([, s]) => s.status === 'gateWaiting')
712
1431
  .map(([id]) => id);
713
1432
  if (gateWaitingNodes.length === 0)
714
1433
  return undefined;
715
- const grill = readGrillState(runDir); // defensive: undefined on corrupt (won't throw)
716
- const binding = grill?.chatBinding;
1434
+ const binding = readV3RunChatBinding(runDir);
717
1435
  // Multi-daemon owner filter (codex blocker #1): each bot daemon must only
718
1436
  // touch runs bound to ITS larkAppId — otherwise every online daemon re-posts
719
1437
  // / resumes the same pending gate. A run with no binding (CLI/dev) or a
@@ -722,15 +1440,25 @@ function reconcileOneRun(runId, runDir, journalPath, snap, ownerLarkAppId) {
722
1440
  return undefined;
723
1441
  // dag (for humanGate.prompt when re-creating a missing wait).
724
1442
  const dagNodeGate = new Map();
725
- if (grill?.dagPath && existsSync(grill.dagPath)) {
726
- try {
727
- for (const n of loadDag(grill.dagPath).nodes) {
728
- if (n.humanGate?.prompt)
729
- dagNodeGate.set(n.id, normalizeGateWaitInput(n.humanGate));
1443
+ const trustedHostGates = new Map();
1444
+ const recoveryDag = loadV3RunDagForRecovery(runDir);
1445
+ if (recoveryDag) {
1446
+ for (const n of recoveryDag.nodes) {
1447
+ if (!n.humanGate?.prompt)
1448
+ continue;
1449
+ const gate = normalizeGateWaitInput(n.humanGate);
1450
+ if (!isHostNode(n)) {
1451
+ dagNodeGate.set(n.id, gate);
1452
+ continue;
1453
+ }
1454
+ const instanceId = snap.nodes.get(n.id)?.effectiveInstanceId;
1455
+ if (!instanceId)
1456
+ continue;
1457
+ const trusted = trustedHostGateMaterial(runDir, runId, n.id, instanceId, events);
1458
+ if (trusted) {
1459
+ trustedHostGates.set(n.id, trusted);
1460
+ dagNodeGate.set(n.id, trusted);
730
1461
  }
731
- }
732
- catch {
733
- /* dag unreadable — fall back to a generic prompt below */
734
1462
  }
735
1463
  }
736
1464
  const repost = [];
@@ -739,20 +1467,84 @@ function reconcileOneRun(runId, runDir, journalPath, snap, ownerLarkAppId) {
739
1467
  // Instance-level waitId mirrors startGate so recovery reads the SAME wait
740
1468
  // file the dispatch wrote (stale-card protection).
741
1469
  const instanceId = snap.nodes.get(nodeId)?.effectiveInstanceId;
742
- const waitId = `${instanceId ?? nodeId}-gate`;
1470
+ const recoveredGate = dagNodeGate.get(nodeId);
1471
+ const trustedHostGate = trustedHostGates.get(nodeId);
1472
+ const dispatchedHostApproval = [...events].reverse().find((event) => event.type === 'gateDispatched' &&
1473
+ event.nodeId === nodeId &&
1474
+ event.instanceId === instanceId &&
1475
+ !!event.hostApproval)?.hostApproval;
1476
+ const waitId = v3GateWaitId(nodeId, instanceId, trustedHostGate?.hostApproval ?? recoveredGate?.hostApproval ?? dispatchedHostApproval);
743
1477
  let wait = readWait(runDir, waitId);
1478
+ const recoveryNode = recoveryDag?.nodes.find((node) => node.id === nodeId);
1479
+ if (recoveryNode && isHostNode(recoveryNode)) {
1480
+ if (!trustedHostGate) {
1481
+ // The mutable wait can never substitute for missing/corrupt frozen
1482
+ // input. Reject with the token from the durable dispatch, if any.
1483
+ appendEvent(journalPath, {
1484
+ type: 'gateResolved',
1485
+ nodeId,
1486
+ ...(instanceId ? { instanceId } : {}),
1487
+ waitId,
1488
+ resolution: 'rejected',
1489
+ by: 'system-host-input-unrecoverable',
1490
+ ...(dispatchedHostApproval ? { hostApproval: dispatchedHostApproval } : {}),
1491
+ });
1492
+ resume = true;
1493
+ continue;
1494
+ }
1495
+ if (wait?.status === 'pending' && !waitMatchesTrustedHostGate(wait, trustedHostGate)) {
1496
+ // Pending delivery state is safe to repair because no human decision
1497
+ // has landed. Re-render from authorized DAG + verified sidecar.
1498
+ wait = writePendingWait(runDir, trustedHostGate);
1499
+ }
1500
+ else if (wait && wait.status !== 'pending' && !waitMatchesTrustedHostGate(wait, trustedHostGate)) {
1501
+ appendEvent(journalPath, {
1502
+ type: 'gateResolved',
1503
+ nodeId,
1504
+ ...(instanceId ? { instanceId } : {}),
1505
+ waitId,
1506
+ resolution: 'rejected',
1507
+ by: 'system-host-wait-integrity',
1508
+ hostApproval: trustedHostGate.hostApproval,
1509
+ });
1510
+ resume = true;
1511
+ continue;
1512
+ }
1513
+ }
744
1514
  if (!wait) {
745
- const gate = dagNodeGate.get(nodeId) ?? normalizeGateWaitInput({ prompt: '(humanGate — 等待人工审批)' });
746
- wait = writePendingWait(runDir, { waitId, nodeId, ...(instanceId ? { instanceId } : {}), ...gate });
1515
+ const gate = dagNodeGate.get(nodeId);
1516
+ if (!gate && recoveryNode && isHostNode(recoveryNode)) {
1517
+ // A host gate is approval of one frozen input hash. If that input
1518
+ // cannot be verified, never recreate a generic/static card that could
1519
+ // approve different bytes; reject the gate and surface a failed run.
1520
+ const dispatched = [...events].reverse().find((event) => event.type === 'gateDispatched' && event.nodeId === nodeId && event.instanceId === instanceId);
1521
+ appendEvent(journalPath, {
1522
+ type: 'gateResolved',
1523
+ nodeId,
1524
+ ...(instanceId ? { instanceId } : {}),
1525
+ waitId,
1526
+ resolution: 'rejected',
1527
+ by: 'system-host-input-unrecoverable',
1528
+ ...(dispatched?.hostApproval ? { hostApproval: dispatched.hostApproval } : {}),
1529
+ });
1530
+ resume = true;
1531
+ continue;
1532
+ }
1533
+ const safeGate = gate ?? normalizeGateWaitInput({ prompt: '(humanGate — 等待人工审批)' });
1534
+ wait = writePendingWait(runDir, { waitId, nodeId, ...(instanceId ? { instanceId } : {}), ...safeGate });
747
1535
  }
748
1536
  if (wait.status === 'pending') {
1537
+ const display = trustedHostGate ?? wait;
749
1538
  repost.push({
750
1539
  nodeId,
751
1540
  waitId,
752
- prompt: wait.prompt,
753
- options: wait.options,
754
- approveOptions: wait.approveOptions,
755
- approvers: wait.approvers,
1541
+ prompt: display.prompt,
1542
+ options: display.options,
1543
+ approveOptions: display.approveOptions,
1544
+ approvers: display.approvers,
1545
+ ...(trustedHostGate
1546
+ ? { hostApproval: trustedHostGate.hostApproval }
1547
+ : wait.hostApproval ? { hostApproval: wait.hostApproval } : {}),
756
1548
  });
757
1549
  }
758
1550
  else {
@@ -766,6 +1558,9 @@ function reconcileOneRun(runId, runDir, journalPath, snap, ownerLarkAppId) {
766
1558
  resolution: wait.status,
767
1559
  by: wait.by ?? 'system',
768
1560
  selected: wait.selected,
1561
+ ...(trustedHostGate
1562
+ ? { hostApproval: trustedHostGate.hostApproval }
1563
+ : wait.hostApproval ? { hostApproval: wait.hostApproval } : {}),
769
1564
  });
770
1565
  resume = true;
771
1566
  }