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,493 +1,106 @@
1
- // Team (federation) page: manage this deployment's team membership across
2
- // deployments. Two sub-routes (workflow-style sub-nav):
3
- // #/team — My team: identity bind + every team I'm in (hosted + joined),
4
- // each a collapsible block (deployments → bots) with group-pull.
5
- // #/team/manage — Team management: create multiple hosted teams, per-team invite
6
- // codes, delete teams, join others' teams.
7
- // All dashboard-token authed (cookie). See docs/federation-design.md.
8
- import { escapeHtml, t } from './ui.js';
9
- async function jget(u) { const r = await fetch(u); return { status: r.status, body: await r.json().catch(() => ({})) }; }
10
- async function jsend(method, u, b) {
11
- const r = await fetch(u, { method, headers: { 'content-type': 'application/json' }, body: b ? JSON.stringify(b) : undefined });
12
- return { status: r.status, body: await r.json().catch(() => ({})) };
1
+ export { jget, jpost, jput, jsend };
2
+ export async function fetchHostedTeams() {
3
+ return jget('/api/team/hosted');
13
4
  }
14
- const jpost = (u, b) => jsend('POST', u, b);
15
- const jput = (u, b) => jsend('PUT', u, b);
16
- let localTeams = []; // teams THIS deployment hosts (default + created)
17
- let remoteTeams = []; // teams this deployment joined
18
- let myDeploymentId = '';
19
- let suggestedHubUrl = '';
20
- const pickedByTeam = new Map();
21
- const gnameByTeam = new Map(); // group-name draft per team — survives renderTeams() re-render
22
- const expandedTeams = new Set(); // default empty → all teams collapsed; click a team header to expand
23
- const expandedDeps = new Set(); // `${team.key}::${dep.id}` — default empty → deployment groups collapsed too
24
- let activeTeamGeneration = 0;
25
- function nextTeamGeneration() {
26
- activeTeamGeneration += 1;
27
- return activeTeamGeneration;
5
+ export async function fetchRemoteRoster() {
6
+ return jget('/api/team/remote-roster');
28
7
  }
29
- function isTeamGeneration(generation) {
30
- return activeTeamGeneration === generation;
8
+ export async function updateLocalBotCapability(larkAppId, capability) {
9
+ return jput('/api/team/local-bots/' + encodeURIComponent(larkAppId) + '/capability', { capability });
31
10
  }
32
- function $(id) { return document.getElementById(id); }
33
- function allTeams() { return [...localTeams, ...remoteTeams]; }
34
- function pickedSet(key) { let s = pickedByTeam.get(key); if (!s) {
35
- s = new Set();
36
- pickedByTeam.set(key, s);
37
- } return s; }
38
- function teamByKey(key) { return allTeams().find(t => t.key === key); }
39
- // ─────────────────────────── #/team (my team) ───────────────────────────
40
- function botMatch(b) {
41
- const q = (($('tf-search').value) || '').trim().toLowerCase();
42
- if (q && !((b.name || '') + ' ' + (b.cliId || '') + ' ' + (b.capability || '')).toLowerCase().includes(q))
43
- return false;
44
- const cli = $('tf-cli').value;
45
- if (cli && b.cliId !== cli)
46
- return false;
47
- if ($('tf-fcap').checked && !b.capability)
48
- return false;
49
- if ($('tf-frole').checked && !b.hasTeamRole)
50
- return false;
51
- return true;
11
+ export async function fetchLocalBotRole(larkAppId) {
12
+ return jget('/api/team/local-bots/' + encodeURIComponent(larkAppId) + '/role');
52
13
  }
53
- function renderTeamBody(t2, filtered) {
54
- const ordered = [...t2.deployments].sort((a, b) => (a.local === b.local ? 0 : a.local ? -1 : 1));
55
- let h = '';
56
- for (const dep of ordered) {
57
- const depBots = filtered.filter(x => x.deployment.id === dep.id);
58
- if (!depBots.length)
59
- continue;
60
- const mine = dep.id === myDeploymentId;
61
- const tag = mine ? t('team.tagLocal') : (dep.stale ? t('team.tagRemoteStale') : t('team.tagRemote'));
62
- // In a team I host, I can remove a joined member deployment (not myself).
63
- const rm = (t2.kind === 'local' && !mine)
64
- ? ` <button class="tf-rmmember ghost" data-team="${escapeHtml(t2.teamId)}" data-dep="${escapeHtml(dep.id)}" data-name="${escapeHtml(dep.name)}" style="font-size:12px">${t('team.removeMember')}</button>`
65
- : '';
66
- const depKey = `${t2.key}::${dep.id}`;
67
- const depOpen = expandedDeps.has(depKey);
68
- const npick = depBots.filter(b => pickedSet(t2.key).has(b.larkAppId)).length;
69
- h += `<div class="tf-dep-h" data-dk="${escapeHtml(depKey)}" style="cursor:pointer;margin:10px 0 2px"><b>${depOpen ? '▾' : '▸'} ${escapeHtml(dep.name)}</b> <span class="muted" style="font-size:12px">${t('team.depTag', { tag })} · ${t('team.depCount', { count: depBots.length })}${npick ? t('team.depSelected', { n: npick }) : ''}</span>${rm}</div>`;
70
- if (!depOpen)
71
- continue; // collapsed: header only (picks persist)
72
- h += '<table style="width:100%;border-collapse:collapse;font-size:14px"><tbody>';
73
- for (const b of depBots) {
74
- const app = escapeHtml(b.larkAppId);
75
- const ck = pickedSet(t2.key).has(b.larkAppId) ? ' checked' : '';
76
- const dim = b.deployment.stale ? 'opacity:.55' : '';
77
- const capCell = mine
78
- ? `<input class="tf-cap" data-app="${app}" value="${escapeHtml(b.capability || '')}" placeholder="${t('team.capPh')}" style="width:92%;padding:3px 6px">`
79
- : (b.capability ? escapeHtml(b.capability) : '<span class="muted">—</span>');
80
- // Role is edited on the Bot Defaults page now; here we only offer a
81
- // read-only view entry for this deployment's own bots that have one.
82
- const roleCell = b.hasTeamRole
83
- ? (mine
84
- ? `<button class="tf-role" data-app="${app}" data-name="${escapeHtml(b.name)}">${t('team.viewRole')}</button>`
85
- : t('team.hasRoleShort'))
86
- : '<span class="muted">—</span>';
87
- h += `<tr style="${dim}"><td style="padding:4px 8px"><input type="checkbox" class="tf-pick" data-tk="${escapeHtml(t2.key)}" data-app="${app}"${ck}></td>`
88
- + `<td style="padding:4px 8px">${escapeHtml(b.name)}</td><td style="padding:4px 8px" class="muted">${escapeHtml(b.cliId)}</td>`
89
- + `<td style="padding:4px 8px">${capCell}</td><td style="padding:4px 8px">${roleCell}</td></tr>`;
90
- }
91
- h += '</tbody></table>';
92
- }
93
- if (!h)
94
- h = `<p class="muted" style="margin:8px 0 0">${t('team.noMatch')}</p>`;
95
- h += `<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center">`
96
- + `<input class="tf-gname" data-tk="${escapeHtml(t2.key)}" value="${escapeHtml(gnameByTeam.get(t2.key) || '')}" placeholder="${t('team.gnamePh')}" style="min-width:200px">`
97
- + `<button class="tf-grp primary" data-tk="${escapeHtml(t2.key)}">${t('team.pullGroupBtn')}</button>`
98
- + `<span class="muted" style="font-size:13px">${t('team.pullGroupHint')}</span>`
99
- + `<span class="tf-gout" data-tk="${escapeHtml(t2.key)}" style="font-size:13px;display:block;flex-basis:100%"></span></div>`;
100
- return h;
14
+ export async function autoBindIdentity(unionId) {
15
+ return jpost('/api/team/identity/auto-bind', unionId ? { unionId } : undefined);
101
16
  }
102
- function renderTeams() {
103
- const el = $('tf-teams');
104
- const teams = allTeams();
105
- if (!teams.length) {
106
- el.innerHTML = `<p class="muted">${t('team.noTeams')}</p>`;
107
- $('tf-count').textContent = '';
108
- return;
109
- }
110
- let html = '';
111
- const shownIds = new Set(), totalIds = new Set();
112
- for (const t2 of teams) {
113
- const filtered = t2.bots.filter(botMatch);
114
- filtered.forEach(b => shownIds.add(b.larkAppId));
115
- t2.bots.forEach(b => totalIds.add(b.larkAppId));
116
- const visible = new Set(filtered.map(b => b.larkAppId));
117
- [...pickedSet(t2.key)].forEach(a => { if (!visible.has(a))
118
- pickedSet(t2.key).delete(a); });
119
- const col = !expandedTeams.has(t2.key); // collapsed unless explicitly expanded
120
- const conn = t2.kind === 'remote'
121
- ? (t2.ok ? ` <span class="ok" style="font-size:12px">${t('team.connected')}</span>` : ` <span class="err" style="font-size:12px">${t('team.connectFail', { error: escapeHtml(t2.error || '') })}</span>`)
122
- : ` <span class="muted" style="font-size:12px">${t('team.iHost')}</span>`;
123
- html += `<div class="card" style="margin:0 0 12px;padding:12px 14px;background:var(--bg-soft,#f6f7f9)">`
124
- + `<div class="tf-team-h" data-tk="${escapeHtml(t2.key)}" style="cursor:pointer;display:flex;align-items:center;gap:8px;flex-wrap:wrap">`
125
- + `<b style="font-size:15px">${col ? '▸' : '▾'} ${escapeHtml(t2.label)}</b>`
126
- + (t2.sub ? ` <span class="muted" style="font-size:12px">${escapeHtml(t2.sub)}</span>` : '')
127
- + conn
128
- + ` <span class="muted" style="font-size:12px">· ${t('team.teamMeta', { deps: t2.deployments.length, bots: t2.bots.length })}</span></div>`;
129
- if (!col)
130
- html += (t2.kind === 'remote' && !t2.ok) ? `<p class="muted" style="margin:8px 0 0">${t('team.rosterFail')}</p>` : renderTeamBody(t2, filtered);
131
- html += '</div>';
132
- }
133
- el.innerHTML = html;
134
- const acrossTeams = teams.length > 1 ? t('team.acrossTeams', { n: teams.length }) : '';
135
- const numStr = shownIds.size === totalIds.size ? `${totalIds.size}` : `${shownIds.size} / ${totalIds.size}`;
136
- $('tf-count').textContent = `· ${numStr} ${t('team.botsWord')}${acrossTeams}`;
137
- wireTeams(activeTeamGeneration);
17
+ export async function removeHostedTeamMember(teamId, deploymentId) {
18
+ return jsend('DELETE', `/api/team/hosted/${encodeURIComponent(teamId)}/members/${encodeURIComponent(deploymentId)}`);
138
19
  }
139
- function wireTeams(generation = activeTeamGeneration) {
140
- const el = $('tf-teams');
141
- el.querySelectorAll('.tf-team-h').forEach(h => {
142
- h.onclick = () => { const k = h.dataset.tk; if (expandedTeams.has(k))
143
- expandedTeams.delete(k);
144
- else
145
- expandedTeams.add(k); renderTeams(); };
146
- });
147
- el.querySelectorAll('.tf-dep-h').forEach(h => {
148
- h.onclick = () => { const k = h.dataset.dk; if (expandedDeps.has(k))
149
- expandedDeps.delete(k);
150
- else
151
- expandedDeps.add(k); renderTeams(); };
152
- });
153
- el.querySelectorAll('.tf-pick').forEach(cb => {
154
- cb.onchange = () => { const s = pickedSet(cb.dataset.tk); if (cb.checked)
155
- s.add(cb.dataset.app);
156
- else
157
- s.delete(cb.dataset.app); };
158
- });
159
- el.querySelectorAll('.tf-gname').forEach(inp => {
160
- inp.oninput = () => { gnameByTeam.set(inp.dataset.tk, inp.value); };
161
- });
162
- el.querySelectorAll('.tf-cap').forEach(inp => {
163
- inp.onchange = async () => {
164
- const app = inp.dataset.app, valv = inp.value;
165
- await jput('/api/team/local-bots/' + encodeURIComponent(app) + '/capability', { capability: valv });
166
- if (!isTeamGeneration(generation))
167
- return;
168
- allTeams().forEach(t2 => { const bb = t2.bots.find(b => b.larkAppId === app); if (bb)
169
- bb.capability = valv.trim() || null; });
170
- };
171
- });
172
- el.querySelectorAll('.tf-role').forEach(btn => { btn.onclick = () => openRoleModal(btn.dataset.app, btn.dataset.name || '', generation); });
173
- el.querySelectorAll('.tf-rmmember').forEach(btn => {
174
- btn.onclick = async (e) => {
175
- e.stopPropagation(); // inside the clickable dep header — don't toggle collapse
176
- if (!confirm(t('team.removeMemberConfirm', { name: btn.dataset.name || '' })))
177
- return;
178
- await jsend('DELETE', `/api/team/hosted/${encodeURIComponent(btn.dataset.team)}/members/${encodeURIComponent(btn.dataset.dep)}`);
179
- if (!isTeamGeneration(generation))
180
- return;
181
- void loadLocal(generation);
182
- };
183
- });
184
- el.querySelectorAll('.tf-grp').forEach(btn => {
185
- btn.onclick = async () => {
186
- const k = btn.dataset.tk;
187
- const t2 = teamByKey(k);
188
- if (!t2)
189
- return;
190
- const apps = [...pickedSet(k)];
191
- const out = el.querySelector(`.tf-gout[data-tk="${CSS.escape(k)}"]`);
192
- if (!apps.length) {
193
- out.innerHTML = `<span class="err">${t('team.errPickBot')}</span>`;
194
- return;
195
- }
196
- const name = (el.querySelector(`.tf-gname[data-tk="${CSS.escape(k)}"]`)?.value || '').trim() || t('team.defaultGroupName');
197
- out.innerHTML = `<span class="muted">${t('team.creatingGroup')}</span>`;
198
- const r = t2.kind === 'local'
199
- ? await jpost('/api/team/federated-group', { name, larkAppIds: apps, teamId: t2.teamId })
200
- : await jpost('/api/team/remote-group', { hubUrl: t2.hubUrl, teamId: t2.teamId, name, larkAppIds: apps });
201
- if (!isTeamGeneration(generation))
202
- return;
203
- renderGroupResult(out, r.body, r.status);
204
- if (r.body?.ok) {
205
- pickedSet(k).clear();
206
- gnameByTeam.delete(k);
207
- // Re-render so the form (group name + checkboxes) clears consistently for both
208
- // local & remote, then restore the success message/link a plain re-render would wipe.
209
- const resultHtml = out.innerHTML;
210
- const restore = () => {
211
- if (!isTeamGeneration(generation))
212
- return;
213
- const o = el.querySelector(`.tf-gout[data-tk="${CSS.escape(k)}"]`);
214
- if (o)
215
- o.innerHTML = resultHtml;
216
- };
217
- if (t2.kind === 'local')
218
- void loadLocal(generation).then(restore);
219
- else {
220
- renderTeams();
221
- restore();
222
- }
223
- }
224
- };
225
- });
20
+ export async function createFederatedGroup(teamId, name, larkAppIds) {
21
+ return jpost('/api/team/federated-group', { name, larkAppIds, teamId });
226
22
  }
227
- function renderGroupResult(out, b, status) {
228
- if (b?.ok && b.chatId) {
229
- const link = b.shareLink || ('https://applink.feishu.cn/client/chat/open?openChatId=' + encodeURIComponent(b.chatId));
230
- const invalid = (b.invalidBotIds || []).length ? ` <span class="err"> · ${t('team.invalidBots', { ids: escapeHtml((b.invalidBotIds || []).join(', ')) })}</span>` : '';
231
- const invOwners = (b.invalidOwnerUnionIds || []).length ? `<span class="err"> · ${t('team.invalidOwners', { n: (b.invalidOwnerUnionIds || []).length })}</span>` : '';
232
- const miss = b.missingOperatorIdentity ? `<span class="err"> · ${t('team.missingIdentity')}</span>` : '';
233
- const skipped = (b.skippedNoOwner || []).length ? `<span class="err"> · ${t('team.skippedNoOwner', { n: (b.skippedNoOwner || []).length })}</span>` : '';
234
- const by = b.delegatedTo ? t('team.delegatedBy', { name: escapeHtml(b.delegatedTo) }) : '';
235
- out.innerHTML = `<span class="ok">${t('team.groupCreated')}</span>${by} · <a href="${escapeHtml(link)}" target="_blank">${t('team.openInLark')}</a>${invalid}${invOwners}${miss}${skipped}`;
236
- }
237
- else {
238
- const e = b?.error || status;
239
- const msg = e === 'no_local_online_bot' ? t('team.errNoLocalBot')
240
- : e === 'all_bots_skipped_no_owner' ? t('team.errAllSkipped')
241
- : e === 'no_creator_available' ? t('team.errNoCreator')
242
- : e === 'delegation_timeout' ? t('team.errDelegationTimeout')
243
- : t('team.errGroupCreate', { error: String(e) });
244
- out.innerHTML = `<span class="err">${escapeHtml(String(msg))}</span>`;
245
- }
23
+ export async function createRemoteGroup(hubUrl, teamId, name, larkAppIds) {
24
+ return jpost('/api/team/remote-group', { hubUrl, teamId, name, larkAppIds });
246
25
  }
247
- async function openRoleModal(app, name, generation = activeTeamGeneration) {
248
- const r = await jget('/api/team/local-bots/' + encodeURIComponent(app) + '/role');
249
- if (!isTeamGeneration(generation))
250
- return;
251
- $('tf-modal-title').textContent = t('team.roleModalTitleName', { name });
252
- $('tf-modal-text').value = r.body?.role || '';
253
- $('tf-modal').dataset.app = app;
254
- $('tf-modal').style.display = 'flex';
26
+ export async function createHostedTeam(name) {
27
+ return jpost('/api/team/hosted', { name });
255
28
  }
256
- function refreshCliOptions() {
257
- const clis = Array.from(new Set(allTeams().flatMap(t2 => t2.bots.map(x => x.cliId)).filter(Boolean))).sort();
258
- const sel = $('tf-cli');
259
- const cur = sel.value;
260
- sel.innerHTML = `<option value="">${t('team.allCli')}</option>` + clis.map(c => `<option value="${escapeHtml(c)}">${escapeHtml(c)}</option>`).join('');
261
- sel.value = cur;
29
+ export async function deleteHostedTeam(teamId) {
30
+ return jsend('DELETE', '/api/team/hosted/' + encodeURIComponent(teamId));
262
31
  }
263
- async function loadLocal(generation = activeTeamGeneration) {
264
- const r = await jget('/api/team/hosted');
265
- if (!isTeamGeneration(generation))
266
- return;
267
- const b = r.body;
268
- if (!b?.ok) {
269
- localTeams = [];
270
- renderTeams();
271
- return;
272
- }
273
- myDeploymentId = b.deployment.deploymentId;
274
- suggestedHubUrl = b.suggestedHubUrl || '';
275
- $('tf-owner').textContent = b.deployment.ownerName || (b.deployment.ownerUnionId ? t('team.bound') : t('team.unbound'));
276
- localTeams = (b.teams || []).map((t2) => ({
277
- kind: 'local', key: `local:${t2.teamId}`, teamId: t2.teamId,
278
- label: t2.isDefault ? t('team.myHostedTeam') : t2.name, sub: '', ok: true,
279
- deployments: t2.deployments || [], bots: t2.bots || [],
280
- }));
281
- refreshCliOptions();
282
- renderTeams();
32
+ export async function generateLocalInvite(teamId) {
33
+ return jpost('/api/team/local-invite', { teamId });
283
34
  }
284
- async function loadRemote(generation = activeTeamGeneration) {
285
- const r = await jget('/api/team/remote-roster');
286
- if (!isTeamGeneration(generation))
287
- return;
288
- const list = r.body?.memberships || [];
289
- remoteTeams = list.map((m) => {
290
- const deployments = m.roster?.deployments || [];
291
- const hub = deployments.find(d => d.local);
292
- const label = hub?.name ? t('team.remoteTeamLabel', { name: hub.name }) : (m.teamName || m.teamId);
293
- return {
294
- kind: 'remote', key: `${m.hubUrl}::${m.teamId}`, teamId: m.teamId, label, sub: m.hubUrl,
295
- ok: !!m.ok, error: m.error, hubUrl: m.hubUrl, deployments, bots: m.roster?.bots || [],
296
- };
297
- });
298
- refreshCliOptions();
299
- renderTeams();
35
+ export async function joinRemoteTeam(hubUrl, inviteCode) {
36
+ return jpost('/api/team/join-remote', { hubUrl, inviteCode });
300
37
  }
301
- export function wireTeamFederationPage(root) {
302
- const generation = nextTeamGeneration();
303
- const cleanups = [];
304
- const on = (el, type, listener) => {
305
- if (!el)
306
- return;
307
- el.addEventListener(type, listener);
308
- cleanups.push(() => el.removeEventListener(type, listener));
309
- };
310
- pickedByTeam.clear();
311
- gnameByTeam.clear();
312
- expandedTeams.clear();
313
- expandedDeps.clear();
314
- ['tf-search', 'tf-cli', 'tf-fcap', 'tf-frole'].forEach(id => {
315
- const el = document.getElementById(id);
316
- on(el, 'input', () => { if (isTeamGeneration(generation))
317
- renderTeams(); });
318
- on(el, 'change', () => { if (isTeamGeneration(generation))
319
- renderTeams(); });
320
- });
321
- on(document.getElementById('tf-modal-cancel'), 'click', () => { if (isTeamGeneration(generation))
322
- $('tf-modal').style.display = 'none'; });
323
- wireBind(generation);
324
- void loadLocal(generation);
325
- void loadRemote(generation);
326
- return () => {
327
- if (isTeamGeneration(generation))
328
- activeTeamGeneration += 1;
329
- for (const cleanup of cleanups.splice(0))
330
- cleanup();
331
- const modal = root.querySelector('#tf-modal');
332
- if (modal)
333
- modal.style.display = 'none';
334
- };
38
+ export function allTeams(localTeams, remoteTeams) {
39
+ return [...localTeams, ...remoteTeams];
335
40
  }
336
- // ───────────────────────── #/team/manage (team management) ─────────────────────────
337
- async function loadManageList(generation = activeTeamGeneration) {
338
- const r = await jget('/api/team/hosted');
339
- if (!isTeamGeneration(generation))
340
- return;
341
- const b = r.body;
342
- const el = $('tm-list');
343
- suggestedHubUrl = b?.suggestedHubUrl || suggestedHubUrl;
344
- const teams = b?.teams || [];
345
- if (!teams.length) {
346
- el.innerHTML = `<p class="muted">${t('team.noTeamsShort')}</p>`;
347
- return;
41
+ export function pickedSet(map, key) {
42
+ let s = map.get(key);
43
+ if (!s) {
44
+ s = new Set();
45
+ map.set(key, s);
348
46
  }
349
- el.innerHTML = teams.map((t2) => {
350
- const remote = (t2.deployments || []).filter((d) => !d.local).length;
351
- return `<div class="card" style="margin:0 0 8px;padding:10px 14px;background:var(--bg-soft,#f6f7f9)">
352
- <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap">
353
- <b>${escapeHtml(t2.name)}</b>${t2.isDefault ? ` <span class="muted" style="font-size:12px">${t('team.default')}</span>` : ''}
354
- <span class="muted" style="font-size:12px">· ${t('team.manageMetaDeps', { count: (t2.deployments || []).length })}${remote ? t('team.manageMetaRemote', { r: remote }) : ''} · ${t('team.manageMetaBots', { count: (t2.bots || []).length })}</span>
355
- <span style="margin-left:auto;display:flex;gap:6px">
356
- <button class="tm-invite ghost" data-team="${escapeHtml(t2.teamId)}" style="font-size:12px">${t('team.genInvite')}</button>
357
- ${t2.isDefault ? '' : `<button class="tm-del ghost" data-team="${escapeHtml(t2.teamId)}" data-name="${escapeHtml(t2.name)}" style="font-size:12px">${t('team.delBtn')}</button>`}
358
- </span>
359
- </div>
360
- <div class="tm-inv-out" data-team="${escapeHtml(t2.teamId)}" style="display:none;margin-top:6px;font-size:13px"></div></div>`;
361
- }).join('');
362
- el.querySelectorAll('.tm-invite').forEach(btn => {
363
- btn.onclick = async () => {
364
- const team = btn.dataset.team;
365
- const out = el.querySelector(`.tm-inv-out[data-team="${CSS.escape(team)}"]`);
366
- out.style.display = '';
367
- out.innerHTML = `<span class="muted">${t('team.generating')}</span>`;
368
- const r2 = await jpost('/api/team/local-invite', { teamId: team });
369
- if (!isTeamGeneration(generation))
370
- return;
371
- if (r2.body?.code) {
372
- out.innerHTML = `${t('team.inviteResultLede')}<br>${t('team.inviteHub')}<code>${escapeHtml(suggestedHubUrl)}</code><br>${t('team.inviteCode')}<code style="font-size:15px">${escapeHtml(r2.body.code)}</code>`;
373
- }
374
- else {
375
- out.innerHTML = `<span class="err">${t('team.genFail')}</span>`;
376
- }
377
- };
378
- });
379
- el.querySelectorAll('.tm-del').forEach(btn => {
380
- btn.onclick = async () => {
381
- if (!confirm(t('team.delConfirm', { name: btn.dataset.name || '' })))
382
- return;
383
- await jsend('DELETE', '/api/team/hosted/' + encodeURIComponent(btn.dataset.team));
384
- if (!isTeamGeneration(generation))
385
- return;
386
- void loadManageList(generation);
387
- };
388
- });
47
+ return s;
389
48
  }
390
- export function wireTeamManagePage(root) {
391
- const generation = nextTeamGeneration();
392
- const cleanups = [];
393
- const on = (el, type, listener) => {
394
- if (!el)
395
- return;
396
- el.addEventListener(type, listener);
397
- cleanups.push(() => el.removeEventListener(type, listener));
398
- };
399
- on(document.getElementById('tm-create'), 'click', async () => {
400
- const name = $('tm-newname').value.trim();
401
- const out = root.querySelector('.tm-cout');
402
- if (!name) {
403
- out.innerHTML = `<span class="err">${t('team.errName')}</span>`;
404
- return;
405
- }
406
- out.innerHTML = `<span class="muted">${t('team.creating')}</span>`;
407
- const r = await jpost('/api/team/hosted', { name });
408
- if (!isTeamGeneration(generation))
409
- return;
410
- if (r.body?.ok) {
411
- out.innerHTML = `<span class="ok">${t('team.created')}</span>`;
412
- $('tm-newname').value = '';
413
- void loadManageList(generation);
414
- }
415
- else {
416
- out.innerHTML = `<span class="err">${t('team.createFail', { error: escapeHtml(String(r.body?.error || r.status)) })}</span>`;
417
- }
418
- });
419
- on(document.getElementById('tm-join'), 'click', async () => {
420
- const hubUrl = $('tm-hub').value.trim();
421
- const inviteCode = $('tm-code').value.trim();
422
- const out = $('tm-join-out');
423
- out.style.display = '';
424
- if (!hubUrl || !inviteCode) {
425
- out.innerHTML = `<span class="err">${t('team.errHubCode')}</span>`;
426
- return;
427
- }
428
- out.innerHTML = `<span class="muted">${t('team.joining')}</span>`;
429
- const r = await jpost('/api/team/join-remote', { hubUrl, inviteCode });
430
- if (!isTeamGeneration(generation))
431
- return;
432
- if (r.body?.ok) {
433
- out.innerHTML = `<span class="ok">${t('team.joined', { name: escapeHtml(r.body.teamName || '') })}</span>`;
434
- $('tm-code').value = '';
435
- }
436
- else {
437
- const e = r.body?.error || r.status;
438
- const msg = e === 'cannot_join_self' ? t('team.joinErrSelf') : e === 'deployment_already_joined' ? t('team.joinErrAlready') : e === 'hub_unreachable' ? t('team.joinErrUnreachable') : e === 'hub_timeout' ? t('team.joinErrTimeout') : t('team.joinErrGeneric', { error: String(e) });
439
- out.innerHTML = `<span class="err">${escapeHtml(String(msg))}</span>`;
440
- }
49
+ export function botMatchesTeamFilters(bot, filters) {
50
+ const q = filters.query.trim().toLowerCase();
51
+ if (q && !((bot.name || '') + ' ' + (bot.cliId || '') + ' ' + (bot.capability || '')).toLowerCase().includes(q)) {
52
+ return false;
53
+ }
54
+ if (filters.cliId && bot.cliId !== filters.cliId)
55
+ return false;
56
+ if (filters.hasCapability && !bot.capability)
57
+ return false;
58
+ if (filters.hasRole && !bot.hasTeamRole)
59
+ return false;
60
+ return true;
61
+ }
62
+ export function teamCliOptions(teams) {
63
+ return Array.from(new Set(teams.flatMap(team => team.bots.map(bot => bot.cliId)).filter(Boolean))).sort();
64
+ }
65
+ export function mapHostedTeams(body, tr) {
66
+ return (body.teams || []).map((team) => ({
67
+ kind: 'local',
68
+ key: `local:${team.teamId}`,
69
+ teamId: team.teamId,
70
+ label: team.isDefault ? tr('team.myHostedTeam') : team.name,
71
+ sub: '',
72
+ ok: true,
73
+ deployments: team.deployments || [],
74
+ bots: team.bots || [],
75
+ }));
76
+ }
77
+ export function mapRemoteTeams(body, tr) {
78
+ const list = body.memberships || [];
79
+ return list.map((membership) => {
80
+ const deployments = membership.roster?.deployments || [];
81
+ const hub = deployments.find(dep => dep.local);
82
+ const label = hub?.name ? tr('team.remoteTeamLabel', { name: hub.name }) : (membership.teamName || membership.teamId);
83
+ return {
84
+ kind: 'remote',
85
+ key: `${membership.hubUrl}::${membership.teamId}`,
86
+ teamId: membership.teamId,
87
+ label,
88
+ sub: membership.hubUrl,
89
+ ok: !!membership.ok,
90
+ error: membership.error,
91
+ hubUrl: membership.hubUrl,
92
+ deployments,
93
+ bots: membership.roster?.bots || [],
94
+ };
441
95
  });
442
- void loadManageList(generation);
443
- return () => {
444
- if (isTeamGeneration(generation))
445
- activeTeamGeneration += 1;
446
- for (const cleanup of cleanups.splice(0))
447
- cleanup();
448
- };
449
96
  }
450
- // ───────────────────────────── identity bind ─────────────────────────────
451
- function wireBind(generation = activeTeamGeneration) {
452
- $('tf-autobind').onclick = async () => {
453
- const out = $('tf-bind-out');
454
- out.style.display = '';
455
- out.innerHTML = `<span class="muted">${t('team.identifying')}</span>`;
456
- const r = await jpost('/api/team/identity/auto-bind');
457
- if (!isTeamGeneration(generation))
458
- return;
459
- const b = r.body;
460
- if (b?.ok && b.owner) {
461
- out.innerHTML = `<span class="ok">${t('team.bound2', { name: escapeHtml(b.owner.name || b.owner.unionId) })}</span>`;
462
- void loadLocal(generation);
463
- return;
464
- }
465
- if (b?.ok && b.needChoice && Array.isArray(b.candidates)) {
466
- const opts = b.candidates.map((c) => `<button class="tf-pickowner ghost" data-union="${escapeHtml(c.unionId)}" style="margin:2px">${escapeHtml(c.name || c.unionId)}</button>`).join(' ');
467
- out.innerHTML = `${t('team.multiCandidate')}<br>${opts}`;
468
- out.querySelectorAll('.tf-pickowner').forEach(btn => {
469
- btn.onclick = async () => {
470
- out.innerHTML = `<span class="muted">${t('team.binding')}</span>`;
471
- const r2 = await jpost('/api/team/identity/auto-bind', { unionId: btn.dataset.union });
472
- if (!isTeamGeneration(generation))
473
- return;
474
- const b2 = r2.body;
475
- if (b2?.ok && b2.owner) {
476
- out.innerHTML = `<span class="ok">${t('team.bound2', { name: escapeHtml(b2.owner.name || b2.owner.unionId) })}</span>`;
477
- void loadLocal(generation);
478
- }
479
- else {
480
- out.innerHTML = `<span class="err">${t('team.bindFail', { error: escapeHtml(String(b2?.error || 'unknown')) })}</span>`;
481
- }
482
- };
483
- });
484
- return;
485
- }
486
- if (b?.error === 'no_candidates') {
487
- out.innerHTML = `<span class="err">${t('team.noCandidates')}</span>`;
488
- return;
489
- }
490
- out.innerHTML = `<span class="err">${t('team.bindFail', { error: escapeHtml(String(b?.error || 'unknown')) })}</span>`;
491
- };
97
+ export function updateTeamBotCapability(teams, larkAppId, capability) {
98
+ return teams.map(team => ({
99
+ ...team,
100
+ bots: team.bots.map(bot => bot.larkAppId === larkAppId
101
+ ? { ...bot, capability: capability.trim() || null }
102
+ : bot),
103
+ }));
492
104
  }
105
+ import { jget, jpost, jput, jsend } from './dashboard-api.js';
493
106
  //# sourceMappingURL=team-federation.js.map