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 +0,0 @@
1
- import{b as v}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import"./chunk-3UJYRR2Q.js";import{a as G,b as L,c as M}from"./chunk-JTSE5VP6.js";import{c as x}from"./chunk-7SZRL6FY.js";var g=x(G(),1);var e=x(M(),1);function d(t){let n=Number(t);return!Number.isFinite(n)||n<=0?"-":n>=1024**3?`${(n/1024**3).toFixed(1)} GiB`:n>=1024**2?`${(n/1024**2).toFixed(0)} MiB`:`${Math.max(1,Math.round(n/1024))} KiB`}function S(t){let n=Number(t);return Number.isFinite(n)?`${n.toFixed(1)}%`:"-"}function R(t,n){return n?S(t):"-"}function A(t){return t?.cpuReady!==!1}function u(t){let n=Number(t);return Number.isFinite(n)?String(n):"-"}function B(t){let n=Number(t);if(!Number.isFinite(n)||n<0)return"-";if(n===0)return"0s";if(n<6e4)return`${Math.max(1,Math.floor(n/1e3))}s`;let r=Math.floor(n/6e4);if(r<60)return`${Math.max(1,r)}m`;let s=Math.floor(r/60),o=r%60;return o?`${s}h ${o}m`:`${s}h`}function O(t){return t==="fresh"||t==="stale"||t==="unsupported"?t:"unknown"}function H(t){return t?`${t.botName||"-"} \xB7 ${t.title||t.sessionId}`:"-"}function I(t,n){return n==="cpu"?Number(t.current?.cpu1mPct??t.current?.cpuPct??0):n==="rss"?Number(t.current?.rssBytes??0):n==="growth"?Number(t.current?.rssGrowth5mBytes??0):n==="bot"?t.botName??"":t.status??""}function U(t,n){return[...t].sort((r,s)=>{let o=I(r,n),c=I(s,n);return typeof o=="number"&&typeof c=="number"?c-o||r.sessionId.localeCompare(s.sessionId):String(o).localeCompare(String(c))||r.sessionId.localeCompare(s.sessionId)})}function C(t,n){return n==="bytes"?d(t):S(t)}function P(t,n,r){let s=(t??[]).filter(Number.isFinite);if(s.length<2)return r("monitoring.chartNoData");let o=s[0],c=Number.isFinite(n)?Number(n):Date.now(),a=Math.max(0,c-o),l=Math.max(1,Math.round(a/6e4));if(l<60)return r("monitoring.chartMinutesAgo",{value:l});let p=Math.round(l/60);return p<48?r("monitoring.chartHoursAgo",{value:p}):r("monitoring.chartDaysAgo",{value:Math.round(p/24)})}function w({values:t,timestamps:n,unit:r="pct",startLabel:s,endLabel:o,emptyLabel:c}){let a=(t??[]).filter(Number.isFinite),l=a.length?Math.min(...a):0,p=a.length?Math.max(...a):0,h=p-l,b=a.length>1?a.map((N,k)=>{let f=k/(a.length-1)*100,m=h>0?100-(N-l)/h*100:50;return`${f},${m}`}).join(" "):"";return(0,e.jsxs)("div",{className:"resource-chart",children:[(0,e.jsxs)("div",{className:"resource-chart-y","aria-hidden":"true",children:[(0,e.jsx)("span",{children:a.length?C(p,r):"-"}),(0,e.jsx)("span",{children:a.length?C(l,r):"-"})]}),(0,e.jsxs)("div",{className:"resource-chart-plot",children:[(0,e.jsxs)("svg",{className:"resource-spark",viewBox:"0 0 100 100",preserveAspectRatio:"none","aria-label":a.length>1?void 0:c,children:[(0,e.jsx)("line",{x1:"0",y1:"12",x2:"100",y2:"12",className:"resource-grid-line"}),(0,e.jsx)("line",{x1:"0",y1:"50",x2:"100",y2:"50",className:"resource-grid-line"}),(0,e.jsx)("line",{x1:"0",y1:"88",x2:"100",y2:"88",className:"resource-grid-line"}),b?(0,e.jsx)("polyline",{points:b}):null]}),(0,e.jsxs)("div",{className:"resource-chart-x","aria-hidden":"true",children:[(0,e.jsx)("span",{children:a.length>1?s:c}),(0,e.jsx)("span",{children:a.length>1?o:""})]})]})]})}function _({reasons:t}){return(0,e.jsx)("span",{className:"resource-reasons",children:(t??[]).join(", ")||"-"})}function W({sessions:t,cpuReady:n=!0}){let r=v();return(0,e.jsxs)("div",{className:"resource-table resource-session-table",children:[(0,e.jsxs)("div",{className:"resource-row resource-row-head",children:[(0,e.jsx)("span",{children:r("monitoring.session")}),(0,e.jsx)("span",{children:r("monitoring.bot")}),(0,e.jsx)("span",{children:r("monitoring.cpu")}),(0,e.jsx)("span",{children:r("monitoring.rss")}),(0,e.jsx)("span",{children:r("monitoring.growth")}),(0,e.jsx)("span",{children:r("monitoring.confidence")}),(0,e.jsx)("span",{children:r("monitoring.rank")})]}),(0,e.jsx)("div",{className:"resource-session-scroll","data-visible-rows":10,children:t.length?t.map(s=>(0,e.jsxs)("div",{className:`resource-row${s.tracked?" is-tracked":""}`,children:[(0,e.jsx)("b",{children:s.title||s.sessionId}),(0,e.jsx)("span",{children:s.botName}),(0,e.jsx)("span",{children:R(s.current?.cpu1mPct??s.current?.cpuPct,n)}),(0,e.jsx)("span",{children:d(s.current?.rssBytes)}),(0,e.jsx)("span",{children:d(s.current?.rssGrowth5mBytes)}),(0,e.jsx)("span",{children:s.confidence??"unknown"}),(0,e.jsx)(_,{reasons:s.rankReasons})]},s.sessionId)):(0,e.jsx)("div",{className:"empty",children:r("overview.noSessions")})})]})}function j({label:t,text:n}){return(0,e.jsxs)("span",{className:"resource-help-tip",children:[(0,e.jsx)("button",{type:"button",className:"help-icon-button resource-help-button","aria-label":t,children:"?"}),(0,e.jsx)("span",{className:"resource-help-popover",role:"tooltip",children:n})]})}function E({current:t}){let n=v(),r=t.runtime,s=A(t),o=O(r?.sampleHealth?.status),c=r?.daemons?.total,a=r?.daemons?.online,l=r?.daemons?.offline??(Number.isFinite(Number(c))&&Number.isFinite(Number(a))?Math.max(0,Number(c)-Number(a)):void 0),p=r?.sessions?.total,h=r?.sessions?.working,b=r?.sessions?.starting;return(0,e.jsxs)("section",{className:"panel runtime-health-panel",children:[(0,e.jsx)("header",{className:"panel-header",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:n("monitoring.runtimeHealth")}),(0,e.jsx)("p",{children:n("monitoring.runtimeHealthHint")})]})}),(0,e.jsxs)("div",{className:"runtime-health-grid",children:[(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:n("monitoring.sampleHealth")}),(0,e.jsx)("strong",{children:(0,e.jsx)("span",{className:`runtime-status-pill ${o}`,children:n(`monitoring.sample.${o}`)})}),(0,e.jsxs)("small",{children:[n("monitoring.sampleAge")," ",B(r?.sampleHealth?.ageMs)]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:n("monitoring.daemonHealth")}),(0,e.jsxs)("strong",{children:[u(a),"/",u(c)]}),(0,e.jsxs)("small",{children:[u(l)," ",n("monitoring.offline")]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:n("monitoring.sessionHealth")}),(0,e.jsx)("strong",{children:u(p)}),(0,e.jsxs)("small",{children:[n("monitoring.working")," ",u(h)," \xB7 ",n("monitoring.starting")," ",u(b)]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:n("monitoring.resourcePressure")}),(0,e.jsx)("strong",{children:R(t.host?.cpuPct,s)}),(0,e.jsxs)("small",{children:[n("monitoring.hostMemory")," ",S(t.host?.memUsedPct)," \xB7 RSS ",d(t.botmux?.rssBytes)]})]})]})]})}function V({runtime:t}){let n=v(),r=t?.sessions,s=r?.longestRunning,o=r?.longestWaiting;return(0,e.jsxs)("section",{className:"panel runtime-session-pressure",children:[(0,e.jsx)("header",{className:"panel-header",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:n("monitoring.sessionPressure")}),(0,e.jsx)("p",{children:n("monitoring.sessionPressureHint")})]})}),(0,e.jsxs)("div",{className:"runtime-session-grid",children:[(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:n("monitoring.statusDistribution")}),(0,e.jsx)("strong",{children:u(r?.total)}),(0,e.jsxs)("small",{children:[n("monitoring.working")," ",u(r?.working)," \xB7 ",n("monitoring.starting")," ",u(r?.starting)," \xB7 ",n("monitoring.waiting")," ",u(r?.waiting)," \xB7 ",n("monitoring.idle")," ",u(r?.idle)," \xB7 ",n("monitoring.unknown")," ",u(r?.unknown)]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:n("monitoring.longestRunning")}),(0,e.jsx)("strong",{children:H(s)}),(0,e.jsx)("small",{children:B(s?.durationMs)})]}),(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:n("monitoring.longestWaiting")}),(0,e.jsx)("strong",{children:H(o)}),(0,e.jsx)("small",{children:B(o?.durationMs)})]}),(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:n("monitoring.unattributedSessions")}),(0,e.jsx)("strong",{children:u(r?.unattributed)}),(0,e.jsx)("small",{children:n("monitoring.unattributedHint")})]})]})]})}function q({initialCurrent:t=null,initialHistory:n=null,poll:r=!0}={}){let s=v(),[o,c]=(0,g.useState)(t),[a,l]=(0,g.useState)(n),[p,h]=(0,g.useState)("cpu");(0,g.useEffect)(()=>{if(!r)return;let i=!1;async function y(){try{let[F,T]=await Promise.all([fetch("/api/resources/current",{cache:"no-store"}),fetch("/api/resources/history?range=3h",{cache:"no-store"})]),[D,K]=await Promise.all([F.json(),T.json()]);i||(c(D),l(K))}catch{i||(c({supported:!1,reason:"fetch_failed",bots:[],sessions:[]}),l({supported:!1,bots:[],sessions:[]}))}}y();let $=window.setInterval(()=>{y()},1e4);return()=>{i=!0,window.clearInterval($)}},[r]);let b=(0,g.useMemo)(()=>U(o?.sessions??[],p),[o?.sessions,p]),N=b[0],k=o?.supported!==!1,f=A(o),m={hostStartLabel:P(a?.host?.timestamps,o?.sampledAt,s),botmuxStartLabel:P(a?.botmux?.timestamps,o?.sampledAt,s),endLabel:s("monitoring.chartNow"),emptyLabel:s("monitoring.chartNoData")};return(0,e.jsxs)("section",{className:"page resource-page",children:[(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:s("monitoring.eyebrow")}),(0,e.jsx)("h1",{children:s("monitoring.runtimeTitle")}),(0,e.jsx)("p",{children:s("monitoring.runtimeSubtitle")})]})}),o?(0,e.jsx)(E,{current:o}):null,k?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("section",{className:"panel resource-pressure",children:[(0,e.jsx)("header",{className:"panel-header",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:s("monitoring.resourcePressure")}),(0,e.jsx)("p",{children:s("monitoring.resourcePressureHint")})]})}),(0,e.jsxs)("div",{className:"resource-metrics runtime-pressure-grid",children:[(0,e.jsxs)("section",{className:"metric-card",children:[(0,e.jsx)("span",{children:s("monitoring.hostCpu")}),(0,e.jsx)("strong",{children:R(o?.host?.cpuPct,f)}),(0,e.jsxs)("small",{children:["load ",Number(o?.host?.load1??0).toFixed(2)]})]}),(0,e.jsxs)("section",{className:"metric-card",children:[(0,e.jsx)("span",{children:s("monitoring.hostMemory")}),(0,e.jsx)("strong",{children:S(o?.host?.memUsedPct)}),(0,e.jsx)("small",{children:s("monitoring.memoryOnly")})]}),(0,e.jsxs)("section",{className:"metric-card",children:[(0,e.jsxs)("div",{className:"metric-label-with-help",children:[(0,e.jsx)("span",{children:s("monitoring.botmuxRss")}),(0,e.jsx)(j,{label:s("monitoring.rssHelpLabel"),text:s("monitoring.rssHelp")})]}),(0,e.jsx)("strong",{children:d(o?.botmux?.rssBytes)}),o?.botmuxBreakdown&&(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("small",{className:"metric-breakdown",children:[s("monitoring.botmuxSelf")," ",d((o.botmuxBreakdown.daemon.rssBytes??0)+(o.botmuxBreakdown.worker.rssBytes??0)),(0,e.jsxs)("span",{className:"metric-breakdown-detail",children:[" (",s("monitoring.botmuxDaemon")," ",d(o.botmuxBreakdown.daemon.rssBytes)," \xB7 ",s("monitoring.botmuxWorker")," ",d(o.botmuxBreakdown.worker.rssBytes),")"]})]}),(0,e.jsxs)("small",{className:"metric-breakdown",children:[s("monitoring.botmuxCli")," ",d(o.botmuxBreakdown.cli.rssBytes)]})]})]}),(0,e.jsxs)("section",{className:"metric-card",children:[(0,e.jsx)("span",{children:s("monitoring.trackedSessions")}),(0,e.jsx)("strong",{children:o?.rankings?.tracked?.length??0}),(0,e.jsxs)("small",{children:[s("monitoring.currentSessions")," ",(o?.sessions??[]).length]})]})]})]}),(0,e.jsxs)("section",{className:"panel resource-trends",children:[(0,e.jsx)("header",{className:"panel-header",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:s("monitoring.trends")}),(0,e.jsx)("p",{children:s("monitoring.trendsHint")})]})}),(0,e.jsxs)("div",{className:"resource-trend-grid",children:[(0,e.jsxs)("article",{className:"resource-trend-cell",children:[(0,e.jsx)("b",{children:s("monitoring.trendHostCpu")}),(0,e.jsx)(w,{values:a?.host?.cpuPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:m.hostStartLabel,endLabel:m.endLabel,emptyLabel:m.emptyLabel})]}),(0,e.jsxs)("article",{className:"resource-trend-cell",children:[(0,e.jsx)("b",{children:s("monitoring.trendHostMemory")}),(0,e.jsx)(w,{values:a?.host?.memUsedPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:m.hostStartLabel,endLabel:m.endLabel,emptyLabel:m.emptyLabel})]}),(0,e.jsxs)("article",{className:"resource-trend-cell",children:[(0,e.jsx)("b",{children:s("monitoring.trendBotmuxCpu")}),(0,e.jsx)(w,{values:a?.botmux?.cpuPct,timestamps:a?.botmux?.timestamps,unit:"pct",startLabel:m.botmuxStartLabel,endLabel:m.endLabel,emptyLabel:m.emptyLabel})]}),(0,e.jsxs)("article",{className:"resource-trend-cell",children:[(0,e.jsx)("b",{children:s("monitoring.botmuxRss")}),(0,e.jsx)(w,{values:a?.botmux?.rssBytes,timestamps:a?.botmux?.timestamps,unit:"bytes",startLabel:m.botmuxStartLabel,endLabel:m.endLabel,emptyLabel:m.emptyLabel})]})]})]})]}):(0,e.jsx)("section",{className:"panel resource-unavailable",children:(0,e.jsxs)("div",{className:"resource-unavailable-card",children:[(0,e.jsx)("span",{className:"resource-unavailable-status","aria-hidden":"true"}),(0,e.jsxs)("div",{className:"resource-unavailable-copy",children:[(0,e.jsx)("span",{children:s("monitoring.unsupportedKicker")}),(0,e.jsx)("h2",{children:s("monitoring.unsupportedTitle")}),(0,e.jsx)("p",{children:s("monitoring.unsupportedHint")})]}),(0,e.jsxs)("div",{className:"resource-unavailable-tags","aria-label":s("monitoring.unsupported"),children:[(0,e.jsx)("span",{children:s("monitoring.unsupportedRuntimeOk")}),(0,e.jsx)("span",{children:s("monitoring.unsupportedResourceOnly")})]})]})}),o?(0,e.jsx)(V,{runtime:o.runtime}):null,k?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("section",{className:"panel",children:[(0,e.jsx)("header",{className:"panel-header",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:s("monitoring.botRuntime")}),(0,e.jsx)("p",{children:s("monitoring.botRuntimeHint")})]})}),(0,e.jsxs)("div",{className:"resource-table resource-bot-table",children:[(0,e.jsxs)("div",{className:"resource-row resource-row-head",children:[(0,e.jsx)("span",{children:s("monitoring.bot")}),(0,e.jsx)("span",{children:s("monitoring.daemon")}),(0,e.jsx)("span",{children:s("monitoring.sessionsCount")}),(0,e.jsx)("span",{children:s("monitoring.working")}),(0,e.jsx)("span",{children:s("monitoring.starting")}),(0,e.jsx)("span",{children:s("monitoring.cpu")}),(0,e.jsx)("span",{children:s("monitoring.rss")})]}),(o?.bots??[]).map(i=>{let y=i.runtime?.sessions;return(0,e.jsxs)("div",{className:"resource-row",children:[(0,e.jsx)("b",{children:i.botName}),(0,e.jsx)("span",{children:i.runtime?.daemonStatus??i.daemonStatus??"unknown"}),(0,e.jsx)("span",{children:u(y?.total??i.sessions?.count)}),(0,e.jsx)("span",{children:u(y?.working)}),(0,e.jsx)("span",{children:u(y?.starting)}),(0,e.jsx)("span",{children:R(i.total?.cpuPct,f)}),(0,e.jsx)("span",{children:d(i.total?.rssBytes)})]},i.larkAppId)})]})]}),(0,e.jsxs)("section",{className:"panel",children:[(0,e.jsxs)("header",{className:"panel-header",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:s("monitoring.sessions")}),(0,e.jsx)("p",{children:s("monitoring.sessionsHint")})]}),N?(0,e.jsxs)("span",{className:"resource-hot",children:[s("monitoring.hottest"),": ",N.botName," \xB7 ",N.title||N.sessionId]}):null]}),(0,e.jsx)("div",{className:"resource-sortbar",role:"group","aria-label":s("monitoring.sort"),children:["cpu","rss","growth","bot","status"].map(i=>(0,e.jsx)("button",{type:"button",className:p===i?"on":"",onClick:()=>h(i),children:s(`monitoring.sort.${i}`)},i))}),(0,e.jsx)(W,{sessions:b,cpuReady:f})]}),(0,e.jsxs)("section",{className:"panel",children:[(0,e.jsx)("header",{className:"panel-header",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:s("monitoring.trackedSessionTrends")}),(0,e.jsx)("p",{children:s("monitoring.trackedSessionHint")})]})}),(0,e.jsxs)("div",{className:"resource-trend-grid",children:[(a?.sessions??[]).map(i=>(0,e.jsxs)("article",{className:"resource-trend-cell",children:[(0,e.jsxs)("b",{children:[i.botName," \xB7 ",i.title||i.sessionId]}),(0,e.jsx)(w,{values:i.series?.rssBytes,timestamps:i.series?.timestamps,unit:"bytes",startLabel:P(i.series?.timestamps,o?.sampledAt,s),endLabel:m.endLabel,emptyLabel:m.emptyLabel})]},i.sessionId)),(a?.sessions??[]).length?null:(0,e.jsx)("div",{className:"empty",children:s("monitoring.noTrackedHistory")})]})]})]}):null]})}function Q(t){return L(t,(0,e.jsx)(q,{}))}export{q as MonitoringPage,W as SessionResourceTable,Q as renderMonitoringPage};
@@ -1 +0,0 @@
1
- import{a as b,b as p,c as x}from"./chunk-JTSE5VP6.js";import{c as m}from"./chunk-7SZRL6FY.js";var i=m(b(),1);var e=m(x(),1),u=78222186;function y(t){return(t/1048576).toFixed(0)}function S(){let[t,n]=(0,i.useState)(null),[s,l]=(0,i.useState)(""),[c,f]=(0,i.useState)(!1),d=(0,i.useRef)(null),r=(0,i.useRef)(!1),h=()=>{d.current&&(clearTimeout(d.current),d.current=null)};async function g(){if(!r.current)try{let a=await fetch("/api/game/status");if(r.current)return;if(!a.ok){n({state:"absent",received:0,total:u});return}let o=await a.json();if(r.current)return;n(o),typeof o.proxy=="string"&&l(o.proxy),o.state==="downloading"&&(d.current=setTimeout(()=>{g()},700))}catch{r.current||(d.current=setTimeout(()=>{g()},1500))}}(0,i.useEffect)(()=>(r.current=!1,g(),()=>{r.current=!0,h()}),[]);async function v(){h(),f(!0),n({state:"downloading",received:0,total:u});try{let a=await fetch("/api/game/download",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({proxy:s.trim()})});if(r.current)return;if(!a.ok)throw new Error(`HTTP ${a.status}`);let o=await a.json();if(r.current)return;n(o),typeof o.proxy=="string"&&l(o.proxy),o.state==="downloading"&&(d.current=setTimeout(()=>{g()},700))}catch(a){if(r.current)return;n({state:"error",received:0,total:u,error:a instanceof Error?a.message:String(a)})}finally{r.current||f(!1)}}return t?.state==="ready"?(0,e.jsx)("iframe",{src:"/game/index.html",title:"HD2D Office",style:{flex:1,width:"100%",minHeight:0,border:"none",display:"block",background:"#0b0d12"},allow:"autoplay"}):(0,e.jsx)(w,{status:t??{state:"absent",received:0,total:u},proxy:s,starting:c,onProxyChange:l,onStart:()=>{v()}})}function w(t){let n=t.status.total||u,s=(0,i.useMemo)(()=>n?Math.min(100,Math.round(t.status.received/n*100)):0,[t.status.received,n]),l=t.status.state==="downloading",c=t.status.state==="error";return(0,e.jsxs)("div",{style:{margin:"auto",textAlign:"center",maxWidth:440,padding:32,color:"var(--fg,#e6e6e6)"},children:[(0,e.jsx)("div",{style:{fontSize:18,fontWeight:600,marginBottom:8},children:"HD2D \u529E\u516C\u5BA4"}),(0,e.jsxs)("div",{style:{fontSize:13,opacity:.7,lineHeight:1.7,marginBottom:20},children:["\u628A\u6BCF\u4E2A\u4F1A\u8BDD\u53D8\u6210\u529E\u516C\u5BA4\u91CC\u7684\u4E00\u4E2A\u673A\u5668\u4EBA\uFF0C\u5B9E\u65F6\u6620\u5C04\u5C4F\u5E55\u72B6\u6001\u3002",(0,e.jsx)("br",{}),"\u9996\u6B21\u8FDB\u5165\u9700\u4E0B\u8F7D\u7EA6 ",y(n)," MB \u6E38\u620F\u8D44\u6E90\uFF08\u4EC5\u4E00\u6B21\uFF0C\u4E4B\u540E\u672C\u5730\u7F13\u5B58\uFF09\u3002"]}),c?(0,e.jsxs)("div",{style:{color:"#e06c75",fontSize:12,marginBottom:14},children:["\u4E0A\u6B21\u4E0B\u8F7D\u5931\u8D25\uFF1A",t.status.error??"\u672A\u77E5\u9519\u8BEF",(0,e.jsx)("br",{}),(0,e.jsx)("span",{style:{opacity:.7},children:"\u586B\u4EE3\u7406\u540E\u70B9\u91CD\u8BD5"})]}):null,l?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("div",{style:{background:"rgba(127,127,127,.2)",borderRadius:6,height:10,overflow:"hidden",marginBottom:10},children:(0,e.jsx)("div",{style:{height:"100%",width:`${s}%`,background:"#4a9eff",transition:"width .3s"}})}),(0,e.jsxs)("div",{style:{fontSize:12,opacity:.7},children:["\u4E0B\u8F7D\u4E2D... ",y(t.status.received)," / ",y(n)," MB\uFF08",s,"%\uFF09"]})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("input",{id:"hd2d-proxy",type:"text",value:t.proxy,onChange:f=>t.onProxyChange(f.currentTarget.value),placeholder:"HTTP \u4EE3\u7406\uFF08\u53EF\u9009\uFF0C\u5982 http://127.0.0.1:7890\uFF09",style:{width:"100%",boxSizing:"border-box",marginBottom:12,padding:"8px 10px",borderRadius:6,border:"1px solid rgba(127,127,127,.4)",background:"transparent",color:"inherit",fontSize:12}}),(0,e.jsx)("div",{style:{fontSize:11,opacity:.5,marginBottom:14,textAlign:"left"},children:"\u8FDE\u4E0D\u4E0A GitHub \u65F6\u586B\u4EE3\u7406\uFF08\u4EC5\u7528\u4E8E\u4E0B\u8F7D\u672C\u8D44\u6E90\uFF0C\u4F1A\u8BB0\u4F4F\uFF09\u3002\u7559\u7A7A\u8D70\u76F4\u8FDE/\u7CFB\u7EDF\u4EE3\u7406\u73AF\u5883\u53D8\u91CF\u3002"}),(0,e.jsxs)("button",{id:"hd2d-load",type:"button",disabled:t.starting,onClick:t.onStart,style:{cursor:t.starting?"default":"pointer",border:"none",borderRadius:8,padding:"10px 22px",fontSize:14,fontWeight:600,background:"#4a9eff",color:"#fff",opacity:t.starting?.7:1},children:[c?"\u91CD\u8BD5":"\u52A0\u8F7D\u529E\u516C\u5BA4","\uFF08\u7EA6 ",y(n)," MB\uFF09"]})]})]})}function T(t){let n={maxWidth:t.style.maxWidth,padding:t.style.padding,flex:t.style.flex,minHeight:t.style.minHeight,display:t.style.display};t.style.maxWidth="none",t.style.padding="0",t.style.flex="1 1 auto",t.style.minHeight="0",t.style.display="flex";let s=p(t,(0,e.jsx)(S,{}));return()=>{s(),t.style.maxWidth=n.maxWidth,t.style.padding=n.padding,t.style.flex=n.flex,t.style.minHeight=n.minHeight,t.style.display=n.display}}export{T as renderOfficePage};
@@ -1 +0,0 @@
1
- import{a as G,b as N}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import{A as h,q as A,r as $,t as H,u as z,v as k,w as R,x as f,z as g}from"./chunk-3UJYRR2Q.js";import{a as re,b as F,c as O}from"./chunk-JTSE5VP6.js";import{c as E}from"./chunk-7SZRL6FY.js";var d=E(re(),1);var W={chats:[],bots:[]};async function Y(){try{let t=await fetch("/api/groups");if(!t.ok)return;W=await t.json()}catch{}}var le=new Set(["working","analyzing","active","starting"]);function j(t){let n=new Map,i=s=>{let l=n.get(s);return l||(l={botName:s,larkAppId:s,cliId:"unknown",online:!1,sessions:[],active:[],busy:[],attention:[],lastActiveAt:0},n.set(s,l)),l};for(let s of W.bots??[]){let l=i(s.larkAppId??s.botName??"-");l.online=!0,s.botName&&(l.botName=s.botName),s.botAvatarUrl&&(l.botAvatarUrl=s.botAvatarUrl),s.cliId&&(l.cliId=s.cliId)}let r=[...t].sort((s,l)=>+(s.status==="closed")-+(l.status==="closed"));for(let s of r){let l=s.larkAppId??s.botName??"-";if(s.status==="closed"&&!n.has(l))continue;let o=i(l);s.botName&&(o.botName===o.larkAppId||!o.botName)&&(o.botName=s.botName),o.sessions.push(s),s.cliId&&o.cliId==="unknown"&&(o.cliId=s.cliId),o.lastActiveAt=Math.max(o.lastActiveAt,Number(s.lastMessageAt??0)),s.status!=="closed"&&(o.active.push(s),le.has(s.status)&&o.busy.push(s),g(s)&&o.attention.push(s))}for(let s of n.values())if(s.botName===s.larkAppId){let l=z(s.larkAppId);l&&(s.botName=l)}return[...n.values()].sort((s,l)=>{let o=u=>u.attention.length?0:u.busy.length?1:u.online||u.active.length?2:3;return o(s)!==o(l)?o(s)-o(l):l.lastActiveAt-s.lastActiveAt})}var e=E(O(),1),Z=new Set(["working","analyzing","active","starting"]),ce=new Set(["idle","dormant"]),J="botmux.overview.teamExpanded",de=230,K=13,C=2;function _(t){return(0,e.jsx)("span",{style:{display:"contents"},dangerouslySetInnerHTML:{__html:t.html}})}function ue(){try{return window.localStorage.getItem(J)==="1"}catch{return!1}}function ve(t){try{window.localStorage.setItem(J,t?"1":"0")}catch{}}function me(t){return String(t??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function pe(t,n){let i=String(t??"unknown"),r=`sessions.status.${i}`,s=n(r);return s===r?i:s}function X(t){let n=Number(t);return Number.isFinite(n)?`${n.toFixed(1)}%`:"-"}function ge(t){let n=Number(t);return!Number.isFinite(n)||n<=0?"-":n>=1024**3?`${(n/1024**3).toFixed(1)} GiB`:n>=1024**2?`${(n/1024**2).toFixed(0)} MiB`:`${Math.max(1,Math.round(n/1024))} KiB`}function L(t,n,i,r=!0){let s=Number(t);return!r||!Number.isFinite(s)?"unknown":s>=i?"danger":s>=n?"warn":"ok"}function he(t,n){let i=Number(t);if(!Number.isFinite(i)||i<=0)return"unknown";let r=Number(n);if(Number.isFinite(r)&&r>0)return L(i/r*100,30,50);let s=i/1024**3;return s>=32?"danger":s>=16?"warn":"ok"}function be(t){return t==="fresh"?"ok":t==="stale"?"danger":"unknown"}function we(t){if(!t)return"unknown";let n=Number(t.waiting??0),i=Number(t.starting??0);return n>=5||i>=20?"danger":n>0||i>=10?"warn":"ok"}function fe(t){return t.includes("danger")?"danger":t.includes("warn")?"warn":t.includes("ok")?"ok":"unknown"}function Ne(t,n){let i=t?.runtime?.sessions,r=i?.total??t?.sessions?.length;if(!Number.isFinite(Number(r)))return"-";let s=Number(i?.waiting??0);return`${Number(r)} \xB7 ${n("monitoring.waiting")} ${s}`}function ye(t){let n=t?.clientWidth??0;return n?Math.max(1,Math.floor((n+K)/(de+K)))*C:C*3}function Ae({card:t}){let n=N(),i=!t.online&&t.active.length===0,r=t.attention.length>0,s=t.busy.length>0,l=r?"warn":s?"busy":i?"off":"ok",o;if(r){let c=[...t.attention].sort((b,v)=>h(b)-h(v))[0];o=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("b",{children:(f(c.title)||c.sessionId).slice(0,60)})," \xB7 ",g(c)??""]})}else if(s){let c=[...t.busy].sort((b,v)=>Number(v.lastMessageAt??0)-Number(b.lastMessageAt??0))[0];o=(0,e.jsx)("b",{children:(f(c.title)||c.sessionId).slice(0,60)})}else i?o=n("overview.botOffline"):o=n("overview.botIdle");let u=r?(0,e.jsx)("span",{className:"tag tag-warn",children:n("overview.botNeedsYou")}):s?(0,e.jsx)("span",{className:"tag tag-run",children:n("overview.botBusy",{count:t.busy.length})}):i?(0,e.jsx)("span",{className:"tag tag-off",children:n("overview.botOff")}):(0,e.jsx)("span",{className:"tag tag-ok",children:n("overview.botReady")});return(0,e.jsxs)("article",{className:`mate${r?" mate-attn":""}${i?" mate-off":""}`,children:[(0,e.jsxs)("div",{className:"mate-top",children:[(0,e.jsx)(_,{html:$({name:t.botName,larkAppId:t.larkAppId,avatarUrl:t.botAvatarUrl,dot:l})}),(0,e.jsxs)("div",{className:"mate-id",children:[(0,e.jsx)("b",{children:t.botName}),(0,e.jsx)("span",{className:"mate-role",children:t.cliId})]})]}),(0,e.jsx)("div",{className:"mate-task",children:o}),(0,e.jsxs)("div",{className:"mate-foot",children:[u,(0,e.jsx)("span",{children:t.lastActiveAt?n("overview.lastActive",{time:A(t.lastActiveAt)}):n("common.never")})]})]})}function $e({session:t}){let n=N(),i=k(t);return(0,e.jsxs)("article",{className:"qcard","data-id":t.sessionId,children:[(0,e.jsx)(_,{html:$({name:i,larkAppId:t.larkAppId,size:"sm"})}),(0,e.jsxs)("div",{className:"qcard-tx",children:[(0,e.jsxs)("b",{children:[i," \xB7 ",(f(t.title)||t.sessionId).slice(0,56)]}),(0,e.jsxs)("span",{children:[g(t)??""," \xB7 ",A(h(t))]})]}),(0,e.jsx)("a",{className:"qcard-go",href:"#/sessions",children:n("strip.handle")})]})}function ke({session:t}){let n=N(),i=k(t),r=String(t.status??"unknown");return(0,e.jsxs)("li",{className:"sess-row",children:[(0,e.jsx)(_,{html:$({name:i,larkAppId:t.larkAppId,size:"sm"})}),(0,e.jsxs)("div",{className:"sess-tx",children:[(0,e.jsx)("b",{children:(f(t.title)||t.sessionId).slice(0,64)}),(0,e.jsxs)("span",{children:[i," \xB7 ",R(t)??t.cliId??"unknown"," \xB7 ",A(t.lastMessageAt)]})]}),(0,e.jsx)("span",{className:`status status-${me(r)}`,children:pe(r,n)})]})}function Se({schedule:t,timeZone:n}){let i=t.nextRunAt?new Date(t.nextRunAt).toLocaleString(void 0,n?{timeZone:n,timeZoneName:"short"}:void 0):"-";return(0,e.jsxs)("li",{className:"overview-list-row",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("strong",{children:t.name??t.id}),(0,e.jsxs)("span",{children:[k(t)," \xB7 ",t.parsed?.display??""]})]}),(0,e.jsx)("span",{children:i})]})}function xe({working:t,attention:n,idle:i}){let r=N(),s=t+n+i,l=s===0?"conic-gradient(var(--border) 0 360deg)":(()=>{let o=t/s*360,u=o+n/s*360;return`conic-gradient(var(--accent) 0 ${o}deg, var(--warning) ${o}deg ${u}deg, var(--success) ${u}deg 360deg)`})();return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"donut-wrap",children:[(0,e.jsx)("div",{className:"donut",style:{background:l}}),(0,e.jsxs)("div",{className:"donut-center",children:[(0,e.jsx)("b",{children:s}),(0,e.jsx)("span",{children:r("overview.openSessions")})]})]}),(0,e.jsxs)("div",{className:"donut-legend",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("i",{style:{background:"var(--accent)"}}),r("overview.workingSessions")," ",t]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("i",{style:{background:"var(--warning)"}}),r("overview.attention")," ",n]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("i",{style:{background:"var(--success)"}}),r("sessions.board.idle")," ",i]})]})]})}function Ie(){let t=N(),n=(0,d.useRef)(null),[i,r]=(0,d.useState)(ue),[s,l]=(0,d.useState)(C*3),[o,u]=(0,d.useState)(0),[c,b]=(0,d.useState)(null),{sessions:v,schedules:B,scheduleTimeZone:V}=G(a=>({sessions:[...a.sessions.values()],schedules:[...a.schedules.values()],scheduleTimeZone:a.scheduleTimeZone}));(0,d.useEffect)(()=>{let a=()=>l(ye(n.current));return a(),window.addEventListener("resize",a),()=>window.removeEventListener("resize",a)},[]),(0,d.useEffect)(()=>{Y().then(()=>u(a=>a+1)),H().then(()=>u(a=>a+1))},[]),(0,d.useEffect)(()=>{let a=!1,m=async()=>{try{let oe=await(await fetch("/api/resources/current",{cache:"no-store"})).json();a||b(oe)}catch{a||b({supported:!1})}};m();let ie=window.setInterval(()=>{m()},1e4);return()=>{a=!0,window.clearInterval(ie)}},[]);let p=(0,d.useMemo)(()=>v.filter(a=>a.status!=="closed"),[v]),w=(0,d.useMemo)(()=>p.filter(a=>g(a)).sort((a,m)=>h(a)-h(m)),[p]),S=(0,d.useMemo)(()=>p.filter(a=>Z.has(a.status)&&!g(a)),[p]),Q=p.length-w.length-S.length,y=(0,d.useMemo)(()=>j(v),[v,o]),D=i?y:y.slice(0,s),ee=y.filter(a=>a.online||a.active.length>0).length,P=(0,d.useMemo)(()=>p.filter(a=>Z.has(a.status)||ce.has(a.status)).sort((a,m)=>Number(m.lastMessageAt??0)-Number(a.lastMessageAt??0)).slice(0,7),[p]),q=(0,d.useMemo)(()=>B.filter(a=>a.nextRunAt).sort((a,m)=>Date.parse(a.nextRunAt)-Date.parse(m.nextRunAt)).slice(0,5),[B]),te=c?.supported===!1||c?.cpuReady===!1?"-":X(c?.host?.cpuPct),se=c?.supported===!1?"-":X(c?.host?.memUsedPct),ne=c?.supported===!1?"-":ge(c?.botmux?.rssBytes),x=L(c?.host?.cpuPct,70,90,c?.supported!==!1&&c?.cpuReady!==!1),I=L(c?.host?.memUsedPct,75,90,c?.supported!==!1),T=c?.supported===!1?"unknown":he(c?.botmux?.rssBytes,c?.host?.memTotalBytes),M=we(c?.runtime?.sessions),U=c?.supported===!1?"unknown":fe([be(c?.runtime?.sampleHealth?.status),x,I,T,M]),ae=()=>{r(a=>(ve(!a),!a))};return(0,e.jsxs)("section",{className:"page hero-page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("app.subtitle")}),(0,e.jsx)("h1",{children:t("overview.title")}),(0,e.jsx)("p",{id:"overview-sub",children:t("overview.subtitle")})]}),(0,e.jsxs)("div",{className:"hero-pills",id:"overview-pills",children:[(0,e.jsxs)("span",{className:"pill",children:[t("overview.workingSessions")," ",(0,e.jsx)("b",{children:S.length})]}),(0,e.jsxs)("span",{className:`pill${w.length?" pill-hot":""}`,children:[t("overview.attention")," ",(0,e.jsx)("b",{children:w.length})]}),(0,e.jsxs)("span",{className:"pill",children:[t("overview.onlineBots")," ",(0,e.jsx)("b",{children:ee})]})]})]}),(0,e.jsxs)("a",{className:"resource-strip",href:"#/monitoring",children:[(0,e.jsxs)("span",{className:"resource-strip-title",children:[(0,e.jsx)("i",{className:`resource-health-dot ${U}`,"aria-hidden":"true"}),(0,e.jsx)("span",{children:t("monitoring.runtimeTitle")}),(0,e.jsx)("em",{children:t(`monitoring.health.${U}`)})]}),(0,e.jsxs)("span",{className:`resource-strip-metric ${x}`,children:[(0,e.jsx)("i",{className:`resource-health-dot ${x}`,"aria-hidden":"true"}),(0,e.jsx)("span",{children:t("monitoring.hostCpu")}),(0,e.jsx)("strong",{children:te})]}),(0,e.jsxs)("span",{className:`resource-strip-metric ${I}`,children:[(0,e.jsx)("i",{className:`resource-health-dot ${I}`,"aria-hidden":"true"}),(0,e.jsx)("span",{children:t("monitoring.hostMemory")}),(0,e.jsx)("strong",{children:se})]}),(0,e.jsxs)("span",{className:`resource-strip-metric ${T}`,children:[(0,e.jsx)("i",{className:`resource-health-dot ${T}`,"aria-hidden":"true"}),(0,e.jsx)("span",{children:t("monitoring.botmuxRss")}),(0,e.jsx)("strong",{children:ne})]}),(0,e.jsxs)("span",{className:`resource-strip-metric ${M}`,children:[(0,e.jsx)("i",{className:`resource-health-dot ${M}`,"aria-hidden":"true"}),(0,e.jsx)("span",{children:t("monitoring.sessions")}),(0,e.jsx)("strong",{children:Ne(c,t)})]})]}),(0,e.jsxs)("div",{className:"sect-head",children:[(0,e.jsx)("h2",{children:t("overview.team")}),(0,e.jsx)("span",{children:t("overview.teamHint")}),(0,e.jsx)("a",{href:"#/bot-defaults",children:t("overview.viewAll")})]}),(0,e.jsx)("div",{className:"team-grid",id:"team-grid",ref:n,children:D.length?D.map(a=>(0,e.jsx)(Ae,{card:a},a.larkAppId??a.botName)):(0,e.jsx)("div",{className:"empty",children:t("overview.noSessions")})}),(0,e.jsx)("button",{type:"button",className:"team-toggle",id:"team-toggle",hidden:y.length<=s,onClick:ae,children:i?t("overview.teamCollapse"):t("overview.teamExpand",{count:y.length})}),(0,e.jsxs)("div",{className:"sect-head",id:"attention-head",children:[(0,e.jsx)("h2",{children:t("overview.attention")}),(0,e.jsx)("span",{children:t("overview.attentionHint")})]}),(0,e.jsx)("div",{className:"qgrid",id:"attention-list",children:w.length?w.map(a=>(0,e.jsx)($e,{session:a},a.sessionId)):(0,e.jsx)("div",{className:"qcard qcard-empty",children:t("overview.noAttention")})}),(0,e.jsxs)("div",{className:"overview-cols",children:[(0,e.jsxs)("section",{className:"panel",children:[(0,e.jsxs)("header",{className:"panel-header",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:t("overview.activeSessions")}),(0,e.jsx)("p",{children:t("overview.activeSessionsHint")})]}),(0,e.jsx)("a",{className:"btn-link",href:"#/sessions",children:t("overview.viewAll")})]}),(0,e.jsx)("ul",{className:"overview-list",id:"recent-sessions",children:P.length?P.map(a=>(0,e.jsx)(ke,{session:a},a.sessionId)):(0,e.jsx)("li",{className:"empty",children:t("overview.noSessions")})})]}),(0,e.jsxs)("div",{className:"overview-side",children:[(0,e.jsxs)("section",{className:"panel",children:[(0,e.jsx)("header",{className:"panel-header",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:t("overview.today")}),(0,e.jsx)("p",{children:t("overview.todayHint")})]})}),(0,e.jsx)("div",{className:"donut-row",id:"today-donut",children:(0,e.jsx)(xe,{working:S.length,attention:w.length,idle:Math.max(0,Q)})})]}),(0,e.jsxs)("section",{className:"panel",children:[(0,e.jsxs)("header",{className:"panel-header",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{children:t("overview.nextSchedules")}),(0,e.jsx)("p",{children:t("schedules.subtitle")})]}),(0,e.jsx)("a",{className:"btn-link",href:"#/schedules",children:t("overview.viewAll")})]}),(0,e.jsx)("ul",{className:"overview-list",id:"next-schedules",children:q.length?q.map(a=>(0,e.jsx)(Se,{schedule:a,timeZone:V},a.id)):(0,e.jsx)("li",{className:"empty",children:t("overview.noSchedules")})})]})]})]})]})}function Ue(t){return F(t,(0,e.jsx)(Ie,{}))}export{Ue as renderOverviewPage};
@@ -1,98 +0,0 @@
1
- import{a as ie,b as ae}from"./chunk-5E3MJJL4.js";import{b as se}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import{o as a,p as u,r as _,t as ne,y as z}from"./chunk-3UJYRR2Q.js";import{a as we,b as J,c as le}from"./chunk-JTSE5VP6.js";import{c as V}from"./chunk-7SZRL6FY.js";var F=V(we(),1);var P=32768,me=Math.floor(P*.95),$e=/^[A-Za-z0-9._-]{1,64}$/,M=[],D=[],x=[],ye=[],Q=new Map,ee=new Map,te=!1,W="groups",E=null,b=null,w="",R="every",H=new Set,y=null,B=null,L="",k=null,$=0,U=null;function m(e){return $===e}function G(e,t){let o=U,l=o?.generation??$,r=window.setTimeout(()=>{o?.timers.delete(r),m(l)&&e()},t);return o?.timers.add(r),r}function ve(e){return $e.test(e)&&e!=="."&&e!==".."}function Be(){let[,e=""]=location.hash.split("?");return new URLSearchParams(e).get("chatId")?.trim()||null}async function A(){let t=await(await fetch("/api/groups")).json();D=(t.bots??[]).map(o=>({larkAppId:o.larkAppId,botName:o.botName??o.larkAppId,botAvatarUrl:o.botAvatarUrl})),M=(t.chats??[]).map(o=>({chatId:o.chatId,name:o.name??o.chatId,memberBots:(o.memberBots??[]).map(l=>({larkAppId:l.larkAppId,botName:l.botName??l.larkAppId,inChat:l.inChat??!1,hasRole:l.hasRole??!1,oncallChat:l.oncallChat??null}))}))}async function O(){x=(await(await fetch("/api/role-profiles")).json()).profiles??[]}async function j(e){ye=(await(await fetch(`/api/role-profiles/${encodeURIComponent(e)}`)).json()).entries??[]}async function oe(e,t){return(await fetch(`/api/roles/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)).json()}function he(e,t){return`${e}\0${t}`}async function Le(e=$){let t=await Promise.all(x.map(async r=>{try{let n=await(await fetch(`/api/role-profiles/${encodeURIComponent(r.profileId)}`)).json().catch(()=>({}));return[r.profileId,Array.isArray(n.entries)?n.entries:[]]}catch{return[r.profileId,[]]}}));if(!m(e))return!1;let o=new Map,l=new Set;return await Promise.all(M.flatMap(r=>r.memberBots.filter(d=>d.inChat).map(async d=>{let n=he(d.larkAppId,r.chatId);if(!l.has(n)){l.add(n);try{let p=await oe(d.larkAppId,r.chatId),f=p.hasEffectiveRole??p.hasRole,g="effectiveContent"in p?p.effectiveContent:p.content;o.set(n,{content:f?String(g??""):null,source:p.effectiveSource??(p.hasRole?"chat":"none")})}catch{o.set(n,null)}}}))),m(e)?(Q=new Map(t),ee=o,!0):!1}async function C(e=$){try{if(!await Le(e)||!m(e))return}catch{if(!m(e))return;Q=new Map,ee=new Map}te=!0,T(document.getElementById("roles-search")?.value??"")}async function Me(e,t,o,l){return(await fetch(`/api/roles/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,injectMode:l})})).ok}async function Re(e,t,o){return(await fetch(`/api/roles/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({injectMode:o})})).ok}async function Te(e,t){return(await fetch(`/api/roles/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}async function Ce(e,t){return(await fetch(`/api/role-profiles/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)).json()}async function Pe(e,t,o){return(await fetch(`/api/role-profiles/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,allowEmpty:!0})})).ok}async function ke(e,t){return(await fetch(`/api/role-profiles/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}function re(e){return new TextEncoder().encode(e).length}function ge(e){return e.memberBots.filter(t=>t.inChat&&t.hasRole).length}function Ae(e){return e.memberBots.filter(t=>t.inChat).length}function Y(e){return ye.find(t=>t.larkAppId===e)}function de(e){W=e,document.getElementById("roles-by-group-view")?.toggleAttribute("hidden",e!=="groups"),document.getElementById("roles-profiles-view")?.toggleAttribute("hidden",e!=="profiles")}function He(e){if(!x.length||!te)return"";let t=new Map;for(let r of e.memberBots)r.inChat&&t.set(r.larkAppId,ee.get(he(r.larkAppId,e.chatId))??null);if(!ie(t))return"";let o=ae(e.memberBots,x,Q,t)[0];if(!o)return`<div class="roles-profile-match muted">${a("groups.profileStatusUnmatched")}</div>`;let l=o.kind==="full"?"groups.profileStatusFullChat":"groups.profileStatusPartial";return`<div class="roles-profile-match ${o.kind}">
2
- ${u(a(l,{name:o.profileId,matched:o.matched,total:o.total,chat:o.chatMatched}))}
3
- </div>`}function T(e=""){let t=document.getElementById("roles-tree");if(!t)return;let o=e.toLowerCase(),l=M.filter(r=>{if(!o)return!0;let d=r.chatId.toLowerCase().includes(o)||(r.name??"").toLowerCase().includes(o),n=r.memberBots.some(p=>p.larkAppId.toLowerCase().includes(o)||(p.botName??"").toLowerCase().includes(o));return d||n});if(l.length===0){t.innerHTML=`<div class="roles-empty">${a("roles.noChats")}</div>`;return}t.innerHTML=l.map(r=>{let d=H.has(r.chatId),n=r.memberBots.filter(c=>c.inChat),p=d?"\u25BE":"\u25B8",f=ge(r),g=Ae(r),i=d?n.map(c=>`
4
- <div class="roles-bot-row ${E===r.chatId&&b===c.larkAppId?"selected":""}"
5
- data-group-id="${u(r.chatId)}"
6
- data-bot-id="${u(c.larkAppId)}">
7
- <span class="roles-bot-indent"></span>
8
- ${_({name:c.botName,larkAppId:c.larkAppId,size:"sm"})}
9
- <div class="roles-bot-info">
10
- <div class="roles-bot-name">${u(c.botName)}</div>
11
- <div class="roles-bot-id">${u(c.larkAppId)}</div>
12
- </div>
13
- <span class="roles-badge ${c.hasRole?"has-role":"no-role"}">
14
- ${c.hasRole?a("roles.configured"):a("roles.unconfigured")}
15
- </span>
16
- </div>`).join(""):"";return`
17
- <div class="roles-group-section">
18
- <div class="roles-group-row ${d?"expanded":""} ${E===r.chatId&&!b?"selected":""}"
19
- data-group-id="${u(r.chatId)}">
20
- <span class="roles-group-arrow">${p}</span>
21
- <span class="roles-group-icon" aria-hidden="true"><svg viewBox="0 0 16 16"><circle cx="5.6" cy="5.8" r="2.4"/><path d="M1.8 13.2c.5-2.4 2-3.6 3.8-3.6s3.3 1.2 3.8 3.6"/><circle cx="11" cy="6.8" r="1.9"/><path d="M9.8 12.6c.4-1.7 1.5-2.6 2.8-2.6 1 0 1.9.5 2.4 1.6"/></svg></span>
22
- <div class="roles-group-info">
23
- <div class="roles-group-name">${u(r.name??r.chatId)}</div>
24
- <div class="roles-group-meta">
25
- ${f}/${g} ${a("roles.botsWithRoles")}
26
- </div>
27
- ${He(r)}
28
- </div>
29
- <span class="roles-group-chevron"></span>
30
- </div>
31
- <div class="roles-bot-list">${i}</div>
32
- </div>`}).join(""),t.querySelectorAll(".roles-group-row").forEach(r=>{r.addEventListener("click",()=>{let d=r.dataset.groupId;d&&(H.has(d)?H.delete(d):H.add(d),T(document.getElementById("roles-search")?.value??""))})}),t.querySelectorAll(".roles-bot-row").forEach(r=>{r.addEventListener("click",d=>{d.stopPropagation();let n=r.dataset.groupId,p=r.dataset.botId;n&&p&&Ne(n,p)})})}async function Ne(e,t,o=$){E=e,b=t;let l=await oe(t,e);if(!m(o))return;let r=document.getElementById("roles-editor-empty"),d=document.getElementById("roles-editor-form"),n=document.getElementById("roles-editor-textarea"),p=document.getElementById("roles-editor-group-name"),f=document.getElementById("roles-editor-bot-name"),g=document.getElementById("roles-editor-chat-id");r&&(r.style.display="none"),d&&(d.style.display="");let i=M.find(I=>I.chatId===e),c=i?.memberBots.find(I=>I.larkAppId===t);p&&(p.textContent=i?.name??e),f&&(f.textContent=c?.botName??t),g&&(g.textContent=`${e} \xB7 ${t}`),w=l.content??"",R=l.injectMode==="once"?"once":"every",n&&(n.value=w,n.focus());let v=document.getElementById("roles-editor-inject-mode");v&&(v.value=R),K(),X(),T(document.getElementById("roles-search")?.value??"");let h=document.getElementById("roles-delete");h&&(h.style.display=l.hasRole?"":"none")}function K(){let e=document.getElementById("roles-editor-bytecount");if(!e)return;let t=re(w);e.textContent=`${t} / ${P} bytes`,e.className=`roles-bytecount ${t>me?"warn":""} ${t>P?"over":""}`,Se(t)}function Se(e){let t=document.getElementById("roles-save");if(!t)return;let o=e??re(w);t.disabled=o>P||w.trim().length===0}function X(){let e=document.getElementById("roles-preview");e&&(w.trim()?e.innerHTML=`<strong>${a("roles.preview")}</strong><pre>${u(w)}</pre>`:e.innerHTML=`<small>${a("roles.previewEmpty")}</small>`)}function ce(){E=null,b=null,w="",R="every";let e=document.getElementById("roles-editor-empty"),t=document.getElementById("roles-editor-form"),o=document.getElementById("roles-editor-textarea"),l=document.getElementById("roles-delete");e&&(e.style.display=""),t&&(t.style.display="none"),o&&(o.value=""),l&&(l.style.display="none")}function N(e=""){let t=document.getElementById("roles-profile-list");if(!t)return;let o=e.toLowerCase(),l=x.filter(r=>!o||r.profileId.toLowerCase().includes(o));if(l.length===0){t.innerHTML=`<div class="roles-empty">${a("roles.profileEmpty")}</div>`;return}t.innerHTML=l.map(r=>{let d=y===r.profileId,n=(r.botEntries??[]).some(p=>p.hasEntry);return`
33
- <div class="roles-profile-row ${d?"selected":""}" data-profile-id="${u(r.profileId)}">
34
- <div class="roles-profile-row-main">
35
- <div class="roles-profile-name">${u(r.profileId)}</div>
36
- <div class="roles-group-meta">${r.entryCount} ${a("roles.profileEntries")}</div>
37
- </div>
38
- <span class="roles-badge ${n?"has-role":"no-role"}">${n?a("roles.configured"):a("roles.profileMissing")}</span>
39
- </div>`}).join(""),t.querySelectorAll(".roles-profile-row").forEach(r=>{r.addEventListener("click",()=>{let d=r.dataset.profileId;d&&Z(d)})})}async function Z(e,t=$){ve(e.trim())&&(y=e.trim(),B=null,L="",k=k??M[0]?.chatId??null,await j(y),m(t)&&(N(document.getElementById("roles-profile-search")?.value??""),q()))}function q(){let e=document.getElementById("roles-profile-empty"),t=document.getElementById("roles-profile-detail");if(!e||!t)return;if(!y){e.style.display="",t.style.display="none",t.innerHTML="";return}e.style.display="none",t.style.display="";let o=D.find(r=>r.larkAppId===B),l=B?Y(B):void 0;t.innerHTML=`
40
- <div class="roles-profile-title">
41
- <div>
42
- <div class="roles-editor-breadcrumb">
43
- <span>${u(y)}</span>
44
- ${o?`<span class="roles-breadcrumb-sep">\u203A</span><span>${u(o.botName??o.larkAppId)}</span>`:""}
45
- </div>
46
- <div class="roles-editor-meta-line">${a("roles.profileRuntimeHint")}</div>
47
- </div>
48
- </div>
49
- <div class="roles-profile-grid">
50
- <div class="roles-profile-bots">
51
- <div class="roles-profile-section-title">${a("roles.profileBots")}</div>
52
- <div class="roles-profile-bot-list">
53
- ${D.map(r=>{let d=!!Y(r.larkAppId);return`
54
- <div class="roles-bot-row roles-profile-bot-row ${B===r.larkAppId?"selected":""}" data-profile-bot-id="${u(r.larkAppId)}">
55
- ${_({name:r.botName,larkAppId:r.larkAppId,size:"sm"})}
56
- <div class="roles-bot-info">
57
- <div class="roles-bot-name">${u(r.botName??r.larkAppId)}</div>
58
- <div class="roles-bot-id">${u(r.larkAppId)}</div>
59
- </div>
60
- <span class="roles-badge ${d?"has-role":"no-role"}">${d?a("roles.configured"):a("roles.unconfigured")}</span>
61
- </div>`}).join("")}
62
- </div>
63
- </div>
64
- <div class="roles-profile-editor">
65
- ${B?`
66
- <textarea id="roles-profile-textarea" placeholder="${a("roles.profileEditorPlaceholder")}" rows="12">${u(L||l?.content||"")}</textarea>
67
- <div class="roles-editor-footer">
68
- <span id="roles-profile-bytecount" class="roles-bytecount"></span>
69
- <div class="roles-editor-actions">
70
- <button type="button" id="roles-profile-delete" class="danger" ${l?"":'style="display:none"'}>${a("roles.delete")}</button>
71
- <button type="button" id="roles-profile-save" class="primary">${a("roles.saveEntry")}</button>
72
- </div>
73
- </div>
74
- <div id="roles-profile-preview" class="roles-preview"></div>
75
- `:`<div class="roles-editor-empty roles-profile-inline-empty">${a("roles.profileBotSelectHint")}</div>`}
76
- </div>
77
- </div>
78
- <div class="roles-profile-apply">
79
- <div class="roles-profile-section-title">${a("roles.applyToGroup")}</div>
80
- <div class="roles-profile-apply-controls">
81
- <select id="roles-profile-apply-group">
82
- ${M.map(r=>`<option value="${u(r.chatId)}" ${k===r.chatId?"selected":""}>${u(r.name??r.chatId)}</option>`).join("")}
83
- </select>
84
- <label class="roles-profile-force"><input type="checkbox" id="roles-profile-apply-force"> ${a("roles.applyForce")}</label>
85
- </div>
86
- <div id="roles-profile-apply-bots"></div>
87
- <div class="roles-editor-actions">
88
- <button type="button" id="roles-profile-preview-apply">${a("roles.previewApply")}</button>
89
- <button type="button" id="roles-profile-apply" class="primary">${a("roles.applyProfile")}</button>
90
- </div>
91
- <div id="roles-profile-apply-status" class="roles-profile-status"></div>
92
- </div>
93
- `,t.querySelectorAll(".roles-profile-bot-row").forEach(r=>{r.addEventListener("click",()=>{let d=r.dataset.profileBotId;d&&xe(d)})}),Ie(),je()}async function xe(e,t=$){if(!y)return;B=e;let o=await Ce(y,e);m(t)&&(L=o.content??"",await j(y),m(t)&&q())}function je(){let e=$,t=document.getElementById("roles-profile-textarea");t&&(L=t.value,pe(),ue(),t.addEventListener("input",o=>{L=o.target.value,pe(),ue()})),document.getElementById("roles-profile-save")?.addEventListener("click",async function(){if(!(!y||!B)){this.disabled=!0,this.textContent="...";try{let o=await Pe(y,B,L);if(!m(e)||(await O(),!m(e))||(await j(y),!m(e)))return;N(document.getElementById("roles-profile-search")?.value??""),C(e),q(),qe(o?a("roles.saved"):a("roles.saveFailed"),!o)}finally{if(!m(e))return;this.disabled=!1,this.textContent=a("roles.saveEntry")}}}),document.getElementById("roles-profile-delete")?.addEventListener("click",async function(){if(!(!y||!B)&&confirm(a("roles.confirmDeleteProfileEntry"))){this.disabled=!0;try{if(await ke(y,B),!m(e)||(L="",await O(),!m(e))||(await j(y),!m(e)))return;N(document.getElementById("roles-profile-search")?.value??""),C(e),q()}finally{if(!m(e))return;this.disabled=!1}}}),document.getElementById("roles-profile-apply-group")?.addEventListener("change",o=>{k=o.target.value,Ie()}),document.getElementById("roles-profile-preview-apply")?.addEventListener("click",()=>fe(!0,e)),document.getElementById("roles-profile-apply")?.addEventListener("click",()=>fe(!1,e))}function pe(){let e=document.getElementById("roles-profile-bytecount"),t=document.getElementById("roles-profile-save");if(!e)return;let o=re(L);e.textContent=`${o} / ${P} bytes`,e.className=`roles-bytecount ${o>me?"warn":""} ${o>P?"over":""}`,t&&(t.disabled=o>P||L.trim().length===0)}function ue(){let e=document.getElementById("roles-profile-preview");e&&(e.innerHTML=L.trim()?`<strong>${a("roles.preview")}</strong><pre>${u(L)}</pre>`:`<small>${a("roles.previewEmpty")}</small>`)}function Ie(){let e=document.getElementById("roles-profile-apply-bots");if(!e)return;let t=k??M[0]?.chatId??"",o=M.find(r=>r.chatId===t),l=o?.memberBots.filter(r=>r.inChat)??[];if(!o||l.length===0){e.innerHTML=`<div class="roles-empty">${a("roles.noChats")}</div>`;return}e.innerHTML=l.map(r=>{let d=!!Y(r.larkAppId);return`
94
- <label class="checkbox-row roles-profile-apply-bot">
95
- <input type="checkbox" name="profile-apply-bot" value="${u(r.larkAppId)}" ${d?"checked":""}>
96
- <span>${u(r.botName??r.larkAppId)}</span>
97
- <small>${d?a("roles.configured"):a("roles.profileMissing")}</small>
98
- </label>`}).join("")}async function fe(e,t=$){let o=y;if(!o)return;let l=k??M[0]?.chatId;if(!l)return;let r=document.getElementById("roles-profile-apply-force")?.checked===!0,d=[...document.querySelectorAll("input[name=profile-apply-bot]:checked")].map(f=>f.value),n=document.getElementById("roles-profile-apply-status");if(d.length===0){n&&(n.textContent=a("roles.applyPickBots"));return}n&&(n.textContent="...");let p=await Promise.all(d.map(async f=>{let g=await fetch(`/api/role-profiles/${encodeURIComponent(o)}/apply`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({chatId:l,larkAppId:f,force:r,preview:e})}),i=await g.json().catch(()=>({}));return{larkAppId:f,ok:g.ok&&i.ok!==!1,status:g.status,error:i.error,wouldRefuse:i.wouldRefuse}}));if(m(t)&&(n&&(n.innerHTML=p.map(f=>{let g=D.find(v=>v.larkAppId===f.larkAppId),i=u(g?.botName??f.larkAppId),c=f.ok?e?f.wouldRefuse?a("roles.applyWouldRefuse"):a("roles.applyPreviewOk"):a("roles.applyOk"):`${a("roles.applyFailed")}: ${u(f.error??`HTTP ${f.status}`)}`;return`<div>${i}: ${c}</div>`}).join("")),!e)){if(await A(),!m(t))return;T(document.getElementById("roles-search")?.value??""),C(t)}}function qe(e,t=!1){let o=document.querySelector("#roles-profile-detail .roles-editor-footer");if(!o)return;let l=document.createElement("span");l.className=`roles-saved-flash ${t?"roles-save-error":""}`,l.textContent=` ${e}`,o.appendChild(l),G(()=>l.remove(),t?3e3:2e3)}function Ee(e,t){let o=$+1;$=o;let l=new Set;U={generation:o,timers:l};let r=[],d=!1,n=()=>!d&&m(o),p=(i,c,v)=>{i&&(i.addEventListener(c,v),r.push(()=>i.removeEventListener(c,v)))};W=t,H.clear(),te=!1,ce(),de(W);let f=e.querySelector("#roles-tree"),g=e.querySelector("#roles-profile-list");return f&&(f.innerHTML=z()),g&&(g.innerHTML=z()),(async()=>{if(await A(),!!n()&&(await O(),!!n()&&(await ne(),!!n()))){if(t==="profiles"){let i=Be();i&&M.some(c=>c.chatId===i)&&(k=i)}for(let i of M)ge(i)>0&&H.add(i.chatId);T(),N(),y&&await Z(y,o),n()&&C(o)}})(),p(e.querySelector("#roles-search"),"input",i=>{n()&&T(i.target.value)}),p(e.querySelector("#roles-refresh"),"click",async()=>{if(n()&&(await A(),!!n()&&(T(document.getElementById("roles-search")?.value??""),C(o),E&&b))){let i=await oe(b,E);if(!n())return;let c=document.getElementById("roles-editor-textarea");c&&(c.value=i.content??""),w=i.content??"",R=i.injectMode==="once"?"once":"every";let v=document.getElementById("roles-editor-inject-mode");v&&(v.value=R),K(),X();let h=document.getElementById("roles-delete");h&&(h.style.display=i.hasRole?"":"none")}}),p(e.querySelector("#roles-save"),"click",async i=>{if(!E||!b)return;let c=i.currentTarget;c.disabled=!0,c.textContent="...";try{let v=await Me(b,E,w,R);if(!n())return;if(v){if(await A(),!n())return;T(document.getElementById("roles-search")?.value??""),C(o);let h=document.getElementById("roles-delete");h&&(h.style.display="");let I=document.createElement("span");I.className="roles-saved-flash",I.textContent=` ${a("roles.saved")}`,document.querySelector(".roles-editor-footer")?.appendChild(I),G(()=>I.remove(),2e3)}else{let h=document.createElement("span");h.className="roles-saved-flash roles-save-error",h.textContent=w.trim().length===0?` ${a("roles.emptyError")}`:` ${a("roles.saveFailed")}`,document.querySelector(".roles-editor-footer")?.appendChild(h),G(()=>h.remove(),3e3)}}finally{if(!n())return;c.disabled=!1,c.textContent=a("roles.save")}}),p(e.querySelector("#roles-delete"),"click",async i=>{if(!E||!b||!confirm(a("roles.confirmDelete")))return;let c=i.currentTarget;c.disabled=!0,c.textContent="...";try{let v=await Te(b,E);if(!n())return;if(v){if(await A(),!n())return;ce(),T(document.getElementById("roles-search")?.value??""),C(o)}}finally{if(!n())return;c.disabled=!1,c.textContent=a("roles.delete")}}),p(e.querySelector("#roles-editor-textarea"),"input",i=>{n()&&(w=i.target.value,K(),X())}),p(e.querySelector("#roles-editor-inject-mode"),"change",async i=>{if(!n()||!E||!b)return;let c=i.target,v=c.value==="once"?"once":"every",h=R;R=v,c.disabled=!0;try{let I=await Re(b,E,v);if(!n())return;I||(R=h,c.value=h);let S=document.createElement("span");S.className=`roles-saved-flash ${I?"":"roles-save-error"}`,S.textContent=` ${I?a("roles.saved"):a("roles.saveFailed")}`,e.querySelector(".roles-editor-inject")?.appendChild(S),G(()=>S.remove(),I?2e3:3e3)}finally{if(!n())return;c.disabled=!1}}),p(e.querySelector("#roles-profile-search"),"input",i=>{n()&&N(i.target.value)}),p(e.querySelector("#roles-profile-refresh"),"click",async()=>{n()&&(await A(),n()&&(await O(),n()&&(C(o),y&&await j(y),n()&&(N(document.getElementById("roles-profile-search")?.value??""),q()))))}),p(e.querySelector("#roles-profile-select"),"click",async()=>{if(!n())return;let i=document.getElementById("roles-profile-id"),c=i?.value.trim();if(c){if(!ve(c)){i?.setCustomValidity(a("roles.profileIdInvalid")),i?.reportValidity();return}i?.setCustomValidity(""),await Z(c,o),n()&&(location.hash.startsWith("#/roles/profile")?de("profiles"):location.hash="#/roles/profile")}}),p(e.querySelector("#roles-profile-id"),"input",i=>{i.target.setCustomValidity("")}),()=>{d=!0,m(o)&&($+=1);for(let i of r.splice(0))i();for(let i of l)window.clearTimeout(i);l.clear(),U?.generation===o&&(U=null)}}var s=V(le(),1);function be(e){let t=se(),o=(0,F.useRef)(null),l=e.tab==="profiles";return(0,F.useEffect)(()=>{if(o.current)return Ee(o.current,e.tab)},[e.tab]),(0,s.jsxs)("section",{className:"page roles-page",ref:o,children:[(0,s.jsx)("div",{className:"page-heading roles-heading",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"eyebrow",children:t("nav.roles")}),(0,s.jsx)("h1",{children:t("roles.title")}),(0,s.jsx)("p",{children:t("roles.subtitle")})]})}),(0,s.jsxs)("nav",{className:"wf-subnav roles-subnav",children:[(0,s.jsx)("a",{href:"#/roles",className:l?void 0:"active",children:t("roles.tabGroups")}),(0,s.jsx)("a",{href:"#/roles/profile",className:l?"active":void 0,children:t("roles.tabProfiles")})]}),(0,s.jsxs)("div",{id:"roles-by-group-view",className:"roles-layout",hidden:l,children:[(0,s.jsxs)("div",{className:"roles-tree-panel",children:[(0,s.jsxs)("div",{className:"roles-tree-header",children:[(0,s.jsx)("input",{type:"search",id:"roles-search",placeholder:t("roles.search")}),(0,s.jsx)("button",{type:"button",id:"roles-refresh",children:t("roles.refresh")})]}),(0,s.jsx)("div",{id:"roles-tree",className:"roles-tree"})]}),(0,s.jsxs)("div",{className:"roles-editor-panel",children:[(0,s.jsx)("div",{id:"roles-editor-empty",className:"roles-editor-empty",children:t("roles.selectHint")}),(0,s.jsxs)("div",{id:"roles-editor-form",className:"roles-editor-form",style:{display:"none"},children:[(0,s.jsxs)("div",{className:"roles-editor-breadcrumb",children:[(0,s.jsx)("span",{id:"roles-editor-group-name"}),(0,s.jsx)("span",{className:"roles-breadcrumb-sep",children:"\u203A"}),(0,s.jsx)("span",{id:"roles-editor-bot-name"})]}),(0,s.jsx)("div",{className:"roles-editor-meta",children:(0,s.jsx)("span",{id:"roles-editor-chat-id",className:"roles-editor-meta-line"})}),(0,s.jsxs)("div",{className:"roles-editor-inject",children:[(0,s.jsx)("label",{htmlFor:"roles-editor-inject-mode",children:t("roles.injectModeLabel")}),(0,s.jsxs)("select",{id:"roles-editor-inject-mode",children:[(0,s.jsx)("option",{value:"every",children:t("roles.injectModeEvery")}),(0,s.jsx)("option",{value:"once",children:t("roles.injectModeOnce")})]}),(0,s.jsx)("span",{className:"roles-editor-inject-hint",children:t("roles.injectModeHint")})]}),(0,s.jsx)("textarea",{id:"roles-editor-textarea",placeholder:t("roles.editorPlaceholder"),rows:14}),(0,s.jsxs)("div",{className:"roles-editor-footer",children:[(0,s.jsx)("span",{id:"roles-editor-bytecount",className:"roles-bytecount"}),(0,s.jsxs)("div",{className:"roles-editor-actions",children:[(0,s.jsx)("button",{type:"button",id:"roles-delete",className:"danger",children:t("roles.delete")}),(0,s.jsx)("button",{type:"button",id:"roles-save",className:"primary",children:t("roles.save")})]})]}),(0,s.jsx)("div",{id:"roles-preview",className:"roles-preview"})]})]})]}),(0,s.jsxs)("div",{id:"roles-profiles-view",className:"roles-layout roles-profiles-layout",hidden:!l,children:[(0,s.jsxs)("div",{className:"roles-tree-panel",children:[(0,s.jsxs)("div",{className:"roles-tree-header roles-profile-create",children:[(0,s.jsx)("input",{type:"text",id:"roles-profile-id",placeholder:t("roles.profileIdPlaceholder"),maxLength:64}),(0,s.jsx)("button",{type:"button",id:"roles-profile-select",children:t("roles.openProfile")})]}),(0,s.jsxs)("div",{className:"roles-tree-header",children:[(0,s.jsx)("input",{type:"search",id:"roles-profile-search",placeholder:t("roles.profileSearch")}),(0,s.jsx)("button",{type:"button",id:"roles-profile-refresh",children:t("roles.refresh")})]}),(0,s.jsx)("div",{id:"roles-profile-list",className:"roles-tree"})]}),(0,s.jsxs)("div",{className:"roles-editor-panel",children:[(0,s.jsx)("div",{id:"roles-profile-empty",className:"roles-editor-empty",children:t("roles.profileSelectHint")}),(0,s.jsx)("div",{id:"roles-profile-detail",className:"roles-editor-form roles-profile-detail",style:{display:"none"}})]})]})]})}function _e(e){return J(e,(0,s.jsx)(be,{tab:"groups"}))}function ze(e){return J(e,(0,s.jsx)(be,{tab:"profiles"}))}export{ze as renderRoleProfilesPage,_e as renderRolesPage};
@@ -1 +0,0 @@
1
- import{a as y,b as N}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import"./chunk-3UJYRR2Q.js";import{a as x,b as k,c as w}from"./chunk-JTSE5VP6.js";import{c as m}from"./chunk-7SZRL6FY.js";var u=m(x(),1);var e=m(w(),1);function g(t,a){if(!t)return"\u2014";try{let o=new Date(t),l=a?{timeZone:a,timeZoneName:"short"}:void 0;return o.toLocaleString(void 0,l)}catch{return t}}function R(t,a){let o=a.q.toLowerCase();return t.filter(l=>!a.kind||l.parsed?.kind===a.kind).filter(l=>!a.enabledOnly||l.enabled).filter(l=>!o||JSON.stringify(l).toLowerCase().includes(o)).sort((l,r)=>{if(l.enabled!==r.enabled)return l.enabled?-1:1;let c=l.nextRunAt?Date.parse(l.nextRunAt):1/0,h=r.nextRunAt?Date.parse(r.nextRunAt):1/0;return c-h})}function $(t,a){return t.deliver==="new-topic"?`\u{1F195} ${a("schedules.deliveryNewTopic")}`:t.deliver==="local"?`\u{1F515} ${a("schedules.deliveryLocal")}`:a("schedules.deliveryOrigin")}function C(t){return t.repeat?`${t.repeat.completed}/${t.repeat.times??"\u221E"}`:"\u2014"}function A(){let t=N(),a=y(n=>[...n.schedules.values()]),o=y(n=>n.scheduleTimeZone),[l,r]=(0,u.useState)({q:"",kind:"",enabledOnly:!1}),[c,h]=(0,u.useState)(null),d={name:t("schedules.name"),bot:t("schedules.bot"),schedule:t("schedules.schedule"),delivery:t("schedules.delivery"),next:t("schedules.next"),last:t("schedules.last"),repeat:t("schedules.repeat"),enabled:t("schedules.enabled"),actions:t("schedules.actions")},v=(0,u.useMemo)(()=>R(a,l),[a,l]);async function p(n,i){let f=`${n}:${i}`;h(f);try{let s=await fetch(`/api/schedules/${encodeURIComponent(n)}/${i}`,{method:"POST"}),S=await s.json().catch(()=>({}));(!s.ok||S.ok===!1)&&alert(`Failed: ${s.status} ${S?.error??""}`.trim())}catch(s){alert("Network error: "+s)}finally{h(s=>s===f?null:s)}}return(0,e.jsxs)("section",{className:"page schedules-page",children:[(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.schedules")}),(0,e.jsx)("h1",{children:t("schedules.title")}),(0,e.jsx)("p",{children:t("schedules.subtitle")})]})}),(0,e.jsxs)("form",{id:"sched-filters",className:"filters",children:[(0,e.jsx)("input",{type:"search",name:"q",placeholder:t("schedules.search"),value:l.q,onChange:n=>r(i=>({...i,q:n.currentTarget.value}))}),(0,e.jsxs)("select",{name:"kind",value:l.kind,onChange:n=>r(i=>({...i,kind:n.currentTarget.value})),children:[(0,e.jsx)("option",{value:"",children:t("schedules.anyKind")}),(0,e.jsx)("option",{value:"cron",children:"cron"}),(0,e.jsx)("option",{value:"interval",children:"interval"}),(0,e.jsx)("option",{value:"once",children:"once"})]}),(0,e.jsxs)("label",{children:[(0,e.jsx)("input",{type:"checkbox",name:"enabled",checked:l.enabledOnly,onChange:n=>r(i=>({...i,enabledOnly:n.currentTarget.checked}))})," ",t("schedules.enabledOnly")]})]}),(0,e.jsxs)("table",{className:"schedules-table",children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{children:d.name}),(0,e.jsx)("th",{children:d.bot}),(0,e.jsx)("th",{children:d.schedule}),(0,e.jsx)("th",{children:d.delivery}),(0,e.jsx)("th",{children:d.next}),(0,e.jsx)("th",{children:d.last}),(0,e.jsx)("th",{children:d.repeat}),(0,e.jsx)("th",{children:d.enabled}),(0,e.jsx)("th",{children:d.actions})]})}),(0,e.jsx)("tbody",{id:"schedules-tbody",children:v.length===0?(0,e.jsx)("tr",{className:"schedule-empty-row",children:(0,e.jsx)("td",{colSpan:9,className:"empty",children:t("schedules.empty")})}):v.map(n=>(0,e.jsxs)("tr",{"data-id":n.id,children:[(0,e.jsx)("td",{"data-label":d.name,children:n.name??n.id}),(0,e.jsx)("td",{"data-label":d.bot,children:n.botName??n.larkAppId??"-"}),(0,e.jsx)("td",{"data-label":d.schedule,children:(0,e.jsx)("code",{children:n.parsed?.display??"?"})}),(0,e.jsx)("td",{"data-label":d.delivery,children:$(n,t)}),(0,e.jsx)("td",{"data-label":d.next,children:g(n.nextRunAt,o)}),(0,e.jsxs)("td",{"data-label":d.last,children:[g(n.lastRunAt,o)," ",n.lastStatus==="error"?"\u26A0\uFE0F":""]}),(0,e.jsx)("td",{"data-label":d.repeat,children:C(n)}),(0,e.jsx)("td",{"data-label":d.enabled,children:n.enabled?"\u2713":"\u2717"}),(0,e.jsx)("td",{className:"actions-cell","data-label":d.actions,children:(0,e.jsxs)("div",{className:"schedule-actions",children:[(0,e.jsx)(b,{op:"run",label:t("schedules.runNow"),pending:c===`${n.id}:run`,onClick:()=>{p(n.id,"run")}}),n.enabled?(0,e.jsx)(b,{op:"pause",label:t("schedules.pause"),pending:c===`${n.id}:pause`,onClick:()=>{p(n.id,"pause")}}):(0,e.jsx)(b,{op:"resume",label:t("schedules.resume"),pending:c===`${n.id}:resume`,onClick:()=>{p(n.id,"resume")}}),n.deliver==="local"?null:(0,e.jsx)(b,{op:"delivery",label:n.deliver==="new-topic"?t("schedules.useOrigin"):t("schedules.useNewTopic"),pending:c===`${n.id}:delivery`,onClick:()=>{p(n.id,"delivery")}})]})})]},n.id))})]})]})}function b(t){return(0,e.jsx)("button",{type:"button","data-op":t.op,disabled:t.pending,onClick:t.onClick,children:t.pending?"...":t.label})}function T(t){return k(t,(0,e.jsx)(A,{}))}export{R as filterSchedules,g as fmtScheduleDate,T as renderSchedulesPage};
@@ -1 +0,0 @@
1
- import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k}from"./chunk-QW54DWU3.js";import"./chunk-3N2PPQVD.js";import"./chunk-LXIK7OUJ.js";import"./chunk-3UJYRR2Q.js";import"./chunk-7SZRL6FY.js";export{a as SESSION_STATUS_OPTIONS,h as canRestartSession,d as isUnknownChatSession,i as openCreateSessionModal,f as renderCliFilterGroup,j as renderSessionsPage,g as restartConfirmMessage,c as sessionLocationText,b as sessionStatusText,e as terminalHref,k as wireSessionsPage};
@@ -1 +0,0 @@
1
- import{a as b,b as p,c,g as m,l as h}from"./chunk-QW54DWU3.js";import"./chunk-3N2PPQVD.js";import{b as u}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import{d as l}from"./chunk-3UJYRR2Q.js";import{a as k,b as d,c as r}from"./chunk-JTSE5VP6.js";import{c as i}from"./chunk-7SZRL6FY.js";var a=i(k(),1);var s=i(r(),1);function t(e){return(0,s.jsx)("th",{"data-sort":e.sort,"data-label":e.label,children:e.label})}function v(){let e=u(),n=(0,a.useRef)(null);return(0,a.useEffect)(()=>{if(n.current)return h(n.current)},[]),(0,s.jsxs)("section",{className:"page",ref:n,children:[(0,s.jsxs)("div",{className:"page-heading",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"eyebrow",children:e("nav.sessions")}),(0,s.jsx)("h1",{children:e("sessions.title")}),(0,s.jsx)("p",{children:e("sessions.subtitle")})]}),(0,s.jsxs)("div",{className:"sessions-view-controls",children:[(0,s.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!0}),(0,s.jsx)("select",{id:"kanban-team",className:"kanban-team-select","aria-label":e("sessions.kanban.groupTeam"),hidden:!0}),(0,s.jsxs)("div",{className:"segmented kanban-groupby",id:"kanban-groupby",role:"group","aria-label":e("sessions.kanban.groupBy"),hidden:!0,children:[(0,s.jsx)("button",{type:"button","data-groupby":"flow",children:e("sessions.kanban.groupFlow")}),(0,s.jsx)("button",{type:"button","data-groupby":"team",children:e("sessions.kanban.groupTeam")}),(0,s.jsx)("button",{type:"button","data-groupby":"bot",children:e("sessions.kanban.groupBot")})]}),(0,s.jsxs)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":e("sessions.viewMode"),children:[(0,s.jsx)("button",{type:"button","data-view":"kanban",children:e("sessions.viewKanban")}),(0,s.jsx)("button",{type:"button","data-view":"board",children:e("sessions.viewBoard")}),(0,s.jsx)("button",{type:"button","data-view":"table",children:e("sessions.viewTable")})]}),(0,s.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",children:e("sessions.monitorRoom")})]})]}),(0,s.jsxs)("form",{id:"filters",className:"filters sessions-filters",children:[(0,s.jsx)("input",{type:"search",name:"q",placeholder:e("sessions.search")}),(0,s.jsxs)("select",{name:"status",children:[(0,s.jsx)("option",{value:"",children:e("sessions.anyStatus")}),p.map(o=>(0,s.jsx)("option",{value:o,children:c(o)},o))]}),(0,s.jsxs)("select",{name:"adopt",children:[(0,s.jsx)("option",{value:"",children:e("sessions.adoptAny")}),(0,s.jsx)("option",{value:"yes",children:e("sessions.adoptYes")}),(0,s.jsx)("option",{value:"no",children:e("sessions.adoptNo")})]}),(0,s.jsx)("select",{name:"chat","aria-label":e("sessions.location"),children:(0,s.jsx)("option",{value:"",children:e("sessions.chatAny")})}),(0,s.jsx)("span",{style:{display:"contents"},dangerouslySetInnerHTML:{__html:m()}}),(0,s.jsxs)("label",{className:"filter-toggle",children:[(0,s.jsx)("input",{type:"checkbox",name:"showUnknownChats",defaultChecked:l(typeof window>"u"?void 0:window.localStorage)})," ",(0,s.jsx)("span",{children:e("sessions.showUnknownChats")})]}),(0,s.jsxs)("label",{className:"filter-toggle",children:[(0,s.jsx)("input",{type:"checkbox",name:"active",defaultChecked:!0})," ",(0,s.jsx)("span",{children:e("sessions.activeOnly")})]})]}),(0,s.jsxs)("div",{id:"idle-cleanup-bar",className:"idle-cleanup-bar",children:[(0,s.jsxs)("div",{className:"idle-cleanup-summary",children:[(0,s.jsx)("span",{className:"idle-cleanup-dot","aria-hidden":"true"}),(0,s.jsx)("span",{id:"idle-cleanup-count",className:"idle-cleanup-count"})]}),(0,s.jsxs)("div",{className:"idle-cleanup-controls",children:[(0,s.jsx)("span",{className:"idle-cleanup-label",children:e("sessions.idleCleanupOlderThan")}),(0,s.jsx)("div",{id:"idle-cleanup-threshold",className:"idle-cleanup-thresholds",role:"group","aria-label":e("sessions.idleCleanupThreshold"),children:b.map(o=>(0,s.jsx)("button",{type:"button","data-hours":o,"aria-pressed":o===24?"true":"false",children:o===168?"7d":`${o}H`},o))}),(0,s.jsx)("button",{type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run",children:e("sessions.idleCleanupRun")})]}),(0,s.jsx)("span",{id:"idle-cleanup-status",className:"idle-cleanup-status","aria-live":"polite"})]}),(0,s.jsxs)("div",{id:"bulk-bar",className:"bulk-bar",hidden:!0,children:[(0,s.jsx)("span",{id:"bulk-count"}),(0,s.jsx)("button",{type:"button",id:"bulk-monitor-room",children:e("sessions.addToMonitorRoom")}),(0,s.jsx)("button",{type:"button",id:"bulk-lock",children:e("sessions.lockSelected")}),(0,s.jsx)("button",{type:"button",id:"bulk-unlock",children:e("sessions.unlockSelected")}),(0,s.jsx)("button",{type:"button",id:"bulk-close",className:"contrast",children:e("sessions.closeSelected")}),(0,s.jsx)("button",{type:"button",id:"bulk-clear",children:e("sessions.clearSelection")})]}),(0,s.jsxs)("table",{id:"sessions-table",children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{children:(0,s.jsx)("input",{type:"checkbox",id:"select-all",title:e("sessions.activeOnly")})}),(0,s.jsx)(t,{sort:"botName",label:e("sessions.bot")}),(0,s.jsx)(t,{sort:"cliId",label:e("sessions.cli")}),(0,s.jsx)(t,{sort:"status",label:e("sessions.status")}),(0,s.jsx)(t,{sort:"chat",label:e("sessions.location")}),(0,s.jsx)(t,{sort:"tokenIn",label:e("sessions.tokenIn")}),(0,s.jsx)(t,{sort:"tokenOut",label:e("sessions.tokenOut")}),(0,s.jsx)(t,{sort:"title",label:e("sessions.titleCol")}),(0,s.jsx)(t,{sort:"workingDir",label:e("sessions.workingDir")}),(0,s.jsx)(t,{sort:"spawnedAt",label:e("sessions.created")}),(0,s.jsx)(t,{sort:"lastMessageAt",label:e("sessions.last")}),(0,s.jsx)(t,{sort:"adopt",label:e("sessions.adopt")}),(0,s.jsx)("th",{children:e("sessions.actions")})]})}),(0,s.jsx)("tbody",{})]}),(0,s.jsx)("div",{id:"sessions-board",className:"sessions-board",hidden:!0}),(0,s.jsx)("div",{id:"sessions-kanban",className:"sessions-kanban",hidden:!0}),(0,s.jsx)("dialog",{id:"drawer"}),(0,s.jsx)("dialog",{id:"term-modal",className:"term-modal"}),(0,s.jsx)("dialog",{id:"history-modal",className:"history-modal"})]})}function S(e){return d(e,(0,s.jsx)(v,{}))}export{S as renderSessionsPage};
@@ -1,2 +0,0 @@
1
- import{b as S}from"./chunk-PE6W3C2C.js";import{a as J}from"./chunk-LXIK7OUJ.js";import"./chunk-3UJYRR2Q.js";import{a as he,b as G,c as Y}from"./chunk-JTSE5VP6.js";import{c as V}from"./chunk-7SZRL6FY.js";var o=V(he(),1);var e=V(Y(),1),pe=["Asia/Shanghai","Asia/Hong_Kong","Asia/Tokyo","Asia/Singapore","Asia/Kolkata","UTC","Europe/London","Europe/Paris","Europe/Moscow","America/Los_Angeles","America/New_York","America/Sao_Paulo","Australia/Sydney"];function X(t){return{publicReadOnly:t?.publicReadOnly===!0,openTerminalInFeishu:t?.openTerminalInFeishu===!0,chatBotDiscovery:t?.chatBotDiscovery!==!1,vcMeetingAgent:{enabled:t?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof t?.vcMeetingAgent?.listenerBotAppId=="string"?t.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(t?.vcMeetingAgent?.listenerBotOptions)?t.vcMeetingAgent.listenerBotOptions:[],larkCliVersion:t?.vcMeetingAgent?.larkCliVersion===void 0?void 0:t.vcMeetingAgent.larkCliVersion??null,larkCliMeetsRequirement:t?.vcMeetingAgent?.larkCliMeetsRequirement===!0,larkCliMinVersion:typeof t?.vcMeetingAgent?.larkCliMinVersion=="string"?t.vcMeetingAgent.larkCliMinVersion:void 0},repoPickerMode:t?.repoPickerMode==="repos"?"repos":"all",maintenance:t?.maintenance&&typeof t.maintenance=="object"?t.maintenance:{},localDevInstall:t?.localDevInstall===!0,whiteboard:{enabled:t?.whiteboard?.enabled===!0},remoteAccess:t?.remoteAccess===!0,scheduleTimeZone:typeof t?.scheduleTimeZone=="string"?t.scheduleTimeZone:"",hostTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof t?.effectiveScheduleTimeZone=="string"&&t.effectiveScheduleTimeZone?t.effectiveScheduleTimeZone:typeof t?.scheduleTimeZone=="string"&&t.scheduleTimeZone?t.scheduleTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC"}}function me(t,n){let a=t?.[n]??{};return{enabled:a.enabled===!0,time:typeof a.time=="string"?a.time:"04:00"}}function ee(t,n){return n(t==="npm-global"?"update.kindNpm":t==="source-checkout"?"update.kindSource":"update.kindUnknown")}function ve(){let t=S(),n=(0,o.useRef)(!1),a=(0,o.useRef)(new Set),[r,p]=(0,o.useState)(null),[c,g]=(0,o.useState)(!1),[R,v]=(0,o.useState)(null),[b,U]=(0,o.useState)(!0),[x,T]=(0,o.useState)(!1),[i,l]=(0,o.useState)(null),[u,C]=(0,o.useState)(null),[B,O]=(0,o.useState)(null),[F,L]=(0,o.useState)(null),[te,I]=(0,o.useState)(null),[$,N]=(0,o.useState)(null),[q,Z]=(0,o.useState)(!1),[ne,P]=(0,o.useState)(!0),[ae,W]=(0,o.useState)(!1),[ie,se]=(0,o.useState)(""),[oe,k]=(0,o.useState)(!1),[le,f]=(0,o.useState)(null),j=(0,o.useCallback)(()=>{for(let s of a.current)window.clearTimeout(s);a.current.clear()},[]),E=(0,o.useCallback)((s,d)=>{let h=window.setTimeout(()=>{a.current.delete(h),s()},d);return a.current.add(h),h},[]),D=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/update/status"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){L(null),I(d?.error??`HTTP ${s.status}`);return}L(d),I(null)}catch(s){if(!n.current)return;L(null),I(s instanceof Error?s.message:String(s))}},[]),Q=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/settings"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){p(null),v(d?.error??`HTTP ${s.status}`),g(!0);return}p(X(d.settings)),U(d.authed===!0),T(d.bound===!0),v(null),g(!0)}catch(s){if(!n.current)return;p(null),v(s instanceof Error?s.message:String(s)),g(!0)}},[]);(0,o.useEffect)(()=>(n.current=!0,Q(),()=>{n.current=!1,j()}),[j,Q]),(0,o.useEffect)(()=>{c&&(k(!1),f(null),Z(!1),b&&D())},[b,D,c]);async function re(s,d,h){if(!r)return;let m=r;p(h(r)),l(s),C({text:t("settings.saving")});try{let y=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(d)}),A=await y.json().catch(()=>({}));if(!n.current)return;if(!y.ok||A.ok===!1)throw A?.feishuLoginQr&&typeof A.feishuLoginQr=="string"&&O(A.feishuLoginQr),new Error(A?.error??`HTTP ${y.status}`);O(null);let K=X(A.settings);p(K),J.setScheduleTimeZone(K.effectiveScheduleTimeZone),C({text:t("settings.saved"),cls:"hint-ok"}),E(()=>C(z=>z?.cls==="hint-ok"?null:z),2400)}catch(y){if(!n.current)return;p(m),C({text:`${t("settings.saveFailed")}: ${y instanceof Error?y.message:String(y)}`,cls:"hint-warn-inline"})}finally{n.current&&l(null)}}async function ce(){N(null),P(!0),W(!1);try{let s=await fetch("/api/update/changelog"),d=await s.json().catch(()=>({}));if(!n.current)return;se(typeof d?.releasesUrl=="string"?d.releasesUrl:""),s.ok?(N(Array.isArray(d.releases)?d.releases:[]),P(d.ok!==!1),W(d.rateLimited===!0)):(N([]),P(!1))}catch{if(!n.current)return;N([]),P(!1)}}function de(){let s=Date.now(),d=async()=>{if(n.current){if(Date.now()-s>9e4){k(!1),f({text:t("update.restartSlow"),cls:"hint-warn-inline"});return}try{let h=await fetch("/__health",{cache:"no-store"});if(!n.current)return;if(h.ok){location.reload();return}}catch{}n.current&&E(()=>{d()},2e3)}};E(()=>{d()},3e3)}async function _(s){k(!0),f({text:t("update.restarting")});try{if(await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s?{update:s}:{})}),!n.current)return}catch(d){if(!n.current)return;k(!1),f({text:t("update.restartFailed",{detail:d instanceof Error?d.message:String(d)}),cls:"hint-warn-inline"});return}de()}async function ue(){let s=F;if(!s)return;if(!s.node.ok){window.alert(t("update.nodeTooOldAlert",{version:s.node.version,required:s.node.required}));return}if(s.installs.multiple){let h=s.installs.entries.map(m=>`\u2022 ${m.binPath} (${ee(m.kind,t)})`).join(`
2
- `);if(!window.confirm(t("update.confirmMultiInstall",{paths:h})))return}let d=s.latest?t("update.confirmUpdate",{version:`v${s.latest}`}):t("update.confirmUpdateNoVer");if(window.confirm(d)){k(!0),f({text:t("update.updating")});try{let h=await fetch("/api/update/run",{method:"POST"}),m=await h.json().catch(()=>({}));if(!n.current)return;if(!h.ok||m.ok===!1){let y=m?.detail??m?.error??`HTTP ${h.status}`;k(!1),f({text:t("update.updateFailed",{detail:y}),cls:"hint-warn-inline"});return}m.changed?(k(!1),f({text:t("update.updatedChanged",{old:`v${m.oldVersion}`,new:`v${m.newVersion}`}),cls:"hint-ok"}),window.confirm(t("update.confirmRestart"))?await _({oldVersion:m.oldVersion,newVersion:m.newVersion}):n.current&&f({text:t("update.noRestartHint"),cls:"hint-ok"})):(k(!1),f({text:t("update.alreadyLatestRun",{version:`v${m.newVersion}`}),cls:"hint-ok"}),await D())}catch(h){if(!n.current)return;k(!1),f({text:t("update.updateFailed",{detail:h instanceof Error?h.message:String(h)}),cls:"hint-warn-inline"})}}}let ge=r?(0,e.jsx)(be,{settings:r,canWrite:b,bound:x,savingKey:i,feishuLoginQr:B,setFeishuLoginQr:O,onSave:re}):R?(0,e.jsxs)("p",{className:"hint-warn st-banner",children:[t("settings.loadFailed"),": ",R]}):(0,e.jsx)("p",{className:"empty st-banner",children:t("settings.loading")});return(0,e.jsxs)("section",{className:"page",children:[(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.settings")}),(0,e.jsx)("h1",{children:t("settings.title")}),(0,e.jsx)("p",{children:t("settings.subtitle")})]})}),(0,e.jsxs)("div",{className:"settings-grid",children:[ge,(0,e.jsx)(ye,{canWrite:b,status:F,statusError:te,changelog:$,changelogOpen:q,changelogOk:ne,changelogRateLimited:ae,releasesUrl:ie,busy:oe,message:le,onCheck:()=>{L(null),N(null),Z(!1),f(null),I(null),D()},onToggleChangelog:()=>{let s=!q;Z(s),s&&$===null&&ce()},onUpdate:()=>{ue()},onRestart:()=>{window.confirm(t("update.confirmPlainRestart"))&&_(null)}})]}),u?(0,e.jsx)("div",{className:`st-status ${u.cls??""}`,"data-settings-status":!0,role:"status",children:u.text}):null]})}function fe(t){return(0,e.jsx)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:{access:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M8 1.7l5 1.9v4.1c0 3.2-2.1 5.6-5 6.6-2.9-1-5-3.4-5-6.6V3.6z"}),(0,e.jsx)("path",{d:"M5.9 8l1.5 1.5 2.7-2.8"})]}),cards:(0,e.jsx)("path",{d:"M2.2 3.2h11.6v7.4H8.3L5.1 13.2v-2.6H2.2z"}),experimental:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M6.1 1.8h3.8M7 1.8v4L3.1 12.4a1.35 1.35 0 001.2 2h7.4a1.35 1.35 0 001.2-2L9 5.8v-4"}),(0,e.jsx)("path",{d:"M4.7 10.6h6.6"})]}),meeting:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:"1.6",y:"4.1",width:"8.9",height:"7.8",rx:"1.4"}),(0,e.jsx)("path",{d:"M10.5 7.4l3.9-2.3v5.8l-3.9-2.3"})]}),whiteboard:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:"1.9",y:"2.4",width:"12.2",height:"8.4",rx:"1.2"}),(0,e.jsx)("path",{d:"M4.7 8.2c1-.9 1.8-2.5 2.5-1.8.7.7-.5 2 .3 2.3.7.3 1.8-1.6 3.8-1.9"}),(0,e.jsx)("path",{d:"M5.3 13.9h5.4M8 10.8v3.1"})]}),repo:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("circle",{cx:"4.3",cy:"3.6",r:"1.7"}),(0,e.jsx)("circle",{cx:"4.3",cy:"12.4",r:"1.7"}),(0,e.jsx)("circle",{cx:"11.9",cy:"5.3",r:"1.7"}),(0,e.jsx)("path",{d:"M4.3 5.3v5.4M11.9 7c0 2.7-3.6 2.9-5.7 3.6"})]}),maintenance:(0,e.jsx)(e.Fragment,{children:(0,e.jsx)("path",{d:"M13.9 4.7a3.7 3.7 0 01-4.9 4.5l-4.4 4.4a1.6 1.6 0 01-2.2-2.2L6.8 7a3.7 3.7 0 014.5-4.9L8.9 4.5l2.6 2.6z"})}),update:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M13.5 6.2A5.8 5.8 0 103 10.9"}),(0,e.jsx)("path",{d:"M13.7 2.5v3.9H9.8"}),(0,e.jsx)("path",{d:"M8 5.6v4.6M6 8.3l2 1.9 2-1.9"})]})}[t.name]})}function M(t){return(0,e.jsxs)("article",{className:"bd-card st-card","data-saving":t.saving?"":void 0,children:[(0,e.jsxs)("header",{className:"st-card-head",children:[(0,e.jsx)("span",{className:"st-chip","aria-hidden":"true",children:(0,e.jsx)(fe,{name:t.icon})}),(0,e.jsx)("h3",{children:t.title})]}),t.children]})}function H(t){let[n,a]=(0,o.useState)(!1);return(0,e.jsx)("small",{className:n?"open":void 0,onClick:r=>{r.preventDefault(),r.stopPropagation(),a(p=>!p)},children:t.text})}function be(t){let n=S(),{settings:a,canWrite:r,bound:p,savingKey:c,feishuLoginQr:g,setFeishuLoginQr:R}=t,v=!r,b=me(a.maintenance,"autoUpdate"),U=!r||a.localDevInstall,x=!r||a.maintenance.autoUpdate?.enabled!==!0,T=(i,l)=>{t.onSave(i,{[i]:l},u=>({...u,[i]:l}))};return(0,e.jsxs)(e.Fragment,{children:[r?null:(0,e.jsx)("p",{className:"hint-warn st-banner",children:n("settings.readOnlyVisitor")}),(0,e.jsxs)(M,{icon:"access",title:n("settings.sectionAccess"),saving:c==="publicReadOnly"||c==="remoteAccess",children:[(0,e.jsx)(w,{title:n("settings.publicReadOnly"),help:n("settings.publicReadOnlyHelp"),checked:a.publicReadOnly,disabled:v||c==="publicReadOnly",onChange:i=>T("publicReadOnly",i)}),p?(0,e.jsx)(w,{title:n("settings.remoteAccess"),help:n("settings.remoteAccessHelp"),checked:a.remoteAccess,disabled:v||c==="remoteAccess",onChange:i=>T("remoteAccess",i)}):null]}),(0,e.jsxs)(M,{icon:"meeting",title:n("settings.sectionVcMeetingAgent"),saving:c==="vcMeetingAgent",children:[(0,e.jsx)(w,{title:n("settings.vcMeetingAgent"),help:n("settings.vcMeetingAgentHelp"),checked:a.vcMeetingAgent.enabled,disabled:v||c==="vcMeetingAgent",onChange:i=>{t.onSave("vcMeetingAgent",{vcMeetingAgent:{enabled:i}},l=>({...l,vcMeetingAgent:{...l.vcMeetingAgent,enabled:i}}))}}),(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.vcMeetingListenerBot")}),(0,e.jsxs)("select",{value:a.vcMeetingAgent.listenerBotAppId??"",disabled:v||c==="vcMeetingAgent",onChange:i=>{let l=i.currentTarget.value||null;t.onSave("vcMeetingAgent",{vcMeetingAgent:{listenerBotAppId:l}},u=>({...u,vcMeetingAgent:{...u.vcMeetingAgent,listenerBotAppId:l}}))},children:[(0,e.jsx)("option",{value:"",children:n("settings.vcMeetingListenerBotAuto")}),a.vcMeetingAgent.listenerBotOptions.map(i=>{let l=i.botName||i.larkAppId,u=i.cliId?` \xB7 ${i.cliId}`:"",C=[i.vcMeetingAgentEnabled===!0?void 0:n("settings.vcMeetingListenerBotDisabled"),i.hasLarkCliProfile===!0?void 0:n("settings.vcMeetingListenerBotNoProfile")].filter(Boolean),B=C.length>0?` \xB7 ${C.join(" \xB7 ")}`:"";return(0,e.jsxs)("option",{value:i.larkAppId,children:[l,u,B]},i.larkAppId)})]}),(0,e.jsx)(H,{text:n("settings.vcMeetingListenerBotHelp")})]}),typeof a.vcMeetingAgent.larkCliVersion=="string"?a.vcMeetingAgent.larkCliMeetsRequirement?(0,e.jsxs)("p",{className:"st-larkcli-ok",children:["lark-cli ",a.vcMeetingAgent.larkCliVersion," \u2713"]}):(0,e.jsxs)("p",{className:"st-larkcli-warn",children:["\u26A0\uFE0F lark-cli ",a.vcMeetingAgent.larkCliVersion," \u7248\u672C\u8FC7\u4F4E\uFF0CVC bot \u5165\u4F1A\u9700\u8981 \u2265 ",a.vcMeetingAgent.larkCliMinVersion,"\u3002\u8BF7\u8FD0\u884C ",(0,e.jsx)("code",{children:"npm i -g @larksuite/cli@latest"})," \u5347\u7EA7\u3002"]}):(0,e.jsxs)("p",{className:"st-larkcli-warn",children:["\u26A0\uFE0F \u672A\u68C0\u6D4B\u5230 lark-cli\uFF0C\u8BF7\u5148\u5B89\u88C5\uFF1A",(0,e.jsx)("code",{children:"npm i -g @larksuite/cli"})]}),g?(0,e.jsxs)("div",{className:"st-feishu-qr",children:[(0,e.jsx)("p",{className:"st-feishu-qr-hint",children:"\u9700\u8981\u98DE\u4E66\u5F00\u653E\u5E73\u53F0\u767B\u5F55\u624D\u80FD\u81EA\u52A8\u914D\u7F6E VC \u6743\u9650\uFF0C\u8BF7\u626B\u7801\uFF1A"}),(0,e.jsx)("img",{src:g,alt:"\u98DE\u4E66\u626B\u7801\u767B\u5F55",className:"st-feishu-qr-img"}),(0,e.jsx)("button",{type:"button",className:"st-btn st-btn-ghost",onClick:()=>R(null),children:"\u5173\u95ED"})]}):null]}),(0,e.jsx)(M,{icon:"cards",title:n("settings.sectionCards"),saving:c==="openTerminalInFeishu",children:(0,e.jsx)(w,{title:n("settings.openTerminalInFeishu"),help:n("settings.openTerminalInFeishuHelp"),checked:a.openTerminalInFeishu,disabled:v||c==="openTerminalInFeishu",onChange:i=>T("openTerminalInFeishu",i)})}),(0,e.jsx)(M,{icon:"experimental",title:n("settings.sectionExperimental"),saving:c==="chatBotDiscovery",children:(0,e.jsx)(w,{title:n("settings.chatBotDiscovery"),help:n("settings.chatBotDiscoveryHelp"),checked:a.chatBotDiscovery,disabled:v||c==="chatBotDiscovery",onChange:i=>T("chatBotDiscovery",i)})}),(0,e.jsx)(M,{icon:"whiteboard",title:n("settings.sectionWhiteboard"),saving:c==="whiteboard",children:(0,e.jsx)(w,{title:n("settings.whiteboardEnable"),help:n("settings.whiteboardEnableHelp"),checked:a.whiteboard.enabled,disabled:v||c==="whiteboard",onChange:i=>{t.onSave("whiteboard",{whiteboard:{enabled:i}},l=>({...l,whiteboard:{enabled:i}}))}})}),(0,e.jsx)(M,{icon:"repo",title:n("settings.sectionRepoPicker"),saving:c==="repoPickerMode",children:(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.repoPickerMode")}),(0,e.jsxs)("select",{value:a.repoPickerMode,disabled:v||c==="repoPickerMode",onChange:i=>{let l=i.currentTarget.value==="repos"?"repos":"all";t.onSave("repoPickerMode",{repoPickerMode:l},u=>({...u,repoPickerMode:l}))},children:[(0,e.jsx)("option",{value:"all",children:n("settings.repoPickerModeAll")}),(0,e.jsx)("option",{value:"repos",children:n("settings.repoPickerModeRepos")})]}),(0,e.jsx)(H,{text:n("settings.repoPickerModeHelp")})]})}),(0,e.jsx)(M,{icon:"maintenance",title:n("settings.sectionSchedule"),saving:c==="scheduleTimeZone",children:(0,e.jsx)(ke,{value:a.scheduleTimeZone,host:a.hostTimeZone,effective:a.effectiveScheduleTimeZone,disabled:v||c==="scheduleTimeZone",onSave:i=>{t.onSave("scheduleTimeZone",{scheduleTimeZone:i},l=>({...l,scheduleTimeZone:i??""}))}})}),(0,e.jsxs)(M,{icon:"maintenance",title:n("settings.sectionMaintenance"),saving:c==="autoUpdate"||c==="autoRestart",children:[(0,e.jsx)(w,{title:n("settings.autoUpdate"),help:n("settings.autoUpdateHelp"),checked:b.enabled,disabled:U||c==="autoUpdate",onChange:i=>{let l={enabled:i,time:b.time};t.onSave("autoUpdate",{maintenance:{autoUpdate:l}},u=>({...u,maintenance:{...u.maintenance,autoUpdate:l}}))}}),(0,e.jsx)("div",{className:"st-subrow",children:(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.maintenanceTime")}),(0,e.jsx)("input",{type:"time",value:b.time,disabled:U||c==="autoUpdate",onChange:i=>{let l={enabled:b.enabled,time:i.currentTarget.value||"04:00"};t.onSave("autoUpdate",{maintenance:{autoUpdate:l}},u=>({...u,maintenance:{...u.maintenance,autoUpdate:l}}))}})]})}),a.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("settings.autoUpdateLocalDev")}):null,(0,e.jsx)(w,{title:n("settings.autoRestart"),help:n("settings.autoRestartHelp"),checked:a.maintenance.autoRestart?.enabled===!0,disabled:x||c==="autoRestart",onChange:i=>{let l={enabled:i};t.onSave("autoRestart",{maintenance:{autoRestart:l}},u=>({...u,maintenance:{...u.maintenance,autoRestart:l}}))}})]})]})}function ke(t){let n=S(),[a,r]=(0,o.useState)(t.value);(0,o.useEffect)(()=>{r(t.value)},[t.value]);let p=()=>{let g=a.trim();g!==t.value.trim()&&t.onSave(g===""?null:g)},c=t.effective||t.value.trim()||t.host;return(0,e.jsxs)("label",{className:"form-row",children:[(0,e.jsx)("span",{children:n("settings.scheduleTimeZone")}),(0,e.jsx)("input",{type:"text",list:"tz-common",value:a,placeholder:t.host,disabled:t.disabled,onChange:g=>r(g.currentTarget.value),onBlur:p,onKeyDown:g=>{g.key==="Enter"&&(g.preventDefault(),g.currentTarget.blur())}}),(0,e.jsx)("datalist",{id:"tz-common",children:pe.map(g=>(0,e.jsx)("option",{value:g},g))}),(0,e.jsx)("small",{children:n("settings.scheduleTimeZoneHelp",{host:t.host,effective:c})})]})}function w(t){return(0,e.jsxs)("label",{className:"toggle-row",children:[(0,e.jsx)("input",{type:"checkbox",checked:t.checked,disabled:t.disabled,onChange:n=>t.onChange(n.currentTarget.checked)}),(0,e.jsx)("span",{className:"switch","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"toggle-tx",children:[(0,e.jsx)("strong",{children:t.title}),(0,e.jsx)(H,{text:t.help})]})]})}function ye(t){let n=S(),a;if(!t.canWrite)a=(0,e.jsx)("p",{className:"hint-warn",children:n("update.loginRequired")});else if(t.statusError)a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"hint-warn",children:[n("update.checkFailed"),": ",t.statusError]}),(0,e.jsx)("div",{className:"update-actions",children:(0,e.jsx)("button",{type:"button","data-up":"check",onClick:t.onCheck,children:n("update.btnCheck")})})]});else if(!t.status)a=(0,e.jsx)("p",{className:"empty",children:n("update.loading")});else{let r=t.status,p=r.localDevInstall||t.busy;a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"update-version",children:[(0,e.jsx)("span",{className:"st-update-label",children:n("update.current")}),(0,e.jsxs)("strong",{className:"st-update-ver",children:["v",r.current]}),(0,e.jsx)(Me,{status:r})]}),r.node.ok?null:(0,e.jsx)("p",{className:"hint-warn",children:n("update.nodeWarn",{version:r.node.version,required:r.node.required})}),r.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("update.localDev")}):null,r.installs.multiple?(0,e.jsx)(Se,{entries:r.installs.entries}):null,(0,e.jsxs)("div",{className:"update-actions",children:[(0,e.jsx)("button",{type:"button","data-up":"check",disabled:t.busy,onClick:t.onCheck,children:n("update.btnCheck")}),(0,e.jsx)("button",{type:"button","data-up":"changelog",disabled:t.busy,onClick:t.onToggleChangelog,children:t.changelogOpen?n("update.btnChangelogHide"):n("update.btnChangelog")}),(0,e.jsx)("button",{type:"button",className:"primary","data-up":"update",disabled:p,onClick:t.onUpdate,children:n("update.btnUpdate")}),(0,e.jsx)("button",{type:"button","data-up":"restart",disabled:t.busy,onClick:t.onRestart,children:n("update.btnRestart")})]}),t.changelogOpen?(0,e.jsx)(we,{changelog:t.changelog,ok:t.changelogOk,rateLimited:t.changelogRateLimited,releasesUrl:t.releasesUrl}):null,t.message?(0,e.jsx)("p",{className:`oncall-status ${t.message.cls??""}`,children:t.message.text}):null]})}return(0,e.jsx)(M,{icon:"update",title:n("update.section"),children:a})}function Me(t){let n=S(),a=t.status;return a.latest?a.behind?(0,e.jsx)("span",{className:"update-badge update-badge-new",children:n("update.newAvailable",{version:`v${a.latest}`})}):(0,e.jsx)("span",{className:"update-badge update-badge-ok",children:n("update.upToDate")}):(0,e.jsx)("span",{className:"hint-warn-inline",children:n("update.checkUnavailable")})}function Se(t){let n=S();return(0,e.jsxs)("div",{className:"hint-warn",children:[(0,e.jsx)("p",{children:n("update.multiInstallWarn")}),(0,e.jsx)("ul",{className:"update-install-list",children:t.entries.map(a=>(0,e.jsxs)("li",{children:[(0,e.jsx)("code",{children:a.binPath})," \u2192 ",ee(a.kind,n)," ",(0,e.jsx)("small",{children:a.root})]},`${a.binPath}:${a.root}`))})]})}function we(t){let n=S();if(t.changelog===null)return(0,e.jsx)("p",{className:"empty",children:n("update.changelogLoading")});if(!t.ok){let a=t.rateLimited?n("update.changelogRateLimited"):n("update.changelogFailed");return(0,e.jsxs)("p",{className:"hint-warn-inline",children:[a,t.releasesUrl?(0,e.jsxs)(e.Fragment,{children:[" ",(0,e.jsx)("a",{href:t.releasesUrl,target:"_blank",rel:"noopener",children:n("update.changelogViewOnGitHub")})]}):null]})}return t.changelog.length===0?(0,e.jsx)("p",{className:"empty",children:n("update.changelogEmpty")}):(0,e.jsx)("div",{className:"update-changelog",children:t.changelog.map(a=>{let r=a.name&&a.name!==`v${a.version}`?a.name:"",p=a.publishedAt?new Date(a.publishedAt).toLocaleDateString():"";return(0,e.jsxs)("details",{className:"update-release",open:!0,children:[(0,e.jsxs)("summary",{children:[(0,e.jsxs)("strong",{children:["v",a.version]})," ",r," ",(0,e.jsx)("small",{children:p})," ",(0,e.jsx)("a",{href:a.url,target:"_blank",rel:"noopener",children:"\u2197"})]}),(0,e.jsx)("pre",{className:"update-release-body",children:a.body||""})]},a.version)})})}function Re(t){return G(t,(0,e.jsx)(ve,{}))}export{ke as TimeZoneRow,Re as renderSettingsPage};
@@ -1,2 +0,0 @@
1
- import{b as G}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import{r as Z,y as Nl}from"./chunk-3UJYRR2Q.js";import{a as as,b as wl,c as Cl}from"./chunk-JTSE5VP6.js";import{c as Y}from"./chunk-7SZRL6FY.js";var a=Y(as(),1);var l=Y(Cl(),1),ns=2;function ll(e){let t=e.as??"span";return(0,l.jsx)(t,{style:{display:"contents"},dangerouslySetInnerHTML:{__html:e.html}})}function os(e,t){let n=String(e??"").replace(/\\/g,"/");return n.includes("/.codex/skills/")?t("skills.sourceCodex"):n.includes("/.claude/skills/")?t("skills.sourceClaude"):n.includes("/.trae/skills/")?t("skills.sourceTrae"):n.includes("/.cursor/skills/")?t("skills.sourceCursor"):n.includes("/.gemini/skills/")?t("skills.sourceGemini"):n.includes("/.config/opencode/skills/")?t("skills.sourceOpenCode"):null}function rs(e,t){let n=e.source??{};return n.type==="github"?`github:${n.owner}/${n.repo}/${n.path??""}`:n.type==="git"?`${n.url??"git"}#${n.path??""}`:n.type==="local-link"?os(n.path,t)??t("skills.sourceLocalLink"):n.type==="local-copy"?t("skills.sourceBotmuxCopy"):String(n.type??"unknown")}function q(e){return(e?.include??[]).filter(t=>t.startsWith("skill:")).map(t=>t.slice(6))}function cs(e){return q(e).length}function ds(e){return q(e).length>0}function U(e){return`${e.cliId}
2
- ${e.rootDir}`}function us(e){return e>=1600?4:e<=620?1:e<=980?2:3}async function h(e,t){let n=await fetch(e,{...t,headers:{"content-type":"application/json",...t.headers??{}}}),k=await n.json().catch(()=>({}));if(!n.ok||k.ok===!1){let f=new Error(k?.error??`HTTP ${n.status}`);throw f.status=n.status,f.body=k,f}return k}function Il(e){return`oncall-status${e?` ${e.ok?"hint-ok":"hint-warn-inline"}`:""}`}function ks(e){let t=G(),n=(0,a.useRef)(null),k=e.installCandidates??[],f=e.selectedInstallSkills??new Set,m=k.length>0&&k.every(r=>f.has(r.name)),C=e.installBusy||e.installDiscovering;return(0,a.useEffect)(()=>{let r=n.current;if(r)if(e.installSelectionOpen&&!r.open)try{r.showModal()}catch{}else!e.installSelectionOpen&&r.open&&r.close()},[e.installSelectionOpen,k.length]),(0,l.jsxs)("article",{className:"bd-card skills-install-panel",children:[(0,l.jsxs)("div",{className:"skills-install-title",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:t("skills.install")}),(0,l.jsxs)("span",{className:"skills-help-tip",children:[(0,l.jsx)("button",{type:"button",className:"help-icon-button skills-help-button","aria-label":t("skills.installInfoLabel"),children:"?"}),(0,l.jsx)("span",{className:"skills-help-popover",role:"tooltip",children:t("skills.installInfo")})]})]}),(0,l.jsxs)("div",{className:"skills-install-grid",children:[(0,l.jsxs)("label",{className:"skills-source-label",children:[(0,l.jsx)("span",{children:t("skills.source")}),(0,l.jsx)("div",{className:"skills-source-control",children:(0,l.jsx)("input",{type:"text","data-install":"source","aria-label":t("skills.source"),placeholder:t("skills.sourcePlaceholder"),value:e.installSource,onChange:r=>e.onInstallSourceChange(r.currentTarget.value)})})]}),(0,l.jsxs)("div",{className:"bd-section-note skills-install-note",children:[(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:t("skills.sourceHelpRemoteLabel")}),t("skills.sourceHelpRemote")]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:t("skills.sourceHelpLocalLabel")}),t("skills.sourceHelpLocal")]})]}),(0,l.jsxs)("div",{className:"skills-install-action-row",children:[(0,l.jsxs)("details",{className:"skills-advanced-options","data-skills-advanced":!0,open:!1,children:[(0,l.jsxs)("summary",{children:[(0,l.jsx)("span",{className:"skills-advanced-marker","aria-hidden":"true"}),(0,l.jsx)("span",{children:t("skills.advanced")})]}),(0,l.jsxs)("div",{className:"skills-advanced-fields",children:[(0,l.jsxs)("label",{className:"skills-install-field-wide",children:[(0,l.jsx)("span",{children:t("skills.path")}),(0,l.jsx)("input",{type:"text","data-install":"path",placeholder:t("skills.pathPlaceholder"),value:e.installPath,onChange:r=>e.onInstallPathChange(r.currentTarget.value)})]}),(0,l.jsxs)("label",{className:"skills-install-field-wide",children:[(0,l.jsx)("span",{children:t("skills.ref")}),(0,l.jsx)("input",{type:"text","data-install":"ref",placeholder:t("skills.refPlaceholder"),value:e.installRef,onChange:r=>e.onInstallRefChange(r.currentTarget.value)})]})]})]}),(0,l.jsx)("div",{className:"skills-install-actions",children:(0,l.jsx)("button",{type:"button",className:"primary","data-action":"install",disabled:C,onClick:()=>e.onInstall(),children:e.installDiscovering?t("skills.scanning"):e.installBusy?t("skills.jobRunning"):t("skills.installSubmit")})})]}),(0,l.jsxs)("div",{className:"skills-local-discovery-panel",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:t("skills.localDiscoverTitle")}),(0,l.jsx)("span",{children:t("skills.localDiscoverHelp")})]}),(0,l.jsx)("button",{type:"button","data-action":"open-native-skill-discovery",onClick:()=>e.onOpenNativeDiscovery(),children:t("skills.localDiscover")})]})]}),(0,l.jsx)("div",{className:"actions",children:(0,l.jsx)("span",{className:Il(e.installStatus),"data-skills-status":!0,children:e.installStatus?.text??""})}),(0,l.jsx)("dialog",{className:"skills-discovery-dialog skills-install-selection-dialog","data-install-selection-dialog":!0,ref:n,onClose:()=>e.onCloseInstallSelection?.(),children:(0,l.jsxs)("article",{children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h3",{children:t("skills.installSelectionTitle")}),(0,l.jsx)("p",{children:t("skills.installSelectionHelp",{count:k.length})})]}),(0,l.jsx)("div",{className:"skills-discovery-body skills-install-selection-body",children:(0,l.jsxs)("div",{className:"skills-candidate-list","data-install-candidates":!0,children:[(0,l.jsxs)("div",{className:"skills-candidate-list-head",children:[(0,l.jsx)("span",{children:t("skills.scanFound",{count:k.length})}),e.onSelectAllInstallSkills?(0,l.jsx)("button",{type:"button","data-action":"toggle-all-source-skills",disabled:e.installBusy,onClick:()=>e.onSelectAllInstallSkills?.(!m),children:t(m?"skills.discoverClearSelection":"skills.discoverSelectAll")}):null]}),k.map(r=>(0,l.jsxs)("label",{className:"skills-candidate-row",children:[(0,l.jsx)("input",{type:"checkbox",checked:f.has(r.name),disabled:e.installBusy,onChange:()=>e.onToggleInstallSkill?.(r.name)}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:r.name}),(0,l.jsxs)("small",{children:[r.path,r.description?` \xB7 ${r.description}`:""]})]})]},`${r.name}:${r.path}`))]})}),(0,l.jsxs)("footer",{className:"actions",children:[(0,l.jsx)("button",{type:"button","data-action":"close-install-selection",disabled:e.installBusy,onClick:()=>e.onCloseInstallSelection?.(),children:t("skills.installSelectionCancel")}),(0,l.jsx)("button",{type:"button",className:"primary","data-action":"confirm-install-selection",disabled:e.installBusy||f.size===0,onClick:()=>e.onConfirmInstallSelection?.(),children:e.installBusy?t("skills.jobRunning"):t("skills.installSelected")})]})]})})]})}function ps(){let e=G(),t=(0,a.useRef)(!0),n=(0,a.useRef)(new Set),k=(0,a.useRef)(null),f=(0,a.useRef)(null),[m,C]=(0,a.useState)([]),[r,I]=(0,a.useState)([]),[v,D]=(0,a.useState)([]),[b,g]=(0,a.useState)("off"),[P,u]=(0,a.useState)("auto"),[R,sl]=(0,a.useState)(null),[el,tl]=(0,a.useState)(!0),[Pl,Rl]=(0,a.useState)(()=>window.innerWidth),[J,$l]=(0,a.useState)(""),[il,Bl]=(0,a.useState)(""),[al,Tl]=(0,a.useState)(""),[Dl,y]=(0,a.useState)(null),[Al,nl]=(0,a.useState)(!1),[jl,ol]=(0,a.useState)(!1),[xl,A]=(0,a.useState)(!1),[rl,cl]=(0,a.useState)([]),[_,j]=(0,a.useState)(()=>new Set),[K,x]=(0,a.useState)(!1),[El,dl]=(0,a.useState)(!1),[z,Ml]=(0,a.useState)(null),[W,F]=(0,a.useState)(()=>new Set),[B,V]=(0,a.useState)(0),[ul,E]=(0,a.useState)(null),[kl,M]=(0,a.useState)(null),[Ll,pl]=(0,a.useState)(null),[Ol,ml]=(0,a.useState)({}),L=(0,a.useMemo)(()=>new Set(m.map(s=>s.name)),[m]),O=us(Pl)*ns,$=Math.max(1,Math.ceil(m.length/O)),Hl=m.slice(B*O,B*O+O),N=(0,a.useMemo)(()=>r.length===0?void 0:(z?r.find(i=>U(i)===z):void 0)??r.find(i=>i.skills.length>0)??r[0],[z,r]),Q=N?U(N):"",T=(0,a.useMemo)(()=>N?N.skills.filter(s=>!L.has(s.name)).map(s=>s.rootDir??s.source?.root??"").filter(Boolean):[],[N,L]),vl=T.length>0&&T.every(s=>W.has(s)),yl=(0,a.useCallback)(()=>{for(let s of n.current)window.clearTimeout(s);n.current.clear()},[]),Gl=(0,a.useCallback)(s=>new Promise(i=>{let o=window.setTimeout(()=>{n.current.delete(o),i()},s);n.current.add(o)}),[]),fl=(0,a.useCallback)(async()=>{let[s,i]=await Promise.all([fetch("/api/skills"),fetch("/api/bots")]),o=await s.json().catch(()=>({})),d=await i.json().catch(()=>({}));if(!s.ok){let c=o?.error??`skills HTTP ${s.status}`;throw new Error(c==="not_found_yet"||c==="not_found"?e("skills.apiUnavailable"):c)}if(!i.ok)throw new Error(d?.error??`bots HTTP ${i.status}`);return{skills:Array.isArray(o.skills)?o.skills:[],nativeSkillGroups:Array.isArray(o.nativeSkillGroups)?o.nativeSkillGroups:[],bots:Array.isArray(d.bots)?d.bots:[],trustProjectSkills:o.trustProjectSkills==="all"?"all":"off",delivery:o.delivery==="prompt"||o.delivery==="native"?o.delivery:"auto"}},[e]),w=(0,a.useCallback)(async()=>{tl(!0);try{let s=await fl();if(!t.current)return;C(s.skills),I(s.nativeSkillGroups),D(s.bots),g(s.trustProjectSkills),u(s.delivery),sl(null),F(i=>{let o=new Set,d=new Set(s.skills.map(c=>c.name));for(let c of s.nativeSkillGroups)for(let p of c.skills){let S=p.rootDir??p.source?.root??"";S&&!d.has(p.name)&&i.has(S)&&o.add(S)}return o})}catch(s){if(!t.current)return;sl(s?.message??String(s))}finally{t.current&&tl(!1)}},[fl]);(0,a.useEffect)(()=>{t.current=!0,w();let s=()=>Rl(window.innerWidth);return window.addEventListener("resize",s),()=>{t.current=!1,yl(),window.removeEventListener("resize",s)}},[yl,w]),(0,a.useEffect)(()=>{V(s=>Math.min(Math.max(0,s),$-1))},[$]),(0,a.useEffect)(()=>{let s=k.current;if(s)if(K&&!s.open)try{s.showModal()}catch{}else!K&&s.open&&s.close()},[K,Q]);async function gl(s,i,o=!0){let d=s;for(i({text:e("skills.jobRunning"),ok:!0});;){if(!t.current)return;if(d.status==="succeeded"){i({text:e("skills.saved"),ok:!0}),o&&await w();return}if(d.status==="failed")throw new Error(d.error??"job_failed");if(await Gl(800),!t.current)return;let c=await h(`/api/skills/jobs/${encodeURIComponent(d.id)}`,{method:"GET"});if(!t.current)return;d=c.job}}function Ul(s){return v.filter(i=>q(i.skills).includes(s)).map(i=>i.botName??i.larkAppId)}function H(){cl([]),j(new Set),A(!1)}function bl(){return{source:J.trim(),path:il.trim()||void 0,ref:al.trim()||void 0}}function ql(s){let i=s??[..._];return{...bl(),skillNames:i.length>0?i:void 0}}async function Jl(){ol(!0),y({text:e("skills.scanning"),ok:!0});try{let s=await h("/api/skills/discover",{method:"POST",body:JSON.stringify(bl())});if(!t.current)return[];let i=Array.isArray(s.discovery?.skills)?s.discovery.skills:[];return cl(i),j(new Set(i.map(o=>o.name))),i}finally{t.current&&ol(!1)}}async function hl(s){nl(!0);try{let i=await h("/api/skills/install",{method:"POST",body:JSON.stringify(ql(s))});if(!t.current)return;await gl(i.job,y),t.current&&H()}catch(i){t.current&&y({text:`${e("skills.failed")}: ${i?.message??i}`,ok:!1})}finally{t.current&&nl(!1)}}function _l(s){j(i=>{let o=new Set(i);return o.has(s)?o.delete(s):o.add(s),o})}function Kl(s){j(s?new Set(rl.map(i=>i.name)):new Set)}async function zl(){if(!J.trim()){y({text:e("skills.sourceRequired"),ok:!1});return}try{A(!1);let s=await Jl();if(!t.current)return;if(s.length===0){y({text:e("skills.scanEmpty"),ok:!1});return}if(s.length===1){await hl([s[0].name]);return}y({text:e("skills.scanFound",{count:s.length}),ok:!0}),A(!0)}catch(s){t.current&&y({text:`${e("skills.failed")}: ${s?.message??s}`,ok:!1})}}async function Wl(){let s=[..._];if(s.length===0){y({text:e("skills.discoverNothingSelected"),ok:!1});return}await hl(s)}async function Fl(){let s=[...W].filter(Boolean);if(s.length===0){y({text:e("skills.discoverNothingSelected"),ok:!1});return}dl(!0);try{if(y({text:e("skills.discoverRegisteringBatch",{total:s.length}),ok:!0}),await h("/api/skills/install-local-links",{method:"POST",body:JSON.stringify({sources:s})}),!t.current)return;x(!1),await w(),t.current&&y({text:e("skills.saved"),ok:!0})}catch(i){t.current&&y({text:`${e("skills.failed")}: ${i?.message??i}`,ok:!1})}finally{t.current&&dl(!1)}}async function Vl(s){if(b!==s){E("project");try{let i=await h("/api/skills/global",{method:"PUT",body:JSON.stringify({trustProjectSkills:s})});if(!t.current)return;g(i.trustProjectSkills==="all"?"all":s)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&E(null)}}}async function Ql(s){if(P!==s){E("delivery");try{let i=await h("/api/skills/global",{method:"PUT",body:JSON.stringify({delivery:s})});if(!t.current)return;u(i.delivery==="prompt"||i.delivery==="native"?i.delivery:s)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&E(null)}}}function Sl(s){let i=f.current,o=i?.querySelector(".skills-bot-card");if(!i||!o)return;let d=window.getComputedStyle(i),c=Number.parseFloat(d.columnGap||d.gap||"0")||0;i.scrollBy({left:s*(o.getBoundingClientRect().width+c),behavior:"smooth"})}async function Xl(s){M(`${s}:update`);try{let i=await h(`/api/skills/${encodeURIComponent(s)}/update`,{method:"POST",body:"{}"});if(!t.current)return;await gl(i.job,y)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&M(null)}}async function Yl(s){if(window.confirm(`${e("skills.remove")} ${s}?`)){M(`${s}:remove`);try{if(await h(`/api/skills/${encodeURIComponent(s)}`,{method:"DELETE",body:"{}"}),!t.current)return;await w()}catch(i){if(!t.current)return;if(i?.status===409&&i?.body?.error==="skill_in_use"){let o=Array.isArray(i.body.affectedBots)?i.body.affectedBots.map(c=>{let p=c?.botName||c?.larkAppId;return p?`${p}`:""}).filter(Boolean):Ul(s),d=[o.length?`Bot: ${o.join(", ")}`:""].filter(Boolean).join("; ")||"-";if(!window.confirm(e("skills.removeInUse",{skill:s,refs:d})))return;try{if(await h(`/api/skills/${encodeURIComponent(s)}?force=1`,{method:"DELETE",body:"{}"}),!t.current)return;await w();return}catch(c){t.current&&window.alert(`${e("skills.failed")}: ${c?.message??c}`);return}}window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&M(null)}}}async function Zl(s,i,o){let d=`${s}:${i}:${o}`;pl(d),ml(c=>({...c,[s]:null}));try{let c=await h(`/api/bots/${encodeURIComponent(s)}/skills`,{method:"PUT",body:JSON.stringify({action:i,name:o})});if(!t.current)return;D(p=>p.map(S=>S.larkAppId===s?{...S,skills:c.skills??null}:S))}catch(c){t.current&&ml(p=>({...p,[s]:{text:`${e("skills.failed")}: ${c?.message??c}`,ok:!1}}))}finally{t.current&&pl(null)}}let ls=v.filter(s=>ds(s.skills)).length,ss=v.reduce((s,i)=>s+cs(i.skills),0),es=el?(0,l.jsx)(ll,{html:Nl(),as:"div"}):R?(0,l.jsx)("p",{className:"hint-warn",children:R}):(0,l.jsxs)("div",{className:"skills-page-grid",children:[(0,l.jsxs)("aside",{className:"skills-side-rail",children:[(0,l.jsxs)("article",{className:"bd-card skills-defaults-panel",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:e("skills.globalDefaults")}),(0,l.jsxs)("div",{className:"skills-control-block",children:[(0,l.jsx)("span",{className:"skills-control-label",children:e("skills.globalProject")}),(0,l.jsx)("div",{className:"skills-choice-group skills-choice-group-compact skills-project-group",children:[["off",e("skills.globalProjectOff"),e("skills.globalProjectOffHelp")],["all",e("skills.globalProjectAll"),e("skills.globalProjectAllHelp")]].map(([s,i,o])=>(0,l.jsxs)("button",{type:"button",className:`skills-choice${b===s?" selected":""}`,"data-global-project-value":s,"aria-pressed":b===s?"true":"false",disabled:ul==="project",onClick:()=>{Vl(s)},children:[(0,l.jsx)("strong",{children:i}),(0,l.jsx)("small",{children:o})]},s))})]}),(0,l.jsxs)("div",{className:"skills-control-block",children:[(0,l.jsx)("span",{className:"skills-control-label",children:e("skills.globalDelivery")}),(0,l.jsx)("div",{className:"skills-choice-group skills-delivery-group",children:[["auto",e("skills.deliveryAuto"),e("skills.deliveryAutoHelp")],["prompt",e("skills.deliveryPrompt"),e("skills.deliveryPromptHelp")],["native",e("skills.deliveryNative"),e("skills.deliveryNativeHelp")]].map(([s,i,o])=>(0,l.jsxs)("button",{type:"button",className:`skills-choice${P===s?" selected":""}`,"data-global-delivery-value":s,"aria-pressed":P===s?"true":"false",disabled:ul==="delivery",onClick:()=>{Ql(s)},children:[(0,l.jsx)("strong",{children:i}),(0,l.jsx)("small",{children:o})]},s))})]})]}),(0,l.jsx)(ks,{installSource:J,installPath:il,installRef:al,installStatus:Dl,installBusy:Al,installDiscovering:jl,installSelectionOpen:xl,installCandidates:rl,selectedInstallSkills:_,onInstallSourceChange:s=>{$l(s),H()},onInstallPathChange:s=>{Bl(s),H()},onInstallRefChange:s=>{Tl(s),H()},onToggleInstallSkill:_l,onSelectAllInstallSkills:Kl,onConfirmInstallSelection:()=>{Wl()},onCloseInstallSelection:()=>A(!1),onInstall:()=>{zl()},onOpenNativeDiscovery:()=>x(!0)})]}),(0,l.jsxs)("section",{className:"skills-main-panel",children:[(0,l.jsxs)("section",{className:"skills-overview",children:[(0,l.jsxs)("div",{className:"skills-overview-copy",children:[(0,l.jsx)("h2",{children:e("skills.overviewTitle")}),(0,l.jsx)("p",{children:e("skills.overviewBody")})]}),(0,l.jsxs)("div",{className:"skills-metric-strip",children:[(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricInstalled")}),(0,l.jsx)("strong",{children:m.length})]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricBots")}),(0,l.jsxs)("strong",{children:[ls,"/",v.length]})]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricAttached")}),(0,l.jsx)("strong",{children:ss})]})]})]}),(0,l.jsxs)("section",{className:"skills-bots-panel",children:[(0,l.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h2",{children:e("skills.bots")}),(0,l.jsx)("p",{children:e("skills.botsHelp")})]}),v.length>3?(0,l.jsxs)("div",{className:"skills-bot-rail-actions",children:[(0,l.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"-1","aria-label":e("skills.scrollBotsPrev"),title:e("skills.scrollBotsPrev"),onClick:()=>Sl(-1),children:"\u2039"}),(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:v.length})}),(0,l.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"1","aria-label":e("skills.scrollBotsNext"),title:e("skills.scrollBotsNext"),onClick:()=>Sl(1),children:"\u203A"})]}):(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:v.length})})]}),(0,l.jsx)("div",{className:"skills-bot-grid",ref:f,children:v.map(s=>(0,l.jsx)(ms,{bot:s,installedNames:L,skills:m,status:Ol[s.larkAppId]??null,busyKey:Ll,onUpdate:Zl},s.larkAppId))})]}),(0,l.jsxs)("section",{className:"bd-card skills-installed-panel",children:[(0,l.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h2",{children:e("skills.installed")}),(0,l.jsx)("p",{children:e("skills.installedHelp")})]}),$<=1?(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:m.length})}):(0,l.jsxs)("div",{className:"skills-installed-toolbar",children:[(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:m.length})}),(0,l.jsxs)("div",{className:"skills-pager",children:[(0,l.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"-1","aria-label":e("skills.prevPage"),title:e("skills.prevPage"),disabled:B===0,onClick:()=>V(s=>Math.max(0,s-1)),children:"\u2039"}),(0,l.jsx)("span",{children:e("skills.pageStatus",{page:B+1,pages:$})}),(0,l.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"1","aria-label":e("skills.nextPage"),title:e("skills.nextPage"),disabled:B>=$-1,onClick:()=>V(s=>Math.min($-1,s+1)),children:"\u203A"})]})]})]}),m.length===0?(0,l.jsx)("p",{className:"empty",children:e("skills.empty")}):(0,l.jsx)("div",{className:"skills-list",children:Hl.map(s=>(0,l.jsxs)("article",{className:"skills-row skills-installed-card","data-skill":s.name,children:[(0,l.jsxs)("div",{className:"skills-row-body",children:[(0,l.jsx)("strong",{children:s.name}),s.description?(0,l.jsx)("p",{children:s.description}):null,(0,l.jsx)("small",{className:"skills-source-badge",children:rs(s,e)})]}),(0,l.jsxs)("div",{className:"skills-card-actions",children:[(0,l.jsx)("button",{type:"button","data-action":"update-skill",disabled:kl===`${s.name}:update`,onClick:()=>{Xl(s.name)},children:e("skills.update")}),(0,l.jsx)("button",{type:"button","data-action":"remove-skill",disabled:kl===`${s.name}:remove`,onClick:()=>{Yl(s.name)},children:e("skills.remove")})]})]},s.name))})]})]}),(0,l.jsx)("dialog",{className:"skills-discovery-dialog",id:"skills-discovery-dialog",ref:k,onClose:()=>x(!1),children:(0,l.jsxs)("article",{children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h3",{children:e("skills.discoverTitle")}),(0,l.jsx)("p",{children:e("skills.discoverHelp")})]}),(0,l.jsx)("div",{className:"skills-discovery-body",children:N?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"skills-discovery-tabs",role:"tablist","aria-label":e("skills.discoverTitle"),children:r.map(s=>{let i=U(s),o=i===Q;return(0,l.jsxs)("button",{type:"button",role:"tab","data-discovery-tab":i,className:o?"selected":"","aria-selected":o?"true":"false",onClick:()=>Ml(i),children:[(0,l.jsx)("strong",{children:s.label??s.cliId}),(0,l.jsx)("small",{children:e("skills.skillCount",{count:s.skills.length})})]},i)})}),(0,l.jsx)("div",{className:"skills-discovery-path",children:(0,l.jsx)("code",{children:N.rootDir})}),r.map(s=>{let i=U(s);return(0,l.jsx)("section",{className:"skills-discovery-group","data-discovery-panel":i,hidden:!(i===Q),children:s.skills.length===0?(0,l.jsx)("p",{className:"empty",children:e("skills.discoverGroupEmpty")}):(0,l.jsx)("div",{className:"skills-discovery-list",children:s.skills.map(d=>{let c=L.has(d.name),p=d.rootDir??d.source?.root??"";return(0,l.jsxs)("label",{className:`skills-discovery-row${c?" installed":""}`,children:[(0,l.jsx)("input",{type:"checkbox","data-discovered-skill":!0,value:p,disabled:c,checked:!c&&W.has(p),onChange:S=>{let ts=S.currentTarget.checked;F(is=>{let X=new Set(is);return ts?X.add(p):X.delete(p),X})}}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:d.name}),d.description?(0,l.jsx)("small",{children:d.description}):null]}),c?(0,l.jsx)("em",{children:e("skills.discoverRegistered")}):null]},`${d.name}:${p}`)})})},i)})]}):(0,l.jsx)("p",{className:"empty",children:e("skills.discoverEmpty")})}),(0,l.jsxs)("footer",{className:"actions",children:[(0,l.jsx)("button",{type:"button","data-action":"toggle-discovered-skills",disabled:T.length===0,onClick:()=>{F(s=>{let i=new Set(s);return vl?T.forEach(o=>i.delete(o)):T.forEach(o=>i.add(o)),i})},children:e(vl?"skills.discoverClearSelection":"skills.discoverSelectAll")}),(0,l.jsx)("button",{type:"button",className:"primary","data-action":"register-discovered-skills",disabled:El,onClick:()=>{Fl()},children:e("skills.discoverRegister")}),(0,l.jsx)("button",{type:"button","data-action":"close-discovery",onClick:()=>x(!1),children:e("skills.discoverClose")})]})]})})]});return(0,l.jsxs)("section",{className:"page",children:[(0,l.jsxs)("div",{className:"page-heading",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{className:"eyebrow",children:e("nav.skills")}),(0,l.jsx)("h1",{children:e("skills.title")}),(0,l.jsx)("p",{children:e("skills.subtitle")})]}),(0,l.jsx)("button",{type:"button",id:"skills-refresh",disabled:el,onClick:()=>{w()},children:e("skills.refresh")})]}),(0,l.jsx)("div",{id:"skills-body",children:es})]})}function ms(e){let t=G(),{bot:n,installedNames:k,skills:f,status:m,busyKey:C,onUpdate:r}=e,I=n.botName??n.larkAppId,v=q(n.skills),D=new Set(v),b=f.filter(u=>!D.has(u.name)),[g,P]=(0,a.useState)(b[0]?.name??"");return(0,a.useEffect)(()=>{(!g||!b.some(u=>u.name===g))&&P(b[0]?.name??"")},[b,g]),n.error?(0,l.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,l.jsxs)("header",{children:[(0,l.jsx)(ll,{html:Z({name:I,larkAppId:n.larkAppId,size:"sm"})}),(0,l.jsx)("strong",{children:I})]}),(0,l.jsx)("p",{className:"hint-warn-inline",children:n.error})]}):(0,l.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,l.jsxs)("header",{className:"skills-bot-head",children:[(0,l.jsx)(ll,{html:Z({name:I,larkAppId:n.larkAppId,size:"sm",dot:"ok"})}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:I}),(0,l.jsx)("code",{children:n.larkAppId})]}),(0,l.jsx)("span",{className:"skills-count-pill",children:t("skills.skillCount",{count:v.length})})]}),(0,l.jsxs)("section",{className:"bd-section",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:t("skills.priority")}),v.length===0?(0,l.jsx)("p",{className:"bd-section-note",children:t("skills.noPriority")}):(0,l.jsx)("div",{className:"skills-chip-list",children:v.map(u=>{let R=!k.has(u);return(0,l.jsxs)("span",{className:`skills-priority-row${R?" skills-priority-dangling":""}`,title:R?t("skills.dangling"):"",children:[(0,l.jsxs)("span",{className:"skills-priority-name",children:[u,R?(0,l.jsx)("small",{children:t("skills.dangling")}):null]}),(0,l.jsx)("button",{type:"button",className:"skills-priority-remove","data-action":"detach-skill","data-name":u,"aria-label":t("skills.detachNamed",{skill:u}),disabled:C===`${n.larkAppId}:detach:${u}`,onClick:()=>{r(n.larkAppId,"detach",u)},children:"\xD7"})]},u)})}),(0,l.jsx)("div",{className:"actions skills-attach-row",children:b.length===0?(0,l.jsx)("button",{type:"button",disabled:!0,children:t("skills.attach")}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("select",{"data-attach-picker":!0,value:g,onChange:u=>P(u.currentTarget.value),children:b.map(u=>(0,l.jsx)("option",{value:u.name,children:u.name},u.name))}),(0,l.jsx)("button",{type:"button","data-action":"attach-skill",disabled:!g||C===`${n.larkAppId}:attach:${g}`,onClick:()=>g&&void r(n.larkAppId,"attach",g),children:t("skills.attach")})]})})]}),(0,l.jsx)("span",{className:Il(m),"data-bot-status":!0,children:m?.text??""})]})}function gs(e){return wl(e,(0,l.jsx)(ps,{}))}export{ms as BotPolicyCard,ks as SkillsInstallPanel,gs as renderSkillsPage};
@@ -1,10 +0,0 @@
1
- import{b as w}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import{o as n,p as d}from"./chunk-3UJYRR2Q.js";import{a as V,b as R,c as P}from"./chunk-JTSE5VP6.js";import{c as N}from"./chunk-7SZRL6FY.js";var k=N(V(),1);async function E(e){let t=await fetch(e);return{status:t.status,body:await t.json().catch(()=>({}))}}async function S(e,t,o){let a=await fetch(t,{method:e,headers:{"content-type":"application/json"},body:o?JSON.stringify(o):void 0});return{status:a.status,body:await a.json().catch(()=>({}))}}var x=(e,t)=>S("POST",e,t),X=(e,t)=>S("PUT",e,t),z=[],U=[],q="",I="",A=new Map,H=new Map,$=new Set,M=new Set,y=0;function _(){return y+=1,y}function f(e){return y===e}function c(e){return document.getElementById(e)}function B(){return[...z,...U]}function T(e){let t=A.get(e);return t||(t=new Set,A.set(e,t)),t}function Y(e){return B().find(t=>t.key===e)}function Z(e){let t=(c("tf-search").value||"").trim().toLowerCase();if(t&&!((e.name||"")+" "+(e.cliId||"")+" "+(e.capability||"")).toLowerCase().includes(t))return!1;let o=c("tf-cli").value;return!(o&&e.cliId!==o||c("tf-fcap").checked&&!e.capability||c("tf-frole").checked&&!e.hasTeamRole)}function ee(e,t){let o=[...e.deployments].sort((r,s)=>r.local===s.local?0:r.local?-1:1),a="";for(let r of o){let s=t.filter(p=>p.deployment.id===r.id);if(!s.length)continue;let m=r.id===q,l=m?n("team.tagLocal"):r.stale?n("team.tagRemoteStale"):n("team.tagRemote"),u=e.kind==="local"&&!m?` <button class="tf-rmmember ghost" data-team="${d(e.teamId)}" data-dep="${d(r.id)}" data-name="${d(r.name)}" style="font-size:12px">${n("team.removeMember")}</button>`:"",g=`${e.key}::${r.id}`,b=M.has(g),v=s.filter(p=>T(e.key).has(p.larkAppId)).length;if(a+=`<div class="tf-dep-h" data-dk="${d(g)}" style="cursor:pointer;margin:10px 0 2px"><b>${b?"\u25BE":"\u25B8"} ${d(r.name)}</b> <span class="muted" style="font-size:12px">${n("team.depTag",{tag:l})} \xB7 ${n("team.depCount",{count:s.length})}${v?n("team.depSelected",{n:v}):""}</span>${u}</div>`,!!b){a+='<table style="width:100%;border-collapse:collapse;font-size:14px"><tbody>';for(let p of s){let C=d(p.larkAppId),W=T(e.key).has(p.larkAppId)?" checked":"",K=p.deployment.stale?"opacity:.55":"",J=m?`<input class="tf-cap" data-app="${C}" value="${d(p.capability||"")}" placeholder="${n("team.capPh")}" style="width:92%;padding:3px 6px">`:p.capability?d(p.capability):'<span class="muted">\u2014</span>',Q=p.hasTeamRole?m?`<button class="tf-role" data-app="${C}" data-name="${d(p.name)}">${n("team.viewRole")}</button>`:n("team.hasRoleShort"):'<span class="muted">\u2014</span>';a+=`<tr style="${K}"><td style="padding:4px 8px"><input type="checkbox" class="tf-pick" data-tk="${d(e.key)}" data-app="${C}"${W}></td><td style="padding:4px 8px">${d(p.name)}</td><td style="padding:4px 8px" class="muted">${d(p.cliId)}</td><td style="padding:4px 8px">${J}</td><td style="padding:4px 8px">${Q}</td></tr>`}a+="</tbody></table>"}}return a||(a=`<p class="muted" style="margin:8px 0 0">${n("team.noMatch")}</p>`),a+=`<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center"><input class="tf-gname" data-tk="${d(e.key)}" value="${d(H.get(e.key)||"")}" placeholder="${n("team.gnamePh")}" style="min-width:200px"><button class="tf-grp primary" data-tk="${d(e.key)}">${n("team.pullGroupBtn")}</button><span class="muted" style="font-size:13px">${n("team.pullGroupHint")}</span><span class="tf-gout" data-tk="${d(e.key)}" style="font-size:13px;display:block;flex-basis:100%"></span></div>`,a}function h(){let e=c("tf-teams"),t=B();if(!t.length){e.innerHTML=`<p class="muted">${n("team.noTeams")}</p>`,c("tf-count").textContent="";return}let o="",a=new Set,r=new Set;for(let l of t){let u=l.bots.filter(Z);u.forEach(p=>a.add(p.larkAppId)),l.bots.forEach(p=>r.add(p.larkAppId));let g=new Set(u.map(p=>p.larkAppId));[...T(l.key)].forEach(p=>{g.has(p)||T(l.key).delete(p)});let b=!$.has(l.key),v=l.kind==="remote"?l.ok?` <span class="ok" style="font-size:12px">${n("team.connected")}</span>`:` <span class="err" style="font-size:12px">${n("team.connectFail",{error:d(l.error||"")})}</span>`:` <span class="muted" style="font-size:12px">${n("team.iHost")}</span>`;o+=`<div class="card" style="margin:0 0 12px;padding:12px 14px;background:var(--bg-soft,#f6f7f9)"><div class="tf-team-h" data-tk="${d(l.key)}" style="cursor:pointer;display:flex;align-items:center;gap:8px;flex-wrap:wrap"><b style="font-size:15px">${b?"\u25B8":"\u25BE"} ${d(l.label)}</b>`+(l.sub?` <span class="muted" style="font-size:12px">${d(l.sub)}</span>`:"")+v+` <span class="muted" style="font-size:12px">\xB7 ${n("team.teamMeta",{deps:l.deployments.length,bots:l.bots.length})}</span></div>`,b||(o+=l.kind==="remote"&&!l.ok?`<p class="muted" style="margin:8px 0 0">${n("team.rosterFail")}</p>`:ee(l,u)),o+="</div>"}e.innerHTML=o;let s=t.length>1?n("team.acrossTeams",{n:t.length}):"",m=a.size===r.size?`${r.size}`:`${a.size} / ${r.size}`;c("tf-count").textContent=`\xB7 ${m} ${n("team.botsWord")}${s}`,te(y)}function te(e=y){let t=c("tf-teams");t.querySelectorAll(".tf-team-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.tk;$.has(a)?$.delete(a):$.add(a),h()}}),t.querySelectorAll(".tf-dep-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.dk;M.has(a)?M.delete(a):M.add(a),h()}}),t.querySelectorAll(".tf-pick").forEach(o=>{o.onchange=()=>{let a=T(o.dataset.tk);o.checked?a.add(o.dataset.app):a.delete(o.dataset.app)}}),t.querySelectorAll(".tf-gname").forEach(o=>{o.oninput=()=>{H.set(o.dataset.tk,o.value)}}),t.querySelectorAll(".tf-cap").forEach(o=>{o.onchange=async()=>{let a=o.dataset.app,r=o.value;await X("/api/team/local-bots/"+encodeURIComponent(a)+"/capability",{capability:r}),f(e)&&B().forEach(s=>{let m=s.bots.find(l=>l.larkAppId===a);m&&(m.capability=r.trim()||null)})}}),t.querySelectorAll(".tf-role").forEach(o=>{o.onclick=()=>ne(o.dataset.app,o.dataset.name||"",e)}),t.querySelectorAll(".tf-rmmember").forEach(o=>{o.onclick=async a=>{a.stopPropagation(),confirm(n("team.removeMemberConfirm",{name:o.dataset.name||""}))&&(await S("DELETE",`/api/team/hosted/${encodeURIComponent(o.dataset.team)}/members/${encodeURIComponent(o.dataset.dep)}`),f(e)&&L(e))}}),t.querySelectorAll(".tf-grp").forEach(o=>{o.onclick=async()=>{let a=o.dataset.tk,r=Y(a);if(!r)return;let s=[...T(a)],m=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);if(!s.length){m.innerHTML=`<span class="err">${n("team.errPickBot")}</span>`;return}let l=(t.querySelector(`.tf-gname[data-tk="${CSS.escape(a)}"]`)?.value||"").trim()||n("team.defaultGroupName");m.innerHTML=`<span class="muted">${n("team.creatingGroup")}</span>`;let u=r.kind==="local"?await x("/api/team/federated-group",{name:l,larkAppIds:s,teamId:r.teamId}):await x("/api/team/remote-group",{hubUrl:r.hubUrl,teamId:r.teamId,name:l,larkAppIds:s});if(f(e)&&(ae(m,u.body,u.status),u.body?.ok)){T(a).clear(),H.delete(a);let g=m.innerHTML,b=()=>{if(!f(e))return;let v=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);v&&(v.innerHTML=g)};r.kind==="local"?L(e).then(b):(h(),b())}}})}function ae(e,t,o){if(t?.ok&&t.chatId){let a=t.shareLink||"https://applink.feishu.cn/client/chat/open?openChatId="+encodeURIComponent(t.chatId),r=(t.invalidBotIds||[]).length?` <span class="err"> \xB7 ${n("team.invalidBots",{ids:d((t.invalidBotIds||[]).join(", "))})}</span>`:"",s=(t.invalidOwnerUnionIds||[]).length?`<span class="err"> \xB7 ${n("team.invalidOwners",{n:(t.invalidOwnerUnionIds||[]).length})}</span>`:"",m=t.missingOperatorIdentity?`<span class="err"> \xB7 ${n("team.missingIdentity")}</span>`:"",l=(t.skippedNoOwner||[]).length?`<span class="err"> \xB7 ${n("team.skippedNoOwner",{n:(t.skippedNoOwner||[]).length})}</span>`:"",u=t.delegatedTo?n("team.delegatedBy",{name:d(t.delegatedTo)}):"";e.innerHTML=`<span class="ok">${n("team.groupCreated")}</span>${u} \xB7 <a href="${d(a)}" target="_blank">${n("team.openInLark")}</a>${r}${s}${m}${l}`}else{let a=t?.error||o,r=a==="no_local_online_bot"?n("team.errNoLocalBot"):a==="all_bots_skipped_no_owner"?n("team.errAllSkipped"):a==="no_creator_available"?n("team.errNoCreator"):a==="delegation_timeout"?n("team.errDelegationTimeout"):n("team.errGroupCreate",{error:String(a)});e.innerHTML=`<span class="err">${d(String(r))}</span>`}}async function ne(e,t,o=y){let a=await E("/api/team/local-bots/"+encodeURIComponent(e)+"/role");f(o)&&(c("tf-modal-title").textContent=n("team.roleModalTitleName",{name:t}),c("tf-modal-text").value=a.body?.role||"",c("tf-modal").dataset.app=e,c("tf-modal").style.display="flex")}function D(){let e=Array.from(new Set(B().flatMap(a=>a.bots.map(r=>r.cliId)).filter(Boolean))).sort(),t=c("tf-cli"),o=t.value;t.innerHTML=`<option value="">${n("team.allCli")}</option>`+e.map(a=>`<option value="${d(a)}">${d(a)}</option>`).join(""),t.value=o}async function L(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body;if(!o?.ok){z=[],h();return}q=o.deployment.deploymentId,I=o.suggestedHubUrl||"",c("tf-owner").textContent=o.deployment.ownerName||(o.deployment.ownerUnionId?n("team.bound"):n("team.unbound")),z=(o.teams||[]).map(a=>({kind:"local",key:`local:${a.teamId}`,teamId:a.teamId,label:a.isDefault?n("team.myHostedTeam"):a.name,sub:"",ok:!0,deployments:a.deployments||[],bots:a.bots||[]})),D(),h()}async function oe(e=y){let t=await E("/api/team/remote-roster");if(!f(e))return;U=(t.body?.memberships||[]).map(a=>{let r=a.roster?.deployments||[],s=r.find(l=>l.local),m=s?.name?n("team.remoteTeamLabel",{name:s.name}):a.teamName||a.teamId;return{kind:"remote",key:`${a.hubUrl}::${a.teamId}`,teamId:a.teamId,label:m,sub:a.hubUrl,ok:!!a.ok,error:a.error,hubUrl:a.hubUrl,deployments:r,bots:a.roster?.bots||[]}}),D(),h()}function O(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return A.clear(),H.clear(),$.clear(),M.clear(),["tf-search","tf-cli","tf-fcap","tf-frole"].forEach(r=>{let s=document.getElementById(r);a(s,"input",()=>{f(t)&&h()}),a(s,"change",()=>{f(t)&&h()})}),a(document.getElementById("tf-modal-cancel"),"click",()=>{f(t)&&(c("tf-modal").style.display="none")}),se(t),L(t),oe(t),()=>{f(t)&&(y+=1);for(let s of o.splice(0))s();let r=e.querySelector("#tf-modal");r&&(r.style.display="none")}}async function j(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body,a=c("tm-list");I=o?.suggestedHubUrl||I;let r=o?.teams||[];if(!r.length){a.innerHTML=`<p class="muted">${n("team.noTeamsShort")}</p>`;return}a.innerHTML=r.map(s=>{let m=(s.deployments||[]).filter(l=>!l.local).length;return`<div class="card" style="margin:0 0 8px;padding:10px 14px;background:var(--bg-soft,#f6f7f9)">
2
- <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap">
3
- <b>${d(s.name)}</b>${s.isDefault?` <span class="muted" style="font-size:12px">${n("team.default")}</span>`:""}
4
- <span class="muted" style="font-size:12px">\xB7 ${n("team.manageMetaDeps",{count:(s.deployments||[]).length})}${m?n("team.manageMetaRemote",{r:m}):""} \xB7 ${n("team.manageMetaBots",{count:(s.bots||[]).length})}</span>
5
- <span style="margin-left:auto;display:flex;gap:6px">
6
- <button class="tm-invite ghost" data-team="${d(s.teamId)}" style="font-size:12px">${n("team.genInvite")}</button>
7
- ${s.isDefault?"":`<button class="tm-del ghost" data-team="${d(s.teamId)}" data-name="${d(s.name)}" style="font-size:12px">${n("team.delBtn")}</button>`}
8
- </span>
9
- </div>
10
- <div class="tm-inv-out" data-team="${d(s.teamId)}" style="display:none;margin-top:6px;font-size:13px"></div></div>`}).join(""),a.querySelectorAll(".tm-invite").forEach(s=>{s.onclick=async()=>{let m=s.dataset.team,l=a.querySelector(`.tm-inv-out[data-team="${CSS.escape(m)}"]`);l.style.display="",l.innerHTML=`<span class="muted">${n("team.generating")}</span>`;let u=await x("/api/team/local-invite",{teamId:m});f(e)&&(u.body?.code?l.innerHTML=`${n("team.inviteResultLede")}<br>${n("team.inviteHub")}<code>${d(I)}</code><br>${n("team.inviteCode")}<code style="font-size:15px">${d(u.body.code)}</code>`:l.innerHTML=`<span class="err">${n("team.genFail")}</span>`)}}),a.querySelectorAll(".tm-del").forEach(s=>{s.onclick=async()=>{confirm(n("team.delConfirm",{name:s.dataset.name||""}))&&(await S("DELETE","/api/team/hosted/"+encodeURIComponent(s.dataset.team)),f(e)&&j(e))}})}function G(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return a(document.getElementById("tm-create"),"click",async()=>{let r=c("tm-newname").value.trim(),s=e.querySelector(".tm-cout");if(!r){s.innerHTML=`<span class="err">${n("team.errName")}</span>`;return}s.innerHTML=`<span class="muted">${n("team.creating")}</span>`;let m=await x("/api/team/hosted",{name:r});f(t)&&(m.body?.ok?(s.innerHTML=`<span class="ok">${n("team.created")}</span>`,c("tm-newname").value="",j(t)):s.innerHTML=`<span class="err">${n("team.createFail",{error:d(String(m.body?.error||m.status))})}</span>`)}),a(document.getElementById("tm-join"),"click",async()=>{let r=c("tm-hub").value.trim(),s=c("tm-code").value.trim(),m=c("tm-join-out");if(m.style.display="",!r||!s){m.innerHTML=`<span class="err">${n("team.errHubCode")}</span>`;return}m.innerHTML=`<span class="muted">${n("team.joining")}</span>`;let l=await x("/api/team/join-remote",{hubUrl:r,inviteCode:s});if(f(t))if(l.body?.ok)m.innerHTML=`<span class="ok">${n("team.joined",{name:d(l.body.teamName||"")})}</span>`,c("tm-code").value="";else{let u=l.body?.error||l.status,g=u==="cannot_join_self"?n("team.joinErrSelf"):u==="deployment_already_joined"?n("team.joinErrAlready"):u==="hub_unreachable"?n("team.joinErrUnreachable"):u==="hub_timeout"?n("team.joinErrTimeout"):n("team.joinErrGeneric",{error:String(u)});m.innerHTML=`<span class="err">${d(String(g))}</span>`}}),j(t),()=>{f(t)&&(y+=1);for(let r of o.splice(0))r()}}function se(e=y){c("tf-autobind").onclick=async()=>{let t=c("tf-bind-out");t.style.display="",t.innerHTML=`<span class="muted">${n("team.identifying")}</span>`;let o=await x("/api/team/identity/auto-bind");if(!f(e))return;let a=o.body;if(a?.ok&&a.owner){t.innerHTML=`<span class="ok">${n("team.bound2",{name:d(a.owner.name||a.owner.unionId)})}</span>`,L(e);return}if(a?.ok&&a.needChoice&&Array.isArray(a.candidates)){let r=a.candidates.map(s=>`<button class="tf-pickowner ghost" data-union="${d(s.unionId)}" style="margin:2px">${d(s.name||s.unionId)}</button>`).join(" ");t.innerHTML=`${n("team.multiCandidate")}<br>${r}`,t.querySelectorAll(".tf-pickowner").forEach(s=>{s.onclick=async()=>{t.innerHTML=`<span class="muted">${n("team.binding")}</span>`;let m=await x("/api/team/identity/auto-bind",{unionId:s.dataset.union});if(!f(e))return;let l=m.body;l?.ok&&l.owner?(t.innerHTML=`<span class="ok">${n("team.bound2",{name:d(l.owner.name||l.owner.unionId)})}</span>`,L(e)):t.innerHTML=`<span class="err">${n("team.bindFail",{error:d(String(l?.error||"unknown"))})}</span>`}});return}if(a?.error==="no_candidates"){t.innerHTML=`<span class="err">${n("team.noCandidates")}</span>`;return}t.innerHTML=`<span class="err">${n("team.bindFail",{error:d(String(a?.error||"unknown"))})}</span>`}}var i=N(P(),1);function F(e){let t=w(),o=a=>({padding:"6px 14px",borderRadius:"8px",textDecoration:"none",fontSize:"14px",fontWeight:600,background:a?"var(--accent)":"var(--surface-muted)",color:a?"var(--on-accent)":"var(--muted)"});return(0,i.jsxs)("div",{style:{display:"flex",gap:"8px",marginBottom:"14px"},children:[(0,i.jsx)("a",{href:"#/team",style:o(e.active==="home"),children:t("team.navHome")}),(0,i.jsx)("a",{href:"#/team/manage",style:o(e.active==="manage"),children:t("team.navManage")})]})}function ie(){let e=w(),t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(t.current)return O(t.current)},[]),(0,i.jsxs)("section",{className:"page",ref:t,children:[(0,i.jsx)("div",{className:"page-heading",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"eyebrow",children:e("team.eyebrow")}),(0,i.jsx)("h1",{children:e("team.homeTitle")}),(0,i.jsx)("p",{className:"tf-lede",children:e("team.homeLede")})]})}),(0,i.jsx)(F,{active:"home"}),(0,i.jsxs)("div",{className:"card",style:{marginBottom:"16px"},children:[(0,i.jsx)("h2",{style:{marginTop:0},children:e("team.localDeployTitle")}),(0,i.jsxs)("p",{children:[e("team.myIdentity"),(0,i.jsx)("b",{id:"tf-owner",children:e("team.unbound")}),(0,i.jsx)("button",{type:"button",id:"tf-autobind",className:"primary",style:{marginLeft:"8px"},children:e("team.bindBtn")}),(0,i.jsx)("span",{className:"muted",style:{fontSize:"13px"},children:e("team.bindHint")})]}),(0,i.jsx)("div",{id:"tf-bind-out",style:{display:"none",marginTop:"6px"}})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsxs)("h2",{style:{marginTop:0},children:[e("team.myTeams")," ",(0,i.jsx)("span",{className:"muted",id:"tf-count",style:{fontSize:"13px"}})]}),(0,i.jsxs)("div",{style:{display:"flex",gap:"8px",alignItems:"center",flexWrap:"wrap",marginBottom:"8px",fontSize:"13px"},children:[(0,i.jsx)("input",{id:"tf-search",placeholder:e("team.searchPh"),style:{padding:"5px 9px",minWidth:"180px"}}),(0,i.jsx)("select",{id:"tf-cli",style:{padding:"5px"},children:(0,i.jsx)("option",{value:"",children:e("team.allCli")})}),(0,i.jsxs)("label",{children:[(0,i.jsx)("input",{type:"checkbox",id:"tf-fcap"})," ",e("team.hasCap")]}),(0,i.jsxs)("label",{children:[(0,i.jsx)("input",{type:"checkbox",id:"tf-frole"})," ",e("team.hasRole")]})]}),(0,i.jsx)("p",{className:"muted",style:{fontSize:"13px",margin:"0 0 4px"},children:e("team.teamsHint")}),(0,i.jsx)("div",{id:"tf-teams",children:e("team.loading")})]}),(0,i.jsx)("div",{id:"tf-modal",style:{display:"none",position:"fixed",inset:0,background:"rgba(0,0,0,.5)",alignItems:"center",justifyContent:"center",zIndex:50},children:(0,i.jsxs)("div",{style:{background:"var(--surface)",color:"var(--fg)",border:"1px solid var(--border)",borderRadius:"10px",padding:"18px 20px",width:"min(560px,92vw)"},children:[(0,i.jsx)("h2",{id:"tf-modal-title",style:{marginTop:0},children:e("team.roleModalTitle")}),(0,i.jsx)("p",{className:"muted",style:{fontSize:"13px"},children:e("team.roleModalHint")}),(0,i.jsx)("textarea",{id:"tf-modal-text",readOnly:!0,style:{width:"100%",minHeight:"200px",font:"13px/1.5 ui-monospace,Menlo,monospace",padding:"10px",boxSizing:"border-box"}}),(0,i.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"12px"},children:(0,i.jsx)("button",{type:"button",id:"tf-modal-cancel",children:e("team.close")})})]})})]})}function re(){let e=w(),t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(t.current)return G(t.current)},[]),(0,i.jsxs)("section",{className:"page",ref:t,children:[(0,i.jsx)("div",{className:"page-heading",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"eyebrow",children:e("team.eyebrow")}),(0,i.jsx)("h1",{children:e("team.manageTitle")}),(0,i.jsx)("p",{className:"tf-lede",children:e("team.manageLede")})]})}),(0,i.jsx)(F,{active:"manage"}),(0,i.jsxs)("div",{className:"card",style:{marginBottom:"16px"},children:[(0,i.jsx)("h2",{style:{marginTop:0},children:e("team.hostedTitle")}),(0,i.jsxs)("p",{style:{display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center",marginBottom:"6px"},children:[(0,i.jsx)("input",{id:"tm-newname",placeholder:e("team.newTeamPh"),style:{minWidth:"200px"}}),(0,i.jsx)("button",{type:"button",id:"tm-create",className:"primary",children:e("team.createTeamBtn")}),(0,i.jsx)("span",{className:"muted tm-cout",style:{fontSize:"13px"}})]}),(0,i.jsx)("div",{id:"tm-list",children:e("team.loading")})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("h2",{style:{marginTop:0},children:e("team.joinTitle")}),(0,i.jsxs)("p",{style:{display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center"},children:[(0,i.jsx)("input",{id:"tm-hub",placeholder:e("team.hubPh"),style:{flex:1,minWidth:"240px"}}),(0,i.jsx)("input",{id:"tm-code",placeholder:e("team.codePh"),style:{minWidth:"160px"}}),(0,i.jsx)("button",{type:"button",id:"tm-join",className:"primary",children:e("team.joinBtn")})]}),(0,i.jsx)("div",{id:"tm-join-out",style:{display:"none",marginTop:"6px"}})]})]})}function ue(e){return R(e,(0,i.jsx)(ie,{}))}function fe(e){return R(e,(0,i.jsx)(re,{}))}export{ue as renderTeamFederationPage,fe as renderTeamManagePage};