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
@@ -0,0 +1,1024 @@
1
+ /**
2
+ * vc-meeting-delivery-store.ts — MA-P0 receiver 侧耐久状态:
3
+ * membership projection(hub 下发的成员投影 + fencing 高水位)与
4
+ * delivery receipt / cursor(每条 member stream 的接收账本)。
5
+ *
6
+ * 对应设计稿 docs/design/2026-07-10-vc-multi-agent-consumer-delivery.md §7.2/§9/§10.3:
7
+ * - key = (listenerAppId, meetingId, memberId, memberEpoch)
8
+ * - projection 携带 ownerBootId / ownerEpoch / membershipGeneration / status /
9
+ * receiverSessionId;register/update 按 ownerEpoch、memberEpoch、
10
+ * membershipGeneration 三个高水位 fencing,removed epoch 永久失效
11
+ * - receipt 携带 deliveryKey / inputHash / fromSeq / toSeq / status /
12
+ * receiverBootId / workerGeneration / dispatchAttempt;同 key 同 hash 幂等
13
+ * 回显、异 hash 409、duplicate / partial overlap / gap / in-flight 各自显式
14
+ * 冲突;只有 turn terminal 才原子推进 receiverCommittedThrough
15
+ * - meeting receipt 是顺序与完成状态的唯一真源(§9.3);cursor 从不跳号
16
+ *
17
+ * 存储:每场会议一个 JSON 文件(0600,tmp+rename 原子写),所有
18
+ * read-modify-write 经 withFileLockSync 跨进程串行化。不引 SQLite。
19
+ * 会议正文不落盘——这里只有位置、身份与 hash(§12.1)。
20
+ */
21
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync } from 'node:fs';
22
+ import { join } from 'node:path';
23
+ import { atomicWriteFileSync } from '../utils/atomic-write.js';
24
+ import { withFileLockSync } from '../utils/file-lock.js';
25
+ import { logger } from '../utils/logger.js';
26
+ import { normalizeVcMeetingMemberPolicy, vcMeetingCanonicalStringListsEqual, vcMeetingMemberFilterEquals, } from './vc-meeting-member-policy.js';
27
+ import { normalizeVcMeetingProfileInstructions } from './vc-meeting-profile-instructions.js';
28
+ const DIR_NAME = 'vc-meeting-delivery';
29
+ const SCHEMA_VERSION = 1;
30
+ /** 终态:不再持有 stream head。 */
31
+ const TERMINAL_RECEIPT_STATUSES = new Set([
32
+ 'completed',
33
+ 'abandoned',
34
+ ]);
35
+ function safeFileToken(raw) {
36
+ return raw.replace(/[^A-Za-z0-9._-]/g, (ch) => `%${ch.charCodeAt(0).toString(16)}`);
37
+ }
38
+ function meetingFilePath(dataDir, listenerAppId, meetingId) {
39
+ return join(dataDir, DIR_NAME, `${safeFileToken(listenerAppId)}__${safeFileToken(meetingId)}.json`);
40
+ }
41
+ function streamKey(memberId, memberEpoch) {
42
+ return `${memberId}:${memberEpoch}`;
43
+ }
44
+ function normalizePersistedProjectionPolicies(state) {
45
+ for (const member of Object.values(state.members ?? {})) {
46
+ for (const projection of Object.values(member.projections ?? {})) {
47
+ const normalizedInstructions = normalizeVcMeetingProfileInstructions(projection.instructions);
48
+ if (!normalizedInstructions.ok) {
49
+ throw new Error(`invalid persisted member instructions: ${normalizedInstructions.error}`);
50
+ }
51
+ if (normalizedInstructions.instructions === undefined)
52
+ delete projection.instructions;
53
+ else
54
+ projection.instructions = normalizedInstructions.instructions;
55
+ const policy = normalizeVcMeetingMemberPolicy({
56
+ memberId: projection.memberId,
57
+ role: projection.role,
58
+ membershipGeneration: projection.membershipGeneration,
59
+ responseMode: projection.responseMode,
60
+ filter: projection.filter,
61
+ capabilities: projection.capabilities,
62
+ ownedSinks: projection.ownedSinks,
63
+ sinkOwnerGeneration: projection.sinkOwnerGeneration,
64
+ });
65
+ if (policy)
66
+ Object.assign(projection, policy);
67
+ }
68
+ }
69
+ }
70
+ function readStateFile(fp) {
71
+ if (!existsSync(fp))
72
+ return undefined;
73
+ try {
74
+ const raw = JSON.parse(readFileSync(fp, 'utf-8'));
75
+ if (!raw || typeof raw !== 'object' || typeof raw.schemaVersion !== 'number')
76
+ return undefined;
77
+ normalizePersistedProjectionPolicies(raw);
78
+ return raw;
79
+ }
80
+ catch (err) {
81
+ logger.warn(`[vc-meeting-delivery-store] failed to read ${fp}: ${err instanceof Error ? err.message : String(err)}`);
82
+ return undefined;
83
+ }
84
+ }
85
+ /**
86
+ * 锁内读取:损坏文件改名保留取证(.corrupt.<ts>),当作缺失重建——cursor 丢失
87
+ * 只会导致 at-least-once 重放,由 action gate 兜副作用;静默覆盖才是事故。
88
+ */
89
+ function readStateFileForMutation(fp) {
90
+ if (!existsSync(fp))
91
+ return undefined;
92
+ try {
93
+ const raw = JSON.parse(readFileSync(fp, 'utf-8'));
94
+ if (!raw || typeof raw !== 'object' || typeof raw.schemaVersion !== 'number') {
95
+ throw new Error('not a delivery state file');
96
+ }
97
+ normalizePersistedProjectionPolicies(raw);
98
+ return raw;
99
+ }
100
+ catch (err) {
101
+ const aside = `${fp}.corrupt.${Date.now()}`;
102
+ try {
103
+ renameSync(fp, aside);
104
+ }
105
+ catch { /* 已被并发处理,容忍 */ }
106
+ logger.warn(`[vc-meeting-delivery-store] corrupt state at ${fp}, moved aside to ${aside}: `
107
+ + `${err instanceof Error ? err.message : String(err)}`);
108
+ return undefined;
109
+ }
110
+ }
111
+ function writeStateFile(fp, state, now) {
112
+ state.updatedAt = now;
113
+ const dir = join(fp, '..');
114
+ if (!existsSync(dir))
115
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
116
+ atomicWriteFileSync(fp, JSON.stringify(state, null, 2) + '\n', { mode: 0o600 });
117
+ }
118
+ function newStateFile(listenerAppId, meetingId, now) {
119
+ return {
120
+ schemaVersion: SCHEMA_VERSION,
121
+ listenerAppId,
122
+ meetingId,
123
+ owner: { ownerEpoch: 0, ownerBootId: '' },
124
+ members: {},
125
+ streams: {},
126
+ createdAt: now,
127
+ updatedAt: now,
128
+ };
129
+ }
130
+ function mutateState(dataDir, listenerAppId, meetingId, opts, fn) {
131
+ const fp = meetingFilePath(dataDir, listenerAppId, meetingId);
132
+ const dir = join(dataDir, DIR_NAME);
133
+ if (!existsSync(dir))
134
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
135
+ return withFileLockSync(fp, () => {
136
+ let state = readStateFileForMutation(fp);
137
+ if (!state && opts.createIfMissing)
138
+ state = newStateFile(listenerAppId, meetingId, opts.now);
139
+ const { result, write } = fn(state);
140
+ if (write)
141
+ writeStateFile(fp, write, opts.now);
142
+ return result;
143
+ });
144
+ }
145
+ function nonEmpty(...values) {
146
+ return values.every((v) => typeof v === 'string' && v.trim().length > 0);
147
+ }
148
+ /**
149
+ * projection 的「member 语义内容」等价判断——不含 owner 字段:owner
150
+ * bootId/epoch 是会议级 fencing 信息,owner daemon 重启后同 generation
151
+ * re-register 换 bootId 是合法幂等重放,不构成内容冲突。
152
+ */
153
+ function projectionContentEquals(a, b) {
154
+ return a.agentAppId === b.agentAppId
155
+ && a.role === b.role
156
+ && a.instructions === b.instructions
157
+ && a.status === b.status
158
+ && a.responseMode === b.responseMode
159
+ && vcMeetingMemberFilterEquals(a.filter, b.filter)
160
+ && vcMeetingCanonicalStringListsEqual(a.capabilities ?? [], b.capabilities ?? [])
161
+ && vcMeetingCanonicalStringListsEqual(a.ownedSinks ?? [], b.ownedSinks ?? [])
162
+ && a.sinkOwnerGeneration === b.sinkOwnerGeneration
163
+ && a.joinedAtIngestSeq === b.joinedAtIngestSeq
164
+ && a.receiverSessionId === b.receiverSessionId
165
+ && a.outputChatId === b.outputChatId;
166
+ }
167
+ /**
168
+ * These fields define the meaning and identity of one member delivery stream.
169
+ * Changing any of them while reusing the same memberEpoch would attach a new
170
+ * consumer/session to the old cursor and frozen receipts. Control-plane
171
+ * changes such as pause/resume and responseMode may advance only
172
+ * membershipGeneration; stream-semantic changes must allocate a new epoch.
173
+ */
174
+ function projectionStreamIdentityEquals(a, b) {
175
+ return a.agentAppId === b.agentAppId
176
+ && a.role === b.role
177
+ && a.instructions === b.instructions
178
+ && vcMeetingMemberFilterEquals(a.filter, b.filter)
179
+ && a.joinedAtIngestSeq === b.joinedAtIngestSeq
180
+ && a.receiverSessionId === b.receiverSessionId
181
+ && a.outputChatId === b.outputChatId;
182
+ }
183
+ // ─── membership projection:register / update + fencing ─────────────────────
184
+ export function applyVcMeetingMemberProjection(dataDir, input, now = Date.now()) {
185
+ const normalizedInstructions = normalizeVcMeetingProfileInstructions(input.instructions);
186
+ if (!normalizedInstructions.ok)
187
+ return { ok: false, reason: 'invalid' };
188
+ const policy = normalizeVcMeetingMemberPolicy({
189
+ memberId: input.memberId,
190
+ role: input.role,
191
+ membershipGeneration: input.membershipGeneration,
192
+ responseMode: input.responseMode,
193
+ filter: input.filter,
194
+ capabilities: input.capabilities,
195
+ ownedSinks: input.ownedSinks,
196
+ sinkOwnerGeneration: input.sinkOwnerGeneration,
197
+ });
198
+ if (!nonEmpty(input.listenerAppId, input.meetingId, input.ownerBootId, input.memberId, input.agentAppId, input.role, input.receiverSessionId, input.outputChatId)
199
+ || !Number.isInteger(input.memberEpoch) || input.memberEpoch < 1
200
+ || !Number.isInteger(input.membershipGeneration) || input.membershipGeneration < 1
201
+ || !Number.isInteger(input.ownerEpoch) || input.ownerEpoch < 1
202
+ || !Number.isInteger(input.joinedAtIngestSeq) || input.joinedAtIngestSeq < 0
203
+ || !['active', 'paused', 'removed'].includes(input.status)
204
+ || !['silent', 'listener_thread'].includes(input.responseMode)
205
+ || !policy) {
206
+ return { ok: false, reason: 'invalid' };
207
+ }
208
+ // Persist only canonical policy snapshots/instructions. This also materializes the exact
209
+ // MA-P0 legacy defaults so subsequent comparisons never depend on omitted
210
+ // JSON fields.
211
+ input = { ...input, ...policy };
212
+ if (normalizedInstructions.instructions === undefined)
213
+ delete input.instructions;
214
+ else
215
+ input.instructions = normalizedInstructions.instructions;
216
+ return mutateState(dataDir, input.listenerAppId, input.meetingId, { createIfMissing: true, now }, (state) => {
217
+ // createIfMissing 保证 state 存在
218
+ const s = state;
219
+ // owner fencing:projection 可以抬高 ownerEpoch 高水位;旧 epoch 拒绝。
220
+ // 同 epoch 换 bootId = 同一 owner daemon 重启,接受并更新(fencing 锚在 epoch,§13)。
221
+ if (input.ownerEpoch < s.owner.ownerEpoch) {
222
+ return {
223
+ result: {
224
+ ok: false,
225
+ reason: 'stale_owner_epoch',
226
+ detail: `ownerEpoch ${input.ownerEpoch} < ${s.owner.ownerEpoch}`,
227
+ },
228
+ };
229
+ }
230
+ // 同 epoch 内 boot 防回退:A→B 顶替后 A 进退休名单,A 的迟到 projection
231
+ // 重放(哪怕同 generation 同内容的「幂等」形态)不得把 owner 改回 A——
232
+ // 否则 B 的后续新 delivery 全被 stale_owner_boot 卡死、A 的旧在途反而放行。
233
+ // 该检查必须先于下方一切幂等/内容判断。
234
+ if (input.ownerEpoch === s.owner.ownerEpoch
235
+ && (s.owner.retiredBootIds ?? []).includes(input.ownerBootId)) {
236
+ return {
237
+ result: {
238
+ ok: false,
239
+ reason: 'stale_owner_boot',
240
+ detail: `ownerBootId ${input.ownerBootId} was retired within ownerEpoch ${input.ownerEpoch}`,
241
+ },
242
+ };
243
+ }
244
+ const member = s.members[input.memberId] ?? {
245
+ maxKnownEpoch: 0,
246
+ generationHighWater: 0,
247
+ projections: {},
248
+ };
249
+ // member epoch fencing:低于已知最大 epoch 的投影 = 迟到的旧世代,拒绝。
250
+ if (input.memberEpoch < member.maxKnownEpoch) {
251
+ return {
252
+ result: {
253
+ ok: false,
254
+ reason: 'stale_member_epoch',
255
+ detail: `memberEpoch ${input.memberEpoch} < ${member.maxKnownEpoch}`,
256
+ },
257
+ };
258
+ }
259
+ // generation fencing:高水位单调。同 generation 允许幂等重放。
260
+ if (input.membershipGeneration < member.generationHighWater) {
261
+ return {
262
+ result: {
263
+ ok: false,
264
+ reason: 'stale_membership_generation',
265
+ detail: `membershipGeneration ${input.membershipGeneration} < ${member.generationHighWater}`,
266
+ },
267
+ };
268
+ }
269
+ // removed epoch 永久失效(§10.1):同 epoch 只接受 removed 状态的幂等重放。
270
+ const prior = member.projections[String(input.memberEpoch)];
271
+ if (prior?.status === 'removed' && input.status !== 'removed') {
272
+ return { result: { ok: false, reason: 'epoch_removed' } };
273
+ }
274
+ // 同 (memberEpoch, membershipGeneration):同内容 = 幂等重放(owner 字段可刷新,
275
+ // 覆盖 owner daemon 重启场景);异内容 = 冲突——generation 不抬就不允许改写
276
+ // agent / session / status 等 member 语义。
277
+ if (prior && input.membershipGeneration === prior.membershipGeneration
278
+ && !projectionContentEquals(input, prior)) {
279
+ return {
280
+ result: {
281
+ ok: false,
282
+ reason: 'projection_conflict',
283
+ detail: `generation ${input.membershipGeneration} already registered with different content`,
284
+ },
285
+ };
286
+ }
287
+ if (prior
288
+ && (input.sinkOwnerGeneration ?? 0) < (prior.sinkOwnerGeneration ?? 0)) {
289
+ return {
290
+ result: {
291
+ ok: false,
292
+ reason: 'stale_sink_owner_generation',
293
+ detail: `sinkOwnerGeneration ${input.sinkOwnerGeneration} < ${prior.sinkOwnerGeneration}`,
294
+ },
295
+ };
296
+ }
297
+ const sinkOwnershipChanged = !vcMeetingCanonicalStringListsEqual(input.ownedSinks ?? [], prior?.ownedSinks ?? []);
298
+ if (prior && sinkOwnershipChanged
299
+ && (input.sinkOwnerGeneration ?? 0) <= (prior.sinkOwnerGeneration ?? 0)) {
300
+ return {
301
+ result: {
302
+ ok: false,
303
+ reason: 'stale_sink_owner_generation',
304
+ detail: 'ownedSinks changed without advancing sinkOwnerGeneration',
305
+ },
306
+ };
307
+ }
308
+ // Once generation advances, control-plane fields may change, but agent /
309
+ // role / stream start / receiver session / output route define the stream itself.
310
+ // Never rebind an old cursor or frozen receipt; allocate a fresh epoch.
311
+ if (prior && !projectionStreamIdentityEquals(input, prior)) {
312
+ return {
313
+ result: {
314
+ ok: false,
315
+ reason: 'epoch_required',
316
+ detail: `member stream identity changed within memberEpoch ${input.memberEpoch}`,
317
+ },
318
+ };
319
+ }
320
+ const record = {
321
+ ...input,
322
+ createdAt: prior?.createdAt ?? now,
323
+ updatedAt: now,
324
+ };
325
+ member.projections[String(input.memberEpoch)] = record;
326
+ member.maxKnownEpoch = Math.max(member.maxKnownEpoch, input.memberEpoch);
327
+ member.generationHighWater = Math.max(member.generationHighWater, input.membershipGeneration);
328
+ s.members[input.memberId] = member;
329
+ if (input.ownerEpoch > s.owner.ownerEpoch) {
330
+ // epoch 抬高:新任期从零开始,旧 epoch 的 boot 整体被 stale_owner_epoch
331
+ // 挡住,退休名单归零。
332
+ s.owner = { ownerEpoch: input.ownerEpoch, ownerBootId: input.ownerBootId, retiredBootIds: [] };
333
+ }
334
+ else if (input.ownerBootId !== s.owner.ownerBootId) {
335
+ // 同 epoch 顶替:永久退休该任期内被换下的 boot。会议期内数量极小,
336
+ // 不能用有界 FIFO 让第 17 个迟到 boot 构造性复活。
337
+ const retired = s.owner.retiredBootIds ?? [];
338
+ if (s.owner.ownerBootId && !retired.includes(s.owner.ownerBootId)) {
339
+ retired.push(s.owner.ownerBootId);
340
+ }
341
+ s.owner = { ownerEpoch: input.ownerEpoch, ownerBootId: input.ownerBootId, retiredBootIds: retired };
342
+ }
343
+ return { result: { ok: true, record }, write: s };
344
+ });
345
+ }
346
+ export function getVcMeetingMemberProjection(dataDir, key) {
347
+ const state = readStateFile(meetingFilePath(dataDir, key.listenerAppId, key.meetingId));
348
+ return state?.members[key.memberId]?.projections[String(key.memberEpoch)];
349
+ }
350
+ export function listVcMeetingMemberProjections(dataDir, scope) {
351
+ const state = readStateFile(meetingFilePath(dataDir, scope.listenerAppId, scope.meetingId));
352
+ if (!state)
353
+ return [];
354
+ const out = [];
355
+ for (const member of Object.values(state.members)) {
356
+ out.push(...Object.values(member.projections));
357
+ }
358
+ return out.sort((a, b) => a.memberId.localeCompare(b.memberId) || a.memberEpoch - b.memberEpoch);
359
+ }
360
+ // ─── delivery accept(§9.4 规则 1-6)────────────────────────────────────────
361
+ export function acceptVcMeetingDelivery(dataDir, input, now = Date.now()) {
362
+ if (!nonEmpty(input.listenerAppId, input.meetingId, input.memberId, input.deliveryKey, input.inputHash, input.receiverBootId, input.ownerBootId)
363
+ || !Number.isInteger(input.fromSeq) || input.fromSeq < 1
364
+ || !Number.isInteger(input.toSeq) || input.toSeq < input.fromSeq
365
+ || (input.responseMode !== 'silent' && input.responseMode !== 'listener_thread')) {
366
+ return { kind: 'conflict', reason: 'invalid' };
367
+ }
368
+ return mutateState(dataDir, input.listenerAppId, input.meetingId, { createIfMissing: false, now }, (state) => {
369
+ // projection 必须先于 delivery 到达(§9.1);没有会议状态 = 没注册过任何 member。
370
+ if (!state)
371
+ return { result: { kind: 'conflict', reason: 'unknown_member' } };
372
+ // owner fencing:delivery 无权抬高高水位(§9.1)。旧 epoch 拒绝;
373
+ // 比投影更新的 epoch 说明新 owner 还没 re-register,先拒等 projection。
374
+ // ownerEpoch fencing 对同 key 恢复也不放开——跨 epoch 的 frozen envelope
375
+ // 属于上一任 owner 任期,必须由新任期重新决策。
376
+ if (input.ownerEpoch < state.owner.ownerEpoch) {
377
+ return { result: { kind: 'conflict', reason: 'stale_owner_epoch' } };
378
+ }
379
+ if (input.ownerEpoch > state.owner.ownerEpoch) {
380
+ return { result: { kind: 'conflict', reason: 'owner_epoch_not_registered' } };
381
+ }
382
+ const member = state.members[input.memberId];
383
+ if (!member)
384
+ return { result: { kind: 'conflict', reason: 'unknown_member' } };
385
+ if (input.memberEpoch < member.maxKnownEpoch) {
386
+ return { result: { kind: 'conflict', reason: 'stale_member_epoch' } };
387
+ }
388
+ const projection = member.projections[String(input.memberEpoch)];
389
+ if (!projection)
390
+ return { result: { kind: 'conflict', reason: 'unknown_member' } };
391
+ if (projection.status === 'removed') {
392
+ return { result: { kind: 'conflict', reason: 'membership_removed' } };
393
+ }
394
+ if (projection.status === 'paused') {
395
+ return { result: { kind: 'conflict', reason: 'membership_paused' } };
396
+ }
397
+ const sk = streamKey(input.memberId, input.memberEpoch);
398
+ let stream = state.streams[sk];
399
+ if (stream?.abandoned) {
400
+ return { result: { kind: 'conflict', reason: 'stream_abandoned' } };
401
+ }
402
+ if (stream?.poisoned) {
403
+ return {
404
+ result: {
405
+ kind: 'conflict',
406
+ reason: 'stream_poisoned',
407
+ activeDeliveryKey: stream.poisoned.deliveryKey,
408
+ receiverCommittedThrough: stream.receiverCommittedThrough,
409
+ },
410
+ };
411
+ }
412
+ // 1. 同 key frozen recovery(§9.3 冻结 envelope):receipt 已存在且 inputHash
413
+ // 一致时,这是 hub 重发它崩溃前冻结的同一份 assignment——envelope 里的
414
+ // ownerBootId / membershipGeneration 是冻结时的历史值,不拿来与当前高水位
415
+ // 比较,否则 owner 重启(换 bootId)或 generation bump 会把 active head
416
+ // 永久卡死:同 key 被 stale 拒、重铸新 key 又 delivery_in_flight。
417
+ // 恢复的前置条件已在上方校验:同 ownerEpoch、该 memberEpoch 仍是当前
418
+ // epoch 且 active、stream 未 abandoned;再要求 receiver session 绑定未变。
419
+ // 异 hash 永远是冲突(§10.3)。
420
+ const existing = stream?.receipts[input.deliveryKey];
421
+ if (existing && stream) {
422
+ if (existing.inputHash !== input.inputHash) {
423
+ return {
424
+ result: {
425
+ kind: 'conflict',
426
+ reason: 'input_mismatch',
427
+ receipt: existing,
428
+ receiverCommittedThrough: stream.receiverCommittedThrough,
429
+ },
430
+ };
431
+ }
432
+ if (stream.receiverSessionId !== projection.receiverSessionId) {
433
+ return {
434
+ result: {
435
+ kind: 'conflict',
436
+ reason: 'receiver_session_changed',
437
+ receipt: existing,
438
+ receiverCommittedThrough: stream.receiverCommittedThrough,
439
+ },
440
+ };
441
+ }
442
+ return {
443
+ result: {
444
+ kind: 'existing',
445
+ receipt: existing,
446
+ receiverCommittedThrough: stream.receiverCommittedThrough,
447
+ },
448
+ };
449
+ }
450
+ // ── 以下 fencing 只作用于「新 key」:新 delivery 必须携带当前注册值。──
451
+ // 同 ownerEpoch 下 boot fencing:owner daemon 重启会 re-register 刷新 bootId,
452
+ // 崩溃前旧 boot 的在途新 delivery 携带旧 assignment 状态,必须 stale 拒绝。
453
+ if (input.ownerBootId !== state.owner.ownerBootId) {
454
+ return { result: { kind: 'conflict', reason: 'stale_owner_boot' } };
455
+ }
456
+ // generation fencing:同 owner fencing,新 delivery 只能携带已注册的当前值。
457
+ if (input.membershipGeneration < member.generationHighWater) {
458
+ return { result: { kind: 'conflict', reason: 'stale_membership_generation' } };
459
+ }
460
+ if (input.membershipGeneration > member.generationHighWater) {
461
+ return { result: { kind: 'conflict', reason: 'membership_generation_not_registered' } };
462
+ }
463
+ if (!stream) {
464
+ stream = {
465
+ listenerAppId: input.listenerAppId,
466
+ meetingId: input.meetingId,
467
+ memberId: input.memberId,
468
+ memberEpoch: input.memberEpoch,
469
+ receiverSessionId: projection.receiverSessionId,
470
+ receiverCommittedThrough: 0,
471
+ receipts: {},
472
+ createdAt: now,
473
+ updatedAt: now,
474
+ };
475
+ state.streams[sk] = stream;
476
+ }
477
+ // 2. 整批已在 cursor 之下:duplicate(§9.4 规则 3)。
478
+ if (input.toSeq <= stream.receiverCommittedThrough) {
479
+ return {
480
+ result: { kind: 'duplicate', receiverCommittedThrough: stream.receiverCommittedThrough },
481
+ };
482
+ }
483
+ // 3. stream head 已被非终态 receipt 占用:不同 key 一律 delivery_in_flight(§9.3 冻结)。
484
+ if (stream.activeDeliveryKey) {
485
+ const active = stream.receipts[stream.activeDeliveryKey];
486
+ if (active && !TERMINAL_RECEIPT_STATUSES.has(active.status)) {
487
+ return {
488
+ result: {
489
+ kind: 'conflict',
490
+ reason: 'delivery_in_flight',
491
+ activeDeliveryKey: stream.activeDeliveryKey,
492
+ receiverCommittedThrough: stream.receiverCommittedThrough,
493
+ },
494
+ };
495
+ }
496
+ }
497
+ // 4. 连续前缀(§9.4 规则 4):partial overlap 严格 409,不裁剪——整批共用
498
+ // 一份 instruction / inputHash,裁掉前缀就不是原 turn。
499
+ const expectedFrom = stream.receiverCommittedThrough + 1;
500
+ if (input.fromSeq <= stream.receiverCommittedThrough) {
501
+ return {
502
+ result: {
503
+ kind: 'conflict',
504
+ reason: 'delivery_partial_overlap',
505
+ receiverCommittedThrough: stream.receiverCommittedThrough,
506
+ expectedFromSeq: expectedFrom,
507
+ },
508
+ };
509
+ }
510
+ if (input.fromSeq > expectedFrom) {
511
+ return {
512
+ result: {
513
+ kind: 'conflict',
514
+ reason: 'delivery_gap',
515
+ receiverCommittedThrough: stream.receiverCommittedThrough,
516
+ expectedFromSeq: expectedFrom,
517
+ },
518
+ };
519
+ }
520
+ // 5. durable accept(§9.4 规则 6 前半):先落 receipt 再由调用方 dispatch。
521
+ const receipt = {
522
+ deliveryKey: input.deliveryKey,
523
+ stableTurnId: input.deliveryKey,
524
+ inputHash: input.inputHash,
525
+ fromSeq: input.fromSeq,
526
+ toSeq: input.toSeq,
527
+ final: input.final === true,
528
+ responseMode: input.responseMode,
529
+ sinkOwnerGeneration: projection.sinkOwnerGeneration,
530
+ status: 'accepted',
531
+ receiverBootId: input.receiverBootId,
532
+ workerGeneration: 0,
533
+ dispatchAttempt: 0,
534
+ ambiguousReplayCount: 0,
535
+ createdAt: now,
536
+ updatedAt: now,
537
+ };
538
+ stream.receipts[input.deliveryKey] = receipt;
539
+ stream.activeDeliveryKey = input.deliveryKey;
540
+ stream.updatedAt = now;
541
+ return {
542
+ result: {
543
+ kind: 'accepted',
544
+ receipt,
545
+ receiverCommittedThrough: stream.receiverCommittedThrough,
546
+ },
547
+ write: state,
548
+ };
549
+ });
550
+ }
551
+ function transitionReceipt(dataDir, key, now, fn) {
552
+ return mutateState(dataDir, key.listenerAppId, key.meetingId, { createIfMissing: false, now }, (state) => {
553
+ const stream = state?.streams[streamKey(key.memberId, key.memberEpoch)];
554
+ if (!state || !stream)
555
+ return { result: { ok: false, reason: 'unknown_stream' } };
556
+ const receipt = stream.receipts[key.deliveryKey];
557
+ if (!receipt)
558
+ return { result: { ok: false, reason: 'unknown_receipt' } };
559
+ const result = fn(stream, receipt);
560
+ if (result.ok && !result.noop) {
561
+ receipt.updatedAt = now;
562
+ stream.updatedAt = now;
563
+ return { result, write: state };
564
+ }
565
+ return { result };
566
+ });
567
+ }
568
+ /**
569
+ * accepted / ambiguous / failed_* → dispatched。每次调用代表一次真实派发:
570
+ * dispatchAttempt+1,记录当前 receiverBootId / workerGeneration(§9.5)。
571
+ * 重试预算由调用方掌握;store 只保证转移合法并如实记账。
572
+ */
573
+ export function markVcMeetingDeliveryDispatched(dataDir, key, input, now = Date.now()) {
574
+ return transitionReceipt(dataDir, key, now, (stream, receipt) => {
575
+ if (receipt.status === 'dispatched') {
576
+ return { ok: false, reason: 'already_dispatched', receipt };
577
+ }
578
+ if (receipt.status !== 'accepted' && receipt.status !== 'ambiguous'
579
+ && receipt.status !== 'failed_retryable' && receipt.status !== 'failed_terminal') {
580
+ return { ok: false, reason: 'invalid_transition', receipt };
581
+ }
582
+ if (stream.abandoned)
583
+ return { ok: false, reason: 'stream_abandoned', receipt };
584
+ receipt.status = 'dispatched';
585
+ receipt.receiverBootId = input.receiverBootId;
586
+ receipt.workerGeneration = input.workerGeneration;
587
+ receipt.dispatchAttempt += 1;
588
+ receipt.dispatchedAt = now;
589
+ delete receipt.manualRetryAuthorizedAtAttempt;
590
+ delete receipt.errorCode;
591
+ return { ok: true, receipt, receiverCommittedThrough: stream.receiverCommittedThrough };
592
+ });
593
+ }
594
+ /**
595
+ * turn_terminal(completed) → 原子写 completed + 推进 receiverCommittedThrough
596
+ * 到 toSeq(§9.4 规则 7)。携带 workerGeneration / dispatchAttempt 时校验与
597
+ * receipt 记录一致——旧派发的迟到 terminal 不得结算新派发(§9.5)。
598
+ * ambiguous → completed 仅在世代匹配时允许(terminal 在重启判定后迟到)。
599
+ */
600
+ export function completeVcMeetingDelivery(dataDir, key, input = {}, now = Date.now()) {
601
+ return transitionReceipt(dataDir, key, now, (stream, receipt) => {
602
+ if (receipt.status === 'completed') {
603
+ // 幂等:重复 terminal 不再改状态。
604
+ return { ok: true, receipt, receiverCommittedThrough: stream.receiverCommittedThrough, noop: true };
605
+ }
606
+ if (receipt.status !== 'dispatched' && receipt.status !== 'ambiguous') {
607
+ return { ok: false, reason: 'invalid_transition', receipt };
608
+ }
609
+ if (input.dispatchAttempt !== undefined && input.dispatchAttempt !== receipt.dispatchAttempt) {
610
+ return { ok: false, reason: 'stale_dispatch_attempt', receipt };
611
+ }
612
+ if (input.workerGeneration !== undefined && input.workerGeneration !== receipt.workerGeneration) {
613
+ return { ok: false, reason: 'stale_worker_generation', receipt };
614
+ }
615
+ if (receipt.status === 'ambiguous'
616
+ && (input.dispatchAttempt === undefined || input.workerGeneration === undefined)) {
617
+ // ambiguous 的迟到 terminal 必须自证来自哪次派发,否则不能结算。
618
+ return { ok: false, reason: 'invalid_transition', receipt };
619
+ }
620
+ receipt.status = 'completed';
621
+ stream.receiverCommittedThrough = receipt.toSeq;
622
+ if (stream.activeDeliveryKey === receipt.deliveryKey)
623
+ delete stream.activeDeliveryKey;
624
+ return { ok: true, receipt, receiverCommittedThrough: stream.receiverCommittedThrough };
625
+ });
626
+ }
627
+ /**
628
+ * dispatched(或 accepted:dispatch 前同步失败)→ failed_retryable / failed_terminal。
629
+ * cursor 不动,activeDeliveryKey 保留——同 key 重派(§9.4 规则 9)。
630
+ *
631
+ * 无证据(workerGeneration / dispatchAttempt 均缺席)的 fail 只允许从
632
+ * accepted 转移:它只可能来自「dispatch 前同步失败」。同 key 的并发派发里,
633
+ * 另一路可能已经 markDispatched 在飞——一份不带世代证据的失败上报无权
634
+ * 打掉 in-flight 派发(否则其 terminal 到达时 invalid_transition,触发
635
+ * 一轮多余的 hub 重发)。
636
+ */
637
+ export function failVcMeetingDelivery(dataDir, key, input, now = Date.now()) {
638
+ return transitionReceipt(dataDir, key, now, (stream, receipt) => {
639
+ if (receipt.status !== 'dispatched' && receipt.status !== 'accepted' && receipt.status !== 'ambiguous'
640
+ && !(receipt.status === 'failed_retryable' && input.kind === 'terminal')
641
+ && !(receipt.status === 'failed_terminal' && input.kind === 'terminal' && input.pauseStream)) {
642
+ return { ok: false, reason: 'invalid_transition', receipt };
643
+ }
644
+ if (input.workerGeneration === undefined && input.dispatchAttempt === undefined
645
+ && receipt.status !== 'accepted') {
646
+ return { ok: false, reason: 'invalid_transition', receipt };
647
+ }
648
+ if (input.dispatchAttempt !== undefined && input.dispatchAttempt !== receipt.dispatchAttempt) {
649
+ return { ok: false, reason: 'stale_dispatch_attempt', receipt };
650
+ }
651
+ if (input.workerGeneration !== undefined && input.workerGeneration !== receipt.workerGeneration) {
652
+ return { ok: false, reason: 'stale_worker_generation', receipt };
653
+ }
654
+ receipt.status = input.kind === 'retryable' ? 'failed_retryable' : 'failed_terminal';
655
+ if (input.errorCode)
656
+ receipt.errorCode = input.errorCode;
657
+ if (input.pauseStream) {
658
+ if (input.kind !== 'terminal')
659
+ return { ok: false, reason: 'invalid_transition', receipt };
660
+ stream.poisoned = {
661
+ deliveryKey: receipt.deliveryKey,
662
+ at: now,
663
+ reason: input.errorCode ?? 'retry_budget_exhausted',
664
+ };
665
+ }
666
+ return { ok: true, receipt, receiverCommittedThrough: stream.receiverCommittedThrough };
667
+ });
668
+ }
669
+ /**
670
+ * Authorize exactly one additional dispatch of a poison head. The envelope is
671
+ * not stored for privacy, so the hub must re-POST the same deliveryKey/hash
672
+ * after this transition. The authorization is durable and consumed atomically
673
+ * by markVcMeetingDeliveryDispatched.
674
+ */
675
+ export function authorizeVcMeetingDeliveryManualRetry(dataDir, key, now = Date.now()) {
676
+ return transitionReceipt(dataDir, key, now, (stream, receipt) => {
677
+ if (stream.abandoned)
678
+ return { ok: false, reason: 'stream_abandoned', receipt };
679
+ if (!stream.poisoned || stream.poisoned.deliveryKey !== receipt.deliveryKey) {
680
+ return { ok: false, reason: 'stream_not_poisoned', receipt };
681
+ }
682
+ if (receipt.status !== 'failed_terminal') {
683
+ return { ok: false, reason: 'invalid_transition', receipt };
684
+ }
685
+ receipt.manualRetryAuthorizedAtAttempt = receipt.dispatchAttempt;
686
+ delete stream.poisoned;
687
+ return { ok: true, receipt, receiverCommittedThrough: stream.receiverCommittedThrough };
688
+ });
689
+ }
690
+ /** dispatched → ambiguous(lease 到期 / worker 丢失,§10.3)。审计计数 +1。 */
691
+ export function markVcMeetingDeliveryAmbiguous(dataDir, key, input = {}, now = Date.now()) {
692
+ return transitionReceipt(dataDir, key, now, (stream, receipt) => {
693
+ if (receipt.status === 'ambiguous') {
694
+ return { ok: true, receipt, receiverCommittedThrough: stream.receiverCommittedThrough, noop: true };
695
+ }
696
+ if (receipt.status !== 'dispatched') {
697
+ return { ok: false, reason: 'invalid_transition', receipt };
698
+ }
699
+ if (input.dispatchAttempt !== undefined && input.dispatchAttempt !== receipt.dispatchAttempt) {
700
+ return { ok: false, reason: 'stale_dispatch_attempt', receipt };
701
+ }
702
+ if (input.workerGeneration !== undefined && input.workerGeneration !== receipt.workerGeneration) {
703
+ return { ok: false, reason: 'stale_worker_generation', receipt };
704
+ }
705
+ receipt.status = 'ambiguous';
706
+ receipt.ambiguousReplayCount += 1;
707
+ return { ok: true, receipt, receiverCommittedThrough: stream.receiverCommittedThrough };
708
+ });
709
+ }
710
+ /**
711
+ * 人工放弃整条 stream(§10.3 manual abandon):非终态 active receipt →
712
+ * abandoned,写耐久 AbandonedStream 标记;cursor 不动、不篡改。该 epoch 此后
713
+ * 拒绝一切新 delivery,继续只能走新 epoch + from-now。
714
+ */
715
+ export function abandonVcMeetingDeliveryStream(dataDir, key, input = {}, now = Date.now()) {
716
+ return mutateState(dataDir, key.listenerAppId, key.meetingId, { createIfMissing: false, now }, (state) => {
717
+ const stream = state?.streams[streamKey(key.memberId, key.memberEpoch)];
718
+ if (!state || !stream)
719
+ return { result: { ok: false, reason: 'unknown_stream' } };
720
+ if (stream.abandoned)
721
+ return { result: { ok: true, stream } };
722
+ stream.abandoned = { at: now, ...(input.reason ? { reason: input.reason } : {}) };
723
+ if (stream.activeDeliveryKey) {
724
+ const active = stream.receipts[stream.activeDeliveryKey];
725
+ if (active && !TERMINAL_RECEIPT_STATUSES.has(active.status)) {
726
+ active.status = 'abandoned';
727
+ active.updatedAt = now;
728
+ }
729
+ delete stream.activeDeliveryKey;
730
+ }
731
+ stream.updatedAt = now;
732
+ return { result: { ok: true, stream }, write: state };
733
+ });
734
+ }
735
+ /**
736
+ * daemon 启动时调用:本 agent 名下所有「dispatched 且 receiverBootId != 当前
737
+ * boot」的 receipt 判为 ambiguous(旧世代无 terminal,§9.5),允许同 key 重派。
738
+ * accepted 未派发的保持 accepted——从未进过 worker,直接派发即可。
739
+ *
740
+ * agentAppId 是硬 scope:dataDir 在多 bot 部署下是全 daemon 进程共享的
741
+ * (SESSION_DATA_DIR / 包内默认目录),一场会议里其它 agent bot 的 in-flight
742
+ * receipt 也躺在同一批文件里。只处理 projection.agentAppId 归属本 daemon 的
743
+ * stream,否则任何一个 bot 重启都会把别的 bot 正在飞的派发误标 ambiguous。
744
+ * 找不到对应 projection 的 stream 一律不动——没有归属证据就没有处置权。
745
+ */
746
+ export function reconcileVcMeetingDeliveriesOnBoot(dataDir, input, now = Date.now()) {
747
+ const dir = join(dataDir, DIR_NAME);
748
+ if (!existsSync(dir))
749
+ return [];
750
+ const affected = [];
751
+ for (const name of readdirSync(dir)) {
752
+ if (!name.endsWith('.json'))
753
+ continue;
754
+ const fp = join(dir, name);
755
+ withFileLockSync(fp, () => {
756
+ const state = readStateFileForMutation(fp);
757
+ if (!state)
758
+ return;
759
+ let changed = false;
760
+ for (const stream of Object.values(state.streams)) {
761
+ const projection = state.members[stream.memberId]?.projections[String(stream.memberEpoch)];
762
+ if (projection?.agentAppId !== input.agentAppId)
763
+ continue;
764
+ const active = stream.activeDeliveryKey ? stream.receipts[stream.activeDeliveryKey] : undefined;
765
+ if (!active || active.status !== 'dispatched')
766
+ continue;
767
+ if (active.receiverBootId === input.receiverBootId)
768
+ continue;
769
+ active.status = 'ambiguous';
770
+ active.ambiguousReplayCount += 1;
771
+ active.updatedAt = now;
772
+ stream.updatedAt = now;
773
+ changed = true;
774
+ affected.push({
775
+ listenerAppId: stream.listenerAppId,
776
+ meetingId: stream.meetingId,
777
+ memberId: stream.memberId,
778
+ memberEpoch: stream.memberEpoch,
779
+ deliveryKey: active.deliveryKey,
780
+ receiverSessionId: stream.receiverSessionId,
781
+ workerGeneration: active.workerGeneration,
782
+ dispatchAttempt: active.dispatchAttempt,
783
+ ambiguousReplayCount: active.ambiguousReplayCount,
784
+ });
785
+ }
786
+ if (changed)
787
+ writeStateFile(fp, state, now);
788
+ });
789
+ }
790
+ return affected;
791
+ }
792
+ /**
793
+ * 运行期 lease 到期扫描(§10.3):本 agent 名下「dispatched 且距最近一次
794
+ * markDispatched 超过 leaseMs」的 receipt 转 ambiguous——覆盖 worker 活着但
795
+ * turn 永远不 terminal 的卡流(submit 静默失败、CLI 卡死等 boot reconcile
796
+ * 与 exit 回调都到不了的场景)。daemon watchdog 周期调用。
797
+ *
798
+ * - agent scope 同 reconcileOnBoot:只处理 projection.agentAppId 匹配的
799
+ * stream,共享 dataDir 下不越权处置别的 bot 的在途派发。
800
+ * - 锁内读到的 workerGeneration / dispatchAttempt 即本次到期处置的对象;
801
+ * 转移后同 key 重派会 bump attempt,旧派发的迟到 terminal 被世代证据拒。
802
+ * - 幂等:已 ambiguous / 已 terminal / 未到期 / 别的 agent 一律不动,
803
+ * 重复调用返回空增量。
804
+ * - lease 时间锚 = dispatchedAt(老记录缺席时以 updatedAt 兜底——dispatched
805
+ * 期间没有其它转移刷新它,两者等价)。
806
+ */
807
+ export function expireVcMeetingDeliveryLeases(dataDir, input, now = Date.now()) {
808
+ if (!Number.isFinite(input.leaseMs) || input.leaseMs <= 0 || !input.agentAppId.trim())
809
+ return [];
810
+ const dir = join(dataDir, DIR_NAME);
811
+ if (!existsSync(dir))
812
+ return [];
813
+ const affected = [];
814
+ for (const name of readdirSync(dir)) {
815
+ if (!name.endsWith('.json'))
816
+ continue;
817
+ const fp = join(dir, name);
818
+ withFileLockSync(fp, () => {
819
+ const state = readStateFileForMutation(fp);
820
+ if (!state)
821
+ return;
822
+ let changed = false;
823
+ for (const stream of Object.values(state.streams)) {
824
+ const projection = state.members[stream.memberId]?.projections[String(stream.memberEpoch)];
825
+ if (projection?.agentAppId !== input.agentAppId)
826
+ continue;
827
+ const active = stream.activeDeliveryKey ? stream.receipts[stream.activeDeliveryKey] : undefined;
828
+ if (!active || active.status !== 'dispatched')
829
+ continue;
830
+ const anchoredAt = active.dispatchedAt ?? active.updatedAt;
831
+ if (now - anchoredAt <= input.leaseMs)
832
+ continue;
833
+ active.status = 'ambiguous';
834
+ active.ambiguousReplayCount += 1;
835
+ active.updatedAt = now;
836
+ stream.updatedAt = now;
837
+ changed = true;
838
+ affected.push({
839
+ listenerAppId: stream.listenerAppId,
840
+ meetingId: stream.meetingId,
841
+ memberId: stream.memberId,
842
+ memberEpoch: stream.memberEpoch,
843
+ deliveryKey: active.deliveryKey,
844
+ receiverSessionId: stream.receiverSessionId,
845
+ workerGeneration: active.workerGeneration,
846
+ dispatchAttempt: active.dispatchAttempt,
847
+ ambiguousReplayCount: active.ambiguousReplayCount,
848
+ });
849
+ }
850
+ if (changed)
851
+ writeStateFile(fp, state, now);
852
+ });
853
+ }
854
+ return affected;
855
+ }
856
+ // ─── 查询与清理 ──────────────────────────────────────────────────────────────
857
+ export function getVcMeetingDeliveryReceipt(dataDir, key, deliveryKey) {
858
+ const state = readStateFile(meetingFilePath(dataDir, key.listenerAppId, key.meetingId));
859
+ const stream = state?.streams[streamKey(key.memberId, key.memberEpoch)];
860
+ const receipt = stream?.receipts[deliveryKey];
861
+ if (!stream || !receipt)
862
+ return undefined;
863
+ return { receipt, receiverCommittedThrough: stream.receiverCommittedThrough };
864
+ }
865
+ export function getVcMeetingReceiverStream(dataDir, key) {
866
+ const state = readStateFile(meetingFilePath(dataDir, key.listenerAppId, key.meetingId));
867
+ return state?.streams[streamKey(key.memberId, key.memberEpoch)];
868
+ }
869
+ /**
870
+ * 按 deliveryKey 全局反查 receipt——`GET /deliveries/:deliveryKey` 与
871
+ * `turn_terminal(sessionId, turnId=deliveryKey)` 都只有 key 没有 member
872
+ * tuple,daemon 需要反查出要推进哪条 stream。deliveryKey 的派生含
873
+ * meeting/member/epoch(§9.3),全局唯一,首个命中即答案。
874
+ *
875
+ * terminal 路径传 `receiverSessionId` 做绑定校验:key 命中但 session 不符
876
+ * 返回 undefined(宁可 ambiguous 也不结算错流)。线性扫描短 TTL metadata
877
+ * 文件,量级 = 活跃会议数;需要时后续再加索引。
878
+ */
879
+ export function findVcMeetingDeliveryByKey(dataDir, deliveryKey, opts = {}) {
880
+ if (!deliveryKey.trim())
881
+ return undefined;
882
+ const dir = join(dataDir, DIR_NAME);
883
+ if (!existsSync(dir))
884
+ return undefined;
885
+ for (const name of readdirSync(dir)) {
886
+ if (!name.endsWith('.json'))
887
+ continue;
888
+ const state = readStateFile(join(dir, name));
889
+ if (!state)
890
+ continue;
891
+ for (const stream of Object.values(state.streams)) {
892
+ const receipt = stream.receipts[deliveryKey];
893
+ if (!receipt)
894
+ continue;
895
+ if (opts.receiverSessionId !== undefined && stream.receiverSessionId !== opts.receiverSessionId) {
896
+ return undefined;
897
+ }
898
+ return {
899
+ memberKey: {
900
+ listenerAppId: stream.listenerAppId,
901
+ meetingId: stream.meetingId,
902
+ memberId: stream.memberId,
903
+ memberEpoch: stream.memberEpoch,
904
+ },
905
+ receiverSessionId: stream.receiverSessionId,
906
+ receipt,
907
+ receiverCommittedThrough: stream.receiverCommittedThrough,
908
+ };
909
+ }
910
+ }
911
+ return undefined;
912
+ }
913
+ /**
914
+ * Enumerate the non-terminal stream heads bound to one receiver session.
915
+ *
916
+ * Worker exit handling uses this reverse lookup because the exit signal carries
917
+ * a session id (and worker generation), not the meeting/member tuple. Only the
918
+ * durable `activeDeliveryKey` is considered: completed/abandoned receipts have
919
+ * released the stream head and must never be made ambiguous by a later worker
920
+ * exit. The caller still filters by receipt status/generation before applying a
921
+ * transition (for example, only `dispatched` receipts can become ambiguous).
922
+ */
923
+ export function listActiveVcMeetingDeliveriesForSession(dataDir, receiverSessionId) {
924
+ if (!receiverSessionId.trim())
925
+ return [];
926
+ const dir = join(dataDir, DIR_NAME);
927
+ if (!existsSync(dir))
928
+ return [];
929
+ const out = [];
930
+ for (const name of readdirSync(dir)) {
931
+ if (!name.endsWith('.json'))
932
+ continue;
933
+ const state = readStateFile(join(dir, name));
934
+ if (!state)
935
+ continue;
936
+ for (const stream of Object.values(state.streams)) {
937
+ if (stream.receiverSessionId !== receiverSessionId || !stream.activeDeliveryKey)
938
+ continue;
939
+ const receipt = stream.receipts[stream.activeDeliveryKey];
940
+ if (!receipt || TERMINAL_RECEIPT_STATUSES.has(receipt.status))
941
+ continue;
942
+ out.push({
943
+ memberKey: {
944
+ listenerAppId: stream.listenerAppId,
945
+ meetingId: stream.meetingId,
946
+ memberId: stream.memberId,
947
+ memberEpoch: stream.memberEpoch,
948
+ },
949
+ receiverSessionId: stream.receiverSessionId,
950
+ receipt,
951
+ receiverCommittedThrough: stream.receiverCommittedThrough,
952
+ });
953
+ }
954
+ }
955
+ return out.sort((a, b) => a.memberKey.listenerAppId.localeCompare(b.memberKey.listenerAppId)
956
+ || a.memberKey.meetingId.localeCompare(b.memberKey.meetingId)
957
+ || a.memberKey.memberId.localeCompare(b.memberKey.memberId)
958
+ || a.memberKey.memberEpoch - b.memberKey.memberEpoch
959
+ || a.receipt.deliveryKey.localeCompare(b.receipt.deliveryKey));
960
+ }
961
+ /**
962
+ * 按 receiverSessionId 全局反查「当前有效」的 membership projection——
963
+ * status === 'active' 且 memberEpoch 是该 member 的最新 epoch(换代后旧 epoch
964
+ * 的投影残留不算数)。daemon 用它判断一个 botmux 会话是否绑定为 durable
965
+ * meeting consumer(例如 silent responseMode 下对 `botmux send` 强制拒发)。
966
+ *
967
+ * 返回数组而非单条:MA-P0 的 chat-scope 兼容会话可能被先后多场会议复用,
968
+ * TTL 清理前同一 session 可挂多个 active projection;调用方按 responseMode
969
+ * 自行归并判断。只读、无锁(与其它读路径一致的快照语义)。
970
+ */
971
+ export function listVcMeetingActiveProjectionsForReceiverSession(dataDir, receiverSessionId) {
972
+ if (!receiverSessionId.trim())
973
+ return [];
974
+ const dir = join(dataDir, DIR_NAME);
975
+ if (!existsSync(dir))
976
+ return [];
977
+ const out = [];
978
+ for (const name of readdirSync(dir)) {
979
+ if (!name.endsWith('.json'))
980
+ continue;
981
+ const state = readStateFile(join(dir, name));
982
+ if (!state)
983
+ continue;
984
+ for (const member of Object.values(state.members)) {
985
+ const current = member.projections[String(member.maxKnownEpoch)];
986
+ if (!current || current.status !== 'active')
987
+ continue;
988
+ if (current.receiverSessionId !== receiverSessionId)
989
+ continue;
990
+ out.push(current);
991
+ }
992
+ }
993
+ return out.sort((a, b) => a.listenerAppId.localeCompare(b.listenerAppId)
994
+ || a.meetingId.localeCompare(b.meetingId)
995
+ || a.memberId.localeCompare(b.memberId)
996
+ || a.memberEpoch - b.memberEpoch);
997
+ }
998
+ /**
999
+ * TTL 清理:整场会议粒度删除。保留期下限由调用方保证 ≥
1000
+ * max(hub assignment TTL, meeting runtime TTL, sender retry horizon) + 时钟偏移
1001
+ * (§9.3)——低于该值 GET 404 会被误当 never-accept 证据。
1002
+ */
1003
+ export function pruneVcMeetingDeliveryState(dataDir, input, now = Date.now()) {
1004
+ const dir = join(dataDir, DIR_NAME);
1005
+ if (!existsSync(dir))
1006
+ return 0;
1007
+ let removed = 0;
1008
+ for (const name of readdirSync(dir)) {
1009
+ if (!name.endsWith('.json'))
1010
+ continue;
1011
+ const fp = join(dir, name);
1012
+ withFileLockSync(fp, () => {
1013
+ const state = readStateFile(fp);
1014
+ if (!state)
1015
+ return;
1016
+ if (now - state.updatedAt <= input.ttlMs)
1017
+ return;
1018
+ rmSync(fp, { force: true });
1019
+ removed += 1;
1020
+ });
1021
+ }
1022
+ return removed;
1023
+ }
1024
+ //# sourceMappingURL=vc-meeting-delivery-store.js.map