botmux 3.16.0 → 3.17.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 (619) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/riff-backend.d.ts +84 -1
  3. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/riff-backend.js +202 -19
  5. package/dist/adapters/backend/riff-backend.js.map +1 -1
  6. package/dist/adapters/backend/sandbox.d.ts +8 -0
  7. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  8. package/dist/adapters/backend/sandbox.js +15 -0
  9. package/dist/adapters/backend/sandbox.js.map +1 -1
  10. package/dist/adapters/backend/tmux-backend.d.ts +61 -7
  11. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/tmux-backend.js +80 -9
  13. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  14. package/dist/adapters/backend/tmux-pipe-backend.d.ts +62 -4
  15. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  16. package/dist/adapters/backend/tmux-pipe-backend.js +240 -27
  17. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  18. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  19. package/dist/adapters/cli/claude-code.js +4 -2
  20. package/dist/adapters/cli/claude-code.js.map +1 -1
  21. package/dist/adapters/cli/coco.d.ts.map +1 -1
  22. package/dist/adapters/cli/coco.js +27 -0
  23. package/dist/adapters/cli/coco.js.map +1 -1
  24. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  25. package/dist/adapters/cli/codex-app.js +28 -0
  26. package/dist/adapters/cli/codex-app.js.map +1 -1
  27. package/dist/adapters/cli/codex.d.ts.map +1 -1
  28. package/dist/adapters/cli/codex.js +51 -23
  29. package/dist/adapters/cli/codex.js.map +1 -1
  30. package/dist/adapters/cli/dsh-tui.d.ts +24 -0
  31. package/dist/adapters/cli/dsh-tui.d.ts.map +1 -0
  32. package/dist/adapters/cli/dsh-tui.js +99 -0
  33. package/dist/adapters/cli/dsh-tui.js.map +1 -0
  34. package/dist/adapters/cli/dsh.d.ts.map +1 -1
  35. package/dist/adapters/cli/dsh.js +15 -9
  36. package/dist/adapters/cli/dsh.js.map +1 -1
  37. package/dist/adapters/cli/fs-policy.d.ts +98 -1
  38. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  39. package/dist/adapters/cli/fs-policy.js +182 -7
  40. package/dist/adapters/cli/fs-policy.js.map +1 -1
  41. package/dist/adapters/cli/grok.js +16 -18
  42. package/dist/adapters/cli/grok.js.map +1 -1
  43. package/dist/adapters/cli/model-catalog-json.d.ts +17 -0
  44. package/dist/adapters/cli/model-catalog-json.d.ts.map +1 -0
  45. package/dist/adapters/cli/model-catalog-json.js +43 -0
  46. package/dist/adapters/cli/model-catalog-json.js.map +1 -0
  47. package/dist/adapters/cli/oh-my-pi.d.ts +2 -0
  48. package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
  49. package/dist/adapters/cli/oh-my-pi.js +45 -13
  50. package/dist/adapters/cli/oh-my-pi.js.map +1 -1
  51. package/dist/adapters/cli/opencode.js +1 -1
  52. package/dist/adapters/cli/opencode.js.map +1 -1
  53. package/dist/adapters/cli/registry.d.ts +2 -1
  54. package/dist/adapters/cli/registry.d.ts.map +1 -1
  55. package/dist/adapters/cli/registry.js +6 -1
  56. package/dist/adapters/cli/registry.js.map +1 -1
  57. package/dist/adapters/cli/relay.d.ts.map +1 -1
  58. package/dist/adapters/cli/relay.js +7 -0
  59. package/dist/adapters/cli/relay.js.map +1 -1
  60. package/dist/adapters/cli/seed.d.ts.map +1 -1
  61. package/dist/adapters/cli/seed.js +6 -0
  62. package/dist/adapters/cli/seed.js.map +1 -1
  63. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  64. package/dist/adapters/cli/shared-hints.js +20 -14
  65. package/dist/adapters/cli/shared-hints.js.map +1 -1
  66. package/dist/adapters/cli/traex.d.ts +4 -0
  67. package/dist/adapters/cli/traex.d.ts.map +1 -1
  68. package/dist/adapters/cli/traex.js +153 -0
  69. package/dist/adapters/cli/traex.js.map +1 -1
  70. package/dist/adapters/cli/types.d.ts +42 -1
  71. package/dist/adapters/cli/types.d.ts.map +1 -1
  72. package/dist/autostart.d.ts +6 -0
  73. package/dist/autostart.d.ts.map +1 -1
  74. package/dist/autostart.js +21 -1
  75. package/dist/autostart.js.map +1 -1
  76. package/dist/bot-registry.d.ts +27 -0
  77. package/dist/bot-registry.d.ts.map +1 -1
  78. package/dist/bot-registry.js +62 -2
  79. package/dist/bot-registry.js.map +1 -1
  80. package/dist/cli/vc-agent.d.ts.map +1 -1
  81. package/dist/cli/vc-agent.js +21 -3
  82. package/dist/cli/vc-agent.js.map +1 -1
  83. package/dist/cli.d.ts.map +1 -1
  84. package/dist/cli.js +92 -1
  85. package/dist/cli.js.map +1 -1
  86. package/dist/codex-app-runner.js +28 -0
  87. package/dist/codex-app-runner.js.map +1 -1
  88. package/dist/core/bot-steer-directive.d.ts +25 -0
  89. package/dist/core/bot-steer-directive.d.ts.map +1 -0
  90. package/dist/core/bot-steer-directive.js +47 -0
  91. package/dist/core/bot-steer-directive.js.map +1 -0
  92. package/dist/core/command-handler.d.ts.map +1 -1
  93. package/dist/core/command-handler.js +102 -18
  94. package/dist/core/command-handler.js.map +1 -1
  95. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  96. package/dist/core/dashboard-ipc-server.js +53 -13
  97. package/dist/core/dashboard-ipc-server.js.map +1 -1
  98. package/dist/core/dashboard-rows.d.ts +3 -0
  99. package/dist/core/dashboard-rows.d.ts.map +1 -1
  100. package/dist/core/dashboard-rows.js +26 -5
  101. package/dist/core/dashboard-rows.js.map +1 -1
  102. package/dist/core/dashboard-url.d.ts +10 -1
  103. package/dist/core/dashboard-url.d.ts.map +1 -1
  104. package/dist/core/dashboard-url.js +12 -2
  105. package/dist/core/dashboard-url.js.map +1 -1
  106. package/dist/core/dispatch.d.ts.map +1 -1
  107. package/dist/core/dispatch.js +5 -4
  108. package/dist/core/dispatch.js.map +1 -1
  109. package/dist/core/existing-app-server.d.ts +22 -0
  110. package/dist/core/existing-app-server.d.ts.map +1 -0
  111. package/dist/core/existing-app-server.js +85 -0
  112. package/dist/core/existing-app-server.js.map +1 -0
  113. package/dist/core/native-topic-id.d.ts +9 -0
  114. package/dist/core/native-topic-id.d.ts.map +1 -0
  115. package/dist/core/native-topic-id.js +14 -0
  116. package/dist/core/native-topic-id.js.map +1 -0
  117. package/dist/core/per-bot-env.d.ts.map +1 -1
  118. package/dist/core/per-bot-env.js +10 -0
  119. package/dist/core/per-bot-env.js.map +1 -1
  120. package/dist/core/plugins/mcp/gateway.d.ts +27 -3
  121. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  122. package/dist/core/plugins/mcp/gateway.js +272 -26
  123. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  124. package/dist/core/plugins/mcp/host.d.ts +18 -0
  125. package/dist/core/plugins/mcp/host.d.ts.map +1 -1
  126. package/dist/core/plugins/mcp/host.js +80 -16
  127. package/dist/core/plugins/mcp/host.js.map +1 -1
  128. package/dist/core/plugins/mcp/launch-record.d.ts +14 -0
  129. package/dist/core/plugins/mcp/launch-record.d.ts.map +1 -0
  130. package/dist/core/plugins/mcp/launch-record.js +63 -0
  131. package/dist/core/plugins/mcp/launch-record.js.map +1 -0
  132. package/dist/core/session-activity.d.ts +11 -0
  133. package/dist/core/session-activity.d.ts.map +1 -1
  134. package/dist/core/session-activity.js +23 -0
  135. package/dist/core/session-activity.js.map +1 -1
  136. package/dist/core/session-group-birth.d.ts.map +1 -1
  137. package/dist/core/session-group-birth.js +23 -8
  138. package/dist/core/session-group-birth.js.map +1 -1
  139. package/dist/core/session-manager.d.ts +1 -4
  140. package/dist/core/session-manager.d.ts.map +1 -1
  141. package/dist/core/session-manager.js +16 -20
  142. package/dist/core/session-manager.js.map +1 -1
  143. package/dist/core/shared-adopt.d.ts +20 -0
  144. package/dist/core/shared-adopt.d.ts.map +1 -0
  145. package/dist/core/shared-adopt.js +26 -0
  146. package/dist/core/shared-adopt.js.map +1 -0
  147. package/dist/core/skills/customize-command.d.ts +7 -0
  148. package/dist/core/skills/customize-command.d.ts.map +1 -0
  149. package/dist/core/skills/customize-command.js +303 -0
  150. package/dist/core/skills/customize-command.js.map +1 -0
  151. package/dist/core/terminal-write-auth.d.ts +15 -0
  152. package/dist/core/terminal-write-auth.d.ts.map +1 -1
  153. package/dist/core/terminal-write-auth.js +15 -0
  154. package/dist/core/terminal-write-auth.js.map +1 -1
  155. package/dist/core/terminal-write-frame.d.ts +30 -0
  156. package/dist/core/terminal-write-frame.d.ts.map +1 -0
  157. package/dist/core/terminal-write-frame.js +44 -0
  158. package/dist/core/terminal-write-frame.js.map +1 -0
  159. package/dist/core/types.d.ts +14 -4
  160. package/dist/core/types.d.ts.map +1 -1
  161. package/dist/core/types.js +6 -8
  162. package/dist/core/types.js.map +1 -1
  163. package/dist/core/worker-pool.d.ts +31 -6
  164. package/dist/core/worker-pool.d.ts.map +1 -1
  165. package/dist/core/worker-pool.js +444 -102
  166. package/dist/core/worker-pool.js.map +1 -1
  167. package/dist/core/worker-startup-retry.d.ts +52 -0
  168. package/dist/core/worker-startup-retry.d.ts.map +1 -0
  169. package/dist/core/worker-startup-retry.js +68 -0
  170. package/dist/core/worker-startup-retry.js.map +1 -0
  171. package/dist/daemon.d.ts +9 -8
  172. package/dist/daemon.d.ts.map +1 -1
  173. package/dist/daemon.js +467 -171
  174. package/dist/daemon.js.map +1 -1
  175. package/dist/dashboard/autostart-api.d.ts +26 -0
  176. package/dist/dashboard/autostart-api.d.ts.map +1 -0
  177. package/dist/dashboard/autostart-api.js +88 -0
  178. package/dist/dashboard/autostart-api.js.map +1 -0
  179. package/dist/dashboard/bot-payload.d.ts +5 -0
  180. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  181. package/dist/dashboard/bot-payload.js +2 -0
  182. package/dist/dashboard/bot-payload.js.map +1 -1
  183. package/dist/dashboard/control-csrf.d.ts +29 -1
  184. package/dist/dashboard/control-csrf.d.ts.map +1 -1
  185. package/dist/dashboard/control-csrf.js +49 -10
  186. package/dist/dashboard/control-csrf.js.map +1 -1
  187. package/dist/dashboard/customization-api.d.ts +23 -0
  188. package/dist/dashboard/customization-api.d.ts.map +1 -0
  189. package/dist/dashboard/customization-api.js +198 -0
  190. package/dist/dashboard/customization-api.js.map +1 -0
  191. package/dist/dashboard/debug-terminal.d.ts +13 -1
  192. package/dist/dashboard/debug-terminal.d.ts.map +1 -1
  193. package/dist/dashboard/debug-terminal.js +18 -4
  194. package/dist/dashboard/debug-terminal.js.map +1 -1
  195. package/dist/dashboard/settings-write-applier.d.ts +0 -23
  196. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  197. package/dist/dashboard/settings-write-applier.js +7 -28
  198. package/dist/dashboard/settings-write-applier.js.map +1 -1
  199. package/dist/dashboard/terminal-control-route.d.ts +32 -0
  200. package/dist/dashboard/terminal-control-route.d.ts.map +1 -0
  201. package/dist/dashboard/terminal-control-route.js +70 -0
  202. package/dist/dashboard/terminal-control-route.js.map +1 -0
  203. package/dist/dashboard/terminal-control.d.ts +64 -13
  204. package/dist/dashboard/terminal-control.d.ts.map +1 -1
  205. package/dist/dashboard/terminal-control.js +77 -14
  206. package/dist/dashboard/terminal-control.js.map +1 -1
  207. package/dist/dashboard/terminal-front-proxy.d.ts.map +1 -1
  208. package/dist/dashboard/terminal-front-proxy.js +41 -9
  209. package/dist/dashboard/terminal-front-proxy.js.map +1 -1
  210. package/dist/dashboard/vc-consumer-profiles-api.d.ts +69 -18
  211. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  212. package/dist/dashboard/vc-consumer-profiles-api.js +149 -29
  213. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  214. package/dist/dashboard/web/agent-workbench-api.d.ts +34 -2
  215. package/dist/dashboard/web/agent-workbench-api.d.ts.map +1 -1
  216. package/dist/dashboard/web/agent-workbench-api.js +39 -4
  217. package/dist/dashboard/web/agent-workbench-api.js.map +1 -1
  218. package/dist/dashboard/web/agent-workbench-appearance.d.ts +6 -3
  219. package/dist/dashboard/web/agent-workbench-appearance.d.ts.map +1 -1
  220. package/dist/dashboard/web/agent-workbench-appearance.js +7 -4
  221. package/dist/dashboard/web/agent-workbench-appearance.js.map +1 -1
  222. package/dist/dashboard/web/agent-workbench-model.d.ts +2 -0
  223. package/dist/dashboard/web/agent-workbench-model.d.ts.map +1 -1
  224. package/dist/dashboard/web/agent-workbench-model.js.map +1 -1
  225. package/dist/dashboard/web/agent-workbench-page.js +2 -2
  226. package/dist/dashboard/web/agent-workbench-page.js.map +1 -1
  227. package/dist/dashboard/web/agent-workbench-panes.d.ts +59 -4
  228. package/dist/dashboard/web/agent-workbench-panes.d.ts.map +1 -1
  229. package/dist/dashboard/web/agent-workbench-panes.js +493 -85
  230. package/dist/dashboard/web/agent-workbench-panes.js.map +1 -1
  231. package/dist/dashboard/web/agent-workbench-session-list.d.ts +11 -7
  232. package/dist/dashboard/web/agent-workbench-session-list.d.ts.map +1 -1
  233. package/dist/dashboard/web/agent-workbench-session-list.js +24 -31
  234. package/dist/dashboard/web/agent-workbench-session-list.js.map +1 -1
  235. package/dist/dashboard/web/agent-workbench-terminal-control.d.ts +198 -0
  236. package/dist/dashboard/web/agent-workbench-terminal-control.d.ts.map +1 -0
  237. package/dist/dashboard/web/agent-workbench-terminal-control.js +292 -0
  238. package/dist/dashboard/web/agent-workbench-terminal-control.js.map +1 -0
  239. package/dist/dashboard/web/agent-workbench-view.d.ts +3 -2
  240. package/dist/dashboard/web/agent-workbench-view.d.ts.map +1 -1
  241. package/dist/dashboard/web/agent-workbench-view.js +69 -50
  242. package/dist/dashboard/web/agent-workbench-view.js.map +1 -1
  243. package/dist/dashboard/web/app.d.ts.map +1 -1
  244. package/dist/dashboard/web/app.js +58 -7
  245. package/dist/dashboard/web/app.js.map +1 -1
  246. package/dist/dashboard/web/bot-defaults-page.d.ts +24 -0
  247. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  248. package/dist/dashboard/web/bot-defaults-page.js +191 -16
  249. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  250. package/dist/dashboard/web/bot-defaults.d.ts +17 -0
  251. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  252. package/dist/dashboard/web/bot-defaults.js +51 -2
  253. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  254. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  255. package/dist/dashboard/web/bot-onboarding.js +32 -8
  256. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  257. package/dist/dashboard/web/confirm-modal.d.ts +35 -0
  258. package/dist/dashboard/web/confirm-modal.d.ts.map +1 -0
  259. package/dist/dashboard/web/confirm-modal.js +111 -0
  260. package/dist/dashboard/web/confirm-modal.js.map +1 -0
  261. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  262. package/dist/dashboard/web/connectors-page.js +2 -1
  263. package/dist/dashboard/web/connectors-page.js.map +1 -1
  264. package/dist/dashboard/web/customization-page.d.ts +3 -0
  265. package/dist/dashboard/web/customization-page.d.ts.map +1 -0
  266. package/dist/dashboard/web/customization-page.js +315 -0
  267. package/dist/dashboard/web/customization-page.js.map +1 -0
  268. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  269. package/dist/dashboard/web/dashboard-routes.js +1 -0
  270. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  271. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  272. package/dist/dashboard/web/groups-page.js +11 -9
  273. package/dist/dashboard/web/groups-page.js.map +1 -1
  274. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  275. package/dist/dashboard/web/i18n.js +226 -42
  276. package/dist/dashboard/web/i18n.js.map +1 -1
  277. package/dist/dashboard/web/monitor-room.d.ts.map +1 -1
  278. package/dist/dashboard/web/monitor-room.js +3 -2
  279. package/dist/dashboard/web/monitor-room.js.map +1 -1
  280. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  281. package/dist/dashboard/web/overview-page.js +98 -63
  282. package/dist/dashboard/web/overview-page.js.map +1 -1
  283. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  284. package/dist/dashboard/web/roles-page.js +4 -3
  285. package/dist/dashboard/web/roles-page.js.map +1 -1
  286. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  287. package/dist/dashboard/web/schedules-page.js +165 -18
  288. package/dist/dashboard/web/schedules-page.js.map +1 -1
  289. package/dist/dashboard/web/sessions-kanban.d.ts +2 -0
  290. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  291. package/dist/dashboard/web/sessions-kanban.js +142 -24
  292. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  293. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  294. package/dist/dashboard/web/sessions-page.js +177 -94
  295. package/dist/dashboard/web/sessions-page.js.map +1 -1
  296. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  297. package/dist/dashboard/web/sessions.js +5 -4
  298. package/dist/dashboard/web/sessions.js.map +1 -1
  299. package/dist/dashboard/web/settings-page.d.ts +0 -8
  300. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  301. package/dist/dashboard/web/settings-page.js +185 -65
  302. package/dist/dashboard/web/settings-page.js.map +1 -1
  303. package/dist/dashboard/web/skills/skill-library-tab.d.ts +2 -0
  304. package/dist/dashboard/web/skills/skill-library-tab.d.ts.map +1 -1
  305. package/dist/dashboard/web/skills/skill-library-tab.js +15 -1
  306. package/dist/dashboard/web/skills/skill-library-tab.js.map +1 -1
  307. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  308. package/dist/dashboard/web/skills-page.js +5 -4
  309. package/dist/dashboard/web/skills-page.js.map +1 -1
  310. package/dist/dashboard/web/store.d.ts +5 -0
  311. package/dist/dashboard/web/store.d.ts.map +1 -1
  312. package/dist/dashboard/web/store.js +4 -0
  313. package/dist/dashboard/web/store.js.map +1 -1
  314. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
  315. package/dist/dashboard/web/team-federation-page.js +3 -2
  316. package/dist/dashboard/web/team-federation-page.js.map +1 -1
  317. package/dist/dashboard/web/toast.d.ts +15 -0
  318. package/dist/dashboard/web/toast.d.ts.map +1 -0
  319. package/dist/dashboard/web/toast.js +70 -0
  320. package/dist/dashboard/web/toast.js.map +1 -0
  321. package/dist/dashboard/web/v3-components.d.ts.map +1 -1
  322. package/dist/dashboard/web/v3-components.js +2 -1
  323. package/dist/dashboard/web/v3-components.js.map +1 -1
  324. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +10 -12
  325. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  326. package/dist/dashboard/web/vc-consumer-profiles-section.js +219 -200
  327. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  328. package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -1
  329. package/dist/dashboard/web/whiteboards-page.js +2 -1
  330. package/dist/dashboard/web/whiteboards-page.js.map +1 -1
  331. package/dist/dashboard-web/app.js +1 -1
  332. package/dist/dashboard-web/chunks/agent-workbench-dock-page-LZSUOCEQ.js +1 -0
  333. package/dist/dashboard-web/chunks/agent-workbench-page-YONDRJU7.js +1 -0
  334. package/dist/dashboard-web/chunks/bot-defaults-page-X7LV6373.js +1 -0
  335. package/dist/dashboard-web/chunks/chunk-2PVRDXEL.js +1 -0
  336. package/dist/dashboard-web/chunks/chunk-53JUKBU2.js +10 -0
  337. package/dist/dashboard-web/chunks/{chunk-5CJMHTT4.js → chunk-5QX4OYOR.js} +1 -1
  338. package/dist/dashboard-web/chunks/{chunk-NACP7BMR.js → chunk-5VRVJFQR.js} +1 -1
  339. package/dist/dashboard-web/chunks/{chunk-FDZ7WOBW.js → chunk-6ROOZWYV.js} +1 -1
  340. package/dist/dashboard-web/chunks/{chunk-F6KNPF4R.js → chunk-CK22743G.js} +15 -19
  341. package/dist/dashboard-web/chunks/chunk-CVNIMUPY.js +25 -0
  342. package/dist/dashboard-web/chunks/chunk-GJC2TMWS.js +2 -0
  343. package/dist/dashboard-web/chunks/chunk-OT6L6G7R.js +1 -0
  344. package/dist/dashboard-web/chunks/chunk-QITAMHW6.js +1 -0
  345. package/dist/dashboard-web/chunks/chunk-RHVFZC5Z.js +1 -0
  346. package/dist/dashboard-web/chunks/chunk-SOBMN2VY.js +1 -0
  347. package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +1 -0
  348. package/dist/dashboard-web/chunks/chunk-XVIXNQGC.js +44 -0
  349. package/dist/dashboard-web/chunks/chunk-YUJF34ME.js +1 -0
  350. package/dist/dashboard-web/chunks/connectors-page-LB2HEJ7F.js +1 -0
  351. package/dist/dashboard-web/chunks/customization-page-4GXBYLG6.js +105 -0
  352. package/dist/dashboard-web/chunks/feedback-page-IZQ7VLDG.js +1 -0
  353. package/dist/dashboard-web/chunks/groups-page-4WCP5OEV.js +8 -0
  354. package/dist/dashboard-web/chunks/{insights-page-HJFDYR5N.js → insights-page-TXQHIPQL.js} +1 -1
  355. package/dist/dashboard-web/chunks/{monitor-room-V7PCP47V.js → monitor-room-VBRVWXCM.js} +8 -8
  356. package/dist/dashboard-web/chunks/monitoring-page-QDDZWERE.js +2 -0
  357. package/dist/dashboard-web/chunks/office-page-PENFNYPG.js +1 -0
  358. package/dist/dashboard-web/chunks/overview-page-BZQDP6MP.js +1 -0
  359. package/dist/dashboard-web/chunks/plugin-page-JX4GSWZS.js +1 -0
  360. package/dist/dashboard-web/chunks/roles-page-VPNINZNK.js +1 -0
  361. package/dist/dashboard-web/chunks/schedules-page-BITO6HEA.js +1 -0
  362. package/dist/dashboard-web/chunks/sessions-page-ZKCOVTD2.js +8 -0
  363. package/dist/dashboard-web/chunks/settings-page-UT6JDTS6.js +2 -0
  364. package/dist/dashboard-web/chunks/skills-page-GULXVAJY.js +4 -0
  365. package/dist/dashboard-web/chunks/team-federation-page-CUUJWGEG.js +1 -0
  366. package/dist/dashboard-web/chunks/v3-page-5WVJ5AUR.js +94 -0
  367. package/dist/dashboard-web/chunks/whiteboards-page-FZ2CME4H.js +1 -0
  368. package/dist/dashboard-web/design-tokens.css +236 -0
  369. package/dist/dashboard-web/index.html +1 -0
  370. package/dist/dashboard-web/style.css +1930 -114
  371. package/dist/dashboard.js +360 -279
  372. package/dist/dashboard.js.map +1 -1
  373. package/dist/desktop/renderer/app.js +6 -0
  374. package/dist/desktop/renderer/app.js.map +1 -1
  375. package/dist/dsh-runner.js +139 -17
  376. package/dist/dsh-runner.js.map +1 -1
  377. package/dist/global-config.d.ts +33 -2
  378. package/dist/global-config.d.ts.map +1 -1
  379. package/dist/global-config.js +62 -0
  380. package/dist/global-config.js.map +1 -1
  381. package/dist/i18n/en.d.ts.map +1 -1
  382. package/dist/i18n/en.js +13 -4
  383. package/dist/i18n/en.js.map +1 -1
  384. package/dist/i18n/index.d.ts +27 -3
  385. package/dist/i18n/index.d.ts.map +1 -1
  386. package/dist/i18n/index.js +33 -4
  387. package/dist/i18n/index.js.map +1 -1
  388. package/dist/i18n/zh.d.ts.map +1 -1
  389. package/dist/i18n/zh.js +13 -4
  390. package/dist/i18n/zh.js.map +1 -1
  391. package/dist/im/lark/card-builder.d.ts +2 -0
  392. package/dist/im/lark/card-builder.d.ts.map +1 -1
  393. package/dist/im/lark/card-builder.js +7 -4
  394. package/dist/im/lark/card-builder.js.map +1 -1
  395. package/dist/im/lark/card-handler.d.ts.map +1 -1
  396. package/dist/im/lark/card-handler.js +135 -20
  397. package/dist/im/lark/card-handler.js.map +1 -1
  398. package/dist/im/lark/event-dispatcher.d.ts +38 -3
  399. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  400. package/dist/im/lark/event-dispatcher.js +163 -13
  401. package/dist/im/lark/event-dispatcher.js.map +1 -1
  402. package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -1
  403. package/dist/im/lark/v3-blocked-card-handler.js +2 -1
  404. package/dist/im/lark/v3-blocked-card-handler.js.map +1 -1
  405. package/dist/im/lark/v3-blocked-card.d.ts +1 -1
  406. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
  407. package/dist/im/lark/v3-blocked-card.js +14 -0
  408. package/dist/im/lark/v3-blocked-card.js.map +1 -1
  409. package/dist/index-core-only.js +2 -0
  410. package/dist/index-core-only.js.map +1 -1
  411. package/dist/index-daemon.js +3 -0
  412. package/dist/index-daemon.js.map +1 -1
  413. package/dist/platform/binding.d.ts +37 -0
  414. package/dist/platform/binding.d.ts.map +1 -1
  415. package/dist/platform/binding.js +15 -0
  416. package/dist/platform/binding.js.map +1 -1
  417. package/dist/services/bridge-turn-journal.d.ts +63 -0
  418. package/dist/services/bridge-turn-journal.d.ts.map +1 -0
  419. package/dist/services/bridge-turn-journal.js +149 -0
  420. package/dist/services/bridge-turn-journal.js.map +1 -0
  421. package/dist/services/bridge-turn-queue.d.ts +8 -1
  422. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  423. package/dist/services/bridge-turn-queue.js +2 -1
  424. package/dist/services/bridge-turn-queue.js.map +1 -1
  425. package/dist/services/codex-app-runner-protocol.d.ts +5 -0
  426. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
  427. package/dist/services/codex-app-runner-protocol.js +5 -0
  428. package/dist/services/codex-app-runner-protocol.js.map +1 -1
  429. package/dist/services/customization-store.d.ts +93 -0
  430. package/dist/services/customization-store.d.ts.map +1 -0
  431. package/dist/services/customization-store.js +542 -0
  432. package/dist/services/customization-store.js.map +1 -0
  433. package/dist/services/file-bridge-path.d.ts.map +1 -1
  434. package/dist/services/file-bridge-path.js +3 -0
  435. package/dist/services/file-bridge-path.js.map +1 -1
  436. package/dist/services/grok-transcript.d.ts.map +1 -1
  437. package/dist/services/grok-transcript.js +44 -9
  438. package/dist/services/grok-transcript.js.map +1 -1
  439. package/dist/services/local-cli-opener.d.ts.map +1 -1
  440. package/dist/services/local-cli-opener.js +12 -3
  441. package/dist/services/local-cli-opener.js.map +1 -1
  442. package/dist/services/model-catalog.d.ts +54 -0
  443. package/dist/services/model-catalog.d.ts.map +1 -0
  444. package/dist/services/model-catalog.js +147 -0
  445. package/dist/services/model-catalog.js.map +1 -0
  446. package/dist/services/omp-transcript.d.ts +27 -0
  447. package/dist/services/omp-transcript.d.ts.map +1 -0
  448. package/dist/services/omp-transcript.js +214 -0
  449. package/dist/services/omp-transcript.js.map +1 -0
  450. package/dist/services/platform-team-store.d.ts +16 -8
  451. package/dist/services/platform-team-store.d.ts.map +1 -1
  452. package/dist/services/platform-team-store.js +17 -10
  453. package/dist/services/platform-team-store.js.map +1 -1
  454. package/dist/services/project-scanner.d.ts.map +1 -1
  455. package/dist/services/project-scanner.js +13 -8
  456. package/dist/services/project-scanner.js.map +1 -1
  457. package/dist/services/resumable-session-discovery.d.ts.map +1 -1
  458. package/dist/services/resumable-session-discovery.js +117 -35
  459. package/dist/services/resumable-session-discovery.js.map +1 -1
  460. package/dist/services/structured-bridge-clis.d.ts +5 -3
  461. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  462. package/dist/services/structured-bridge-clis.js +5 -1
  463. package/dist/services/structured-bridge-clis.js.map +1 -1
  464. package/dist/services/vc-meeting-action-gate.d.ts.map +1 -1
  465. package/dist/services/vc-meeting-action-gate.js +15 -4
  466. package/dist/services/vc-meeting-action-gate.js.map +1 -1
  467. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +46 -66
  468. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -1
  469. package/dist/services/vc-meeting-consumer-profile-bootstrap.js +33 -292
  470. package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -1
  471. package/dist/services/vc-meeting-consumer-profile-templates.js +3 -3
  472. package/dist/services/vc-meeting-consumer-profile-templates.js.map +1 -1
  473. package/dist/services/vc-meeting-delivery-store.d.ts +18 -0
  474. package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -1
  475. package/dist/services/vc-meeting-delivery-store.js +55 -0
  476. package/dist/services/vc-meeting-delivery-store.js.map +1 -1
  477. package/dist/services/vc-meeting-send-policy.d.ts +21 -1
  478. package/dist/services/vc-meeting-send-policy.d.ts.map +1 -1
  479. package/dist/services/vc-meeting-send-policy.js +30 -2
  480. package/dist/services/vc-meeting-send-policy.js.map +1 -1
  481. package/dist/services/vc-meeting-shared-consumer-catalog-store.d.ts +78 -0
  482. package/dist/services/vc-meeting-shared-consumer-catalog-store.d.ts.map +1 -0
  483. package/dist/services/vc-meeting-shared-consumer-catalog-store.js +227 -0
  484. package/dist/services/vc-meeting-shared-consumer-catalog-store.js.map +1 -0
  485. package/dist/services/vc-meeting-shared-consumer-catalog.d.ts +53 -0
  486. package/dist/services/vc-meeting-shared-consumer-catalog.d.ts.map +1 -0
  487. package/dist/services/vc-meeting-shared-consumer-catalog.js +161 -0
  488. package/dist/services/vc-meeting-shared-consumer-catalog.js.map +1 -0
  489. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  490. package/dist/setup/bot-config-editor.js +1 -0
  491. package/dist/setup/bot-config-editor.js.map +1 -1
  492. package/dist/setup/open-platform-automation.d.ts +20 -0
  493. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  494. package/dist/setup/open-platform-automation.js +27 -0
  495. package/dist/setup/open-platform-automation.js.map +1 -1
  496. package/dist/skills/customization-bundle.d.ts +83 -0
  497. package/dist/skills/customization-bundle.d.ts.map +1 -0
  498. package/dist/skills/customization-bundle.js +214 -0
  499. package/dist/skills/customization-bundle.js.map +1 -0
  500. package/dist/skills/definitions.d.ts.map +1 -1
  501. package/dist/skills/definitions.js +10 -3
  502. package/dist/skills/definitions.js.map +1 -1
  503. package/dist/skills/effective-builtins.d.ts +38 -0
  504. package/dist/skills/effective-builtins.d.ts.map +1 -0
  505. package/dist/skills/effective-builtins.js +96 -0
  506. package/dist/skills/effective-builtins.js.map +1 -0
  507. package/dist/skills/injection-mode.d.ts +4 -1
  508. package/dist/skills/injection-mode.d.ts.map +1 -1
  509. package/dist/skills/injection-mode.js +11 -3
  510. package/dist/skills/injection-mode.js.map +1 -1
  511. package/dist/skills/installer.d.ts.map +1 -1
  512. package/dist/skills/installer.js +24 -1
  513. package/dist/skills/installer.js.map +1 -1
  514. package/dist/skills/prompt-fragments.d.ts +58 -0
  515. package/dist/skills/prompt-fragments.d.ts.map +1 -0
  516. package/dist/skills/prompt-fragments.js +88 -0
  517. package/dist/skills/prompt-fragments.js.map +1 -0
  518. package/dist/types.d.ts +51 -0
  519. package/dist/types.d.ts.map +1 -1
  520. package/dist/utils/cli-usage-limit.d.ts +50 -0
  521. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  522. package/dist/utils/cli-usage-limit.js +43 -0
  523. package/dist/utils/cli-usage-limit.js.map +1 -1
  524. package/dist/utils/idle-detector.d.ts +12 -0
  525. package/dist/utils/idle-detector.d.ts.map +1 -1
  526. package/dist/utils/idle-detector.js +88 -2
  527. package/dist/utils/idle-detector.js.map +1 -1
  528. package/dist/utils/stuck-detector.d.ts +5 -0
  529. package/dist/utils/stuck-detector.d.ts.map +1 -1
  530. package/dist/utils/stuck-detector.js +41 -0
  531. package/dist/utils/stuck-detector.js.map +1 -1
  532. package/dist/utils/usage-limit-tracker.d.ts +46 -0
  533. package/dist/utils/usage-limit-tracker.d.ts.map +1 -0
  534. package/dist/utils/usage-limit-tracker.js +91 -0
  535. package/dist/utils/usage-limit-tracker.js.map +1 -0
  536. package/dist/utils/user-token.js +1 -1
  537. package/dist/utils/user-token.js.map +1 -1
  538. package/dist/worker.js +812 -125
  539. package/dist/worker.js.map +1 -1
  540. package/dist/workflows/definition.d.ts +14 -14
  541. package/dist/workflows/events/payloads.d.ts +12 -12
  542. package/dist/workflows/events/schema.d.ts +164 -164
  543. package/dist/workflows/migration/v2-to-v3.js +1 -1
  544. package/dist/workflows/migration/v2-to-v3.js.map +1 -1
  545. package/dist/workflows/v3/architect.d.ts.map +1 -1
  546. package/dist/workflows/v3/architect.js +11 -5
  547. package/dist/workflows/v3/architect.js.map +1 -1
  548. package/dist/workflows/v3/artifact-contract-declarations.d.ts +22 -0
  549. package/dist/workflows/v3/artifact-contract-declarations.d.ts.map +1 -0
  550. package/dist/workflows/v3/artifact-contract-declarations.js +95 -0
  551. package/dist/workflows/v3/artifact-contract-declarations.js.map +1 -0
  552. package/dist/workflows/v3/contract.d.ts +1 -0
  553. package/dist/workflows/v3/contract.d.ts.map +1 -1
  554. package/dist/workflows/v3/contract.js.map +1 -1
  555. package/dist/workflows/v3/daemon-run.d.ts +2 -2
  556. package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
  557. package/dist/workflows/v3/daemon-run.js +4 -0
  558. package/dist/workflows/v3/daemon-run.js.map +1 -1
  559. package/dist/workflows/v3/dag.d.ts +7 -0
  560. package/dist/workflows/v3/dag.d.ts.map +1 -1
  561. package/dist/workflows/v3/dag.js +69 -8
  562. package/dist/workflows/v3/dag.js.map +1 -1
  563. package/dist/workflows/v3/ephemeral-pool.js +1 -1
  564. package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
  565. package/dist/workflows/v3/event-contract.d.ts +3 -1
  566. package/dist/workflows/v3/event-contract.d.ts.map +1 -1
  567. package/dist/workflows/v3/host.d.ts.map +1 -1
  568. package/dist/workflows/v3/host.js +5 -1
  569. package/dist/workflows/v3/host.js.map +1 -1
  570. package/dist/workflows/v3/journal.d.ts +1 -1
  571. package/dist/workflows/v3/journal.d.ts.map +1 -1
  572. package/dist/workflows/v3/journal.js.map +1 -1
  573. package/dist/workflows/v3/library-materialize.d.ts.map +1 -1
  574. package/dist/workflows/v3/library-materialize.js +9 -1
  575. package/dist/workflows/v3/library-materialize.js.map +1 -1
  576. package/dist/workflows/v3/library-schema.d.ts +3 -1
  577. package/dist/workflows/v3/library-schema.d.ts.map +1 -1
  578. package/dist/workflows/v3/library-schema.js +20 -4
  579. package/dist/workflows/v3/library-schema.js.map +1 -1
  580. package/dist/workflows/v3/library-store.d.ts.map +1 -1
  581. package/dist/workflows/v3/library-store.js +15 -3
  582. package/dist/workflows/v3/library-store.js.map +1 -1
  583. package/dist/workflows/v3/run-envelope.d.ts +16 -16
  584. package/dist/workflows/v3/shared-node-runtime.d.ts +2 -1
  585. package/dist/workflows/v3/shared-node-runtime.d.ts.map +1 -1
  586. package/dist/workflows/v3/shared-node-runtime.js +48 -7
  587. package/dist/workflows/v3/shared-node-runtime.js.map +1 -1
  588. package/package.json +2 -1
  589. package/dist/dashboard-web/chunks/agent-workbench-dock-page-IKAC5CFL.js +0 -1
  590. package/dist/dashboard-web/chunks/agent-workbench-page-M53UN5EB.js +0 -1
  591. package/dist/dashboard-web/chunks/bot-defaults-page-YKE5SDZF.js +0 -10
  592. package/dist/dashboard-web/chunks/chunk-22WIADUT.js +0 -2
  593. package/dist/dashboard-web/chunks/chunk-24ONYQMR.js +0 -1
  594. package/dist/dashboard-web/chunks/chunk-2W6SCN3M.js +0 -1
  595. package/dist/dashboard-web/chunks/chunk-4XNJX6B3.js +0 -1
  596. package/dist/dashboard-web/chunks/chunk-5THX4DI2.js +0 -66
  597. package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +0 -1
  598. package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +0 -1
  599. package/dist/dashboard-web/chunks/chunk-FXW3V4JR.js +0 -1
  600. package/dist/dashboard-web/chunks/chunk-SYC6D5XU.js +0 -1
  601. package/dist/dashboard-web/chunks/connectors-page-VOISXXII.js +0 -1
  602. package/dist/dashboard-web/chunks/feedback-page-RN6HRZMS.js +0 -1
  603. package/dist/dashboard-web/chunks/groups-page-UQT6DCB7.js +0 -8
  604. package/dist/dashboard-web/chunks/monitoring-page-NKEKVQAP.js +0 -2
  605. package/dist/dashboard-web/chunks/office-page-GVJF73XW.js +0 -1
  606. package/dist/dashboard-web/chunks/overview-page-KHLV6VTI.js +0 -1
  607. package/dist/dashboard-web/chunks/plugin-page-J3OF5IY4.js +0 -1
  608. package/dist/dashboard-web/chunks/roles-page-WQIRSOLZ.js +0 -1
  609. package/dist/dashboard-web/chunks/schedules-page-J2DEY2X6.js +0 -1
  610. package/dist/dashboard-web/chunks/sessions-page-7BQFEA5P.js +0 -8
  611. package/dist/dashboard-web/chunks/settings-page-BJEIOFJH.js +0 -2
  612. package/dist/dashboard-web/chunks/skills-page-HGIFR3IU.js +0 -4
  613. package/dist/dashboard-web/chunks/team-federation-page-MR5ZPL4B.js +0 -1
  614. package/dist/dashboard-web/chunks/v3-page-GBR5JWPE.js +0 -94
  615. package/dist/dashboard-web/chunks/whiteboards-page-QAZM4BN3.js +0 -1
  616. package/dist/services/vc-meeting-consumer-profile-store.d.ts +0 -39
  617. package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +0 -1
  618. package/dist/services/vc-meeting-consumer-profile-store.js +0 -191
  619. package/dist/services/vc-meeting-consumer-profile-store.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';
