botmux 3.13.0 → 3.14.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 (508) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +25 -1
  3. package/dist/.runtime-build-id +1 -1
  4. package/dist/adapters/adopt-route.d.ts +58 -0
  5. package/dist/adapters/adopt-route.d.ts.map +1 -1
  6. package/dist/adapters/adopt-route.js +136 -0
  7. package/dist/adapters/adopt-route.js.map +1 -1
  8. package/dist/adapters/backend/capabilities.js +1 -1
  9. package/dist/adapters/backend/capabilities.js.map +1 -1
  10. package/dist/adapters/backend/herdr-backend.d.ts +1 -1
  11. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/herdr-backend.js +2 -1
  13. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  14. package/dist/adapters/backend/riff-backend.d.ts +97 -0
  15. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  16. package/dist/adapters/backend/riff-backend.js +380 -66
  17. package/dist/adapters/backend/riff-backend.js.map +1 -1
  18. package/dist/adapters/backend/sandbox.d.ts +8 -0
  19. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  20. package/dist/adapters/backend/sandbox.js +16 -2
  21. package/dist/adapters/backend/sandbox.js.map +1 -1
  22. package/dist/adapters/backend/tmux-backend.d.ts +12 -13
  23. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  24. package/dist/adapters/backend/tmux-backend.js +113 -53
  25. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  26. package/dist/adapters/backend/tmux-pipe-backend.d.ts +4 -3
  27. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  28. package/dist/adapters/backend/tmux-pipe-backend.js +12 -9
  29. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  30. package/dist/adapters/backend/zellij-backend.d.ts +2 -3
  31. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  32. package/dist/adapters/backend/zellij-backend.js +6 -13
  33. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  34. package/dist/adapters/backend/zellij-observe-backend.d.ts +2 -1
  35. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
  36. package/dist/adapters/backend/zellij-observe-backend.js +6 -3
  37. package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
  38. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
  39. package/dist/adapters/backend/zmx-backend.js +40 -18
  40. package/dist/adapters/backend/zmx-backend.js.map +1 -1
  41. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  42. package/dist/adapters/cli/claude-code.js +12 -1
  43. package/dist/adapters/cli/claude-code.js.map +1 -1
  44. package/dist/adapters/cli/codex.d.ts.map +1 -1
  45. package/dist/adapters/cli/codex.js +3 -2
  46. package/dist/adapters/cli/codex.js.map +1 -1
  47. package/dist/adapters/cli/dsh.d.ts +4 -0
  48. package/dist/adapters/cli/dsh.d.ts.map +1 -0
  49. package/dist/adapters/cli/dsh.js +96 -0
  50. package/dist/adapters/cli/dsh.js.map +1 -0
  51. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  52. package/dist/adapters/cli/fs-policy.js +5 -0
  53. package/dist/adapters/cli/fs-policy.js.map +1 -1
  54. package/dist/adapters/cli/opencode.d.ts +52 -1
  55. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  56. package/dist/adapters/cli/opencode.js +117 -76
  57. package/dist/adapters/cli/opencode.js.map +1 -1
  58. package/dist/adapters/cli/opencode2.d.ts +4 -0
  59. package/dist/adapters/cli/opencode2.d.ts.map +1 -0
  60. package/dist/adapters/cli/opencode2.js +137 -0
  61. package/dist/adapters/cli/opencode2.js.map +1 -0
  62. package/dist/adapters/cli/read-isolation.d.ts +1 -1
  63. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  64. package/dist/adapters/cli/read-isolation.js +5 -2
  65. package/dist/adapters/cli/read-isolation.js.map +1 -1
  66. package/dist/adapters/cli/registry.d.ts +7 -1
  67. package/dist/adapters/cli/registry.d.ts.map +1 -1
  68. package/dist/adapters/cli/registry.js +19 -6
  69. package/dist/adapters/cli/registry.js.map +1 -1
  70. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  71. package/dist/adapters/cli/shared-hints.js +13 -0
  72. package/dist/adapters/cli/shared-hints.js.map +1 -1
  73. package/dist/adapters/cli/types.d.ts +24 -3
  74. package/dist/adapters/cli/types.d.ts.map +1 -1
  75. package/dist/adapters/hook-command.d.ts +8 -0
  76. package/dist/adapters/hook-command.d.ts.map +1 -1
  77. package/dist/adapters/hook-command.js +11 -0
  78. package/dist/adapters/hook-command.js.map +1 -1
  79. package/dist/adapters/hook-installer.d.ts +16 -1
  80. package/dist/adapters/hook-installer.d.ts.map +1 -1
  81. package/dist/adapters/hook-installer.js +232 -2
  82. package/dist/adapters/hook-installer.js.map +1 -1
  83. package/dist/bot-registry.d.ts +116 -8
  84. package/dist/bot-registry.d.ts.map +1 -1
  85. package/dist/bot-registry.js +52 -4
  86. package/dist/bot-registry.js.map +1 -1
  87. package/dist/cli/pm2-start-transaction.d.ts +14 -0
  88. package/dist/cli/pm2-start-transaction.d.ts.map +1 -1
  89. package/dist/cli/pm2-start-transaction.js +25 -9
  90. package/dist/cli/pm2-start-transaction.js.map +1 -1
  91. package/dist/cli/restart-failure-notification.d.ts +54 -0
  92. package/dist/cli/restart-failure-notification.d.ts.map +1 -0
  93. package/dist/cli/restart-failure-notification.js +142 -0
  94. package/dist/cli/restart-failure-notification.js.map +1 -0
  95. package/dist/cli/restart-failure-owner.d.ts +20 -0
  96. package/dist/cli/restart-failure-owner.d.ts.map +1 -0
  97. package/dist/cli/restart-failure-owner.js +27 -0
  98. package/dist/cli/restart-failure-owner.js.map +1 -0
  99. package/dist/cli/restart-shutdown-preflight.d.ts +24 -0
  100. package/dist/cli/restart-shutdown-preflight.d.ts.map +1 -0
  101. package/dist/cli/restart-shutdown-preflight.js +105 -0
  102. package/dist/cli/restart-shutdown-preflight.js.map +1 -0
  103. package/dist/cli/send-dispatch.d.ts +26 -0
  104. package/dist/cli/send-dispatch.d.ts.map +1 -1
  105. package/dist/cli/send-dispatch.js +30 -0
  106. package/dist/cli/send-dispatch.js.map +1 -1
  107. package/dist/cli.d.ts +4 -1
  108. package/dist/cli.d.ts.map +1 -1
  109. package/dist/cli.js +665 -399
  110. package/dist/cli.js.map +1 -1
  111. package/dist/codex-app-runner.js +38 -15
  112. package/dist/codex-app-runner.js.map +1 -1
  113. package/dist/codex-rpc-lifecycle.d.ts +14 -2
  114. package/dist/codex-rpc-lifecycle.d.ts.map +1 -1
  115. package/dist/codex-rpc-lifecycle.js +13 -3
  116. package/dist/codex-rpc-lifecycle.js.map +1 -1
  117. package/dist/core/ask-broker.d.ts +3 -0
  118. package/dist/core/ask-broker.d.ts.map +1 -1
  119. package/dist/core/ask-broker.js +29 -7
  120. package/dist/core/ask-broker.js.map +1 -1
  121. package/dist/core/ask-hook/registry.d.ts.map +1 -1
  122. package/dist/core/ask-hook/registry.js +4 -0
  123. package/dist/core/ask-hook/registry.js.map +1 -1
  124. package/dist/core/ask-types.d.ts +5 -1
  125. package/dist/core/ask-types.d.ts.map +1 -1
  126. package/dist/core/ask-types.js.map +1 -1
  127. package/dist/core/browser-restart.d.ts +112 -0
  128. package/dist/core/browser-restart.d.ts.map +1 -0
  129. package/dist/core/browser-restart.js +233 -0
  130. package/dist/core/browser-restart.js.map +1 -0
  131. package/dist/core/command-handler.d.ts +19 -11
  132. package/dist/core/command-handler.d.ts.map +1 -1
  133. package/dist/core/command-handler.js +237 -43
  134. package/dist/core/command-handler.js.map +1 -1
  135. package/dist/core/current-turn-provenance.d.ts.map +1 -1
  136. package/dist/core/current-turn-provenance.js +7 -27
  137. package/dist/core/current-turn-provenance.js.map +1 -1
  138. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  139. package/dist/core/dashboard-ipc-server.js +317 -10
  140. package/dist/core/dashboard-ipc-server.js.map +1 -1
  141. package/dist/core/dispatch-registry.d.ts.map +1 -1
  142. package/dist/core/dispatch-registry.js +6 -0
  143. package/dist/core/dispatch-registry.js.map +1 -1
  144. package/dist/core/dispatch-report-binding.d.ts +31 -0
  145. package/dist/core/dispatch-report-binding.d.ts.map +1 -0
  146. package/dist/core/dispatch-report-binding.js +88 -0
  147. package/dist/core/dispatch-report-binding.js.map +1 -0
  148. package/dist/core/doc-comment-prompt.d.ts +2 -0
  149. package/dist/core/doc-comment-prompt.d.ts.map +1 -1
  150. package/dist/core/doc-comment-prompt.js +6 -0
  151. package/dist/core/doc-comment-prompt.js.map +1 -1
  152. package/dist/core/host-overload-alert.d.ts +25 -1
  153. package/dist/core/host-overload-alert.d.ts.map +1 -1
  154. package/dist/core/host-overload-alert.js +69 -8
  155. package/dist/core/host-overload-alert.js.map +1 -1
  156. package/dist/core/local-terminal-opener.js +1 -1
  157. package/dist/core/local-terminal-opener.js.map +1 -1
  158. package/dist/core/managed-origin-capability.d.ts +7 -6
  159. package/dist/core/managed-origin-capability.d.ts.map +1 -1
  160. package/dist/core/managed-origin-capability.js +32 -1
  161. package/dist/core/managed-origin-capability.js.map +1 -1
  162. package/dist/core/passthrough-commands.d.ts.map +1 -1
  163. package/dist/core/passthrough-commands.js +3 -2
  164. package/dist/core/passthrough-commands.js.map +1 -1
  165. package/dist/core/plugins/materializer.d.ts.map +1 -1
  166. package/dist/core/plugins/materializer.js +1 -0
  167. package/dist/core/plugins/materializer.js.map +1 -1
  168. package/dist/core/producer-quiescence.d.ts +70 -0
  169. package/dist/core/producer-quiescence.d.ts.map +1 -0
  170. package/dist/core/producer-quiescence.js +90 -0
  171. package/dist/core/producer-quiescence.js.map +1 -0
  172. package/dist/core/raw-command-write-options.d.ts +10 -0
  173. package/dist/core/raw-command-write-options.d.ts.map +1 -0
  174. package/dist/core/raw-command-write-options.js +23 -0
  175. package/dist/core/raw-command-write-options.js.map +1 -0
  176. package/dist/core/raw-command-writer.d.ts +4 -0
  177. package/dist/core/raw-command-writer.d.ts.map +1 -1
  178. package/dist/core/raw-command-writer.js +15 -6
  179. package/dist/core/raw-command-writer.js.map +1 -1
  180. package/dist/core/reply-target.d.ts +11 -0
  181. package/dist/core/reply-target.d.ts.map +1 -1
  182. package/dist/core/reply-target.js +22 -7
  183. package/dist/core/reply-target.js.map +1 -1
  184. package/dist/core/report-session-relay.d.ts +53 -0
  185. package/dist/core/report-session-relay.d.ts.map +1 -0
  186. package/dist/core/report-session-relay.js +116 -0
  187. package/dist/core/report-session-relay.js.map +1 -0
  188. package/dist/core/session-discovery.d.ts +5 -0
  189. package/dist/core/session-discovery.d.ts.map +1 -1
  190. package/dist/core/session-discovery.js +13 -0
  191. package/dist/core/session-discovery.js.map +1 -1
  192. package/dist/core/session-group-birth.d.ts +7 -0
  193. package/dist/core/session-group-birth.d.ts.map +1 -0
  194. package/dist/core/session-group-birth.js +145 -0
  195. package/dist/core/session-group-birth.js.map +1 -0
  196. package/dist/core/session-manager.d.ts +16 -21
  197. package/dist/core/session-manager.d.ts.map +1 -1
  198. package/dist/core/session-manager.js +140 -21
  199. package/dist/core/session-manager.js.map +1 -1
  200. package/dist/core/trigger-session.d.ts.map +1 -1
  201. package/dist/core/trigger-session.js +18 -3
  202. package/dist/core/trigger-session.js.map +1 -1
  203. package/dist/core/types.d.ts +18 -0
  204. package/dist/core/types.d.ts.map +1 -1
  205. package/dist/core/types.js.map +1 -1
  206. package/dist/core/worker-pool.d.ts +63 -11
  207. package/dist/core/worker-pool.d.ts.map +1 -1
  208. package/dist/core/worker-pool.js +241 -13
  209. package/dist/core/worker-pool.js.map +1 -1
  210. package/dist/daemon.d.ts +33 -0
  211. package/dist/daemon.d.ts.map +1 -1
  212. package/dist/daemon.js +900 -137
  213. package/dist/daemon.js.map +1 -1
  214. package/dist/dashboard/auth.d.ts +20 -0
  215. package/dist/dashboard/auth.d.ts.map +1 -1
  216. package/dist/dashboard/auth.js +86 -1
  217. package/dist/dashboard/auth.js.map +1 -1
  218. package/dist/dashboard/bot-payload.d.ts +5 -0
  219. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  220. package/dist/dashboard/bot-payload.js +4 -1
  221. package/dist/dashboard/bot-payload.js.map +1 -1
  222. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  223. package/dist/dashboard/federation-spoke-api.js +27 -3
  224. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  225. package/dist/dashboard/feedback-analytics-api.d.ts +6 -0
  226. package/dist/dashboard/feedback-analytics-api.d.ts.map +1 -0
  227. package/dist/dashboard/feedback-analytics-api.js +39 -0
  228. package/dist/dashboard/feedback-analytics-api.js.map +1 -0
  229. package/dist/dashboard/session-action-timeout.d.ts +3 -0
  230. package/dist/dashboard/session-action-timeout.d.ts.map +1 -0
  231. package/dist/dashboard/session-action-timeout.js +12 -0
  232. package/dist/dashboard/session-action-timeout.js.map +1 -0
  233. package/dist/dashboard/vc-consumer-profiles-api.d.ts +9 -3
  234. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  235. package/dist/dashboard/vc-consumer-profiles-api.js +2 -1
  236. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  237. package/dist/dashboard/web/app.d.ts.map +1 -1
  238. package/dist/dashboard/web/app.js +48 -5
  239. package/dist/dashboard/web/app.js.map +1 -1
  240. package/dist/dashboard/web/bot-defaults-page.d.ts +4 -0
  241. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  242. package/dist/dashboard/web/bot-defaults-page.js +273 -36
  243. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  244. package/dist/dashboard/web/bot-defaults.d.ts +6 -0
  245. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  246. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  247. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  248. package/dist/dashboard/web/dashboard-routes.js +1 -0
  249. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  250. package/dist/dashboard/web/feedback-page.d.ts +3 -0
  251. package/dist/dashboard/web/feedback-page.d.ts.map +1 -0
  252. package/dist/dashboard/web/feedback-page.js +34 -0
  253. package/dist/dashboard/web/feedback-page.js.map +1 -0
  254. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  255. package/dist/dashboard/web/groups-page.js +7 -2
  256. package/dist/dashboard/web/groups-page.js.map +1 -1
  257. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  258. package/dist/dashboard/web/i18n.js +114 -22
  259. package/dist/dashboard/web/i18n.js.map +1 -1
  260. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
  261. package/dist/dashboard/web/team-federation-page.js +26 -2
  262. package/dist/dashboard/web/team-federation-page.js.map +1 -1
  263. package/dist/dashboard/web/team-federation.d.ts +19 -0
  264. package/dist/dashboard/web/team-federation.d.ts.map +1 -1
  265. package/dist/dashboard/web/team-federation.js +3 -0
  266. package/dist/dashboard/web/team-federation.js.map +1 -1
  267. package/dist/dashboard/web/update-action.d.ts +8 -0
  268. package/dist/dashboard/web/update-action.d.ts.map +1 -1
  269. package/dist/dashboard/web/update-action.js +10 -0
  270. package/dist/dashboard/web/update-action.js.map +1 -1
  271. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  272. package/dist/dashboard/web/vc-consumer-profiles-section.js +58 -9
  273. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  274. package/dist/dashboard-web/app.js +1 -1
  275. package/dist/dashboard-web/chunks/bot-defaults-page-4RENHE7J.js +10 -0
  276. package/dist/dashboard-web/chunks/chunk-2WQDS65D.js +1 -0
  277. package/dist/dashboard-web/chunks/{chunk-CU4SUKK3.js → chunk-6O7KXFD2.js} +1 -1
  278. package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +1 -0
  279. package/dist/dashboard-web/chunks/{chunk-6JTZJRQJ.js → chunk-Q2MT4VWH.js} +15 -15
  280. package/dist/dashboard-web/chunks/{chunk-5QJB24I2.js → chunk-U3ZFSO7E.js} +1 -1
  281. package/dist/dashboard-web/chunks/connectors-page-2KZO5KSJ.js +1 -0
  282. package/dist/dashboard-web/chunks/feedback-page-CLVTOLLO.js +1 -0
  283. package/dist/dashboard-web/chunks/groups-page-HLASRTSY.js +8 -0
  284. package/dist/dashboard-web/chunks/{insights-page-EVGGJI5L.js → insights-page-4RPU2CRU.js} +1 -1
  285. package/dist/dashboard-web/chunks/{monitor-room-HRGR2ENP.js → monitor-room-OTKQ2CXK.js} +1 -1
  286. package/dist/dashboard-web/chunks/monitoring-page-IJPUB6JT.js +2 -0
  287. package/dist/dashboard-web/chunks/office-page-QSR3J44Y.js +1 -0
  288. package/dist/dashboard-web/chunks/overview-page-6OK63V4V.js +1 -0
  289. package/dist/dashboard-web/chunks/roles-page-6NWJMOB5.js +1 -0
  290. package/dist/dashboard-web/chunks/schedules-page-6I3LNXD4.js +1 -0
  291. package/dist/dashboard-web/chunks/{sessions-page-DXBCDWCS.js → sessions-page-B2TXGJDO.js} +1 -1
  292. package/dist/dashboard-web/chunks/settings-page-6KJADSC6.js +2 -0
  293. package/dist/dashboard-web/chunks/{skills-page-2QAVB2SA.js → skills-page-M2Q6L5CB.js} +1 -1
  294. package/dist/dashboard-web/chunks/team-federation-page-7I7FDE3B.js +1 -0
  295. package/dist/dashboard-web/chunks/{v3-page-AY35LKCX.js → v3-page-HQXRL65L.js} +1 -1
  296. package/dist/dashboard-web/chunks/whiteboards-page-LQKC4TAZ.js +1 -0
  297. package/dist/dashboard-web/style.css +35 -0
  298. package/dist/dashboard.js +199 -12
  299. package/dist/dashboard.js.map +1 -1
  300. package/dist/desktop/shared/shell-path-probes.d.ts +1 -1
  301. package/dist/desktop/shared/shell-path-probes.js +2 -2
  302. package/dist/desktop/shared/shell-path-probes.js.map +1 -1
  303. package/dist/dsh-runner.d.ts +3 -0
  304. package/dist/dsh-runner.d.ts.map +1 -0
  305. package/dist/dsh-runner.js +666 -0
  306. package/dist/dsh-runner.js.map +1 -0
  307. package/dist/global-config.d.ts +24 -0
  308. package/dist/global-config.d.ts.map +1 -1
  309. package/dist/global-config.js +35 -0
  310. package/dist/global-config.js.map +1 -1
  311. package/dist/i18n/en.d.ts.map +1 -1
  312. package/dist/i18n/en.js +25 -6
  313. package/dist/i18n/en.js.map +1 -1
  314. package/dist/i18n/zh.d.ts.map +1 -1
  315. package/dist/i18n/zh.js +25 -6
  316. package/dist/i18n/zh.js.map +1 -1
  317. package/dist/im/lark/ask-card.d.ts +3 -1
  318. package/dist/im/lark/ask-card.d.ts.map +1 -1
  319. package/dist/im/lark/ask-card.js +61 -5
  320. package/dist/im/lark/ask-card.js.map +1 -1
  321. package/dist/im/lark/card-builder.d.ts.map +1 -1
  322. package/dist/im/lark/card-builder.js +13 -6
  323. package/dist/im/lark/card-builder.js.map +1 -1
  324. package/dist/im/lark/card-handler.d.ts +2 -1
  325. package/dist/im/lark/card-handler.d.ts.map +1 -1
  326. package/dist/im/lark/card-handler.js +145 -5
  327. package/dist/im/lark/card-handler.js.map +1 -1
  328. package/dist/im/lark/event-dispatcher.d.ts +18 -0
  329. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  330. package/dist/im/lark/event-dispatcher.js +36 -9
  331. package/dist/im/lark/event-dispatcher.js.map +1 -1
  332. package/dist/im/lark/md-card.d.ts +18 -0
  333. package/dist/im/lark/md-card.d.ts.map +1 -1
  334. package/dist/im/lark/md-card.js +21 -0
  335. package/dist/im/lark/md-card.js.map +1 -1
  336. package/dist/im/lark/relay-target-routing.d.ts.map +1 -1
  337. package/dist/im/lark/relay-target-routing.js +3 -2
  338. package/dist/im/lark/relay-target-routing.js.map +1 -1
  339. package/dist/im/lark/reply-mode-command.d.ts.map +1 -1
  340. package/dist/im/lark/reply-mode-command.js +19 -8
  341. package/dist/im/lark/reply-mode-command.js.map +1 -1
  342. package/dist/im/lark/skill-feedback-card.d.ts +15 -0
  343. package/dist/im/lark/skill-feedback-card.d.ts.map +1 -0
  344. package/dist/im/lark/skill-feedback-card.js +149 -0
  345. package/dist/im/lark/skill-feedback-card.js.map +1 -0
  346. package/dist/services/bot-config-store.d.ts +10 -1
  347. package/dist/services/bot-config-store.d.ts.map +1 -1
  348. package/dist/services/bot-config-store.js +103 -3
  349. package/dist/services/bot-config-store.js.map +1 -1
  350. package/dist/services/bridge-fallback-gate.d.ts +14 -0
  351. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  352. package/dist/services/bridge-fallback-gate.js +15 -0
  353. package/dist/services/bridge-fallback-gate.js.map +1 -1
  354. package/dist/services/codex-reasoning-effort.d.ts +9 -0
  355. package/dist/services/codex-reasoning-effort.d.ts.map +1 -0
  356. package/dist/services/codex-reasoning-effort.js +23 -0
  357. package/dist/services/codex-reasoning-effort.js.map +1 -0
  358. package/dist/services/codex-service-tier.d.ts +1 -1
  359. package/dist/services/codex-service-tier.d.ts.map +1 -1
  360. package/dist/services/codex-transcript.d.ts +9 -0
  361. package/dist/services/codex-transcript.d.ts.map +1 -1
  362. package/dist/services/codex-transcript.js +13 -6
  363. package/dist/services/codex-transcript.js.map +1 -1
  364. package/dist/services/feed-group-tagger.d.ts +15 -0
  365. package/dist/services/feed-group-tagger.d.ts.map +1 -0
  366. package/dist/services/feed-group-tagger.js +348 -0
  367. package/dist/services/feed-group-tagger.js.map +1 -0
  368. package/dist/services/feedback-analytics.d.ts +82 -0
  369. package/dist/services/feedback-analytics.d.ts.map +1 -0
  370. package/dist/services/feedback-analytics.js +95 -0
  371. package/dist/services/feedback-analytics.js.map +1 -0
  372. package/dist/services/feedback-outbox.d.ts +24 -0
  373. package/dist/services/feedback-outbox.d.ts.map +1 -0
  374. package/dist/services/feedback-outbox.js +12 -0
  375. package/dist/services/feedback-outbox.js.map +1 -0
  376. package/dist/services/feedback-policy-resolver.d.ts +56 -0
  377. package/dist/services/feedback-policy-resolver.d.ts.map +1 -0
  378. package/dist/services/feedback-policy-resolver.js +156 -0
  379. package/dist/services/feedback-policy-resolver.js.map +1 -0
  380. package/dist/services/feedback-policy.d.ts +41 -0
  381. package/dist/services/feedback-policy.d.ts.map +1 -0
  382. package/dist/services/feedback-policy.js +102 -0
  383. package/dist/services/feedback-policy.js.map +1 -0
  384. package/dist/services/feedback-webhook-dispatcher.d.ts +76 -0
  385. package/dist/services/feedback-webhook-dispatcher.d.ts.map +1 -0
  386. package/dist/services/feedback-webhook-dispatcher.js +237 -0
  387. package/dist/services/feedback-webhook-dispatcher.js.map +1 -0
  388. package/dist/services/grant-prefs-store.d.ts +3 -0
  389. package/dist/services/grant-prefs-store.d.ts.map +1 -1
  390. package/dist/services/grant-prefs-store.js +30 -1
  391. package/dist/services/grant-prefs-store.js.map +1 -1
  392. package/dist/services/groups-store.d.ts +14 -0
  393. package/dist/services/groups-store.d.ts.map +1 -1
  394. package/dist/services/groups-store.js +23 -0
  395. package/dist/services/groups-store.js.map +1 -1
  396. package/dist/services/local-cli-opener.d.ts +1 -1
  397. package/dist/services/local-cli-opener.d.ts.map +1 -1
  398. package/dist/services/local-cli-opener.js +2 -0
  399. package/dist/services/local-cli-opener.js.map +1 -1
  400. package/dist/services/prompt-context-store.d.ts +29 -0
  401. package/dist/services/prompt-context-store.d.ts.map +1 -0
  402. package/dist/services/prompt-context-store.js +205 -0
  403. package/dist/services/prompt-context-store.js.map +1 -0
  404. package/dist/services/session-group-avatar.d.ts +6 -0
  405. package/dist/services/session-group-avatar.d.ts.map +1 -0
  406. package/dist/services/session-group-avatar.js +96 -0
  407. package/dist/services/session-group-avatar.js.map +1 -0
  408. package/dist/services/session-group-title.d.ts +47 -0
  409. package/dist/services/session-group-title.d.ts.map +1 -0
  410. package/dist/services/session-group-title.js +226 -0
  411. package/dist/services/session-group-title.js.map +1 -0
  412. package/dist/services/session-groups-store.d.ts +30 -0
  413. package/dist/services/session-groups-store.d.ts.map +1 -0
  414. package/dist/services/session-groups-store.js +132 -0
  415. package/dist/services/session-groups-store.js.map +1 -0
  416. package/dist/services/session-store.d.ts +58 -0
  417. package/dist/services/session-store.d.ts.map +1 -1
  418. package/dist/services/session-store.js +174 -0
  419. package/dist/services/session-store.js.map +1 -1
  420. package/dist/services/skill-feedback-store.d.ts +252 -0
  421. package/dist/services/skill-feedback-store.d.ts.map +1 -0
  422. package/dist/services/skill-feedback-store.js +795 -0
  423. package/dist/services/skill-feedback-store.js.map +1 -0
  424. package/dist/services/skill-registry-store.d.ts +23 -0
  425. package/dist/services/skill-registry-store.d.ts.map +1 -1
  426. package/dist/services/skill-registry-store.js +93 -7
  427. package/dist/services/skill-registry-store.js.map +1 -1
  428. package/dist/services/team-store.d.ts +4 -0
  429. package/dist/services/team-store.d.ts.map +1 -1
  430. package/dist/services/team-store.js +16 -0
  431. package/dist/services/team-store.js.map +1 -1
  432. package/dist/services/traex-transcript.d.ts +32 -4
  433. package/dist/services/traex-transcript.d.ts.map +1 -1
  434. package/dist/services/traex-transcript.js +116 -8
  435. package/dist/services/traex-transcript.js.map +1 -1
  436. package/dist/services/trigger-types.d.ts +1 -1
  437. package/dist/services/trigger-types.d.ts.map +1 -1
  438. package/dist/services/trigger-types.js +2 -2
  439. package/dist/services/trigger-types.js.map +1 -1
  440. package/dist/services/turn-completion-events.d.ts +57 -0
  441. package/dist/services/turn-completion-events.d.ts.map +1 -0
  442. package/dist/services/turn-completion-events.js +179 -0
  443. package/dist/services/turn-completion-events.js.map +1 -0
  444. package/dist/services/vc-meeting-consumer-isolation.d.ts +21 -12
  445. package/dist/services/vc-meeting-consumer-isolation.d.ts.map +1 -1
  446. package/dist/services/vc-meeting-consumer-isolation.js +25 -19
  447. package/dist/services/vc-meeting-consumer-isolation.js.map +1 -1
  448. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +8 -2
  449. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -1
  450. package/dist/services/vc-meeting-consumer-profile-bootstrap.js +18 -10
  451. package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -1
  452. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  453. package/dist/setup/bot-config-editor.js +6 -0
  454. package/dist/setup/bot-config-editor.js.map +1 -1
  455. package/dist/setup/cli-availability.d.ts +2 -1
  456. package/dist/setup/cli-availability.d.ts.map +1 -1
  457. package/dist/setup/cli-availability.js +2 -1
  458. package/dist/setup/cli-availability.js.map +1 -1
  459. package/dist/setup/cli-selection.d.ts +8 -0
  460. package/dist/setup/cli-selection.d.ts.map +1 -1
  461. package/dist/setup/cli-selection.js +31 -0
  462. package/dist/setup/cli-selection.js.map +1 -1
  463. package/dist/setup/ensure-fonts.d.ts +5 -0
  464. package/dist/setup/ensure-fonts.d.ts.map +1 -1
  465. package/dist/setup/ensure-fonts.js +26 -1
  466. package/dist/setup/ensure-fonts.js.map +1 -1
  467. package/dist/setup/lark-scopes.json +3 -1
  468. package/dist/setup/open-platform-automation.d.ts +1 -1
  469. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  470. package/dist/setup/open-platform-automation.js +15 -3
  471. package/dist/setup/open-platform-automation.js.map +1 -1
  472. package/dist/skills/definitions.d.ts +1 -1
  473. package/dist/skills/definitions.d.ts.map +1 -1
  474. package/dist/skills/definitions.js +9 -2
  475. package/dist/skills/definitions.js.map +1 -1
  476. package/dist/types.d.ts +10 -4
  477. package/dist/types.d.ts.map +1 -1
  478. package/dist/utils/user-token.d.ts +38 -0
  479. package/dist/utils/user-token.d.ts.map +1 -1
  480. package/dist/utils/user-token.js +76 -1
  481. package/dist/utils/user-token.js.map +1 -1
  482. package/dist/utils/web-terminal-scroll.d.ts +27 -0
  483. package/dist/utils/web-terminal-scroll.d.ts.map +1 -0
  484. package/dist/utils/web-terminal-scroll.js +60 -0
  485. package/dist/utils/web-terminal-scroll.js.map +1 -0
  486. package/dist/vc-agent/polling-source.d.ts +70 -0
  487. package/dist/vc-agent/polling-source.d.ts.map +1 -1
  488. package/dist/vc-agent/polling-source.js +115 -0
  489. package/dist/vc-agent/polling-source.js.map +1 -1
  490. package/dist/worker.js +237 -76
  491. package/dist/worker.js.map +1 -1
  492. package/dist/workflows/definition.d.ts +22 -22
  493. package/dist/workflows/events/payloads.d.ts +8 -8
  494. package/dist/workflows/events/schema.d.ts +20 -20
  495. package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
  496. package/package.json +1 -1
  497. package/dist/dashboard-web/chunks/bot-defaults-page-NQJFJ45Z.js +0 -10
  498. package/dist/dashboard-web/chunks/chunk-KEEYQ3WF.js +0 -1
  499. package/dist/dashboard-web/chunks/connectors-page-HADHZXXZ.js +0 -1
  500. package/dist/dashboard-web/chunks/groups-page-5TYF46RS.js +0 -8
  501. package/dist/dashboard-web/chunks/monitoring-page-LBU7TTTW.js +0 -2
  502. package/dist/dashboard-web/chunks/office-page-DF6RRBMN.js +0 -1
  503. package/dist/dashboard-web/chunks/overview-page-ZB6QH2EX.js +0 -1
  504. package/dist/dashboard-web/chunks/roles-page-ZBZGHIIF.js +0 -1
  505. package/dist/dashboard-web/chunks/schedules-page-NQVQC3QY.js +0 -1
  506. package/dist/dashboard-web/chunks/settings-page-E7NN4NVQ.js +0 -2
  507. package/dist/dashboard-web/chunks/team-federation-page-VGWL53AE.js +0 -1
  508. package/dist/dashboard-web/chunks/whiteboards-page-BNWUU4KG.js +0 -1
