botmux 3.10.0 → 3.11.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 (539) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/herdr-backend.d.ts +4 -3
  3. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/herdr-backend.js +11 -8
  5. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  6. package/dist/adapters/backend/pty-backend.d.ts +1 -1
  7. package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
  8. package/dist/adapters/backend/pty-backend.js +4 -1
  9. package/dist/adapters/backend/pty-backend.js.map +1 -1
  10. package/dist/adapters/backend/riff-backend.d.ts +29 -5
  11. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/riff-backend.js +302 -31
  13. package/dist/adapters/backend/riff-backend.js.map +1 -1
  14. package/dist/adapters/backend/sandbox.d.ts +6 -0
  15. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  16. package/dist/adapters/backend/sandbox.js +7 -0
  17. package/dist/adapters/backend/sandbox.js.map +1 -1
  18. package/dist/adapters/backend/tmux-backend.d.ts +1 -1
  19. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  20. package/dist/adapters/backend/tmux-backend.js +4 -1
  21. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  22. package/dist/adapters/backend/tmux-pipe-backend.d.ts +1 -1
  23. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  24. package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
  25. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  26. package/dist/adapters/backend/types.d.ts +37 -3
  27. package/dist/adapters/backend/types.d.ts.map +1 -1
  28. package/dist/adapters/backend/types.js.map +1 -1
  29. package/dist/adapters/backend/zellij-backend.d.ts +3 -3
  30. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  31. package/dist/adapters/backend/zellij-backend.js +9 -3
  32. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  33. package/dist/adapters/backend/zellij-observe-backend.d.ts +3 -3
  34. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
  35. package/dist/adapters/backend/zellij-observe-backend.js +12 -7
  36. package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
  37. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  38. package/dist/adapters/cli/codex-app.js +11 -2
  39. package/dist/adapters/cli/codex-app.js.map +1 -1
  40. package/dist/adapters/cli/read-isolation.d.ts +35 -2
  41. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  42. package/dist/adapters/cli/read-isolation.js +88 -7
  43. package/dist/adapters/cli/read-isolation.js.map +1 -1
  44. package/dist/adapters/cli/runner-input.d.ts +15 -14
  45. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  46. package/dist/adapters/cli/runner-input.js +64 -26
  47. package/dist/adapters/cli/runner-input.js.map +1 -1
  48. package/dist/adapters/cli/types.d.ts +20 -5
  49. package/dist/adapters/cli/types.d.ts.map +1 -1
  50. package/dist/bot-registry.d.ts +24 -0
  51. package/dist/bot-registry.d.ts.map +1 -1
  52. package/dist/bot-registry.js +110 -5
  53. package/dist/bot-registry.js.map +1 -1
  54. package/dist/cli/fleet-shutdown.d.ts +47 -0
  55. package/dist/cli/fleet-shutdown.d.ts.map +1 -0
  56. package/dist/cli/fleet-shutdown.js +387 -0
  57. package/dist/cli/fleet-shutdown.js.map +1 -0
  58. package/dist/cli/pm2-descriptor-guard.d.ts +19 -0
  59. package/dist/cli/pm2-descriptor-guard.d.ts.map +1 -0
  60. package/dist/cli/pm2-descriptor-guard.js +122 -0
  61. package/dist/cli/pm2-descriptor-guard.js.map +1 -0
  62. package/dist/cli/pm2-exact-start.d.ts +16 -0
  63. package/dist/cli/pm2-exact-start.d.ts.map +1 -0
  64. package/dist/cli/pm2-exact-start.js +63 -0
  65. package/dist/cli/pm2-exact-start.js.map +1 -0
  66. package/dist/cli/pm2-god-admission.d.ts +8 -0
  67. package/dist/cli/pm2-god-admission.d.ts.map +1 -0
  68. package/dist/cli/pm2-god-admission.js +25 -0
  69. package/dist/cli/pm2-god-admission.js.map +1 -0
  70. package/dist/cli/pm2-jlist.d.ts +13 -0
  71. package/dist/cli/pm2-jlist.d.ts.map +1 -0
  72. package/dist/cli/pm2-jlist.js +108 -0
  73. package/dist/cli/pm2-jlist.js.map +1 -0
  74. package/dist/cli/pm2-preflight.d.ts +10 -0
  75. package/dist/cli/pm2-preflight.d.ts.map +1 -0
  76. package/dist/cli/pm2-preflight.js +23 -0
  77. package/dist/cli/pm2-preflight.js.map +1 -0
  78. package/dist/cli/pm2-shutdown-capability.d.ts +27 -0
  79. package/dist/cli/pm2-shutdown-capability.d.ts.map +1 -0
  80. package/dist/cli/pm2-shutdown-capability.js +161 -0
  81. package/dist/cli/pm2-shutdown-capability.js.map +1 -0
  82. package/dist/cli/pm2-start-transaction.d.ts +55 -0
  83. package/dist/cli/pm2-start-transaction.d.ts.map +1 -0
  84. package/dist/cli/pm2-start-transaction.js +220 -0
  85. package/dist/cli/pm2-start-transaction.js.map +1 -0
  86. package/dist/cli/send-dispatch.d.ts +12 -0
  87. package/dist/cli/send-dispatch.d.ts.map +1 -1
  88. package/dist/cli/send-dispatch.js +31 -4
  89. package/dist/cli/send-dispatch.js.map +1 -1
  90. package/dist/cli/session-list-liveness.d.ts +1 -0
  91. package/dist/cli/session-list-liveness.d.ts.map +1 -1
  92. package/dist/cli/session-list-liveness.js +6 -0
  93. package/dist/cli/session-list-liveness.js.map +1 -1
  94. package/dist/cli/session-picker-layout.d.ts +26 -0
  95. package/dist/cli/session-picker-layout.d.ts.map +1 -0
  96. package/dist/cli/session-picker-layout.js +123 -0
  97. package/dist/cli/session-picker-layout.js.map +1 -0
  98. package/dist/cli/session-picker-viewport.d.ts +49 -0
  99. package/dist/cli/session-picker-viewport.d.ts.map +1 -0
  100. package/dist/cli/session-picker-viewport.js +46 -0
  101. package/dist/cli/session-picker-viewport.js.map +1 -0
  102. package/dist/cli/supervisor-shutdown-client.d.ts +31 -0
  103. package/dist/cli/supervisor-shutdown-client.d.ts.map +1 -0
  104. package/dist/cli/supervisor-shutdown-client.js +146 -0
  105. package/dist/cli/supervisor-shutdown-client.js.map +1 -0
  106. package/dist/cli/terminal-width.d.ts +48 -0
  107. package/dist/cli/terminal-width.d.ts.map +1 -0
  108. package/dist/cli/terminal-width.js +119 -0
  109. package/dist/cli/terminal-width.js.map +1 -0
  110. package/dist/cli/vc-agent.d.ts.map +1 -1
  111. package/dist/cli/vc-agent.js +1 -1
  112. package/dist/cli/vc-agent.js.map +1 -1
  113. package/dist/cli.d.ts.map +1 -1
  114. package/dist/cli.js +2269 -716
  115. package/dist/cli.js.map +1 -1
  116. package/dist/codex-app-runner.js +1630 -125
  117. package/dist/codex-app-runner.js.map +1 -1
  118. package/dist/core/ask-api.d.ts +8 -1
  119. package/dist/core/ask-api.d.ts.map +1 -1
  120. package/dist/core/ask-api.js +18 -0
  121. package/dist/core/ask-api.js.map +1 -1
  122. package/dist/core/ask-broker.d.ts +20 -0
  123. package/dist/core/ask-broker.d.ts.map +1 -1
  124. package/dist/core/ask-broker.js +467 -47
  125. package/dist/core/ask-broker.js.map +1 -1
  126. package/dist/core/ask-persist-store.d.ts +126 -0
  127. package/dist/core/ask-persist-store.d.ts.map +1 -0
  128. package/dist/core/ask-persist-store.js +188 -0
  129. package/dist/core/ask-persist-store.js.map +1 -0
  130. package/dist/core/ask-types.d.ts +80 -0
  131. package/dist/core/ask-types.d.ts.map +1 -1
  132. package/dist/core/ask-types.js +62 -0
  133. package/dist/core/ask-types.js.map +1 -1
  134. package/dist/core/cli-session-id-publisher.d.ts +20 -0
  135. package/dist/core/cli-session-id-publisher.d.ts.map +1 -0
  136. package/dist/core/cli-session-id-publisher.js +21 -0
  137. package/dist/core/cli-session-id-publisher.js.map +1 -0
  138. package/dist/core/command-handler.d.ts.map +1 -1
  139. package/dist/core/command-handler.js +427 -255
  140. package/dist/core/command-handler.js.map +1 -1
  141. package/dist/core/cost-calculator.d.ts +13 -0
  142. package/dist/core/cost-calculator.d.ts.map +1 -1
  143. package/dist/core/cost-calculator.js +385 -26
  144. package/dist/core/cost-calculator.js.map +1 -1
  145. package/dist/core/dashboard-ipc-server.d.ts +9 -0
  146. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  147. package/dist/core/dashboard-ipc-server.js +842 -288
  148. package/dist/core/dashboard-ipc-server.js.map +1 -1
  149. package/dist/core/explicit-session-backing-cleanup.d.ts +49 -0
  150. package/dist/core/explicit-session-backing-cleanup.d.ts.map +1 -0
  151. package/dist/core/explicit-session-backing-cleanup.js +76 -0
  152. package/dist/core/explicit-session-backing-cleanup.js.map +1 -0
  153. package/dist/core/idle-worker-sweeper.d.ts +20 -0
  154. package/dist/core/idle-worker-sweeper.d.ts.map +1 -1
  155. package/dist/core/idle-worker-sweeper.js +18 -0
  156. package/dist/core/idle-worker-sweeper.js.map +1 -1
  157. package/dist/core/inflight-input-tracker.d.ts +10 -0
  158. package/dist/core/inflight-input-tracker.d.ts.map +1 -1
  159. package/dist/core/inflight-input-tracker.js +7 -0
  160. package/dist/core/inflight-input-tracker.js.map +1 -1
  161. package/dist/core/managed-origin-attestation.d.ts +51 -0
  162. package/dist/core/managed-origin-attestation.d.ts.map +1 -0
  163. package/dist/core/managed-origin-attestation.js +208 -0
  164. package/dist/core/managed-origin-attestation.js.map +1 -0
  165. package/dist/core/managed-origin-capability.d.ts +62 -3
  166. package/dist/core/managed-origin-capability.d.ts.map +1 -1
  167. package/dist/core/managed-origin-capability.js +419 -9
  168. package/dist/core/managed-origin-capability.js.map +1 -1
  169. package/dist/core/pending-repo-journal.d.ts +6 -0
  170. package/dist/core/pending-repo-journal.d.ts.map +1 -0
  171. package/dist/core/pending-repo-journal.js +85 -0
  172. package/dist/core/pending-repo-journal.js.map +1 -0
  173. package/dist/core/persistent-backend.d.ts +6 -1
  174. package/dist/core/persistent-backend.d.ts.map +1 -1
  175. package/dist/core/persistent-backend.js +12 -6
  176. package/dist/core/persistent-backend.js.map +1 -1
  177. package/dist/core/process-start-identity.d.ts +3 -0
  178. package/dist/core/process-start-identity.d.ts.map +1 -0
  179. package/dist/core/process-start-identity.js +62 -0
  180. package/dist/core/process-start-identity.js.map +1 -0
  181. package/dist/core/raw-command-writer.d.ts +34 -0
  182. package/dist/core/raw-command-writer.d.ts.map +1 -0
  183. package/dist/core/raw-command-writer.js +48 -0
  184. package/dist/core/raw-command-writer.js.map +1 -0
  185. package/dist/core/reply-target.d.ts +85 -22
  186. package/dist/core/reply-target.d.ts.map +1 -1
  187. package/dist/core/reply-target.js +267 -32
  188. package/dist/core/reply-target.js.map +1 -1
  189. package/dist/core/resource-monitor/runtime.d.ts.map +1 -1
  190. package/dist/core/resource-monitor/runtime.js +4 -1
  191. package/dist/core/resource-monitor/runtime.js.map +1 -1
  192. package/dist/core/restart-report.d.ts +6 -1
  193. package/dist/core/restart-report.d.ts.map +1 -1
  194. package/dist/core/restart-report.js +22 -4
  195. package/dist/core/restart-report.js.map +1 -1
  196. package/dist/core/riff-shutdown-detach.d.ts +164 -0
  197. package/dist/core/riff-shutdown-detach.d.ts.map +1 -0
  198. package/dist/core/riff-shutdown-detach.js +787 -0
  199. package/dist/core/riff-shutdown-detach.js.map +1 -0
  200. package/dist/core/riff-worker-shutdown-readiness.d.ts +17 -0
  201. package/dist/core/riff-worker-shutdown-readiness.d.ts.map +1 -0
  202. package/dist/core/riff-worker-shutdown-readiness.js +21 -0
  203. package/dist/core/riff-worker-shutdown-readiness.js.map +1 -0
  204. package/dist/core/session-manager.d.ts +6 -6
  205. package/dist/core/session-manager.d.ts.map +1 -1
  206. package/dist/core/session-manager.js +1227 -594
  207. package/dist/core/session-manager.js.map +1 -1
  208. package/dist/core/session-marker.d.ts +1 -1
  209. package/dist/core/session-marker.d.ts.map +1 -1
  210. package/dist/core/session-marker.js +2 -2
  211. package/dist/core/session-marker.js.map +1 -1
  212. package/dist/core/session-mutation-guard.d.ts +17 -0
  213. package/dist/core/session-mutation-guard.d.ts.map +1 -0
  214. package/dist/core/session-mutation-guard.js +33 -0
  215. package/dist/core/session-mutation-guard.js.map +1 -0
  216. package/dist/core/shutdown-budgets.d.ts +27 -0
  217. package/dist/core/shutdown-budgets.d.ts.map +1 -0
  218. package/dist/core/shutdown-budgets.js +47 -0
  219. package/dist/core/shutdown-budgets.js.map +1 -0
  220. package/dist/core/supervisor-shutdown-ipc.d.ts +10 -0
  221. package/dist/core/supervisor-shutdown-ipc.d.ts.map +1 -0
  222. package/dist/core/supervisor-shutdown-ipc.js +10 -0
  223. package/dist/core/supervisor-shutdown-ipc.js.map +1 -0
  224. package/dist/core/supervisor-shutdown-protocol.d.ts +16 -0
  225. package/dist/core/supervisor-shutdown-protocol.d.ts.map +1 -0
  226. package/dist/core/supervisor-shutdown-protocol.js +16 -0
  227. package/dist/core/supervisor-shutdown-protocol.js.map +1 -0
  228. package/dist/core/trigger-final-suppression.d.ts +4 -0
  229. package/dist/core/trigger-final-suppression.d.ts.map +1 -1
  230. package/dist/core/trigger-final-suppression.js +6 -11
  231. package/dist/core/trigger-final-suppression.js.map +1 -1
  232. package/dist/core/trigger-session.d.ts +70 -0
  233. package/dist/core/trigger-session.d.ts.map +1 -1
  234. package/dist/core/trigger-session.js +923 -145
  235. package/dist/core/trigger-session.js.map +1 -1
  236. package/dist/core/types.d.ts +94 -1
  237. package/dist/core/types.d.ts.map +1 -1
  238. package/dist/core/types.js +9 -0
  239. package/dist/core/types.js.map +1 -1
  240. package/dist/core/worker-pool.d.ts +194 -13
  241. package/dist/core/worker-pool.d.ts.map +1 -1
  242. package/dist/core/worker-pool.js +2597 -547
  243. package/dist/core/worker-pool.js.map +1 -1
  244. package/dist/daemon.d.ts +76 -2
  245. package/dist/daemon.d.ts.map +1 -1
  246. package/dist/daemon.js +2255 -773
  247. package/dist/daemon.js.map +1 -1
  248. package/dist/dashboard/bot-payload.d.ts +20 -0
  249. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  250. package/dist/dashboard/bot-payload.js +24 -0
  251. package/dist/dashboard/bot-payload.js.map +1 -1
  252. package/dist/dashboard/feed-groups.d.ts +17 -0
  253. package/dist/dashboard/feed-groups.d.ts.map +1 -0
  254. package/dist/dashboard/feed-groups.js +75 -0
  255. package/dist/dashboard/feed-groups.js.map +1 -0
  256. package/dist/dashboard/session-card-model.d.ts +1 -1
  257. package/dist/dashboard/session-card-model.d.ts.map +1 -1
  258. package/dist/dashboard/session-card-model.js +8 -5
  259. package/dist/dashboard/session-card-model.js.map +1 -1
  260. package/dist/dashboard/web/bot-defaults-page.d.ts +4 -0
  261. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  262. package/dist/dashboard/web/bot-defaults-page.js +139 -46
  263. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  264. package/dist/dashboard/web/bot-defaults.d.ts +4 -0
  265. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  266. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  267. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  268. package/dist/dashboard/web/connectors-page.js +40 -3
  269. package/dist/dashboard/web/connectors-page.js.map +1 -1
  270. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  271. package/dist/dashboard/web/groups-page.js +95 -2
  272. package/dist/dashboard/web/groups-page.js.map +1 -1
  273. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  274. package/dist/dashboard/web/i18n.js +86 -40
  275. package/dist/dashboard/web/i18n.js.map +1 -1
  276. package/dist/dashboard/web/kanban-model.js +1 -1
  277. package/dist/dashboard/web/kanban-model.js.map +1 -1
  278. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  279. package/dist/dashboard/web/overview-page.js +3 -2
  280. package/dist/dashboard/web/overview-page.js.map +1 -1
  281. package/dist/dashboard/web/overview.d.ts +3 -0
  282. package/dist/dashboard/web/overview.d.ts.map +1 -1
  283. package/dist/dashboard/web/overview.js +2 -0
  284. package/dist/dashboard/web/overview.js.map +1 -1
  285. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  286. package/dist/dashboard/web/sessions-kanban.js +2 -0
  287. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  288. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  289. package/dist/dashboard/web/sessions-page.js +103 -2
  290. package/dist/dashboard/web/sessions-page.js.map +1 -1
  291. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  292. package/dist/dashboard/web/sessions.js +3 -2
  293. package/dist/dashboard/web/sessions.js.map +1 -1
  294. package/dist/dashboard/web/ui.d.ts +8 -0
  295. package/dist/dashboard/web/ui.d.ts.map +1 -1
  296. package/dist/dashboard/web/ui.js +15 -0
  297. package/dist/dashboard/web/ui.js.map +1 -1
  298. package/dist/dashboard-web/app.js +1 -1
  299. package/dist/dashboard-web/chunks/bot-defaults-page-GED4FEMS.js +10 -0
  300. package/dist/dashboard-web/chunks/chunk-6J5LS5AU.js +51 -0
  301. package/dist/dashboard-web/chunks/{chunk-ZU3UUKAR.js → chunk-HK7NIBJG.js} +1 -1
  302. package/dist/dashboard-web/chunks/{chunk-3UE7S77S.js → chunk-KRHWZEXU.js} +1 -1
  303. package/dist/dashboard-web/chunks/chunk-VBXJOJFH.js +1 -0
  304. package/dist/dashboard-web/chunks/connectors-page-EELM66G3.js +1 -0
  305. package/dist/dashboard-web/chunks/groups-page-WKUV6E42.js +8 -0
  306. package/dist/dashboard-web/chunks/{insights-page-T2ZX2RWL.js → insights-page-54UBPPOC.js} +1 -1
  307. package/dist/dashboard-web/chunks/{monitor-room-YNVBAGR6.js → monitor-room-PORHVKRH.js} +1 -1
  308. package/dist/dashboard-web/chunks/{monitoring-page-LHM55YWN.js → monitoring-page-XGA7AXNL.js} +1 -1
  309. package/dist/dashboard-web/chunks/{office-page-ATXVP7PW.js → office-page-AO3AFG45.js} +1 -1
  310. package/dist/dashboard-web/chunks/overview-page-F5BUTYR6.js +1 -0
  311. package/dist/dashboard-web/chunks/{roles-page-56VWM6CD.js → roles-page-M5GIASJU.js} +1 -1
  312. package/dist/dashboard-web/chunks/{schedules-page-S5K6U4EO.js → schedules-page-O232WQRR.js} +1 -1
  313. package/dist/dashboard-web/chunks/sessions-page-YFRPSTIL.js +6 -0
  314. package/dist/dashboard-web/chunks/{settings-page-QUZDQARR.js → settings-page-OJAZLZQT.js} +1 -1
  315. package/dist/dashboard-web/chunks/{skills-page-IFY7AEND.js → skills-page-EFZQPWV4.js} +1 -1
  316. package/dist/dashboard-web/chunks/{team-federation-page-C7FJQPFZ.js → team-federation-page-ZJVAP7HW.js} +1 -1
  317. package/dist/dashboard-web/chunks/{v3-page-2LMF3WWR.js → v3-page-GYWTRGO2.js} +1 -1
  318. package/dist/dashboard-web/chunks/{whiteboards-page-3XC6QRMY.js → whiteboards-page-MSDAG6P7.js} +1 -1
  319. package/dist/dashboard-web/style.css +255 -0
  320. package/dist/dashboard.js +172 -7
  321. package/dist/dashboard.js.map +1 -1
  322. package/dist/desktop/renderer/app.js +21 -0
  323. package/dist/desktop/renderer/app.js.map +1 -1
  324. package/dist/i18n/en.d.ts.map +1 -1
  325. package/dist/i18n/en.js +35 -9
  326. package/dist/i18n/en.js.map +1 -1
  327. package/dist/i18n/zh.d.ts.map +1 -1
  328. package/dist/i18n/zh.js +35 -9
  329. package/dist/i18n/zh.js.map +1 -1
  330. package/dist/im/lark/ask-card.d.ts +23 -0
  331. package/dist/im/lark/ask-card.d.ts.map +1 -1
  332. package/dist/im/lark/ask-card.js +94 -4
  333. package/dist/im/lark/ask-card.js.map +1 -1
  334. package/dist/im/lark/card-builder.d.ts +6 -1
  335. package/dist/im/lark/card-builder.d.ts.map +1 -1
  336. package/dist/im/lark/card-builder.js +112 -15
  337. package/dist/im/lark/card-builder.js.map +1 -1
  338. package/dist/im/lark/card-handler.d.ts +1 -1
  339. package/dist/im/lark/card-handler.d.ts.map +1 -1
  340. package/dist/im/lark/card-handler.js +496 -310
  341. package/dist/im/lark/card-handler.js.map +1 -1
  342. package/dist/im/lark/client.d.ts +7 -0
  343. package/dist/im/lark/client.d.ts.map +1 -1
  344. package/dist/im/lark/client.js +39 -26
  345. package/dist/im/lark/client.js.map +1 -1
  346. package/dist/im/lark/doc-comment.d.ts +7 -4
  347. package/dist/im/lark/doc-comment.d.ts.map +1 -1
  348. package/dist/im/lark/doc-comment.js +19 -6
  349. package/dist/im/lark/doc-comment.js.map +1 -1
  350. package/dist/im/lark/event-dispatcher.d.ts +16 -0
  351. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  352. package/dist/im/lark/event-dispatcher.js +88 -23
  353. package/dist/im/lark/event-dispatcher.js.map +1 -1
  354. package/dist/im/lark/forward-followup-content.d.ts.map +1 -1
  355. package/dist/im/lark/forward-followup-content.js +9 -1
  356. package/dist/im/lark/forward-followup-content.js.map +1 -1
  357. package/dist/im/lark/grant-command.d.ts.map +1 -1
  358. package/dist/im/lark/grant-command.js +7 -4
  359. package/dist/im/lark/grant-command.js.map +1 -1
  360. package/dist/im/lark/md-card.d.ts +11 -0
  361. package/dist/im/lark/md-card.d.ts.map +1 -1
  362. package/dist/im/lark/md-card.js +46 -0
  363. package/dist/im/lark/md-card.js.map +1 -1
  364. package/dist/im/lark/message-parser.d.ts +23 -2
  365. package/dist/im/lark/message-parser.d.ts.map +1 -1
  366. package/dist/im/lark/message-parser.js +58 -3
  367. package/dist/im/lark/message-parser.js.map +1 -1
  368. package/dist/im/lark/overview-card.d.ts.map +1 -1
  369. package/dist/im/lark/overview-card.js +2 -1
  370. package/dist/im/lark/overview-card.js.map +1 -1
  371. package/dist/services/async-trigger-state.d.ts +6 -1
  372. package/dist/services/async-trigger-state.d.ts.map +1 -1
  373. package/dist/services/async-trigger-state.js +21 -0
  374. package/dist/services/async-trigger-state.js.map +1 -1
  375. package/dist/services/async-trigger-store.d.ts +23 -1
  376. package/dist/services/async-trigger-store.d.ts.map +1 -1
  377. package/dist/services/async-trigger-store.js +96 -13
  378. package/dist/services/async-trigger-store.js.map +1 -1
  379. package/dist/services/bridge-fallback-gate.d.ts +40 -0
  380. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  381. package/dist/services/bridge-fallback-gate.js +124 -24
  382. package/dist/services/bridge-fallback-gate.js.map +1 -1
  383. package/dist/services/codex-app-runner-protocol.d.ts +8 -0
  384. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
  385. package/dist/services/codex-app-runner-protocol.js +9 -2
  386. package/dist/services/codex-app-runner-protocol.js.map +1 -1
  387. package/dist/services/codex-bridge-queue.d.ts +1 -0
  388. package/dist/services/codex-bridge-queue.d.ts.map +1 -1
  389. package/dist/services/codex-bridge-queue.js +1 -0
  390. package/dist/services/codex-bridge-queue.js.map +1 -1
  391. package/dist/services/codex-service-tier.d.ts +2 -0
  392. package/dist/services/codex-service-tier.d.ts.map +1 -1
  393. package/dist/services/codex-service-tier.js +1 -0
  394. package/dist/services/codex-service-tier.js.map +1 -1
  395. package/dist/services/codex-transcript.d.ts +27 -0
  396. package/dist/services/codex-transcript.d.ts.map +1 -1
  397. package/dist/services/codex-transcript.js +340 -2
  398. package/dist/services/codex-transcript.js.map +1 -1
  399. package/dist/services/grant-policy.d.ts +3 -0
  400. package/dist/services/grant-policy.d.ts.map +1 -1
  401. package/dist/services/grant-policy.js +5 -0
  402. package/dist/services/grant-policy.js.map +1 -1
  403. package/dist/services/grant-prefs-store.d.ts +6 -3
  404. package/dist/services/grant-prefs-store.d.ts.map +1 -1
  405. package/dist/services/grant-prefs-store.js +42 -12
  406. package/dist/services/grant-prefs-store.js.map +1 -1
  407. package/dist/services/hook-runner.d.ts +20 -1
  408. package/dist/services/hook-runner.d.ts.map +1 -1
  409. package/dist/services/hook-runner.js +17 -13
  410. package/dist/services/hook-runner.js.map +1 -1
  411. package/dist/services/idempotency-store.d.ts +134 -0
  412. package/dist/services/idempotency-store.d.ts.map +1 -0
  413. package/dist/services/idempotency-store.js +299 -0
  414. package/dist/services/idempotency-store.js.map +1 -0
  415. package/dist/services/jsonl-cursor.d.ts +7 -3
  416. package/dist/services/jsonl-cursor.d.ts.map +1 -1
  417. package/dist/services/jsonl-cursor.js +55 -31
  418. package/dist/services/jsonl-cursor.js.map +1 -1
  419. package/dist/services/open-platform-rename.d.ts.map +1 -1
  420. package/dist/services/open-platform-rename.js +1 -108
  421. package/dist/services/open-platform-rename.js.map +1 -1
  422. package/dist/services/restart-intent-store.d.ts +22 -2
  423. package/dist/services/restart-intent-store.d.ts.map +1 -1
  424. package/dist/services/restart-intent-store.js +160 -18
  425. package/dist/services/restart-intent-store.js.map +1 -1
  426. package/dist/services/sandbox-store.d.ts +22 -0
  427. package/dist/services/sandbox-store.d.ts.map +1 -1
  428. package/dist/services/sandbox-store.js +37 -8
  429. package/dist/services/sandbox-store.js.map +1 -1
  430. package/dist/services/send-policy.d.ts +41 -33
  431. package/dist/services/send-policy.d.ts.map +1 -1
  432. package/dist/services/send-policy.js +39 -40
  433. package/dist/services/send-policy.js.map +1 -1
  434. package/dist/services/session-store.d.ts +66 -0
  435. package/dist/services/session-store.d.ts.map +1 -1
  436. package/dist/services/session-store.js +403 -67
  437. package/dist/services/session-store.js.map +1 -1
  438. package/dist/services/submit-notification.d.ts +3 -0
  439. package/dist/services/submit-notification.d.ts.map +1 -0
  440. package/dist/services/submit-notification.js +15 -0
  441. package/dist/services/submit-notification.js.map +1 -0
  442. package/dist/services/traex-transcript.d.ts +25 -2
  443. package/dist/services/traex-transcript.d.ts.map +1 -1
  444. package/dist/services/traex-transcript.js +133 -1
  445. package/dist/services/traex-transcript.js.map +1 -1
  446. package/dist/services/trigger-types.d.ts +13 -1
  447. package/dist/services/trigger-types.d.ts.map +1 -1
  448. package/dist/services/trigger-types.js +39 -0
  449. package/dist/services/trigger-types.js.map +1 -1
  450. package/dist/services/voice/index.d.ts +3 -2
  451. package/dist/services/voice/index.d.ts.map +1 -1
  452. package/dist/services/voice/index.js +5 -5
  453. package/dist/services/voice/index.js.map +1 -1
  454. package/dist/services/voice/openai.d.ts +2 -1
  455. package/dist/services/voice/openai.d.ts.map +1 -1
  456. package/dist/services/voice/openai.js +2 -1
  457. package/dist/services/voice/openai.js.map +1 -1
  458. package/dist/services/voice/sami.d.ts +5 -2
  459. package/dist/services/voice/sami.d.ts.map +1 -1
  460. package/dist/services/voice/sami.js +19 -4
  461. package/dist/services/voice/sami.js.map +1 -1
  462. package/dist/setup/bots-store.d.ts.map +1 -1
  463. package/dist/setup/bots-store.js +10 -4
  464. package/dist/setup/bots-store.js.map +1 -1
  465. package/dist/setup/lark-scopes.json +2 -0
  466. package/dist/setup/open-platform-automation.d.ts +9 -1
  467. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  468. package/dist/setup/open-platform-automation.js +44 -15
  469. package/dist/setup/open-platform-automation.js.map +1 -1
  470. package/dist/setup/open-platform-visibility.d.ts +42 -0
  471. package/dist/setup/open-platform-visibility.d.ts.map +1 -0
  472. package/dist/setup/open-platform-visibility.js +133 -0
  473. package/dist/setup/open-platform-visibility.js.map +1 -0
  474. package/dist/setup/verify-permissions.d.ts.map +1 -1
  475. package/dist/setup/verify-permissions.js +6 -0
  476. package/dist/setup/verify-permissions.js.map +1 -1
  477. package/dist/skills/definitions.js +2 -2
  478. package/dist/types.d.ts +290 -13
  479. package/dist/types.d.ts.map +1 -1
  480. package/dist/utils/bot-routing.d.ts +1 -0
  481. package/dist/utils/bot-routing.d.ts.map +1 -1
  482. package/dist/utils/bot-routing.js +1 -1
  483. package/dist/utils/bot-routing.js.map +1 -1
  484. package/dist/utils/child-env.d.ts +1 -1
  485. package/dist/utils/child-env.d.ts.map +1 -1
  486. package/dist/utils/child-env.js +9 -0
  487. package/dist/utils/child-env.js.map +1 -1
  488. package/dist/utils/codex-app-control.d.ts +438 -0
  489. package/dist/utils/codex-app-control.d.ts.map +1 -0
  490. package/dist/utils/codex-app-control.js +2336 -0
  491. package/dist/utils/codex-app-control.js.map +1 -0
  492. package/dist/utils/codex-app-dispatch-ledger.d.ts +78 -0
  493. package/dist/utils/codex-app-dispatch-ledger.d.ts.map +1 -0
  494. package/dist/utils/codex-app-dispatch-ledger.js +149 -0
  495. package/dist/utils/codex-app-dispatch-ledger.js.map +1 -0
  496. package/dist/utils/codex-app-turn-dispatch.d.ts +77 -0
  497. package/dist/utils/codex-app-turn-dispatch.d.ts.map +1 -0
  498. package/dist/utils/codex-app-turn-dispatch.js +141 -0
  499. package/dist/utils/codex-app-turn-dispatch.js.map +1 -0
  500. package/dist/utils/codex-app-turn-liveness.d.ts +125 -0
  501. package/dist/utils/codex-app-turn-liveness.d.ts.map +1 -0
  502. package/dist/utils/codex-app-turn-liveness.js +301 -0
  503. package/dist/utils/codex-app-turn-liveness.js.map +1 -0
  504. package/dist/utils/idle-detector.d.ts +12 -0
  505. package/dist/utils/idle-detector.d.ts.map +1 -1
  506. package/dist/utils/idle-detector.js +19 -0
  507. package/dist/utils/idle-detector.js.map +1 -1
  508. package/dist/utils/input-gate.d.ts +87 -0
  509. package/dist/utils/input-gate.d.ts.map +1 -1
  510. package/dist/utils/input-gate.js +86 -0
  511. package/dist/utils/input-gate.js.map +1 -1
  512. package/dist/utils/lark-upload.d.ts.map +1 -1
  513. package/dist/utils/lark-upload.js +52 -1
  514. package/dist/utils/lark-upload.js.map +1 -1
  515. package/dist/utils/pending-input-queue.d.ts +15 -0
  516. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  517. package/dist/utils/pending-input-queue.js +5 -1
  518. package/dist/utils/pending-input-queue.js.map +1 -1
  519. package/dist/utils/user-token.d.ts.map +1 -1
  520. package/dist/utils/user-token.js +53 -2
  521. package/dist/utils/user-token.js.map +1 -1
  522. package/dist/worker-ipc-preload.d.ts +12 -0
  523. package/dist/worker-ipc-preload.d.ts.map +1 -0
  524. package/dist/worker-ipc-preload.js +44 -0
  525. package/dist/worker-ipc-preload.js.map +1 -0
  526. package/dist/worker.js +2604 -325
  527. package/dist/worker.js.map +1 -1
  528. package/dist/workflows/v3/session-relay-client.d.ts +1 -0
  529. package/dist/workflows/v3/session-relay-client.d.ts.map +1 -1
  530. package/dist/workflows/v3/session-relay-client.js +12 -3
  531. package/dist/workflows/v3/session-relay-client.js.map +1 -1
  532. package/package.json +1 -1
  533. package/dist/dashboard-web/chunks/bot-defaults-page-LTVOUDIS.js +0 -10
  534. package/dist/dashboard-web/chunks/chunk-DCS35UMD.js +0 -1
  535. package/dist/dashboard-web/chunks/chunk-MFQPCVHY.js +0 -51
  536. package/dist/dashboard-web/chunks/connectors-page-5KWDIMKC.js +0 -1
  537. package/dist/dashboard-web/chunks/groups-page-FHOKYXMW.js +0 -8
  538. package/dist/dashboard-web/chunks/overview-page-QYI3KBDD.js +0 -1
  539. package/dist/dashboard-web/chunks/sessions-page-WBP4N7D2.js +0 -6
