botmux 3.5.0 → 3.6.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 (505) hide show
  1. package/README.en.md +56 -396
  2. package/README.md +55 -396
  3. package/dist/.runtime-build-id +1 -0
  4. package/dist/adapters/backend/sandbox.d.ts +99 -279
  5. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  6. package/dist/adapters/backend/sandbox.js +424 -826
  7. package/dist/adapters/backend/sandbox.js.map +1 -1
  8. package/dist/adapters/cli/claude-code.d.ts +6 -0
  9. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  10. package/dist/adapters/cli/claude-code.js +197 -11
  11. package/dist/adapters/cli/claude-code.js.map +1 -1
  12. package/dist/adapters/cli/coco.js +4 -4
  13. package/dist/adapters/cli/coco.js.map +1 -1
  14. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  15. package/dist/adapters/cli/codex-app.js +9 -6
  16. package/dist/adapters/cli/codex-app.js.map +1 -1
  17. package/dist/adapters/cli/codex.d.ts.map +1 -1
  18. package/dist/adapters/cli/codex.js +9 -5
  19. package/dist/adapters/cli/codex.js.map +1 -1
  20. package/dist/adapters/cli/fs-policy.d.ts +244 -0
  21. package/dist/adapters/cli/fs-policy.d.ts.map +1 -0
  22. package/dist/adapters/cli/fs-policy.js +537 -0
  23. package/dist/adapters/cli/fs-policy.js.map +1 -0
  24. package/dist/adapters/cli/grok.d.ts +2 -1
  25. package/dist/adapters/cli/grok.d.ts.map +1 -1
  26. package/dist/adapters/cli/grok.js +2 -1
  27. package/dist/adapters/cli/grok.js.map +1 -1
  28. package/dist/adapters/cli/hermes.d.ts.map +1 -1
  29. package/dist/adapters/cli/hermes.js +8 -4
  30. package/dist/adapters/cli/hermes.js.map +1 -1
  31. package/dist/adapters/cli/mtr.d.ts.map +1 -1
  32. package/dist/adapters/cli/mtr.js +3 -2
  33. package/dist/adapters/cli/mtr.js.map +1 -1
  34. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  35. package/dist/adapters/cli/opencode.js +5 -4
  36. package/dist/adapters/cli/opencode.js.map +1 -1
  37. package/dist/adapters/cli/read-isolation.d.ts +14 -200
  38. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  39. package/dist/adapters/cli/read-isolation.js +18 -477
  40. package/dist/adapters/cli/read-isolation.js.map +1 -1
  41. package/dist/adapters/cli/relay.js +2 -2
  42. package/dist/adapters/cli/relay.js.map +1 -1
  43. package/dist/adapters/cli/runner-input.d.ts +2 -2
  44. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  45. package/dist/adapters/cli/runner-input.js +9 -6
  46. package/dist/adapters/cli/runner-input.js.map +1 -1
  47. package/dist/adapters/cli/seed.d.ts.map +1 -1
  48. package/dist/adapters/cli/seed.js +2 -1
  49. package/dist/adapters/cli/seed.js.map +1 -1
  50. package/dist/adapters/cli/traex.d.ts.map +1 -1
  51. package/dist/adapters/cli/traex.js +3 -2
  52. package/dist/adapters/cli/traex.js.map +1 -1
  53. package/dist/adapters/cli/types.d.ts +25 -18
  54. package/dist/adapters/cli/types.d.ts.map +1 -1
  55. package/dist/bot-registry.d.ts +54 -23
  56. package/dist/bot-registry.d.ts.map +1 -1
  57. package/dist/bot-registry.js +91 -0
  58. package/dist/bot-registry.js.map +1 -1
  59. package/dist/cli.d.ts.map +1 -1
  60. package/dist/cli.js +297 -104
  61. package/dist/cli.js.map +1 -1
  62. package/dist/codex-app-runner.js +85 -192
  63. package/dist/codex-app-runner.js.map +1 -1
  64. package/dist/config.d.ts +0 -16
  65. package/dist/config.d.ts.map +1 -1
  66. package/dist/config.js +0 -30
  67. package/dist/config.js.map +1 -1
  68. package/dist/core/ask-broker.d.ts +12 -0
  69. package/dist/core/ask-broker.d.ts.map +1 -1
  70. package/dist/core/ask-broker.js +41 -0
  71. package/dist/core/ask-broker.js.map +1 -1
  72. package/dist/core/bot-turn-mutation-gate.d.ts +24 -0
  73. package/dist/core/bot-turn-mutation-gate.d.ts.map +1 -0
  74. package/dist/core/bot-turn-mutation-gate.js +369 -0
  75. package/dist/core/bot-turn-mutation-gate.js.map +1 -0
  76. package/dist/core/command-handler.d.ts +5 -0
  77. package/dist/core/command-handler.d.ts.map +1 -1
  78. package/dist/core/command-handler.js +53 -73
  79. package/dist/core/command-handler.js.map +1 -1
  80. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  81. package/dist/core/dashboard-ipc-server.js +356 -84
  82. package/dist/core/dashboard-ipc-server.js.map +1 -1
  83. package/dist/core/dashboard-rows.d.ts +8 -0
  84. package/dist/core/dashboard-rows.d.ts.map +1 -1
  85. package/dist/core/dashboard-rows.js.map +1 -1
  86. package/dist/core/host-overload-alert.d.ts +157 -0
  87. package/dist/core/host-overload-alert.d.ts.map +1 -0
  88. package/dist/core/host-overload-alert.js +251 -0
  89. package/dist/core/host-overload-alert.js.map +1 -0
  90. package/dist/core/passthrough-commands.d.ts +8 -0
  91. package/dist/core/passthrough-commands.d.ts.map +1 -1
  92. package/dist/core/passthrough-commands.js +20 -1
  93. package/dist/core/passthrough-commands.js.map +1 -1
  94. package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
  95. package/dist/core/plugins/mcp/gateway-installer.js +14 -2
  96. package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
  97. package/dist/core/restart-coordinator.d.ts +28 -0
  98. package/dist/core/restart-coordinator.d.ts.map +1 -0
  99. package/dist/core/restart-coordinator.js +82 -0
  100. package/dist/core/restart-coordinator.js.map +1 -0
  101. package/dist/core/restart-followup-policy.d.ts +112 -0
  102. package/dist/core/restart-followup-policy.d.ts.map +1 -0
  103. package/dist/core/restart-followup-policy.js +49 -0
  104. package/dist/core/restart-followup-policy.js.map +1 -0
  105. package/dist/core/role-library.d.ts +1 -1
  106. package/dist/core/role-library.js +1 -1
  107. package/dist/core/session-cwd.d.ts.map +1 -1
  108. package/dist/core/session-cwd.js +8 -0
  109. package/dist/core/session-cwd.js.map +1 -1
  110. package/dist/core/session-discovery.d.ts +14 -0
  111. package/dist/core/session-discovery.d.ts.map +1 -1
  112. package/dist/core/session-discovery.js +25 -0
  113. package/dist/core/session-discovery.js.map +1 -1
  114. package/dist/core/session-liveness.d.ts +15 -0
  115. package/dist/core/session-liveness.d.ts.map +1 -0
  116. package/dist/core/session-liveness.js +76 -0
  117. package/dist/core/session-liveness.js.map +1 -0
  118. package/dist/core/session-manager.d.ts.map +1 -1
  119. package/dist/core/session-manager.js +90 -60
  120. package/dist/core/session-manager.js.map +1 -1
  121. package/dist/core/session-row-enrichment.d.ts +15 -0
  122. package/dist/core/session-row-enrichment.d.ts.map +1 -0
  123. package/dist/core/session-row-enrichment.js +93 -0
  124. package/dist/core/session-row-enrichment.js.map +1 -0
  125. package/dist/core/slash-inject.js +1 -1
  126. package/dist/core/slash-inject.js.map +1 -1
  127. package/dist/core/trigger-final-suppression.d.ts +24 -0
  128. package/dist/core/trigger-final-suppression.d.ts.map +1 -0
  129. package/dist/core/trigger-final-suppression.js +97 -0
  130. package/dist/core/trigger-final-suppression.js.map +1 -0
  131. package/dist/core/trigger-session.d.ts.map +1 -1
  132. package/dist/core/trigger-session.js +64 -4
  133. package/dist/core/trigger-session.js.map +1 -1
  134. package/dist/core/types.d.ts +6 -0
  135. package/dist/core/types.d.ts.map +1 -1
  136. package/dist/core/types.js.map +1 -1
  137. package/dist/core/worker-pool.d.ts +44 -0
  138. package/dist/core/worker-pool.d.ts.map +1 -1
  139. package/dist/core/worker-pool.js +333 -38
  140. package/dist/core/worker-pool.js.map +1 -1
  141. package/dist/daemon.d.ts +5 -1
  142. package/dist/daemon.d.ts.map +1 -1
  143. package/dist/daemon.js +526 -35
  144. package/dist/daemon.js.map +1 -1
  145. package/dist/dashboard/aggregator.d.ts +1 -0
  146. package/dist/dashboard/aggregator.d.ts.map +1 -1
  147. package/dist/dashboard/aggregator.js +34 -6
  148. package/dist/dashboard/aggregator.js.map +1 -1
  149. package/dist/dashboard/bot-payload.d.ts +8 -0
  150. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  151. package/dist/dashboard/bot-payload.js +10 -0
  152. package/dist/dashboard/bot-payload.js.map +1 -1
  153. package/dist/dashboard/compat.d.ts +102 -2
  154. package/dist/dashboard/compat.d.ts.map +1 -1
  155. package/dist/dashboard/compat.js +78 -14
  156. package/dist/dashboard/compat.js.map +1 -1
  157. package/dist/dashboard/connector-api.d.ts.map +1 -1
  158. package/dist/dashboard/connector-api.js +1 -0
  159. package/dist/dashboard/connector-api.js.map +1 -1
  160. package/dist/dashboard/desktop-asks.d.ts +21 -0
  161. package/dist/dashboard/desktop-asks.d.ts.map +1 -0
  162. package/dist/dashboard/desktop-asks.js +49 -0
  163. package/dist/dashboard/desktop-asks.js.map +1 -0
  164. package/dist/dashboard/public-redact.d.ts +7 -0
  165. package/dist/dashboard/public-redact.d.ts.map +1 -1
  166. package/dist/dashboard/public-redact.js +35 -3
  167. package/dist/dashboard/public-redact.js.map +1 -1
  168. package/dist/dashboard/session-presentation.d.ts +16 -0
  169. package/dist/dashboard/session-presentation.d.ts.map +1 -0
  170. package/dist/dashboard/session-presentation.js +62 -0
  171. package/dist/dashboard/session-presentation.js.map +1 -0
  172. package/dist/dashboard/settings-write-applier.d.ts +2 -1
  173. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  174. package/dist/dashboard/settings-write-applier.js +19 -1
  175. package/dist/dashboard/settings-write-applier.js.map +1 -1
  176. package/dist/dashboard/trigger-api.d.ts.map +1 -1
  177. package/dist/dashboard/trigger-api.js +19 -1
  178. package/dist/dashboard/trigger-api.js.map +1 -1
  179. package/dist/dashboard/vc-consumer-profiles-api.d.ts +7 -2
  180. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  181. package/dist/dashboard/vc-consumer-profiles-api.js +13 -0
  182. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  183. package/dist/dashboard/web/app.d.ts.map +1 -1
  184. package/dist/dashboard/web/app.js +18 -5
  185. package/dist/dashboard/web/app.js.map +1 -1
  186. package/dist/dashboard/web/bot-defaults-page.d.ts +16 -0
  187. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  188. package/dist/dashboard/web/bot-defaults-page.js +288 -7
  189. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  190. package/dist/dashboard/web/bot-defaults.d.ts +10 -0
  191. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  192. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  193. package/dist/dashboard/web/client-shell.d.ts +29 -0
  194. package/dist/dashboard/web/client-shell.d.ts.map +1 -0
  195. package/dist/dashboard/web/client-shell.js +89 -0
  196. package/dist/dashboard/web/client-shell.js.map +1 -0
  197. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  198. package/dist/dashboard/web/connectors-page.js +5 -1
  199. package/dist/dashboard/web/connectors-page.js.map +1 -1
  200. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  201. package/dist/dashboard/web/i18n.js +130 -22
  202. package/dist/dashboard/web/i18n.js.map +1 -1
  203. package/dist/dashboard/web/preferences.d.ts +7 -0
  204. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  205. package/dist/dashboard/web/preferences.js +32 -0
  206. package/dist/dashboard/web/preferences.js.map +1 -1
  207. package/dist/dashboard/web/sessions-kanban.d.ts +1 -1
  208. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  209. package/dist/dashboard/web/sessions-kanban.js +1 -1
  210. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  211. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  212. package/dist/dashboard/web/sessions-page.js +78 -67
  213. package/dist/dashboard/web/sessions-page.js.map +1 -1
  214. package/dist/dashboard/web/sessions.d.ts +4 -0
  215. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  216. package/dist/dashboard/web/sessions.js +14 -1
  217. package/dist/dashboard/web/sessions.js.map +1 -1
  218. package/dist/dashboard/web/settings-page.d.ts +6 -0
  219. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  220. package/dist/dashboard/web/settings-page.js +55 -30
  221. package/dist/dashboard/web/settings-page.js.map +1 -1
  222. package/dist/dashboard/web/store.d.ts +1 -2
  223. package/dist/dashboard/web/store.d.ts.map +1 -1
  224. package/dist/dashboard/web/store.js +69 -20
  225. package/dist/dashboard/web/store.js.map +1 -1
  226. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  227. package/dist/dashboard/web/vc-consumer-profiles-section.js +128 -42
  228. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  229. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  230. package/dist/dashboard/webhook-routes.js +9 -2
  231. package/dist/dashboard/webhook-routes.js.map +1 -1
  232. package/dist/dashboard-web/app.js +1 -1
  233. package/dist/dashboard-web/chunks/bot-defaults-page-VQMPUJ4Y.js +10 -0
  234. package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +1 -0
  235. package/dist/dashboard-web/chunks/{chunk-QCPPKCX3.js → chunk-JMRGZQDB.js} +1 -1
  236. package/dist/dashboard-web/chunks/{chunk-EJDYUINZ.js → chunk-NP4JUBGS.js} +1 -1
  237. package/dist/dashboard-web/chunks/{chunk-WXPMNEYV.js → chunk-P327LXOT.js} +1 -1
  238. package/dist/dashboard-web/chunks/chunk-SNKATZWK.js +49 -0
  239. package/dist/dashboard-web/chunks/connectors-page-DOY4J3ZL.js +1 -0
  240. package/dist/dashboard-web/chunks/{groups-page-3P4TLUMF.js → groups-page-74TS2DIH.js} +1 -1
  241. package/dist/dashboard-web/chunks/{insights-page-TDCZV56A.js → insights-page-AYCO65JC.js} +1 -1
  242. package/dist/dashboard-web/chunks/{monitor-room-QWCWL3SX.js → monitor-room-YKYLTSAN.js} +1 -1
  243. package/dist/dashboard-web/chunks/{monitoring-page-IOWFSNVC.js → monitoring-page-QBIUNRBR.js} +1 -1
  244. package/dist/dashboard-web/chunks/{office-page-5AUPEHZP.js → office-page-4PH2A26P.js} +1 -1
  245. package/dist/dashboard-web/chunks/overview-page-H73D5UT4.js +1 -0
  246. package/dist/dashboard-web/chunks/{roles-page-WJVB52ET.js → roles-page-U4BTOQ7F.js} +1 -1
  247. package/dist/dashboard-web/chunks/{schedules-page-RVRWHP4V.js → schedules-page-RHRHX7R7.js} +1 -1
  248. package/dist/dashboard-web/chunks/sessions-page-VSC6AM5G.js +2 -0
  249. package/dist/dashboard-web/chunks/settings-page-LF3RKM5P.js +2 -0
  250. package/dist/dashboard-web/chunks/{skills-page-7YT5TIX5.js → skills-page-SYOIGGXH.js} +1 -1
  251. package/dist/dashboard-web/chunks/{team-federation-page-NJZKTU7A.js → team-federation-page-RMBLASTW.js} +1 -1
  252. package/dist/dashboard-web/chunks/{v3-page-NQ73UA2Q.js → v3-page-XJXKKJRN.js} +1 -1
  253. package/dist/dashboard-web/chunks/{whiteboards-page-DSM3MDMN.js → whiteboards-page-K3YVSTHJ.js} +1 -1
  254. package/dist/dashboard-web/style.css +571 -3
  255. package/dist/dashboard.js +238 -9
  256. package/dist/dashboard.js.map +1 -1
  257. package/dist/global-config.d.ts +11 -0
  258. package/dist/global-config.d.ts.map +1 -1
  259. package/dist/global-config.js +27 -1
  260. package/dist/global-config.js.map +1 -1
  261. package/dist/i18n/en.d.ts.map +1 -1
  262. package/dist/i18n/en.js +6 -19
  263. package/dist/i18n/en.js.map +1 -1
  264. package/dist/i18n/zh.d.ts.map +1 -1
  265. package/dist/i18n/zh.js +6 -19
  266. package/dist/i18n/zh.js.map +1 -1
  267. package/dist/im/lark/card-builder.d.ts +1 -14
  268. package/dist/im/lark/card-builder.d.ts.map +1 -1
  269. package/dist/im/lark/card-builder.js +1 -35
  270. package/dist/im/lark/card-builder.js.map +1 -1
  271. package/dist/im/lark/card-handler.d.ts +10 -0
  272. package/dist/im/lark/card-handler.d.ts.map +1 -1
  273. package/dist/im/lark/card-handler.js +161 -44
  274. package/dist/im/lark/card-handler.js.map +1 -1
  275. package/dist/im/lark/client.d.ts +47 -0
  276. package/dist/im/lark/client.d.ts.map +1 -1
  277. package/dist/im/lark/client.js +127 -18
  278. package/dist/im/lark/client.js.map +1 -1
  279. package/dist/im/lark/event-dispatcher.d.ts +13 -0
  280. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  281. package/dist/im/lark/event-dispatcher.js +48 -3
  282. package/dist/im/lark/event-dispatcher.js.map +1 -1
  283. package/dist/im/lark/identity-cache.d.ts +25 -1
  284. package/dist/im/lark/identity-cache.d.ts.map +1 -1
  285. package/dist/im/lark/identity-cache.js +47 -1
  286. package/dist/im/lark/identity-cache.js.map +1 -1
  287. package/dist/im/lark/overload-nonce.d.ts +19 -0
  288. package/dist/im/lark/overload-nonce.d.ts.map +1 -0
  289. package/dist/im/lark/overload-nonce.js +72 -0
  290. package/dist/im/lark/overload-nonce.js.map +1 -0
  291. package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
  292. package/dist/im/lark/v3-progress-card.js +5 -0
  293. package/dist/im/lark/v3-progress-card.js.map +1 -1
  294. package/dist/services/async-trigger-state.d.ts +82 -0
  295. package/dist/services/async-trigger-state.d.ts.map +1 -0
  296. package/dist/services/async-trigger-state.js +95 -0
  297. package/dist/services/async-trigger-state.js.map +1 -0
  298. package/dist/services/async-trigger-store.d.ts +28 -0
  299. package/dist/services/async-trigger-store.d.ts.map +1 -0
  300. package/dist/services/async-trigger-store.js +120 -0
  301. package/dist/services/async-trigger-store.js.map +1 -0
  302. package/dist/services/bot-config-store.d.ts.map +1 -1
  303. package/dist/services/bot-config-store.js +34 -2
  304. package/dist/services/bot-config-store.js.map +1 -1
  305. package/dist/services/bridge-fallback-gate.d.ts +32 -0
  306. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  307. package/dist/services/bridge-fallback-gate.js +39 -0
  308. package/dist/services/bridge-fallback-gate.js.map +1 -1
  309. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  310. package/dist/services/bridge-turn-queue.js +15 -1
  311. package/dist/services/bridge-turn-queue.js.map +1 -1
  312. package/dist/services/card-prefs-store.d.ts +4 -0
  313. package/dist/services/card-prefs-store.d.ts.map +1 -1
  314. package/dist/services/card-prefs-store.js +8 -0
  315. package/dist/services/card-prefs-store.js.map +1 -1
  316. package/dist/services/claude-transcript.d.ts +23 -0
  317. package/dist/services/claude-transcript.d.ts.map +1 -1
  318. package/dist/services/claude-transcript.js +33 -0
  319. package/dist/services/claude-transcript.js.map +1 -1
  320. package/dist/services/codex-app-runner-protocol.d.ts +61 -0
  321. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -0
  322. package/dist/services/codex-app-runner-protocol.js +170 -0
  323. package/dist/services/codex-app-runner-protocol.js.map +1 -0
  324. package/dist/services/codex-app-turn-controller.d.ts +72 -0
  325. package/dist/services/codex-app-turn-controller.d.ts.map +1 -0
  326. package/dist/services/codex-app-turn-controller.js +524 -0
  327. package/dist/services/codex-app-turn-controller.js.map +1 -0
  328. package/dist/services/codex-runner-freshness.d.ts +39 -0
  329. package/dist/services/codex-runner-freshness.d.ts.map +1 -0
  330. package/dist/services/codex-runner-freshness.js +78 -0
  331. package/dist/services/codex-runner-freshness.js.map +1 -0
  332. package/dist/services/connector-store.d.ts +6 -0
  333. package/dist/services/connector-store.d.ts.map +1 -1
  334. package/dist/services/connector-store.js.map +1 -1
  335. package/dist/services/grant-store.d.ts.map +1 -1
  336. package/dist/services/grant-store.js +16 -0
  337. package/dist/services/grant-store.js.map +1 -1
  338. package/dist/services/hermes-transcript.d.ts +1 -0
  339. package/dist/services/hermes-transcript.d.ts.map +1 -1
  340. package/dist/services/hermes-transcript.js +49 -0
  341. package/dist/services/hermes-transcript.js.map +1 -1
  342. package/dist/services/sandbox-migration.d.ts +14 -0
  343. package/dist/services/sandbox-migration.d.ts.map +1 -0
  344. package/dist/services/sandbox-migration.js +85 -0
  345. package/dist/services/sandbox-migration.js.map +1 -0
  346. package/dist/services/sandbox-store.d.ts +28 -0
  347. package/dist/services/sandbox-store.d.ts.map +1 -1
  348. package/dist/services/sandbox-store.js +82 -0
  349. package/dist/services/sandbox-store.js.map +1 -1
  350. package/dist/services/schedule-split-migration.d.ts +2 -0
  351. package/dist/services/schedule-split-migration.d.ts.map +1 -0
  352. package/dist/services/schedule-split-migration.js +159 -0
  353. package/dist/services/schedule-split-migration.js.map +1 -0
  354. package/dist/services/schedule-store.d.ts +28 -4
  355. package/dist/services/schedule-store.d.ts.map +1 -1
  356. package/dist/services/schedule-store.js +118 -33
  357. package/dist/services/schedule-store.js.map +1 -1
  358. package/dist/services/trigger-types.d.ts +18 -1
  359. package/dist/services/trigger-types.d.ts.map +1 -1
  360. package/dist/services/trigger-types.js +3 -0
  361. package/dist/services/trigger-types.js.map +1 -1
  362. package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +1 -1
  363. package/dist/services/vc-meeting-consumer-profile-store.js +1 -0
  364. package/dist/services/vc-meeting-consumer-profile-store.js.map +1 -1
  365. package/dist/services/vc-meeting-consumer-profile-templates.d.ts +32 -0
  366. package/dist/services/vc-meeting-consumer-profile-templates.d.ts.map +1 -0
  367. package/dist/services/vc-meeting-consumer-profile-templates.js +106 -0
  368. package/dist/services/vc-meeting-consumer-profile-templates.js.map +1 -0
  369. package/dist/services/vc-meeting-delivery-feed.d.ts +1 -1
  370. package/dist/services/vc-meeting-delivery-feed.d.ts.map +1 -1
  371. package/dist/services/vc-meeting-delivery-feed.js +2 -1
  372. package/dist/services/vc-meeting-delivery-feed.js.map +1 -1
  373. package/dist/services/vc-meeting-delivery-hub-store.d.ts +3 -1
  374. package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +1 -1
  375. package/dist/services/vc-meeting-delivery-hub-store.js +11 -0
  376. package/dist/services/vc-meeting-delivery-hub-store.js.map +1 -1
  377. package/dist/services/vc-meeting-delivery-protocol.d.ts +9 -2
  378. package/dist/services/vc-meeting-delivery-protocol.d.ts.map +1 -1
  379. package/dist/services/vc-meeting-delivery-protocol.js +10 -1
  380. package/dist/services/vc-meeting-delivery-protocol.js.map +1 -1
  381. package/dist/services/vc-meeting-delivery-receiver.d.ts.map +1 -1
  382. package/dist/services/vc-meeting-delivery-receiver.js +10 -1
  383. package/dist/services/vc-meeting-delivery-receiver.js.map +1 -1
  384. package/dist/services/vc-meeting-delivery-store.d.ts +12 -2
  385. package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -1
  386. package/dist/services/vc-meeting-delivery-store.js +14 -2
  387. package/dist/services/vc-meeting-delivery-store.js.map +1 -1
  388. package/dist/services/vc-meeting-im-reply.d.ts +2 -1
  389. package/dist/services/vc-meeting-im-reply.d.ts.map +1 -1
  390. package/dist/services/vc-meeting-im-reply.js +19 -3
  391. package/dist/services/vc-meeting-im-reply.js.map +1 -1
  392. package/dist/services/vc-meeting-listener-output-protocol.d.ts +27 -0
  393. package/dist/services/vc-meeting-listener-output-protocol.d.ts.map +1 -0
  394. package/dist/services/vc-meeting-listener-output-protocol.js +58 -0
  395. package/dist/services/vc-meeting-listener-output-protocol.js.map +1 -0
  396. package/dist/services/vc-meeting-listener-topic-store.d.ts +31 -0
  397. package/dist/services/vc-meeting-listener-topic-store.d.ts.map +1 -0
  398. package/dist/services/vc-meeting-listener-topic-store.js +120 -0
  399. package/dist/services/vc-meeting-listener-topic-store.js.map +1 -0
  400. package/dist/services/vc-meeting-runtime-store.d.ts +2 -1
  401. package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -1
  402. package/dist/services/vc-meeting-runtime-store.js +8 -0
  403. package/dist/services/vc-meeting-runtime-store.js.map +1 -1
  404. package/dist/services/vc-meeting-send-policy.d.ts +8 -1
  405. package/dist/services/vc-meeting-send-policy.d.ts.map +1 -1
  406. package/dist/services/vc-meeting-send-policy.js +8 -0
  407. package/dist/services/vc-meeting-send-policy.js.map +1 -1
  408. package/dist/types.d.ts +53 -4
  409. package/dist/types.d.ts.map +1 -1
  410. package/dist/utils/allowed-users-apply.d.ts +76 -0
  411. package/dist/utils/allowed-users-apply.d.ts.map +1 -0
  412. package/dist/utils/allowed-users-apply.js +123 -0
  413. package/dist/utils/allowed-users-apply.js.map +1 -0
  414. package/dist/utils/allowed-users-cache.d.ts +29 -0
  415. package/dist/utils/allowed-users-cache.d.ts.map +1 -0
  416. package/dist/utils/allowed-users-cache.js +82 -0
  417. package/dist/utils/allowed-users-cache.js.map +1 -0
  418. package/dist/utils/child-env.d.ts +4 -3
  419. package/dist/utils/child-env.d.ts.map +1 -1
  420. package/dist/utils/child-env.js +16 -1
  421. package/dist/utils/child-env.js.map +1 -1
  422. package/dist/utils/cli-usage-limit.d.ts +27 -1
  423. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  424. package/dist/utils/cli-usage-limit.js +92 -20
  425. package/dist/utils/cli-usage-limit.js.map +1 -1
  426. package/dist/utils/input-gate.d.ts +2 -0
  427. package/dist/utils/input-gate.d.ts.map +1 -1
  428. package/dist/utils/input-gate.js +2 -0
  429. package/dist/utils/input-gate.js.map +1 -1
  430. package/dist/utils/runtime-build-id.d.ts +21 -0
  431. package/dist/utils/runtime-build-id.d.ts.map +1 -0
  432. package/dist/utils/runtime-build-id.js +83 -0
  433. package/dist/utils/runtime-build-id.js.map +1 -0
  434. package/dist/utils/terminal-renderer.d.ts +3 -3
  435. package/dist/utils/terminal-renderer.js +3 -3
  436. package/dist/vc-agent/cards.d.ts.map +1 -1
  437. package/dist/vc-agent/cards.js +21 -1
  438. package/dist/vc-agent/cards.js.map +1 -1
  439. package/dist/worker.js +1010 -669
  440. package/dist/worker.js.map +1 -1
  441. package/dist/workflows/events/payloads.d.ts +56 -0
  442. package/dist/workflows/events/payloads.d.ts.map +1 -1
  443. package/dist/workflows/events/payloads.js +9 -0
  444. package/dist/workflows/events/payloads.js.map +1 -1
  445. package/dist/workflows/events/schema.d.ts +86 -0
  446. package/dist/workflows/events/schema.d.ts.map +1 -1
  447. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  448. package/dist/workflows/hostExecutors/botmux-schedule.js +13 -1
  449. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  450. package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
  451. package/dist/workflows/migration/v2-to-v3.d.ts.map +1 -1
  452. package/dist/workflows/migration/v2-to-v3.js +5 -1
  453. package/dist/workflows/migration/v2-to-v3.js.map +1 -1
  454. package/dist/workflows/shared/sandbox-policy.d.ts +10 -1
  455. package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -1
  456. package/dist/workflows/shared/sandbox-policy.js +12 -0
  457. package/dist/workflows/shared/sandbox-policy.js.map +1 -1
  458. package/dist/workflows/v3/architect.d.ts.map +1 -1
  459. package/dist/workflows/v3/architect.js +1 -0
  460. package/dist/workflows/v3/architect.js.map +1 -1
  461. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
  462. package/dist/workflows/v3/bot-resolve.js +36 -0
  463. package/dist/workflows/v3/bot-resolve.js.map +1 -1
  464. package/dist/workflows/v3/cli-run.d.ts +9 -0
  465. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  466. package/dist/workflows/v3/cli-run.js +17 -2
  467. package/dist/workflows/v3/cli-run.js.map +1 -1
  468. package/dist/workflows/v3/contract.d.ts +8 -0
  469. package/dist/workflows/v3/contract.d.ts.map +1 -1
  470. package/dist/workflows/v3/contract.js.map +1 -1
  471. package/dist/workflows/v3/goal-cli.d.ts +58 -0
  472. package/dist/workflows/v3/goal-cli.d.ts.map +1 -0
  473. package/dist/workflows/v3/goal-cli.js +430 -0
  474. package/dist/workflows/v3/goal-cli.js.map +1 -0
  475. package/dist/workflows/v3/library-materialize.d.ts.map +1 -1
  476. package/dist/workflows/v3/library-materialize.js +5 -1
  477. package/dist/workflows/v3/library-materialize.js.map +1 -1
  478. package/dist/workflows/v3/library-schema.d.ts +21 -0
  479. package/dist/workflows/v3/library-schema.d.ts.map +1 -1
  480. package/dist/workflows/v3/library-schema.js +95 -1
  481. package/dist/workflows/v3/library-schema.js.map +1 -1
  482. package/dist/workflows/v3/progress-projection.d.ts +3 -0
  483. package/dist/workflows/v3/progress-projection.d.ts.map +1 -1
  484. package/dist/workflows/v3/progress-projection.js +23 -1
  485. package/dist/workflows/v3/progress-projection.js.map +1 -1
  486. package/dist/workflows/v3/run-envelope.d.ts +46 -1
  487. package/dist/workflows/v3/run-envelope.d.ts.map +1 -1
  488. package/dist/workflows/v3/run-envelope.js +32 -1
  489. package/dist/workflows/v3/run-envelope.js.map +1 -1
  490. package/package.json +2 -2
  491. package/dist/dashboard-web/chunks/bot-defaults-page-O376WSER.js +0 -5
  492. package/dist/dashboard-web/chunks/chunk-H7P5UV4W.js +0 -49
  493. package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +0 -1
  494. package/dist/dashboard-web/chunks/connectors-page-IR54AOAI.js +0 -1
  495. package/dist/dashboard-web/chunks/overview-page-QJMI6NLW.js +0 -1
  496. package/dist/dashboard-web/chunks/sessions-page-KWLGBX6G.js +0 -3
  497. package/dist/dashboard-web/chunks/settings-page-TNZEPC7V.js +0 -2
  498. package/dist/services/sandbox-land.d.ts +0 -45
  499. package/dist/services/sandbox-land.d.ts.map +0 -1
  500. package/dist/services/sandbox-land.js +0 -394
  501. package/dist/services/sandbox-land.js.map +0 -1
  502. package/dist/utils/screen-analyzer.d.ts +0 -75
  503. package/dist/utils/screen-analyzer.d.ts.map +0 -1
  504. package/dist/utils/screen-analyzer.js +0 -333
  505. package/dist/utils/screen-analyzer.js.map +0 -1
