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
@@ -11,6 +11,21 @@ import { sanitizePerBotEnv } from './core/per-bot-env.js';
11
11
  import { normalizeSubstituteMode } from './services/substitute-mode-normalize.js';
12
12
  import { normalizePluginIdList } from './core/plugins/ids.js';
13
13
  import { normalizeVcMeetingProfileInstructions } from './services/vc-meeting-profile-instructions.js';
14
+ /**
15
+ * Thrown when any Feishu client is requested for a core-only (`apiOnly`) bot.
16
+ * Defined here (the lowest-level module that owns bot config + client) so both
17
+ * `getBotClient` and higher layers (im/lark/client.ts primitives, doc-comment)
18
+ * throw the SAME typed error without an import cycle. apiOnly = zero Feishu
19
+ * network (reads AND writes); reaching a client request is genuine misuse.
20
+ */
21
+ export class LarkTransportDisabledError extends Error {
22
+ constructor(larkAppId, op) {
23
+ super(`Feishu transport is disabled for core-only bot ${larkAppId} (attempted: ${op})`);
24
+ this.name = 'LarkTransportDisabledError';
25
+ }
26
+ }
27
+ /** Default when a bot sets nothing: usage rides the live streaming card. */
28
+ export const DEFAULT_USAGE_DISPLAY = 'streaming';
14
29
  function normalizeChatReplyModeConfig(raw) {
15
30
  if (typeof raw !== 'string')
16
31
  return undefined;
@@ -37,6 +52,13 @@ function normalizeContentTriggerScope(raw) {
37
52
  return 'regularGroup';
38
53
  return undefined;
39
54
  }
55
+ function normalizeMessageListenerSenderType(raw) {
56
+ if (raw === 'user' || raw === 'human')
57
+ return 'user';
58
+ if (raw === 'bot' || raw === 'app')
59
+ return 'bot';
60
+ return undefined;
61
+ }
40
62
  function normalizeNonNegativeInt(raw) {
41
63
  if (typeof raw !== 'number')
42
64
  return undefined;
@@ -662,12 +684,88 @@ function normalizeContentTriggers(raw, botIndex) {
662
684
  });
663
685
  return out.length > 0 ? out : undefined;
664
686
  }