@@ -2287,6 +2287,7 @@ button.primary {
2287
2287
  .status-analyzing { background: var(--warning-soft); color: var(--warning); }
2288
2288
  .status-starting { background: var(--success-soft); color: var(--success); }
2289
2289
  .status-limited { background: var(--danger-soft); color: var(--danger); }
2290
+ .status-stalled { background: var(--danger-soft); color: var(--danger); }
2290
2291
 
2291
2292
  /* ── Sessions board — "control-room signal wall" ─────────────────────────────
2292
2293
  Each column is a signal channel: a LED dot + uppercase channel label in the
@@ -4363,6 +4364,18 @@ td code,
4363
4364
  justify-content: flex-start;
4364
4365
  }
4365
4366
 
4367
+ #g-drawer.groups-create-modal .g-feed-group-new {
4368
+ display: grid;
4369
+ gap: 6px;
4370
+ margin-top: 10px;
4371
+ }
4372
+
4373
+ #g-drawer.groups-create-modal .g-feed-group-new > span {
4374
+ color: var(--muted);
4375
+ font-size: 12px;
4376
+ font-weight: 700;
4377
+ }
4378
+
4366
4379
  #g-drawer.groups-create-modal .g-create-status:empty {
4367
4380
  display: none;
4368
4381
  }
@@ -9201,6 +9214,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
9201
9214
  color: var(--warning);
9202
9215
  }
9203
9216
  .status-limited { background: var(--danger-soft); color: var(--danger); }
9217
+ .status-stalled { background: var(--danger-soft); color: var(--danger); }
9204
9218
 
9205
9219
  /* ── 玻璃面板(dark 下生效;light 保持实底)─────────────────────────────── */
9206
9220
  :root[data-theme="dark"] .panel,
@@ -9901,6 +9915,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
9901
9915
  border: 1px solid var(--border-soft);
9902
9916
  background: var(--surface);
9903
9917
  box-shadow: var(--shadow);
9918
+ position: relative;
9904
9919
  }