@@ -0,0 +1,19 @@
1
+ /** Register a freshly-issued nonce (called when the alert card is sent). */
2
+ export declare function registerOverloadNonce(nonce: string): void;
3
+ /**
4
+ * Try to claim `nonce` for `action`. Returns true exactly once per (nonce,
5
+ * action): the two buttons on one card each get one claim, so the owner can
6
+ * click BOTH 清僵尸 and 挂起闲置 on the same alert, but neither twice. Unknown
7
+ * or expired nonce → false (stale card).
8
+ */
9
+ export declare function claimOverloadNonce(nonce: string, action: string): boolean;
10
+ export declare function _resetOverloadNoncesForTest(): void;
11
+ export declare function _overloadNonceCountForTest(): number;
12
+ /**
13
+ * Undo a claim for `(nonce, action)` so the button can be retried. Called when
14
+ * the action a claim guarded (the sweep) fails: without this a transient error
15
+ * would permanently burn the button and force the owner to the CLI. No-op if
16
+ * the nonce already expired/pruned.
17
+ */
18
+ export declare function releaseOverloadNonce(nonce: string, action: string): void;
19
+ //# sourceMappingURL=overload-nonce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overload-nonce.d.ts","sourceRoot":"","sources":["../../../src/im/lark/overload-nonce.ts"],"names":[],"mappings":"AA2BA,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUzE;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAAsC;AACzF,wBAAgB,0BAA0B,IAAI,MAAM,CAAwB;AAE5E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIxE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * One-shot nonce store for host-overload alert cards. Each `entered` alert card
3
+ * embeds a fresh nonce in its button `value`; the daemon that sent the card
4
+ * remembers it here. When the owner clicks a button, the handler validates the
5
+ * nonce is still live before executing, then burns it — so a re-delivered
6
+ * callback, a double-tap, or a click on a stale card (from before a daemon
7
+ * restart) can't fire the destructive op twice.
8
+ *
9
+ * Pure in-memory, per daemon process (the sending daemon is the one that
10
+ * validates, since it sent the card). Daemon restart clears it → old cards
11
+ * expire naturally, which is the desired behaviour.
12
+ */
13
+ const NONCE_TTL_MS = 60 * 60_000; // 1h: an alert older than this is stale; re-alert will issue a new one.
14
+ const nonces = new Map();
15
+ let lastPrunedAt = 0;
16
+ const PRUNE_INTERVAL_MS = 60_000;
17
+ function prune(now) {
18
+ if (now - lastPrunedAt < PRUNE_INTERVAL_MS)
19
+ return;
20
+ lastPrunedAt = now;
21
+ for (const [k, e] of nonces) {
22
+ if (now - e.at >= NONCE_TTL_MS)
23
+ nonces.delete(k);
24
+ }
25
+ }
26
+ /** Register a freshly-issued nonce (called when the alert card is sent). */
27
+ export function registerOverloadNonce(nonce) {
28
+ if (!nonce)
29
+ return;
30
+ const now = Date.now();
31
+ prune(now);
32
+ nonces.set(nonce, { at: now, usedActions: new Set() });
33
+ }
34
+ /**
35
+ * Try to claim `nonce` for `action`. Returns true exactly once per (nonce,
36
+ * action): the two buttons on one card each get one claim, so the owner can
37
+ * click BOTH 清僵尸 and 挂起闲置 on the same alert, but neither twice. Unknown
38
+ * or expired nonce → false (stale card).
39
+ */
40
+ export function claimOverloadNonce(nonce, action) {
41
+ if (!nonce)
42
+ return false;
43
+ const now = Date.now();
44
+ prune(now);
45
+ const e = nonces.get(nonce);
46
+ if (!e)
47
+ return false;
48
+ if (now - e.at >= NONCE_TTL_MS) {
49
+ nonces.delete(nonce);
50
+ return false;
51
+ }
52
+ if (e.usedActions.has(action))
53
+ return false;
54
+ e.usedActions.add(action);
55
+ return true;
56
+ }
57
+ export function _resetOverloadNoncesForTest() { nonces.clear(); lastPrunedAt = 0; }
58
+ export function _overloadNonceCountForTest() { return nonces.size; }
59
+ /**
60
+ * Undo a claim for `(nonce, action)` so the button can be retried. Called when
61
+ * the action a claim guarded (the sweep) fails: without this a transient error
62
+ * would permanently burn the button and force the owner to the CLI. No-op if
63
+ * the nonce already expired/pruned.
64
+ */
65
+ export function releaseOverloadNonce(nonce, action) {
66
+ if (!nonce)
67
+ return;
68
+ const e = nonces.get(nonce);
69
+ if (e)
70
+ e.usedActions.delete(action);
71
+ }
72
+ //# sourceMappingURL=overload-nonce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overload-nonce.js","sourceRoot":"","sources":["../../../src/im/lark/overload-nonce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,wEAAwE;AAG1G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;AAC7C,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,GAAG,GAAG,YAAY,GAAG,iBAAiB;QAAE,OAAO;IACnD,YAAY,GAAG,GAAG,CAAC;IACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,YAAY;YAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,CAAC,GAAG,CAAC,CAAC;IACX,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,MAAc;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,CAAC,GAAG,CAAC,CAAC;IACX,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC;QAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IACvE,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,2BAA2B,KAAW,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;AACzF,MAAM,UAAU,0BAA0B,KAAa,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,MAAc;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC;QAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"v3-progress-card.d.ts","sourceRoot":"","sources":["../../../src/im/lark/v3-progress-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,oBAAoB,CAAC;KAC5B,CAAC;CACH;AAID,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAmIR"}
1
+ {"version":3,"file":"v3-progress-card.d.ts","sourceRoot":"","sources":["../../../src/im/lark/v3-progress-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,oBAAoB,CAAC;KAC5B,CAAC;CACH;AAID,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CA6IR"}
@@ -79,6 +79,11 @@ export function buildV3ProgressCard(view, options = {}) {
79
79
  parts.push(`\`${escapeMd(view.issue.errorCode)}\``);
80
80
  appendSection(elements, '⚠️ 错误码', parts.length > 0 ? parts.join(' · ') : 'UNKNOWN');
81
81
  }
82
+ if (view.feishuHostFailed) {
83
+ appendSection(elements, 'Feishu host 节点失败', view.upstreamNonHostFinished
84
+ ? '上游非 host 节点已完成,失败发生在 Feishu host 节点。该节点可能是通知,也可能是业务交付;请按 DAG 语义核对后再决定是否重试。'
85
+ : '失败发生在 Feishu host 节点。该节点可能是通知,也可能是业务交付;其它业务节点状态请以节点进度为准。');
86
+ }
82
87
  if (view.uncertainHostEffectCount && view.uncertainHostEffectCount > 0) {
83
88
  appendSection(elements, '⚠️ 外部效果待核实', `流程已停止,但有 ${view.uncertainHostEffectCount} 个外部操作的最终状态无法确认。请在 Web 详情中核对,不要直接重试该节点。`);
84
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"v3-progress-card.js","sourceRoot":"","sources":["../../../src/im/lark/v3-progress-card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"v3-progress-card.js","sourceRoot":"","sources":["../../../src/im/lark/v3-progress-card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Pure four-state resolution for `GET /api/sessions/:id/trigger-result`
3
+ * (async dispatch design A). Kept free of daemon/registry imports so it can be
4
+ * unit-tested directly; dashboard-ipc-server gathers the three inputs (live
5
+ * session, on-disk session record, persisted async result) and calls this.
6
+ *
7
+ * State contract (see docs/developer/platform/botmux-async-dispatch-design.md):
8
+ * - completed: final output captured (mem OR durable) → output.content + finishedAt
9
+ * - running: live session in flight, or a session record still open
10
+ * - failed: session record closed with no captured output (no_output; soft
11
+ * terminal — may be a genuine failure OR a caller-initiated close)
12
+ * - not_found: no session record anywhere (never existed / invalid id)
13
+ *
14
+ * Restart guarantee: as long as EITHER a session record OR a persisted result
15
+ * exists, this never returns not_found — an already-completed turn resolves to
16
+ * completed even after the in-memory Map is gone.
17
+ */
18
+ import type { TriggerResponse } from './trigger-types.js';
19
+ /** Fail-closed / positive-proof cross-bot ownership gate for trigger-result.
20
+ *
21
+ * sessionStore.getSession() scans EVERY bot's sessions-*.json and the async
22
+ * store is a machine-wide shared directory, so a request routed to daemon A
23
+ * carrying a sessionId owned by bot B could read B's record / persisted output.
24
+ * This decides which of the two shared-store sources daemon `owner` may trust.
25
+ *
26
+ * A source is kept ONLY with POSITIVE proof of ownership — "not known-foreign"
27
+ * is deliberately insufficient, so a legacy unstamped persisted file with no
28
+ * owned session (unprovable owner) is dropped rather than leaked.
29
+ *
30
+ * - live ds: always ours (in THIS daemon's registry) → caller passes liveDs.
31
+ * - stored: keep iff there's a live ds OR its larkAppId == owner.
32
+ * - persisted: keep iff stamped with owner, OR (unstamped legacy) corroborated
33
+ * by an owned session context for the same id.
34
+ *
35
+ * Returns which sources survive, plus `foreignLeak` = raw data existed but none
36
+ * of it is attributable to us (→ caller returns a clean not_found miss). */
37
+ export interface OwnershipInputs {
38
+ owner: string;
39
+ liveDs: boolean;
40
+ storedOwner?: string;
41
+ storedExists: boolean;
42
+ persistedOwner?: string;
43
+ persistedExists: boolean;
44
+ }
45
+ export interface OwnershipDecision {
46
+ keepStored: boolean;
47
+ keepPersisted: boolean;
48
+ foreignLeak: boolean;
49
+ }
50
+ export declare function decideAsyncOwnership(inp: OwnershipInputs): OwnershipDecision;
51
+ export interface AsyncStateInputs {
52
+ sessionId: string;
53
+ /** Whether a live DaemonSession is currently registered for this id. */
54
+ liveActive: boolean;
55
+ /** chatId from the live session or the stored record, if known. */
56
+ chatId?: string;
57
+ /** In-memory async result for the resolved trigger, if the session is live. */
58
+ memResult?: {
59
+ status: 'pending' | 'completed';
60
+ content?: string;
61
+ completedAt?: number;
62
+ };
63
+ /** triggerId the in-memory result is keyed under (latest or explicit). */
64
+ memTriggerId?: string;
65
+ /** Durable persisted result (survives restart), if any. */
66
+ persisted?: {
67
+ triggerId: string;
68
+ result: {
69
+ status: 'pending' | 'completed';
70
+ content?: string;
71
+ completedAt?: number;
72
+ };
73
+ };
74
+ /** On-disk session record status: 'open' (active), 'closed', or absent. */
75
+ storedStatus?: 'open' | 'closed';
76
+ /** closedAt ISO string from the stored record, for failed/finishedAt. */
77
+ closedAt?: string;
78
+ /** triggerId from the request query, if the caller pinned one. */
79
+ requestedTriggerId?: string;
80
+ }
81
+ export declare function resolveAsyncTriggerState(inp: AsyncStateInputs): TriggerResponse;
82
+ //# sourceMappingURL=async-trigger-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-trigger-state.d.ts","sourceRoot":"","sources":["../../src/services/async-trigger-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;;;;;;;;;;;;6EAiB6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC1B;AACD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;CACtB;AACD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,CAW5E;AAGD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,SAAS,CAAC,EAAE;QAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxF,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE;YAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACrF,CAAC;IACF,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACjC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,GAAG,eAAe,CA2F/E"}
@@ -0,0 +1,95 @@
1
+ export function decideAsyncOwnership(inp) {
2
+ const keepStored = inp.storedExists && (inp.liveDs || (!!inp.owner && inp.storedOwner === inp.owner));
3
+ const ownedSessionForId = inp.liveDs || keepStored;
4
+ const keepPersisted = inp.persistedExists && ((!!inp.owner && inp.persistedOwner === inp.owner) ||
5
+ (inp.persistedOwner === undefined && ownedSessionForId));
6
+ // Raw data surfaced from the shared stores, but nothing is attributable to us.
7
+ const foreignLeak = !inp.liveDs && !keepStored && !keepPersisted && (inp.storedExists || inp.persistedExists);
8
+ return { keepStored, keepPersisted, foreignLeak };
9
+ }
10
+ export function resolveAsyncTriggerState(inp) {
11
+ const { sessionId, chatId } = inp;
12
+ // Precise-triggerId miss: the caller pinned ?triggerId= but no record (in
13
+ // memory or durable) matches it, AND a session context exists for this id.
14
+ // Preserve the legacy bad_request semantics — do NOT fall through to session
15
+ // open/closed and misreport running/failed for a trigger this session never
16
+ // had. (The caller only passes memResult/persisted that actually match the
17
+ // requested id, so "both absent + session exists" == precise miss.) When no
18
+ // session exists at all, this falls through to the not_found branch below.
19
+ const sessionExists = inp.liveActive || inp.storedStatus !== undefined;
20
+ if (inp.requestedTriggerId && !inp.memResult && !inp.persisted && sessionExists) {
21
+ // No `state`: this is a request-shape error (the caller pinned a triggerId
22
+ // this session never had), NOT one of the four task-lifecycle states. Keep
23
+ // it distinct from the public `state:"not_found"` (ok:true, session absent)
24
+ // so callers don't conflate "bad request" with "no such session".
25
+ return {
26
+ ok: false,
27
+ triggerId: inp.requestedTriggerId,
28
+ errorCode: 'bad_request',
29
+ error: `async trigger not found for session: ${inp.requestedTriggerId}`,
30
+ message: 'requested triggerId not found for this session',
31
+ };
32
+ }
33
+ const completed = (inp.memResult?.status === 'completed' && inp.memTriggerId
34
+ ? { triggerId: inp.memTriggerId, content: inp.memResult.content, completedAt: inp.memResult.completedAt }
35
+ : undefined) ??
36
+ (inp.persisted?.result.status === 'completed'
37
+ ? { triggerId: inp.persisted.triggerId, content: inp.persisted.result.content, completedAt: inp.persisted.result.completedAt }
38
+ : undefined);
39
+ if (completed) {
40
+ const finishedAt = completed.completedAt ? new Date(completed.completedAt).toISOString() : undefined;
41
+ return {
42
+ ok: true,
43
+ state: 'completed',
44
+ triggerId: completed.triggerId,
45
+ action: 'completed',
46
+ target: { kind: 'turn', sessionId, chatId },
47
+ output: completed.content !== undefined ? { content: completed.content } : undefined,
48
+ finishedAt,
49
+ async: { status: 'completed', sessionId, completedAt: finishedAt },
50
+ message: 'async trigger completed',
51
+ };
52
+ }
53
+ // Closed record with no captured output → soft-terminal failed. Checked
54
+ // BEFORE the durable-pending running branch: a closed session whose persisted
55
+ // record is still `pending` was armed but never completed (a cancel/close or a
56
+ // genuine failure), so it must resolve to failed, not loop as running forever.
57
+ // The caller distinguishes its own cancel via intent, not this signal.
58
+ if (inp.storedStatus === 'closed') {
59
+ return {
60
+ ok: true,
61
+ state: 'failed',
62
+ triggerId: inp.persisted?.triggerId ?? inp.requestedTriggerId,
63
+ target: { kind: 'turn', sessionId, chatId },
64
+ errorCode: 'no_output',
65
+ error: '会话已终止但未捕获最终产出(可能失败或被取消)',
66
+ finishedAt: inp.closedAt ?? undefined,
67
+ message: 'async trigger terminated without output',
68
+ };
69
+ }
70
+ // Running: a live session (worker in flight), a still-open session record,
71
+ // or a durable pending result with NO session record on disk (restart edge:
72
+ // the trigger was armed but its session file is momentarily unavailable —
73
+ // never downgrade this to not_found).
74
+ if (inp.liveActive || inp.storedStatus === 'open' || inp.persisted?.result.status === 'pending') {
75
+ return {
76
+ ok: true,
77
+ state: 'running',
78
+ triggerId: inp.persisted?.triggerId ?? inp.requestedTriggerId,
79
+ action: 'queued',
80
+ target: { kind: 'turn', sessionId, chatId },
81
+ async: { status: 'pending', sessionId },
82
+ message: 'async trigger running',
83
+ };
84
+ }
85
+ // No session record anywhere, no persisted result.
86
+ return {
87
+ ok: true,
88
+ state: 'not_found',
89
+ triggerId: inp.requestedTriggerId,
90
+ errorCode: 'session_not_found',
91
+ error: `no session record for: ${sessionId}`,
92
+ message: 'no session found',
93
+ };
94
+ }
95
+ //# sourceMappingURL=async-trigger-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-trigger-state.js","sourceRoot":"","sources":["../../src/services/async-trigger-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface PersistedAsyncTriggerResult {
2
+ status: 'pending' | 'completed';
3
+ createdAt: number;
4
+ completedAt?: number;
5
+ content?: string;
6
+ }
7
+ /** Record a freshly-armed async trigger as pending. Best-effort; a failed write
8
+ * only loses the restart-recovery guarantee, never the in-memory path.
9
+ * `ownerLarkAppId` is REQUIRED — it stamps the owning bot so cross-bot lookups
10
+ * can be rejected fail-closed (an unstamped file would be un-attributable and
11
+ * therefore un-servable). Pass '' only in tests that deliberately exercise the
12
+ * legacy-unstamped path. */
13
+ export declare function recordPending(sessionId: string, triggerId: string, createdAt: number, ownerLarkAppId: string): void;
14
+ /** Mark an async trigger completed with its captured final output.
15
+ * `ownerLarkAppId` is REQUIRED (see recordPending). */
16
+ export declare function recordCompleted(sessionId: string, triggerId: string, content: string, completedAt: number, ownerLarkAppId: string): void;
17
+ /** Look up a persisted result. With no triggerId, resolves the latest recorded
18
+ * one (mirrors the in-memory latestAsyncTriggerId semantics). Returns the
19
+ * stamped `ownerLarkAppId` (if any) so the caller can enforce cross-bot
20
+ * isolation before trusting the result. */
21
+ export declare function lookup(sessionId: string, triggerId?: string): {
22
+ triggerId: string;
23
+ result: PersistedAsyncTriggerResult;
24
+ ownerLarkAppId?: string;
25
+ } | undefined;
26
+ /** Delete a session's persisted async results (called on session close). */
27
+ export declare function deleteResults(sessionId: string): void;
28
+ //# sourceMappingURL=async-trigger-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-trigger-store.d.ts","sourceRoot":"","sources":["../../src/services/async-trigger-store.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkDD;;;;;6BAK6B;AAC7B,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAMnH;AAED;wDACwD;AACxD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAYxI;AAED;;;4CAG4C;AAC5C,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,2BAA2B,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,SAAS,CAOZ;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGrD"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Async trigger result store — durably persists asyncReturnSessionId trigger
3
+ * outcomes so `GET /api/sessions/:id/trigger-result` survives a daemon restart.
4
+ *
5
+ * Background: async trigger state normally lives only in memory on the active
6
+ * DaemonSession (`asyncTriggerResults`). A daemon restart (or idle-suspend)
7
+ * drops that Map, which would make a poller see `session_not_found` for a turn
8
+ * that in fact already completed — a false "task lost" for programmatic callers
9
+ * (e.g. the riff task runner) that reconcile purely off this endpoint.
10
+ *
11
+ * This store mirrors frozen-card-store's on-disk contract (atomic tmp+rename
12
+ * under {dataDir}/async-triggers/{sessionId}.json). It holds the final output
13
+ * text so `completed` can be rebuilt from disk after a restart — the CLI
14
+ * transcript is the ultimate source of truth, but insight-layer projections
15
+ * deliberately scrub raw output, so re-parsing them cannot reproduce
16
+ * output.content. Persisting the captured final_output is both cheaper and
17
+ * strictly more faithful than transcript re-parsing across 20+ CLI formats.
18
+ *
19
+ * The file is keyed by botmux sessionId (1:1 with a virtual async session's
20
+ * single turn) and stores every triggerId seen for that session, so both
21
+ * latest-wins polling (by sessionId) and exact-match polling (by triggerId)
22
+ * resolve after a restart.
23
+ */
24
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, renameSync, unlinkSync } from 'node:fs';
25
+ import { join } from 'node:path';
26
+ import { config } from '../config.js';
27
+ import { logger } from '../utils/logger.js';
28
+ function getDir() {
29
+ return join(config.session.dataDir, 'async-triggers');
30
+ }
31
+ function getFilePath(sessionId) {
32
+ return join(getDir(), `${sessionId}.json`);
33
+ }
34
+ function ensureDir() {
35
+ const dir = getDir();
36
+ if (!existsSync(dir))
37
+ mkdirSync(dir, { recursive: true });
38
+ }
39
+ function load(sessionId) {
40
+ const fp = getFilePath(sessionId);
41
+ if (!existsSync(fp))
42
+ return { results: {} };
43
+ try {
44
+ const data = JSON.parse(readFileSync(fp, 'utf-8'));
45
+ if (!data || typeof data !== 'object' || typeof data.results !== 'object')
46
+ return { results: {} };
47
+ return { ownerLarkAppId: data.ownerLarkAppId, latestTriggerId: data.latestTriggerId, results: data.results ?? {} };
48
+ }
49
+ catch (err) {
50
+ logger.debug(`Failed to load async trigger results for ${sessionId}: ${err}`);
51
+ return { results: {} };
52
+ }
53
+ }
54
+ function save(sessionId, file) {
55
+ ensureDir();
56
+ const fp = getFilePath(sessionId);
57
+ const tmpFp = fp + '.tmp';
58
+ try {
59
+ writeFileSync(tmpFp, JSON.stringify(file, null, 2), 'utf-8');
60
+ renameSync(tmpFp, fp);
61
+ }
62
+ catch (err) {
63
+ logger.debug(`Failed to persist async trigger results for ${sessionId}: ${err}`);
64
+ }
65
+ }
66
+ /** Record a freshly-armed async trigger as pending. Best-effort; a failed write
67
+ * only loses the restart-recovery guarantee, never the in-memory path.
68
+ * `ownerLarkAppId` is REQUIRED — it stamps the owning bot so cross-bot lookups
69
+ * can be rejected fail-closed (an unstamped file would be un-attributable and
70
+ * therefore un-servable). Pass '' only in tests that deliberately exercise the
71
+ * legacy-unstamped path. */
72
+ export function recordPending(sessionId, triggerId, createdAt, ownerLarkAppId) {
73
+ const file = load(sessionId);
74
+ if (ownerLarkAppId)
75
+ file.ownerLarkAppId = ownerLarkAppId;
76
+ file.results[triggerId] = { status: 'pending', createdAt };
77
+ file.latestTriggerId = triggerId;
78
+ save(sessionId, file);
79
+ }
80
+ /** Mark an async trigger completed with its captured final output.
81
+ * `ownerLarkAppId` is REQUIRED (see recordPending). */
82
+ export function recordCompleted(sessionId, triggerId, content, completedAt, ownerLarkAppId) {
83
+ const file = load(sessionId);
84
+ if (ownerLarkAppId)
85
+ file.ownerLarkAppId = ownerLarkAppId;
86
+ const prev = file.results[triggerId];
87
+ file.results[triggerId] = {
88
+ status: 'completed',
89
+ createdAt: prev?.createdAt ?? completedAt,
90
+ completedAt,
91
+ content,
92
+ };
93
+ if (!file.latestTriggerId)
94
+ file.latestTriggerId = triggerId;
95
+ save(sessionId, file);
96
+ }
97
+ /** Look up a persisted result. With no triggerId, resolves the latest recorded
98
+ * one (mirrors the in-memory latestAsyncTriggerId semantics). Returns the
99
+ * stamped `ownerLarkAppId` (if any) so the caller can enforce cross-bot
100
+ * isolation before trusting the result. */
101
+ export function lookup(sessionId, triggerId) {
102
+ const file = load(sessionId);
103
+ const resolved = triggerId || file.latestTriggerId;
104
+ if (!resolved)
105
+ return undefined;
106
+ const result = file.results[resolved];
107
+ if (!result)
108
+ return undefined;
109
+ return { triggerId: resolved, result, ownerLarkAppId: file.ownerLarkAppId };
110
+ }
111
+ /** Delete a session's persisted async results (called on session close). */
112
+ export function deleteResults(sessionId) {
113
+ const fp = getFilePath(sessionId);
114
+ try {
115
+ if (existsSync(fp))
116
+ unlinkSync(fp);
117
+ }
118
+ catch { /* ignore */ }
119
+ }
120
+ //# sourceMappingURL=async-trigger-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-trigger-store.js","sourceRoot":"","sources":["../../src/services/async-trigger-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bot-config-store.d.ts","sourceRoot":"","sources":["../../src/services/bot-config-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot-config-store.d.ts","sourceRoot":"","sources":["../../src/services/bot-config-store.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  import { getBot, readBotSkillPolicy } from '../bot-registry.js';
2
+ import { republishResolvedAllowedUsersDescriptor, scheduleAllowedUsersResolveRetryFromMutation } from '../bot-registry.js';
3
+ import { config } from '../config.js';
4
+ import { writeAllowedUsersResolveCache } from '../utils/allowed-users-cache.js';
2
5
  import { rmwBotEntry } from './config-store.js';