package/dist/dashboard.js CHANGED
@@ -11,7 +11,7 @@ import { logger } from './utils/logger.js';
11
11
  import { gracefulProcessExitCode } from './pm2-graceful-exit.js';
12
12
  import { config, isWildcardBindHost } from './config.js';
13
13
  import { listenWithProbe } from './utils/listen-with-probe.js';
14
- import { parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, loadOrCreatePersistedToken, rotatePersistedToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
14
+ import { parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, loadOrCreatePersistedToken, rotatePersistedToken, loadDashboardSecret, loadOrCreateDashboardSecret, describeDashboardTokenError, } from './dashboard/auth.js';
15
15
  import { DaemonRegistry, botsRosterSignature } from './dashboard/registry.js';
16
16
  import { Aggregator, subscribeDaemon } from './dashboard/aggregator.js';
17
17
  import { createSessionPresentationCoordinator } from './dashboard/session-presentation.js';
@@ -28,6 +28,8 @@ import { handleDashboardTriggerApi } from './dashboard/trigger-api.js';
28
28
  import { handleConnectorApi } from './dashboard/connector-api.js';
29
29
  import { redactGroupsForPublic, redactSchedulesForPublic, redactSessionEventForPublic, redactSessionsForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
30
30
  import { handleWebhookRoute } from './dashboard/webhook-routes.js';
31
+ import { handleFeedbackAnalyticsApi } from './dashboard/feedback-analytics-api.js';
32
+ import { FeedbackAnalyticsService } from './services/feedback-analytics.js';
31
33
  import { handleFederationApi } from './dashboard/federation-api.js';
32
34
  import { buildFederatedRoster } from './services/federation-roster.js';
33
35
  import { resolveLiveBotTransport } from './services/team-roster.js';
@@ -54,6 +56,7 @@ import { detectGlobalInstallManager, formatGlobalInstallCommand, resolveGlobalIn
54
56
  import { filterCliRuntimeUpdateEntriesForTargets, listCliRuntimeUpdateEntries, selectCodexRuntimeUpdateTargets, } from './core/cli-runtime-update.js';
55
57
  import { claimRestartLease, clearRestartIntent, clearRestartLease, hasActiveRestartLease, writeManualIntentIfAbsent, writeRestartIntent, } from './services/restart-intent-store.js';
56
58
  import { withFileLock } from './utils/file-lock.js';
59
+ import { evaluateRestartShutdownPreflight } from './cli/restart-shutdown-preflight.js';
57
60
  import { spawn } from 'node:child_process';
58
61
  import { applySettingsWrite, defaultSettingsWriteApplierDeps, hasResolvedCodexNotifierRecipient, resolveCodexNotifierRecipientView, } from './dashboard/settings-write-applier.js';
59
62
  import { addBotsToGroup, bindOncall, disbandGroup, leaveGroup, unbindOncall, } from './dashboard/groups-action-helpers.js';
@@ -61,8 +64,9 @@ import { createDaemonInternalApi } from './dashboard/daemon-internal-api.js';
61
64
  import { listTeamReports, readTeamBoard, setTeamBoardEntry } from './services/team-board-store.js';
62
65
  import { createCliAdapterSync } from './adapters/cli/registry.js';
63
66
  import { hd2dAssetPath, hd2dStatus, startHd2dDownload } from './dashboard/hd2d-assets.js';
64
- import { buildSkillInstallAuditSummary, installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
67
+ import { buildSkillInstallAuditSummary, installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, sweepStoreTrash, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
65
68
  import { readSkillPackRegistry } from './services/skill-pack-store.js';
69
+ import { dashboardSessionActionTimeoutMs } from './dashboard/session-action-timeout.js';
66
70
  import { cloneSkillPack, createSkillPack, deleteSkillPack, getSkillPack, listSkillPacks, updateSkillPack, SkillPackStoreError, } from './services/skill-pack-store.js';
67
71
  import { redactGitUrlCredentials } from './core/skills/sources.js';
68
72
  import { enrichPackForDashboard, enrichPacksForDashboard, sanitizeSkillForDashboard, } from './dashboard/skill-pack-response.js';
@@ -618,11 +622,19 @@ function vcMeetingConsumerProfilesApiDeps() {
618
622
  return false;
619
623
  }
620
624
  },
621
- managedSideEffectIsolation: bot => evaluateVcMeetingConsumerIsolation({
625
+ managedSideEffectEligible: bot => evaluateVcMeetingConsumerIsolation({
622
626
  sandbox: bot.sandbox,
623
627
  platform: process.platform,
624
628
  backendType: resolvePairedSpawnBackendType(bot.cliId ?? config.daemon.cliId, undefined, bot.backendType, config.daemon.backendType),
625
629
  }).ok,
630
+ sandboxIsolated: bot => {
631
+ const decision = evaluateVcMeetingConsumerIsolation({
632
+ sandbox: bot.sandbox,
633
+ platform: process.platform,
634
+ backendType: resolvePairedSpawnBackendType(bot.cliId ?? config.daemon.cliId, undefined, bot.backendType, config.daemon.backendType),
635
+ });
636
+ return decision.ok && decision.isolated;
637
+ },
626
638
  reloadDaemons: reloadVcMeetingBotConfigOnDaemons,
627
639
  };
628
640
  }
@@ -1898,6 +1910,7 @@ function configuredBotAgentFields() {
1898
1910
  cliPathOverride: b.cliRuntime ? undefined : b.cliPathOverride,
1899
1911
  wrapperCli: b.wrapperCli,
1900
1912
  model: b.model,
1913
+ reasoningEffort: b.reasoningEffort,
1901
1914
  }]));
1902
1915
  }