3
3
  import { createPortal } from 'react-dom';
4
4
  import { openBotOnboarding } from './bot-onboarding.js';
5
- import { agentSelectionKey, cliIdOf, createRefreshGate, displayCliId, fallbackCliOptionsState, fetchBotDefaults, fetchCliOptions, fmtSince, modelSuggestionsForOption, resolveSubstituteTarget, selectedCliOption, } from './bot-defaults.js';
5
+ import { agentSelectionKey, cliIdOf, createRefreshGate, displayCliId, fallbackCliOptionsState, fetchBotDefaults, fetchCliOptions, fetchDetectedModels, fmtSince, mergeModelCandidates, modelSuggestionsForOption, resolveSubstituteTarget, selectedCliOption, } from './bot-defaults.js';
6
6
  import { isRemoteCliId } from '../../core/remote-cli-ids.js';
7
7
  import { mountReactPage } from './react-mount.js';
8
8
  import { useT } from './react-hooks.js';
@@ -228,7 +228,8 @@ function statusClass(status, extra = '') {
228
228
  return `oncall-status${extra ? ` ${extra}` : ''}${suffix}`;
229
229
  }
230
230
  function StatusSpan(props) {
231
- return _jsx("span", { role: "status", "aria-live": "polite", className: statusClass(props.status), ...(props.attr ?? {}), children: props.status?.text ?? '' });
231
+ // key 随文案变化:成功状态 1.5s CSS 淡出,新消息到达时重挂载以重启动画
232
+ return _jsx("span", { role: "status", "aria-live": "polite", className: statusClass(props.status), ...(props.attr ?? {}), children: props.status?.text ?? '' }, props.status?.text ?? '');
232
233
  }
