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
@@ -28,6 +28,7 @@ import { botLocale, localeForBot, t as tr } from '../i18n/index.js';
28
28
  import { claudeJsonlPathForSession } from '../adapters/cli/claude-code.js';
29
29
  import { findUniqueClaudeSessionByCwd } from './session-discovery.js';
30
30
  import { buildMarkdownCard, buildContextualReplyCard } from '../im/lark/md-card.js';
31
+ import { renderBrandTemplate } from '../im/lark/brand-template.js';
31
32
  import { replyToDocComment, chunkCommentText, unsubscribeDocFile, removeCommentReaction } from '../im/lark/doc-comment.js';
32
33
  import { listDocSubscriptionsForSession, removeDocSubscription } from '../services/doc-subs-store.js';
33
34
  import { TmuxBackend } from '../adapters/backend/tmux-backend.js';
@@ -39,6 +40,9 @@ import { getBot, getAllBots, resolveBrandLabel } from '../bot-registry.js';
39
40
  * isolated persistent panes so a suspend→resume reattach (same id) is
40
41
  * distinguishable from a pane surviving a daemon restart (different id). */
41
42
  const DAEMON_BOOT_ID = randomUUID();
43
+ export function getDaemonBootId() {
44
+ return DAEMON_BOOT_ID;
45
+ }
42
46
  function daemonCardLocalHomeLinkMode(ds) {
43
47
  // The daemon is outside file/read isolation. Never use its host namespace
44
48
  // to disambiguate isolated or remote output; lexical repair performs no
@@ -62,11 +66,15 @@ import { emitSessionLifecycleHook, emitSessionStateTransitionHook } from '../ser
62
66
  import { anchorUsageForDaemonSession, recordOwnershipForDaemonSession, recordUsageForDaemonSession, reconcileUsageForDaemonSession } from '../services/usage-ledger.js';
63
67
  import { isStructuredBridgeAdoptCli } from '../services/structured-bridge-clis.js';
64
68
  import { ensureGatewayEntry } from './plugins/mcp/gateway-installer.js';
65
- import { sessionKey, sessionAnchorId, isDocNativeSession } from './types.js';
69
+ import { activeSessionKey, sessionKey, sessionAnchorId, isDocNativeSession } from './types.js';
66
70
  import { DONE_REACTION_EMOJI_TYPE } from './pending-response.js';
67
71
  import { buildTerminalUrl } from './terminal-url.js';
68
72
  import { prependBotmuxBin } from './botmux-wrapper.js';
69
73
  import { usageLimitStateKey } from '../utils/cli-usage-limit.js';
74
+ import { evaluateVcMeetingManagedSend, resolveVcMeetingImTurnOrigin, } from '../services/vc-meeting-send-policy.js';
75
+ import { finishVcMeetingImReply, prepareVcMeetingDeliveryReply, prepareVcMeetingImReply, } from '../services/vc-meeting-im-reply.js';
76
+ import { neutralizeLarkAtTags } from '../services/send-policy.js';
77
+ import { recordVcMeetingListenerMessage } from '../services/vc-meeting-listener-message-store.js';
70
78
  import { isLocalCliOpenEnabled, isLocalCliOpenReady } from '../services/local-cli-opener.js';
71
79
  const __filename = fileURLToPath(import.meta.url);
72
80
  const __dirname = dirname(__filename);
@@ -365,6 +373,11 @@ export function cardUsageLimit(ds) {
365
373
  return ds.lastScreenStatus === 'limited' ? ds.usageLimit : undefined;
366
374
  }
367
375
  function scheduleUsageLimitCardPatch(ds) {
376
+ // Dedicated VC receivers keep limit state for dashboard/audit only. A timer
377
+ // must never revive or mutate an old/manual Lark card after the synchronous
378
+ // screen_update path has already suppressed auxiliary UI.
379
+ if (ds.session.vcMeetingReceiver)
380
+ return;
368
381
  if (ds.lastScreenStatus !== 'limited')
369
382
  return;
370
383
  const port = ds.workerPort ?? ds.session.webPort;
@@ -520,6 +533,10 @@ export function recallFrozenCards(ds) {
520
533
  * that so the card keeps live-patching afterwards even when the bot opted out.
521
534
  */
522
535
  export async function postFreshStreamingCard(ds, sessionReply) {
536
+ // Receiver terminals can contain meeting-derived private context. Never
537
+ // publish one into the listener chat as a streaming-card side channel.
538
+ if (ds.session.vcMeetingReceiver)
539
+ return false;
523
540
  if (isDocNativeSession(ds))
524
541
  return false;
525
542
  const port = ds.workerPort ?? ds.session.webPort;
@@ -1006,6 +1023,11 @@ export function ensureClaudeFolderTrust(workingDir, stateJsonPath = join(homedir
1006
1023
  // ─── Kill worker ────────────────────────────────────────────────────────────
1007
1024
  export function killWorker(ds) {
1008
1025
  clearUsageLimitState(ds);
1026
+ // A managed-turn capability belongs to one concrete worker generation.
1027
+ // Retiring (or observing the absence of) that generation must revoke the
1028
+ // daemon-side copy synchronously; the worker may never get a chance to send
1029
+ // its ordered revoke IPC on close/crash paths.
1030
+ ds.managedTurnOrigin = undefined;
1009
1031
  if (!ds.worker || ds.worker.killed) {
1010
1032
  // No live worker to receive {type:'close'}, so its destroySession() — which
1011
1033
  // tears down the persistent backing session (tmux/herdr/zellij) — never
@@ -1030,6 +1052,7 @@ export function killWorker(ds) {
1030
1052
  ds.worker = null;
1031
1053
  ds.workerPort = null;
1032
1054
  ds.workerToken = null;
1055
+ ds.workerViewToken = null;
1033
1056
  }
1034
1057
  /**
1035
1058
  * Tear down a persistent backing session (tmux/herdr/zellij) directly from the
@@ -1098,8 +1121,11 @@ function reclaimParkedCrashDiagnostic(ds) {
1098
1121
  catch { /* absent — benign */ }
1099
1122
  }
1100
1123
  export function suspendWorker(ds, reason = 'suspended_idle') {
1101
- if (!ds.worker || ds.worker.killed)
1124
+ if (!ds.worker || ds.worker.killed) {
1125
+ // There is no live generation that can still own this capability.
1126
+ ds.managedTurnOrigin = undefined;
1102
1127
  return false;
1128
+ }
1103
1129
  if (!isSuspendableBackendType(ds.initConfig?.backendType))
1104
1130
  return false;
1105
1131
  const w = ds.worker;
@@ -1116,6 +1142,8 @@ export function suspendWorker(ds, reason = 'suspended_idle') {
1116
1142
  ds.worker = null;
1117
1143
  ds.workerPort = null;
1118
1144
  ds.workerToken = null;
1145
+ ds.workerViewToken = null;
1146
+ ds.managedTurnOrigin = undefined;
1119
1147
  // Screen state describes the process we just stopped. Keeping it would make
1120
1148
  // the dashboard hydrate this process-less logical session as idle/working.
1121
1149
  ds.lastScreenStatus = undefined;
@@ -1212,7 +1240,7 @@ export async function closeSession(sessionId) {
1212
1240
  catch (err) {
1213
1241
  logger.warn(`[doc-comment] cleanup on close failed for ${sessionId.slice(0, 8)}: ${err?.message ?? err}`);
1214
1242
  }
1215
- activeSessionsRegistry?.delete(sessionKey(sessionAnchorId(ds), ds.larkAppId));
1243
+ activeSessionsRegistry?.delete(activeSessionKey(ds));
1216
1244
  killedLive = true;
1217
1245
  if (!ds.exitEventEmitted) {
1218
1246
  ds.exitEventEmitted = true;
@@ -1341,6 +1369,8 @@ targetScope, opts) {
1341
1369
  const ds = findActiveBySessionId(sessionId);
1342
1370
  if (!ds)
1343
1371
  return { ok: false, error: 'session_not_active' };
1372
+ if (ds.session.vcMeetingReceiver)
1373
+ return { ok: false, error: 'vc_receiver_not_relayable' };
1344
1374
  // Anchor-based identity. A thread-scope session in the SAME chat (different
1345
1375
  // root) is a legitimate cross-topic move, so we refuse only when the target
1346
1376
  // anchor equals the source anchor (relaying a session onto itself). Replaces
@@ -1525,16 +1555,21 @@ function codexAppInputForSession(ds, input, turnId) {
1525
1555
  /** Send one normal (non-raw) worker turn while applying the per-bot Codex App
1526
1556
  * clean-input gate at message acceptance time. This freezes the sidecar onto
1527
1557
  * the IPC item, so later config flips do not mutate an already queued turn. */
1528
- export function sendWorkerInput(ds, payload, turnId) {
1558
+ export function sendWorkerInput(ds, payload, turnId, opts = {}) {
1529
1559
  if (!ds.worker || ds.worker.killed)
1530
1560
  return false;
1531
1561
  const normalized = typeof payload === 'string' ? { content: payload } : payload;
1532
1562
  const codexAppInput = codexAppInputForSession(ds, normalized.codexAppInput, turnId);
1563
+ const vcMeetingImTurnOrigin = resolveVcMeetingImTurnOrigin(ds.session, turnId);
1533
1564
  ds.worker.send({
1534
1565
  type: 'message',
1535
1566
  content: normalized.content,
1536
1567
  ...(codexAppInput ? { codexAppInput } : {}),
1537
1568
  ...(turnId ? { turnId } : {}),
1569
+ ...(opts.dispatchAttempt !== undefined ? { dispatchAttempt: opts.dispatchAttempt } : {}),
1570
+ ...(vcMeetingImTurnOrigin
1571
+ ? { vcMeetingImTurnOrigin }
1572
+ : {}),
1538
1573
  });
1539
1574
  return true;
1540
1575
  }
@@ -1559,16 +1594,26 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
1559
1594
  const t = tag(ds);
1560
1595
  let resume = false;
1561
1596
  let initTurnId;
1597
+ let initDispatchAttempt;
1562
1598
  if (typeof resumeOrTurnId === 'string') {
1563
1599
  initTurnId = resumeOrTurnId;
1564
1600
  }
1565
1601
  else if (typeof resumeOrTurnId === 'object' && resumeOrTurnId !== null) {
1566
1602
  resume = resumeOrTurnId.resume === true;
1567
1603
  initTurnId = resumeOrTurnId.turnId;
1604
+ initDispatchAttempt = resumeOrTurnId.dispatchAttempt;
1568
1605
  }
1569
1606
  else {
1570
1607
  resume = resumeOrTurnId;
1571
1608
  }
1609
+ // An empty prompt is a pure worker reattach/restore, not a newly accepted
1610
+ // user turn. Never inherit the previous reply target in that case: doing so
1611
+ // would re-publish stale per-turn authority (notably an explicit meeting IM
1612
+ // origin) into a fresh worker lifetime after a daemon restart. Non-empty
1613
+ // prompts keep the historical fallback for callers that accepted a turn
1614
+ // before they learned to pass its id explicitly.
1615
+ const initAttributionTurnId = initTurnId
1616
+ ?? (prompt.length > 0 ? ds.currentReplyTarget?.turnId : undefined);
1572
1617
  // A fork() whose cwd no longer exists emits an unhandled 'error' (spawn
1573
1618
  // ENOENT) that crashes the WHOLE daemon (→ pm2 crash-loop). Fall back to
1574
1619
  // home so a stale session workingDir can never take the daemon down.
@@ -1637,6 +1682,8 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
1637
1682
  ds.worker = null;
1638
1683
  ds.workerPort = null;
1639
1684
  ds.workerToken = null;
1685
+ ds.workerViewToken = null;
1686
+ ds.managedTurnOrigin = undefined;
1640
1687
  }
1641
1688
  // Re-establishing a worker ends the cold-resume-suspended state: clear the
1642
1689
  // persisted marker so a future restart no longer treats this session's
@@ -1680,7 +1727,9 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
1680
1727
  LARK_APP_SECRET: botCfg.larkAppSecret,
1681
1728
  },
1682
1729
  });
1683
- const startupState = { ready: false, failureNotified: false };
1730
+ const startupState = {
1731
+ ready: false, failureNotified: false, initTurnId, initDispatchAttempt,
1732
+ };
1684
1733
  // A fork-level failure (spawn ENOENT, etc.) emits 'error'; without a handler
1685
1734
  // the unhandled event crashes the daemon. It also happens before worker IPC
1686
1735
  // exists, so this daemon-side branch must be the user-visible fallback.
@@ -1690,13 +1739,23 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
1690
1739
  if (startupState.failureNotified)
1691
1740
  return;
1692
1741
  startupState.failureNotified = true;
1742
+ // A dedicated VC receiver has no auxiliary Lark output channel. Durable
1743
+ // failures stay on the receipt/lease chain, and exact IM turns may only
1744
+ // produce their ledgered final reply — never a fork diagnostic.
1745
+ if (ds.session.vcMeetingReceiver) {
1746
+ logger.info(`[${t}] VC receiver fork failure kept out of auxiliary Lark UI `
1747
+ + `turn=${initTurnId?.slice(0, 12) ?? '-'} attempt=${initDispatchAttempt}: ${reason}`);
1748
+ return;
1749
+ }
1693
1750
  const cliName = getCliDisplayName(agentCfg.cliId);
1694
1751
  const message = tr('worker.start_failed', { cliName, reason }, botLocale(botCfg));
1695
1752
  emitSessionLifecycleHook(ds, 'session.requires_attention', {
1696
1753
  reason: 'worker_fork_error',
1697
1754
  message: reason,
1698
1755
  });
1699
- void cb.sessionReply(sessionAnchorId(ds), message, 'text', ds.larkAppId, fallbackTurnId(ds, initTurnId)).catch(replyErr => logger.error(`[${t}] Failed to deliver worker fork error to Lark: ${replyErr}`));
1756
+ void cb.sessionReply(sessionAnchorId(ds), message, 'text', ds.larkAppId, fallbackTurnId(ds, initTurnId), ds.session.vcMeetingReceiver
1757
+ ? { sourceSessionId: ds.session.sessionId }
1758
+ : undefined).catch(replyErr => logger.error(`[${t}] Failed to deliver worker fork error to Lark: ${replyErr}`));
1700
1759
  });
1701
1760
  // Pipe worker stdout/stderr to daemon logger.
1702
1761
  // Both go through logger.info → daemon.log (not error.log). Worker stderr
@@ -1717,11 +1776,12 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
1717
1776
  }
1718
1777
  });
1719
1778
  // Send init config — use per-bot settings
1720
- const promptCodexAppInput = codexAppInputForSession(ds, promptPayload.codexAppInput, initTurnId ?? ds.currentReplyTarget?.turnId);
1779
+ const promptCodexAppInput = codexAppInputForSession(ds, promptPayload.codexAppInput, initAttributionTurnId);
1721
1780
  const initMsg = {
1722
1781
  type: 'init',
1723
1782
  sessionId: ds.session.sessionId,
1724
1783
  chatId: ds.chatId,
1784
+ chatType: ds.chatType,
1725
1785
  rootMessageId: sessionAnchorId(ds),
1726
1786
  workingDir: cwd,
1727
1787
  cliId: agentCfg.cliId,
@@ -1775,7 +1835,9 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
1775
1835
  botName: bot.botName,
1776
1836
  botOpenId: bot.botOpenId,
1777
1837
  locale: botLocale(botCfg),
1778
- turnId: initTurnId ?? ds.currentReplyTarget?.turnId,
1838
+ turnId: initAttributionTurnId,
1839
+ dispatchAttempt: initDispatchAttempt,
1840
+ vcMeetingImTurnOrigin: resolveVcMeetingImTurnOrigin(ds.session, initAttributionTurnId),
1779
1841
  pluginBindings: botCfg.plugins,
1780
1842
  skillPolicy: botCfg.skills,
1781
1843
  };
@@ -1834,6 +1896,13 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
1834
1896
  function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureNotified: false }) {
1835
1897
  const cb = requireCallbacks();
1836
1898
  const t = tag(ds);
1899
+ const workerGeneration = (ds.workerGeneration ?? 0) + 1;
1900
+ ds.workerGeneration = workerGeneration;
1901
+ // Managed turn authority is issued by one concrete worker lifetime. A
1902
+ // replacement must advertise a fresh capability before daemon-mediated
1903
+ // exits may use it; carrying the old value across a restore/refork would
1904
+ // let stale per-turn authority escape its generation.
1905
+ ds.managedTurnOrigin = undefined;
1837
1906
  // Source authorization belongs to one worker lifetime. A replacement worker
1838
1907
  // must announce its own Hermes sources before any stamped final_output is
1839
1908
  // trusted; `/clear` rebinds within the same lifetime accumulate afterwards.
@@ -1843,14 +1912,59 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
1843
1912
  // Worker messages without a turn of their own (first streaming card, crash
1844
1913
  // notices) anchor to the session's current reply-target turn so a shared
1845
1914
  // fold-back topic keeps them in-thread instead of leaking top-level.
1846
- const scopedReply = (content, msgType, turnId) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId));
1915
+ const scopedReply = (content, msgType, turnId, opts) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId), ds.session.vcMeetingReceiver
1916
+ ? { ...opts, sourceSessionId: ds.session.sessionId }
1917
+ : opts);
1918
+ const ordinaryManagedSuppression = (turnId, dispatchAttempt) => {
1919
+ const armedThrough = turnId ? ds.suppressedFinalOutputTurns?.get(turnId) : undefined;
1920
+ return dispatchAttempt !== undefined
1921
+ && armedThrough !== undefined
1922
+ && dispatchAttempt <= armedThrough;
1923
+ };
1924
+ /** Auxiliary worker UI is never an authorized output channel for a dedicated
1925
+ * VC receiver. Dashboard/audit state is still updated before these guards. */
1926
+ const managedAuxUiSuppressed = (turnId, dispatchAttempt) => {
1927
+ if (ds.session.vcMeetingReceiver)
1928
+ return true;
1929
+ return ordinaryManagedSuppression(turnId, dispatchAttempt);
1930
+ };
1931
+ /** final_output is the sole exception: listener_thread and exact IM replies
1932
+ * may proceed into the durable action ledger; silent/stale attempts do not. */
1933
+ const managedFinalOutputSuppressed = (turnId, dispatchAttempt) => {
1934
+ if (!ds.session.vcMeetingReceiver) {
1935
+ return ordinaryManagedSuppression(turnId, dispatchAttempt);
1936
+ }
1937
+ // Resolve every Lark-facing worker event against durable origin state. The
1938
+ // receipt freezes responseMode, so terminal→idle updates and daemon restore
1939
+ // cannot become loud merely because an in-memory suppression map was
1940
+ // cleared/lost. Missing attribution on a dedicated receiver fails closed.
1941
+ const decision = evaluateVcMeetingManagedSend(config.session.dataDir, {
1942
+ receiverSessionId: ds.session.sessionId,
1943
+ receiverSession: true,
1944
+ turnId,
1945
+ dispatchAttempt,
1946
+ currentImTurnOrigin: resolveVcMeetingImTurnOrigin(ds.session, turnId),
1947
+ allowTerminalReceipt: true,
1948
+ });
1949
+ return !decision.ok;
1950
+ };
1847
1951
  const bot = getBot(ds.larkAppId);