687
+ function normalizeMessageListenerStringList(raw) {
688
+ const values = normalizeStringList(raw);
689
+ return values.length > 0 ? [...new Set(values)] : undefined;
690
+ }
691
+ function normalizeMessageListenerSenderTypes(raw) {
692
+ if (!Array.isArray(raw))
693
+ return undefined;
694
+ const values = raw
695
+ .map(normalizeMessageListenerSenderType)
696
+ .filter((value) => !!value);
697
+ return values.length > 0 ? [...new Set(values)] : undefined;
698
+ }
699
+ function normalizeMessageListenerConfig(raw, botIndex, chatId) {
700
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
701
+ return undefined;
702
+ const entry = raw;
703
+ const prompt = normalizeNonEmptyString(entry.prompt);
704
+ const enabled = entry.enabled === true;
705
+ if (enabled && !prompt) {
706
+ logger.warn(`Bot config [${botIndex}] messageListeners[${chatId}] ignored: enabled listener requires prompt`);
707
+ return undefined;
708
+ }
709
+ const senderRaw = entry.senderPolicy && typeof entry.senderPolicy === 'object' && !Array.isArray(entry.senderPolicy)
710
+ ? entry.senderPolicy
711
+ : {};
712
+ const senderPolicy = {};
713
+ const mode = senderRaw.mode === 'include_only' ? 'include_only' : 'all_except_excluded';
714
+ const includeSenderOpenIds = normalizeMessageListenerStringList(senderRaw.includeSenderOpenIds);
715
+ const excludeSenderOpenIds = normalizeMessageListenerStringList(senderRaw.excludeSenderOpenIds);
716
+ const includeSenderTypes = normalizeMessageListenerSenderTypes(senderRaw.includeSenderTypes);
717
+ const excludeSenderTypes = normalizeMessageListenerSenderTypes(senderRaw.excludeSenderTypes);
718
+ if (mode !== 'all_except_excluded')
719
+ senderPolicy.mode = mode;
720
+ if (includeSenderOpenIds)
721
+ senderPolicy.includeSenderOpenIds = includeSenderOpenIds;
722
+ if (excludeSenderOpenIds)
723
+ senderPolicy.excludeSenderOpenIds = excludeSenderOpenIds;
724
+ if (includeSenderTypes)
725
+ senderPolicy.includeSenderTypes = includeSenderTypes;
726
+ if (excludeSenderTypes)
727
+ senderPolicy.excludeSenderTypes = excludeSenderTypes;
728
+ if (senderRaw.excludeSelf === false)
729
+ senderPolicy.excludeSelf = false;
730
+ const messageRaw = entry.messagePolicy && typeof entry.messagePolicy === 'object' && !Array.isArray(entry.messagePolicy)
731
+ ? entry.messagePolicy
732
+ : {};
733
+ const messagePolicy = {};
734
+ const includeMsgTypes = normalizeMessageListenerStringList(messageRaw.includeMsgTypes);
735
+ if (includeMsgTypes)
736
+ messagePolicy.includeMsgTypes = includeMsgTypes;
737
+ messagePolicy.scope = 'top_level';
738
+ return {
739
+ enabled,
740
+ ...(normalizeNonEmptyString(entry.name) ? { name: normalizeNonEmptyString(entry.name) } : {}),
741
+ ...(normalizeNonEmptyString(entry.replyCardTitle) ? { replyCardTitle: normalizeNonEmptyString(entry.replyCardTitle) } : {}),
742
+ ...(normalizeNonEmptyString(entry.workingDir) ? { workingDir: normalizeNonEmptyString(entry.workingDir) } : {}),
743
+ prompt: prompt ?? '',
744
+ ...(Object.keys(senderPolicy).length > 0 ? { senderPolicy } : {}),
745
+ ...(Object.keys(messagePolicy).length > 0 ? { messagePolicy } : {}),
746
+ replyPolicy: { mode: 'thread', sessionMode: 'per_message' },
747
+ };
748
+ }
749
+ function normalizeMessageListeners(raw, botIndex) {
750
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
751
+ return undefined;
752
+ const out = {};
753
+ for (const [chatId, listenerRaw] of Object.entries(raw)) {
754
+ if (typeof chatId !== 'string' || !chatId.trim())
755
+ continue;
756
+ const listener = normalizeMessageListenerConfig(listenerRaw, botIndex, chatId.trim());
757
+ if (listener)
758
+ out[chatId.trim()] = listener;
759
+ }
760
+ return Object.keys(out).length > 0 ? out : undefined;
761
+ }
665
762
  const bots = new Map();
666
763
  export function __testOnly_resetBotRegistry() {
667
764
  bots.clear();
668
765
  loadedConfigPath = undefined;
669
766
  oncallChatCache = null;
670
767
  brandLabelCache = null;
768
+ usageDisplayCache = null;
671
769
  }
672
770
  // Wire the i18n lookup so `localeForBot()` can resolve per-bot locale without
673
771
  // a hard import cycle between `i18n` and `bot-registry`.
@@ -762,15 +860,45 @@ const larkLogger = {
762
860
  debug: (...msg) => logger.debug(`[lark] ${fmtLark(msg)}`),
763
861
  trace: (..._msg) => { },
764
862
  };
