botmux 3.13.0 → 3.15.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 (541) 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 +34 -3
  27. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  28. package/dist/adapters/backend/tmux-pipe-backend.js +72 -9
  29. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  30. package/dist/adapters/backend/types.d.ts +7 -0
  31. package/dist/adapters/backend/types.d.ts.map +1 -1
  32. package/dist/adapters/backend/types.js.map +1 -1
  33. package/dist/adapters/backend/zellij-backend.d.ts +2 -3
  34. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  35. package/dist/adapters/backend/zellij-backend.js +6 -13
  36. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  37. package/dist/adapters/backend/zellij-observe-backend.d.ts +2 -1
  38. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
  39. package/dist/adapters/backend/zellij-observe-backend.js +6 -3
  40. package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
  41. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
  42. package/dist/adapters/backend/zmx-backend.js +40 -18
  43. package/dist/adapters/backend/zmx-backend.js.map +1 -1
  44. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  45. package/dist/adapters/cli/claude-code.js +12 -1
  46. package/dist/adapters/cli/claude-code.js.map +1 -1
  47. package/dist/adapters/cli/codex.d.ts.map +1 -1
  48. package/dist/adapters/cli/codex.js +3 -2
  49. package/dist/adapters/cli/codex.js.map +1 -1
  50. package/dist/adapters/cli/cursor.d.ts.map +1 -1
  51. package/dist/adapters/cli/cursor.js +13 -1
  52. package/dist/adapters/cli/cursor.js.map +1 -1
  53. package/dist/adapters/cli/dsh.d.ts +4 -0
  54. package/dist/adapters/cli/dsh.d.ts.map +1 -0
  55. package/dist/adapters/cli/dsh.js +100 -0
  56. package/dist/adapters/cli/dsh.js.map +1 -0
  57. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  58. package/dist/adapters/cli/fs-policy.js +5 -0
  59. package/dist/adapters/cli/fs-policy.js.map +1 -1
  60. package/dist/adapters/cli/opencode.d.ts +52 -1
  61. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  62. package/dist/adapters/cli/opencode.js +117 -76
  63. package/dist/adapters/cli/opencode.js.map +1 -1
  64. package/dist/adapters/cli/opencode2.d.ts +4 -0
  65. package/dist/adapters/cli/opencode2.d.ts.map +1 -0
  66. package/dist/adapters/cli/opencode2.js +137 -0
  67. package/dist/adapters/cli/opencode2.js.map +1 -0
  68. package/dist/adapters/cli/pi.d.ts +14 -1
  69. package/dist/adapters/cli/pi.d.ts.map +1 -1
  70. package/dist/adapters/cli/pi.js +21 -1
  71. package/dist/adapters/cli/pi.js.map +1 -1
  72. package/dist/adapters/cli/read-isolation.d.ts +1 -1
  73. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  74. package/dist/adapters/cli/read-isolation.js +5 -2
  75. package/dist/adapters/cli/read-isolation.js.map +1 -1
  76. package/dist/adapters/cli/registry.d.ts +7 -1
  77. package/dist/adapters/cli/registry.d.ts.map +1 -1
  78. package/dist/adapters/cli/registry.js +19 -6
  79. package/dist/adapters/cli/registry.js.map +1 -1
  80. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  81. package/dist/adapters/cli/shared-hints.js +41 -23
  82. package/dist/adapters/cli/shared-hints.js.map +1 -1
  83. package/dist/adapters/cli/types.d.ts +28 -3
  84. package/dist/adapters/cli/types.d.ts.map +1 -1
  85. package/dist/adapters/hook-command.d.ts +8 -0
  86. package/dist/adapters/hook-command.d.ts.map +1 -1
  87. package/dist/adapters/hook-command.js +11 -0
  88. package/dist/adapters/hook-command.js.map +1 -1
  89. package/dist/adapters/hook-installer.d.ts +16 -1
  90. package/dist/adapters/hook-installer.d.ts.map +1 -1
  91. package/dist/adapters/hook-installer.js +232 -2
  92. package/dist/adapters/hook-installer.js.map +1 -1
  93. package/dist/bot-registry.d.ts +138 -8
  94. package/dist/bot-registry.d.ts.map +1 -1
  95. package/dist/bot-registry.js +76 -4
  96. package/dist/bot-registry.js.map +1 -1
  97. package/dist/cli/pm2-start-transaction.d.ts +14 -0
  98. package/dist/cli/pm2-start-transaction.d.ts.map +1 -1
  99. package/dist/cli/pm2-start-transaction.js +25 -9
  100. package/dist/cli/pm2-start-transaction.js.map +1 -1
  101. package/dist/cli/restart-failure-notification.d.ts +54 -0
  102. package/dist/cli/restart-failure-notification.d.ts.map +1 -0
  103. package/dist/cli/restart-failure-notification.js +142 -0
  104. package/dist/cli/restart-failure-notification.js.map +1 -0
  105. package/dist/cli/restart-failure-owner.d.ts +20 -0
  106. package/dist/cli/restart-failure-owner.d.ts.map +1 -0
  107. package/dist/cli/restart-failure-owner.js +27 -0
  108. package/dist/cli/restart-failure-owner.js.map +1 -0
  109. package/dist/cli/restart-shutdown-preflight.d.ts +24 -0
  110. package/dist/cli/restart-shutdown-preflight.d.ts.map +1 -0
  111. package/dist/cli/restart-shutdown-preflight.js +105 -0
  112. package/dist/cli/restart-shutdown-preflight.js.map +1 -0
  113. package/dist/cli/send-dispatch.d.ts +26 -0
  114. package/dist/cli/send-dispatch.d.ts.map +1 -1
  115. package/dist/cli/send-dispatch.js +30 -0
  116. package/dist/cli/send-dispatch.js.map +1 -1
  117. package/dist/cli.d.ts +4 -1
  118. package/dist/cli.d.ts.map +1 -1
  119. package/dist/cli.js +673 -402
  120. package/dist/cli.js.map +1 -1
  121. package/dist/codex-app-runner.js +38 -15
  122. package/dist/codex-app-runner.js.map +1 -1
  123. package/dist/codex-rpc-lifecycle.d.ts +14 -2
  124. package/dist/codex-rpc-lifecycle.d.ts.map +1 -1
  125. package/dist/codex-rpc-lifecycle.js +13 -3
  126. package/dist/codex-rpc-lifecycle.js.map +1 -1
  127. package/dist/core/ask-broker.d.ts +3 -0
  128. package/dist/core/ask-broker.d.ts.map +1 -1
  129. package/dist/core/ask-broker.js +29 -7
  130. package/dist/core/ask-broker.js.map +1 -1
  131. package/dist/core/ask-hook/registry.d.ts.map +1 -1
  132. package/dist/core/ask-hook/registry.js +4 -0
  133. package/dist/core/ask-hook/registry.js.map +1 -1
  134. package/dist/core/ask-types.d.ts +5 -1
  135. package/dist/core/ask-types.d.ts.map +1 -1
  136. package/dist/core/ask-types.js.map +1 -1
  137. package/dist/core/browser-restart.d.ts +112 -0
  138. package/dist/core/browser-restart.d.ts.map +1 -0
  139. package/dist/core/browser-restart.js +233 -0
  140. package/dist/core/browser-restart.js.map +1 -0
  141. package/dist/core/command-discovery.d.ts.map +1 -1
  142. package/dist/core/command-discovery.js +4 -1
  143. package/dist/core/command-discovery.js.map +1 -1
  144. package/dist/core/command-handler.d.ts +19 -11
  145. package/dist/core/command-handler.d.ts.map +1 -1
  146. package/dist/core/command-handler.js +237 -43
  147. package/dist/core/command-handler.js.map +1 -1
  148. package/dist/core/current-turn-provenance.d.ts.map +1 -1
  149. package/dist/core/current-turn-provenance.js +7 -27
  150. package/dist/core/current-turn-provenance.js.map +1 -1
  151. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  152. package/dist/core/dashboard-ipc-server.js +359 -11
  153. package/dist/core/dashboard-ipc-server.js.map +1 -1
  154. package/dist/core/dispatch-registry.d.ts.map +1 -1
  155. package/dist/core/dispatch-registry.js +6 -0
  156. package/dist/core/dispatch-registry.js.map +1 -1
  157. package/dist/core/dispatch-report-binding.d.ts +31 -0
  158. package/dist/core/dispatch-report-binding.d.ts.map +1 -0
  159. package/dist/core/dispatch-report-binding.js +88 -0
  160. package/dist/core/dispatch-report-binding.js.map +1 -0
  161. package/dist/core/doc-comment-prompt.d.ts +2 -0
  162. package/dist/core/doc-comment-prompt.d.ts.map +1 -1
  163. package/dist/core/doc-comment-prompt.js +6 -0
  164. package/dist/core/doc-comment-prompt.js.map +1 -1
  165. package/dist/core/host-overload-alert.d.ts +25 -1
  166. package/dist/core/host-overload-alert.d.ts.map +1 -1
  167. package/dist/core/host-overload-alert.js +69 -8
  168. package/dist/core/host-overload-alert.js.map +1 -1
  169. package/dist/core/local-terminal-opener.js +1 -1
  170. package/dist/core/local-terminal-opener.js.map +1 -1
  171. package/dist/core/managed-origin-capability.d.ts +7 -6
  172. package/dist/core/managed-origin-capability.d.ts.map +1 -1
  173. package/dist/core/managed-origin-capability.js +32 -1
  174. package/dist/core/managed-origin-capability.js.map +1 -1
  175. package/dist/core/passthrough-commands.d.ts.map +1 -1
  176. package/dist/core/passthrough-commands.js +3 -2
  177. package/dist/core/passthrough-commands.js.map +1 -1
  178. package/dist/core/plugins/materializer.d.ts.map +1 -1
  179. package/dist/core/plugins/materializer.js +1 -0
  180. package/dist/core/plugins/materializer.js.map +1 -1
  181. package/dist/core/producer-quiescence.d.ts +70 -0
  182. package/dist/core/producer-quiescence.d.ts.map +1 -0
  183. package/dist/core/producer-quiescence.js +90 -0
  184. package/dist/core/producer-quiescence.js.map +1 -0
  185. package/dist/core/raw-command-write-options.d.ts +10 -0
  186. package/dist/core/raw-command-write-options.d.ts.map +1 -0
  187. package/dist/core/raw-command-write-options.js +23 -0
  188. package/dist/core/raw-command-write-options.js.map +1 -0
  189. package/dist/core/raw-command-writer.d.ts +4 -0
  190. package/dist/core/raw-command-writer.d.ts.map +1 -1
  191. package/dist/core/raw-command-writer.js +15 -6
  192. package/dist/core/raw-command-writer.js.map +1 -1
  193. package/dist/core/reply-target.d.ts +11 -0
  194. package/dist/core/reply-target.d.ts.map +1 -1
  195. package/dist/core/reply-target.js +22 -7
  196. package/dist/core/reply-target.js.map +1 -1
  197. package/dist/core/report-session-relay.d.ts +53 -0
  198. package/dist/core/report-session-relay.d.ts.map +1 -0
  199. package/dist/core/report-session-relay.js +116 -0
  200. package/dist/core/report-session-relay.js.map +1 -0
  201. package/dist/core/session-discovery.d.ts +5 -0
  202. package/dist/core/session-discovery.d.ts.map +1 -1
  203. package/dist/core/session-discovery.js +13 -0
  204. package/dist/core/session-discovery.js.map +1 -1
  205. package/dist/core/session-group-birth.d.ts +7 -0
  206. package/dist/core/session-group-birth.d.ts.map +1 -0
  207. package/dist/core/session-group-birth.js +145 -0
  208. package/dist/core/session-group-birth.js.map +1 -0
  209. package/dist/core/session-manager.d.ts +16 -21
  210. package/dist/core/session-manager.d.ts.map +1 -1
  211. package/dist/core/session-manager.js +140 -21
  212. package/dist/core/session-manager.js.map +1 -1
  213. package/dist/core/skills/frontmatter.d.ts.map +1 -1
  214. package/dist/core/skills/frontmatter.js +6 -1
  215. package/dist/core/skills/frontmatter.js.map +1 -1
  216. package/dist/core/trigger-session.d.ts.map +1 -1
  217. package/dist/core/trigger-session.js +18 -3
  218. package/dist/core/trigger-session.js.map +1 -1
  219. package/dist/core/types.d.ts +18 -0
  220. package/dist/core/types.d.ts.map +1 -1
  221. package/dist/core/types.js.map +1 -1
  222. package/dist/core/worker-pool.d.ts +63 -11
  223. package/dist/core/worker-pool.d.ts.map +1 -1
  224. package/dist/core/worker-pool.js +262 -21
  225. package/dist/core/worker-pool.js.map +1 -1
  226. package/dist/daemon.d.ts +33 -0
  227. package/dist/daemon.d.ts.map +1 -1
  228. package/dist/daemon.js +904 -147
  229. package/dist/daemon.js.map +1 -1
  230. package/dist/dashboard/auth.d.ts +20 -0
  231. package/dist/dashboard/auth.d.ts.map +1 -1
  232. package/dist/dashboard/auth.js +86 -1
  233. package/dist/dashboard/auth.js.map +1 -1
  234. package/dist/dashboard/bot-payload.d.ts +9 -0
  235. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  236. package/dist/dashboard/bot-payload.js +5 -1
  237. package/dist/dashboard/bot-payload.js.map +1 -1
  238. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  239. package/dist/dashboard/federation-spoke-api.js +27 -3
  240. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  241. package/dist/dashboard/feedback-analytics-api.d.ts +6 -0
  242. package/dist/dashboard/feedback-analytics-api.d.ts.map +1 -0
  243. package/dist/dashboard/feedback-analytics-api.js +39 -0
  244. package/dist/dashboard/feedback-analytics-api.js.map +1 -0
  245. package/dist/dashboard/session-action-timeout.d.ts +3 -0
  246. package/dist/dashboard/session-action-timeout.d.ts.map +1 -0
  247. package/dist/dashboard/session-action-timeout.js +12 -0
  248. package/dist/dashboard/session-action-timeout.js.map +1 -0
  249. package/dist/dashboard/vc-consumer-profiles-api.d.ts +9 -3
  250. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  251. package/dist/dashboard/vc-consumer-profiles-api.js +2 -1
  252. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  253. package/dist/dashboard/web/app.d.ts.map +1 -1
  254. package/dist/dashboard/web/app.js +48 -5
  255. package/dist/dashboard/web/app.js.map +1 -1
  256. package/dist/dashboard/web/bot-defaults-page.d.ts +11 -0
  257. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  258. package/dist/dashboard/web/bot-defaults-page.js +368 -36
  259. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  260. package/dist/dashboard/web/bot-defaults.d.ts +8 -0
  261. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  262. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  263. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  264. package/dist/dashboard/web/dashboard-routes.js +1 -0
  265. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  266. package/dist/dashboard/web/feedback-page.d.ts +3 -0
  267. package/dist/dashboard/web/feedback-page.d.ts.map +1 -0
  268. package/dist/dashboard/web/feedback-page.js +34 -0
  269. package/dist/dashboard/web/feedback-page.js.map +1 -0
  270. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  271. package/dist/dashboard/web/groups-page.js +7 -2
  272. package/dist/dashboard/web/groups-page.js.map +1 -1
  273. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  274. package/dist/dashboard/web/i18n.js +122 -22
  275. package/dist/dashboard/web/i18n.js.map +1 -1
  276. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  277. package/dist/dashboard/web/skills-page.js +4 -2
  278. package/dist/dashboard/web/skills-page.js.map +1 -1
  279. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
  280. package/dist/dashboard/web/team-federation-page.js +26 -2
  281. package/dist/dashboard/web/team-federation-page.js.map +1 -1
  282. package/dist/dashboard/web/team-federation.d.ts +19 -0
  283. package/dist/dashboard/web/team-federation.d.ts.map +1 -1
  284. package/dist/dashboard/web/team-federation.js +3 -0
  285. package/dist/dashboard/web/team-federation.js.map +1 -1
  286. package/dist/dashboard/web/update-action.d.ts +8 -0
  287. package/dist/dashboard/web/update-action.d.ts.map +1 -1
  288. package/dist/dashboard/web/update-action.js +10 -0
  289. package/dist/dashboard/web/update-action.js.map +1 -1
  290. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  291. package/dist/dashboard/web/vc-consumer-profiles-section.js +58 -9
  292. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  293. package/dist/dashboard-web/app.js +1 -1
  294. package/dist/dashboard-web/chunks/bot-defaults-page-65SMZ4QY.js +10 -0
  295. package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +1 -0
  296. package/dist/dashboard-web/chunks/chunk-IKN6WURK.js +1 -0
  297. package/dist/dashboard-web/chunks/{chunk-6JTZJRQJ.js → chunk-VMWNR3SV.js} +15 -15
  298. package/dist/dashboard-web/chunks/{chunk-CU4SUKK3.js → chunk-Z7B3E3US.js} +1 -1
  299. package/dist/dashboard-web/chunks/{chunk-5QJB24I2.js → chunk-Z7DO42GJ.js} +1 -1
  300. package/dist/dashboard-web/chunks/connectors-page-CPH6VVFY.js +1 -0
  301. package/dist/dashboard-web/chunks/feedback-page-J2FKQ3LK.js +1 -0
  302. package/dist/dashboard-web/chunks/groups-page-VDOOLS4M.js +8 -0
  303. package/dist/dashboard-web/chunks/{insights-page-EVGGJI5L.js → insights-page-A2LWTKJD.js} +1 -1
  304. package/dist/dashboard-web/chunks/{monitor-room-HRGR2ENP.js → monitor-room-2YR752E3.js} +1 -1
  305. package/dist/dashboard-web/chunks/monitoring-page-BGYSKZGM.js +2 -0
  306. package/dist/dashboard-web/chunks/office-page-ZZHTEAE4.js +1 -0
  307. package/dist/dashboard-web/chunks/overview-page-7NYPKQSB.js +1 -0
  308. package/dist/dashboard-web/chunks/roles-page-YUC4YLJG.js +1 -0
  309. package/dist/dashboard-web/chunks/schedules-page-2L2NKTDJ.js +1 -0
  310. package/dist/dashboard-web/chunks/{sessions-page-DXBCDWCS.js → sessions-page-DYZZMKFL.js} +1 -1
  311. package/dist/dashboard-web/chunks/settings-page-LIULUSMH.js +2 -0
  312. package/dist/dashboard-web/chunks/{skills-page-2QAVB2SA.js → skills-page-DQPBBI3T.js} +2 -2
  313. package/dist/dashboard-web/chunks/team-federation-page-LQKLDV4K.js +1 -0
  314. package/dist/dashboard-web/chunks/{v3-page-AY35LKCX.js → v3-page-RVKQIMAP.js} +1 -1
  315. package/dist/dashboard-web/chunks/whiteboards-page-S5K55HRZ.js +1 -0
  316. package/dist/dashboard-web/style.css +35 -0
  317. package/dist/dashboard.js +210 -13
  318. package/dist/dashboard.js.map +1 -1
  319. package/dist/desktop/shared/shell-path-probes.d.ts +1 -1
  320. package/dist/desktop/shared/shell-path-probes.js +2 -2
  321. package/dist/desktop/shared/shell-path-probes.js.map +1 -1
  322. package/dist/dsh-runner.d.ts +3 -0
  323. package/dist/dsh-runner.d.ts.map +1 -0
  324. package/dist/dsh-runner.js +673 -0
  325. package/dist/dsh-runner.js.map +1 -0
  326. package/dist/global-config.d.ts +24 -0
  327. package/dist/global-config.d.ts.map +1 -1
  328. package/dist/global-config.js +35 -0
  329. package/dist/global-config.js.map +1 -1
  330. package/dist/i18n/en.d.ts.map +1 -1
  331. package/dist/i18n/en.js +39 -31
  332. package/dist/i18n/en.js.map +1 -1
  333. package/dist/i18n/zh.d.ts.map +1 -1
  334. package/dist/i18n/zh.js +39 -31
  335. package/dist/i18n/zh.js.map +1 -1
  336. package/dist/im/lark/ask-card.d.ts +3 -1
  337. package/dist/im/lark/ask-card.d.ts.map +1 -1
  338. package/dist/im/lark/ask-card.js +61 -5
  339. package/dist/im/lark/ask-card.js.map +1 -1
  340. package/dist/im/lark/card-builder.d.ts.map +1 -1
  341. package/dist/im/lark/card-builder.js +13 -6
  342. package/dist/im/lark/card-builder.js.map +1 -1
  343. package/dist/im/lark/card-handler.d.ts +2 -1
  344. package/dist/im/lark/card-handler.d.ts.map +1 -1
  345. package/dist/im/lark/card-handler.js +145 -5
  346. package/dist/im/lark/card-handler.js.map +1 -1
  347. package/dist/im/lark/event-dispatcher.d.ts +18 -0
  348. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  349. package/dist/im/lark/event-dispatcher.js +41 -28
  350. package/dist/im/lark/event-dispatcher.js.map +1 -1
  351. package/dist/im/lark/md-card.d.ts +18 -0
  352. package/dist/im/lark/md-card.d.ts.map +1 -1
  353. package/dist/im/lark/md-card.js +21 -0
  354. package/dist/im/lark/md-card.js.map +1 -1
  355. package/dist/im/lark/relay-target-routing.d.ts.map +1 -1
  356. package/dist/im/lark/relay-target-routing.js +3 -2
  357. package/dist/im/lark/relay-target-routing.js.map +1 -1
  358. package/dist/im/lark/reply-mode-command.d.ts.map +1 -1
  359. package/dist/im/lark/reply-mode-command.js +19 -8
  360. package/dist/im/lark/reply-mode-command.js.map +1 -1
  361. package/dist/im/lark/skill-feedback-card.d.ts +15 -0
  362. package/dist/im/lark/skill-feedback-card.d.ts.map +1 -0
  363. package/dist/im/lark/skill-feedback-card.js +149 -0
  364. package/dist/im/lark/skill-feedback-card.js.map +1 -0
  365. package/dist/services/bot-config-store.d.ts +10 -1
  366. package/dist/services/bot-config-store.d.ts.map +1 -1
  367. package/dist/services/bot-config-store.js +103 -3
  368. package/dist/services/bot-config-store.js.map +1 -1
  369. package/dist/services/bridge-fallback-gate.d.ts +29 -7
  370. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  371. package/dist/services/bridge-fallback-gate.js +58 -16
  372. package/dist/services/bridge-fallback-gate.js.map +1 -1
  373. package/dist/services/codex-reasoning-effort.d.ts +9 -0
  374. package/dist/services/codex-reasoning-effort.d.ts.map +1 -0
  375. package/dist/services/codex-reasoning-effort.js +23 -0
  376. package/dist/services/codex-reasoning-effort.js.map +1 -0
  377. package/dist/services/codex-service-tier.d.ts +1 -1
  378. package/dist/services/codex-service-tier.d.ts.map +1 -1
  379. package/dist/services/codex-transcript.d.ts +9 -0
  380. package/dist/services/codex-transcript.d.ts.map +1 -1
  381. package/dist/services/codex-transcript.js +13 -6
  382. package/dist/services/codex-transcript.js.map +1 -1
  383. package/dist/services/feed-group-tagger.d.ts +15 -0
  384. package/dist/services/feed-group-tagger.d.ts.map +1 -0
  385. package/dist/services/feed-group-tagger.js +348 -0
  386. package/dist/services/feed-group-tagger.js.map +1 -0
  387. package/dist/services/feedback-analytics.d.ts +82 -0
  388. package/dist/services/feedback-analytics.d.ts.map +1 -0
  389. package/dist/services/feedback-analytics.js +95 -0
  390. package/dist/services/feedback-analytics.js.map +1 -0
  391. package/dist/services/feedback-outbox.d.ts +24 -0
  392. package/dist/services/feedback-outbox.d.ts.map +1 -0
  393. package/dist/services/feedback-outbox.js +12 -0
  394. package/dist/services/feedback-outbox.js.map +1 -0
  395. package/dist/services/feedback-policy-resolver.d.ts +56 -0
  396. package/dist/services/feedback-policy-resolver.d.ts.map +1 -0
  397. package/dist/services/feedback-policy-resolver.js +156 -0
  398. package/dist/services/feedback-policy-resolver.js.map +1 -0
  399. package/dist/services/feedback-policy.d.ts +41 -0
  400. package/dist/services/feedback-policy.d.ts.map +1 -0
  401. package/dist/services/feedback-policy.js +102 -0
  402. package/dist/services/feedback-policy.js.map +1 -0
  403. package/dist/services/feedback-webhook-dispatcher.d.ts +76 -0
  404. package/dist/services/feedback-webhook-dispatcher.d.ts.map +1 -0
  405. package/dist/services/feedback-webhook-dispatcher.js +237 -0
  406. package/dist/services/feedback-webhook-dispatcher.js.map +1 -0
  407. package/dist/services/grant-prefs-store.d.ts +3 -0
  408. package/dist/services/grant-prefs-store.d.ts.map +1 -1
  409. package/dist/services/grant-prefs-store.js +30 -1
  410. package/dist/services/grant-prefs-store.js.map +1 -1
  411. package/dist/services/groups-store.d.ts +14 -0
  412. package/dist/services/groups-store.d.ts.map +1 -1
  413. package/dist/services/groups-store.js +23 -0
  414. package/dist/services/groups-store.js.map +1 -1
  415. package/dist/services/local-cli-opener.d.ts +1 -1
  416. package/dist/services/local-cli-opener.d.ts.map +1 -1
  417. package/dist/services/local-cli-opener.js +2 -0
  418. package/dist/services/local-cli-opener.js.map +1 -1
  419. package/dist/services/peer-cross-ref-store.d.ts +8 -0
  420. package/dist/services/peer-cross-ref-store.d.ts.map +1 -0
  421. package/dist/services/peer-cross-ref-store.js +95 -0
  422. package/dist/services/peer-cross-ref-store.js.map +1 -0
  423. package/dist/services/pi-transcript.d.ts.map +1 -1
  424. package/dist/services/pi-transcript.js +10 -6
  425. package/dist/services/pi-transcript.js.map +1 -1
  426. package/dist/services/prompt-context-store.d.ts +29 -0
  427. package/dist/services/prompt-context-store.d.ts.map +1 -0
  428. package/dist/services/prompt-context-store.js +205 -0
  429. package/dist/services/prompt-context-store.js.map +1 -0
  430. package/dist/services/session-group-avatar.d.ts +6 -0
  431. package/dist/services/session-group-avatar.d.ts.map +1 -0
  432. package/dist/services/session-group-avatar.js +96 -0
  433. package/dist/services/session-group-avatar.js.map +1 -0
  434. package/dist/services/session-group-title.d.ts +47 -0
  435. package/dist/services/session-group-title.d.ts.map +1 -0
  436. package/dist/services/session-group-title.js +226 -0
  437. package/dist/services/session-group-title.js.map +1 -0
  438. package/dist/services/session-groups-store.d.ts +30 -0
  439. package/dist/services/session-groups-store.d.ts.map +1 -0
  440. package/dist/services/session-groups-store.js +132 -0
  441. package/dist/services/session-groups-store.js.map +1 -0
  442. package/dist/services/session-store.d.ts +58 -0
  443. package/dist/services/session-store.d.ts.map +1 -1
  444. package/dist/services/session-store.js +174 -0
  445. package/dist/services/session-store.js.map +1 -1
  446. package/dist/services/skill-feedback-store.d.ts +252 -0
  447. package/dist/services/skill-feedback-store.d.ts.map +1 -0
  448. package/dist/services/skill-feedback-store.js +795 -0
  449. package/dist/services/skill-feedback-store.js.map +1 -0
  450. package/dist/services/skill-registry-store.d.ts +23 -0
  451. package/dist/services/skill-registry-store.d.ts.map +1 -1
  452. package/dist/services/skill-registry-store.js +93 -7
  453. package/dist/services/skill-registry-store.js.map +1 -1
  454. package/dist/services/structured-bridge-clis.d.ts +13 -4
  455. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  456. package/dist/services/structured-bridge-clis.js +13 -3
  457. package/dist/services/structured-bridge-clis.js.map +1 -1
  458. package/dist/services/team-store.d.ts +4 -0
  459. package/dist/services/team-store.d.ts.map +1 -1
  460. package/dist/services/team-store.js +16 -0
  461. package/dist/services/team-store.js.map +1 -1
  462. package/dist/services/traex-transcript.d.ts +32 -4
  463. package/dist/services/traex-transcript.d.ts.map +1 -1
  464. package/dist/services/traex-transcript.js +116 -8
  465. package/dist/services/traex-transcript.js.map +1 -1
  466. package/dist/services/trigger-types.d.ts +1 -1
  467. package/dist/services/trigger-types.d.ts.map +1 -1
  468. package/dist/services/trigger-types.js +2 -2
  469. package/dist/services/trigger-types.js.map +1 -1
  470. package/dist/services/turn-completion-events.d.ts +57 -0
  471. package/dist/services/turn-completion-events.d.ts.map +1 -0
  472. package/dist/services/turn-completion-events.js +179 -0
  473. package/dist/services/turn-completion-events.js.map +1 -0
  474. package/dist/services/vc-meeting-consumer-isolation.d.ts +21 -12
  475. package/dist/services/vc-meeting-consumer-isolation.d.ts.map +1 -1
  476. package/dist/services/vc-meeting-consumer-isolation.js +25 -19
  477. package/dist/services/vc-meeting-consumer-isolation.js.map +1 -1
  478. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +8 -2
  479. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -1
  480. package/dist/services/vc-meeting-consumer-profile-bootstrap.js +18 -10
  481. package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -1
  482. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  483. package/dist/setup/bot-config-editor.js +6 -0
  484. package/dist/setup/bot-config-editor.js.map +1 -1
  485. package/dist/setup/cli-availability.d.ts +2 -1
  486. package/dist/setup/cli-availability.d.ts.map +1 -1
  487. package/dist/setup/cli-availability.js +2 -1
  488. package/dist/setup/cli-availability.js.map +1 -1
  489. package/dist/setup/cli-selection.d.ts +8 -0
  490. package/dist/setup/cli-selection.d.ts.map +1 -1
  491. package/dist/setup/cli-selection.js +31 -0
  492. package/dist/setup/cli-selection.js.map +1 -1
  493. package/dist/setup/ensure-fonts.d.ts +5 -0
  494. package/dist/setup/ensure-fonts.d.ts.map +1 -1
  495. package/dist/setup/ensure-fonts.js +26 -1
  496. package/dist/setup/ensure-fonts.js.map +1 -1
  497. package/dist/setup/lark-scopes.json +3 -1
  498. package/dist/setup/open-platform-automation.d.ts +1 -1
  499. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  500. package/dist/setup/open-platform-automation.js +15 -3
  501. package/dist/setup/open-platform-automation.js.map +1 -1
  502. package/dist/skills/definitions.d.ts +1 -1
  503. package/dist/skills/definitions.d.ts.map +1 -1
  504. package/dist/skills/definitions.js +9 -2
  505. package/dist/skills/definitions.js.map +1 -1
  506. package/dist/types.d.ts +11 -4
  507. package/dist/types.d.ts.map +1 -1
  508. package/dist/utils/bot-routing.d.ts +1 -1
  509. package/dist/utils/bot-routing.d.ts.map +1 -1
  510. package/dist/utils/bot-routing.js.map +1 -1
  511. package/dist/utils/user-token.d.ts +38 -0
  512. package/dist/utils/user-token.d.ts.map +1 -1
  513. package/dist/utils/user-token.js +76 -1
  514. package/dist/utils/user-token.js.map +1 -1
  515. package/dist/utils/web-terminal-scroll.d.ts +27 -0
  516. package/dist/utils/web-terminal-scroll.d.ts.map +1 -0
  517. package/dist/utils/web-terminal-scroll.js +60 -0
  518. package/dist/utils/web-terminal-scroll.js.map +1 -0
  519. package/dist/vc-agent/polling-source.d.ts +70 -0
  520. package/dist/vc-agent/polling-source.d.ts.map +1 -1
  521. package/dist/vc-agent/polling-source.js +115 -0
  522. package/dist/vc-agent/polling-source.js.map +1 -1
  523. package/dist/worker.js +469 -86
  524. package/dist/worker.js.map +1 -1
  525. package/dist/workflows/definition.d.ts +22 -22
  526. package/dist/workflows/events/payloads.d.ts +8 -8
  527. package/dist/workflows/events/schema.d.ts +20 -20
  528. package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
  529. package/package.json +5 -1
  530. package/dist/dashboard-web/chunks/bot-defaults-page-NQJFJ45Z.js +0 -10
  531. package/dist/dashboard-web/chunks/chunk-KEEYQ3WF.js +0 -1
  532. package/dist/dashboard-web/chunks/connectors-page-HADHZXXZ.js +0 -1
  533. package/dist/dashboard-web/chunks/groups-page-5TYF46RS.js +0 -8
  534. package/dist/dashboard-web/chunks/monitoring-page-LBU7TTTW.js +0 -2
  535. package/dist/dashboard-web/chunks/office-page-DF6RRBMN.js +0 -1
  536. package/dist/dashboard-web/chunks/overview-page-ZB6QH2EX.js +0 -1
  537. package/dist/dashboard-web/chunks/roles-page-ZBZGHIIF.js +0 -1
  538. package/dist/dashboard-web/chunks/schedules-page-NQVQC3QY.js +0 -1
  539. package/dist/dashboard-web/chunks/settings-page-E7NN4NVQ.js +0 -2
  540. package/dist/dashboard-web/chunks/team-federation-page-VGWL53AE.js +0 -1
  541. 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,8 @@ function configuredBotAgentFields() {
1898
1910
  cliPathOverride: b.cliRuntime ? undefined : b.cliPathOverride,
1899
1911
  wrapperCli: b.wrapperCli,
1900
1912
  model: b.model,
1913
+ reasoningEffort: b.reasoningEffort,
1914
+ turnTimeoutMs: b.turnTimeoutMs,
1901
1915
  }]));
