botmux 2.107.0 → 2.108.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 (515) hide show
  1. package/README.en.md +17 -14
  2. package/README.md +19 -14
  3. package/dist/adapters/backend/sandbox.d.ts +3 -1
  4. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  5. package/dist/adapters/backend/sandbox.js +19 -3
  6. package/dist/adapters/backend/sandbox.js.map +1 -1
  7. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  8. package/dist/adapters/backend/tmux-backend.js +16 -1
  9. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  10. package/dist/adapters/backend/tmux-pipe-backend.d.ts +24 -15
  11. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/tmux-pipe-backend.js +75 -43
  13. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  14. package/dist/adapters/cli/genius.d.ts.map +1 -1
  15. package/dist/adapters/cli/genius.js +9 -15
  16. package/dist/adapters/cli/genius.js.map +1 -1
  17. package/dist/adapters/cli/grok.d.ts +73 -0
  18. package/dist/adapters/cli/grok.d.ts.map +1 -0
  19. package/dist/adapters/cli/grok.js +298 -0
  20. package/dist/adapters/cli/grok.js.map +1 -0
  21. package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
  22. package/dist/adapters/cli/oh-my-pi.js +133 -12
  23. package/dist/adapters/cli/oh-my-pi.js.map +1 -1
  24. package/dist/adapters/cli/registry.d.ts +2 -1
  25. package/dist/adapters/cli/registry.d.ts.map +1 -1
  26. package/dist/adapters/cli/registry.js +3 -1
  27. package/dist/adapters/cli/registry.js.map +1 -1
  28. package/dist/adapters/cli/shared-hints.d.ts +8 -4
  29. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  30. package/dist/adapters/cli/shared-hints.js +8 -4
  31. package/dist/adapters/cli/shared-hints.js.map +1 -1
  32. package/dist/adapters/cli/types.d.ts +18 -16
  33. package/dist/adapters/cli/types.d.ts.map +1 -1
  34. package/dist/adapters/hook-installer.d.ts +5 -4
  35. package/dist/adapters/hook-installer.d.ts.map +1 -1
  36. package/dist/adapters/hook-installer.js +42 -0
  37. package/dist/adapters/hook-installer.js.map +1 -1
  38. package/dist/cli/send-dispatch.d.ts +21 -0
  39. package/dist/cli/send-dispatch.d.ts.map +1 -1
  40. package/dist/cli/send-dispatch.js +159 -0
  41. package/dist/cli/send-dispatch.js.map +1 -1
  42. package/dist/cli/session-list-liveness.d.ts +22 -0
  43. package/dist/cli/session-list-liveness.d.ts.map +1 -0
  44. package/dist/cli/session-list-liveness.js +22 -0
  45. package/dist/cli/session-list-liveness.js.map +1 -0
  46. package/dist/cli.d.ts.map +1 -1
  47. package/dist/cli.js +182 -33
  48. package/dist/cli.js.map +1 -1
  49. package/dist/core/ask-types.d.ts +4 -0
  50. package/dist/core/ask-types.d.ts.map +1 -1
  51. package/dist/core/ask-types.js +10 -0
  52. package/dist/core/ask-types.js.map +1 -1
  53. package/dist/core/cost-calculator.d.ts.map +1 -1
  54. package/dist/core/cost-calculator.js +35 -13
  55. package/dist/core/cost-calculator.js.map +1 -1
  56. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  57. package/dist/core/dashboard-ipc-server.js +89 -16
  58. package/dist/core/dashboard-ipc-server.js.map +1 -1
  59. package/dist/core/dashboard-rows.d.ts.map +1 -1
  60. package/dist/core/dashboard-rows.js +6 -2
  61. package/dist/core/dashboard-rows.js.map +1 -1
  62. package/dist/core/dashboard-url.d.ts +6 -5
  63. package/dist/core/dashboard-url.d.ts.map +1 -1
  64. package/dist/core/dashboard-url.js +11 -8
  65. package/dist/core/dashboard-url.js.map +1 -1
  66. package/dist/core/maintenance.d.ts +11 -8
  67. package/dist/core/maintenance.d.ts.map +1 -1
  68. package/dist/core/maintenance.js +45 -20
  69. package/dist/core/maintenance.js.map +1 -1
  70. package/dist/core/per-bot-env.d.ts.map +1 -1
  71. package/dist/core/per-bot-env.js +4 -0
  72. package/dist/core/per-bot-env.js.map +1 -1
  73. package/dist/core/session-discovery.d.ts.map +1 -1
  74. package/dist/core/session-discovery.js +4 -0
  75. package/dist/core/session-discovery.js.map +1 -1
  76. package/dist/core/skills/cli-admin-command.d.ts.map +1 -1
  77. package/dist/core/skills/cli-admin-command.js +8 -2
  78. package/dist/core/skills/cli-admin-command.js.map +1 -1
  79. package/dist/core/skills/im-command.d.ts.map +1 -1
  80. package/dist/core/skills/im-command.js +3 -1
  81. package/dist/core/skills/im-command.js.map +1 -1
  82. package/dist/core/skills/sources.d.ts +33 -1
  83. package/dist/core/skills/sources.d.ts.map +1 -1
  84. package/dist/core/skills/sources.js +97 -0
  85. package/dist/core/skills/sources.js.map +1 -1
  86. package/dist/core/skills/types.d.ts +8 -0
  87. package/dist/core/skills/types.d.ts.map +1 -1
  88. package/dist/core/terminal-url.d.ts.map +1 -1
  89. package/dist/core/terminal-url.js +12 -2
  90. package/dist/core/terminal-url.js.map +1 -1
  91. package/dist/core/terminal-write-auth.d.ts +34 -0
  92. package/dist/core/terminal-write-auth.d.ts.map +1 -0
  93. package/dist/core/terminal-write-auth.js +76 -0
  94. package/dist/core/terminal-write-auth.js.map +1 -0
  95. package/dist/core/tmux-recovery.d.ts +11 -0
  96. package/dist/core/tmux-recovery.d.ts.map +1 -0
  97. package/dist/core/tmux-recovery.js +19 -0
  98. package/dist/core/tmux-recovery.js.map +1 -0
  99. package/dist/core/types.d.ts +10 -4
  100. package/dist/core/types.d.ts.map +1 -1
  101. package/dist/core/types.js.map +1 -1
  102. package/dist/core/update-check.d.ts +2 -2
  103. package/dist/core/update-check.js +2 -2
  104. package/dist/core/worker-pool.d.ts +3 -0
  105. package/dist/core/worker-pool.d.ts.map +1 -1
  106. package/dist/core/worker-pool.js +70 -3
  107. package/dist/core/worker-pool.js.map +1 -1
  108. package/dist/daemon.d.ts.map +1 -1
  109. package/dist/daemon.js +15 -8
  110. package/dist/daemon.js.map +1 -1
  111. package/dist/dashboard/auth.d.ts +1 -1
  112. package/dist/dashboard/auth.d.ts.map +1 -1
  113. package/dist/dashboard/auth.js +7 -2
  114. package/dist/dashboard/auth.js.map +1 -1
  115. package/dist/dashboard/bot-payload.d.ts +3 -0
  116. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  117. package/dist/dashboard/bot-payload.js +3 -0
  118. package/dist/dashboard/bot-payload.js.map +1 -1
  119. package/dist/dashboard/connector-api.d.ts.map +1 -1
  120. package/dist/dashboard/connector-api.js +39 -13
  121. package/dist/dashboard/connector-api.js.map +1 -1
  122. package/dist/dashboard/history-senders.d.ts +37 -0
  123. package/dist/dashboard/history-senders.d.ts.map +1 -0
  124. package/dist/dashboard/history-senders.js +60 -0
  125. package/dist/dashboard/history-senders.js.map +1 -0
  126. package/dist/dashboard/roles-batch.d.ts +31 -0
  127. package/dist/dashboard/roles-batch.d.ts.map +1 -0
  128. package/dist/dashboard/roles-batch.js +87 -0
  129. package/dist/dashboard/roles-batch.js.map +1 -0
  130. package/dist/dashboard/settings-card-model.d.ts +4 -2
  131. package/dist/dashboard/settings-card-model.d.ts.map +1 -1
  132. package/dist/dashboard/settings-card-model.js +13 -5
  133. package/dist/dashboard/settings-card-model.js.map +1 -1
  134. package/dist/dashboard/settings-write-applier.d.ts +4 -1
  135. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  136. package/dist/dashboard/settings-write-applier.js +6 -1
  137. package/dist/dashboard/settings-write-applier.js.map +1 -1
  138. package/dist/dashboard/skill-install-request.d.ts +4 -0
  139. package/dist/dashboard/skill-install-request.d.ts.map +1 -1
  140. package/dist/dashboard/skill-install-request.js +11 -1
  141. package/dist/dashboard/skill-install-request.js.map +1 -1
  142. package/dist/dashboard/trigger-api.d.ts +9 -1
  143. package/dist/dashboard/trigger-api.d.ts.map +1 -1
  144. package/dist/dashboard/trigger-api.js +48 -10
  145. package/dist/dashboard/trigger-api.js.map +1 -1
  146. package/dist/dashboard/web/app.d.ts.map +1 -1
  147. package/dist/dashboard/web/app.js +286 -271
  148. package/dist/dashboard/web/app.js.map +1 -1
  149. package/dist/dashboard/web/bot-defaults-page.d.ts +26 -0
  150. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  151. package/dist/dashboard/web/bot-defaults-page.js +1408 -12
  152. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  153. package/dist/dashboard/web/bot-defaults.d.ts +91 -4
  154. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  155. package/dist/dashboard/web/bot-defaults.js +43 -2141
  156. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  157. package/dist/dashboard/web/bot-onboarding.d.ts +6 -1
  158. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  159. package/dist/dashboard/web/bot-onboarding.js +261 -306
  160. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  161. package/dist/dashboard/web/connectors-page.d.ts +4 -0
  162. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  163. package/dist/dashboard/web/connectors-page.js +228 -48
  164. package/dist/dashboard/web/connectors-page.js.map +1 -1
  165. package/dist/dashboard/web/dashboard-api.d.ts +9 -0
  166. package/dist/dashboard/web/dashboard-api.d.ts.map +1 -0
  167. package/dist/dashboard/web/dashboard-api.js +18 -0
  168. package/dist/dashboard/web/dashboard-api.js.map +1 -0
  169. package/dist/dashboard/web/dashboard-components.d.ts +92 -0
  170. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -0
  171. package/dist/dashboard/web/dashboard-components.js +250 -0
  172. package/dist/dashboard/web/dashboard-components.js.map +1 -0
  173. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  174. package/dist/dashboard/web/dashboard-routes.js +30 -183
  175. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  176. package/dist/dashboard/web/floating-scrollbars.d.ts +2 -0
  177. package/dist/dashboard/web/floating-scrollbars.d.ts.map +1 -0
  178. package/dist/dashboard/web/floating-scrollbars.js +264 -0
  179. package/dist/dashboard/web/floating-scrollbars.js.map +1 -0
  180. package/dist/dashboard/web/groups-api.d.ts +36 -0
  181. package/dist/dashboard/web/groups-api.d.ts.map +1 -0
  182. package/dist/dashboard/web/groups-api.js +44 -0
  183. package/dist/dashboard/web/groups-api.js.map +1 -0
  184. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  185. package/dist/dashboard/web/groups-page.js +746 -15
  186. package/dist/dashboard/web/groups-page.js.map +1 -1
  187. package/dist/dashboard/web/groups.d.ts +51 -18
  188. package/dist/dashboard/web/groups.d.ts.map +1 -1
  189. package/dist/dashboard/web/groups.js +145 -1096
  190. package/dist/dashboard/web/groups.js.map +1 -1
  191. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  192. package/dist/dashboard/web/i18n.js +545 -255
  193. package/dist/dashboard/web/i18n.js.map +1 -1
  194. package/dist/dashboard/web/insights-page.d.ts.map +1 -1
  195. package/dist/dashboard/web/insights-page.js +1047 -14
  196. package/dist/dashboard/web/insights-page.js.map +1 -1
  197. package/dist/dashboard/web/insights.d.ts +177 -7
  198. package/dist/dashboard/web/insights.d.ts.map +1 -1
  199. package/dist/dashboard/web/insights.js +187 -1926
  200. package/dist/dashboard/web/insights.js.map +1 -1
  201. package/dist/dashboard/web/legacy-workflow-page.d.ts +3 -0
  202. package/dist/dashboard/web/legacy-workflow-page.d.ts.map +1 -0
  203. package/dist/dashboard/web/legacy-workflow-page.js +717 -0
  204. package/dist/dashboard/web/legacy-workflow-page.js.map +1 -0
  205. package/dist/dashboard/web/monitor-room.d.ts.map +1 -1
  206. package/dist/dashboard/web/monitor-room.js +10 -8
  207. package/dist/dashboard/web/monitor-room.js.map +1 -1
  208. package/dist/dashboard/web/monitoring-page.d.ts.map +1 -1
  209. package/dist/dashboard/web/monitoring-page.js +188 -14
  210. package/dist/dashboard/web/monitoring-page.js.map +1 -1
  211. package/dist/dashboard/web/office-page.d.ts.map +1 -1
  212. package/dist/dashboard/web/office-page.js +11 -23
  213. package/dist/dashboard/web/office-page.js.map +1 -1
  214. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  215. package/dist/dashboard/web/overview-page.js +141 -147
  216. package/dist/dashboard/web/overview-page.js.map +1 -1
  217. package/dist/dashboard/web/overview.d.ts +0 -1
  218. package/dist/dashboard/web/overview.d.ts.map +1 -1
  219. package/dist/dashboard/web/overview.js +3 -275
  220. package/dist/dashboard/web/overview.js.map +1 -1
  221. package/dist/dashboard/web/preferences.d.ts +1 -6
  222. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  223. package/dist/dashboard/web/preferences.js +0 -21
  224. package/dist/dashboard/web/preferences.js.map +1 -1
  225. package/dist/dashboard/web/role-batch.d.ts +9 -0
  226. package/dist/dashboard/web/role-batch.d.ts.map +1 -0
  227. package/dist/dashboard/web/role-batch.js +42 -0
  228. package/dist/dashboard/web/role-batch.js.map +1 -0
  229. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  230. package/dist/dashboard/web/roles-page.js +538 -13
  231. package/dist/dashboard/web/roles-page.js.map +1 -1
  232. package/dist/dashboard/web/roles.d.ts +98 -1
  233. package/dist/dashboard/web/roles.d.ts.map +1 -1
  234. package/dist/dashboard/web/roles.js +117 -903
  235. package/dist/dashboard/web/roles.js.map +1 -1
  236. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  237. package/dist/dashboard/web/schedules-page.js +82 -24
  238. package/dist/dashboard/web/schedules-page.js.map +1 -1
  239. package/dist/dashboard/web/sessions-kanban.d.ts +67 -0
  240. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -0
  241. package/dist/dashboard/web/sessions-kanban.js +481 -0
  242. package/dist/dashboard/web/sessions-kanban.js.map +1 -0
  243. package/dist/dashboard/web/sessions-page.d.ts +4 -0
  244. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  245. package/dist/dashboard/web/sessions-page.js +1633 -18
  246. package/dist/dashboard/web/sessions-page.js.map +1 -1
  247. package/dist/dashboard/web/sessions.d.ts +45 -4
  248. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  249. package/dist/dashboard/web/sessions.js +53 -2535
  250. package/dist/dashboard/web/sessions.js.map +1 -1
  251. package/dist/dashboard/web/settings-page.d.ts +0 -2
  252. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  253. package/dist/dashboard/web/settings-page.js +127 -117
  254. package/dist/dashboard/web/settings-page.js.map +1 -1
  255. package/dist/dashboard/web/skills-page.d.ts +10 -1
  256. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  257. package/dist/dashboard/web/skills-page.js +235 -93
  258. package/dist/dashboard/web/skills-page.js.map +1 -1
  259. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
  260. package/dist/dashboard/web/team-federation-page.js +446 -28
  261. package/dist/dashboard/web/team-federation-page.js.map +1 -1
  262. package/dist/dashboard/web/team-federation.d.ts +91 -2
  263. package/dist/dashboard/web/team-federation.d.ts.map +1 -1
  264. package/dist/dashboard/web/team-federation.js +87 -474
  265. package/dist/dashboard/web/team-federation.js.map +1 -1
  266. package/dist/dashboard/web/theme-menu.d.ts +1 -0
  267. package/dist/dashboard/web/theme-menu.d.ts.map +1 -1
  268. package/dist/dashboard/web/theme-menu.js +79 -20
  269. package/dist/dashboard/web/theme-menu.js.map +1 -1
  270. package/dist/dashboard/web/ui.d.ts +1 -2
  271. package/dist/dashboard/web/ui.d.ts.map +1 -1
  272. package/dist/dashboard/web/ui.js +8 -20
  273. package/dist/dashboard/web/ui.js.map +1 -1
  274. package/dist/dashboard/web/v3-api.d.ts +16 -0
  275. package/dist/dashboard/web/v3-api.d.ts.map +1 -0
  276. package/dist/dashboard/web/v3-api.js +21 -0
  277. package/dist/dashboard/web/v3-api.js.map +1 -0
  278. package/dist/dashboard/web/v3-components.d.ts +2 -0
  279. package/dist/dashboard/web/v3-components.d.ts.map +1 -0
  280. package/dist/dashboard/web/v3-components.js +290 -0
  281. package/dist/dashboard/web/v3-components.js.map +1 -0
  282. package/dist/dashboard/web/v3-model.d.ts +80 -0
  283. package/dist/dashboard/web/v3-model.d.ts.map +1 -0
  284. package/dist/dashboard/web/v3-model.js +240 -0
  285. package/dist/dashboard/web/v3-model.js.map +1 -0
  286. package/dist/dashboard/web/v3-page.d.ts.map +1 -1
  287. package/dist/dashboard/web/v3-page.js +2 -22
  288. package/dist/dashboard/web/v3-page.js.map +1 -1
  289. package/dist/dashboard/web/v3-terminal.d.ts +14 -0
  290. package/dist/dashboard/web/v3-terminal.d.ts.map +1 -1
  291. package/dist/dashboard/web/v3-terminal.js +31 -19
  292. package/dist/dashboard/web/v3-terminal.js.map +1 -1
  293. package/dist/dashboard/web/webhook-logs-page.d.ts +16 -0
  294. package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -0
  295. package/dist/dashboard/web/webhook-logs-page.js +195 -0
  296. package/dist/dashboard/web/webhook-logs-page.js.map +1 -0
  297. package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -1
  298. package/dist/dashboard/web/whiteboards-page.js +18 -23
  299. package/dist/dashboard/web/whiteboards-page.js.map +1 -1
  300. package/dist/dashboard/web/workflow-version-switch.d.ts +8 -0
  301. package/dist/dashboard/web/workflow-version-switch.d.ts.map +1 -0
  302. package/dist/dashboard/web/workflow-version-switch.js +9 -0
  303. package/dist/dashboard/web/workflow-version-switch.js.map +1 -0
  304. package/dist/dashboard/web/workflows.d.ts +272 -1
  305. package/dist/dashboard/web/workflows.d.ts.map +1 -1
  306. package/dist/dashboard/web/workflows.js +211 -1397
  307. package/dist/dashboard/web/workflows.js.map +1 -1
  308. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  309. package/dist/dashboard/webhook-routes.js +92 -39
  310. package/dist/dashboard/webhook-routes.js.map +1 -1
  311. package/dist/dashboard-web/app.js +1 -65
  312. package/dist/dashboard-web/brand-logo.png +0 -0
  313. package/dist/dashboard-web/chunks/bot-defaults-page-HSQ6HR3R.js +1 -0
  314. package/dist/dashboard-web/chunks/chunk-6TPODDDC.js +1 -0
  315. package/dist/dashboard-web/chunks/chunk-73EJP2MO.js +1 -0
  316. package/dist/dashboard-web/chunks/chunk-BRTZFELS.js +1 -0
  317. package/dist/dashboard-web/chunks/chunk-EVK77ASG.js +1 -0
  318. package/dist/dashboard-web/chunks/chunk-R3FXBFQH.js +1 -0
  319. package/dist/dashboard-web/chunks/chunk-VRLL7SNU.js +1 -0
  320. package/dist/dashboard-web/chunks/chunk-XCPSHD3G.js +37 -0
  321. package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
  322. package/dist/dashboard-web/chunks/chunk-YVRWYGXR.js +1 -0
  323. package/dist/dashboard-web/chunks/chunk-ZJING6FY.js +66 -0
  324. package/dist/dashboard-web/chunks/connectors-page-ODUA5UCW.js +1 -0
  325. package/dist/dashboard-web/chunks/groups-page-OYX5M6NK.js +8 -0
  326. package/dist/dashboard-web/chunks/insights-page-YCQO6OCR.js +22 -0
  327. package/dist/dashboard-web/chunks/legacy-workflow-page-XJAUNONP.js +2 -0
  328. package/dist/dashboard-web/chunks/{monitor-room-RFX4HPS5.js → monitor-room-WTZNYAFV.js} +17 -15
  329. package/dist/dashboard-web/chunks/monitoring-page-R6LJUK7G.js +2 -0
  330. package/dist/dashboard-web/chunks/office-page-4OXK3GNR.js +1 -0
  331. package/dist/dashboard-web/chunks/overview-page-4MVEJY6U.js +1 -0
  332. package/dist/dashboard-web/chunks/roles-page-NQDW27VV.js +1 -0
  333. package/dist/dashboard-web/chunks/schedules-page-JRNKYHOX.js +1 -0
  334. package/dist/dashboard-web/chunks/sessions-page-LF7UVI7B.js +3 -0
  335. package/dist/dashboard-web/chunks/settings-page-WGW7KQQS.js +2 -0
  336. package/dist/dashboard-web/chunks/skills-page-AMD4XP3T.js +3 -0
  337. package/dist/dashboard-web/chunks/team-federation-page-SYG3K4GG.js +1 -0
  338. package/dist/dashboard-web/chunks/v3-page-6NFFWNUK.js +94 -0
  339. package/dist/dashboard-web/chunks/whiteboards-page-FBRUK2AS.js +1 -0
  340. package/dist/dashboard-web/favicon.png +0 -0
  341. package/dist/dashboard-web/index.html +5 -69
  342. package/dist/dashboard-web/style.css +18835 -7211
  343. package/dist/dashboard.js +150 -32
  344. package/dist/dashboard.js.map +1 -1
  345. package/dist/global-config.d.ts +2 -2
  346. package/dist/global-config.d.ts.map +1 -1
  347. package/dist/i18n/en.d.ts.map +1 -1
  348. package/dist/i18n/en.js +3 -0
  349. package/dist/i18n/en.js.map +1 -1
  350. package/dist/i18n/zh.d.ts.map +1 -1
  351. package/dist/i18n/zh.js +3 -0
  352. package/dist/i18n/zh.js.map +1 -1
  353. package/dist/im/lark/card-builder.d.ts +7 -5
  354. package/dist/im/lark/card-builder.d.ts.map +1 -1
  355. package/dist/im/lark/card-builder.js +10 -7
  356. package/dist/im/lark/card-builder.js.map +1 -1
  357. package/dist/im/lark/card-handler.d.ts.map +1 -1
  358. package/dist/im/lark/card-handler.js +25 -1
  359. package/dist/im/lark/card-handler.js.map +1 -1
  360. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  361. package/dist/im/lark/event-dispatcher.js +84 -0
  362. package/dist/im/lark/event-dispatcher.js.map +1 -1
  363. package/dist/platform/binding.d.ts +9 -0
  364. package/dist/platform/binding.d.ts.map +1 -1
  365. package/dist/platform/binding.js +14 -0
  366. package/dist/platform/binding.js.map +1 -1
  367. package/dist/platform/tunnel-client.d.ts.map +1 -1
  368. package/dist/platform/tunnel-client.js +9 -0
  369. package/dist/platform/tunnel-client.js.map +1 -1
  370. package/dist/services/bot-config-store.d.ts +1 -1
  371. package/dist/services/bot-config-store.d.ts.map +1 -1
  372. package/dist/services/bot-config-store.js +11 -5
  373. package/dist/services/bot-config-store.js.map +1 -1
  374. package/dist/services/file-bridge-path.d.ts +8 -0
  375. package/dist/services/file-bridge-path.d.ts.map +1 -0
  376. package/dist/services/file-bridge-path.js +75 -0
  377. package/dist/services/file-bridge-path.js.map +1 -0
  378. package/dist/services/grok-paths.d.ts +27 -0
  379. package/dist/services/grok-paths.d.ts.map +1 -0
  380. package/dist/services/grok-paths.js +106 -0
  381. package/dist/services/grok-paths.js.map +1 -0
  382. package/dist/services/grok-transcript.d.ts +67 -0
  383. package/dist/services/grok-transcript.d.ts.map +1 -0
  384. package/dist/services/grok-transcript.js +630 -0
  385. package/dist/services/grok-transcript.js.map +1 -0
  386. package/dist/services/hermes-session-filter.d.ts +28 -0
  387. package/dist/services/hermes-session-filter.d.ts.map +1 -0
  388. package/dist/services/hermes-session-filter.js +53 -0
  389. package/dist/services/hermes-session-filter.js.map +1 -0
  390. package/dist/services/hermes-transcript.d.ts +3 -0
  391. package/dist/services/hermes-transcript.d.ts.map +1 -1
  392. package/dist/services/hermes-transcript.js +20 -2
  393. package/dist/services/hermes-transcript.js.map +1 -1
  394. package/dist/services/resumable-session-discovery.d.ts +3 -0
  395. package/dist/services/resumable-session-discovery.d.ts.map +1 -1
  396. package/dist/services/resumable-session-discovery.js +6 -1
  397. package/dist/services/resumable-session-discovery.js.map +1 -1
  398. package/dist/services/skill-registry-store.d.ts +9 -0
  399. package/dist/services/skill-registry-store.d.ts.map +1 -1
  400. package/dist/services/skill-registry-store.js +304 -1
  401. package/dist/services/skill-registry-store.js.map +1 -1
  402. package/dist/services/structured-bridge-clis.d.ts +29 -0
  403. package/dist/services/structured-bridge-clis.d.ts.map +1 -0
  404. package/dist/services/structured-bridge-clis.js +76 -0
  405. package/dist/services/structured-bridge-clis.js.map +1 -0
  406. package/dist/services/trigger-log-store.d.ts +59 -0
  407. package/dist/services/trigger-log-store.d.ts.map +1 -1
  408. package/dist/services/trigger-log-store.js +81 -10
  409. package/dist/services/trigger-log-store.js.map +1 -1
  410. package/dist/services/usage-ledger.d.ts +4 -1
  411. package/dist/services/usage-ledger.d.ts.map +1 -1
  412. package/dist/services/usage-ledger.js +48 -10
  413. package/dist/services/usage-ledger.js.map +1 -1
  414. package/dist/services/webhook-audit.d.ts +10 -0
  415. package/dist/services/webhook-audit.d.ts.map +1 -0
  416. package/dist/services/webhook-audit.js +116 -0
  417. package/dist/services/webhook-audit.js.map +1 -0
  418. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  419. package/dist/setup/bot-config-editor.js +2 -0
  420. package/dist/setup/bot-config-editor.js.map +1 -1
  421. package/dist/setup/ensure-tmux.d.ts +26 -12
  422. package/dist/setup/ensure-tmux.d.ts.map +1 -1
  423. package/dist/setup/ensure-tmux.js +85 -18
  424. package/dist/setup/ensure-tmux.js.map +1 -1
  425. package/dist/skills/definitions.d.ts.map +1 -1
  426. package/dist/skills/definitions.js +14 -1
  427. package/dist/skills/definitions.js.map +1 -1
  428. package/dist/skills/injection-mode.d.ts +16 -0
  429. package/dist/skills/injection-mode.d.ts.map +1 -1
  430. package/dist/skills/injection-mode.js +25 -0
  431. package/dist/skills/injection-mode.js.map +1 -1
  432. package/dist/types.d.ts +9 -0
  433. package/dist/types.d.ts.map +1 -1
  434. package/dist/utils/global-install.d.ts +22 -0
  435. package/dist/utils/global-install.d.ts.map +1 -0
  436. package/dist/utils/global-install.js +106 -0
  437. package/dist/utils/global-install.js.map +1 -0
  438. package/dist/utils/install-diagnostics.d.ts +1 -1
  439. package/dist/utils/install-diagnostics.d.ts.map +1 -1
  440. package/dist/utils/install-diagnostics.js +6 -4
  441. package/dist/utils/install-diagnostics.js.map +1 -1
  442. package/dist/utils/install-info.d.ts +2 -0
  443. package/dist/utils/install-info.d.ts.map +1 -1
  444. package/dist/utils/install-info.js +10 -4
  445. package/dist/utils/install-info.js.map +1 -1
  446. package/dist/worker.js +293 -172
  447. package/dist/worker.js.map +1 -1
  448. package/dist/workflows/events/payloads.d.ts +10 -10
  449. package/dist/workflows/events/schema.d.ts +28 -28
  450. package/package.json +8 -7
  451. package/dist/dashboard/web/connectors.d.ts +0 -2
  452. package/dist/dashboard/web/connectors.d.ts.map +0 -1
  453. package/dist/dashboard/web/connectors.js +0 -2
  454. package/dist/dashboard/web/connectors.js.map +0 -1
  455. package/dist/dashboard/web/office.d.ts +0 -2
  456. package/dist/dashboard/web/office.d.ts.map +0 -1
  457. package/dist/dashboard/web/office.js +0 -2
  458. package/dist/dashboard/web/office.js.map +0 -1
  459. package/dist/dashboard/web/schedules.d.ts +0 -2
  460. package/dist/dashboard/web/schedules.d.ts.map +0 -1
  461. package/dist/dashboard/web/schedules.js +0 -2
  462. package/dist/dashboard/web/schedules.js.map +0 -1
  463. package/dist/dashboard/web/settings.d.ts +0 -2
  464. package/dist/dashboard/web/settings.d.ts.map +0 -1
  465. package/dist/dashboard/web/settings.js +0 -2
  466. package/dist/dashboard/web/settings.js.map +0 -1
  467. package/dist/dashboard/web/skills.d.ts +0 -2
  468. package/dist/dashboard/web/skills.d.ts.map +0 -1
  469. package/dist/dashboard/web/skills.js +0 -2
  470. package/dist/dashboard/web/skills.js.map +0 -1
  471. package/dist/dashboard/web/skin-intro.d.ts +0 -4
  472. package/dist/dashboard/web/skin-intro.d.ts.map +0 -1
  473. package/dist/dashboard/web/skin-intro.js +0 -49
  474. package/dist/dashboard/web/skin-intro.js.map +0 -1
  475. package/dist/dashboard/web/v3.d.ts +0 -3
  476. package/dist/dashboard/web/v3.d.ts.map +0 -1
  477. package/dist/dashboard/web/v3.js +0 -539
  478. package/dist/dashboard/web/v3.js.map +0 -1
  479. package/dist/dashboard/web/whiteboards.d.ts +0 -2
  480. package/dist/dashboard/web/whiteboards.d.ts.map +0 -1
  481. package/dist/dashboard/web/whiteboards.js +0 -2
  482. package/dist/dashboard/web/whiteboards.js.map +0 -1
  483. package/dist/dashboard-web/chunks/bot-defaults-page-OCIHPGEU.js +0 -438
  484. package/dist/dashboard-web/chunks/chunk-3N2PPQVD.js +0 -1
  485. package/dist/dashboard-web/chunks/chunk-3UJYRR2Q.js +0 -37
  486. package/dist/dashboard-web/chunks/chunk-5E3MJJL4.js +0 -1
  487. package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +0 -1
  488. package/dist/dashboard-web/chunks/chunk-JTSE5VP6.js +0 -54
  489. package/dist/dashboard-web/chunks/chunk-LXIK7OUJ.js +0 -1
  490. package/dist/dashboard-web/chunks/chunk-PE6W3C2C.js +0 -1
  491. package/dist/dashboard-web/chunks/chunk-QW54DWU3.js +0 -325
  492. package/dist/dashboard-web/chunks/connectors-IGETYWCP.js +0 -1
  493. package/dist/dashboard-web/chunks/groups-page-MYBS4ZYJ.js +0 -207
  494. package/dist/dashboard-web/chunks/insights-page-UPA32V2S.js +0 -309
  495. package/dist/dashboard-web/chunks/monitoring-page-7T3BESZ2.js +0 -1
  496. package/dist/dashboard-web/chunks/office-page-6DXYOG55.js +0 -1
  497. package/dist/dashboard-web/chunks/overview-page-LJSBCQW4.js +0 -1
  498. package/dist/dashboard-web/chunks/roles-page-ESURTVQH.js +0 -98
  499. package/dist/dashboard-web/chunks/schedules-LML2ISOT.js +0 -1
  500. package/dist/dashboard-web/chunks/sessions-YB73XOTU.js +0 -1
  501. package/dist/dashboard-web/chunks/sessions-page-MCO5QR7Z.js +0 -1
  502. package/dist/dashboard-web/chunks/settings-page-OSDKNVS3.js +0 -2
  503. package/dist/dashboard-web/chunks/skills-page-PXBZJ6P6.js +0 -2
  504. package/dist/dashboard-web/chunks/team-federation-page-TTPVHFPX.js +0 -10
  505. package/dist/dashboard-web/chunks/v3-page-FVPUL665.js +0 -149
  506. package/dist/dashboard-web/chunks/whiteboards-page-HLCTYSSV.js +0 -1
  507. package/dist/dashboard-web/chunks/workflows-FCPM4S4D.js +0 -184
  508. package/dist/dashboard-web/skins/bluearchive-hero.webp +0 -0
  509. package/dist/dashboard-web/skins/dragonball-goku.webp +0 -0
  510. package/dist/dashboard-web/skins/dragonball-wukong.webp +0 -0
  511. package/dist/dashboard-web/skins/genshin-breeze.webp +0 -0
  512. package/dist/dashboard-web/skins/ikun-hero.webp +0 -0
  513. package/dist/dashboard-web/skins/prts-priestess.webp +0 -0
  514. package/dist/dashboard-web/skins/zzz-hero.webp +0 -0
  515. package/dist/dashboard-web/skins/zzz-pattern.svg +0 -25