3
6
  import { resolveAllowedUsersWithMap } from '../im/lark/client.js';
4
7
  import { CLI_OPTIONS, resolveCliId } from '../setup/bot-config-editor.js';
@@ -6,7 +9,7 @@ import { expandHomePath } from '../utils/working-dir.js';
6
9
  import { resolveTeamRoleFile } from '../core/role-resolver.js';
7
10
  import { statSync } from 'node:fs';
8
11
  import { logger } from '../utils/logger.js';
9
- import { parseCustomPassthroughInput } from '../core/passthrough-commands.js';
12
+ import { parseCustomPassthroughInput, parseCanTalkDaemonCommandsInput } from '../core/passthrough-commands.js';
10
13
  import { parseStartupCommandsInput } from '../core/startup-commands.js';
11
14
  import { isReservedPerBotEnvKey, sanitizePerBotEnv } from '../core/per-bot-env.js';
12
15
  /**
@@ -39,6 +42,7 @@ export const CONFIG_FIELDS = [
39
42
  { key: 'p2pMode', configKey: 'p2pMode', kind: 'enum', effect: 'immediate', clearable: true, enumValues: ['thread', 'chat'], hint: '私聊单聊模式 thread|chat;chat=扁平连续会话,thread/unset 回默认(每条 DM 独立会话)' },
40
43
  { key: 'maxLiveWorkers', configKey: 'maxLiveWorkers', kind: 'number', effect: 'immediate', clearable: true, hint: '最大常驻会话数;超过后最久未用的会话自动休眠(退出后台进程和 CLI、回收内存,下条消息冷恢复);unset=默认 30' },
41
44
  { key: 'customPassthroughCommands', configKey: 'customPassthroughCommands', kind: 'stringList', effect: 'immediate', clearable: true, hint: '额外放行透传给 CLI 的 slash 命令(逗号/空格分隔,如 /goal /export);unset 回仅内置白名单' },
45
+ { key: 'canTalkDaemonCommands', configKey: 'canTalkDaemonCommands', kind: 'stringList', effect: 'immediate', clearable: true, parseList: parseCanTalkDaemonCommandsInput, hint: '把列出的 daemon 命令权限从 canOperate(仅管理员)降到 canTalk(对话放行即可用),如 /status /help;仅认 daemon 命令,透传命令无效;unset 回全部仅管理员' },
42
46
  { key: 'startupCommands', configKey: 'startupCommands', kind: 'stringList', effect: 'next-session', clearable: true, parseList: parseStartupCommandsInput, hint: '开会话后、首条消息前自动发给 CLI 的命令(逗号/换行分隔,可带参数,如 /effort ultracode);unset 回不发' },
43
47
  { key: 'env', configKey: 'env', kind: 'json', effect: 'next-session', clearable: true, hint: 'per-bot 环境变量 JSON(如 {"ANTHROPIC_BASE_URL":"…","ANTHROPIC_AUTH_TOKEN":"…"} 让本 bot 走 GLM/第三方服务商,或设 HTTPS_PROXY);注入到本 bot 的 CLI 进程,下个会话生效;值不显示(脱敏);unset 清除' },
44
48
  { key: 'backendType', configKey: 'backendType', kind: 'enum', effect: 'next-session', clearable: true, enumValues: ['pty', 'tmux', 'herdr', 'zellij', 'riff'], hint: '会话后端类型:pty=本地 PTY 子进程(默认)|tmux=tmux 会话|herdr=herdr 终端复用|zellij=zellij 多路复用|riff=远程 riff agent 服务;选 riff 时需配置 riff 字段;unset 回 pty' },
@@ -215,7 +219,7 @@ export async function setBotAllowedUsers(larkAppId, rawEntries, senderOpenId) {
215
219
  catch {
216
220
  return { ok: false, reason: 'bot_not_registered' };
217
221
  }
218
- const { resolved, map } = await resolveAllowedUsersWithMap(larkAppId, rawEntries);
222
+ const { resolved, map, entryStatus } = await resolveAllowedUsersWithMap(larkAppId, rawEntries);
219
223
  if (resolved.length === 0)
220
224
  return { ok: false, reason: 'empty_resolved' };
221
225
  if (senderOpenId && !resolved.includes(senderOpenId))
@@ -229,6 +233,34 @@ export async function setBotAllowedUsers(larkAppId, rawEntries, senderOpenId) {
229
233
  bot.config.allowedUsers = rawEntries;
230
234
  bot.resolvedAllowedUsers = resolved;
231
235
  bot.rawAllowedUserResolution = map;
236
+ // Keep the last-known-good sidecar + dashboard descriptor in lockstep with the
237
+ // live allowlist. Without this, a hot `set allowedUsers` (e.g. owner switches
238
+ // from email to on_ while contact API is healthy) leaves the new raw key out
239
+ // of the cache; the next clean restart during an API blip would then resolve
240
+ // empty and fail-closed lock the owner out — the exact bug this feature fixes.
241
+ // retainKeys prunes stale keys (old email/union no longer configured);
242
+ // deleteEntries drops entries that resolved DEFINITIVELY-gone in THIS set (e.g.
243
+ // a removed co-owner) so a later transient restart can't revive them from cache.
244
+ const definitiveEntries = [];
245
+ let anyTransient = false;
246
+ for (const [entry, status] of entryStatus.entries()) {
247
+ if (status === 'definitive')
248
+ definitiveEntries.push(entry);
249
+ else if (status === 'transient')
250
+ anyTransient = true;
251
+ }
252
+ writeAllowedUsersResolveCache(config.session.dataDir, larkAppId, {
253
+ map,
254
+ retainKeys: rawEntries,
255
+ deleteEntries: definitiveEntries,
256
+ });
257
+ republishResolvedAllowedUsersDescriptor(larkAppId, resolved);
258
+ // Partial-transient set: the owner (senderOpenId) resolved (self_lockout guard
259
+ // above guarantees it), but some OTHER entry transient-failed. Schedule the
260
+ // same background heal the startup path uses so that entry recovers when the
261
+ // contact API does, instead of silently staying dropped until the next restart.
262
+ if (anyTransient)
263
+ scheduleAllowedUsersResolveRetryFromMutation(larkAppId);
232
264
  logger.info(`[config:${larkAppId}] allowedUsers updated: ${rawEntries.length} entries, ${resolved.length} resolved`);
233
265
  return { ok: true, raw: rawEntries, resolved };
234
266
  }