1902
1916
  }
1903
1917
  catch {
@@ -1914,6 +1928,8 @@ function withConfiguredCliId(bot, ids) {
1914
1928
  cliPathOverride: bot.cliPathOverride || fallback?.cliPathOverride,
1915
1929
  wrapperCli: bot.wrapperCli || fallback?.wrapperCli,
1916
1930
  model: bot.model || fallback?.model,
1931
+ reasoningEffort: bot.reasoningEffort || fallback?.reasoningEffort,
1932
+ turnTimeoutMs: bot.turnTimeoutMs ?? fallback?.turnTimeoutMs,
1917
1933
  };
1918
1934
  }
1919
1935
  function liveBots() {
@@ -2317,7 +2333,7 @@ function dashboardSkillCliIds() {
2317
2333
  const ids = new Set();
2318
2334
  // Always scan all known CLI skill dirs, not just configured bots — users may
2319
2335
  // 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'];
2336
+ 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
2337
  for (const cliId of allCliIds)
2322
2338
  ids.add(cliId);
2323
2339
  try {
@@ -2533,6 +2549,10 @@ const dashboardSummaryEndpoint = createDashboardSummaryEndpoint({
2533
2549
  logger.warn(`[dashboard-summary] live snapshot unavailable: ${error instanceof Error ? error.message : String(error)}`);
2534
2550
  },
2535
2551
  });
2552
+ let feedbackAnalyticsService;
2553
+ function analyticsService() {
2554
+ return feedbackAnalyticsService ??= new FeedbackAnalyticsService(config.session.dataDir);
2555
+ }
2536
2556
  const server = createServer(async (req, res) => {
2537
2557
  try {
2538
2558
  const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
@@ -2614,6 +2634,45 @@ const server = createServer(async (req, res) => {
2614
2634
  if (await daemonInternalApi.handle(req, res, url)) {
2615
2635
  return;
2616
2636
  }
2637
+ // OAuth 回调接收页(/oauth/callback)— 也在 cookie/token gate 之前:飞书
2638
+ // authorize 跳回来的浏览器请求不带 dashboard token(redirect_uri 固定),
2639
+ // 挡在门外用户就只能回到人肉贴 URL 的旧流程。安全面:URL 里只有一次性
2640
+ // code + 随机 state;处理方仍要求 state 命中某个 daemon 进程的 pending
2641
+ // 表(5 分钟过期、一次即焚)并用 app_secret 换 token——本页面自身不持有
2642
+ // 任何敏感能力,等价于把「用户手工回贴」自动化。
2643
+ if (req.method === 'GET' && url.pathname === '/oauth/callback') {
2644
+ const page = (title, body, ok) => {
2645
+ res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
2646
+ 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>`);
2647
+ };
2648
+ if (!url.searchParams.get('code') || !url.searchParams.get('state')) {
2649
+ page('回调参数缺失', '未收到授权码。请回到 Dashboard 重新发起授权。', false);
2650
+ return;
2651
+ }
2652
+ // state 只在生成链接的那个 daemon 进程内存里,逐个询问在线 daemon。
2653
+ let outcome = null;
2654
+ for (const d of registry.list()) {
2655
+ try {
2656
+ const r = await fetchDaemonIpc(d.ipcPort, '/api/oauth-callback', {
2657
+ method: 'POST',
2658
+ headers: { 'content-type': 'application/json' },
2659
+ body: JSON.stringify({ url: url.toString() }),
2660
+ });
2661
+ const j = await r.json().catch(() => null);
2662
+ if (j?.matched) {
2663
+ outcome = { ok: !!j.ok, message: String(j.message ?? '') };
2664
+ break;
2665
+ }
2666
+ }
2667
+ catch { /* daemon offline mid-iteration — try the next */ }
2668
+ }
2669
+ if (!outcome) {
2670
+ page('授权未完成', '没有找到等待中的授权请求(可能已超时,链接有效期 5 分钟)。请回到 Dashboard 重新点击授权。', false);
2671
+ return;
2672
+ }
2673
+ page(outcome.ok ? '授权完成' : '授权失败', outcome.ok ? '已完成授权,本页可以关闭。回到 Dashboard 即可看到状态更新。' : outcome.message, outcome.ok);
2674
+ return;
2675
+ }
2617
2676
  // CLI rotate (HMAC + loopback only) — for `botmux dashboard rotate`.
2618
2677
  // Publish the new token only after a durable write succeeds.
2619
2678
  if (req.method === 'POST' && url.pathname === '/__cli/rotate') {
@@ -2626,7 +2685,7 @@ const server = createServer(async (req, res) => {
2626
2685
  }
2627
2686
  catch (e) {
2628
2687
  logger.warn(`[dashboard] Failed to persist token to ${TOKEN_PATH}: ${e.message}`);
2629
- return jsonRes(res, 500, { error: 'token_persist_failed' });
2688
+ return jsonRes(res, 500, describeDashboardTokenError('token_persist_failed', e, TOKEN_PATH));
2630
2689
  }
2631
2690
  }
2632
2691
  // CLI get-or-create URL (HMAC + loopback only). Existing links survive
@@ -2641,7 +2700,7 @@ const server = createServer(async (req, res) => {
2641
2700
  }
2642
2701
  catch (e) {
2643
2702
  logger.warn(`[dashboard] Failed to ensure token at ${TOKEN_PATH}: ${e.message}`);
2644
- return jsonRes(res, 500, { error: 'token_persist_failed' });
2703
+ return jsonRes(res, 500, describeDashboardTokenError('token_persist_failed', e, TOKEN_PATH));
2645
2704
  }
2646
2705
  }
2647
2706
  // CLI read current URL (HMAC + loopback only) — for start/restart hints and
@@ -2656,7 +2715,7 @@ const server = createServer(async (req, res) => {
2656
2715
  }
2657
2716
  catch (e) {
2658
2717
  logger.warn(`[dashboard] Failed to read token from ${TOKEN_PATH}: ${e.message}`);
2659
- return jsonRes(res, 500, { error: 'token_unavailable' });
2718
+ return jsonRes(res, 500, describeDashboardTokenError('token_unavailable', e, TOKEN_PATH));
2660
2719
  }
2661
2720
  if (!token)
2662
2721
  return jsonRes(res, 404, { error: 'no_active_token' });
@@ -2723,6 +2782,10 @@ const server = createServer(async (req, res) => {
2723
2782
  message: 'v2 workflow dashboard APIs are retired; use /api/v3/runs for v3 run visibility',
2724
2783
  });
2725
2784
  }
2785
+ if (url.pathname.startsWith('/api/feedback/analytics/')) {
2786
+ await handleFeedbackAnalyticsApi(req, res, url, { service: analyticsService() });
2787
+ return;
2788
+ }
2726
2789
  if (req.method === 'GET' && url.pathname === '/__dev/reload') {
2727
2790
  if (!dashboardDevReloadEnabled())
2728
2791
  return jsonRes(res, 404, { error: 'dev_reload_disabled' });
@@ -3323,6 +3386,26 @@ const server = createServer(async (req, res) => {
3323
3386
  return jsonRes(res, 401, { ok: false, error: 'unauthorized' });
3324
3387
  if (updateInFlight)
3325
3388
  return jsonRes(res, 409, { ok: false, error: 'update_in_flight' });
3389
+ // The real restart runs in a detached `botmux restart` child, whose
3390
+ // shutdown-capability throw would only reach the maintenance-restart log
3391
+ // — the UI would then poll a reconnect that never happens and mislabel it
3392
+ // as "restart is slow". Detect that fail-closed boundary synchronously so
3393
+ // we can return a precise, actionable error instead of firing a restart
3394
+ // that is guaranteed to die silently. A read failure is non-authoritative
3395
+ // and falls through to the existing behavior (never fabricate a block).
3396
+ try {
3397
+ const preflight = evaluateRestartShutdownPreflight();
3398
+ if (preflight.bootstrapRequired) {
3399
+ return jsonRes(res, 409, {
3400
+ ok: false,
3401
+ error: 'bootstrap_shutdown_protocol_required',
3402
+ unsafeDaemons: preflight.unsafeDaemonNames,
3403
+ });
3404
+ }
3405
+ }
3406
+ catch (error) {
3407
+ logger.warn(`[dashboard] restart shutdown-capability preflight unavailable: ${error instanceof Error ? error.message : error}`);
3408
+ }
3326
3409
  let body = {};
3327
3410
  try {
3328
3411
  const parsed = await readJsonBody(req);
@@ -3403,7 +3486,14 @@ const server = createServer(async (req, res) => {
3403
3486
  if (req.method === 'GET' && url.pathname === '/api/skills') {
3404
3487
  return jsonRes(res, 200, dashboardSkillsPayload());
3405
3488
  }
3406
- if (req.method === 'DELETE' && url.pathname === '/api/skills') {
3489
+ // Batch skill removal. POST /api/skills/remove is the canonical route the
3490
+ // dashboard UI calls: the payload (names[], force) must travel in the body,
3491
+ // and DELETE bodies are dropped by the platform dashboard proxy (it assumes
3492
+ // DELETE carries no body, forwards content-length but never pipes the bytes,
3493
+ // so readJsonBody hangs until the outer gateway returns 504). DELETE
3494
+ // /api/skills stays as an alias for direct/scripted callers.
3495
+ if ((req.method === 'DELETE' && url.pathname === '/api/skills')
3496
+ || (req.method === 'POST' && url.pathname === '/api/skills/remove')) {
3407
3497
  let parsed;
3408
3498
  try {
3409
3499
  parsed = await readJsonBody(req);
@@ -3970,7 +4060,25 @@ const server = createServer(async (req, res) => {
3970
4060
  const owner = aggregator.ownerOf(sid);
3971
4061
  if (!owner)
3972
4062
  return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
3973
- const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/${op}`, { method: 'POST' });
4063
+ // Defensive client-side deadline: the daemon side of every op here replies
4064
+ // promptly (close resolves its fence on the worker's flushed ACK; restart/
4065
+ // resume/start return after a fire-and-forget IPC). Close gets a separate
4066
+ // 60s budget because Riff's 23s remote-cancel prepare and 29s worker-kill
4067
+ // backstop are serialized; all other actions stay bounded at 15s.
4068
+ let upstream;
4069
+ try {
4070
+ upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/${op}`, {
4071
+ method: 'POST',
4072
+ signal: AbortSignal.timeout(dashboardSessionActionTimeoutMs(op)),
4073
+ });
4074
+ }
4075
+ catch (err) {
4076
+ const timedOut = err?.name === 'TimeoutError' || err?.name === 'AbortError';
4077
+ return jsonRes(res, timedOut ? 504 : 502, {
4078
+ ok: false,
4079
+ error: timedOut ? 'daemon_timeout' : (err?.message ?? String(err)),
4080
+ });
4081
+ }
3974
4082
  res.writeHead(upstream.status, { 'content-type': 'application/json' });
3975
4083
  res.end(await upstream.text());
3976
4084
  return;
@@ -4635,6 +4743,8 @@ const server = createServer(async (req, res) => {
4635
4743
  : d.cliPathOverride,
4636
4744
  wrapperCli: j.wrapperCli || d.wrapperCli,
4637
4745
  model: j.model || d.model,
4746
+ reasoningEffort: j.reasoningEffort || d.reasoningEffort,
4747
+ turnTimeoutMs: typeof j.turnTimeoutMs === 'number' ? j.turnTimeoutMs : d.turnTimeoutMs,
4638
4748
  }, j);
4639
4749
  }
4640
4750
  catch (e) {
@@ -4804,6 +4914,35 @@ const server = createServer(async (req, res) => {
4804
4914
  res.end(await upstream.text());
4805
4915
  return;
4806
4916
  }
4917
+ let mBotFeedback;
4918
+ if (req.method === 'PUT' && (mBotFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/feedback$/))) {
4919
+ const appId = decodeURIComponent(mBotFeedback[1]);
4920
+ const chunks = [];
4921
+ for await (const c of req)
4922
+ chunks.push(c);
4923
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
4924
+ const upstream = await proxyToDaemon(appId, `/api/bot-feedback`, { method: 'PUT', headers: { 'content-type': 'application/json' }, body: raw });
4925
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4926
+ res.end(await upstream.text());
4927
+ return;
4928
+ }
4929
+ const mChatFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/chats\/([^/]+)\/feedback$/);
4930
+ if (req.method === 'PUT' && mChatFeedback) {
4931
+ const chunks = [];
4932
+ for await (const c of req)
4933
+ chunks.push(c);
4934
+ 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') || '{}' });
4935
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4936
+ res.end(await upstream.text());
4937
+ return;
4938
+ }
4939
+ const mEffectiveFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/feedback\/effective$/);
4940
+ if (req.method === 'GET' && mEffectiveFeedback) {
4941
+ const upstream = await proxyToDaemon(decodeURIComponent(mEffectiveFeedback[1]), `/api/feedback-effective${url.search}`, { method: 'GET' });
4942
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4943
+ res.end(await upstream.text());
4944
+ return;
4945
+ }
4807
4946
  // PUT /api/bots/:appId/env — proxy to that bot's daemon. Body
4808
4947
  // `{ env: string }` (raw JSON text; '' = clear).
4809
4948
  let mBotEnv;
@@ -5008,9 +5147,37 @@ const server = createServer(async (req, res) => {
5008
5147
  res.end(await upstream.text());
5009
5148
  return;
5010
5149
  }
5150
+ // 会话群标签授权(Dashboard 一站式):GET status / POST auth-link,
5151
+ // 均代理到对应 bot 的 daemon(state 必须驻留在生成链接的进程内)。
5152
+ let mBotTagAuth;
5153
+ if (mBotTagAuth = url.pathname.match(/^\/api\/bots\/([^/]+)\/session-group-tag-(status|auth|config)$/)) {
5154
+ const appId = decodeURIComponent(mBotTagAuth[1]);
5155
+ const kind = mBotTagAuth[2];
5156
+ const methodOk = (kind === 'status' && req.method === 'GET')
5157
+ || (kind === 'auth' && req.method === 'POST')
5158
+ || (kind === 'config' && req.method === 'PUT');
5159
+ if (methodOk) {
5160
+ let body;
5161
+ if (req.method !== 'GET') {
5162
+ const chunks = [];
5163
+ for await (const c of req)
5164
+ chunks.push(c);
5165
+ body = Buffer.concat(chunks).toString('utf8') || '{}';
5166
+ }
5167
+ const upstream = await proxyToDaemon(appId, `/api/session-group-tag-${kind}`, {
5168
+ method: req.method,
5169
+ headers: { 'content-type': 'application/json' },
5170
+ ...(body !== undefined ? { body } : {}),
5171
+ });
5172
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
5173
+ res.end(await upstream.text());
5174
+ return;
5175
+ }
5176
+ }
5011
5177
  // 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).
5178
+ // `{ p2pMode: 'chat' | 'thread' | 'group' }` ('thread' = per-message DM
5179
+ // session; 'group' = per-message dedicated session group; anything else
5180
+ // clears back to the flat continuous chat default).
5014
5181
  let mBotP2pMode;
5015
5182
  if (req.method === 'PUT' && (mBotP2pMode = url.pathname.match(/^\/api\/bots\/([^/]+)\/p2p-mode$/))) {
5016
5183
  const appId = decodeURIComponent(mBotP2pMode[1]);
@@ -5027,6 +5194,25 @@ const server = createServer(async (req, res) => {
5027
5194
  res.end(await upstream.text());
5028
5195
  return;
5029
5196
  }
5197
+ // PUT /api/bots/:appId/envelope-injection — proxy to that bot's daemon.
5198
+ // Body `{ envelopeInjection: 'auto'|'off'|'' }` (''/other clears back to
5199
+ // the inline default). #794: hook 注入 per-turn 上下文的 per-bot 开关。
5200
+ let mBotEnvelopeInjection;
5201
+ if (req.method === 'PUT' && (mBotEnvelopeInjection = url.pathname.match(/^\/api\/bots\/([^/]+)\/envelope-injection$/))) {
5202
+ const appId = decodeURIComponent(mBotEnvelopeInjection[1]);
5203
+ const chunks = [];
5204
+ for await (const c of req)
5205
+ chunks.push(c);
5206
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
5207
+ const upstream = await proxyToDaemon(appId, `/api/bot-envelope-injection`, {
5208
+ method: 'PUT',
5209
+ headers: { 'content-type': 'application/json' },
5210
+ body: raw,
5211
+ });
5212
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
5213
+ res.end(await upstream.text());
5214
+ return;
5215
+ }
5030
5216
  // PUT /api/bots/:appId/skill-injection — proxy to that bot's daemon. Body
5031
5217
  // `{ skillInjection: 'global'|'prompt'|'off'|'' }` (''/other clears back to
5032
5218
  // the machine default). Governs how botmux built-in skills reach global-
@@ -5049,7 +5235,8 @@ const server = createServer(async (req, res) => {
5049
5235
  }
5050
5236
  // PUT /api/bots/:appId/grant-prefs — proxy to that bot's daemon. Body carries
5051
5237
  // any subset of `{ restrictGrantCommands?: boolean, autoGrantRequestCards?: boolean,
5052
- // messageQuotaDefaultLimit?: number|null, grantDefaultDurationMs?: number|null }`.
5238
+ // p2pOpen?: boolean, messageQuotaDefaultLimit?: number|null,
5239
+ // grantDefaultDurationMs?: number|null }`.
5053
5240
  let mBotGrantPrefs;
5054
5241
  if (req.method === 'PUT' && (mBotGrantPrefs = url.pathname.match(/^\/api\/bots\/([^/]+)\/grant-prefs$/))) {
5055
5242
  const appId = decodeURIComponent(mBotGrantPrefs[1]);
@@ -5642,6 +5829,9 @@ listenWithProbe({
5642
5829
  logger.warn(`[dashboard] Failed to persist port to ${PORT_PATH}: ${e.message}`);
5643
5830
  }
5644
5831
  logger.info(`[dashboard] listening on ${config.dashboard.host}:${port}`);
5832
+ // Reclaim any `.trash-*` skill trees left by an interrupted background unlink
5833
+ // (crash/restart mid-delete). Best-effort and fire-and-forget.
5834
+ sweepStoreTrash();
5645
5835
  startPlatformTunnelIfBound();
5646
5836
  }).catch((err) => {
5647
5837
  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 +5941,14 @@ function startPlatformTunnelIfBound() {
5751
5941
  if (!binding)
5752
5942
  return;
5753
5943
  const existingToken = currentDashboardToken();
5754
- loadOrCreatePersistedToken(TOKEN_PATH);
5944
+ // An already-materialized dashboard token is sufficient to start the
5945
+ // tunnel. Avoid re-validating its path via secureHostFilePath(): on Linux
5946
+ // the request-time read is descriptor-pinned, while deployments whose HOME
5947
+ // is a root-owned symlink (common on managed dev hosts) can make the
5948
+ // path-returning helper fail even though the 0600 file is safely readable.
5949
+ // Only the first token creation needs the path+lock helper.
5755
5950
  if (!existingToken) {
5951
+ loadOrCreatePersistedToken(TOKEN_PATH);
5756
5952
  logger.info('[platform-tunnel] 已初始化 dashboard token');
5757
5953
  }
5758
5954
  const version = readBotmuxVersion();
@@ -5910,6 +6106,7 @@ function shutdown() {
5910
6106
  resourceMonitor.stop();
5911
6107
  platformTunnel?.stop();
5912
6108
  debugTerminalManager.shutdown();
6109
+ feedbackAnalyticsService?.close();
5913
6110
  if (oauthCallbackServer.listening)
5914
6111
  oauthCallbackServer.close();
5915
6112
  server.close(() => process.exit(gracefulProcessExitCode()));