9905
9920
  :root[data-theme="dark"] .mate {
9906
9921
  background: rgba(255, 255, 255, 0.045);
@@ -9913,8 +9928,33 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
9913
9928
  }
9914
9929
  .mate-off { opacity: 0.55; }
9915
9930
  .mate-top { display: flex; align-items: center; gap: 11px; }
9931
+ .mate-console {
9932
+ position: absolute;
9933
+ top: 11px;
9934
+ right: 12px;
9935
+ display: inline-flex;
9936
+ align-items: center;
9937
+ justify-content: center;
9938
+ width: 26px;
9939
+ height: 26px;
9940
+ border-radius: 8px;
9941
+ color: var(--faint);
9942
+ background: var(--surface-muted);
9943
+ border: 1px solid var(--border-soft);
9944
+ text-decoration: none;
9945
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
9946
+ }
9947
+ .mate-console:hover {
9948
+ color: var(--accent);
9949
+ background: var(--accent-soft);
9950
+ border-color: color-mix(in srgb, var(--accent) 42%, transparent);
9951
+ }
9952
+ :root[data-theme="dark"] .mate-console { background: rgba(255, 255, 255, 0.07); border-color: rgba(255, 255, 255, 0.1); }
9916
9953
  .mate-id { min-width: 0; }