1848
1952
  const botCfg = bot.config;
1849
1953
  const loc = botLocale(botCfg);
1850
- const notifyStartupFailure = async (reason, turnId) => {
1954
+ const notifyStartupFailure = async (reason, turnId, dispatchAttempt) => {
1851
1955
  if (startupState.failureNotified)
1852
1956
  return;
1853
1957
  startupState.failureNotified = true;
1958
+ // A durable VC meeting delivery attempt must not surface its startup/relaunch
1959
+ // failure out-of-band. The worker-generation exit is fenced to the receipt
1960
+ // (marked ambiguous and retried under the side-effect boundary); a direct
1961
+ // sessionReply here would bypass that and could post on a silent delivery.
1962
+ // Ordinary IM turns and non-receiver sessions still notify exactly once.
1963
+ if (managedAuxUiSuppressed(turnId, dispatchAttempt)) {
1964
+ logger.info(`[${t}] VC receiver startup failure kept out of auxiliary Lark UI `
1965
+ + `turn=${turnId?.slice(0, 12) ?? '-'} attempt=${dispatchAttempt}: ${reason}`);
1966
+ return;
1967
+ }
1854
1968
  const cliName = getCliDisplayName(sessionCliId(ds, botCfg));
1855
1969
  const message = tr('worker.start_failed', { cliName, reason }, loc);
1856
1970
  emitSessionLifecycleHook(ds, 'session.requires_attention', {
@@ -1875,12 +1989,13 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
1875
1989
  startupState.ready = true;
1876
1990
  ds.workerPort = msg.port;
1877
1991
  ds.workerToken = msg.token;
1992
+ ds.workerViewToken = msg.viewToken ?? null;
1878
1993
  // Persist port so it can be reused after daemon restart
1879
1994
  ds.session.webPort = msg.port;
1880
1995
  sessionStore.updateSession(ds.session);
1881
1996
  const readOnlyUrl = buildTerminalUrl(ds);
1882
1997
  const writeUrl = buildTerminalUrl(ds, { write: true });
1883
- logger.info(`[${t}] Worker ready, terminal at ${readOnlyUrl}`);
1998
+ logger.info(`[${t}] Worker ready, terminal at ${readOnlyUrl.replace(/\?.*$/, '?viewToken=[redacted]')}`);
1884
1999
  if (ds.usageLimit) {
1885
2000
  ds.lastScreenStatus = 'limited';
1886
2001
  armUsageLimitRetryTimer(ds);
@@ -1893,6 +2008,10 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
1893
2008
  patch: { webPort: msg.port },
1894
2009
  },
1895
2010
  });
2011
+ if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt)) {
2012
+ logger.info(`[${t}] Managed VC receiver — suppressing ready/streaming card output`);
2013
+ break;
2014
+ }
1896
2015
  // Bot opted out of the streaming card: the terminal is up and the