@@ -1,23 +1,30 @@
1
- import { t, escapeHtml } from './ui.js';
2
- let dialog = null;
3
- let pollTimer = null;
4
- // ttadk 模型默认值 + 候选 (随 /api/cli-options 一起拉取, 单一事实源在 cli-selection).
5
- let ttadkModelDefault = 'glm-5.1';
6
- let ttadkModelSuggestions = [];
7
- function stopPolling() {
8
- if (pollTimer !== null) {
9
- window.clearInterval(pollTimer);
10
- pollTimer = null;
11
- }
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { DropdownMenu } from './dashboard-components.js';
4
+ import { t } from './ui.js';
5
+ export const OPEN_BOT_ONBOARDING_EVENT = 'botmux:open-bot-onboarding';
6
+ const DEFAULT_CLI_OPTION = { id: 'claude-code', label: 'Claude' };
7
+ const DEFAULT_TTADK_MODEL = 'glm-5.1';
8
+ function defaultCliOptionsState() {
9
+ return {
10
+ options: [DEFAULT_CLI_OPTION],
11
+ ttadkModelDefault: DEFAULT_TTADK_MODEL,
12
+ ttadkModelSuggestions: [],
13
+ };
14
+ }
15
+ function defaultFormState() {
16
+ return {
17
+ cliId: DEFAULT_CLI_OPTION.id,
18
+ dirMode: 'fixed',
19
+ workingDir: '~',
20
+ model: '',
21
+ };
22
+ }
23
+ function caughtErrorText(error) {
24
+ return error instanceof Error ? error.message : String(error);
12
25
  }
13
- function ensureDialog() {
14
- if (dialog)
15
- return dialog;
16
- dialog = document.createElement('dialog');
17
- dialog.className = 'onboarding-dialog';
18
- document.body.appendChild(dialog);
19
- dialog.addEventListener('close', stopPolling);
20
- return dialog;
26
+ function shouldStopPolling(job) {
27
+ return job.status === 'completed' || job.status === 'failed' || job.status === 'needs_owner';
21
28
  }
22
29
  function statusText(job) {
23
30
  if (job.status === 'waiting_for_scan')
@@ -36,315 +43,263 @@ function statusText(job) {
36
43
  if (job.status === 'completed')
37
44
  return t('botOnboarding.completed');
38
45
  if (job.status === 'failed')
39
- return `${t('botOnboarding.failed')}: ${escapeHtml(job.message ?? job.error ?? 'unknown')}`;
46
+ return `${t('botOnboarding.failed')}: ${job.message ?? job.error ?? 'unknown'}`;
40
47
  return t('botOnboarding.starting');
41
48
  }
42
- /** 完成页 / 待填 owner 页的权限摘要 / 手动兜底步骤. */
43
- function permissionBlock(job) {
44
- if ((job.status !== 'completed' && job.status !== 'needs_owner') || !job.permission)
45
- return '';
46
- const p = job.permission;
47
- if (p.ok) {
48
- const parts = [t('botOnboarding.permissionOk', { count: p.scopeCount ?? 0 })];
49
- if (p.skippedScopeCount && p.skippedScopeCount > 0) {
50
- parts.push(t('botOnboarding.permissionSkipped', { count: p.skippedScopeCount }));
51
- }
52
- if (p.versionId)
53
- parts.push(t('botOnboarding.permissionVersion', { version: escapeHtml(p.versionId) }));
54
- let html = `<p class="hint-ok">✅ ${parts.join(' ')}</p>`;
55
- if (p.scopeWarning)
56
- html += `<p class="hint-warn">⚠️ ${escapeHtml(p.scopeWarning)}</p>`;
57
- return html;
58
- }
59
- // 自动配置失败 → 手动步骤深链
60
- const steps = (job.remainingSteps ?? [])
61
- .map(s => `<li><a href="${escapeHtml(s.url)}" target="_blank" rel="noopener">${escapeHtml(s.title)}</a></li>`)
62
- .join('');
63
- return `<p class="hint-warn">⚠️ ${t('botOnboarding.permissionManual')}${p.message ? `(${escapeHtml(p.message)})` : ''}</p>`
64
- + (steps ? `<ol class="onboarding-steps">${steps}</ol>` : '');
65
- }
66
- /** needs_owner:扫码人身份验证不了, 让用户手动填 owner (带内联报错). */
67
- function ownerBlock(job, ownerError) {
68
- if (job.status !== 'needs_owner')
69
- return '';
70
- const errorHtml = ownerError ? `<p class="form-error">${escapeHtml(ownerError)}</p>` : '';
71
- return `<form id="ob-owner-form" class="onboarding-form">
72
- <label class="onboarding-field">
73
- <span>${t('botOnboarding.ownerLabel')}</span>
74
- <input id="ob-owner" type="text" placeholder="${t('botOnboarding.ownerPlaceholder')}" autocomplete="off" spellcheck="false">
75
- </label>
76
- <p class="hint-warn">${t('botOnboarding.ownerHint')}</p>
77
- ${errorHtml}
78
- <menu class="onboarding-actions">
79
- <button type="submit" class="primary">${t('botOnboarding.ownerSubmit')}</button>
80
- </menu>
81
- </form>`;
82
- }
83
- function renderJob(job, ownerError) {
84
- const d = ensureDialog();
85
- // 第 1 个二维码: 扫码建应用
86
- const appQr = job.status === 'waiting_for_scan' && job.qrDataUrl
87
- ? `<div class="qr-card">
88
- <img class="qr-image" src="${job.qrDataUrl}" alt="${t('botOnboarding.qrAlt')}">
89
- ${job.qrUrl ? `<a class="onboarding-link" href="${escapeHtml(job.qrUrl)}" target="_blank" rel="noopener">${t('botOnboarding.openLink')}</a>` : ''}
90
- </div>`
91
- : '';
92
- // 第 2 个二维码: 扫码登录开放平台 (自动配权限用; 它是 payload, 没有可点链接)
93
- const platformQr = job.status === 'waiting_for_platform_scan' && job.platformQrDataUrl
94
- ? `<div class="qr-card">
95
- <img class="qr-image" src="${job.platformQrDataUrl}" alt="${t('botOnboarding.platformQrAlt')}">
96
- </div>`
97
- : '';
98
- const metaLine = job.appId
99
- ? `<p><b>App ID:</b> <code>${escapeHtml(job.appId)}</code>`
100
- + (job.cliId ? ` | <b>CLI:</b> <code>${escapeHtml(job.cliId)}</code>` : '')
101
- + (job.workingDir ? ` | <b>${t('botOnboarding.metaDir')}:</b> <code>${escapeHtml(job.workingDir)}</code>` : '')
102
- + `</p>`
103
- : '';
104
- // 落盘完成后:新 bot 已自动上线(start-bot 成功)→ 「无需重启」;否则回退到重启提示。
105
- const restartHint = job.status === 'completed'
106
- ? (job.liveStarted
107
- ? `<p class="hint-ok">${t('botOnboarding.liveOk')}</p>`
108
- : `<p class="hint-ok">${t('botOnboarding.restartHint')}</p>`)
109
- : '';
110
- d.innerHTML = `<article>
111
- <header>
112
- <h3>${t('botOnboarding.title')}</h3>
113
- <p>${t('botOnboarding.intro')}</p>
114
- </header>
115
- <p class="onboarding-status status-${job.status}">${statusText(job)}</p>
116
- ${appQr}
117
- ${platformQr}
118
- ${metaLine}
119
- ${permissionBlock(job)}
120
- ${ownerBlock(job, ownerError)}
121
- ${restartHint}
122
- <form method="dialog"><button>${t('botOnboarding.close')}</button></form>
123
- </article>`;
124
- // needs_owner:把提交挂上去 (走 /owner 端点, 通过校验后转 completed)。
125
- if (job.status === 'needs_owner') {
126
- const ownerForm = d.querySelector('#ob-owner-form');
127
- ownerForm?.addEventListener('submit', ev => {
128
- ev.preventDefault();
129
- const owner = d.querySelector('#ob-owner')?.value ?? '';
130
- void submitOwner(job, owner);
131
- });
132
- }
133
- }
134
- async function submitOwner(job, ownerRaw) {
135
- if (!ownerRaw.trim()) {
136
- renderJob(job, t('botOnboarding.ownerEmpty'));
137
- return;
138
- }
139
- try {
140
- const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(job.id)}/owner`, {
141
- method: 'POST',
142
- headers: { 'content-type': 'application/json' },
143
- body: JSON.stringify({ owner: ownerRaw.trim() }),
144
- });
145
- const body = await res.json();
146
- if (!res.ok) {
147
- // 校验失败 (格式 / 不可用): 留在 needs_owner 内联报错, 不丢已填值的语义。
148
- renderJob(job, body?.message ?? body?.error ?? t('botOnboarding.ownerInvalid'));
149
- return;
150
- }
151
- if (body?.job)
152
- renderJob(body.job);
153
- }
154
- catch (err) {
155
- renderJob(job, err instanceof Error ? err.message : String(err));
156
- }
157
- }
158
49
  async function fetchCliOptions() {
159
50
  try {
160
51
  const res = await fetch('/api/cli-options');
161
52
  const body = await res.json();
162
53
  if (res.ok && Array.isArray(body?.options)) {
163
- if (typeof body.ttadkModelDefault === 'string' && body.ttadkModelDefault.trim()) {
164
- ttadkModelDefault = body.ttadkModelDefault.trim();
165
- }
166
- if (Array.isArray(body.ttadkModelSuggestions)) {
167
- ttadkModelSuggestions = body.ttadkModelSuggestions.filter((s) => typeof s === 'string');
168
- }
169
- return body.options;
54
+ const ttadkModelDefault = typeof body.ttadkModelDefault === 'string' && body.ttadkModelDefault.trim()
55
+ ? body.ttadkModelDefault.trim()
56
+ : DEFAULT_TTADK_MODEL;
57
+ const ttadkModelSuggestions = Array.isArray(body.ttadkModelSuggestions)
58
+ ? body.ttadkModelSuggestions.filter((item) => typeof item === 'string')
59
+ : [];
60
+ return {
61
+ options: body.options,
62
+ ttadkModelDefault,
63
+ ttadkModelSuggestions,
64
+ };
170
65
  }
171
66
  }
172
67
  catch { /* fall through to default */ }
173
- return [{ id: 'claude-code', label: 'Claude' }];
68
+ return defaultCliOptionsState();
174
69
  }
175
- /**
176
- * 根据当前选中的 CLI 调整模型输入框:
177
- * - ttadk 网关 (接受 -m): 候选下拉 + 默认值 (空框时回填 ttadk 默认模型)
178
- * - ttadk CoCo (不接受 -m): 禁用并提示无需模型
179
- * - 其它 CLI: 普通占位, 留空走 CLI 默认模型
180
- * 仅在切换到「之前不是同类」时回填默认值, 不覆盖用户已手填的内容。
181
- */
182
- function syncModelFieldForCli(opts) {
183
- const d = dialog;
184
- if (!d)
185
- return;
186
- const cli = d.querySelector('#ob-cli');
187
- const model = d.querySelector('#ob-model');
188
- const list = d.querySelector('#ob-model-suggestions');
189
- if (!cli || !model)
190
- return;
191
- const opt = opts.find(o => o.id === cli.value);
192
- const isTtadk = opt?.gateway === 'ttadk';
193
- const acceptsModel = isTtadk && opt?.acceptsModel !== false;
70
+ function syncModelForCli(form, cliId, cliState) {
71
+ const option = cliState.options.find(item => item.id === cliId);
72
+ const isTtadk = option?.gateway === 'ttadk';
73
+ const acceptsModel = isTtadk && option?.acceptsModel !== false;
74
+ let model = form.model;
194
75
  if (isTtadk && !acceptsModel) {
195
- // CoCo: ttadk 不接受 -m
196
- model.value = '';
197
- model.disabled = true;
198
- model.placeholder = t('botOnboarding.modelTtadkCocoPlaceholder');
199
- return;
76
+ model = '';
200
77
  }
201
- model.disabled = false;
202
- if (acceptsModel) {
203
- if (list)
204
- list.innerHTML = ttadkModelSuggestions.map(m => `<option value="${escapeHtml(m)}"></option>`).join('');
205
- model.placeholder = t('botOnboarding.modelTtadkPlaceholder').replace('{model}', ttadkModelDefault);
206
- // 切到 ttadk 且用户没手填 → 回填默认模型, 让「不写 wrapper、开箱即用」成立.
207
- if (!model.value.trim())
208
- model.value = ttadkModelDefault;
78
+ else if (acceptsModel && !model.trim()) {
79
+ model = cliState.ttadkModelDefault;
209
80
  }
210
- else {
211
- if (list)
212
- list.innerHTML = '';
213
- model.placeholder = t('botOnboarding.modelPlaceholder');
214
- // 从 ttadk 切回普通 CLI: 清掉之前回填的 ttadk 默认模型, 避免误带.
215
- if (model.value.trim() === ttadkModelDefault)
216
- model.value = '';
81
+ else if (!acceptsModel && model.trim() === cliState.ttadkModelDefault) {
82
+ model = '';
217
83
  }
84
+ return { ...form, cliId, model };
218
85
  }
219
- function renderForm(options, errorMsg) {
220
- const d = ensureDialog();
221
- const optionHtml = options
222
- .map(o => `<option value="${escapeHtml(o.id)}">${escapeHtml(o.label)}(${escapeHtml(o.id)})</option>`)
223
- .join('');
224
- const errorHtml = errorMsg ? `<p class="form-error">${escapeHtml(errorMsg)}</p>` : '';
225
- d.innerHTML = `<article>
226
- <header>
227
- <h3>${t('botOnboarding.title')}</h3>
228
- <p>${t('botOnboarding.intro')}</p>
229
- </header>
230
- <form id="onboarding-form" class="onboarding-form">
231
- <label class="onboarding-field">
232
- <span>${t('botOnboarding.cliLabel')}</span>
233
- <select id="ob-cli">${optionHtml}</select>
234
- </label>
235
- <label class="onboarding-field">
236
- <span>${t('botOnboarding.dirModeLabel')}</span>
237
- <select id="ob-dir-mode">
238
- <option value="fixed">${t('botOnboarding.dirModeFixed')}</option>
239
- <option value="card">${t('botOnboarding.dirModeCard')}</option>
240
- </select>
241
- </label>
242
- <label class="onboarding-field">
243
- <span id="ob-dir-label">${t('botOnboarding.dirLabelFixed')}</span>
244
- <input id="ob-dir" type="text" value="~" placeholder="${t('botOnboarding.dirPlaceholderFixed')}" autocomplete="off" spellcheck="false">
245
- </label>
246
- <label class="onboarding-field">
247
- <span>${t('botOnboarding.modelLabel')}</span>
248
- <input id="ob-model" type="text" list="ob-model-suggestions" placeholder="${t('botOnboarding.modelPlaceholder')}" autocomplete="off" spellcheck="false">
249
- <datalist id="ob-model-suggestions"></datalist>
250
- </label>
251
- ${errorHtml}
252
- <menu class="onboarding-actions">
253
- <button type="button" id="ob-cancel">${t('botOnboarding.cancel')}</button>
254
- <button type="submit" class="primary">${t('botOnboarding.startScan')}</button>
255
- </menu>
256
- </form>
257
- </article>`;
258
- const form = d.querySelector('#onboarding-form');
259
- const cancel = d.querySelector('#ob-cancel');
260
- cancel?.addEventListener('click', () => d.close());
261
- // ttadk 网关项: 选中时把模型框默认成 ttadk 默认模型 + 挂候选 (CoCo 禁用).
262
- const cliSelect = d.querySelector('#ob-cli');
263
- cliSelect?.addEventListener('change', () => syncModelFieldForCli(options));
264
- syncModelFieldForCli(options);
265
- // 目录模式切换时同步目录框的标签/占位文案(fixed=固定默认目录 / card=扫描根)。
266
- const dirModeSelect = d.querySelector('#ob-dir-mode');
267
- const syncDirField = () => {
268
- const mode = dirModeSelect?.value === 'card' ? 'card' : 'fixed';
269
- const label = d.querySelector('#ob-dir-label');
270
- const dirInput = d.querySelector('#ob-dir');
271
- if (label)
272
- label.textContent = mode === 'card' ? t('botOnboarding.dirLabelCard') : t('botOnboarding.dirLabelFixed');
273
- if (dirInput)
274
- dirInput.placeholder = mode === 'card' ? t('botOnboarding.dirPlaceholderCard') : t('botOnboarding.dirPlaceholderFixed');
275
- };
276
- dirModeSelect?.addEventListener('change', syncDirField);
277
- form?.addEventListener('submit', ev => {
278
- ev.preventDefault();
279
- const cliId = d.querySelector('#ob-cli')?.value ?? '';
280
- const workingDir = d.querySelector('#ob-dir')?.value ?? '';
281
- const dirMode = d.querySelector('#ob-dir-mode')?.value === 'card' ? 'card' : 'fixed';
282
- const model = d.querySelector('#ob-model')?.value ?? '';
283
- void startOnboarding({ cliId, workingDir, dirMode, model }, options);
284
- });
86
+ function normalizeFormForOptions(form, cliState) {
87
+ const cliId = cliState.options.some(item => item.id === form.cliId)
88
+ ? form.cliId
89
+ : cliState.options[0]?.id ?? DEFAULT_CLI_OPTION.id;
90
+ return syncModelForCli(form, cliId, cliState);
285
91
  }
286
- async function startOnboarding(input, options) {
287
- stopPolling();
288
- renderJob({ id: '', status: 'starting' });
289
- try {
290
- const res = await fetch('/api/bot-onboarding/start', {
291
- method: 'POST',
292
- headers: { 'content-type': 'application/json' },
293
- body: JSON.stringify({
294
- cliId: input.cliId,
295
- workingDir: input.workingDir.trim(),
296
- dirMode: input.dirMode,
297
- model: input.model.trim() || undefined,
298
- }),
299
- });
300
- const body = await res.json();
301
- // 校验类错误 (目录不存在 / CLI 非法): 回到表单内联报错, 不丢用户已填的值.
302
- if (res.status === 400) {
303
- renderForm(options, body?.message ?? body?.error ?? 'invalid_input');
304
- return;
92
+ export async function openBotOnboarding() {
93
+ window.dispatchEvent(new Event(OPEN_BOT_ONBOARDING_EVENT));
94
+ }
95
+ function PermissionSummary(props) {
96
+ const { job } = props;
97
+ if ((job.status !== 'completed' && job.status !== 'needs_owner') || !job.permission)
98
+ return null;
99
+ const permission = job.permission;
100
+ if (permission.ok) {
101
+ const parts = [t('botOnboarding.permissionOk', { count: permission.scopeCount ?? 0 })];
102
+ if (permission.skippedScopeCount && permission.skippedScopeCount > 0) {
103
+ parts.push(t('botOnboarding.permissionSkipped', { count: permission.skippedScopeCount }));
305
104
  }
306
- if (!res.ok || !body?.job?.id)
105
+ if (permission.versionId)
106
+ parts.push(t('botOnboarding.permissionVersion', { version: permission.versionId }));
107
+ return (_jsxs(_Fragment, { children: [_jsx("p", { className: "hint-ok", children: parts.join(' ') }), permission.scopeWarning ? _jsx("p", { className: "hint-warn", children: permission.scopeWarning }) : null] }));
108
+ }
109
+ const steps = job.remainingSteps ?? [];
110
+ return (_jsxs(_Fragment, { children: [_jsxs("p", { className: "hint-warn", children: [t('botOnboarding.permissionManual'), permission.message ? `(${permission.message})` : ''] }), steps.length ? (_jsx("ol", { className: "onboarding-steps", children: steps.map(step => (_jsx("li", { children: _jsx("a", { href: step.url, target: "_blank", rel: "noopener", children: step.title }) }, `${step.title}:${step.url}`))) })) : null] }));
111
+ }
112
+ function OnboardingMeta(props) {
113
+ const { job } = props;
114
+ if (!job.appId)
115
+ return null;
116
+ return (_jsxs("p", { className: "onboarding-meta", children: [_jsx("b", { children: "App ID:" }), " ", _jsx("code", { children: job.appId }), job.cliId ? _jsxs(_Fragment, { children: [_jsx("span", { children: " / " }), _jsx("b", { children: "CLI:" }), " ", _jsx("code", { children: job.cliId })] }) : null, job.workingDir ? _jsxs(_Fragment, { children: [_jsx("span", { children: " / " }), _jsxs("b", { children: [t('botOnboarding.metaDir'), ":"] }), " ", _jsx("code", { children: job.workingDir })] }) : null] }));
117
+ }
118
+ function QrCard(props) {
119
+ return (_jsxs("div", { className: "qr-card", children: [_jsx("img", { className: "qr-image", src: props.dataUrl, alt: props.alt }), props.link ? (_jsx("a", { className: "onboarding-link", href: props.link, target: "_blank", rel: "noopener", children: t('botOnboarding.openLink') })) : null] }));
120
+ }
121
+ function onboardingOptionLabel(options, value) {
122
+ return options.find(option => option.value === value)?.label ?? value;
123
+ }
124
+ function OnboardingJobView(props) {
125
+ const { job, ownerError } = props.view;
126
+ return (_jsxs(_Fragment, { children: [_jsx("p", { className: `onboarding-status status-${job.status}`, children: statusText(job) }), job.status === 'waiting_for_scan' && job.qrDataUrl ? (_jsx(QrCard, { dataUrl: job.qrDataUrl, alt: t('botOnboarding.qrAlt'), link: job.qrUrl })) : null, job.status === 'waiting_for_platform_scan' && job.platformQrDataUrl ? (_jsx(QrCard, { dataUrl: job.platformQrDataUrl, alt: t('botOnboarding.platformQrAlt') })) : null, _jsx(OnboardingMeta, { job: job }), _jsx(PermissionSummary, { job: job }), job.status === 'needs_owner' ? (_jsxs("form", { className: "onboarding-form", id: "ob-owner-form", onSubmit: event => {
127
+ event.preventDefault();
128
+ props.onSubmitOwner(job, props.ownerInput);
129
+ }, children: [_jsxs("label", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.ownerLabel') }), _jsx("input", { id: "ob-owner", type: "text", placeholder: t('botOnboarding.ownerPlaceholder'), autoComplete: "off", spellCheck: false, value: props.ownerInput, onChange: event => props.onOwnerInputChange(event.currentTarget.value) })] }), _jsx("p", { className: "hint-warn", children: t('botOnboarding.ownerHint') }), ownerError ? _jsx("p", { className: "form-error", children: ownerError }) : null, _jsxs("div", { className: "actions onboarding-actions", children: [_jsx("button", { type: "button", onClick: props.onClose, children: t('botOnboarding.close') }), _jsx("button", { type: "submit", className: "primary onboarding-submit", children: t('botOnboarding.ownerSubmit') })] })] })) : null, job.status === 'completed' ? (_jsx("p", { className: "hint-ok", children: job.liveStarted ? t('botOnboarding.liveOk') : t('botOnboarding.restartHint') })) : null, job.status !== 'needs_owner' ? _jsx("div", { className: "actions onboarding-actions", children: _jsx("button", { type: "button", onClick: props.onClose, children: t('botOnboarding.close') }) }) : null] }));
130
+ }
131
+ function OnboardingForm(props) {
132
+ const selectedCli = props.cliState.options.find(option => option.id === props.form.cliId);
133
+ const acceptsModel = selectedCli?.gateway === 'ttadk' && selectedCli.acceptsModel !== false;
134
+ const modelDisabled = selectedCli?.gateway === 'ttadk' && selectedCli.acceptsModel === false;
135
+ const modelPlaceholder = modelDisabled
136
+ ? t('botOnboarding.modelTtadkCocoPlaceholder')
137
+ : acceptsModel
138
+ ? t('botOnboarding.modelTtadkPlaceholder').replace('{model}', props.cliState.ttadkModelDefault)
139
+ : t('botOnboarding.modelPlaceholder');
140
+ const dirLabel = props.form.dirMode === 'card' ? t('botOnboarding.dirLabelCard') : t('botOnboarding.dirLabelFixed');
141
+ const dirPlaceholder = props.form.dirMode === 'card'
142
+ ? t('botOnboarding.dirPlaceholderCard')
143
+ : t('botOnboarding.dirPlaceholderFixed');
144
+ const cliOptions = props.cliState.options.map(option => ({
145
+ value: option.id,
146
+ label: `${option.label}(${option.id})`,
147
+ }));
148
+ const dirModeOptions = [
149
+ { value: 'fixed', label: t('botOnboarding.dirModeFixed') },
150
+ { value: 'card', label: t('botOnboarding.dirModeCard') },
151
+ ];
152
+ return (_jsxs("form", { id: "onboarding-form", className: "onboarding-form", onSubmit: props.onSubmit, children: [_jsxs("div", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.cliLabel') }), _jsx(DropdownMenu, { id: "ob-cli", className: "onboarding-menu", ariaLabel: t('botOnboarding.cliLabel'), label: onboardingOptionLabel(cliOptions, props.form.cliId), value: props.form.cliId, options: cliOptions, onChange: cliId => {
153
+ props.onFormChange(syncModelForCli(props.form, cliId, props.cliState));
154
+ } })] }), _jsxs("div", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.dirModeLabel') }), _jsx(DropdownMenu, { id: "ob-dir-mode", className: "onboarding-menu", ariaLabel: t('botOnboarding.dirModeLabel'), label: onboardingOptionLabel(dirModeOptions, props.form.dirMode), value: props.form.dirMode, options: dirModeOptions, onChange: dirMode => props.onFormChange({ ...props.form, dirMode }) })] }), _jsxs("label", { className: "onboarding-field", children: [_jsx("span", { children: dirLabel }), _jsx("input", { id: "ob-dir", type: "text", value: props.form.workingDir, placeholder: dirPlaceholder, autoComplete: "off", spellCheck: false, onChange: event => props.onFormChange({ ...props.form, workingDir: event.currentTarget.value }) })] }), _jsxs("label", { className: "onboarding-field", children: [_jsx("span", { children: t('botOnboarding.modelLabel') }), _jsx("input", { id: "ob-model", type: "text", list: acceptsModel ? 'ob-model-suggestions' : undefined, placeholder: modelPlaceholder, autoComplete: "off", spellCheck: false, disabled: modelDisabled, value: props.form.model, onChange: event => props.onFormChange({ ...props.form, model: event.currentTarget.value }) }), acceptsModel ? (_jsx("datalist", { id: "ob-model-suggestions", children: props.cliState.ttadkModelSuggestions.map(model => _jsx("option", { value: model }, model)) })) : null] }), props.error ? _jsx("p", { className: "form-error", children: props.error }) : null, _jsxs("div", { className: "actions onboarding-actions", children: [_jsx("button", { type: "button", id: "ob-cancel", disabled: props.submitting, onClick: props.onClose, children: t('botOnboarding.cancel') }), _jsx("button", { type: "submit", className: "primary onboarding-submit", disabled: props.submitting, children: props.submitting ? t('botOnboarding.starting') : t('botOnboarding.startScan') })] })] }));
155
+ }
156
+ export function BotOnboardingDialog(props) {
157
+ const dialogRef = useRef(null);
158
+ const pollTimerRef = useRef(null);
159
+ const loadSeqRef = useRef(0);
160
+ const [cliState, setCliState] = useState(() => defaultCliOptionsState());
161
+ const [form, setForm] = useState(() => defaultFormState());
162
+ const [view, setView] = useState({ kind: 'form' });
163
+ const [submitting, setSubmitting] = useState(false);
164
+ const [ownerInput, setOwnerInput] = useState('');
165
+ const stopPolling = useCallback(() => {
166
+ if (pollTimerRef.current !== null) {
167
+ window.clearInterval(pollTimerRef.current);
168
+ pollTimerRef.current = null;
169
+ }
170
+ }, []);
171
+ const close = useCallback(() => {
172
+ stopPolling();
173
+ props.onClose();
174
+ }, [props, stopPolling]);
175
+ const applyJob = useCallback((job) => {
176
+ setView({ kind: 'job', job });
177
+ if (job.status === 'needs_owner')
178
+ setOwnerInput('');
179
+ if (shouldStopPolling(job))
180
+ stopPolling();
181
+ }, [stopPolling]);
182
+ const pollJob = useCallback(async (id) => {
183
+ const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(id)}`);
184
+ const body = await res.json();
185
+ if (!res.ok || !body?.job)
307
186
  throw new Error(body?.error ?? `http_${res.status}`);
308
- renderJob(body.job);
309
- pollTimer = window.setInterval(() => {
310
- void pollJob(body.job.id).catch(err => {
187
+ applyJob(body.job);
188
+ }, [applyJob]);
189
+ const startPolling = useCallback((id) => {
190
+ stopPolling();
191
+ pollTimerRef.current = window.setInterval(() => {
192
+ void pollJob(id).catch(error => {
311
193
  stopPolling();
312
- renderJob({ id: body.job.id, status: 'failed', message: err instanceof Error ? err.message : String(err) });
194
+ setView({ kind: 'job', job: { id, status: 'failed', message: caughtErrorText(error) } });
313
195
  });
314
196
  }, 1200);
315
- }
316
- catch (err) {
317
- renderJob({ id: '', status: 'failed', message: err instanceof Error ? err.message : String(err) });
318
- }
319
- }
320
- async function pollJob(id) {
321
- const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(id)}`);
322
- const body = await res.json();
323
- if (!res.ok || !body?.job)
324
- throw new Error(body?.error ?? `http_${res.status}`);
325
- renderJob(body.job);
326
- // needs_owner 也停轮询:它是等用户操作的状态, 继续轮询会周期性重渲染、清掉用户
327
- // 正在输入的 owner。后续由 owner 提交流程驱动渲染。
328
- if (body.job.status === 'completed' || body.job.status === 'failed' || body.job.status === 'needs_owner') {
197
+ }, [pollJob, stopPolling]);
198
+ const resetToForm = useCallback(() => {
329
199
  stopPolling();
330
- }
331
- }
332
- async function openBotOnboarding() {
333
- stopPolling();
334
- const d = ensureDialog();
335
- // 先出表单 (含 CLI 下拉占位), 再异步填充选项——避免空白等待.
336
- renderForm([{ id: 'claude-code', label: 'Claude' }]);
337
- if (!d.open)
338
- d.showModal();
339
- const options = await fetchCliOptions();
340
- // 用户可能在 fetch 期间已经提交/关闭; 仅当仍停留在表单时刷新选项.
341
- if (d.open && d.querySelector('#onboarding-form'))
342
- renderForm(options);
343
- }
344
- export function wireBotOnboardingButton() {
345
- const btn = document.getElementById('add-bot-btn');
346
- if (!btn)
347
- return;
348
- btn.onclick = () => { void openBotOnboarding(); };
200
+ const seq = loadSeqRef.current + 1;
201
+ loadSeqRef.current = seq;
202
+ const initialCliState = defaultCliOptionsState();
203
+ setCliState(initialCliState);
204
+ setForm(defaultFormState());
205
+ setView({ kind: 'form' });
206
+ setSubmitting(false);
207
+ setOwnerInput('');
208
+ void fetchCliOptions().then(next => {
209
+ if (loadSeqRef.current !== seq)
210
+ return;
211
+ setCliState(next);
212
+ setForm(current => normalizeFormForOptions(current, next));
213
+ });
214
+ }, [stopPolling]);
215
+ useEffect(() => {
216
+ if (props.open) {
217
+ resetToForm();
218
+ return;
219
+ }
220
+ stopPolling();
221
+ loadSeqRef.current += 1;
222
+ }, [props.open, resetToForm, stopPolling]);
223
+ useEffect(() => {
224
+ const dialog = dialogRef.current;
225
+ if (!dialog)
226
+ return;
227
+ if (props.open && !dialog.open) {
228
+ try {
229
+ dialog.showModal();
230
+ }
231
+ catch { /* already opening/unsupported */ }
232
+ }
233
+ else if (!props.open && dialog.open) {
234
+ dialog.close();
235
+ }
236
+ }, [props.open]);
237
+ useEffect(() => () => stopPolling(), [stopPolling]);
238
+ const submitForm = useCallback(async (event) => {
239
+ event.preventDefault();
240
+ stopPolling();
241
+ setSubmitting(true);
242
+ setView({ kind: 'job', job: { id: '', status: 'starting' } });
243
+ try {
244
+ const res = await fetch('/api/bot-onboarding/start', {
245
+ method: 'POST',
246
+ headers: { 'content-type': 'application/json' },
247
+ body: JSON.stringify({
248
+ cliId: form.cliId,
249
+ workingDir: form.workingDir.trim(),
250
+ dirMode: form.dirMode,
251
+ model: form.model.trim() || undefined,
252
+ }),
253
+ });
254
+ const body = await res.json();
255
+ if (res.status === 400) {
256
+ setView({ kind: 'form', error: body?.message ?? body?.error ?? 'invalid_input' });
257
+ return;
258
+ }
259
+ if (!res.ok || !body?.job?.id)
260
+ throw new Error(body?.error ?? `http_${res.status}`);
261
+ const job = body.job;
262
+ applyJob(job);
263
+ if (!shouldStopPolling(job))
264
+ startPolling(job.id);
265
+ }
266
+ catch (error) {
267
+ setView({ kind: 'job', job: { id: '', status: 'failed', message: caughtErrorText(error) } });
268
+ }
269
+ finally {
270
+ setSubmitting(false);
271
+ }
272
+ }, [applyJob, form, startPolling, stopPolling]);
273
+ const submitOwner = useCallback(async (job, ownerRaw) => {
274
+ if (!ownerRaw.trim()) {
275
+ setView({ kind: 'job', job, ownerError: t('botOnboarding.ownerEmpty') });
276
+ return;
277
+ }
278
+ try {
279
+ const res = await fetch(`/api/bot-onboarding/${encodeURIComponent(job.id)}/owner`, {
280
+ method: 'POST',
281
+ headers: { 'content-type': 'application/json' },
282
+ body: JSON.stringify({ owner: ownerRaw.trim() }),
283
+ });
284
+ const body = await res.json();
285
+ if (!res.ok) {
286
+ setView({ kind: 'job', job, ownerError: body?.message ?? body?.error ?? t('botOnboarding.ownerInvalid') });
287
+ return;
288
+ }
289
+ if (body?.job)
290
+ applyJob(body.job);
291
+ }
292
+ catch (error) {
293
+ setView({ kind: 'job', job, ownerError: caughtErrorText(error) });
294
+ }
295
+ }, [applyJob]);
296
+ const body = useMemo(() => {
297
+ if (view.kind === 'form') {
298
+ return (_jsx(OnboardingForm, { cliState: cliState, form: form, error: view.error, submitting: submitting, onFormChange: setForm, onSubmit: submitForm, onClose: close }));
299
+ }
300
+ return (_jsx(OnboardingJobView, { view: view, ownerInput: ownerInput, onOwnerInputChange: setOwnerInput, onSubmitOwner: submitOwner, onClose: close }));
301
+ }, [cliState, close, form, ownerInput, submitForm, submitOwner, submitting, view]);
302
+ return (_jsx("dialog", { className: "onboarding-dialog", ref: dialogRef, onClose: close, onClick: event => { if (event.target === event.currentTarget)
303
+ close(); }, children: _jsxs("article", { className: "onboarding-card", children: [_jsxs("header", { className: "onboarding-header", children: [_jsx("h3", { children: t('botOnboarding.title') }), _jsx("p", { children: t('botOnboarding.intro') })] }), body] }) }));
349
304
  }
350
305
  //# sourceMappingURL=bot-onboarding.js.map