botmux 3.7.1 → 3.8.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 (622) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/capabilities.d.ts +17 -0
  3. package/dist/adapters/backend/capabilities.d.ts.map +1 -0
  4. package/dist/adapters/backend/capabilities.js +22 -0
  5. package/dist/adapters/backend/capabilities.js.map +1 -0
  6. package/dist/adapters/backend/critical-control-key.d.ts +19 -0
  7. package/dist/adapters/backend/critical-control-key.d.ts.map +1 -0
  8. package/dist/adapters/backend/critical-control-key.js +34 -0
  9. package/dist/adapters/backend/critical-control-key.js.map +1 -0
  10. package/dist/adapters/backend/herdr-backend.d.ts +9 -0
  11. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/herdr-backend.js +23 -4
  13. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  14. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  15. package/dist/adapters/backend/riff-backend.js +3 -2
  16. package/dist/adapters/backend/riff-backend.js.map +1 -1
  17. package/dist/adapters/backend/session-backend-selector.d.ts +61 -6
  18. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
  19. package/dist/adapters/backend/session-backend-selector.js +173 -9
  20. package/dist/adapters/backend/session-backend-selector.js.map +1 -1
  21. package/dist/adapters/backend/tmux-backend.d.ts +10 -3
  22. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  23. package/dist/adapters/backend/tmux-backend.js +25 -8
  24. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  25. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  26. package/dist/adapters/backend/tmux-pipe-backend.js +3 -2
  27. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  28. package/dist/adapters/backend/types.d.ts +45 -4
  29. package/dist/adapters/backend/types.d.ts.map +1 -1
  30. package/dist/adapters/backend/types.js +11 -0
  31. package/dist/adapters/backend/types.js.map +1 -1
  32. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  33. package/dist/adapters/backend/zellij-backend.js +3 -2
  34. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  35. package/dist/adapters/backend/zmx-backend.d.ts +286 -0
  36. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -0
  37. package/dist/adapters/backend/zmx-backend.js +2396 -0
  38. package/dist/adapters/backend/zmx-backend.js.map +1 -0
  39. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  40. package/dist/adapters/cli/claude-code.js +3 -0
  41. package/dist/adapters/cli/claude-code.js.map +1 -1
  42. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  43. package/dist/adapters/cli/codex-app.js +5 -1
  44. package/dist/adapters/cli/codex-app.js.map +1 -1
  45. package/dist/adapters/cli/codex.d.ts.map +1 -1
  46. package/dist/adapters/cli/codex.js +26 -1
  47. package/dist/adapters/cli/codex.js.map +1 -1
  48. package/dist/adapters/cli/fs-policy.d.ts +79 -1
  49. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  50. package/dist/adapters/cli/fs-policy.js +290 -13
  51. package/dist/adapters/cli/fs-policy.js.map +1 -1
  52. package/dist/adapters/cli/grok.d.ts.map +1 -1
  53. package/dist/adapters/cli/grok.js +4 -1
  54. package/dist/adapters/cli/grok.js.map +1 -1
  55. package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
  56. package/dist/adapters/cli/oh-my-pi.js +5 -3
  57. package/dist/adapters/cli/oh-my-pi.js.map +1 -1
  58. package/dist/adapters/cli/shared-hints.d.ts +7 -4
  59. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  60. package/dist/adapters/cli/shared-hints.js +52 -35
  61. package/dist/adapters/cli/shared-hints.js.map +1 -1
  62. package/dist/adapters/cli/strict-input-handle.d.ts +13 -0
  63. package/dist/adapters/cli/strict-input-handle.d.ts.map +1 -0
  64. package/dist/adapters/cli/strict-input-handle.js +39 -0
  65. package/dist/adapters/cli/strict-input-handle.js.map +1 -0
  66. package/dist/adapters/cli/traex.d.ts.map +1 -1
  67. package/dist/adapters/cli/traex.js +6 -4
  68. package/dist/adapters/cli/traex.js.map +1 -1
  69. package/dist/adapters/cli/types.d.ts +16 -0
  70. package/dist/adapters/cli/types.d.ts.map +1 -1
  71. package/dist/bot-registry.d.ts +137 -8
  72. package/dist/bot-registry.d.ts.map +1 -1
  73. package/dist/bot-registry.js +298 -12
  74. package/dist/bot-registry.js.map +1 -1
  75. package/dist/cli/session-list-liveness.d.ts +1 -1
  76. package/dist/cli/session-list-liveness.js +1 -1
  77. package/dist/cli/zmx-managed-attach.d.ts +41 -0
  78. package/dist/cli/zmx-managed-attach.d.ts.map +1 -0
  79. package/dist/cli/zmx-managed-attach.js +72 -0
  80. package/dist/cli/zmx-managed-attach.js.map +1 -0
  81. package/dist/cli.d.ts.map +1 -1
  82. package/dist/cli.js +780 -131
  83. package/dist/cli.js.map +1 -1
  84. package/dist/codex-app-runner.js +90 -2
  85. package/dist/codex-app-runner.js.map +1 -1
  86. package/dist/codex-rpc-engine.d.ts.map +1 -1
  87. package/dist/codex-rpc-engine.js +22 -6
  88. package/dist/codex-rpc-engine.js.map +1 -1
  89. package/dist/config.d.ts +5 -0
  90. package/dist/config.d.ts.map +1 -1
  91. package/dist/config.js +29 -1
  92. package/dist/config.js.map +1 -1
  93. package/dist/core/ask-broker.d.ts +22 -1
  94. package/dist/core/ask-broker.d.ts.map +1 -1
  95. package/dist/core/ask-broker.js +12 -5
  96. package/dist/core/ask-broker.js.map +1 -1
  97. package/dist/core/botmux-wrapper.d.ts +18 -0
  98. package/dist/core/botmux-wrapper.d.ts.map +1 -1
  99. package/dist/core/botmux-wrapper.js +25 -1
  100. package/dist/core/botmux-wrapper.js.map +1 -1
  101. package/dist/core/chat-rename.d.ts +27 -0
  102. package/dist/core/chat-rename.d.ts.map +1 -0
  103. package/dist/core/chat-rename.js +53 -0
  104. package/dist/core/chat-rename.js.map +1 -0
  105. package/dist/core/command-handler.d.ts.map +1 -1
  106. package/dist/core/command-handler.js +160 -12
  107. package/dist/core/command-handler.js.map +1 -1
  108. package/dist/core/cost-calculator.d.ts +25 -1
  109. package/dist/core/cost-calculator.d.ts.map +1 -1
  110. package/dist/core/cost-calculator.js +102 -4
  111. package/dist/core/cost-calculator.js.map +1 -1
  112. package/dist/core/dashboard-ipc-server.d.ts +16 -2
  113. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  114. package/dist/core/dashboard-ipc-server.js +611 -62
  115. package/dist/core/dashboard-ipc-server.js.map +1 -1
  116. package/dist/core/dashboard-rows.d.ts +22 -1
  117. package/dist/core/dashboard-rows.d.ts.map +1 -1
  118. package/dist/core/dashboard-rows.js +61 -0
  119. package/dist/core/dashboard-rows.js.map +1 -1
  120. package/dist/core/dashboard-url.d.ts +6 -0
  121. package/dist/core/dashboard-url.d.ts.map +1 -1
  122. package/dist/core/dashboard-url.js +11 -1
  123. package/dist/core/dashboard-url.js.map +1 -1
  124. package/dist/core/device-isolation-daemon.d.ts +28 -6
  125. package/dist/core/device-isolation-daemon.d.ts.map +1 -1
  126. package/dist/core/device-isolation-daemon.js +96 -13
  127. package/dist/core/device-isolation-daemon.js.map +1 -1
  128. package/dist/core/host-overload-alert.d.ts +75 -0
  129. package/dist/core/host-overload-alert.d.ts.map +1 -1
  130. package/dist/core/host-overload-alert.js +103 -0
  131. package/dist/core/host-overload-alert.js.map +1 -1
  132. package/dist/core/idle-worker-sweeper.js +1 -1
  133. package/dist/core/idle-worker-sweeper.js.map +1 -1
  134. package/dist/core/inflight-input-tracker.d.ts +3 -0
  135. package/dist/core/inflight-input-tracker.d.ts.map +1 -1
  136. package/dist/core/inflight-input-tracker.js +9 -0
  137. package/dist/core/inflight-input-tracker.js.map +1 -1
  138. package/dist/core/passthrough-commands.d.ts.map +1 -1
  139. package/dist/core/passthrough-commands.js +10 -0
  140. package/dist/core/passthrough-commands.js.map +1 -1
  141. package/dist/core/persistent-backend.d.ts +32 -4
  142. package/dist/core/persistent-backend.d.ts.map +1 -1
  143. package/dist/core/persistent-backend.js +75 -6
  144. package/dist/core/persistent-backend.js.map +1 -1
  145. package/dist/core/plugins/mcp/gateway.js +2 -2
  146. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  147. package/dist/core/plugins/runtime.d.ts +3 -0
  148. package/dist/core/plugins/runtime.d.ts.map +1 -1
  149. package/dist/core/plugins/runtime.js.map +1 -1
  150. package/dist/core/plugins/service-manager.d.ts +4 -1
  151. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  152. package/dist/core/plugins/service-manager.js +11 -6
  153. package/dist/core/plugins/service-manager.js.map +1 -1
  154. package/dist/core/role-library.d.ts +48 -1
  155. package/dist/core/role-library.d.ts.map +1 -1
  156. package/dist/core/role-library.js +111 -3
  157. package/dist/core/role-library.js.map +1 -1
  158. package/dist/core/role-resolver.d.ts +14 -2
  159. package/dist/core/role-resolver.d.ts.map +1 -1
  160. package/dist/core/role-resolver.js +47 -4
  161. package/dist/core/role-resolver.js.map +1 -1
  162. package/dist/core/session-activity.d.ts +14 -0
  163. package/dist/core/session-activity.d.ts.map +1 -1
  164. package/dist/core/session-activity.js +46 -1
  165. package/dist/core/session-activity.js.map +1 -1
  166. package/dist/core/session-board.d.ts +5 -2
  167. package/dist/core/session-board.d.ts.map +1 -1
  168. package/dist/core/session-board.js +5 -2
  169. package/dist/core/session-board.js.map +1 -1
  170. package/dist/core/session-liveness.d.ts +6 -5
  171. package/dist/core/session-liveness.d.ts.map +1 -1
  172. package/dist/core/session-liveness.js +34 -13
  173. package/dist/core/session-liveness.js.map +1 -1
  174. package/dist/core/session-manager.d.ts +3 -2
  175. package/dist/core/session-manager.d.ts.map +1 -1
  176. package/dist/core/session-manager.js +397 -103
  177. package/dist/core/session-manager.js.map +1 -1
  178. package/dist/core/session-marker.d.ts +11 -2
  179. package/dist/core/session-marker.d.ts.map +1 -1
  180. package/dist/core/session-marker.js +50 -11
  181. package/dist/core/session-marker.js.map +1 -1
  182. package/dist/core/session-message-preview.d.ts +20 -0
  183. package/dist/core/session-message-preview.d.ts.map +1 -0
  184. package/dist/core/session-message-preview.js +188 -0
  185. package/dist/core/session-message-preview.js.map +1 -0
  186. package/dist/core/session-title.d.ts +5 -1
  187. package/dist/core/session-title.d.ts.map +1 -1
  188. package/dist/core/session-title.js +20 -3
  189. package/dist/core/session-title.js.map +1 -1
  190. package/dist/core/startup-commands.d.ts +1 -1
  191. package/dist/core/startup-commands.js +1 -1
  192. package/dist/core/terminal-url.d.ts.map +1 -1
  193. package/dist/core/terminal-url.js +3 -2
  194. package/dist/core/terminal-url.js.map +1 -1
  195. package/dist/core/trigger-session.d.ts.map +1 -1
  196. package/dist/core/trigger-session.js +75 -12
  197. package/dist/core/trigger-session.js.map +1 -1
  198. package/dist/core/types.d.ts +35 -0
  199. package/dist/core/types.d.ts.map +1 -1
  200. package/dist/core/types.js +23 -0
  201. package/dist/core/types.js.map +1 -1
  202. package/dist/core/worker-ipc.d.ts +11 -0
  203. package/dist/core/worker-ipc.d.ts.map +1 -0
  204. package/dist/core/worker-ipc.js +26 -0
  205. package/dist/core/worker-ipc.js.map +1 -0
  206. package/dist/core/worker-pool.d.ts +179 -29
  207. package/dist/core/worker-pool.d.ts.map +1 -1
  208. package/dist/core/worker-pool.js +2118 -331
  209. package/dist/core/worker-pool.js.map +1 -1
  210. package/dist/daemon.d.ts +132 -3
  211. package/dist/daemon.d.ts.map +1 -1
  212. package/dist/daemon.js +1327 -449
  213. package/dist/daemon.js.map +1 -1
  214. package/dist/dashboard/auth.d.ts +2 -0
  215. package/dist/dashboard/auth.d.ts.map +1 -1
  216. package/dist/dashboard/auth.js +9 -0
  217. package/dist/dashboard/auth.js.map +1 -1
  218. package/dist/dashboard/bot-payload.d.ts +4 -0
  219. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  220. package/dist/dashboard/bot-payload.js +5 -0
  221. package/dist/dashboard/bot-payload.js.map +1 -1
  222. package/dist/dashboard/federation-api.d.ts.map +1 -1
  223. package/dist/dashboard/federation-api.js +4 -0
  224. package/dist/dashboard/federation-api.js.map +1 -1
  225. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  226. package/dist/dashboard/federation-spoke-api.js +32 -5
  227. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  228. package/dist/dashboard/public-redact.d.ts +8 -2
  229. package/dist/dashboard/public-redact.d.ts.map +1 -1
  230. package/dist/dashboard/public-redact.js +34 -7
  231. package/dist/dashboard/public-redact.js.map +1 -1
  232. package/dist/dashboard/session-card-model.d.ts.map +1 -1
  233. package/dist/dashboard/session-card-model.js +10 -2
  234. package/dist/dashboard/session-card-model.js.map +1 -1
  235. package/dist/dashboard/settings-write-applier.d.ts +35 -1
  236. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  237. package/dist/dashboard/settings-write-applier.js +88 -1
  238. package/dist/dashboard/settings-write-applier.js.map +1 -1
  239. package/dist/dashboard/web/app.d.ts.map +1 -1
  240. package/dist/dashboard/web/app.js +0 -1
  241. package/dist/dashboard/web/app.js.map +1 -1
  242. package/dist/dashboard/web/bot-defaults-page.d.ts +15 -0
  243. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  244. package/dist/dashboard/web/bot-defaults-page.js +212 -58
  245. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  246. package/dist/dashboard/web/bot-defaults.d.ts +3 -0
  247. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  248. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  249. package/dist/dashboard/web/bot-onboarding.d.ts +2 -1
  250. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  251. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  252. package/dist/dashboard/web/clipboard.d.ts +2 -0
  253. package/dist/dashboard/web/clipboard.d.ts.map +1 -0
  254. package/dist/dashboard/web/clipboard.js +42 -0
  255. package/dist/dashboard/web/clipboard.js.map +1 -0
  256. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  257. package/dist/dashboard/web/connectors-page.js +12 -8
  258. package/dist/dashboard/web/connectors-page.js.map +1 -1
  259. package/dist/dashboard/web/dashboard-components.d.ts +17 -16
  260. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
  261. package/dist/dashboard/web/dashboard-components.js.map +1 -1
  262. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  263. package/dist/dashboard/web/groups-page.js +7 -3
  264. package/dist/dashboard/web/groups-page.js.map +1 -1
  265. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  266. package/dist/dashboard/web/i18n.js +205 -12
  267. package/dist/dashboard/web/i18n.js.map +1 -1
  268. package/dist/dashboard/web/icon-tooltip.d.ts.map +1 -1
  269. package/dist/dashboard/web/icon-tooltip.js +16 -1
  270. package/dist/dashboard/web/icon-tooltip.js.map +1 -1
  271. package/dist/dashboard/web/listener-filters.d.ts +23 -0
  272. package/dist/dashboard/web/listener-filters.d.ts.map +1 -0
  273. package/dist/dashboard/web/listener-filters.js +36 -0
  274. package/dist/dashboard/web/listener-filters.js.map +1 -0
  275. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  276. package/dist/dashboard/web/overview-page.js.map +1 -1
  277. package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
  278. package/dist/dashboard/web/plugin-page.js.map +1 -1
  279. package/dist/dashboard/web/preview-markdown.d.ts +5 -0
  280. package/dist/dashboard/web/preview-markdown.d.ts.map +1 -0
  281. package/dist/dashboard/web/preview-markdown.js +52 -0
  282. package/dist/dashboard/web/preview-markdown.js.map +1 -0
  283. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  284. package/dist/dashboard/web/roles-page.js +535 -10
  285. package/dist/dashboard/web/roles-page.js.map +1 -1
  286. package/dist/dashboard/web/roles.d.ts +77 -0
  287. package/dist/dashboard/web/roles.d.ts.map +1 -1
  288. package/dist/dashboard/web/roles.js +98 -0
  289. package/dist/dashboard/web/roles.js.map +1 -1
  290. package/dist/dashboard/web/session-terminal.d.ts.map +1 -1
  291. package/dist/dashboard/web/session-terminal.js +6 -4
  292. package/dist/dashboard/web/session-terminal.js.map +1 -1
  293. package/dist/dashboard/web/sessions-kanban.d.ts +4 -1
  294. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  295. package/dist/dashboard/web/sessions-kanban.js +1 -1
  296. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  297. package/dist/dashboard/web/sessions-page.d.ts +3 -2
  298. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  299. package/dist/dashboard/web/sessions-page.js +163 -28
  300. package/dist/dashboard/web/sessions-page.js.map +1 -1
  301. package/dist/dashboard/web/sessions.d.ts +25 -0
  302. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  303. package/dist/dashboard/web/sessions.js +58 -7
  304. package/dist/dashboard/web/sessions.js.map +1 -1
  305. package/dist/dashboard/web/settings-page.d.ts +28 -3
  306. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  307. package/dist/dashboard/web/settings-page.js +61 -1
  308. package/dist/dashboard/web/settings-page.js.map +1 -1
  309. package/dist/dashboard/web/skills-page.d.ts +6 -5
  310. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  311. package/dist/dashboard/web/skills-page.js +2 -0
  312. package/dist/dashboard/web/skills-page.js.map +1 -1
  313. package/dist/dashboard/web/v3-components.d.ts +3 -2
  314. package/dist/dashboard/web/v3-components.d.ts.map +1 -1
  315. package/dist/dashboard/web/v3-components.js.map +1 -1
  316. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +12 -2
  317. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  318. package/dist/dashboard/web/vc-consumer-profiles-section.js +0 -9
  319. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  320. package/dist/dashboard/web/webhook-logs-page.d.ts +2 -1
  321. package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -1
  322. package/dist/dashboard/web/webhook-logs-page.js +4 -1
  323. package/dist/dashboard/web/webhook-logs-page.js.map +1 -1
  324. package/dist/dashboard-web/app.js +1 -1
  325. package/dist/dashboard-web/chunks/bot-defaults-page-FAPIMQV3.js +10 -0
  326. package/dist/dashboard-web/chunks/{chunk-QFMH6ITB.js → chunk-5CJMHTT4.js} +1 -1
  327. package/dist/dashboard-web/chunks/{chunk-KQB42ML5.js → chunk-DLZK52JU.js} +14 -12
  328. package/dist/dashboard-web/chunks/chunk-FDZ7WOBW.js +16 -0
  329. package/dist/dashboard-web/chunks/{chunk-3QAUJXAS.js → chunk-GTAJV5YC.js} +1 -1
  330. package/dist/dashboard-web/chunks/{chunk-FNPGOZMX.js → chunk-IHNG6KE6.js} +1 -1
  331. package/dist/dashboard-web/chunks/{chunk-FLGXZJTD.js → chunk-VA6QWSGQ.js} +1 -1
  332. package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
  333. package/dist/dashboard-web/chunks/chunk-ZJVTGU5X.js +1 -0
  334. package/dist/dashboard-web/chunks/connectors-page-LKWRT3GS.js +1 -0
  335. package/dist/dashboard-web/chunks/groups-page-V6654ICQ.js +8 -0
  336. package/dist/dashboard-web/chunks/insights-page-237RMFQ5.js +7 -0
  337. package/dist/dashboard-web/chunks/{monitor-room-7IVIS75W.js → monitor-room-OO5Y4FRQ.js} +1 -1
  338. package/dist/dashboard-web/chunks/{monitoring-page-5SSJRQZF.js → monitoring-page-OUEITM5P.js} +1 -1
  339. package/dist/dashboard-web/chunks/{office-page-EOND3L5D.js → office-page-4KNAHQ4Q.js} +1 -1
  340. package/dist/dashboard-web/chunks/{overview-page-NISBVBBJ.js → overview-page-QDP4YK2S.js} +1 -1
  341. package/dist/dashboard-web/chunks/{plugin-page-JXC5F5YV.js → plugin-page-VEGTCEAS.js} +1 -1
  342. package/dist/dashboard-web/chunks/roles-page-PGXNZZNP.js +1 -0
  343. package/dist/dashboard-web/chunks/{schedules-page-AVOOKLUH.js → schedules-page-BJNC5TID.js} +1 -1
  344. package/dist/dashboard-web/chunks/sessions-page-M2ZYYCMO.js +6 -0
  345. package/dist/dashboard-web/chunks/settings-page-IJFZKUUW.js +2 -0
  346. package/dist/dashboard-web/chunks/{skills-page-5MW54PCC.js → skills-page-YRAIRZOQ.js} +3 -3
  347. package/dist/dashboard-web/chunks/{team-federation-page-2SNIMVXI.js → team-federation-page-DEU27GRU.js} +1 -1
  348. package/dist/dashboard-web/chunks/{v3-page-W6SBXXQC.js → v3-page-6KHEW2YL.js} +5 -5
  349. package/dist/dashboard-web/chunks/{whiteboards-page-STC54KTP.js → whiteboards-page-VDECAALH.js} +1 -1
  350. package/dist/dashboard-web/style.css +12545 -11432
  351. package/dist/dashboard.js +215 -36
  352. package/dist/dashboard.js.map +1 -1
  353. package/dist/global-config.d.ts +41 -2
  354. package/dist/global-config.d.ts.map +1 -1
  355. package/dist/global-config.js +47 -0
  356. package/dist/global-config.js.map +1 -1
  357. package/dist/i18n/en.d.ts.map +1 -1
  358. package/dist/i18n/en.js +71 -19
  359. package/dist/i18n/en.js.map +1 -1
  360. package/dist/i18n/zh.d.ts.map +1 -1
  361. package/dist/i18n/zh.js +71 -19
  362. package/dist/i18n/zh.js.map +1 -1
  363. package/dist/im/lark/callback-button-marker.d.ts +34 -0
  364. package/dist/im/lark/callback-button-marker.d.ts.map +1 -0
  365. package/dist/im/lark/callback-button-marker.js +99 -0
  366. package/dist/im/lark/callback-button-marker.js.map +1 -0
  367. package/dist/im/lark/card-builder.d.ts +46 -10
  368. package/dist/im/lark/card-builder.d.ts.map +1 -1
  369. package/dist/im/lark/card-builder.js +299 -78
  370. package/dist/im/lark/card-builder.js.map +1 -1
  371. package/dist/im/lark/card-handler.d.ts +3 -4
  372. package/dist/im/lark/card-handler.d.ts.map +1 -1
  373. package/dist/im/lark/card-handler.js +380 -148
  374. package/dist/im/lark/card-handler.js.map +1 -1
  375. package/dist/im/lark/client.d.ts +24 -1
  376. package/dist/im/lark/client.d.ts.map +1 -1
  377. package/dist/im/lark/client.js +101 -8
  378. package/dist/im/lark/client.js.map +1 -1
  379. package/dist/im/lark/doc-comment.d.ts.map +1 -1
  380. package/dist/im/lark/doc-comment.js +6 -1
  381. package/dist/im/lark/doc-comment.js.map +1 -1
  382. package/dist/im/lark/event-dispatcher.d.ts +115 -3
  383. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  384. package/dist/im/lark/event-dispatcher.js +534 -147
  385. package/dist/im/lark/event-dispatcher.js.map +1 -1
  386. package/dist/im/lark/grant-command.d.ts +16 -12
  387. package/dist/im/lark/grant-command.d.ts.map +1 -1
  388. package/dist/im/lark/grant-command.js +48 -151
  389. package/dist/im/lark/grant-command.js.map +1 -1
  390. package/dist/im/lark/grant-pending.d.ts +12 -4
  391. package/dist/im/lark/grant-pending.d.ts.map +1 -1
  392. package/dist/im/lark/grant-pending.js +31 -8
  393. package/dist/im/lark/grant-pending.js.map +1 -1
  394. package/dist/im/lark/invite-command.d.ts +20 -0
  395. package/dist/im/lark/invite-command.d.ts.map +1 -0
  396. package/dist/im/lark/invite-command.js +239 -0
  397. package/dist/im/lark/invite-command.js.map +1 -0
  398. package/dist/im/lark/md-card.d.ts +66 -4
  399. package/dist/im/lark/md-card.d.ts.map +1 -1
  400. package/dist/im/lark/md-card.js +201 -31
  401. package/dist/im/lark/md-card.js.map +1 -1
  402. package/dist/im/lark/mention-targets.d.ts +43 -0
  403. package/dist/im/lark/mention-targets.d.ts.map +1 -0
  404. package/dist/im/lark/mention-targets.js +190 -0
  405. package/dist/im/lark/mention-targets.js.map +1 -0
  406. package/dist/im/lark/message-parser.d.ts +31 -0
  407. package/dist/im/lark/message-parser.d.ts.map +1 -1
  408. package/dist/im/lark/message-parser.js +305 -32
  409. package/dist/im/lark/message-parser.js.map +1 -1
  410. package/dist/im/lark/reply-card-footer-signature.d.ts +7 -0
  411. package/dist/im/lark/reply-card-footer-signature.d.ts.map +1 -0
  412. package/dist/im/lark/reply-card-footer-signature.js +7 -0
  413. package/dist/im/lark/reply-card-footer-signature.js.map +1 -0
  414. package/dist/im/lark/sessions-card.d.ts.map +1 -1
  415. package/dist/im/lark/sessions-card.js +4 -1
  416. package/dist/im/lark/sessions-card.js.map +1 -1
  417. package/dist/im/lark/substitute-command.d.ts.map +1 -1
  418. package/dist/im/lark/substitute-command.js +8 -0
  419. package/dist/im/lark/substitute-command.js.map +1 -1
  420. package/dist/im/lark/topic-root-context.d.ts +35 -0
  421. package/dist/im/lark/topic-root-context.d.ts.map +1 -0
  422. package/dist/im/lark/topic-root-context.js +37 -0
  423. package/dist/im/lark/topic-root-context.js.map +1 -0
  424. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
  425. package/dist/im/lark/v3-blocked-card.js +2 -1
  426. package/dist/im/lark/v3-blocked-card.js.map +1 -1
  427. package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
  428. package/dist/im/lark/v3-gate-card.js +2 -1
  429. package/dist/im/lark/v3-gate-card.js.map +1 -1
  430. package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -1
  431. package/dist/im/lark/v3-loop-grant-card.js +2 -1
  432. package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
  433. package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
  434. package/dist/im/lark/v3-progress-card.js +2 -1
  435. package/dist/im/lark/v3-progress-card.js.map +1 -1
  436. package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -1
  437. package/dist/im/lark/v3-revisit-grant-card.js +2 -1
  438. package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
  439. package/dist/index-core-only.d.ts +3 -0
  440. package/dist/index-core-only.d.ts.map +1 -0
  441. package/dist/index-core-only.js +107 -0
  442. package/dist/index-core-only.js.map +1 -0
  443. package/dist/services/async-trigger-state.d.ts +8 -0
  444. package/dist/services/async-trigger-state.d.ts.map +1 -1
  445. package/dist/services/async-trigger-state.js +3 -2
  446. package/dist/services/async-trigger-state.js.map +1 -1
  447. package/dist/services/async-trigger-store.d.ts +10 -2
  448. package/dist/services/async-trigger-store.d.ts.map +1 -1
  449. package/dist/services/async-trigger-store.js +3 -2
  450. package/dist/services/async-trigger-store.js.map +1 -1
  451. package/dist/services/backend-availability.d.ts +3 -1
  452. package/dist/services/backend-availability.d.ts.map +1 -1
  453. package/dist/services/backend-availability.js +14 -1
  454. package/dist/services/backend-availability.js.map +1 -1
  455. package/dist/services/backend-type-store.d.ts.map +1 -1
  456. package/dist/services/backend-type-store.js +1 -1
  457. package/dist/services/backend-type-store.js.map +1 -1
  458. package/dist/services/bot-config-store.d.ts.map +1 -1
  459. package/dist/services/bot-config-store.js +2 -1
  460. package/dist/services/bot-config-store.js.map +1 -1
  461. package/dist/services/bridge-fallback-gate.d.ts +14 -1
  462. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  463. package/dist/services/bridge-fallback-gate.js +65 -1
  464. package/dist/services/bridge-fallback-gate.js.map +1 -1
  465. package/dist/services/card-prefs-store.d.ts +7 -2
  466. package/dist/services/card-prefs-store.d.ts.map +1 -1
  467. package/dist/services/card-prefs-store.js +30 -4
  468. package/dist/services/card-prefs-store.js.map +1 -1
  469. package/dist/services/codex-app-runner-protocol.d.ts +9 -0
  470. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
  471. package/dist/services/codex-app-runner-protocol.js +17 -0
  472. package/dist/services/codex-app-runner-protocol.js.map +1 -1
  473. package/dist/services/codex-app-token-usage.d.ts +93 -0
  474. package/dist/services/codex-app-token-usage.d.ts.map +1 -0
  475. package/dist/services/codex-app-token-usage.js +190 -0
  476. package/dist/services/codex-app-token-usage.js.map +1 -0
  477. package/dist/services/codex-transcript.d.ts +6 -1
  478. package/dist/services/codex-transcript.d.ts.map +1 -1
  479. package/dist/services/codex-transcript.js +103 -32
  480. package/dist/services/codex-transcript.js.map +1 -1
  481. package/dist/services/federation-roster.d.ts +4 -0
  482. package/dist/services/federation-roster.d.ts.map +1 -1
  483. package/dist/services/federation-roster.js +3 -0
  484. package/dist/services/federation-roster.js.map +1 -1
  485. package/dist/services/federation-store.d.ts +6 -0
  486. package/dist/services/federation-store.d.ts.map +1 -1
  487. package/dist/services/federation-store.js.map +1 -1
  488. package/dist/services/grant-policy.d.ts +13 -0
  489. package/dist/services/grant-policy.d.ts.map +1 -0
  490. package/dist/services/grant-policy.js +40 -0
  491. package/dist/services/grant-policy.js.map +1 -0
  492. package/dist/services/grant-store.d.ts +24 -3
  493. package/dist/services/grant-store.d.ts.map +1 -1
  494. package/dist/services/grant-store.js +196 -12
  495. package/dist/services/grant-store.js.map +1 -1
  496. package/dist/services/groups-store.d.ts +36 -0
  497. package/dist/services/groups-store.d.ts.map +1 -1
  498. package/dist/services/groups-store.js +123 -1
  499. package/dist/services/groups-store.js.map +1 -1
  500. package/dist/services/jsonl-cursor.d.ts.map +1 -1
  501. package/dist/services/jsonl-cursor.js +8 -2
  502. package/dist/services/jsonl-cursor.js.map +1 -1
  503. package/dist/services/local-cli-opener.d.ts.map +1 -1
  504. package/dist/services/local-cli-opener.js +32 -0
  505. package/dist/services/local-cli-opener.js.map +1 -1
  506. package/dist/services/message-listener-run-preview-store.d.ts +43 -0
  507. package/dist/services/message-listener-run-preview-store.d.ts.map +1 -0
  508. package/dist/services/message-listener-run-preview-store.js +152 -0
  509. package/dist/services/message-listener-run-preview-store.js.map +1 -0
  510. package/dist/services/message-listener-store.d.ts +26 -0
  511. package/dist/services/message-listener-store.d.ts.map +1 -0
  512. package/dist/services/message-listener-store.js +138 -0
  513. package/dist/services/message-listener-store.js.map +1 -0
  514. package/dist/services/message-listener.d.ts +112 -0
  515. package/dist/services/message-listener.d.ts.map +1 -0
  516. package/dist/services/message-listener.js +391 -0
  517. package/dist/services/message-listener.js.map +1 -0
  518. package/dist/services/overload-alert-migration.d.ts +15 -0
  519. package/dist/services/overload-alert-migration.d.ts.map +1 -0
  520. package/dist/services/overload-alert-migration.js +115 -0
  521. package/dist/services/overload-alert-migration.js.map +1 -0
  522. package/dist/services/send-policy.d.ts +38 -0
  523. package/dist/services/send-policy.d.ts.map +1 -1
  524. package/dist/services/send-policy.js +34 -0
  525. package/dist/services/send-policy.js.map +1 -1
  526. package/dist/services/session-store.d.ts +12 -1
  527. package/dist/services/session-store.d.ts.map +1 -1
  528. package/dist/services/session-store.js +44 -2
  529. package/dist/services/session-store.js.map +1 -1
  530. package/dist/services/skill-registry-store.d.ts.map +1 -1
  531. package/dist/services/skill-registry-store.js +87 -12
  532. package/dist/services/skill-registry-store.js.map +1 -1
  533. package/dist/services/substitute-mode-normalize.d.ts +3 -0
  534. package/dist/services/substitute-mode-normalize.d.ts.map +1 -1
  535. package/dist/services/substitute-mode-normalize.js +8 -0
  536. package/dist/services/substitute-mode-normalize.js.map +1 -1
  537. package/dist/services/substitute-mode-store.d.ts.map +1 -1
  538. package/dist/services/substitute-mode-store.js +8 -1
  539. package/dist/services/substitute-mode-store.js.map +1 -1
  540. package/dist/services/transcript-resolver.d.ts +6 -1
  541. package/dist/services/transcript-resolver.d.ts.map +1 -1
  542. package/dist/services/transcript-resolver.js +145 -29
  543. package/dist/services/transcript-resolver.js.map +1 -1
  544. package/dist/services/trigger-types.d.ts +16 -0
  545. package/dist/services/trigger-types.d.ts.map +1 -1
  546. package/dist/services/trigger-types.js +6 -0
  547. package/dist/services/trigger-types.js.map +1 -1
  548. package/dist/setup/bot-config-editor.js +2 -2
  549. package/dist/setup/bot-config-editor.js.map +1 -1
  550. package/dist/setup/ensure-zmx.d.ts +31 -0
  551. package/dist/setup/ensure-zmx.d.ts.map +1 -0
  552. package/dist/setup/ensure-zmx.js +161 -0
  553. package/dist/setup/ensure-zmx.js.map +1 -0
  554. package/dist/setup/index.d.ts +1 -1
  555. package/dist/setup/index.js +1 -1
  556. package/dist/setup/open-platform-automation.d.ts +9 -0
  557. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  558. package/dist/setup/open-platform-automation.js +15 -2
  559. package/dist/setup/open-platform-automation.js.map +1 -1
  560. package/dist/setup/setup-args.d.ts +1 -1
  561. package/dist/setup/setup-args.d.ts.map +1 -1
  562. package/dist/setup/setup-args.js +1 -1
  563. package/dist/skills/definitions.d.ts.map +1 -1
  564. package/dist/skills/definitions.js +32 -0
  565. package/dist/skills/definitions.js.map +1 -1
  566. package/dist/skills/injection-mode.d.ts +6 -2
  567. package/dist/skills/injection-mode.d.ts.map +1 -1
  568. package/dist/skills/injection-mode.js +10 -5
  569. package/dist/skills/injection-mode.js.map +1 -1
  570. package/dist/types.d.ts +79 -3
  571. package/dist/types.d.ts.map +1 -1
  572. package/dist/utils/child-env.d.ts +1 -1
  573. package/dist/utils/child-env.d.ts.map +1 -1
  574. package/dist/utils/child-env.js +4 -0
  575. package/dist/utils/child-env.js.map +1 -1
  576. package/dist/utils/effort-confirm-dialog.d.ts +40 -0
  577. package/dist/utils/effort-confirm-dialog.d.ts.map +1 -0
  578. package/dist/utils/effort-confirm-dialog.js +74 -0
  579. package/dist/utils/effort-confirm-dialog.js.map +1 -0
  580. package/dist/utils/pending-input-queue.d.ts +56 -0
  581. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  582. package/dist/utils/pending-input-queue.js +80 -0
  583. package/dist/utils/pending-input-queue.js.map +1 -1
  584. package/dist/utils/render-dimensions.d.ts +8 -0
  585. package/dist/utils/render-dimensions.d.ts.map +1 -1
  586. package/dist/utils/render-dimensions.js +10 -0
  587. package/dist/utils/render-dimensions.js.map +1 -1
  588. package/dist/utils/stuck-key-guard.d.ts +3 -2
  589. package/dist/utils/stuck-key-guard.d.ts.map +1 -1
  590. package/dist/utils/stuck-key-guard.js +3 -3
  591. package/dist/utils/stuck-key-guard.js.map +1 -1
  592. package/dist/utils/terminal-renderer.d.ts +6 -0
  593. package/dist/utils/terminal-renderer.d.ts.map +1 -1
  594. package/dist/utils/terminal-renderer.js +15 -0
  595. package/dist/utils/terminal-renderer.js.map +1 -1
  596. package/dist/utils/tui-input-delivery.d.ts +32 -0
  597. package/dist/utils/tui-input-delivery.d.ts.map +1 -0
  598. package/dist/utils/tui-input-delivery.js +53 -0
  599. package/dist/utils/tui-input-delivery.js.map +1 -0
  600. package/dist/utils/xml.d.ts +19 -0
  601. package/dist/utils/xml.d.ts.map +1 -0
  602. package/dist/utils/xml.js +26 -0
  603. package/dist/utils/xml.js.map +1 -0
  604. package/dist/worker.js +1852 -374
  605. package/dist/worker.js.map +1 -1
  606. package/dist/workflows/definition.d.ts +8 -8
  607. package/dist/workflows/events/payloads.d.ts +8 -8
  608. package/dist/workflows/events/schema.d.ts +160 -160
  609. package/dist/workflows/v3/session-relay-client.js +1 -1
  610. package/dist/workflows/v3/session-relay-client.js.map +1 -1
  611. package/dist/workflows/v3/worker-fence.d.ts.map +1 -1
  612. package/dist/workflows/v3/worker-fence.js +15 -10
  613. package/dist/workflows/v3/worker-fence.js.map +1 -1
  614. package/package.json +1 -1
  615. package/dist/dashboard-web/chunks/bot-defaults-page-UKA7K4JV.js +0 -10
  616. package/dist/dashboard-web/chunks/chunk-DFLNXQNT.js +0 -1
  617. package/dist/dashboard-web/chunks/connectors-page-A77YAB5Y.js +0 -1
  618. package/dist/dashboard-web/chunks/groups-page-RUZNVXQB.js +0 -8
  619. package/dist/dashboard-web/chunks/insights-page-RF7U7RTA.js +0 -22
  620. package/dist/dashboard-web/chunks/roles-page-BUMKD7Y4.js +0 -1
  621. package/dist/dashboard-web/chunks/sessions-page-6HLSEAB7.js +0 -2
  622. package/dist/dashboard-web/chunks/settings-page-MJDZHQ4X.js +0 -2