1903
1916
  catch {
@@ -1914,6 +1927,7 @@ function withConfiguredCliId(bot, ids) {
1914
1927
  cliPathOverride: bot.cliPathOverride || fallback?.cliPathOverride,
1915
1928
  wrapperCli: bot.wrapperCli || fallback?.wrapperCli,
1916
1929
  model: bot.model || fallback?.model,
1930
+ reasoningEffort: bot.reasoningEffort || fallback?.reasoningEffort,
1917
1931
  };
1918
1932
  }
1919
1933
  function liveBots() {
@@ -2317,7 +2331,7 @@ function dashboardSkillCliIds() {
2317
2331
  const ids = new Set();
2318
2332
  // Always scan all known CLI skill dirs, not just configured bots — users may
2319
2333
  // want to discover codex/trae/... skills even before creating a bot for them.
2320
- const allCliIds = ['claude-code', 'seed', 'relay', 'aiden', 'coco', 'codex', 'codex-app', 'cursor', 'gemini', 'genius', 'opencode', 'antigravity', 'mtr', 'hermes', 'mira', 'mir', 'traex', 'pi', 'copilot', 'oh-my-pi', 'kimi', 'grok', 'kiro-cli', 'riff'];
2334
+ const allCliIds = ['claude-code', 'seed', 'relay', 'aiden', 'coco', 'codex', 'codex-app', 'cursor', 'gemini', 'genius', 'opencode', 'opencode2', 'antigravity', 'mtr', 'hermes', 'mira', 'mir', 'traex', 'pi', 'copilot', 'oh-my-pi', 'kimi', 'grok', 'kiro-cli', 'riff', 'reasonix', 'dsh'];
2321
2335
  for (const cliId of allCliIds)
2322
2336
  ids.add(cliId);
2323
2337
  try {
@@ -2533,6 +2547,10 @@ const dashboardSummaryEndpoint = createDashboardSummaryEndpoint({
2533
2547
  logger.warn(`[dashboard-summary] live snapshot unavailable: ${error instanceof Error ? error.message : String(error)}`);
2534
2548
  },
2535
2549
  });
2550
+ let feedbackAnalyticsService;
2551
+ function analyticsService() {
2552
+ return feedbackAnalyticsService ??= new FeedbackAnalyticsService(config.session.dataDir);
2553
+ }
2536
2554
  const server = createServer(async (req, res) => {
2537
2555
  try {
2538
2556
  const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
@@ -2614,6 +2632,45 @@ const server = createServer(async (req, res) => {
2614
2632
  if (await daemonInternalApi.handle(req, res, url)) {
2615
2633
  return;
2616
2634
  }
2635
+ // OAuth 回调接收页(/oauth/callback)— 也在 cookie/token gate 之前:飞书
2636
+ // authorize 跳回来的浏览器请求不带 dashboard token(redirect_uri 固定),
2637
+ // 挡在门外用户就只能回到人肉贴 URL 的旧流程。安全面:URL 里只有一次性
2638
+ // code + 随机 state;处理方仍要求 state 命中某个 daemon 进程的 pending
2639
+ // 表(5 分钟过期、一次即焚)并用 app_secret 换 token——本页面自身不持有
2640
+ // 任何敏感能力,等价于把「用户手工回贴」自动化。
2641
+ if (req.method === 'GET' && url.pathname === '/oauth/callback') {
2642
+ const page = (title, body, ok) => {
2643
+ res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
2644
+ res.end(`<!doctype html><meta name="viewport" content="width=device-width,initial-scale=1"><title>${title}</title><body style="font-family:system-ui;display:flex;align-items:center;justify-content:center;min-height:90vh;background:#f5f6f8"><div style="text-align:center;padding:32px 40px;background:#fff;border-radius:16px;box-shadow:0 4px 24px rgba(0,0,0,.08)"><div style="font-size:56px">${ok ? '✅' : '❌'}</div><h2 style="margin:12px 0 8px">${title}</h2><p style="color:#666;max-width:420px">${body}</p></div></body>`);
2645
+ };
2646
+ if (!url.searchParams.get('code') || !url.searchParams.get('state')) {
2647
+ page('回调参数缺失', '未收到授权码。请回到 Dashboard 重新发起授权。', false);
2648
+ return;
2649
+ }
2650
+ // state 只在生成链接的那个 daemon 进程内存里,逐个询问在线 daemon。
2651
+ let outcome = null;
2652
+ for (const d of registry.list()) {
2653
+ try {
2654
+ const r = await fetchDaemonIpc(d.ipcPort, '/api/oauth-callback', {
2655
+ method: 'POST',
2656
+ headers: { 'content-type': 'application/json' },
2657
+ body: JSON.stringify({ url: url.toString() }),
2658
+ });
2659
+ const j = await r.json().catch(() => null);
2660
+ if (j?.matched) {
2661
+ outcome = { ok: !!j.ok, message: String(j.message ?? '') };
2662
+ break;
2663
+ }
2664
+ }
2665
+ catch { /* daemon offline mid-iteration — try the next */ }
2666
+ }
2667
+ if (!outcome) {
2668
+ page('授权未完成', '没有找到等待中的授权请求(可能已超时,链接有效期 5 分钟)。请回到 Dashboard 重新点击授权。', false);
2669
+ return;
2670
+ }
2671
+ page(outcome.ok ? '授权完成' : '授权失败', outcome.ok ? '已完成授权,本页可以关闭。回到 Dashboard 即可看到状态更新。' : outcome.message, outcome.ok);
2672
+ return;
2673
+ }
2617
2674
  // CLI rotate (HMAC + loopback only) — for `botmux dashboard rotate`.
2618
2675
  // Publish the new token only after a durable write succeeds.
2619
2676
  if (req.method === 'POST' && url.pathname === '/__cli/rotate') {
@@ -2626,7 +2683,7 @@ const server = createServer(async (req, res) => {
2626
2683
  }
2627
2684
  catch (e) {
2628
2685
  logger.warn(`[dashboard] Failed to persist token to ${TOKEN_PATH}: ${e.message}`);
2629
- return jsonRes(res, 500, { error: 'token_persist_failed' });
2686
+ return jsonRes(res, 500, describeDashboardTokenError('token_persist_failed', e, TOKEN_PATH));
2630
2687
  }
2631
2688
  }
2632
2689
  // CLI get-or-create URL (HMAC + loopback only). Existing links survive
@@ -2641,7 +2698,7 @@ const server = createServer(async (req, res) => {
2641
2698
  }
2642
2699
  catch (e) {
2643
2700
  logger.warn(`[dashboard] Failed to ensure token at ${TOKEN_PATH}: ${e.message}`);
2644
- return jsonRes(res, 500, { error: 'token_persist_failed' });
2701
+ return jsonRes(res, 500, describeDashboardTokenError('token_persist_failed', e, TOKEN_PATH));
2645
2702
  }
2646
2703
  }
2647
2704
  // CLI read current URL (HMAC + loopback only) — for start/restart hints and
@@ -2656,7 +2713,7 @@ const server = createServer(async (req, res) => {
2656
2713
  }
2657
2714
  catch (e) {
2658
2715
  logger.warn(`[dashboard] Failed to read token from ${TOKEN_PATH}: ${e.message}`);
2659
- return jsonRes(res, 500, { error: 'token_unavailable' });
2716
+ return jsonRes(res, 500, describeDashboardTokenError('token_unavailable', e, TOKEN_PATH));
2660
2717
  }
2661
2718
  if (!token)
2662
2719
  return jsonRes(res, 404, { error: 'no_active_token' });
@@ -2723,6 +2780,10 @@ const server = createServer(async (req, res) => {
2723
2780
  message: 'v2 workflow dashboard APIs are retired; use /api/v3/runs for v3 run visibility',
2724
2781
  });
2725
2782
  }
2783
+ if (url.pathname.startsWith('/api/feedback/analytics/')) {
2784
+ await handleFeedbackAnalyticsApi(req, res, url, { service: analyticsService() });
2785
+ return;
2786
+ }
2726
2787
  if (req.method === 'GET' && url.pathname === '/__dev/reload') {
2727
2788
  if (!dashboardDevReloadEnabled())
2728
2789
  return jsonRes(res, 404, { error: 'dev_reload_disabled' });
@@ -3323,6 +3384,26 @@ const server = createServer(async (req, res) => {
3323
3384
  return jsonRes(res, 401, { ok: false, error: 'unauthorized' });
3324
3385
  if (updateInFlight)
3325
3386
  return jsonRes(res, 409, { ok: false, error: 'update_in_flight' });
3387
+ // The real restart runs in a detached `botmux restart` child, whose
3388
+ // shutdown-capability throw would only reach the maintenance-restart log
3389
+ // — the UI would then poll a reconnect that never happens and mislabel it
3390
+ // as "restart is slow". Detect that fail-closed boundary synchronously so
3391
+ // we can return a precise, actionable error instead of firing a restart
3392
+ // that is guaranteed to die silently. A read failure is non-authoritative
3393
+ // and falls through to the existing behavior (never fabricate a block).
3394
+ try {
3395
+ const preflight = evaluateRestartShutdownPreflight();
3396
+ if (preflight.bootstrapRequired) {
3397
+ return jsonRes(res, 409, {
3398
+ ok: false,
3399
+ error: 'bootstrap_shutdown_protocol_required',
3400
+ unsafeDaemons: preflight.unsafeDaemonNames,
3401
+ });
3402
+ }
3403
+ }
3404
+ catch (error) {
3405
+ logger.warn(`[dashboard] restart shutdown-capability preflight unavailable: ${error instanceof Error ? error.message : error}`);
3406
+ }
3326
3407
  let body = {};
3327
3408
  try {
3328
3409
  const parsed = await readJsonBody(req);
@@ -3970,7 +4051,25 @@ const server = createServer(async (req, res) => {
3970
4051
  const owner = aggregator.ownerOf(sid);
3971
4052
  if (!owner)
3972
4053
  return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
3973
- const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/${op}`, { method: 'POST' });
4054
+ // Defensive client-side deadline: the daemon side of every op here replies
4055
+ // promptly (close resolves its fence on the worker's flushed ACK; restart/
4056
+ // resume/start return after a fire-and-forget IPC). Close gets a separate
4057
+ // 60s budget because Riff's 23s remote-cancel prepare and 29s worker-kill
4058
+ // backstop are serialized; all other actions stay bounded at 15s.
4059
+ let upstream;
4060
+ try {
4061
+ upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/${op}`, {
4062
+ method: 'POST',
4063
+ signal: AbortSignal.timeout(dashboardSessionActionTimeoutMs(op)),
4064
+ });
4065
+ }
4066
+ catch (err) {
4067
+ const timedOut = err?.name === 'TimeoutError' || err?.name === 'AbortError';
4068
+ return jsonRes(res, timedOut ? 504 : 502, {
4069
+ ok: false,
4070
+ error: timedOut ? 'daemon_timeout' : (err?.message ?? String(err)),
4071
+ });
4072
+ }
3974
4073
  res.writeHead(upstream.status, { 'content-type': 'application/json' });
3975
4074
  res.end(await upstream.text());
3976
4075
  return;
@@ -4635,6 +4734,7 @@ const server = createServer(async (req, res) => {
4635
4734
  : d.cliPathOverride,
4636
4735
  wrapperCli: j.wrapperCli || d.wrapperCli,
4637
4736
  model: j.model || d.model,
4737
+ reasoningEffort: j.reasoningEffort || d.reasoningEffort,
4638
4738
  }, j);
4639
4739
  }
4640
4740
  catch (e) {
@@ -4804,6 +4904,35 @@ const server = createServer(async (req, res) => {
4804
4904
  res.end(await upstream.text());
4805
4905
  return;
4806
4906
  }
4907
+ let mBotFeedback;
4908
+ if (req.method === 'PUT' && (mBotFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/feedback$/))) {
4909
+ const appId = decodeURIComponent(mBotFeedback[1]);
4910
+ const chunks = [];
4911
+ for await (const c of req)
4912
+ chunks.push(c);
4913
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
4914
+ const upstream = await proxyToDaemon(appId, `/api/bot-feedback`, { method: 'PUT', headers: { 'content-type': 'application/json' }, body: raw });
4915
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4916
+ res.end(await upstream.text());
4917
+ return;
4918
+ }
4919
+ const mChatFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/chats\/([^/]+)\/feedback$/);
4920
+ if (req.method === 'PUT' && mChatFeedback) {
4921
+ const chunks = [];
4922
+ for await (const c of req)
4923
+ chunks.push(c);
4924
+ const upstream = await proxyToDaemon(decodeURIComponent(mChatFeedback[1]), `/api/chat-feedback/${encodeURIComponent(decodeURIComponent(mChatFeedback[2]))}`, { method: 'PUT', headers: { 'content-type': 'application/json' }, body: Buffer.concat(chunks).toString('utf8') || '{}' });
4925
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4926
+ res.end(await upstream.text());
4927
+ return;
4928
+ }
4929
+ const mEffectiveFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/feedback\/effective$/);
4930
+ if (req.method === 'GET' && mEffectiveFeedback) {
4931
+ const upstream = await proxyToDaemon(decodeURIComponent(mEffectiveFeedback[1]), `/api/feedback-effective${url.search}`, { method: 'GET' });
4932
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4933
+ res.end(await upstream.text());
4934
+ return;
4935
+ }
4807
4936
  // PUT /api/bots/:appId/env — proxy to that bot's daemon. Body
4808
4937
  // `{ env: string }` (raw JSON text; '' = clear).
4809
4938
  let mBotEnv;
@@ -5008,9 +5137,37 @@ const server = createServer(async (req, res) => {
5008
5137
  res.end(await upstream.text());
5009
5138
  return;
5010
5139
  }
5140
+ // 会话群标签授权(Dashboard 一站式):GET status / POST auth-link,
5141
+ // 均代理到对应 bot 的 daemon(state 必须驻留在生成链接的进程内)。
5142
+ let mBotTagAuth;
5143
+ if (mBotTagAuth = url.pathname.match(/^\/api\/bots\/([^/]+)\/session-group-tag-(status|auth|config)$/)) {
5144
+ const appId = decodeURIComponent(mBotTagAuth[1]);
5145
+ const kind = mBotTagAuth[2];
5146
+ const methodOk = (kind === 'status' && req.method === 'GET')
5147
+ || (kind === 'auth' && req.method === 'POST')
5148
+ || (kind === 'config' && req.method === 'PUT');
5149
+ if (methodOk) {
5150
+ let body;
5151
+ if (req.method !== 'GET') {
5152
+ const chunks = [];
5153
+ for await (const c of req)
5154
+ chunks.push(c);
5155
+ body = Buffer.concat(chunks).toString('utf8') || '{}';
5156
+ }
5157
+ const upstream = await proxyToDaemon(appId, `/api/session-group-tag-${kind}`, {
5158
+ method: req.method,
5159
+ headers: { 'content-type': 'application/json' },
5160
+ ...(body !== undefined ? { body } : {}),
5161
+ });
5162
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
5163
+ res.end(await upstream.text());
5164
+ return;
5165
+ }
5166
+ }
5011
5167
  // PUT /api/bots/:appId/p2p-mode — proxy to that bot's daemon. Body
5012
- // `{ p2pMode: 'chat' | 'thread' }` ('thread' = per-message DM session;
5013
- // anything else clears back to the flat continuous chat default).
5168
+ // `{ p2pMode: 'chat' | 'thread' | 'group' }` ('thread' = per-message DM
5169
+ // session; 'group' = per-message dedicated session group; anything else
5170
+ // clears back to the flat continuous chat default).
5014
5171
  let mBotP2pMode;
5015
5172
  if (req.method === 'PUT' && (mBotP2pMode = url.pathname.match(/^\/api\/bots\/([^/]+)\/p2p-mode$/))) {
5016
5173
  const appId = decodeURIComponent(mBotP2pMode[1]);
@@ -5027,6 +5184,25 @@ const server = createServer(async (req, res) => {
5027
5184
  res.end(await upstream.text());
5028
5185
  return;
5029
5186
  }
5187
+ // PUT /api/bots/:appId/envelope-injection — proxy to that bot's daemon.
5188
+ // Body `{ envelopeInjection: 'auto'|'off'|'' }` (''/other clears back to
5189
+ // the inline default). #794: hook 注入 per-turn 上下文的 per-bot 开关。
5190
+ let mBotEnvelopeInjection;
5191
+ if (req.method === 'PUT' && (mBotEnvelopeInjection = url.pathname.match(/^\/api\/bots\/([^/]+)\/envelope-injection$/))) {
5192
+ const appId = decodeURIComponent(mBotEnvelopeInjection[1]);
5193
+ const chunks = [];
5194
+ for await (const c of req)
5195
+ chunks.push(c);
5196
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
5197
+ const upstream = await proxyToDaemon(appId, `/api/bot-envelope-injection`, {
5198
+ method: 'PUT',
5199
+ headers: { 'content-type': 'application/json' },
5200
+ body: raw,
5201
+ });
5202
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
5203
+ res.end(await upstream.text());
5204
+ return;
5205
+ }
5030
5206
  // PUT /api/bots/:appId/skill-injection — proxy to that bot's daemon. Body
5031
5207
  // `{ skillInjection: 'global'|'prompt'|'off'|'' }` (''/other clears back to
5032
5208
  // the machine default). Governs how botmux built-in skills reach global-
@@ -5049,7 +5225,8 @@ const server = createServer(async (req, res) => {
5049
5225
  }
5050
5226
  // PUT /api/bots/:appId/grant-prefs — proxy to that bot's daemon. Body carries
5051
5227
  // any subset of `{ restrictGrantCommands?: boolean, autoGrantRequestCards?: boolean,
5052
- // messageQuotaDefaultLimit?: number|null, grantDefaultDurationMs?: number|null }`.
5228
+ // p2pOpen?: boolean, messageQuotaDefaultLimit?: number|null,
5229
+ // grantDefaultDurationMs?: number|null }`.
5053
5230
  let mBotGrantPrefs;
5054
5231
  if (req.method === 'PUT' && (mBotGrantPrefs = url.pathname.match(/^\/api\/bots\/([^/]+)\/grant-prefs$/))) {
5055
5232
  const appId = decodeURIComponent(mBotGrantPrefs[1]);
@@ -5642,6 +5819,9 @@ listenWithProbe({
5642
5819
  logger.warn(`[dashboard] Failed to persist port to ${PORT_PATH}: ${e.message}`);
5643
5820
  }
5644
5821
  logger.info(`[dashboard] listening on ${config.dashboard.host}:${port}`);
5822
+ // Reclaim any `.trash-*` skill trees left by an interrupted background unlink
5823
+ // (crash/restart mid-delete). Best-effort and fire-and-forget.
5824
+ sweepStoreTrash();
5645
5825
  startPlatformTunnelIfBound();
5646
5826
  }).catch((err) => {
5647
5827
  logger.error(`[dashboard] could not bind near ${config.dashboard.host}:${config.dashboard.port} after probing — set BOTMUX_DASHBOARD_PORT to a free port. ${err.message}`);
@@ -5751,8 +5931,14 @@ function startPlatformTunnelIfBound() {
5751
5931
  if (!binding)
5752
5932
  return;
5753
5933
  const existingToken = currentDashboardToken();
5754
- loadOrCreatePersistedToken(TOKEN_PATH);
5934
+ // An already-materialized dashboard token is sufficient to start the
5935
+ // tunnel. Avoid re-validating its path via secureHostFilePath(): on Linux
5936
+ // the request-time read is descriptor-pinned, while deployments whose HOME
5937
+ // is a root-owned symlink (common on managed dev hosts) can make the
5938
+ // path-returning helper fail even though the 0600 file is safely readable.
5939
+ // Only the first token creation needs the path+lock helper.
5755
5940
  if (!existingToken) {
5941
+ loadOrCreatePersistedToken(TOKEN_PATH);
5756
5942
  logger.info('[platform-tunnel] 已初始化 dashboard token');
5757
5943
  }
5758
5944
  const version = readBotmuxVersion();
@@ -5910,6 +6096,7 @@ function shutdown() {
5910
6096
  resourceMonitor.stop();
5911
6097
  platformTunnel?.stop();
5912
6098
  debugTerminalManager.shutdown();
6099
+ feedbackAnalyticsService?.close();
5913
6100
  if (oauthCallbackServer.listening)
5914
6101
  oauthCallbackServer.close();
5915
6102
  server.close(() => process.exit(gracefulProcessExitCode()));