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
package/dist/dashboard.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // src/dashboard.ts
2
2
  import { createServer, get as httpGet, request as httpRequest } from 'node:http';
3
3
  import { createServer as createTcpServer, connect as netConnect } from 'node:net';
4
- import { readFileSync, existsSync, mkdirSync, readdirSync, statSync, createReadStream, } from 'node:fs';
4
+ import { readFileSync, existsSync, mkdirSync, readdirSync, statSync, createReadStream, realpathSync, } from 'node:fs';
5
5
  import { atomicWriteFileSync } from './utils/atomic-write.js';
6
6
  import { join, dirname, extname, resolve, relative, isAbsolute } from 'node:path';
7
7
  import { homedir } from 'node:os';
@@ -13,6 +13,8 @@ import { listenWithProbe } from './utils/listen-with-probe.js';
13
13
  import { generateToken, parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, persistToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
14
14
  import { DaemonRegistry, botsRosterSignature } from './dashboard/registry.js';
15
15
  import { Aggregator, subscribeDaemon } from './dashboard/aggregator.js';
16
+ import { createSessionPresentationCoordinator } from './dashboard/session-presentation.js';
17
+ import { parseDashboardAskAnswerRequest, proxyDashboardAskAnswer, } from './dashboard/desktop-asks.js';
16
18
  import { createDebugTerminalManager } from './dashboard/debug-terminal.js';
17
19
  import { pickCreatorForGroup } from './dashboard/operator-selector.js';
18
20
  import { buildTeamGroupCreatePayload, planGroupCreator } from './dashboard/team-group.js';
@@ -22,7 +24,7 @@ import { defaultRunsDir as v3RunsDir } from './workflows/v3/ops-projection.js';
22
24
  import { verifyWorkflowDaemonIpcResponse, workflowDaemonIpcHeaders, WORKFLOW_DAEMON_IPC_ROUTE_PREFIX, } from './workflows/v3/daemon-ipc-auth.js';
23
25
  import { handleDashboardTriggerApi } from './dashboard/trigger-api.js';
24
26
  import { handleConnectorApi } from './dashboard/connector-api.js';
25
- import { redactGroupsForPublic, redactSchedulesForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
27
+ import { redactGroupsForPublic, redactSchedulesForPublic, redactSessionEventForPublic, redactSessionsForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
26
28
  import { handleWebhookRoute } from './dashboard/webhook-routes.js';
27
29
  import { handleFederationApi } from './dashboard/federation-api.js';
28
30
  import { handleFederationSpokeApi, syncAllMemberships, autoBindOwnerIfUnambiguous } from './dashboard/federation-spoke-api.js';
@@ -36,6 +38,7 @@ import { hostLocalTimeZone, scheduleTimeZone } from './utils/timezone.js';
36
38
  import { buildDashboardUrls } from './core/dashboard-url.js';
37
39
  import { resolveBotmuxDataDir } from './core/data-dir.js';
38
40
  import { dashboardSecretPath } from './core/dashboard-secret.js';
41
+ import { getGitRepoInfo } from './core/session-row-enrichment.js';
39
42
  import { deleteWhiteboard, listWhiteboards, readWhiteboard, whiteboardEnabled } from './services/whiteboard-store.js';
40
43
  import { isLocalDevInstall, botmuxVersionAt, botmuxCliEntry, botmuxInstallRoot } from './utils/install-info.js';
41
44
  import { checkNode, detectBotmuxInstalls, resolveCurrentVersion } from './utils/install-diagnostics.js';
@@ -74,7 +77,7 @@ import { startPlatformTunnelClient } from './platform/tunnel-client.js';
74
77
  import { applyPlatformTeamSync, getPlatformTeamSyncRev, listPlatformTeams } from './services/platform-team-store.js';
75
78
  import { getBotUnionId } from './services/bot-union-ids-store.js';
76
79
  import { cleanupIdleSessions, parseIdleCleanupHours } from './dashboard/session-cleanup.js';
77
- import { handleDesktopCompat } from './dashboard/compat.js';
80
+ import { compatMachineIdForAuthenticatedRequest, handleDesktopCompat, } from './dashboard/compat.js';
78
81
  import { isDashboardChunkJsPath, missingDashboardChunkModule } from './dashboard/stale-chunk-module.js';
79
82
  import { aggregateRoleBatch, parseRoleBatchTargets } from './dashboard/roles-batch.js';
80
83
  import { automateOpenPlatformSetup, vcListenerEventGateError } from './setup/open-platform-automation.js';
@@ -191,6 +194,13 @@ function verifyDashboardBinding(port) {
191
194
  mkdirSync(REGISTRY_DIR, { recursive: true });
192
195
  const registry = new DaemonRegistry(REGISTRY_DIR);
193
196
  const aggregator = new Aggregator();
197
+ const sessionPresentation = createSessionPresentationCoordinator(aggregator, getGitRepoInfo);
198
+ // Keep Git-derived fields in the central read-model so REST snapshots and SSE
199
+ // share one row shape. Idle/limited turn boundaries force a branch refresh
200
+ // after the CLI has had a chance to change repositories — that is one
201
+ // `git rev-parse` per session per turn, bounded by the resolver's concurrency
202
+ // cap, NOT a slow background poll.
203
+ aggregator.on(sessionPresentation.onEvent);
194
204
  // 调试终端(owner-only 裸 bash)。默认工作目录取当前所有 session 的工作目录去重,
195
205
  // 让 owner 从熟悉的目录起终端复现问题;都没有时模块内退回 homedir。
196
206
  const debugTerminalManager = createDebugTerminalManager({
@@ -212,6 +222,64 @@ const debugTerminalManager = createDebugTerminalManager({
212
222
  * tasks (see scheduler.belongsToOwner). Returns undefined when the row is
213
223
  * genuinely unknown or no daemon is online.
214
224
  */
225
+ /**
226
+ * Read-only directory listing for the dashboard sandbox-paths tree picker.
227
+ * Served locally by the dashboard process (same host as the daemons). Returns
228
+ * immediate CHILD DIRECTORIES only — never file contents. Trust model matches
229
+ * validateWorkingDir: the caller is an authed admin and the daemon already runs
230
+ * prompts with full FS access, so this is a convenience browser, not a security
231
+ * boundary. Symlinks are realpath-resolved; a raw path is never echoed into an
232
+ * error the browser renders verbatim.
233
+ */
234
+ function listDirLocally(rawPath) {
235
+ // Canonicalize $HOME so the root entry + the `~` the frontend expands both use
236
+ // the SAME canonical form the child listings (realpathSync below) and the
237
+ // worker's sandbox binds use. On a symlinked-$HOME host (/home/u →
238
+ // /data00/home/u) the lexical homedir() would make `~/.claude` expand to
239
+ // /home/u/.claude while the tree's child nodes come back as /data00/... — the
240
+ // picker would then never match `~`-relative tier entries.
241
+ let home = homedir();
242
+ try {
243
+ home = realpathSync(home);
244
+ }
245
+ catch { /* lexical fallback if unresolvable */ }
246
+ if (!rawPath) {
247
+ // Root view: HOME first (the common case), then filesystem root. `home` is
248
+ // also returned explicitly so the frontend doesn't guess from entries[0].
249
+ const roots = [...new Set([home, '/'])];
250
+ return {
251
+ ok: true, path: null, parent: null, home,
252
+ entries: roots.map(p => ({ name: p, path: p, kind: 'dir' })),
253
+ };
254
+ }
255
+ const expanded = rawPath.startsWith('~') ? join(home, rawPath.slice(1)) : rawPath;
256
+ let resolved;
257
+ try {
258
+ resolved = realpathSync(expanded);
259
+ }
260
+ catch {
261
+ return { ok: false, path: null, parent: null, entries: [], error: 'path_not_found' };
262
+ }
263
+ let entries;
264
+ try {
265
+ entries = readdirSync(resolved, { withFileTypes: true })
266
+ .filter(d => {
267
+ try {
268
+ return d.isDirectory() || (d.isSymbolicLink() && statSync(join(resolved, d.name)).isDirectory());
269
+ }
270
+ catch {
271
+ return false;
272
+ }
273
+ })
274
+ .map(d => ({ name: d.name, path: join(resolved, d.name), kind: 'dir' }))
275
+ .sort((a, b) => a.name.localeCompare(b.name));
276
+ }
277
+ catch (e) {
278
+ return { ok: false, path: resolved, parent: null, entries: [], error: e?.code === 'EACCES' ? 'permission_denied' : 'cannot_read_dir' };
279
+ }
280
+ const parent = resolved === '/' ? null : dirname(resolved);
281
+ return { ok: true, path: resolved, parent, entries };
282
+ }
215
283
  function resolveScheduleOwner(id) {
216
284
  const explicit = aggregator.scheduleOwnerOf(id);
217
285
  if (explicit)
@@ -780,6 +848,7 @@ function resolveDashboardSettings() {
780
848
  const codexNotifierState = readCodexNotifierWorkerState(config.session.dataDir);
781
849
  const larkCli = checkLarkCliVersion();
782
850
  return {
851
+ groupNamePrefix: global.groupNamePrefix ?? '',
783
852
  publicReadOnly: dashboard.publicReadOnly ?? config.dashboard.publicReadOnly,
784
853
  openTerminalInFeishu: dashboard.openTerminalInFeishu === true,
785
854
  enableLocalCliOpen: dashboard.enableLocalCliOpen === true,
@@ -1028,7 +1097,10 @@ async function attachDaemon(d) {
1028
1097
  ]);
1029
1098
  const s = await sRes.json();
1030
1099
  const sch = await schRes.json();
1031
- aggregator.hydrateSessions(d.larkAppId, s.sessions ?? []);
1100
+ const rows = (s.sessions ?? []).map((row) => (d.botAvatarUrl ? { ...row, botAvatarUrl: d.botAvatarUrl } : row));
1101
+ aggregator.hydrateSessions(d.larkAppId, rows);
1102
+ for (const row of rows)
1103
+ sessionPresentation.schedule(d.larkAppId, row);
1032
1104
  aggregator.hydrateSchedules(sch.schedules ?? []);
1033
1105
  }
1034
1106
  catch (e) {
@@ -1044,14 +1116,26 @@ async function attachDaemon(d) {
1044
1116
  }
1045
1117
  }
1046
1118
  function syncSubscriptions() {
1047
- const online = new Set(registry.list().map(d => d.larkAppId));
1119
+ const daemons = registry.list();
1120
+ const online = new Set(daemons.map(d => d.larkAppId));
1048
1121
  // Attach (hydrate + subscribe) any newly-online daemon. Fire-and-forget
1049
1122
  // because the registry callback is sync and the attach is per-daemon
1050
1123
  // independent.
1051
- for (const d of registry.list()) {
1124
+ for (const d of daemons) {
1052
1125
  if (!subs.has(d.larkAppId)) {
1053
1126
  void attachDaemon(d);
1054
1127
  }
1128
+ // Push avatar changes in BOTH directions: gating on `d.botAvatarUrl` would
1129
+ // leave the stale image on every row when a bot's avatar is cleared.
1130
+ const avatar = d.botAvatarUrl ?? null;
1131
+ for (const row of aggregator.getSessions()) {
1132
+ if (row.larkAppId !== d.larkAppId || (row.botAvatarUrl ?? null) === avatar)
1133
+ continue;
1134
+ aggregator.applyEvent(d.larkAppId, {
1135
+ type: 'session.update',
1136
+ body: { sessionId: row.sessionId, patch: { botAvatarUrl: avatar } },
1137
+ });
1138
+ }
1055
1139
  }
1056
1140
  // Close subscriptions for daemons that went offline. Cache entries are
1057
1141
  // intentionally retained — the user may still want to see the last-known
@@ -2149,7 +2233,13 @@ const server = createServer(async (req, res) => {
2149
2233
  // Desktop shell compatibility probe (read-only, no token required). Keep it
2150
2234
  // outside the browser auth gate so packaged desktop apps can decide whether
2151
2235
  // this runtime speaks their dashboard protocol before loading the SPA.
2152
- if (handleDesktopCompat(req, res, url)) {
2236
+ if (req.method === 'GET' && url.pathname === '/__desktop/compat') {
2237
+ const presentedToken = authedToken(req, url);
2238
+ const boundMachineId = activeToken && presentedToken === activeToken
2239
+ ? readPlatformBinding()?.machineId
2240
+ : null;
2241
+ const compatMachineId = compatMachineIdForAuthenticatedRequest(presentedToken, activeToken, boundMachineId);
2242
+ handleDesktopCompat(req, res, url, { machineId: compatMachineId ?? undefined });
2153
2243
  return;
2154
2244
  }
2155
2245
  // Web terminal reverse-proxy: `/s/<sessionId>/*` → the owning bot daemon's
@@ -2401,7 +2491,52 @@ const server = createServer(async (req, res) => {
2401
2491
  ? { ...s, botName: n }
2402
2492
  : s;
2403
2493
  });
2404
- return jsonRes(res, 200, { sessions });
2494
+ return jsonRes(res, 200, {
2495
+ sessions: authed ? sessions : redactSessionsForPublic(sessions),
2496
+ });
2497
+ }
2498
+ // Desktop / operator UI: aggregate pending ask-hooks across daemons.
2499
+ if (req.method === 'GET' && url.pathname === '/api/asks/pending') {
2500
+ const daemons = registry.list();
2501
+ const asks = [];
2502
+ await Promise.all(daemons.map(async (d) => {
2503
+ try {
2504
+ const upstream = await fetchDaemonIpc(d.ipcPort, '/api/asks/pending', {
2505
+ signal: AbortSignal.timeout(2_000),
2506
+ });
2507
+ if (!upstream.ok)
2508
+ return;
2509
+ const body = await upstream.json();
2510
+ for (const a of body.asks ?? []) {
2511
+ asks.push({
2512
+ ...(typeof a === 'object' && a ? a : {}),
2513
+ botName: d.botName,
2514
+ larkAppId: d.larkAppId,
2515
+ });
2516
+ }
2517
+ }
2518
+ catch {
2519
+ /* offline daemon */
2520
+ }
2521
+ }));
2522
+ return jsonRes(res, 200, { asks });
2523
+ }
2524
+ if (req.method === 'POST' && url.pathname === '/api/asks/answer') {
2525
+ let body;
2526
+ try {
2527
+ body = await readJsonBody(req);
2528
+ }
2529
+ catch {
2530
+ return jsonRes(res, 400, { ok: false, error: 'bad_json' });
2531
+ }
2532
+ const parsed = parseDashboardAskAnswerRequest(body);
2533
+ if (!parsed.ok) {
2534
+ return jsonRes(res, 400, { ok: false, error: parsed.error });
2535
+ }
2536
+ const upstream = await proxyDashboardAskAnswer(parsed.value, proxyToDaemon);
2537
+ res.writeHead(upstream.status, { 'content-type': upstream.contentType });
2538
+ res.end(upstream.body);
2539
+ return;
2405
2540
  }
2406
2541
  if (req.method === 'POST' && url.pathname === '/api/sessions/cleanup-idle') {
2407
2542
  let body;
@@ -3437,6 +3572,35 @@ const server = createServer(async (req, res) => {
3437
3572
  res.end(await upstream.text());
3438
3573
  return;
3439
3574
  }
3575
+ // 单会话元信息(状态/标题/cli/工作目录等)。dashboard 之前只代理了
3576
+ // GET /api/sessions(列表),没有单会话 :id 路由,编程式调用方(如任务
3577
+ // 编排器的「任务详情」面板)走 getMeta 会落到最底的 404 not_found_yet。
3578
+ // owner-only;ownerOf 对已关闭会话仍可解析。放在 trigger-result 之后,
3579
+ // 避免把 /trigger-result、/insight 等子路径吞进这个单段匹配。
3580
+ if (req.method === 'GET' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)$/))) {
3581
+ const sid = decodeURIComponent(m[1]);
3582
+ const owner = aggregator.ownerOf(sid);
3583
+ if (!owner)
3584
+ return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
3585
+ const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}`, { method: 'GET' });
3586
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3587
+ res.end(await upstream.text());
3588
+ return;
3589
+ }
3590
+ // 异步 trigger 结果轮询(asyncReturnSessionId 模式的权威查询端点)。
3591
+ // 四态 running/completed/failed/not_found,daemon 重启后从持久化结果兜底
3592
+ // 重建 completed。owner-only(写权限 cookie),代理到 owner daemon 同名 IPC。
3593
+ // ownerOf 对已关闭会话仍可解析(aggregator 的 /api/sessions 含 closed)。
3594
+ if (req.method === 'GET' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/trigger-result$/))) {
3595
+ const sid = decodeURIComponent(m[1]);
3596
+ const owner = aggregator.ownerOf(sid);
3597
+ if (!owner)
3598
+ return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
3599
+ const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/trigger-result${url.search ?? ''}`, { method: 'GET' });
3600
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3601
+ res.end(await upstream.text());
3602
+ return;
3603
+ }
3440
3604
  // 会话 insight(只读 trace 分析:动作 span / 失败聚合 / 规则建议)。
3441
3605
  // owner-only:不在公开读白名单 → decideDashboardAuth 已对只读访客 401,
3442
3606
  // 公开/联邦访客看不到 tab 也拿不到 span。代理到 owner daemon 的同名 IPC。
@@ -4018,6 +4182,42 @@ const server = createServer(async (req, res) => {
4018
4182
  res.end(await upstream.text());
4019
4183
  return;
4020
4184
  }
4185
+ // PUT /api/bots/:appId/custom-passthrough — proxy to that bot's daemon. Body
4186
+ // `{ customPassthroughCommands: string }` (raw text, comma/space separated; '' = clear).
4187
+ let mBotPassthrough;
4188
+ if (req.method === 'PUT' && (mBotPassthrough = url.pathname.match(/^\/api\/bots\/([^/]+)\/custom-passthrough$/))) {
4189
+ const appId = decodeURIComponent(mBotPassthrough[1]);
4190
+ const chunks = [];
4191
+ for await (const c of req)
4192
+ chunks.push(c);
4193
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
4194
+ const upstream = await proxyToDaemon(appId, `/api/bot-custom-passthrough`, {
4195
+ method: 'PUT',
4196
+ headers: { 'content-type': 'application/json' },
4197
+ body: raw,
4198
+ });
4199
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4200
+ res.end(await upstream.text());
4201
+ return;
4202
+ }
4203
+ // PUT /api/bots/:appId/cantalk-daemon-commands — proxy to that bot's daemon. Body
4204
+ // `{ canTalkDaemonCommands: string }` (raw text, comma/space separated; '' = clear).
4205
+ let mBotCanTalk;
4206
+ if (req.method === 'PUT' && (mBotCanTalk = url.pathname.match(/^\/api\/bots\/([^/]+)\/cantalk-daemon-commands$/))) {
4207
+ const appId = decodeURIComponent(mBotCanTalk[1]);
4208
+ const chunks = [];
4209
+ for await (const c of req)
4210
+ chunks.push(c);
4211
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
4212
+ const upstream = await proxyToDaemon(appId, `/api/bot-cantalk-daemon-commands`, {
4213
+ method: 'PUT',
4214
+ headers: { 'content-type': 'application/json' },
4215
+ body: raw,
4216
+ });
4217
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4218
+ res.end(await upstream.text());
4219
+ return;
4220
+ }
4021
4221
  // PUT /api/bots/:appId/launch-shell — proxy to that bot's daemon. Body
4022
4222
  // `{ launchShell: string }` (shell name or absolute path; '' = clear → $SHELL).
4023
4223
  let mBotLaunchShell;
@@ -4072,6 +4272,33 @@ const server = createServer(async (req, res) => {
4072
4272
  res.end(await upstream.text());
4073
4273
  return;
4074
4274
  }
4275
+ // PUT /api/bots/:appId/sandbox-paths — proxy to that bot's daemon.
4276
+ // Body `{ readWrite?: string[]; readOnly?: string[]; deny?: string[] }`.
4277
+ let mBotSandboxPaths;
4278
+ if (req.method === 'PUT' && (mBotSandboxPaths = url.pathname.match(/^\/api\/bots\/([^/]+)\/sandbox-paths$/))) {
4279
+ const appId = decodeURIComponent(mBotSandboxPaths[1]);
4280
+ const chunks = [];
4281
+ for await (const c of req)
4282
+ chunks.push(c);
4283
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
4284
+ const upstream = await proxyToDaemon(appId, `/api/bot-sandbox-paths`, {
4285
+ method: 'PUT',
4286
+ headers: { 'content-type': 'application/json' },
4287
+ body: raw,
4288
+ });
4289
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4290
+ res.end(await upstream.text());
4291
+ return;
4292
+ }
4293
+ // GET /api/fs/list?path=… — read-only directory listing for the sandbox-paths
4294
+ // tree picker. Not bot-specific (the filesystem is shared with this host's
4295
+ // daemons — the dashboard process runs on the SAME machine), so serve it
4296
+ // locally instead of proxying. Returns immediate child directories only.
4297
+ if (req.method === 'GET' && url.pathname === '/api/fs/list') {
4298
+ res.writeHead(200, { 'content-type': 'application/json' });
4299
+ res.end(JSON.stringify(listDirLocally(url.searchParams.get('path') ?? '')));
4300
+ return;
4301
+ }
4075
4302
  // PUT /api/bots/:appId/sandbox — proxy to that bot's daemon. Body `{ enabled: boolean }`.
4076
4303
  let mBotSandbox;
4077
4304
  if (req.method === 'PUT' && (mBotSandbox = url.pathname.match(/^\/api\/bots\/([^/]+)\/sandbox$/))) {
@@ -4578,7 +4805,9 @@ const server = createServer(async (req, res) => {
4578
4805
  // full task object — strip the prompt AND workingDir for anonymous SSE
4579
4806
  // listeners, or the REST-side scrub would be trivially bypassed by
4580
4807
  // `/events`.
4581
- let body = ev.body;
4808
+ let body = authed
4809
+ ? ev.body
4810
+ : redactSessionEventForPublic(ev.type, ev.body);
4582
4811
  if (!authed && (ev.type === 'schedule.created' || ev.type === 'schedule.updated')) {
4583
4812
  const b = body;
4584
4813
  body = {