1897
2016
  // final answer will still arrive via `botmux send`; just don't post the
1898
2017
  // live status card. (workerPort/token above are still set so the web
@@ -2096,7 +2215,9 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2096
2215
  // is known, so consumers exclude this session from native parsers
2097
2216
  // before its first positive-delta record exists.
2098
2217
  recordOwnershipForDaemonSession(ds);
2099
- if (!wasLocalCliOpenReady && isLocalCliOpenReady(ds, { cliId: effectiveCliId })) {
2218
+ if (!managedAuxUiSuppressed()
2219
+ && !wasLocalCliOpenReady
2220
+ && isLocalCliOpenReady(ds, { cliId: effectiveCliId })) {
2100
2221
  scheduleLocalCliOpenReadinessPatch(ds);
2101
2222
  }
2102
2223
  break;
@@ -2151,6 +2272,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2151
2272
  queueMicrotask(cb.enforceLiveSessionCap);
2152
2273
  }
2153
2274
  }
2275
+ if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt))
2276
+ break;
2154
2277
  // Bot opted out of the streaming card — dashboard SSE above already got
2155
2278
  // the status patch; just don't touch any Lark card.
2156
2279
  if (streamingCardDisabled(ds))
@@ -2232,6 +2355,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2232
2355
  content: ds.lastScreenContent ?? '',