9917
9954
  .mate-id b { display: block; font-size: 14px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
9955
+ /* 只给名字这一行右侧留出 ↗ 按钮宽度:长名字(如「哆啦A(dev)-claude」)提前省略号,
9956
+ * 不会滑到绝对定位的按钮底下;cliId 标签在下一行、按钮只占顶部,均不受影响。 */
9957
+ .mate-console ~ .mate-top .mate-id b { padding-right: 24px; }
9918
9958
  .mate-role {
9919
9959
  display: inline-block;
9920
9960
  margin-top: 3px;
@@ -9946,6 +9986,15 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
9946
9986
  font-size: 11px;
9947
9987
  color: var(--faint);
9948
9988
  }
9989
+ /* 右侧活跃时间不换行、不被长状态 tag(如「执行中 · N 会话」)挤成两行;
9990
+ * 窄卡 + 双长文本时由状态 tag 收缩省略来吸收溢出(时间短、优先保住)。 */
9991
+ .mate-foot > span { white-space: nowrap; flex: 0 0 auto; }
9992
+ .mate-foot .tag {
9993
+ min-width: 0;
9994
+ flex: 0 1 auto;
9995
+ overflow: hidden;
9996
+ text-overflow: ellipsis;
9997
+ }
9949
9998
  .tag {
9950
9999
  padding: 3px 10px;
9951
10000
  border-radius: var(--radius-sm);
@@ -10514,6 +10563,22 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
10514
10563
  color: var(--faint);
10515
10564
  font-size: 10.5px;
10516
10565
  }
10566
+ .bd-profile-appid-row {
10567
+ display: flex;
10568
+ align-items: center;
10569
+ gap: 10px;
10570
+ flex-wrap: wrap;
10571
+ }
10572
+ .bd-console-link {
10573
+ display: inline-flex;
10574
+ align-items: center;
10575
+ gap: 3px;
10576
+ font-size: 11px;
10577
+ font-weight: 600;
10578
+ color: var(--accent);
10579
+ text-decoration: none;
10580
+ }
10581
+ .bd-console-link:hover { color: var(--accent-strong); text-decoration: underline; }
10517
10582
  /* 机器人改名(档案头 ✎ → 行内编辑器) */
10518
10583
  .bd-name-edit {
10519
10584
  position: absolute;
@@ -10599,6 +10664,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
10599
10664
  align-items: center;
10600
10665
  justify-content: center;
10601
10666
  padding: 20px;
10667
+ overflow: auto;
10602
10668
  background: var(--modal-backdrop);
10603
10669
  backdrop-filter: blur(3px);
10604
10670
  }
@@ -10606,6 +10672,11 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
10606
10672
  position: relative;
10607
10673
  display: grid;
10608
10674
  gap: 12px;
10675
+ /* margin:auto 让 modal 在极矮视口高于视口时,靠 overlay 的 overflow:auto 也能
10676
+ 完整滚到顶部。纯 flex 居中(align-items:center)下,超高子元素会上下等量溢出,
10677
+ 顶部溢出无法滚回(flexbox 通用行为),标题/关闭按钮够不着;auto margin 在负
10678
+ 可用空间下归 0、子元素落到滚动起点,正常视口仍由 auto margin 居中。 */
10679
+ margin: auto;
10609
10680
  width: min(360px, 92vw);
10610
10681
  padding: 18px;
10611
10682
  border-radius: var(--radius-lg);
@@ -23149,6 +23220,20 @@ dialog select[multiple]:hover:not(:disabled) {
23149
23220
  }
23150
23221
  .bot-defaults-page .toggle-row .switch {
23151
23222
  margin-top: 0;
23223
+ transition: background 140ms ease, transform 100ms ease;
23224
+ }
23225
+ .bot-defaults-page .toggle-row:active:not(:has(input:disabled)) .switch {
23226
+ transform: scale(0.96);
23227
+ }
23228
+ .bot-defaults-page .toggle-row input:focus-visible + .switch {
23229
+ outline: 2px solid var(--accent);
23230
+ outline-offset: 3px;
23231
+ }
23232
+ .bot-defaults-page .toggle-row:has(input:disabled) {
23233
+ cursor: not-allowed;
23234
+ }
23235
+ .bot-defaults-page .toggle-row input:disabled ~ .toggle-tx {
23236
+ color: var(--faint);
23152
23237
  }
23153
23238
 
23154
23239
  .bot-defaults-page .bd-tile :where(input[type="text"], input[type="number"], textarea) {
@@ -23231,6 +23316,117 @@ dialog select[multiple]:hover:not(:disabled) {
23231
23316
  margin: 0;
23232
23317
  }
23233
23318
 
23319
+ .bot-defaults-page .bd-grant-defaults {
23320
+ margin-top: 16px;
23321
+ }
23322
+
23323
+ .bot-defaults-page .bd-grant-defaults > .actions {
23324
+ justify-content: flex-end;
23325
+ }
23326
+
23327
+ .bot-defaults-page .bd-field-error {
23328
+ display: block;
23329
+ margin-top: 6px;
23330
+ color: var(--danger);
23331
+ font-size: 11px;
23332
+ line-height: 1.5;
23333
+ }
23334
+
23335
+ .bot-defaults-page .bd-grant-defaults input[aria-invalid="true"] {
23336
+ border-color: var(--danger);
23337
+ }
23338
+
23339
+ .bot-defaults-page .bd-card-settings {
23340
+ display: grid;
23341
+ gap: 16px;
23342
+ margin-top: 12px;
23343
+ }
23344
+
23345
+ .bot-defaults-page .bd-card-setting-group {
23346
+ min-width: 0;
23347
+ }
23348
+
23349
+ .bot-defaults-page .bd-card-setting-group + .bd-card-setting-group {
23350
+ padding-top: 16px;
23351
+ border-top: 1px solid color-mix(in srgb, var(--border-soft) 82%, transparent);
23352
+ }
23353
+
23354
+ .bot-defaults-page .bd-card-setting-heading {
23355
+ margin: 0 0 8px;
23356
+ color: var(--fg);
23357
+ font-size: 12px;
23358
+ font-weight: 700;
23359
+ line-height: 1.35;
23360
+ }
23361
+
23362
+ .bot-defaults-page .bd-card-setting-copy {
23363
+ margin: -2px 0 8px;
23364
+ color: var(--muted);
23365
+ font-size: 11.5px;
23366
+ line-height: 1.5;
23367
+ }
23368
+
23369
+ .bot-defaults-page .bd-card-settings .toggle-row {
23370
+ min-width: 0;
23371
+ margin: 0;
23372
+ }
23373
+
23374
+ .bot-defaults-page .bd-card-settings .toggle-tx small {
23375
+ display: block;
23376
+ overflow: visible;
23377
+ margin-top: 3px;
23378
+ color: var(--muted);
23379
+ font-size: 11.5px;
23380
+ line-height: 1.45;
23381
+ -webkit-box-orient: initial;
23382
+ -webkit-line-clamp: unset;
23383
+ }
23384
+
23385
+ .bot-defaults-page .bd-card-primary-toggle {
23386
+ padding: 4px 0;
23387
+ }
23388
+
23389
+ .bot-defaults-page .bd-card-dependent {
23390
+ display: grid;
23391
+ gap: 7px;
23392
+ margin: 8px 0 0 48px;
23393
+ padding: 10px 12px;
23394
+ border-left: 2px solid color-mix(in srgb, var(--accent) 58%, var(--border-soft));
23395
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
23396
+ background: color-mix(in srgb, var(--accent) 5%, transparent);
23397
+ }
23398
+
23399
+ .bot-defaults-page .bd-card-dependent[hidden] {
23400
+ display: none;
23401
+ }
23402
+
23403
+ .bot-defaults-page .bd-card-dependent .toggle-row {
23404
+ padding: 0;
23405
+ }
23406
+
23407
+ .bot-defaults-page .bd-card-mode-note {
23408
+ margin: 0 0 0 48px;
23409
+ color: var(--muted);
23410
+ font-size: 11.5px;
23411
+ line-height: 1.5;
23412
+ }
23413
+
23414
+ .bot-defaults-page .bd-card-setting-group > .bd-row {
23415
+ margin-top: 0;
23416
+ }
23417
+
23418
+ .bot-defaults-page .bd-card-control-list {
23419
+ display: grid;
23420
+ gap: 10px;
23421
+ margin-top: 10px;
23422
+ }
23423
+
23424
+ @media (prefers-reduced-motion: reduce) {
23425
+ .bot-defaults-page .toggle-row .switch {
23426
+ transition: none;
23427
+ }
23428
+ }
23429
+
23234
23430
  .bot-defaults-page .bd-substitute-target-list {
23235
23431
  display: grid;
23236
23432
  gap: 8px;
@@ -23333,6 +23529,10 @@ dialog select[multiple]:hover:not(:disabled) {
23333
23529
  grid-template-columns: 1fr;
23334
23530
  }
23335
23531
 
23532
+ .bot-defaults-page .bd-card-dependent {
23533
+ margin-left: 0;
23534
+ }
23535
+
23336
23536
  .bot-defaults-page .bd-runtime-fields {
23337
23537
  grid-template-columns: 1fr;
23338
23538
  }
@@ -25769,3 +25969,58 @@ button.ui-refresh-button.is-loading .ui-action-icon {
25769
25969
  color: var(--danger, #e5484d) !important;
25770
25970
  border-color: color-mix(in srgb, var(--danger, #e5484d) 48%, var(--border-soft)) !important;
25771
25971
  }
25972
+ .feed-group-auth-overlay {
25973
+ position: fixed;
25974
+ inset: 0;
25975
+ z-index: 10000;
25976
+ display: grid;
25977
+ place-items: center;
25978
+ padding: 20px;
25979
+ background: rgb(15 23 42 / 62%);
25980
+ }
25981
+
25982
+ .feed-group-auth-card {
25983
+ width: min(520px, 100%);
25984
+ padding: 24px;
25985
+ border: 1px solid var(--border);
25986
+ border-radius: 14px;
25987
+ background: var(--panel, #fff);
25988
+ color: #111827;
25989
+ box-shadow: 0 24px 70px rgb(0 0 0 / 28%);
25990
+ }
25991
+
25992
+ .feed-group-auth-card h3 { margin-top: 0; }
25993
+ .feed-group-auth-card p,
25994
+ .feed-group-auth-card label,
25995
+ .feed-group-auth-card label span { color: #111827; }
25996
+ .feed-group-auth-card label { display: grid; gap: 8px; margin-top: 18px; }
25997
+ .feed-group-auth-card input { width: 100%; box-sizing: border-box; color: #111827; background: #fff; }
25998
+ .feed-group-auth-card input::placeholder { color: #4b5563; opacity: 1; }
25999
+ .feed-group-auth-card .actions { margin-top: 20px; justify-content: flex-end; }
26000
+ .feed-group-auth-open {
26001
+ display: inline-flex;
26002
+ align-items: center;
26003
+ justify-content: center;
26004
+ min-height: 42px;
26005
+ margin-top: 4px;
26006
+ padding: 0 20px;
26007
+ border: 1px solid #2563eb;
26008
+ border-radius: 8px;
26009
+ color: #fff;
26010
+ background: #2563eb;
26011
+ font-weight: 700;
26012
+ cursor: pointer;
26013
+ }
26014
+
26015
+ .feed-group-auth-open:hover { background: #1d4ed8; }
26016
+
26017
+ .cs-advanced-fields .cs-feed-group {
26018
+ min-width: 0;
26019
+ margin: 0;
26020
+ padding: 0;
26021
+ border: 0;
26022
+ }
26023
+
26024
+ .cs-advanced-fields .cs-feed-group > legend {
26025
+ padding: 0;
26026
+ }
package/dist/dashboard.js CHANGED
@@ -64,12 +64,14 @@ import { hd2dAssetPath, hd2dStatus, startHd2dDownload } from './dashboard/hd2d-a
64
64
  import { buildSkillInstallAuditSummary, installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
65
65
  import { redactGitUrlCredentials } from './core/skills/sources.js';
66
66
  import { effectiveDefaultWorkingDir, getBot, loadBotConfigs, parseBotConfigsFromText } from './bot-registry.js';
67
+ import { addChatToFeedGroup, createFeedGroup, FEED_GROUP_SCOPES, FeedGroupApiError, listFeedGroups } from './dashboard/feed-groups.js';
68
+ import { generateAuthUrl, handleCallbackUrl, isCallbackUrl } from './utils/user-token.js';
67
69
  import { findEntryIndex, readRawConfig, requireConfigPath, writeRawConfigAtomic } from './services/config-store.js';
68
70
  import { emitCodexNotifierOutboxItem, installCodexNotifierHook, isCodexNotifierWorkerStateFresh, isCodexNotifierHookInstalled, listCodexNotifierOutbox, readCodexNotifierWorkerState, resolveCodexNotifierConfig, runCodexSideConversationMonitor, runCodexNotifierWorkerSupervisor, } from './features/codex-notifier/index.js';
69
71
  import { discoverNativeCliSkillGroups } from './core/skills/discovery.js';
70
72
  import { analyzeSkillReferences } from './core/skills/references.js';
71
73
  import { discoverDashboardSkills, installDashboardSkill, parseDashboardSkillInstallRequest, parseInstallLocalLinksSources, MAX_LOCAL_LINK_SOURCES } from './dashboard/skill-install-request.js';
72
- import { botDefaultsPayload, botSummaryPayload } from './dashboard/bot-payload.js';
74
+ import { botDefaultsPayload, botSummaryPayload, brandMapByAppId } from './dashboard/bot-payload.js';
73
75
  import { handleVcMeetingConsumerProfilesGet, handleVcMeetingConsumerProfilesPut, } from './dashboard/vc-consumer-profiles-api.js';
74
76
  import { buildVcMeetingConsumerBootstrapAgents, seedVcMeetingDefaultConsumerProfile, } from './services/vc-meeting-consumer-profile-bootstrap.js';
75
77
  import { evaluateVcMeetingConsumerIsolation } from './services/vc-meeting-consumer-isolation.js';
@@ -91,7 +93,7 @@ import { maybeInstallTraexPluginOnSettingsChange, TRAEX_RECOMMENDED_SOURCE, TRAE
91
93
  import { deriveCreateGroupName, selectCreateSessionTargets } from './core/session-create.js';
92
94
  import { parseDashboardImageUploads } from './core/dashboard-images.js';
93
95
  import { checkLarkCliVersion, MIN_LARK_CLI_VERSION_FOR_VC_BOT } from './vc-agent/polling-source.js';
94
- import { larkHosts } from './im/lark/lark-hosts.js';
96
+ import { larkHosts, normalizeBrand } from './im/lark/lark-hosts.js';
95
97
  import { buildResourceMonitorDaemonSeeds, createResourceMonitorService, handleResourceMonitorApi, toResourceMonitorSessionSeed } from './dashboard/resource-monitor-service.js';
96
98
  import { readPluginRegistry } from './services/plugin-registry-store.js';
97
99
  import { pluginRuntimeDir, resolvePluginPath } from './core/plugins/paths.js';
@@ -1857,6 +1859,15 @@ function configuredCliIds() {
1857
1859
  return new Map();
1858
1860
  }
1859
1861
  }
1862
+ /**
1863
+ * per-bot brand(feishu / lark)按 appId 的映射,供前端派生飞书后台深链 host。
1864
+ * 失败安全逻辑在 brandMapByAppId(返回空 Map,与 configuredCliIds /
1865
+ * configuredBotAgentFields 同款兜底,见其 doc)——冷缓存 /api/groups 与
1866
+ * /api/bots 仍走 DaemonRegistry 降级 roster,前端 normalizeBrand 兜底 feishu。
1867
+ */
1868
+ function configuredBrands() {
1869
+ return brandMapByAppId(loadBotConfigs);
1870
+ }
1860
1871
  function configuredBotAgentFields() {
1861
1872
  try {
1862
1873
  return new Map(loadBotConfigs().map(b => [b.larkAppId, {
@@ -2137,7 +2148,11 @@ async function buildGroupsMatrix() {
2137
2148
  return (a.name ?? a.chatId).localeCompare(b.name ?? b.chatId);
2138
2149
  })
2139
2150
  .map(({ _firstSeenAt, ...rest }) => rest);
2140
- const bots = onlineBots.map(botSummaryPayload);
2151
+ // brand 是 bots.json per-bot 字段(DaemonRegistry 的心跳态不带它),
2152
+ // 从 configuredBrands(失败安全,返空 Map)按 appId 补进 summary,供前端
2153
+ // 派生飞书后台深链 host;冷缓存 / 缺配置时前端 normalizeBrand 兜底 feishu。
2154
+ const brandByAppId = configuredBrands();
2155
+ const bots = onlineBots.map(d => botSummaryPayload({ ...d, brand: brandByAppId.get(d.larkAppId) }));
2141
2156
  return { chats, bots };
2142
2157
  }
2143
2158
  /**
@@ -4322,7 +4337,14 @@ const server = createServer(async (req, res) => {
4322
4337
  // PUT /api/bots/:appId/default-oncall — proxy to that bot's daemon
4323
4338
  if (req.method === 'GET' && url.pathname === '/api/bots') {
4324
4339
  const agentFields = configuredBotAgentFields();
4325
- const onlineBots = [...registry.list()].map(b => withConfiguredCliId(b, agentFields)).sort((a, b) => a.botIndex - b.botIndex);
4340
+ // brand bots.json per-bot 字段(DaemonRegistry 心跳态不带它),
4341
+ // 从 configuredBrands(失败安全,返空 Map)按 appId 补进每个 descriptor,
4342
+ // 供前端派生飞书后台深链 host;缺配置时前端 normalizeBrand 兜底 feishu。
4343
+ const brandByAppId = configuredBrands();
4344
+ const onlineBots = [...registry.list()]
4345
+ .map(b => withConfiguredCliId(b, agentFields))
4346
+ .map(b => ({ ...b, brand: brandByAppId.get(b.larkAppId) }))
4347
+ .sort((a, b) => a.botIndex - b.botIndex);
4326
4348
  const out = await Promise.all(onlineBots.map(async (d) => {
4327
4349
  try {
4328
4350
  const r = await fetchDaemonIpc(d.ipcPort, '/api/bot-default-oncall');
@@ -4759,7 +4781,7 @@ const server = createServer(async (req, res) => {
4759
4781
  }
4760
4782
  // PUT /api/bots/:appId/grant-prefs — proxy to that bot's daemon. Body carries
4761
4783
  // any subset of `{ restrictGrantCommands?: boolean, autoGrantRequestCards?: boolean,
4762
- // messageQuotaDefaultLimit?: number|null }`.
4784
+ // messageQuotaDefaultLimit?: number|null, grantDefaultDurationMs?: number|null }`.
4763
4785
  let mBotGrantPrefs;
4764
4786
  if (req.method === 'PUT' && (mBotGrantPrefs = url.pathname.match(/^\/api\/bots\/([^/]+)\/grant-prefs$/))) {
4765
4787
  const appId = decodeURIComponent(mBotGrantPrefs[1]);
@@ -4845,6 +4867,72 @@ const server = createServer(async (req, res) => {
4845
4867
  res.end(await upstream.text());
4846
4868
  return;
4847
4869
  }
4870
+ // Native Feishu/Lark conversation labels (feed groups). These APIs are
4871
+ // user-token-only, so the frontend pins subsequent create/assign calls to
4872
+ // the same app whose OAuth token produced this list.
4873
+ if (req.method === 'GET' && url.pathname === '/api/feed-groups/auth-url') {
4874
+ const appId = url.searchParams.get('larkAppId') ?? '';
4875
+ let bot;
4876
+ try {
4877
+ bot = loadBotConfigs().find(item => !item.apiOnly && (!appId || item.larkAppId === appId));
4878
+ }
4879
+ catch { /* handled below */ }
4880
+ if (!bot)
4881
+ return jsonRes(res, 404, { ok: false, error: 'bot_not_found' });
4882
+ const { authUrl } = generateAuthUrl(bot.larkAppId, bot.larkAppSecret, normalizeBrand(bot.brand), [...FEED_GROUP_SCOPES]);
4883
+ return jsonRes(res, 200, { ok: true, larkAppId: bot.larkAppId, authUrl });
4884
+ }
4885
+ if (req.method === 'POST' && url.pathname === '/api/feed-groups/oauth-callback') {
4886
+ let body;
4887
+ try {
4888
+ body = await readJsonBody(req);
4889
+ }
4890
+ catch {
4891
+ return jsonRes(res, 400, { ok: false, error: 'bad_json' });
4892
+ }
4893
+ const callbackUrl = typeof body.callbackUrl === 'string' ? body.callbackUrl.trim() : '';
4894
+ if (!isCallbackUrl(callbackUrl)) {
4895
+ return jsonRes(res, 400, { ok: false, error: 'invalid_callback_url', message: '请粘贴完整的 127.0.0.1 OAuth 回调 URL。' });
4896
+ }
4897
+ const message = await handleCallbackUrl(callbackUrl);
4898
+ const ok = typeof message === 'string' && message.startsWith('✅');
4899
+ return jsonRes(res, ok ? 200 : 400, { ok, error: ok ? undefined : 'oauth_exchange_failed', message });
4900
+ }
4901
+ if (req.method === 'GET' && url.pathname === '/api/feed-groups') {
4902
+ const requestedAppId = url.searchParams.get('larkAppId') ?? '';
4903
+ let bots;
4904
+ try {
4905
+ bots = loadBotConfigs().filter(bot => !bot.apiOnly);
4906
+ }
4907
+ catch {
4908
+ return jsonRes(res, 500, { ok: false, error: 'bot_config_unavailable' });
4909
+ }
4910
+ const ordered = requestedAppId
4911
+ ? [...bots.filter(bot => bot.larkAppId === requestedAppId), ...bots.filter(bot => bot.larkAppId !== requestedAppId)]
4912
+ : bots;
4913
+ let loginRequired = false;
4914
+ for (const bot of ordered) {
4915
+ try {
4916
+ const groups = await listFeedGroups(bot);
4917
+ return jsonRes(res, 200, { ok: true, larkAppId: bot.larkAppId, groups });
4918
+ }
4919
+ catch (error) {
4920
+ if (error instanceof FeedGroupApiError && error.code === 'user_login_required') {
4921
+ loginRequired = true;
4922
+ continue;
4923
+ }
4924
+ if (requestedAppId && bot.larkAppId === requestedAppId) {
4925
+ const e = error;
4926
+ return jsonRes(res, e.status ?? 502, { ok: false, error: e.code ?? 'feed_group_list_failed', message: e.message });
4927
+ }
4928
+ }
4929
+ }
4930
+ return jsonRes(res, loginRequired ? 401 : 503, {
4931
+ ok: false,
4932
+ error: loginRequired ? 'user_login_required' : 'feed_group_api_unavailable',
4933
+ message: loginRequired ? '尚未获得飞书标签权限,请点击「立即授权」按钮进行授权。' : '没有可用于读取标签的飞书机器人。',
4934
+ });
4935
+ }
4848
4936
  // Create a new chat — pick a creator from the user-selected larkAppIds
4849
4937
  // (Feishu makes the calling bot the implicit first member, so picking
4850
4938
  // anything else would silently add an unwanted bot). Auto-invite the
@@ -4938,6 +5026,26 @@ const server = createServer(async (req, res) => {
4938
5026
  else {
4939
5027
  upstreamJson.autoInvitedOpenId = autoInvited;
4940
5028
  }
5029
+ const existingFeedGroupId = typeof parsed.feedGroupId === 'string' ? parsed.feedGroupId.trim() : '';
5030
+ const newFeedGroupName = typeof parsed.newFeedGroupName === 'string' ? parsed.newFeedGroupName.trim() : '';
5031
+ const feedGroupAppId = typeof parsed.feedGroupAppId === 'string' ? parsed.feedGroupAppId.trim() : '';
5032
+ if (upstream.ok && upstreamJson.ok && typeof upstreamJson.chatId === 'string' && (existingFeedGroupId || newFeedGroupName)) {
5033
+ try {
5034
+ const feedBot = loadBotConfigs().find(bot => bot.larkAppId === feedGroupAppId && !bot.apiOnly);
5035
+ if (!feedBot) {
5036
+ upstreamJson.feedGroupError = '读取标签所用的机器人当前不可用。群聊已创建,但未加入标签。';
5037
+ }
5038
+ else {
5039
+ const targetId = existingFeedGroupId || await createFeedGroup(feedBot, newFeedGroupName);
5040
+ await addChatToFeedGroup(feedBot, targetId, upstreamJson.chatId);
5041
+ upstreamJson.feedGroupId = targetId;
5042
+ upstreamJson.feedGroupName = newFeedGroupName || undefined;
5043
+ }
5044
+ }
5045
+ catch (error) {
5046
+ upstreamJson.feedGroupError = error instanceof Error ? error.message : String(error);
5047
+ }
5048
+ }
4941
5049
  }
4942
5050
  if (upstream.ok && upstreamJson?.ok)
4943
5051
  groupsMatrixSnapshot.invalidate();
@@ -5034,11 +5142,31 @@ const server = createServer(async (req, res) => {
5034
5142
  }
5035
5143
  const chatId = groupResp.chatId;
5036
5144
  const invalidBotIds = Array.isArray(groupResp.invalidBotIds) ? groupResp.invalidBotIds : [];
5145
+ const existingFeedGroupId = typeof parsed.feedGroupId === 'string' ? parsed.feedGroupId.trim() : '';
5146
+ const newFeedGroupName = typeof parsed.newFeedGroupName === 'string' ? parsed.newFeedGroupName.trim() : '';
5147
+ let feedGroupId = '';
5148
+ let feedGroupError = '';
5149
+ if (existingFeedGroupId || newFeedGroupName) {
5150
+ const feedGroupAppId = typeof parsed.feedGroupAppId === 'string' ? parsed.feedGroupAppId.trim() : '';
5151
+ try {
5152
+ const feedBot = loadBotConfigs().find(bot => bot.larkAppId === feedGroupAppId && !bot.apiOnly);
5153
+ if (!feedBot) {
5154
+ feedGroupError = '读取标签所用的机器人当前不可用。';
5155
+ }
5156
+ else {
5157
+ feedGroupId = existingFeedGroupId || await createFeedGroup(feedBot, newFeedGroupName);
5158
+ await addChatToFeedGroup(feedBot, feedGroupId, chatId);
5159
+ }
5160
+ }
5161
+ catch (error) {
5162
+ feedGroupError = error instanceof Error ? error.message : String(error);
5163
+ }
5164
+ }
5037
5165
  // spawn 目标:lead 模式只有 lead;一起开工是所有成功入群的选中 bot。
5038
5166
  const joinedIds = selectedIds.filter(id => !invalidBotIds.includes(id) && !!registry.getByAppId(id));
5039
5167
  const targets = selectCreateSessionTargets(mode, joinedIds, creatorLarkAppId);
5040
5168
  if (targets.length === 0) {
5041
- return jsonRes(res, 200, { ok: true, chatId, shareLink: groupResp.shareLink, spawned: [], failed: [], warning: 'no_spawn_target' });
5169
+ return jsonRes(res, 200, { ok: true, chatId, shareLink: groupResp.shareLink, spawned: [], failed: [], warning: 'no_spawn_target', feedGroupId, feedGroupError });
5042
5170
  }
5043
5171
  const bots = liveBots();
5044
5172
  const nameOf = (id) => bots.find(b => b.larkAppId === id)?.botName ?? id;
@@ -5070,7 +5198,7 @@ const server = createServer(async (req, res) => {
5070
5198
  }
5071
5199
  }));
5072
5200
  return jsonRes(res, 200, {
5073
- ok: true, chatId, shareLink: groupResp.shareLink, mode, column, spawned, failed,
5201
+ ok: true, chatId, shareLink: groupResp.shareLink, mode, column, spawned, failed, feedGroupId, feedGroupError,
5074
5202
  });
5075
5203
  }
5076
5204
  // Public SSE — relays aggregator's listener events
@@ -5127,6 +5255,41 @@ const server = createServer(async (req, res) => {
5127
5255
  jsonRes(res, 500, { error: String(err) });
5128
5256
  }
5129
5257
  });
5258
+ // OAuth loopback callback for browsers running on the same machine as BotMux.
5259
+ // Remote-browser deployments cannot reach this loopback listener; their
5260
+ // Dashboard keeps the manual callback-URL paste flow as a fallback.
5261
+ const oauthCallbackServer = createServer(async (req, res) => {
5262
+ const url = new URL(req.url ?? '/', 'http://127.0.0.1:9768');
5263
+ if (req.method !== 'GET' || url.pathname !== '/callback') {
5264
+ res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' });
5265
+ return res.end('Not found');
5266
+ }
5267
+ let ok = false;
5268
+ try {
5269
+ const message = await handleCallbackUrl(url.toString());
5270
+ ok = typeof message === 'string' && message.startsWith('✅');
5271
+ }
5272
+ catch (error) {
5273
+ logger.warn(`[dashboard] OAuth loopback callback failed: ${error.message}`);
5274
+ }
5275
+ res.writeHead(ok ? 200 : 400, {
5276
+ 'content-type': 'text/html; charset=utf-8',
5277
+ 'cache-control': 'no-store',
5278
+ });
5279
+ return res.end(`<!doctype html><meta charset="utf-8"><title>${ok ? '授权成功' : '授权失败'}</title><style>body{font-family:system-ui,sans-serif;max-width:560px;margin:80px auto;padding:24px;color:#111827}h1{font-size:28px}</style><h1>${ok ? '授权成功' : '授权失败'}</h1><p>${ok ? 'BotMux 已完成授权。你可以关闭此页面并返回 Dashboard。' : '授权链接无效或已过期。请返回 Dashboard 后重新发起授权。'}</p>`);
5280
+ });
5281
+ oauthCallbackServer.on('error', error => {
5282
+ const code = error.code;
5283
+ if (code === 'EADDRINUSE') {
5284
+ logger.warn('[dashboard] OAuth loopback port 127.0.0.1:9768 is already in use; remote/manual callback fallback remains available');
5285
+ }
5286
+ else {
5287
+ logger.warn(`[dashboard] OAuth loopback server error: ${error.message}`);
5288
+ }
5289
+ });
5290
+ oauthCallbackServer.listen(9768, '127.0.0.1', () => {
5291
+ logger.info('[dashboard] OAuth loopback callback listening on 127.0.0.1:9768');
5292
+ });
5130
5293
  // Web terminal WebSocket reverse-proxy: bridge `/s/*` upgrade requests through to
5131
5294
  // the local terminal proxy (which in turn bridges to the session worker). Raw
5132
5295
  // socket-to-socket bridge: dial 127.0.0.1:<terminalProxyPort>, replay the upgrade
@@ -5478,6 +5641,8 @@ function shutdown() {
5478
5641
  resourceMonitor.stop();
5479
5642
  platformTunnel?.stop();
5480
5643
  debugTerminalManager.shutdown();
5644
+ if (oauthCallbackServer.listening)
5645
+ oauthCallbackServer.close();
5481
5646
  server.close(() => process.exit(gracefulProcessExitCode()));
5482
5647
  // Hard-exit fallback after 5s
5483
5648
  setTimeout(() => process.exit(gracefulProcessExitCode()), 5_000).unref();