233
234
  function InfoTip(props) {
234
235
  const ariaLabel = typeof props.children === 'string' ? props.children : undefined;
@@ -241,6 +242,43 @@ function DropdownField(props) {
241
242
  const tr = useT();
242
243
  return (_jsxs(_Fragment, { children: [_jsx(DropdownMenu, { id: `bd-menu-${props.dataInput}`, className: ['bd-field-menu', props.className].filter(Boolean).join(' '), ariaLabel: props.ariaLabel, disabled: props.disabled, label: dropdownLabel(props.options, props.value), value: props.value, options: props.options, searchable: props.searchable, searchPlaceholder: props.searchable ? tr('common.dropdownSearch') : undefined, searchEmptyLabel: props.searchable ? tr('common.dropdownSearchEmpty') : undefined, onChange: props.onChange }), _jsx("input", { type: "hidden", "data-input": props.dataInput, value: props.value, readOnly: true })] }));
243
244
  }
245
+ const MODEL_PICKER_CUSTOM = '__custom__';
246
+ /**
247
+ * 模型选择器:下拉候选(静态精选 + live 探测合并,由调用方 mergeModelCandidates 算好)
248
+ * + 「自定义模型…」自由输入。模型列表会过期,候选永不锁死。
249
+ * - value='' 表示跟随 CLI 默认,菜单显示 defaultLabel;
250
+ * - value 非空但不在候选中时,把当前值作为额外选项插在最前(旧配置/自定义值可见);
251
+ * - 选中 customLabel 切到自定义输入模式(datalist 仍挂全部候选做自动补全),
252
+ * 返回按钮切回下拉模式;
253
+ * - busy(live 探测进行中)只在控件下方显示小转圈,不禁用选择。
254
+ */
255
+ export function ModelPickerField(props) {
256
+ const tr = useT();
257
+ const [customMode, setCustomMode] = useState(false);
258
+ const datalistId = useId();
259
+ const current = props.value;
260
+ const dropdownOptions = useMemo(() => {
261
+ const opts = [];
262
+ if (current && !props.options.includes(current)) {
263
+ opts.push({ value: current, label: current });
264
+ }
265
+ for (const item of props.options)
266
+ opts.push({ value: item, label: item });
267
+ opts.push({ value: MODEL_PICKER_CUSTOM, label: props.customLabel });
268
+ return opts;
269
+ }, [current, props.options, props.customLabel]);
270
+ return (_jsxs("span", { className: "bd-model-picker", children: [customMode ? (_jsxs("span", { className: "bd-model-custom", children: [_jsx("input", { type: "text", "data-input": props.dataInput, list: datalistId, value: current, placeholder: props.defaultLabel, disabled: props.disabled, autoComplete: "off", autoCapitalize: "none", spellCheck: false, onChange: event => props.onChange(event.currentTarget.value) }), _jsx("button", { type: "button", className: "bd-model-back", disabled: props.disabled, onClick: () => setCustomMode(false), children: tr('botDefaults.modelPickerBack') }), _jsx("datalist", { id: datalistId, children: props.options.map(item => _jsx("option", { value: item }, item)) })] })) : (_jsxs(_Fragment, { children: [_jsx(DropdownMenu, { id: `bd-menu-${props.dataInput}`, className: ['bd-model-menu', props.menuClassName].filter(Boolean).join(' '), ariaLabel: props.ariaLabel, disabled: props.disabled, label: current || props.defaultLabel, value: current, options: dropdownOptions, searchable: true, searchPlaceholder: tr('common.dropdownSearch'), searchEmptyLabel: tr('common.dropdownSearchEmpty'), onChange: next => {
271
+ if (next === MODEL_PICKER_CUSTOM) {
272
+ setCustomMode(true);
273
+ return;
274
+ }
275
+ props.onChange(next);
276
+ } }), _jsx("input", { type: "hidden", "data-input": props.dataInput, value: current, onChange: event => props.onChange(event.currentTarget.value) })] })), props.busy
277
+ ? _jsx("small", { className: "bd-model-busy", children: _jsx("span", { className: "bd-model-spinner", "aria-hidden": "true" }) })
278
+ : null, typeof props.detectedCount === 'number' && props.detectedCount > 0 && props.detectedLabel
279
+ ? _jsx("small", { className: "bd-model-detected", children: props.detectedLabel })
280
+ : null] }));
281
+ }
244
282
  function ToggleRow(props) {
245
283
  return (_jsxs("label", { className: props.className ? `toggle-row ${props.className}` : 'toggle-row', children: [_jsx("input", { type: "checkbox", "data-action": props.dataAction, checked: props.checked, disabled: props.disabled, onChange: event => props.onChange(event.currentTarget.checked) }), _jsx("span", { className: "switch", "aria-hidden": "true" }), _jsxs("span", { className: "toggle-tx", children: [_jsx("strong", { children: _jsx(FieldTitle, { help: props.help, children: props.title }) }), props.description ? _jsx("small", { children: props.description }) : null] })] }));
246
284
  }
@@ -938,6 +976,11 @@ export function BotAgentSection(props) {
938
976
  const [turnTimeoutMin, setTurnTimeoutMin] = useState(turnTimeoutMinFromMs(bot.turnTimeoutMs));
939
977
  const [turnTimeoutTouched, setTurnTimeoutTouched] = useState(false);
940
978
  const [turnTimeoutError, setTurnTimeoutError] = useState(null);
979
+ // dsh runtime variant: 'official' (JSON-RPC runner) or 'tui' (dsh-tui PTY).
980
+ // Defaults to 'official' so a bot that never touched the toggle stays on the
981
+ // headless runner. `touched` gates whether a save sends the field at all.
982
+ const [dshRuntime, setDshRuntime] = useState(bot.dshRuntime === 'tui' ? 'tui' : 'official');
983
+ const [dshRuntimeTouched, setDshRuntimeTouched] = useState(false);
941
984
  const [runtimeDraft, setRuntimeDraft] = useState(() => runtimeDraftFromBot(bot));
942
985
  const [runtimeTouched, setRuntimeTouched] = useState(false);
943
986
  const [runtimeStatus, setRuntimeStatus] = useState(null);
@@ -954,6 +997,8 @@ export function BotAgentSection(props) {
954
997
  setTurnTimeoutMin(turnTimeoutMinFromMs(bot.turnTimeoutMs));
955
998
  setTurnTimeoutTouched(false);
956
999
  setTurnTimeoutError(null);
1000
+ setDshRuntime(bot.dshRuntime === 'tui' ? 'tui' : 'official');
1001
+ setDshRuntimeTouched(false);
957
1002
  setRuntimeDraft(runtimeDraftFromBot(bot));
958
1003
  setRuntimeTouched(false);
959
1004
  setSkillValue(skillInjectionResolved(bot));
@@ -964,6 +1009,7 @@ export function BotAgentSection(props) {
964
1009
  bot.model,
965
1010
  bot.reasoningEffort,
966
1011
  bot.turnTimeoutMs,
1012
+ bot.dshRuntime,
967
1013
  runtimeConfigKey,
968
1014
  bot.wrapperCli,
969
1015
  bot.skillInjection,
@@ -973,11 +1019,28 @@ export function BotAgentSection(props) {
973
1019
  const option = selectedCliOption(cliState.options, cliKey);
974
1020
  const suggestions = modelSuggestionsForOption(option, cliState);
975
1021
  const modelDisabledByCli = option?.gateway === 'ttadk' && option.acceptsModel === false;
976
- const modelPlaceholder = modelDisabledByCli
977
- ? tr('botOnboarding.modelTtadkCocoPlaceholder')
978
- : option?.gateway === 'ttadk'
979
- ? tr('botOnboarding.modelTtadkPlaceholder').replace('{model}', cliState.ttadkModelDefault)
980
- : tr('botDefaults.agentModelPlaceholder');
1022
+ // live 探测当前 CLI 的可用模型(ttadk 网关项保持现状,只用静态建议列表)。
1023
+ const [detectedModels, setDetectedModels] = useState(null);
1024
+ const [detectingModels, setDetectingModels] = useState(false);
1025
+ useEffect(() => {
1026
+ if (option?.gateway === 'ttadk') {
1027
+ setDetectedModels(null);
1028
+ setDetectingModels(false);
1029
+ return;
1030
+ }
1031
+ // stale 标志防卸载/竞态:cliKey 快速切换时旧响应不得覆盖新 CLI 的候选。
1032
+ let stale = false;
1033
+ setDetectingModels(true);
1034
+ fetchDetectedModels(cliKey)
1035
+ .then(result => { if (!stale)
1036
+ setDetectedModels(result); })
1037
+ .finally(() => { if (!stale)
1038
+ setDetectingModels(false); });
1039
+ return () => { stale = true; };
1040
+ // 只按 cliKey 重新探测;cliState 刷新带来的静态候选经 suggestions 合入,无需重探。
1041
+ }, [cliKey]);
1042
+ const modelCandidates = mergeModelCandidates(suggestions, detectedModels?.models ?? null);
1043
+ const detectedLiveCount = detectedModels?.source === 'live' ? detectedModels.models.length : 0;
981
1044
  function updateCli(nextKey) {
982
1045
  const previousKey = cliKey;
983
1046
  setCliKey(nextKey);
@@ -1072,6 +1135,9 @@ export function BotAgentSection(props) {
1072
1135
  // it makes the daemon preserve the current value; non-dsh selections
1073
1136
  // never send it (the daemon drops any stored value for non-dsh CLIs).
1074
1137
  ...(cliKey === 'dsh' && turnTimeoutField !== undefined ? { turnTimeoutMs: turnTimeoutField } : {}),
1138
+ // dsh-only runtime variant: only send when touched, same semantics as
1139
+ // turnTimeoutMs. 'official' clears a stored 'tui' selection.
1140
+ ...(cliKey === 'dsh' && dshRuntimeTouched ? { dshRuntime } : {}),
1075
1141
  ...(runtimeTouched ? { cliRuntime } : {}),
1076
1142
  };
1077
1143
  const res = await sendJson('PUT', `/api/bots/${encodeURIComponent(bot.larkAppId)}/agent`, body);
@@ -1116,6 +1182,7 @@ export function BotAgentSection(props) {
1116
1182
  model: res.body.model ?? '',
1117
1183
  reasoningEffort: res.body.reasoningEffort ?? undefined,
1118
1184
  turnTimeoutMs: typeof res.body.turnTimeoutMs === 'number' ? res.body.turnTimeoutMs : undefined,
1185
+ dshRuntime: typeof res.body.dshRuntime === 'string' ? res.body.dshRuntime : bot.dshRuntime ?? null,
1119
1186
  agentSelectionKey: res.body.selectionKey ?? cliKey,
1120
1187
  });
1121
1188
  // Re-sync the minutes input from the authoritative saved ms and clear
@@ -1123,6 +1190,7 @@ export function BotAgentSection(props) {
1123
1190
  setTurnTimeoutMin(turnTimeoutMinFromMs(typeof res.body.turnTimeoutMs === 'number' ? res.body.turnTimeoutMs : undefined));
1124
1191
  setTurnTimeoutTouched(false);
1125
1192
  setTurnTimeoutError(null);
1193
+ setDshRuntimeTouched(false);
1126
1194
  setRuntimeTouched(false);
1127
1195
  if (cliRuntime) {
1128
1196
  const probe = res.body.runtimeProbe;
@@ -1294,7 +1362,9 @@ export function BotAgentSection(props) {
1294
1362
  ? 'botDefaults.runtimeOfficialNote'
1295
1363
  : runtimeDraft.mode === 'legacy'
1296
1364
  ? 'botDefaults.runtimeLegacyNote'
1297
- : 'botDefaults.runtimeCustomNote') }), runtimeDraft.mode === 'legacy' ? (_jsx("div", { className: "bd-runtime-fields", "data-runtime-legacy": "", children: _jsxs("label", { className: "bd-runtime-wide", children: [_jsx("span", { children: tr('botDefaults.runtimeLegacyPath') }), _jsx("input", { type: "text", value: runtimeDraft.legacyPath, readOnly: true, "aria-readonly": "true", "data-input": "agentRuntimeLegacyPath" })] }) })) : null, runtimeDraft.mode === 'custom' ? (_jsxs("div", { className: "bd-runtime-fields", children: [_jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.runtimeIdHelp'), children: tr('botDefaults.runtimeId') }), _jsx("input", { type: "text", "data-input": "agentRuntimeId", value: runtimeDraft.id, disabled: agentBusy, autoComplete: "off", onChange: event => updateRuntimeDraft({ id: event.currentTarget.value }) })] }), _jsxs("label", { children: [_jsx("span", { children: tr('botDefaults.runtimeDisplayName') }), _jsx("input", { type: "text", "data-input": "agentRuntimeDisplayName", placeholder: tr('botDefaults.runtimeDisplayNamePlaceholder'), value: runtimeDraft.displayName, disabled: agentBusy, autoComplete: "off", onChange: event => updateRuntimeDraft({ displayName: event.currentTarget.value }) })] }), _jsxs("label", { className: "bd-runtime-wide", children: [_jsx(FieldTitle, { help: tr('botDefaults.runtimeExecutableHelp'), children: tr('botDefaults.runtimeExecutable') }), _jsx("input", { type: "text", "data-input": "agentRuntimeExecutable", value: runtimeDraft.executable, disabled: agentBusy, autoCapitalize: "none", autoComplete: "off", spellCheck: false, onChange: event => updateRuntimeDraft({ executable: event.currentTarget.value }) })] }), _jsxs("div", { className: "bd-field", children: [_jsx("span", { children: tr('botDefaults.runtimeUpdateProvider') }), _jsx(DropdownField, { dataInput: "agentRuntimeUpdateProvider", ariaLabel: tr('botDefaults.runtimeUpdateProvider'), value: runtimeDraft.updateProvider, disabled: agentBusy, options: runtimeProviderOptions, onChange: updateProvider => updateRuntimeDraft({ updateProvider }) })] }), runtimeDraft.updateProvider === 'npm' ? (_jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.runtimePackageHelp'), children: tr('botDefaults.runtimePackageName') }), _jsx("input", { type: "text", "data-input": "agentRuntimePackageName", value: runtimeDraft.packageName, disabled: agentBusy, autoCapitalize: "none", autoComplete: "off", spellCheck: false, onChange: event => updateRuntimeDraft({ packageName: event.currentTarget.value }) })] })) : null] })) : null, _jsx(StatusSpan, { status: runtimeStatus, attr: { 'data-runtime-status': '' } })] })) : null, !isRiff && (_jsx("div", { className: "bd-row", children: _jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.agentHelp'), children: tr('botDefaults.agentModel') }), _jsx("input", { type: "text", "data-input": "agentModel", list: `agent-model-suggestions-${bot.larkAppId}`, placeholder: modelPlaceholder, value: model, disabled: agentBusy || modelDisabledByCli, onChange: event => setModel(event.currentTarget.value) }), _jsx("datalist", { id: `agent-model-suggestions-${bot.larkAppId}`, children: suggestions.map(item => _jsx("option", { value: item }, item)) })] }) })), isDsh && (_jsx("div", { className: "bd-row", children: _jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.agentTurnTimeoutHelp'), children: tr('botDefaults.agentTurnTimeout') }), _jsx("input", { type: "number", min: 0,
1365
+ : 'botDefaults.runtimeCustomNote') }), runtimeDraft.mode === 'legacy' ? (_jsx("div", { className: "bd-runtime-fields", "data-runtime-legacy": "", children: _jsxs("label", { className: "bd-runtime-wide", children: [_jsx("span", { children: tr('botDefaults.runtimeLegacyPath') }), _jsx("input", { type: "text", value: runtimeDraft.legacyPath, readOnly: true, "aria-readonly": "true", "data-input": "agentRuntimeLegacyPath" })] }) })) : null, runtimeDraft.mode === 'custom' ? (_jsxs("div", { className: "bd-runtime-fields", children: [_jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.runtimeIdHelp'), children: tr('botDefaults.runtimeId') }), _jsx("input", { type: "text", "data-input": "agentRuntimeId", value: runtimeDraft.id, disabled: agentBusy, autoComplete: "off", onChange: event => updateRuntimeDraft({ id: event.currentTarget.value }) })] }), _jsxs("label", { children: [_jsx("span", { children: tr('botDefaults.runtimeDisplayName') }), _jsx("input", { type: "text", "data-input": "agentRuntimeDisplayName", placeholder: tr('botDefaults.runtimeDisplayNamePlaceholder'), value: runtimeDraft.displayName, disabled: agentBusy, autoComplete: "off", onChange: event => updateRuntimeDraft({ displayName: event.currentTarget.value }) })] }), _jsxs("label", { className: "bd-runtime-wide", children: [_jsx(FieldTitle, { help: tr('botDefaults.runtimeExecutableHelp'), children: tr('botDefaults.runtimeExecutable') }), _jsx("input", { type: "text", "data-input": "agentRuntimeExecutable", value: runtimeDraft.executable, disabled: agentBusy, autoCapitalize: "none", autoComplete: "off", spellCheck: false, onChange: event => updateRuntimeDraft({ executable: event.currentTarget.value }) })] }), _jsxs("div", { className: "bd-field", children: [_jsx("span", { children: tr('botDefaults.runtimeUpdateProvider') }), _jsx(DropdownField, { dataInput: "agentRuntimeUpdateProvider", ariaLabel: tr('botDefaults.runtimeUpdateProvider'), value: runtimeDraft.updateProvider, disabled: agentBusy, options: runtimeProviderOptions, onChange: updateProvider => updateRuntimeDraft({ updateProvider }) })] }), runtimeDraft.updateProvider === 'npm' ? (_jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.runtimePackageHelp'), children: tr('botDefaults.runtimePackageName') }), _jsx("input", { type: "text", "data-input": "agentRuntimePackageName", value: runtimeDraft.packageName, disabled: agentBusy, autoCapitalize: "none", autoComplete: "off", spellCheck: false, onChange: event => updateRuntimeDraft({ packageName: event.currentTarget.value }) })] })) : null] })) : null, _jsx(StatusSpan, { status: runtimeStatus, attr: { 'data-runtime-status': '' } })] })) : null, !isRiff && (_jsx("div", { className: "bd-row", children: _jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.agentHelp'), children: tr('botDefaults.agentModel') }), _jsx(ModelPickerField, { value: model, onChange: setModel, options: modelCandidates, disabled: agentBusy || modelDisabledByCli, busy: detectingModels, dataInput: "agentModel", ariaLabel: tr('botDefaults.agentModel'), defaultLabel: tr('botDefaults.modelPickerDefault'), customLabel: tr('botDefaults.modelPickerCustom'), menuClassName: "bd-field-menu", detectedCount: detectedLiveCount || undefined, detectedLabel: detectedLiveCount > 0
1366
+ ? tr('botDefaults.modelPickerDetected', { count: detectedLiveCount })
1367
+ : undefined }, cliKey)] }) })), isDsh && (_jsx("div", { className: "bd-row", children: _jsxs("div", { className: "bd-field", children: [_jsx(FieldTitle, { help: tr('botDefaults.dshRuntimeHelp'), children: tr('botDefaults.dshRuntimeTitle') }), _jsxs("div", { className: "bd-runtime-mode", role: "group", "aria-label": tr('botDefaults.dshRuntimeTitle'), children: [_jsx("button", { type: "button", "data-action": "dsh-runtime-official", "aria-pressed": dshRuntime === 'official', disabled: agentBusy, onClick: () => { setDshRuntime('official'); setDshRuntimeTouched(true); }, children: tr('botDefaults.dshRuntimeOfficial') }), _jsx("button", { type: "button", "data-action": "dsh-runtime-tui", "aria-pressed": dshRuntime === 'tui', disabled: agentBusy, onClick: () => { setDshRuntime('tui'); setDshRuntimeTouched(true); }, children: tr('botDefaults.dshRuntimeTui') })] }), _jsx("p", { className: "bd-runtime-note", children: tr(dshRuntime === 'tui' ? 'botDefaults.dshRuntimeTuiNote' : 'botDefaults.dshRuntimeOfficialNote') })] }) })), isDsh && (_jsx("div", { className: "bd-row", children: _jsxs("label", { children: [_jsx(FieldTitle, { help: tr('botDefaults.agentTurnTimeoutHelp'), children: tr('botDefaults.agentTurnTimeout') }), _jsx("input", { type: "number", min: 0,
1298
1368
  // Allow non-whole minutes so a legal non-60000-multiple ms value
1299
1369
  // (e.g. 90001ms ≈ 1.50002min) can be shown and edited losslessly.
1300
1370
  step: "any", inputMode: "decimal", "data-input": "agentTurnTimeout", placeholder: tr('botDefaults.agentTurnTimeoutPlaceholder'), value: turnTimeoutMin, disabled: agentBusy, onChange: event => {
@@ -2528,6 +2598,13 @@ export function SessionGroupTagRow(props) {
2528
2598
  const [authBusy, setAuthBusy] = useState(false);
2529
2599
  const [modeBusy, setModeBusy] = useState(false);
2530
2600
  const [err, setErr] = useState(null);
2601
+ // Remote-callback paste fallback (mirrors groups-page / sessions-page): when
2602
+ // set, the overlay is shown so a browser that can't reach the daemon's
2603
+ // 127.0.0.1:9768 loopback (远程 VM / 中心化平台 m-* 子域访问) can still finish
2604
+ // by pasting the callback URL. authUrl also drives the "跳转飞书授权" retry button.
2605
+ const [authUrl, setAuthUrl] = useState('');
2606
+ const [callbackUrl, setCallbackUrl] = useState('');
2607
+ const [submitting, setSubmitting] = useState(false);
2531
2608
  const lifecycle = useRef({ generation: 0, mounted: true });
2532
2609
  const fetchStatus = async (generation = lifecycle.current.generation) => {
2533
2610
  try {
@@ -2549,6 +2626,9 @@ export function SessionGroupTagRow(props) {
2549
2626
  setAuthBusy(false);
2550
2627
  setModeBusy(false);
2551
2628
  setErr(null);
2629
+ setAuthUrl('');
2630
+ setCallbackUrl('');
2631
+ setSubmitting(false);
2552
2632
  void fetchStatus(generation);
2553
2633
  return () => {
2554
2634
  lifecycle.current.mounted = false;
@@ -2587,6 +2667,7 @@ export function SessionGroupTagRow(props) {
2587
2667
  const generation = ++lifecycle.current.generation;
2588
2668
  setAuthBusy(true);
2589
2669
  setErr(null);
2670
+ setCallbackUrl('');
2590
2671
  try {
2591
2672
  const res = await sendJson('POST', `/api/bots/${encodeURIComponent(props.bot.larkAppId)}/session-group-tag-auth`, {});
2592
2673
  // A bot switch while the POST was in flight must neither surface the old
@@ -2597,17 +2678,35 @@ export function SessionGroupTagRow(props) {
2597
2678
  setErr(responseErrorText(res));
2598
2679
  return;
2599
2680
  }
2600
- window.open(res.body.authUrl, '_blank', 'noopener');
2601
- // 轮询授权结果:3s × 60 次(授权链接 5 分钟有效期同量级)。
2681
+ const url = String(res.body.authUrl);
2682
+ // Show the paste overlay up front (mirrors groups-page / sessions-page):
2683
+ // same-machine browsers finish via the 127.0.0.1:9768 loopback and the
2684
+ // poll below auto-closes it; remote browsers (远程 VM / 中心化平台 m-* 子
2685
+ // 域) can't reach that loopback, so they finish by pasting the callback URL.
2686
+ setAuthUrl(url);
2687
+ window.open(url, '_blank', 'noopener');
2688
+ // 轮询授权结果:3s × 60 次(授权链接 5 分钟有效期同量级)。轮询到 authorized
2689
+ // 即收起弹窗;远程场景轮询不会命中,弹窗保持打开等用户手动粘贴,超时不报错。
2602
2690
  for (let i = 0; i < 60; i++) {
2603
2691
  await new Promise(r => setTimeout(r, 3000));
2604
2692
  if (!lifecycle.current.mounted || generation !== lifecycle.current.generation)
2605
2693
  return;
2606
- if (await fetchStatus(generation))
2694
+ if (await fetchStatus(generation)) {
2695
+ if (lifecycle.current.mounted && generation === lifecycle.current.generation) {
2696
+ // 本机 loopback 已完成授权(state 一次即焚、pending 文件已删)。bump
2697
+ // generation 丢弃任何在途的 completeAuth——否则用户几乎同时点了「完成
2698
+ // 授权」,其 POST 会因 pending 已消费而失败,在绿徽标旁弹出假红错。
2699
+ lifecycle.current.generation += 1;
2700
+ setAuthUrl('');
2701
+ setCallbackUrl('');
2702
+ setSubmitting(false);
2703
+ setAuthBusy(false);
2704
+ // 清掉可能残留的 not-confirmed 提示:completeAuth 曾因 status GET 瞬时
2705
+ // 失败弹过提示,此刻轮询自愈翻绿,别把旧提示留在绿徽标旁。
2706
+ setErr(null);
2707
+ }
2607
2708
  return;
2608
- }
2609
- if (lifecycle.current.mounted && generation === lifecycle.current.generation) {
2610
- setErr(tr('botDefaults.sgTagAuthTimeout'));
2709
+ }
2611
2710
  }
2612
2711
  }
2613
2712
  catch (e) {
@@ -2620,6 +2719,65 @@ export function SessionGroupTagRow(props) {
2620
2719
  setAuthBusy(false);
2621
2720
  }
2622
2721
  }
2722
+ // Remote-callback fallback: POST the pasted 127.0.0.1 callback URL to the
2723
+ // dashboard's cross-process exchanger. The pending OAuth state (and the
2724
+ // resulting token) are disk-backed, so the exchange completes and the daemon's
2725
+ // status endpoint reflects it regardless of which process minted the auth URL.
2726
+ async function completeAuth() {
2727
+ const generation = lifecycle.current.generation;
2728
+ const trimmed = callbackUrl.trim();
2729
+ if (!trimmed)
2730
+ return;
2731
+ setSubmitting(true);
2732
+ setErr(null);
2733
+ // Shared closer for both the success path and the "already authorized"
2734
+ // recovery below: bump generation to stop startAuth's in-flight poll, then
2735
+ // clear the overlay.
2736
+ const finish = () => {
2737
+ if (!lifecycle.current.mounted || generation !== lifecycle.current.generation)
2738
+ return;
2739
+ lifecycle.current.generation += 1;
2740
+ setAuthUrl('');
2741
+ setCallbackUrl('');
2742
+ setSubmitting(false);
2743
+ setAuthBusy(false);
2744
+ };
2745
+ try {
2746
+ const res = await sendJson('POST', '/api/feed-groups/oauth-callback', { callbackUrl: trimmed });
2747
+ if (!lifecycle.current.mounted || generation !== lifecycle.current.generation)
2748
+ return;
2749
+ if (!res.ok || !res.body.ok) {
2750
+ // Narrow race: the same-machine loopback may have consumed this one-shot
2751
+ // state moments earlier (pending file deleted) while the poll hasn't
2752
+ // ticked yet — the exchange then fails with "state 不匹配". Re-check
2753
+ // status before surfacing a red error next to what is really a success.
2754
+ if (await fetchStatus(generation))
2755
+ return void finish();
2756
+ if (lifecycle.current.mounted && generation === lifecycle.current.generation) {
2757
+ // 服务端消息自带 ❌/✅ 前缀,剥掉——行内 err 渲染已统一加 ✗,否则双 emoji 叠加。
2758
+ const raw = String(res.body?.message || responseErrorText(res));
2759
+ setErr(raw.replace(/^[❌✅]\s*/u, ''));
2760
+ }
2761
+ return;
2762
+ }
2763
+ // 换 token 成功≠已授予 feed-group scope,且紧跟的 status GET 可能瞬时失败。
2764
+ // 只有复查确认 authorized 才 finish 关弹窗;否则保留弹窗+提示,让用户能重试,
2765
+ // 或看清「登录成功但没给标签权限」(与 groups-page 刷新失败保留弹窗同款)。
2766
+ if (await fetchStatus(generation))
2767
+ return void finish();
2768
+ if (lifecycle.current.mounted && generation === lifecycle.current.generation) {
2769
+ setErr(tr('botDefaults.sgTagAuthNotConfirmed'));
2770
+ }
2771
+ }
2772
+ catch (e) {
2773
+ if (lifecycle.current.mounted && generation === lifecycle.current.generation)
2774
+ setErr(caughtErrorText(e));
2775
+ }
2776
+ finally {
2777
+ if (lifecycle.current.mounted && generation === lifecycle.current.generation)
2778
+ setSubmitting(false);
2779
+ }
2780
+ }
2623
2781
  const tagMode = status?.tagMode ?? 'feed-group';
2624
2782
  const authorized = status?.authorized === true;
2625
2783
  const modeOptions = [
@@ -2627,7 +2785,24 @@ export function SessionGroupTagRow(props) {
2627
2785
  { value: 'chat-tag', label: tr('botDefaults.sgTagModeChatTag') },
2628
2786
  { value: 'off', label: tr('botDefaults.sgTagModeOff') },
2629
2787
  ];
2630
- return (_jsx("div", { className: "bd-row", "data-session-group-tag-row": true, children: _jsxs("div", { className: "bd-field", children: [_jsx(FieldTitle, { help: tr('botDefaults.sgTagHelp'), children: tr('botDefaults.sgTag') }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }, children: [_jsx(DropdownField, { dataInput: "sessionGroupTagMode", ariaLabel: tr('botDefaults.sgTag'), value: tagMode, disabled: modeBusy || !status, options: modeOptions, onChange: next => void saveMode(next) }), tagMode === 'chat-tag' && (_jsx("span", { "data-sg-tag-state": "tenant", children: tr('botDefaults.sgTagChatTagNote') })), tagMode === 'feed-group' && (_jsxs(_Fragment, { children: [_jsx("span", { "data-sg-tag-state": authorized ? 'authorized' : 'unauthorized', children: authorized ? `🟢 ${tr('botDefaults.sgTagAuthorized')}` : `⚪ ${tr('botDefaults.sgTagUnauthorized')}` }), !authorized && (_jsx("button", { type: "button", className: "primary", "data-action": "session-group-tag-auth", disabled: authBusy, onClick: () => void startAuth(), children: authBusy ? tr('botDefaults.sgTagAuthWaiting') : tr('botDefaults.sgTagAuthStart') }))] })), err && _jsxs("span", { className: "status-error", children: ["\u2717 ", err] })] })] }) }));
2788
+ return (_jsxs("div", { className: "bd-row", "data-session-group-tag-row": true, children: [_jsxs("div", { className: "bd-field", children: [_jsx(FieldTitle, { help: tr('botDefaults.sgTagHelp'), children: tr('botDefaults.sgTag') }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }, children: [_jsx(DropdownField, { dataInput: "sessionGroupTagMode", ariaLabel: tr('botDefaults.sgTag'), value: tagMode, disabled: modeBusy || !status, options: modeOptions, onChange: next => void saveMode(next) }), tagMode === 'chat-tag' && (_jsx("span", { "data-sg-tag-state": "tenant", children: tr('botDefaults.sgTagChatTagNote') })), tagMode === 'feed-group' && (_jsxs(_Fragment, { children: [_jsx("span", { "data-sg-tag-state": authorized ? 'authorized' : 'unauthorized', children: authorized ? `🟢 ${tr('botDefaults.sgTagAuthorized')}` : `⚪ ${tr('botDefaults.sgTagUnauthorized')}` }), !authorized && (_jsx("button", { type: "button", className: "primary", "data-action": "session-group-tag-auth", disabled: authBusy, onClick: () => void startAuth(), children: authBusy ? tr('botDefaults.sgTagAuthWaiting') : tr('botDefaults.sgTagAuthStart') }))] })), err && _jsxs("span", { className: "status-error", children: ["\u2717 ", err] })] })] }), authUrl && typeof document !== 'undefined' ? (
2789
+ // Portal 到 body:此弹层内联渲染在 .page 页面容器的 DOM 里,而 .page 有
2790
+ // `animation: dashboard-page-enter … both`——fill-mode:both 使动画结束后
2791
+ // computed transform 持续为 identity matrix(而非关键字 none),会为后代
2792
+ // position:fixed 建立包含块,于是 .feed-group-auth-overlay 虽写了
2793
+ // fixed+inset:0 却相对 .page 而非视口定位,被约束进页面几何(表现为弹窗
2794
+ // 不全屏、偏挂在按钮附近)。挂到 body 顶层逃出该包含块,与 FeishuLoginModal /
2795
+ // auth-expired-overlay 一致,稳定全屏居中。
2796
+ createPortal(_jsx("div", { className: "feed-group-auth-overlay", children: _jsxs("section", { className: "feed-group-auth-card", role: "dialog", "aria-modal": "true", "aria-labelledby": "sg-tag-auth-title", children: [_jsx("h3", { id: "sg-tag-auth-title", children: tr('botDefaults.sgTagAuthTitle') }), _jsx("p", { children: tr('botDefaults.sgTagAuthHint') }), _jsx("button", { type: "button", className: "primary feed-group-auth-open", onClick: () => window.open(authUrl, '_blank', 'noopener'), children: tr('botDefaults.sgTagAuthOpen') }), _jsxs("label", { children: [_jsx("span", { children: tr('botDefaults.sgTagAuthPasteLabel') }), _jsx("input", { type: "url", "data-input": "sessionGroupTagCallbackUrl", value: callbackUrl, placeholder: "http://127.0.0.1:9768/callback?code=\u2026&state=\u2026", onChange: event => setCallbackUrl(event.currentTarget.value) })] }), _jsxs("div", { className: "actions", children: [_jsx("button", { type: "button", "data-action": "session-group-tag-cancel", onClick: () => {
2797
+ // 取消不仅关弹窗,还要停掉 startAuth 里仍在跑的 60 次轮询——否则
2798
+ // authBusy 一直为 true,「一键授权」卡在禁用态最长 3 分钟。bump
2799
+ // generation 让在途轮询的守卫失配即退出。
2800
+ lifecycle.current.generation += 1;
2801
+ setAuthUrl('');
2802
+ setCallbackUrl('');
2803
+ setSubmitting(false);
2804
+ setAuthBusy(false);
2805
+ }, children: tr('botDefaults.sgTagAuthCancel') }), _jsx("button", { type: "button", className: "primary", "data-action": "session-group-tag-complete", disabled: !callbackUrl.trim() || submitting, onClick: () => void completeAuth(), children: submitting ? tr('botDefaults.sgTagAuthSubmitting') : tr('botDefaults.sgTagAuthComplete') })] })] }) }), document.body)) : null] }));
2631
2806
  }
2632
2807
  function regularGroupMode(bot) {
2633
2808
  return bot.regularGroupReplyMode === 'chat' || bot.regularGroupReplyMode === 'new-topic' || bot.regularGroupReplyMode === 'shared'