2233
2356
  });
2234
2357
  persistStreamCardState(ds);
2358
+ if (managedAuxUiSuppressed())
2359
+ break;
2235
2360
  if ((ds.displayMode ?? 'hidden') !== 'screenshot')
2236
2361
  break;
2237
2362
  if (!ds.streamCardId || ds.streamCardId === CARD_POSTING_SENTINEL || !ds.workerPort)
@@ -2269,6 +2394,10 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2269
2394
  // session.title; publishing this prompt description as `patch.title`
2270
2395
  // would temporarily overwrite a user-issued /rename until refresh.
2271
2396
  ds.currentTurnTitle = msg.description;
2397
+ if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt)) {
2398
+ logger.info(`[${t}] Managed VC receiver — TUI prompt kept in dashboard/audit only`);
2399
+ break;
2400
+ }
2272
2401
  try {
2273
2402
  const cardJson = buildTuiPromptCard(sessionAnchorId(ds), ds.session.sessionId, msg.description, msg.options, msg.multiSelect, undefined, loc);
2274
2403
  const cardMsgId = await scopedReply(cardJson, 'interactive', msg.turnId);
@@ -2283,6 +2412,11 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2283
2412
  case 'tui_prompt_resolved': {
2284
2413
  // TUI prompt is no longer showing — update card if it exists
2285
2414
  logger.info(`[${t}] TUI prompt resolved${msg.selectedText ? `: ${msg.selectedText}` : ''}`);
2415
+ if (managedAuxUiSuppressed()) {
2416
+ ds.tuiPromptCardId = undefined;
2417
+ ds.tuiPromptOptions = undefined;
2418
+ break;
2419
+ }
2286
2420
  if (ds.tuiPromptCardId) {
2287
2421
  const resolvedCard = buildTuiPromptResolvedCard(msg.selectedText ?? tr('card.action.tui_done', undefined, loc), loc);
2288
2422
  updateMessage(ds.larkAppId, ds.tuiPromptCardId, resolvedCard).catch(err => logger.debug(`[${t}] Failed to update TUI prompt card: ${err}`));
@@ -2293,13 +2427,33 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2293
2427
  break;
2294
2428
  }
2295
2429
  case 'claude_exit': {
2430
+ // CLI-generation authority must not outlive the concrete worker/CLI
2431
+ // pair that issued it. A delayed message from a replaced Node worker
2432
+ // must neither clear nor restart the replacement generation.
2433
+ if (ds.worker !== worker) {
2434
+ logger.warn(`[${t}] Ignored claude_exit from stale worker generation`);
2435
+ break;
2436
+ }
2437
+ ds.managedTurnOrigin = undefined;
2296
2438
  logger.info(`[${t}] ${getCliDisplayName(effectiveCliId)} exited (code: ${msg.code}, signal: ${msg.signal})`);
2297
2439
  ds.hasHistory = true;
2440
+ try {
2441
+ await cb.onCliExit?.(ds, {
2442
+ sessionId: ds.session.sessionId,
2443
+ workerGeneration,
2444
+ code: msg.code,
2445
+ signal: msg.signal,
2446
+ });
2447
+ }
2448
+ catch (err) {
2449
+ logger.error(`[${t}] Failed to reconcile CLI exit generation ${workerGeneration}: ${err.message}`);
2450
+ }
2451
+ const suppressExitUi = managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt);
2298
2452
  // Do NOT auto-restart in adopt mode — there's nothing to restart
2299
2453
  if (ds.adoptedFrom) {
2300
2454
  logger.info(`[${t}] Adopted session ended`);
2301
2455
  // Freeze the streaming card
2302
- if (ds.streamCardId && (ds.workerPort || ds.riffAccessUrl)) {
2456
+ if (!suppressExitUi && ds.streamCardId && (ds.workerPort || ds.riffAccessUrl)) {
2303
2457
  const readUrl = buildTerminalUrl(ds);
2304
2458
  const turnTitle = ds.currentTurnTitle || ds.session.title || getCliDisplayName(effectiveCliId);
2305
2459
  const frozenCard = buildStreamingCard(ds.session.sessionId, sessionAnchorId(ds), readUrl, turnTitle, ds.lastScreenContent ?? '', 'idle', effectiveCliId, ds.displayMode ?? 'hidden', ds.streamCardNonce, ds.currentImageKey, isAdopt, showTakeover, loc, undefined, writableTerminalLinkFor(ds), isLocalCliOpenReady(ds, { cliId: effectiveCliId }));
@@ -2311,7 +2465,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2311
2465
  // 不受影响" right before killing us, so another exit message here
2312
2466
  // is just noise. Natural exits (user typed `exit`, CLI crashed)
2313
2467
  // leave status='active' and still get the notice.
2314
- if (ds.session.status !== 'closed') {
2468
+ if (!suppressExitUi && ds.session.status !== 'closed') {
2315
2469
  try {
2316
2470
  await scopedReply(tr('worker.adopted_session_exited', undefined, loc), 'text', undefined);
2317
2471
  }
@@ -2334,7 +2488,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2334
2488
  // Freeze the last streaming card so it doesn't stay at "working" forever.
2335
2489
  // 读链接严格要求 workerPort(riffAccessUrl 是写能力且 worker 退出后不清,
2336
2490
  // 用它放行会构造 host:undefined 的坏读链接)。
2337
- if (ds.streamCardId && ds.workerPort) {
2491
+ if (!suppressExitUi && ds.streamCardId && ds.workerPort) {
2338
2492
  const readUrl = buildTerminalUrl(ds);
2339
2493
  const turnTitle = ds.currentTurnTitle || ds.session.title || getCliDisplayName(effectiveCliId);
2340
2494
  const frozenCard = buildStreamingCard(ds.session.sessionId, sessionAnchorId(ds), readUrl, turnTitle, ds.lastScreenContent ?? '', 'idle', effectiveCliId, ds.displayMode ?? 'hidden', ds.streamCardNonce, ds.currentImageKey, isAdopt, showTakeover, loc, undefined, writableTerminalLinkFor(ds), isLocalCliOpenReady(ds, { cliId: effectiveCliId }));
@@ -2370,13 +2524,15 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2370
2524
  if (msg.logTail?.trim()) {
2371
2525
  parts.push(`${tr('worker.crash_recent_output', undefined, loc)}\n${msg.logTail.trim()}`);
2372
2526
  }
2373
- try {
2374
- await scopedReply(parts.join('\n\n'), 'text', undefined);
2375
- }
2376
- catch (replyErr) {
2377
- if (replyErr instanceof MessageWithdrawnError) {
2378
- logger.warn(`[${t}] Root message withdrawn, closing stale session`);
2379
- cb.closeSession(ds);
2527
+ if (!suppressExitUi) {
2528
+ try {
2529
+ await scopedReply(parts.join('\n\n'), 'text', undefined);
2530
+ }
2531
+ catch (replyErr) {
2532
+ if (replyErr instanceof MessageWithdrawnError) {
2533
+ logger.warn(`[${t}] Root message withdrawn, closing stale session`);
2534
+ cb.closeSession(ds);
2535
+ }
2380
2536
  }
2381
2537
  }
2382
2538
  break;
@@ -2393,7 +2549,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2393
2549
  // `error` is a fatal launch-generation signal. It normally arrives
2394
2550
  // during init, but can also follow a previously-ready worker whose CLI
2395
2551
  // recovery/restart fails; that later failure must remain user-visible.
2396
- await notifyStartupFailure(msg.message, msg.turnId);
2552
+ await notifyStartupFailure(msg.message, msg.turnId, msg.dispatchAttempt);
2397
2553
  break;
2398
2554
  }
2399
2555
  case 'riff_access_url': {
@@ -2412,7 +2568,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2412
2568
  });
2413
2569
  // Refresh the live streaming card (writable/AIO link) — parks a pending
2414
2570
  // flag when the card POST is still in-flight and flushes once it lands.
2415
- scheduleRiffAccessUrlPatch(ds);
2571
+ if (!managedAuxUiSuppressed())
2572
+ scheduleRiffAccessUrlPatch(ds);
2416
2573
  break;
2417
2574
  }
2418
2575
  case 'riff_task_id': {
@@ -2461,6 +2618,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2461
2618
  reason: 'user_notify',
2462
2619
  message: msg.message,
2463
2620
  });
2621
+ if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt))
2622
+ break;
2464
2623
  try {
2465
2624
  await scopedReply(msg.message, 'text', msg.turnId);
2466
2625
  }
@@ -2469,6 +2628,104 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2469
2628
  }
2470
2629
  break;
2471
2630
  }
2631
+ case 'turn_terminal': {
2632
+ if (ds.worker !== worker) {
2633
+ logger.warn(`[${t}] Ignored turn_terminal from stale worker generation`);
2634
+ break;
2635
+ }
2636
+ if (msg.sessionId !== ds.session.sessionId) {
2637
+ logger.warn(`[${t}] Dropped turn_terminal with mismatched sessionId ` +
2638
+ `(worker=${msg.sessionId}, daemon=${ds.session.sessionId}, turn=${msg.turnId.substring(0, 8)})`);
2639
+ break;
2640
+ }
2641
+ // Defense in depth: the worker sends a token-matched revoke before the
2642
+ // terminal IPC, but an older/mixed worker must still lose authority at
2643
+ // this exact terminal edge. Tuple-match prevents a late turn N event
2644
+ // from clearing a capability already rotated for turn N+1.
2645
+ if (ds.managedTurnOrigin?.turnId === msg.turnId
2646
+ && ds.managedTurnOrigin.dispatchAttempt === msg.dispatchAttempt) {
2647
+ ds.managedTurnOrigin = undefined;
2648
+ }
2649
+ try {
2650
+ await cb.onTurnTerminal?.(ds, msg, { workerGeneration });
2651
+ }
2652
+ catch (err) {
2653
+ // The durable receipt remains non-terminal and can be reconciled;
2654
+ // never let a projection/store failure crash the worker IPC loop.
2655
+ logger.error(`[${t}] Failed to persist turn_terminal for ${msg.turnId.substring(0, 8)}: ${err.message}`);
2656
+ }
2657
+ break;
2658
+ }
2659
+ case 'receiver_reset_ready': {
2660
+ if (msg.sessionId !== ds.session.sessionId) {
2661
+ logger.warn(`[${t}] Dropped receiver_reset_ready with mismatched sessionId`);
2662
+ break;
2663
+ }
2664
+ cb.onReceiverResetReady?.(ds, {
2665
+ sessionId: msg.sessionId,
2666
+ turnId: msg.turnId,
2667
+ dispatchAttempt: msg.dispatchAttempt,
2668
+ });
2669
+ break;
2670
+ }
2671
+ case 'durable_expiry_ready': {
2672
+ if (msg.sessionId !== ds.session.sessionId) {
2673
+ logger.warn(`[${t}] Dropped durable_expiry_ready with mismatched sessionId`);
2674
+ break;
2675
+ }
2676
+ cb.onDurableExpiryReady?.(ds, {
2677
+ sessionId: msg.sessionId,
2678
+ turnId: msg.turnId,
2679
+ dispatchAttempt: msg.dispatchAttempt,
2680
+ workerGeneration,
2681
+ disposition: msg.disposition,
2682
+ });
2683
+ break;
2684
+ }
2685
+ case 'managed_turn_origin': {
2686
+ if (ds.worker !== worker) {
2687
+ logger.warn(`[${t}] Ignored managed_turn_origin from stale worker generation`);
2688
+ break;
2689
+ }
2690
+ if (msg.sessionId !== ds.session.sessionId) {
2691
+ logger.warn(`[${t}] Dropped managed_turn_origin with mismatched sessionId`);
2692
+ break;
2693
+ }
2694
+ ds.managedTurnOrigin = {
2695
+ capability: msg.capability,
2696
+ ...(msg.turnId ? { turnId: msg.turnId } : {}),
2697
+ ...(msg.dispatchAttempt !== undefined
2698
+ ? { dispatchAttempt: msg.dispatchAttempt }
2699
+ : {}),
2700
+ };
2701
+ break;
2702
+ }
2703
+ case 'managed_turn_origin_revoked': {
2704
+ if (ds.worker !== worker) {
2705
+ logger.warn(`[${t}] Ignored managed_turn_origin_revoked from stale worker generation`);
2706
+ break;
2707
+ }
2708
+ if (msg.sessionId !== ds.session.sessionId) {
2709
+ logger.warn(`[${t}] Dropped managed_turn_origin_revoked with mismatched sessionId`);
2710
+ break;
2711
+ }
2712
+ // Same-worker IPC is ordered, but token-match as well so a delayed
2713
+ // revoke can never clear authority already rotated by the next turn.
2714
+ if (msg.capability
2715
+ && ds.managedTurnOrigin?.capability
2716
+ && ds.managedTurnOrigin.capability !== msg.capability) {
2717
+ logger.warn(`[${t}] Ignored stale managed turn origin revoke after capability rotation`);
2718
+ break;
2719
+ }
2720
+ if (!msg.capability && ds.managedTurnOrigin
2721
+ && (ds.managedTurnOrigin.turnId !== msg.turnId
2722
+ || ds.managedTurnOrigin.dispatchAttempt !== msg.dispatchAttempt)) {
2723
+ logger.warn(`[${t}] Ignored unbound stale managed turn origin revoke`);
2724
+ break;
2725
+ }
2726
+ ds.managedTurnOrigin = undefined;
2727
+ break;
2728
+ }
2472
2729
  case 'final_output': {
2473
2730
  // Adopt-bridge: worker harvested the assistant turn from Claude Code's
2474
2731
  // transcript JSONL and forwarded it to us. Dedup with a session-scoped
@@ -2480,6 +2737,10 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2480
2737
  break;
2481
2738
  if (shouldDropMismatchedHermesFinalOutput(ds, msg, t))
2482
2739
  break;
2740
+ if (managedFinalOutputSuppressed(msg.turnId, msg.dispatchAttempt)) {
2741
+ logger.debug(`[${t}] final_output captured/discarded for silent turn ${msg.turnId.substring(0, 8)}`);
2742
+ break;
2743
+ }
2483
2744
  if (!msg.sessionId) {
2484
2745
  logger.warn(`[${t}] final_output missing sessionId; accepting for compatibility (session=${ds.session.sessionId}, turn=${msg.turnId.substring(0, 8)})`);
2485
2746
  }
@@ -2506,6 +2767,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2506
2767
  logger.warn(`[${t}] Ignored adopt_preamble from non-adopt worker`);
2507
2768
  break;
2508
2769
  }
2770
+ if (managedAuxUiSuppressed(msg.turnId))
2771
+ break;
2509
2772
  if (!msg.userText.trim() && !msg.assistantText.trim())
2510
2773
  break;
2511
2774
  const recipientOpenId = daemonCardFooterRecipientOpenId(ds, effectiveCliId);
@@ -2515,7 +2778,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2515
2778
  assistantText: msg.assistantText,
2516
2779
  assistantLabel: getCliDisplayName(effectiveCliId),
2517
2780
  recipientOpenId,
2518
- brand: resolveBrandLabel(ds.larkAppId),
2781
+ brand: renderBrandTemplate(resolveBrandLabel(ds.larkAppId), ds.workingDir),
2519
2782
  locale: localeForBot(ds.larkAppId),
2520
2783
  workingDir: ds.workingDir,
2521
2784
  localHomeLinkMode: daemonCardLocalHomeLinkMode(ds),
@@ -2527,7 +2790,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2527
2790
  }
2528
2791
  }
2529
2792
  });