package/dist/dashboard.js CHANGED
@@ -8,9 +8,9 @@ import { homedir } from 'node:os';
8
8
  import { fileURLToPath } from 'node:url';
9
9
  import { randomBytes } from 'node:crypto';
10
10
  import { logger } from './utils/logger.js';
11
- import { config } from './config.js';
11
+ import { config, isWildcardBindHost } from './config.js';
12
12
  import { listenWithProbe } from './utils/listen-with-probe.js';
13
- import { generateToken, parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, persistToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
13
+ import { generateToken, parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, loadOrCreatePersistedToken, persistToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
14
14
  import { DaemonRegistry, botsRosterSignature } from './dashboard/registry.js';
15
15
  import { Aggregator, subscribeDaemon } from './dashboard/aggregator.js';
16
16
  import { createSessionPresentationCoordinator } from './dashboard/session-presentation.js';
@@ -27,6 +27,7 @@ import { handleConnectorApi } from './dashboard/connector-api.js';
27
27
  import { redactGroupsForPublic, redactSchedulesForPublic, redactSessionEventForPublic, redactSessionsForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
28
28
  import { handleWebhookRoute } from './dashboard/webhook-routes.js';
29
29
  import { handleFederationApi } from './dashboard/federation-api.js';
30
+ import { buildFederatedRoster } from './services/federation-roster.js';
30
31
  import { handleFederationSpokeApi, syncAllMemberships, autoBindOwnerIfUnambiguous } from './dashboard/federation-spoke-api.js';
31
32
  import { BotOnboardingManager } from './dashboard/bot-onboarding.js';
32
33
  import { FeishuLoginManager } from './dashboard/feishu-login.js';
@@ -44,6 +45,7 @@ import { isLocalDevInstall, botmuxVersionAt, botmuxCliEntry, botmuxInstallRoot }
44
45
  import { checkNode, detectBotmuxInstalls, resolveCurrentVersion } from './utils/install-diagnostics.js';
45
46
  import { fetchLatestVersion, fetchReleasesSince, fetchRollbackVersions, compareVersions, isCanonicalStableVersion, isNewerVersion, } from './core/update-check.js';
46
47
  import { GITHUB_REPO } from './core/restart-report.js';
48
+ import { DEFAULT_OVERLOAD_THRESHOLDS } from './core/host-overload-alert.js';
47
49
  import { spawnDetachedRestart, globalInstallUpdateLockTarget, globalInstallUpdateCwd } from './core/maintenance.js';
48
50
  import { detectGlobalInstallManager, formatGlobalInstallCommand, resolveGlobalInstallPlan, tryResolveGlobalInstallPlan, withGlobalInstallRegistry, UnsupportedGlobalInstallError, } from './utils/global-install.js';
49
51
  import { listCliRuntimeUpdateEntries } from './core/cli-runtime-update.js';
@@ -131,8 +133,9 @@ function loadOrCreateSecret() {
131
133
  }
132
134
  }
133
135
  // The active dashboard token is persisted to disk so a previously-issued
134
- // dashboard URL survives `botmux restart`; only `botmux dashboard` (the
135
- // /__cli/rotate endpoint) rotates it and thereby invalidates the old link.
136
+ // dashboard URL survives `botmux restart`. A platform-bound dashboard creates
137
+ // the first token on startup; only `botmux dashboard` (the /__cli/rotate
138
+ // endpoint) replaces it and thereby invalidates the old link.
136
139
  // The start/restart hint reads it via the non-rotating /__cli/current endpoint
137
140
  // so it can show the live link without invalidating it.
138
141
  let activeToken = loadPersistedToken(TOKEN_PATH);
@@ -140,9 +143,6 @@ let activeToken = loadPersistedToken(TOKEN_PATH);
140
143
  // EADDRINUSE probe). Used for the rotation-URL and persisted for the CLI.
141
144
  let boundDashboardPort = config.dashboard.port;
142
145
  const SECRET = loadOrCreateSecret();
143
- function isWildcardBindHost(host) {
144
- return host === '0.0.0.0' || host === '::' || host === '';
145
- }
146
146
  function tcpPortAvailable(host, port) {
147
147
  return new Promise((resolve) => {
148
148
  const probe = createTcpServer();
@@ -415,7 +415,11 @@ const attaching = new Set(); // dedup concurrent attaches per appId
415
415
  function vcMeetingListenerBotOptions() {
416
416
  try {
417
417
  const onlineByAppId = new Map(registry.list().map(bot => [bot.larkAppId, bot]));
418
- return loadBotConfigs().map(bot => ({
418
+ // Exclude core-only (apiOnly) bots: a VC listener attends real Feishu
419
+ // meetings and needs open-platform scopes + a live Lark connection, which a
420
+ // no-Feishu bot categorically cannot have. Offering it would let setup
421
+ // raw-fetch token/application APIs with its synthetic/empty credentials.
422
+ return loadBotConfigs().filter(bot => bot.apiOnly !== true).map(bot => ({
419
423
  larkAppId: bot.larkAppId,
420
424
  botName: bot.displayName ?? onlineByAppId.get(bot.larkAppId)?.botName ?? bot.name ?? null,
421
425
  cliId: onlineByAppId.get(bot.larkAppId)?.cliId ?? bot.cliId,
@@ -438,6 +442,12 @@ async function validateVcMeetingListenerBotAppId(appId) {
438
442
  const bot = bots.find(b => b.larkAppId === appId);
439
443
  if (!bot)
440
444
  return { ok: false, error: 'vcMeetingAgent_listenerBot_unknown' };
445
+ // Core-only (apiOnly) bots cannot attend Feishu meetings (no Feishu connection,
446
+ // no open-platform scopes). Reject at the settings WRITE boundary so a manual
447
+ // PUT can't select one and drive syncVcMeetingListenerBotConfig →
448
+ // automateOpenPlatformSetup against the open platform with synthetic creds.
449
+ if (bot.apiOnly === true)
450
+ return { ok: false, error: 'vcMeetingAgent_listenerBot_api_only' };
441
451
  return { ok: true };
442
452
  }
443
453
  async function validateCodexNotifierTargetBotAppId(appId, options = {}) {
@@ -485,6 +495,55 @@ function codexNotifierBotOptions() {
485
495
  return [];
486
496
  }
487
497
  }
498
+ /** Validate an overload-alert notifier bot. Unlike codexNotifier this is NOT
499
+ * codex-only — any non-apiOnly bot that can resolve an admin recipient works.
500
+ * On enable (requireReady) the target daemon must be online, else the alert
501
+ * can't be delivered (this feature is best-effort, no outbox). */
502
+ async function validateHostOverloadAlertTargetBotAppId(appId, options = {}) {
503
+ try {
504
+ const bot = loadBotConfigs().find(candidate => candidate.larkAppId === appId);
505
+ if (!bot)
506
+ return { ok: false, error: 'hostOverloadAlert_target_unknown' };
507
+ if (bot.apiOnly === true)
508
+ return { ok: false, error: 'hostOverloadAlert_target_apiOnly' };
509
+ if (!(bot.allowedUsers ?? []).some(user => typeof user === 'string' && user.trim())) {
510
+ return { ok: false, error: 'hostOverloadAlert_target_owner_missing' };
511
+ }
512
+ if (options.requireReady !== true)
513
+ return { ok: true };
514
+ const daemon = registry.list().find(candidate => candidate.larkAppId === appId);
515
+ if (!daemon)
516
+ return { ok: false, error: 'hostOverloadAlert_target_offline' };
517
+ const resolvedOwners = daemon.resolvedAllowedUsers ?? [];
518
+ if (!hasResolvedCodexNotifierRecipient(resolvedOwners)) {
519
+ return { ok: false, error: 'hostOverloadAlert_target_owner_missing' };
520
+ }
521
+ return { ok: true };
522
+ }
523
+ catch {
524
+ return { ok: false, error: 'hostOverloadAlert_target_unknown' };
525
+ }
526
+ }
527
+ function hostOverloadAlertBotOptions() {
528
+ try {
529
+ const onlineByAppId = new Map(registry.list().map(bot => [bot.larkAppId, bot]));
530
+ return loadBotConfigs()
531
+ .filter(bot => bot.apiOnly !== true) // apiOnly bots can't send Feishu messages
532
+ .map(bot => {
533
+ const resolvedOwners = onlineByAppId.get(bot.larkAppId)?.resolvedAllowedUsers ?? [];
534
+ return {
535
+ larkAppId: bot.larkAppId,
536
+ botName: bot.displayName ?? onlineByAppId.get(bot.larkAppId)?.botName ?? bot.name ?? null,
537
+ cliId: onlineByAppId.get(bot.larkAppId)?.cliId ?? bot.cliId,
538
+ apiOnly: bot.apiOnly === true,
539
+ ...resolveCodexNotifierRecipientView(bot.allowedUsers, resolvedOwners),
540
+ };
541
+ });
542
+ }
543
+ catch {
544
+ return [];
545
+ }
546
+ }
488
547
  function normalizeVcMeetingAgentRecord(raw) {
489
548
  return raw && typeof raw === 'object' && !Array.isArray(raw)
490
549
  ? { ...raw }
@@ -552,6 +611,13 @@ async function reloadVcMeetingBotConfigOnDaemons(appIds) {
552
611
  * actually applied (not just "requested").
553
612
  */
554
613
  async function fetchGrantedScopesForBot(bot) {
614
+ // Core-only (apiOnly) bots have no real Feishu credentials — refuse the raw
615
+ // token/application fetch outright rather than dialing the open platform with
616
+ // a synthetic/empty secret. (Belt-and-suspenders: apiOnly is already excluded
617
+ // from listener options, but a pre-existing VC config could still reach here.)
618
+ if (bot.apiOnly === true) {
619
+ return { ok: false, error: 'api_only_bot_has_no_feishu_credentials' };
620
+ }
555
621
  const brand = bot.brand === 'lark' ? 'lark' : 'feishu';
556
622
  const openApi = larkHosts(brand).openApi;
557
623
  const ac = new AbortController();
@@ -635,6 +701,18 @@ async function syncVcMeetingListenerBotConfig(listenerBotAppId, previousListener
635
701
  const prevAppId = previousListenerBotAppId?.trim() || null;
636
702
  if (!nextAppId && !prevAppId)
637
703
  return { ok: true };
704
+ // Defense-in-depth: even though the settings validator rejects apiOnly, guard
705
+ // the sync entry too so no caller reaches automateOpenPlatformSetup / the
706
+ // open-platform raw fetches for a core-only bot.
707
+ if (nextAppId) {
708
+ try {
709
+ const bot = loadBotConfigs().find(b => b.larkAppId === nextAppId);
710
+ if (bot?.apiOnly === true) {
711
+ return { ok: false, error: 'vcMeetingAgent_listenerBot_api_only' };
712
+ }
713
+ }
714
+ catch { /* fall through to normal errors below */ }
715
+ }
638
716
  // Require lark-cli >= MIN_LARK_CLI_VERSION_FOR_VC_BOT for VC bot meeting commands
639
717
  // (vc +meeting-join/events/message-send --as bot). Earlier versions silently reject
640
718
  // `--as bot` with "this command only supports: user", so the listener bot can
@@ -862,6 +940,8 @@ function resolveDashboardSettings() {
862
940
  recommendedRef: TRAEX_RECOMMENDED_REF,
863
941
  },
864
942
  codexRpcInput: dashboard.codexRpcInput === true, // default OFF until live-verified
943
+ // default ON — only an explicit stored false disables (matches config.ts getter)
944
+ bypassCodexHookTrust: dashboard.bypassCodexHookTrust !== false,
865
945
  codexNotifier: {
866
946
  enabled: codexNotifier.enabled,
867
947
  targetBotAppId: codexNotifier.targetBotAppId ?? null,
@@ -875,6 +955,16 @@ function resolveDashboardSettings() {
875
955
  workerOnline: isCodexNotifierWorkerStateFresh(codexNotifierState),
876
956
  lastError: codexNotifierState?.lastError ?? null,
877
957
  },
958
+ hostOverloadAlert: {
959
+ enabled: global.hostOverloadAlert?.enabled === true,
960
+ targetBotAppId: global.hostOverloadAlert?.targetBotAppId ?? null,
961
+ enterLoadRatio: global.hostOverloadAlert?.enterLoadRatio ?? DEFAULT_OVERLOAD_THRESHOLDS.enterLoadRatio,
962
+ enterMemUsedFrac: global.hostOverloadAlert?.enterMemUsedFrac ?? DEFAULT_OVERLOAD_THRESHOLDS.enterMemUsedFrac,
963
+ botOptions: hostOverloadAlertBotOptions(),
964
+ targetDaemonOnline: !!global.hostOverloadAlert?.targetBotAppId
965
+ && registry.list().some(bot => bot.larkAppId === global.hostOverloadAlert?.targetBotAppId),
966
+ },
967
+ noVisibleOutputHint: dashboard.noVisibleOutputHint === true, // default OFF; opt-in anti-resend guidance
878
968
  vcMeetingAgent: {
879
969
  enabled: global.vcMeetingAgent?.enabled !== false,
880
970
  listenerBotAppId: global.vcMeetingAgent?.listenerBotAppId ?? null,
@@ -904,6 +994,7 @@ const settingsWriteApplierDeps = defaultSettingsWriteApplierDeps(resolveDashboar
904
994
  settingsWriteApplierDeps.syncVcMeetingListenerBotConfig = syncVcMeetingListenerBotConfig;
905
995
  settingsWriteApplierDeps.validateVcMeetingListenerBotAppId = validateVcMeetingListenerBotAppId;
906
996
  settingsWriteApplierDeps.validateCodexNotifierTargetBotAppId = validateCodexNotifierTargetBotAppId;
997
+ settingsWriteApplierDeps.validateHostOverloadAlertTargetBotAppId = validateHostOverloadAlertTargetBotAppId;
907
998
  /** Helper to render a {status, body} HandlerResult through `res`. */
908
999
  function writeHandlerResult(res, result) {
909
1000
  const headers = { 'content-type': 'application/json', ...(result.headers ?? {}) };
@@ -1787,8 +1878,33 @@ async function createTeamGroup(args) {
1787
1878
  // Only auto-invite the web user when their paired bot is the creator (open_id
1788
1879
  // is scoped to that app); otherwise create the group but don't forward a
1789
1880
  // wrong-scope open_id — UI will flag autoInviteUnavailable.
1790
- const plan = planGroupCreator(selectedIds, args.preferredCreator, (id) => !!registry.getByAppId(id), (ids) => {
1791
- const p = pickCreatorForGroup(ids, (id) => {
1881
+ // Two DISTINCT predicates conflating them regressed federation:
1882
+ // • isNoTransportBot: a bot with no Feishu transport (core-only apiOnly).
1883
+ // Checked from LOCAL config AND, for a remote federated bot, from the
1884
+ // aggregated roster's `larkTransportEnabled === false` (propagated
1885
+ // spoke→sync→store→roster). undefined/absent (legacy spoke) → normal.
1886
+ // Does NOT require local-registry presence, so a remote normal bot stays.
1887
+ // • canBeCreator: creator must be a locally-online daemon AND have transport
1888
+ // (getBotClient throws for apiOnly). Remote bots can be members, not creator.
1889
+ let noTransportRosterIds = new Set();
1890
+ try {
1891
+ noTransportRosterIds = new Set(buildFederatedRoster(config.session.dataDir, undefined, undefined, undefined, liveBots())
1892
+ .bots.filter(b => b.larkTransportEnabled === false).map(b => b.larkAppId));
1893
+ }
1894
+ catch { /* roster unavailable → rely on local config only */ }
1895
+ const isNoTransportBot = (id) => {
1896
+ if (noTransportRosterIds.has(id))
1897
+ return true;
1898
+ try {
1899
+ return loadBotConfigs().find(b => b.larkAppId === id)?.apiOnly === true;
1900
+ }
1901
+ catch {
1902
+ return false;
1903
+ }
1904
+ };
1905
+ const canBeCreator = (id) => !!registry.getByAppId(id) && !isNoTransportBot(id);
1906
+ const plan = planGroupCreator(selectedIds, args.preferredCreator, canBeCreator, (ids) => {
1907
+ const p = pickCreatorForGroup(ids.filter(canBeCreator), (id) => {
1792
1908
  const d = registry.getByAppId(id);
1793
1909
  return d ? { larkAppId: d.larkAppId, resolvedAllowedUsers: d.resolvedAllowedUsers ?? [] } : undefined;
1794
1910
  });
@@ -1798,12 +1914,16 @@ async function createTeamGroup(args) {
1798
1914
  return { ok: false, error: 'no_online_daemon' };
1799
1915
  const userOpenIds = plan.inviteUser && args.userOpenId ? [args.userOpenId] : [];
1800
1916
  try {
1917
+ // Exclude ONLY apiOnly bots from the member payload (they have no Feishu
1918
+ // identity to invite). Federation remote NORMAL bots stay — the fix for the
1919
+ // creator-predicate regression that also dropped them.
1920
+ const memberIds = selectedIds.filter(id => !isNoTransportBot(id));
1801
1921
  const upstream = await proxyToDaemon(plan.creatorLarkAppId, '/api/groups/create', {
1802
1922
  method: 'POST',
1803
1923
  headers: { 'content-type': 'application/json' },
1804
1924
  body: JSON.stringify(buildTeamGroupCreatePayload({
1805
1925
  name: args.name,
1806
- larkAppIds: selectedIds,
1926
+ larkAppIds: memberIds,
1807
1927
  userOpenIds,
1808
1928
  ownerUnionIds: args.ownerUnionIds ?? [],
1809
1929
  transferOwnerUnionId: args.transferOwnerUnionId,
@@ -1930,7 +2050,7 @@ async function buildGroupsMatrix() {
1930
2050
  return;
1931
2051
  const j = await r.json();
1932
2052
  for (const c of j.chats ?? []) {
1933
- const { oncallChat, firstSeenAt, hasRole, observedBotNames, ...chatBase } = c;
2053
+ const { oncallChat, firstSeenAt, hasRole, hasMessageListener, observedBotNames, ...chatBase } = c;
1934
2054
  const cur = out.get(c.chatId) ?? {
1935
2055
  ...chatBase,
1936
2056
  memberBots: [],
@@ -1947,6 +2067,7 @@ async function buildGroupsMatrix() {
1947
2067
  inChat: true,
1948
2068
  oncallChat: oncallChat ?? null,
1949
2069
  hasRole: hasRole ?? false,
2070
+ hasMessageListener: hasMessageListener ?? false,
1950
2071
  });
1951
2072
  if (typeof firstSeenAt === 'number') {
1952
2073
  cur._firstSeenAt = cur._firstSeenAt === null
@@ -1962,7 +2083,7 @@ async function buildGroupsMatrix() {
1962
2083
  const present = new Set(c.memberBots.map((mb) => mb.larkAppId));
1963
2084
  for (const b of onlineBots) {
1964
2085
  if (!present.has(b.larkAppId)) {
1965
- c.memberBots.push({ larkAppId: b.larkAppId, botName: b.botName, cliId: b.cliId, inChat: false, oncallChat: null, hasRole: false });
2086
+ c.memberBots.push({ larkAppId: b.larkAppId, botName: b.botName, cliId: b.cliId, inChat: false, oncallChat: null, hasRole: false, hasMessageListener: false });
1966
2087
  }
1967
2088
  }
1968
2089
  }
@@ -3650,28 +3771,6 @@ const server = createServer(async (req, res) => {
3650
3771
  res.end(await upstream.text());
3651
3772
  return;
3652
3773
  }
3653
- // Sandbox landing: review the clone's diff (GET) then apply/discard (POST).
3654
- if (req.method === 'GET' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/sandbox-diff$/))) {
3655
- const sid = decodeURIComponent(m[1]);
3656
- const owner = aggregator.ownerOf(sid);
3657
- if (!owner)
3658
- return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
3659
- const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/sandbox-diff`, { method: 'GET' });
3660
- res.writeHead(upstream.status, { 'content-type': 'application/json' });
3661
- res.end(await upstream.text());
3662
- return;
3663
- }
3664
- if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/sandbox-land\/(apply|discard)$/))) {
3665
- const sid = decodeURIComponent(m[1]);
3666
- const action = m[2];
3667
- const owner = aggregator.ownerOf(sid);
3668
- if (!owner)
3669
- return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
3670
- const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/sandbox-land/${action}`, { method: 'POST' });
3671
- res.writeHead(upstream.status, { 'content-type': 'application/json' });
3672
- res.end(await upstream.text());
3673
- return;
3674
- }
3675
3774
  if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/schedules\/([^/]+)\/(run|pause|resume|delivery)$/))) {
3676
3775
  const id = decodeURIComponent(m[1]);
3677
3776
  const op = m[2];
@@ -3832,6 +3931,82 @@ const server = createServer(async (req, res) => {
3832
3931
  return;
3833
3932
  }
3834
3933
  }
3934
+ // ─── Message listeners (proxy to daemon) ───────────────────────────────
3935
+ // GET /api/message-listeners/:larkAppId/:chatId
3936
+ // PUT /api/message-listeners/:larkAppId/:chatId
3937
+ // DELETE /api/message-listeners/:larkAppId/:chatId
3938
+ // POST /api/message-listeners/:larkAppId/:chatId/(preview|run-preview)
3939
+ // GET /api/message-listeners/:larkAppId/:chatId/run-preview/:runId
3940
+ let mMessageListener;
3941
+ if ((mMessageListener = url.pathname.match(/^\/api\/message-listeners\/([^/]+)\/([^/]+)\/run-preview\/([^/]+)$/))) {
3942
+ const larkAppId = decodeURIComponent(mMessageListener[1]);
3943
+ const chatId = decodeURIComponent(mMessageListener[2]);
3944
+ const runId = decodeURIComponent(mMessageListener[3]);
3945
+ if (req.method === 'GET') {
3946
+ const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}/run-preview/${encodeURIComponent(runId)}`, { method: 'GET' });
3947
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3948
+ res.end(await upstream.text());
3949
+ return;
3950
+ }
3951
+ }
3952
+ if ((mMessageListener = url.pathname.match(/^\/api\/message-listeners\/([^/]+)\/([^/]+)\/(preview|run-preview)$/))) {
3953
+ const larkAppId = decodeURIComponent(mMessageListener[1]);
3954
+ const chatId = decodeURIComponent(mMessageListener[2]);
3955
+ const op = mMessageListener[3];
3956
+ if (req.method === 'POST') {
3957
+ const chunks = [];
3958
+ for await (const c of req)
3959
+ chunks.push(c);
3960
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
3961
+ const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}/${op}`, {
3962
+ method: 'POST',
3963
+ headers: { 'content-type': 'application/json' },
3964
+ body: raw,
3965
+ });
3966
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3967
+ res.end(await upstream.text());
3968
+ return;
3969
+ }
3970
+ }
3971
+ if ((mMessageListener = url.pathname.match(/^\/api\/message-listeners\/([^/]+)\/([^/]+)$/))) {
3972
+ const larkAppId = decodeURIComponent(mMessageListener[1]);
3973
+ const chatId = decodeURIComponent(mMessageListener[2]);
3974
+ if (req.method === 'GET') {
3975
+ const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}`, { method: 'GET' });
3976
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3977
+ res.end(await upstream.text());
3978
+ return;
3979
+ }
3980
+ if (req.method === 'PUT') {
3981
+ const chunks = [];
3982
+ for await (const c of req)
3983
+ chunks.push(c);
3984
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
3985
+ const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}`, {
3986
+ method: 'PUT',
3987
+ headers: { 'content-type': 'application/json' },
3988
+ body: raw,
3989
+ });
3990
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3991
+ res.end(await upstream.text());
3992
+ return;
3993
+ }
3994
+ if (req.method === 'DELETE') {
3995
+ const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}`, { method: 'DELETE' });
3996
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3997
+ res.end(await upstream.text());
3998
+ return;
3999
+ }
4000
+ }
4001
+ let mGroupMembersDisplay;
4002
+ if (req.method === 'GET' && (mGroupMembersDisplay = url.pathname.match(/^\/api\/groups\/([^/]+)\/([^/]+)\/members-display$/))) {
4003
+ const larkAppId = decodeURIComponent(mGroupMembersDisplay[1]);
4004
+ const chatId = decodeURIComponent(mGroupMembersDisplay[2]);
4005
+ const upstream = await proxyToDaemon(larkAppId, `/api/groups/${encodeURIComponent(chatId)}/members-display`, { method: 'GET' });
4006
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
4007
+ res.end(await upstream.text());
4008
+ return;
4009
+ }
3835
4010
  // ─── Profiles (aggregate/proxy to daemon) ─────────────────────────────
3836
4011
  // ─── 会议角色预设(私有 API:不在 PUBLIC_READ_PATHS,未认证已被 401) ───
3837
4012
  if (url.pathname === '/api/vc-meeting/consumer-profiles') {
@@ -4334,7 +4509,7 @@ const server = createServer(async (req, res) => {
4334
4509
  return;
4335
4510
  }
4336
4511
  // PUT /api/bots/:appId/backend-type — proxy to that bot's daemon. Body
4337
- // `{ backendType: 'pty'|'tmux'|'herdr'|'zellij'|'' }` ('' / 'auto' clears the override).
4512
+ // `{ backendType: 'pty'|'tmux'|'herdr'|'zellij'|'zmx'|'' }` ('' / 'auto' clears the override).
4338
4513
  let mBotBackendType;
4339
4514
  if (req.method === 'PUT' && (mBotBackendType = url.pathname.match(/^\/api\/bots\/([^/]+)\/backend-type$/))) {
4340
4515
  const appId = decodeURIComponent(mBotBackendType[1]);
@@ -5038,6 +5213,10 @@ function startPlatformTunnelIfBound() {
5038
5213
  const binding = readPlatformBinding();
5039
5214
  if (!binding)
5040
5215
  return;
5216
+ if (!activeToken) {
5217
+ activeToken = loadOrCreatePersistedToken(TOKEN_PATH);
5218
+ logger.info('[platform-tunnel] 已初始化 dashboard token');
5219
+ }
5041
5220
  const version = readBotmuxVersion();
5042
5221
  platformTunnel = startPlatformTunnelClient({
5043
5222
  binding,