863
+ /**
864
+ * Pure predicate: is this bot's VC-meeting-agent config ACTIVE (should the daemon
865
+ * attend meetings / restore VC runtime sessions / poll `lark-cli vc` for it)?
866
+ *
867
+ * Returns the config only when it is `enabled` AND the bot is NOT apiOnly. An
868
+ * apiOnly (core-only) bot has no Feishu connection — attending a VC meeting drives
869
+ * `lark-cli vc +meeting-events --as bot`, which categorically violates the
870
+ * zero-Feishu-network contract. Gating here (rather than only at each call site)
871
+ * means the daemon's central `effectiveVcMeetingAgentConfig` accessor — and every
872
+ * one of its ~24 consumers, including the boot-time `restoreVcMeetingRuntimeSessions`
873
+ * path that runs OUTSIDE the `!cfg.apiOnly` boot block — fail-closes for apiOnly by
874
+ * construction. The dashboard already refuses to SET an apiOnly listener; this also
875
+ * covers a hand-edited / migrated bots.json (a normal VC bot flipped to apiOnly with
876
+ * `vcMeetingAgent.enabled:true` + a stale on-disk runtime record).
877
+ */
878
+ export function vcMeetingAgentConfigActive(cfg) {
879
+ if (!cfg)
880
+ return undefined;
881
+ if (cfg.apiOnly === true)
882
+ return undefined;
883
+ return cfg.vcMeetingAgent?.enabled === true ? cfg.vcMeetingAgent : undefined;
884
+ }
765
885
  export function registerBot(cfg) {
766
- const client = new Lark.Client({
767
- appId: cfg.larkAppId,
768
- appSecret: cfg.larkAppSecret,
769
- // brand SDK domain。缺省走 feishu,国际版租户走 larksuite.com。
770
- // 这一行同时修好了所有经由 SDK 的调用(发消息 / 文件 / contact 等)。
771
- domain: sdkDomain(normalizeBrand(cfg.brand)),
772
- logger: larkLogger,
773
- });
886
+ // apiOnly (core-only) bots have NO Feishu credential (empty appSecret). The Lark
887
+ // SDK Client ctor throws "appSecret or clientAssertionProvider is required" on an
888
+ // empty secret, so constructing it would fatal the whole daemon at boot — the
889
+ // exact failure riff hit in a clean sandbox. An apiOnly bot never uses the client
890
+ // (getBotClient throws LarkTransportDisabledError first; getAllBotClients filters
891
+ // apiOnly), so leave it null. Zero Feishu transport is the whole contract.
892
+ const client = cfg.apiOnly === true
893
+ ? null
894
+ : new Lark.Client({
895
+ appId: cfg.larkAppId,
896
+ appSecret: cfg.larkAppSecret,
897
+ // brand → SDK domain。缺省走 feishu,国际版租户走 larksuite.com。
898
+ // 这一行同时修好了所有经由 SDK 的调用(发消息 / 文件 / contact 等)。
899
+ domain: sdkDomain(normalizeBrand(cfg.brand)),
900
+ logger: larkLogger,
901
+ });
774
902
  const state = {
775
903
  config: cfg,
776
904
  client,
@@ -794,7 +922,25 @@ export function getBot(larkAppId) {
794
922
  return state;
795
923
  }
796
924
  export function getBotClient(larkAppId) {
797
- return getBot(larkAppId).client;
925
+ const bot = getBot(larkAppId);
926
+ // Bot-level transport boundary at the TRUE shared base. `apiOnly` (core-only)
927
+ // means zero Feishu network — reads AND writes — not merely "no sends". Every
928
+ // Feishu call in the codebase resolves its client here (client.ts primitives,
929
+ // doc-comment drive API, open-platform rename/avatar, identity cache…), so
930
+ // throwing here is the single authoritative gate no caller can bypass. A
931
+ // correctly-built apiOnly flow never reaches this (session/CLI gates fire
932
+ // first); reaching it is genuine misuse and must fail loud, not silently.
933
+ if (bot.config.apiOnly === true) {
934
+ throw new LarkTransportDisabledError(larkAppId, 'getBotClient');
935
+ }
936
+ // Non-apiOnly bots always have a constructed client (registerBot builds one for
937
+ // every non-apiOnly config). The null-guard is defensive — a null here would mean
938
+ // a misconfigured bot slipped the apiOnly gate, which must fail loud, not NPE deep
939
+ // in an SDK call.
940
+ if (!bot.client) {
941
+ throw new Error(`Bot ${larkAppId} has no Lark client (apiOnly misconfiguration)`);
942
+ }
943
+ return bot.client;
798
944
  }
799
945
  /** Owner = bot 首个已授权 open_id,与「缺权限警告私信对象」同口径(见 admin 解析)。 */
800
946
  export function getOwnerOpenId(larkAppId) {
@@ -941,6 +1087,20 @@ export function isChatOncallBoundForAnyBot(chatId) {
941
1087
  // Per-bot brand label, mtime-cached for the disk fallback. Keyed by larkAppId →
942
1088
  // the configured value (undefined when the bot has no brandLabel key).
943
1089
  let brandLabelCache = null;
1090
+ let usageDisplayCache = null;
1091
+ /** Normalize a raw bots.json entry's usage-display intent to the enum, applying
1092
+ * backward compat: an explicit `usageDisplay` wins; otherwise a legacy
1093
+ * `showUsageInCardFooter: false` maps to `'off'`; everything else is the
1094
+ * default (`'streaming'`). Single source of truth for both the in-memory parse
1095
+ * and the disk-fallback resolver so they cannot drift. */
1096
+ export function normalizeUsageDisplay(entry) {
1097
+ if (entry.usageDisplay === 'streaming' || entry.usageDisplay === 'footer' || entry.usageDisplay === 'off') {
1098
+ return entry.usageDisplay;
1099
+ }
1100
+ if (entry.showUsageInCardFooter === false)
1101
+ return 'off';
1102
+ return DEFAULT_USAGE_DISPLAY;
1103
+ }
944
1104
  /** Resolve the bots.json path the same way loadBotConfigs does, without
945
1105
  * requiring the registry to have been loaded (works in one-shot CLI processes
946
1106
  * like `botmux send`). Returns null when no config file exists. */
@@ -996,6 +1156,46 @@ export function resolveBrandLabel(larkAppId) {
996
1156
  return undefined;
997
1157
  }
998
1158
  }
1159
+ /**
1160
+ * Resolve the per-bot usage-display mode (default `'streaming'`). A freshly
1161
+ * loaded registry wins over the spawn-time env so long-lived panes observe
1162
+ * `/botconfig` hot updates; sandboxed/env-only processes carry the value in
1163
+ * their synthetic registered bot and otherwise fall back to the injected env.
1164
+ */
1165
+ export function resolveUsageDisplay(larkAppId) {
1166
+ const inMem = bots.get(larkAppId);
1167
+ if (inMem)
1168
+ return normalizeUsageDisplay(inMem.config);
1169
+ if (process.env.BOTMUX_LARK_APP_ID === larkAppId
1170
+ && 'BOTMUX_USAGE_DISPLAY' in process.env) {
1171
+ const env = process.env.BOTMUX_USAGE_DISPLAY;
1172
+ if (env === 'streaming' || env === 'footer' || env === 'off')
1173
+ return env;
1174
+ return DEFAULT_USAGE_DISPLAY;
1175
+ }
1176
+ const path = loadedConfigPath ?? botsConfigDiskPath();
1177
+ if (!path)
1178
+ return DEFAULT_USAGE_DISPLAY;
1179
+ try {
1180
+ const stat = statSync(path);
1181
+ if (!usageDisplayCache || usageDisplayCache.mtimeMs !== stat.mtimeMs) {
1182
+ const raw = JSON.parse(readFileSync(path, 'utf-8'));
1183
+ const map = new Map();
1184
+ if (Array.isArray(raw)) {
1185
+ for (const entry of raw) {
1186
+ if (entry && typeof entry.larkAppId === 'string') {
1187
+ map.set(entry.larkAppId, normalizeUsageDisplay(entry));
1188
+ }
1189
+ }
1190
+ }
1191
+ usageDisplayCache = { mtimeMs: stat.mtimeMs, map };
1192
+ }
1193
+ return usageDisplayCache.map.get(larkAppId) ?? DEFAULT_USAGE_DISPLAY;
1194
+ }
1195
+ catch {
1196
+ return DEFAULT_USAGE_DISPLAY;
1197
+ }
1198
+ }
999
1199
  /**
1000
1200
  * 只读 accessor:该 bot 配置的 tuiSlashAllow allowlist(TUI 通用 slash 注入用)。
1001
1201
  * 仅读内存态注册表,daemon 进程内使用;无需 bots.json 磁盘回退(不同于
@@ -1008,10 +1208,55 @@ export function getBotTuiSlashAllow(larkAppId) {
1008
1208
  * Load bot configurations from one of (in priority order):
1009
1209
  * 1. BOTS_CONFIG env var — path to a JSON file
1010
1210
  * 2. ~/.botmux/bots.json — default config path
1211
+ * 3. Core-only (BOTMUX_CORE_ONLY=1) with NEITHER of the above present:
1212
+ * synthesize a single apiOnly bot from env — no bots.json / no Feishu creds
1213
+ * (riff's in-sandbox headless service).
1011
1214
  */
1012
1215
  export function loadBotConfigs() {
1216
+ const synthetic = maybeSynthesizeCoreOnlyConfig();
1217
+ if (synthetic)
1218
+ return synthetic;
1013
1219
  return parseBotConfigFile(resolveBotConfigPath());
1014
1220
  }
1221
+ /**
1222
+ * Core-only headless config: when BOTMUX_CORE_ONLY=1, synthesize ONE apiOnly bot
1223
+ * from env so the daemon boots with zero Feishu credentials and no on-disk config.
1224
+ *
1225
+ * Core-only is AUTHORITATIVE about identity and IGNORES all ambient config inputs
1226
+ * — both ~/.botmux/bots.json AND the BOTS_CONFIG env (codex P1-2). Otherwise a
1227
+ * core-only service started on a host that happens to have a real fleet config —
1228
+ * or with an inherited/leaked BOTS_CONFIG — would silently boot a REAL,
1229
+ * transport-enabled Feishu bot (WSClient, real credentials, `--bot` ignored)
1230
+ * instead of the headless apiOnly one, the exact opposite of "no Feishu". There
1231
+ * is deliberately NO file-based override in this mode: the identity is exactly the
1232
+ * one synthesized here (frozen: apiOnly, `local_<slug>`, no secret). Returns null
1233
+ * only when not in core-only mode.
1234
+ *
1235
+ * The synthesized `loadedConfigPath` is pinned to the DEFAULT ~/.botmux/bots.json
1236
+ * path (even though the file is absent/ignored) so the no-transport fs-policy sees
1237
+ * the config as living INSIDE the default botmux authority root — never an external
1238
+ * path or a carve-out, which would trip buildFsPolicy's fail-closed checks.
1239
+ */
1240
+ function maybeSynthesizeCoreOnlyConfig() {
1241
+ if (process.env.BOTMUX_CORE_ONLY !== '1')
1242
+ return null;
1243
+ const larkAppId = process.env.BOTMUX_API_ONLY_BOT || 'local_riff';
1244
+ if (!/^local_[A-Za-z0-9._-]+$/.test(larkAppId)) {
1245
+ throw new Error(`Core-only BOTMUX_API_ONLY_BOT must match local_<slug> (letters/digits/._-), got: ${larkAppId}`);
1246
+ }
1247
+ const cliId = process.env.BOTMUX_CORE_CLI || 'codex-app';
1248
+ const entry = { larkAppId, apiOnly: true, cliId };
1249
+ if (process.env.BOTMUX_CORE_WORKING_DIR)
1250
+ entry.workingDir = process.env.BOTMUX_CORE_WORKING_DIR;
1251
+ if (process.env.BOTMUX_CORE_MODEL)
1252
+ entry.model = process.env.BOTMUX_CORE_MODEL;
1253
+ // Route through the normal parser so the synthesized entry gets identical
1254
+ // validation + normalization as a file-loaded one (apiOnly secret exemption,
1255
+ // cliId check, defaults). Pin loadedConfigPath to the default in-root path.
1256
+ const configs = parseBotConfigsFromText(JSON.stringify([entry]));
1257
+ loadedConfigPath = resolve(homedir(), '.botmux', 'bots.json');
1258
+ return configs;
1259
+ }
1015
1260
  function resolveBotConfigPath() {
1016
1261
  // 1. BOTS_CONFIG env var
1017
1262
  const botsConfigPath = process.env.BOTS_CONFIG;
@@ -1163,7 +1408,19 @@ export function parseBotConfigsFromText(jsonText) {
1163
1408
  if (!entry.larkAppId || typeof entry.larkAppId !== 'string') {
1164
1409
  throw new Error(`Bot config [${i}]: larkAppId is required and must be a string`);
1165
1410
  }
1166
- if (!entry.larkAppSecret || typeof entry.larkAppSecret !== 'string') {
1411
+ // apiOnly (core-only) bots drive purely over the HTTP control API and never
1412
+ // connect to Feishu, so a real app secret is not required. larkAppId is still
1413
+ // mandatory (daemon identity + dashboard routing + cachedLarkAppId gate); use
1414
+ // a synthetic local id like `local_<slug>`. Normal Feishu bots keep the hard
1415
+ // requirement — a missing secret there is a misconfig, not a headless bot.
1416
+ // The rule for apiOnly is "may be omitted; if present it must still be a
1417
+ // string" — a number/object/array/false must NOT slip into a string field.
1418
+ if (entry.apiOnly === true) {
1419
+ if (entry.larkAppSecret !== undefined && typeof entry.larkAppSecret !== 'string') {
1420
+ throw new Error(`Bot config [${i}]: larkAppSecret must be a string when provided (apiOnly bots may omit it)`);
1421
+ }
1422
+ }
1423
+ else if (!entry.larkAppSecret || typeof entry.larkAppSecret !== 'string') {
1167
1424
  throw new Error(`Bot config [${i}]: larkAppSecret is required and must be a string`);
1168
1425
  }
1169
1426
  // MOSA-managed onboarding persists the exact App/secret/owner binding so
@@ -1257,7 +1514,7 @@ export function parseBotConfigsFromText(jsonText) {
1257
1514
  if (ids.length > 0)
1258
1515
  globalGrants = ids;
1259
1516
  }
1260
- // messageQuota.defaultLimit:仅保留正整数;非法/缺省 → undefined(= 默认额度关闭)。
1517
+ // messageQuota.defaultLimit:仅保留正整数;非法/缺省 → undefined(卡片用产品默认 3 条)。
1261
1518
  let messageQuota;
1262
1519
  const rawMq = entry.messageQuota;
1263
1520
  if (rawMq && typeof rawMq === 'object' && !Array.isArray(rawMq)) {
@@ -1285,6 +1542,22 @@ export function parseBotConfigsFromText(jsonText) {
1285
1542
  if (Object.keys(out).length > 0)
1286
1543
  quotaState = out;
1287
1544
  }
1545
+ let grantExpiryState;
1546
+ if (entry.grantExpiryState && typeof entry.grantExpiryState === 'object' && !Array.isArray(entry.grantExpiryState)) {
1547
+ const out = {};
1548
+ for (const [k, v] of Object.entries(entry.grantExpiryState)) {
1549
+ if (!/^(chat:.+:.+|global:.+)$/.test(k))
1550
+ continue;
1551
+ if (!v || typeof v !== 'object')
1552
+ continue;
1553
+ const expiresAt = v.expiresAt;
1554
+ if (typeof expiresAt !== 'number' || !Number.isFinite(expiresAt) || expiresAt <= 0)
1555
+ continue;
1556
+ out[k] = { expiresAt };
1557
+ }
1558
+ if (Object.keys(out).length > 0)
1559
+ grantExpiryState = out;
1560
+ }
1288
1561
  // customPassthroughCommands:用户额外放行透传的 slash 命令。归一化:转小写、
1289
1562
  // 自动补前导 `/`、按 /^\/[a-z0-9][a-z0-9:_-]*$/ 过滤、去重。非法/缺省 → undefined。
1290
1563
  // 注意:与 daemon 命令的冲突过滤放在 resolvePassthroughCommands(运行时合并)做,
@@ -1353,6 +1626,7 @@ export function parseBotConfigsFromText(jsonText) {
1353
1626
  : undefined;
1354
1627
  const summaryRange = normalizeSummaryRange(entry.summaryRange ?? entry.summary);
1355
1628
  const contentTriggers = normalizeContentTriggers(entry.contentTriggers, i);
1629
+ const messageListeners = normalizeMessageListeners(entry.messageListeners, i);
1356
1630
  const vcMeetingAgent = normalizeVcMeetingAgentConfig(entry.vcMeetingAgent);
1357
1631
  // voice:per-bot 语音引擎覆盖。结构化保留(engine ∈ sami|openai,sami/openai
1358
1632
  // 为对象,speaker/rate 透传);非对象或 engine 非法 → undefined。深度校验
@@ -1381,7 +1655,11 @@ export function parseBotConfigsFromText(jsonText) {
1381
1655
  }
1382
1656
  configs.push({
1383
1657
  larkAppId: entry.larkAppId,
1384
- larkAppSecret: entry.larkAppSecret,
1658
+ // apiOnly bots may omit the secret (never used — no Feishu connection);
1659
+ // fall back to '' so downstream env plumbing stays a string. Feishu image
1660
+ // upload etc. already degrade gracefully on an empty secret.
1661
+ larkAppSecret: entry.larkAppSecret ?? '',
1662
+ apiOnly: entry.apiOnly === true || undefined,
1385
1663
  // brand:只认精确的 'lark',其余 → undefined(下游 normalizeBrand 当
1386
1664
  // feishu)。feishu 故意存成 undefined,保持旧 bots.json 干净、不写死字段。
1387
1665
  brand: entry.brand === 'lark' ? 'lark' : undefined,
@@ -1450,6 +1728,7 @@ export function parseBotConfigsFromText(jsonText) {
1450
1728
  p2pOpen: entry.p2pOpen === true || undefined,
1451
1729
  messageQuota,
1452
1730
  quotaState,
1731
+ grantExpiryState,
1453
1732
  restrictGrantCommands: entry.restrictGrantCommands === true || undefined,
1454
1733
  // Default is ON, so only explicit false is meaningful/persisted.
1455
1734
  autoGrantRequestCards: entry.autoGrantRequestCards === false ? false : undefined,
@@ -1466,6 +1745,12 @@ export function parseBotConfigsFromText(jsonText) {
1466
1745
  // Preserve '' distinctly from undefined: '' means "brand off", undefined
1467
1746
  // means "use default botmux brand". Don't trim-to-undefined here.
1468
1747
  brandLabel: typeof entry.brandLabel === 'string' ? entry.brandLabel : undefined,
1748
+ // Persist only a non-default usage-display mode; 'streaming' (default) and
1749
+ // an absent key both mean streaming. Legacy showUsageInCardFooter:false is
1750
+ // still honored on read (see normalizeUsageDisplay) but never re-emitted.
1751
+ usageDisplay: normalizeUsageDisplay(entry) === DEFAULT_USAGE_DISPLAY
1752
+ ? undefined
1753
+ : normalizeUsageDisplay(entry),
1469
1754
  disableStreamingCard: entry.disableStreamingCard === true || undefined,
1470
1755
  silentTurnReactions: entry.silentTurnReactions === true || undefined,
1471
1756
  receivedReactionEmoji: typeof entry.receivedReactionEmoji === 'string' && entry.receivedReactionEmoji.trim()
@@ -1492,6 +1777,7 @@ export function parseBotConfigsFromText(jsonText) {
1492
1777
  ? entry.autoStartOnGroupJoinPrompt
1493
1778
  : undefined,
1494
1779
  autoStartOnNewTopic: entry.autoStartOnNewTopic === true || undefined,
1780
+ messageListeners,
1495
1781
  worktreeMultiPicker: entry.worktreeMultiPicker === true || undefined,
1496
1782
  // Per-bot regular-group default mode. Default is 'chat-topic' (顶层平铺
1497
1783
  // 连续会话;群内原生话题各自独立会话), so only the NON-default modes