2530
- worker.on('exit', (code) => {
2793
+ worker.on('exit', (code, signal) => {
2531
2794
  logger.info(`[${t}] Worker process exited (code: ${code})`);
2532
2795
  // Last-resort startup guard: syntax/import crashes and abrupt exits can
2533
2796
  // happen before the worker sends either ready or a structured error. Do
@@ -2535,13 +2798,33 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
2535
2798
  // replacement kills are excluded to avoid noisy false alarms.
2536
2799
  if (!startupState.ready && !startupState.failureNotified && !worker.killed && ds.session.status !== 'closed') {
2537
2800
  const reason = tr('worker.start_exited_early', { code: code ?? 'null' }, loc);
2538
- void notifyStartupFailure(reason);
2801
+ // Carry the frozen init attribution so an abrupt pre-ready exit of a
2802
+ // durable VC delivery is fenced to the receipt/lease chain, not replied
2803
+ // out-of-band (which could post on a silent delivery).
2804
+ void notifyStartupFailure(reason, startupState.initTurnId, startupState.initDispatchAttempt);
2539
2805
  }
2540
- // Only clear ds.worker if it's still THIS worker during takeover,
2541
- // the old worker's exit fires AFTER the new worker has been assigned.
2806
+ // Clear the current child before notifying durable consumers. A callback
2807
+ // may schedule a retry; it must not observe/send to this dead IPC channel.
2808
+ // A stale takeover worker never clears the replacement — during takeover the
2809
+ // old worker's exit fires AFTER the new worker has been assigned.
2542
2810
  if (ds.worker === worker) {
2543
2811
  ds.worker = null;
2544
2812
  ds.workerPort = null;
2813
+ ds.managedTurnOrigin = undefined;
2814
+ }
2815
+ try {
2816
+ const notified = cb.onWorkerExit?.(ds, {
2817
+ sessionId: ds.session.sessionId,
2818
+ workerGeneration,
2819
+ code,
2820
+ signal,
2821
+ });
2822
+ void Promise.resolve(notified).catch((err) => {
2823
+ logger.error(`[${t}] Failed to reconcile worker exit generation ${workerGeneration}: ${err.message}`);
2824
+ });
2825
+ }
2826
+ catch (err) {
2827
+ logger.error(`[${t}] Failed to reconcile worker exit generation ${workerGeneration}: ${err.message}`);
2545
2828
  }
2546
2829
  // Notify dashboard, but only once per session lifecycle. The
2547
2830
  // dashboard-driven `closeSession()` path also publishes; whichever
@@ -2612,6 +2895,10 @@ async function finishTurnReactions(ds) {
2612
2895
  return;
2613
2896
  // Detach the batch first so a second idle edge can't double-flip it.
2614
2897
  ds.pendingAckReactions = [];
2898
+ // A dedicated receiver has no progress-reaction channel. Clear any stale
2899
+ // in-memory entries restored from an older build without touching Lark.
2900
+ if (ds.session.vcMeetingReceiver)
2901
+ return;
2615
2902
  const silent = silentTurnReactions(ds);
2616
2903
  const doneEmoji = doneReactionEmojiFor(ds);
2617
2904
  for (const ack of list) {
@@ -2639,17 +2926,20 @@ async function finishTurnReactions(ds) {
2639
2926
  * and give up — the user's answer is lost; better than leaking memory
2640
2927
  * via an unbounded retry loop. */
2641
2928
  function deliverFinalOutput(ds, msg, t, attempt) {
2929
+ const managedReceiver = !!ds.session.vcMeetingReceiver;
2642
2930
  // Wait Mode / HTTP Sync Override:
2643
2931
  // If this turn is being waited for by an HTTP webhook request, intercept the
2644
2932
  // output, resolve the Promise immediately, and DO NOT send it to Lark.
2645
- const waitPromise = ds.pendingWaitPromises?.get(msg.turnId);
2933
+ // Dedicated receivers are structurally pinned to their audited listener
2934
+ // action and may never be diverted into these generic host-side sinks.
2935
+ const waitPromise = managedReceiver ? undefined : ds.pendingWaitPromises?.get(msg.turnId);
2646
2936
  if (waitPromise) {
2647
2937
  waitPromise.resolve(msg.content);
2648
2938
  ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
2649
2939
  logger.info(`[${t}] Intercepted final_output for Wait Mode HTTP request (turn ${msg.turnId.substring(0, 8)})`);
2650
2940
  return;
2651
2941
  }
2652
- const asyncResult = ds.asyncTriggerResults?.get(msg.turnId);
2942
+ const asyncResult = managedReceiver ? undefined : ds.asyncTriggerResults?.get(msg.turnId);
2653
2943
  if (asyncResult) {
2654
2944
  asyncResult.status = 'completed';
2655
2945
  asyncResult.content = msg.content;
@@ -2660,7 +2950,9 @@ function deliverFinalOutput(ds, msg, t, attempt) {
2660
2950
  }
2661
2951
  const cb = requireCallbacks();
2662
2952
  const effectiveCliId = ds.session.cliId ?? getBot(ds.larkAppId).config.cliId;
2663
- const scopedReply = (content, msgType, turnId) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId));
2953
+ const scopedReply = (content, msgType, turnId, opts) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId), ds.session.vcMeetingReceiver
2954
+ ? { ...opts, sourceSessionId: ds.session.sessionId }
2955
+ : opts);
2664
2956
  setTimeout(async () => {
2665
2957
  // Guard: if the user closed the session (or it was torn down for any
2666
2958
  // other reason) between attempts, don't post a stale final answer to
@@ -2672,7 +2964,7 @@ function deliverFinalOutput(ds, msg, t, attempt) {
2672
2964
  try {
2673
2965
  // 文档评论入口分流:本轮若来自飞书文档评论(/watch-comment / /subscribe-lark-doc),把正文
2674
2966
  // 发表为文档评论(而非飞书卡片),状态卡/占位卡仍留在飞书会话起点。
2675
- const docTurn = ds.docCommentTurns?.get(msg.turnId);
2967
+ const docTurn = managedReceiver ? undefined : ds.docCommentTurns?.get(msg.turnId);
2676
2968
  if (docTurn) {
2677
2969
  // 嵌套回复到用户那条评论 thread(已挂在其下,无需再 ↪ 前缀)。这是兜底路径
2678
2970
  // (模型没显式 botmux send),默认 @ 回原评论人,仅首块加。
@@ -2708,27 +3000,152 @@ function deliverFinalOutput(ds, msg, t, attempt) {
2708
3000
  // they use the contextual card so the user prompt sits in a
2709
3001
  // blockquote and only the assistant body goes through full markdown
2710
3002
  // rendering.
2711
- const recipientOpenId = daemonCardFooterRecipientOpenId(ds, effectiveCliId);
3003
+ const imOrigin = msg.dispatchAttempt === undefined
3004
+ ? resolveVcMeetingImTurnOrigin(ds.session, msg.turnId)
3005
+ : undefined;
3006
+ const managedDecision = ds.session.vcMeetingReceiver
3007
+ ? evaluateVcMeetingManagedSend(config.session.dataDir, {
3008
+ receiverSessionId: ds.session.sessionId,
3009
+ receiverSession: true,
3010
+ turnId: msg.turnId,
3011
+ dispatchAttempt: msg.dispatchAttempt,
3012
+ currentImTurnOrigin: imOrigin,
3013
+ allowTerminalReceipt: true,
3014
+ })
3015
+ : undefined;
3016
+ if (managedDecision && !managedDecision.ok) {
3017
+ ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
3018
+ logger.warn(`[${t}] VC final_output lost current membership authority `
3019
+ + `(${managedDecision.errorCode}) turn=${msg.turnId.substring(0, 8)}`);
3020
+ return;
3021
+ }
3022
+ const revalidateManagedSend = () => {
3023
+ if (!ds.session.vcMeetingReceiver)
3024
+ return;
3025
+ const current = evaluateVcMeetingManagedSend(config.session.dataDir, {
3026
+ receiverSessionId: ds.session.sessionId,
3027
+ receiverSession: true,
3028
+ turnId: msg.turnId,
3029
+ dispatchAttempt: msg.dispatchAttempt,
3030
+ currentImTurnOrigin: imOrigin,
3031
+ allowTerminalReceipt: true,
3032
+ });
3033
+ if (!current.ok) {
3034
+ throw new Error(`VC final_output authority expired (${current.errorCode}): ${current.error}`);
3035
+ }
3036
+ if (current.kind !== 'listener_thread') {
3037
+ throw new Error('VC final_output authority no longer targets the listener thread');
3038
+ }
3039
+ };
3040
+ const listenerOutputOwner = managedDecision?.ok
3041
+ && managedDecision.kind === 'listener_thread'
3042
+ ? managedDecision.meetingOwner
3043
+ : undefined;
3044
+ // Meeting-derived text is untrusted card markdown. A model-authored
3045
+ // native <at> tag and the ordinary owner footer would both create a
3046
+ // second addressing side effect outside the action ledger.
3047
+ const safeAssistantText = managedReceiver
3048
+ ? neutralizeLarkAtTags(msg.content)
3049
+ : msg.content;
3050
+ const safeUserText = managedReceiver && msg.userText !== undefined
3051
+ ? neutralizeLarkAtTags(msg.userText)
3052
+ : msg.userText;
3053
+ const recipientOpenId = managedReceiver
3054
+ ? undefined
3055
+ : imOrigin?.replyTargetSenderOpenId
3056
+ ?? daemonCardFooterRecipientOpenId(ds, effectiveCliId);
2712
3057
  const localHomeLinkMode = daemonCardLocalHomeLinkMode(ds);
2713
3058
  const cardJson = msg.kind === 'local-turn' || msg.kind === 'local-turn-headless'
2714
3059
  ? buildContextualReplyCard({
2715
3060
  title: msg.kind === 'local-turn-headless'
2716
3061
  ? tr('card.local_turn_resumed', undefined, localeForBot(ds.larkAppId))
2717
3062
  : tr('card.local_turn', undefined, localeForBot(ds.larkAppId)),
2718
- userText: msg.kind === 'local-turn' ? msg.userText ?? '' : undefined,
2719
- assistantText: msg.content,
3063
+ userText: msg.kind === 'local-turn' ? safeUserText ?? '' : undefined,
3064
+ assistantText: safeAssistantText,
2720
3065
  assistantLabel: getCliDisplayName(effectiveCliId),
2721
3066
  recipientOpenId,
2722
- brand: resolveBrandLabel(ds.larkAppId),
3067
+ brand: renderBrandTemplate(resolveBrandLabel(ds.larkAppId), ds.workingDir),
2723
3068
  locale: localeForBot(ds.larkAppId),
2724
3069
  workingDir: ds.workingDir,
2725
3070
  localHomeLinkMode,
2726
3071
  })
2727
- : buildMarkdownCard(msg.content, recipientOpenId, resolveBrandLabel(ds.larkAppId), localeForBot(ds.larkAppId), ds.workingDir, localHomeLinkMode);
3072
+ : buildMarkdownCard(safeAssistantText, recipientOpenId, renderBrandTemplate(resolveBrandLabel(ds.larkAppId), ds.workingDir), localeForBot(ds.larkAppId), ds.workingDir, localHomeLinkMode);
3073
+ const proposedOutput = {
3074
+ targetChatId: ds.chatId,
3075
+ ...(imOrigin ? { quoteTargetId: imOrigin.larkMessageId } : {}),
3076
+ msgType: 'interactive',
3077
+ content: cardJson,
3078
+ };
3079
+ const preparedImReply = imOrigin
3080
+ ? prepareVcMeetingImReply(config.session.dataDir, imOrigin, proposedOutput)
3081
+ : undefined;
3082
+ const preparedDeliveryReply = !imOrigin
3083
+ && listenerOutputOwner
3084
+ && msg.dispatchAttempt !== undefined
3085
+ ? prepareVcMeetingDeliveryReply(config.session.dataDir, {
3086
+ receiverSessionId: ds.session.sessionId,
3087
+ stableTurnId: msg.turnId,
3088
+ dispatchAttempt: msg.dispatchAttempt,
3089
+ }, proposedOutput)
3090
+ : undefined;
3091
+ const preparedListenerReply = preparedImReply ?? preparedDeliveryReply;
3092
+ if (preparedListenerReply?.kind === 'conflict') {
3093
+ ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
3094
+ logger.error(`[${t}] VC listener fallback suppressed (${preparedListenerReply.reason}) `
3095
+ + `turn=${msg.turnId.substring(0, 8)}: ${preparedListenerReply.detail}`);
3096
+ return;
3097
+ }
3098
+ const canonicalOutput = preparedListenerReply?.canonicalOutput ?? proposedOutput;
3099
+ if (preparedListenerReply?.outputMismatch) {
3100
+ logger.warn(`[${t}] VC listener reply output_mismatch action=${preparedListenerReply.ref.actionId} `
3101
+ + `turn=${msg.turnId}; reusing first canonical output`);
3102
+ }
3103
+ const recordPrimaryOutput = (messageId) => {
3104
+ if (!listenerOutputOwner)
3105
+ return;
3106
+ try {
3107
+ const recorded = recordVcMeetingListenerMessage(config.session.dataDir, {
3108
+ ...listenerOutputOwner,
3109
+ targetChatId: canonicalOutput.targetChatId,
3110
+ messageId,
3111
+ });
3112
+ if (!recorded.ok) {
3113
+ logger.warn(`[${t}] VC listener-message index rejected message=${messageId} reason=${recorded.reason}`);
3114
+ }
3115
+ }
3116
+ catch (error) {
3117
+ // Lark already accepted the primary message. Never enter the delivery
3118
+ // retry loop solely because the auxiliary quote index failed.
3119
+ logger.error(`[${t}] VC listener-message index write failed after send: `
3120
+ + `${error instanceof Error ? error.message : String(error)}`);
3121
+ }
3122
+ };
3123
+ if (preparedListenerReply?.kind === 'succeeded' && preparedListenerReply.messageId) {
3124
+ recordPrimaryOutput(preparedListenerReply.messageId);
3125
+ ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
3126
+ logger.info(`[${t}] VC listener fallback replayed existing provider result `
3127
+ + `(turn ${msg.turnId.substring(0, 8)})`);
3128
+ return;
3129
+ }
2728
3130
  // Always deliver the answer as a fresh message — never PATCH a card in
2729
3131
  // place. message.patch is silent (no Feishu notification / unread), which
2730
3132
  // used to swallow the answer; a brand-new message always pings.
2731
- await scopedReply(cardJson, 'interactive', msg.turnId);
3133
+ revalidateManagedSend();
3134
+ const messageId = await scopedReply(canonicalOutput.content, canonicalOutput.msgType, msg.turnId, preparedListenerReply
3135
+ ? {
3136
+ uuid: preparedListenerReply.providerKey,
3137
+ quoteMessageId: canonicalOutput.quoteTargetId,
3138
+ beforeQuoteFallback: revalidateManagedSend,
3139
+ // Managed output has one audited external effect (the Lark
3140
+ // provider call). Never fan meeting content out to user hooks,
3141
+ // including the first attempt and crash reconciliation replay.
3142
+ suppressHook: true,
3143
+ }
3144
+ : undefined);
3145
+ recordPrimaryOutput(messageId);
3146
+ if (preparedListenerReply?.kind === 'send' || preparedListenerReply?.kind === 'succeeded') {
3147
+ finishVcMeetingImReply(config.session.dataDir, preparedListenerReply.ref, messageId);
3148
+ }
2732
3149
  ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
2733
3150
  logger.info(`[${t}] Bridge final_output forwarded (turn ${msg.turnId.substring(0, 8)}, ${msg.content.length} chars, kind=${msg.kind ?? 'bridge'}, attempt ${attempt + 1})`);
2734
3151
  }
@@ -2791,6 +3208,8 @@ export function forkAdoptWorker(ds, opts) {
2791
3208
  ds.worker = null;
2792
3209
  ds.workerPort = null;
2793
3210
  ds.workerToken = null;
3211
+ ds.workerViewToken = null;
3212
+ ds.managedTurnOrigin = undefined;
2794
3213
  }
2795
3214
  // No ensureCliSkills — adopt mode attaches to an existing CLI session
2796
3215
  // Fall back to home if the adopted cwd is gone — a missing fork cwd emits an
@@ -2891,6 +3310,7 @@ export function forkAdoptWorker(ds, opts) {
2891
3310
  type: 'init',
2892
3311
  sessionId: ds.session.sessionId,
2893
3312
  chatId: ds.chatId,
3313
+ chatType: ds.chatType,
2894
3314
  rootMessageId: sessionAnchorId(ds),
2895
3315
  workingDir: adopted.cwd,
2896
3316
  cliId: adoptedCliId,