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
@@ -0,0 +1,3 @@
1
+ import{a as st,c as ot,h as at}from"./chunk-XJ7BGPJH.js";import{a as et,b as nt,c as tt}from"./chunk-BRTZFELS.js";import{c as ge,g as Qn,p as Re}from"./chunk-6TPODDDC.js";import{a as Un,b as os,d as Fe}from"./chunk-ZJING6FY.js";import{A as Zn,C as Q,D as me,E as ee,G as Ue,c as ye,d as he,i as Fn,j as jn,k as Jn,l as zn,m as cn,n as Xn,o as Vn,p as un,q as Wn,r as Gn,s as ve,t as o,u as qn,v as ke,x as ue,z as Yn}from"./chunk-XCPSHD3G.js";var c=ye(Un(),1),Nn=ye(os(),1);var mn=[24,72,168],as=new Set(mn);function gn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!as.has(t)?null:t}function is(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function rs(e,t=Date.now()){return t-e*60*60*1e3}function ls(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let i=is(e.lastMessageAt);return i!==null&&i<rs(t,s)}function it(e,t,s=Date.now()){return e.filter(i=>ls(i,t,s))}var rt={1:"claude-code",2:"aiden",3:"coco",4:"codex",5:"cursor",6:"gemini",7:"opencode",8:"antigravity",9:"mtr",10:"hermes",11:"codex-app",12:"mira",13:"seed",14:"traex",15:"pi",16:"copilot",17:"oh-my-pi",18:"relay",19:"mir",20:"kimi",21:"genius",22:"grok"},Zs=new Set(Object.values(rt)),ds={"claude-code":"Claude",aiden:"Aiden",coco:"CoCo",codex:"Codex",cursor:"Cursor",gemini:"Gemini",genius:"Genius",opencode:"OpenCode",antigravity:"Antigravity",mtr:"MTR",hermes:"Hermes","codex-app":"Codex App",mira:"Mira",seed:"Seed",traex:"TRAE",pi:"Pi",copilot:"Copilot","oh-my-pi":"Oh My Pi",relay:"Relay",mir:"Mir CLI",kimi:"Kimi",grok:"Grok Build"},lt=Object.values(rt).map(e=>({id:e,label:ds[e]??e}));function je(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function fn(e){let t=je(e);return t===null?"-":t.toLocaleString("en-US")}var fe=[...lt.map(e=>e.id),"unknown"],bn=[{id:"needs-you",labelKey:"sessions.board.needsYou",hintKey:"sessions.board.needsYouHint"},{id:"starting",labelKey:"sessions.board.starting",hintKey:"sessions.board.startingHint"},{id:"working",labelKey:"sessions.board.working",hintKey:"sessions.board.workingHint"},{id:"idle",labelKey:"sessions.board.idle",hintKey:"sessions.board.idleHint"}];function pn(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var ct=["starting","working","idle","dormant","analyzing","active","limited","closed"];function Be(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,i=o(s);return i===s?t:i}function ut(e){let t=0,s=0,i=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&i++);return{logical:t,resident:s,dormant:i}}function yn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function dt(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function we(e){let t=String(e?.chatId??"").trim(),s=me(e);return s?`${dt(e)} \xB7 ${s}`:t?`${dt(e)} \xB7 ${t}`:o("sessions.chatUnknown")}function hn(e,t=me){return!!String(e?.chatId??"").trim()&&!t(e)}function kn(e){let t=we(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function mt(e){return`${JSON.stringify(e)} ${we(e)} ${kn(e)}`.toLowerCase()}var De=st;function wn(e=ve){return e.authed&&!e.publicReadOnly}var B={pin:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 14.3s4.2-3.9 4.2-7.3A4.2 4.2 0 0 0 8 2.9a4.2 4.2 0 0 0-4.2 4.1C3.8 10.4 8 14.3 8 14.3z"/><circle cx="8" cy="6.9" r="1.5"/></svg>',openChat:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.8h3.8v3.8"/><path d="M13.2 2.8 7.3 8.7"/><path d="M11.5 9.3v2.9a1.2 1.2 0 0 1-1.2 1.2H3.8a1.2 1.2 0 0 1-1.2-1.2V5.7a1.2 1.2 0 0 1 1.2-1.2h2.9"/></svg>',details:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.6" width="11.2" height="10.8" rx="2"/><path d="M5.2 5.4h5.6"/><path d="M5.2 8h5.6"/><path d="M5.2 10.6h3.2"/></svg>',terminal:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="1.8" y="2.2" width="12.4" height="10.5" rx="2"/><path d="M1.8 5h12.4"/><circle cx="4" cy="3.6" r=".45" fill="currentColor" stroke="none"/><path d="m4.2 7.3 1.8 1.6-1.8 1.6"/><path d="M8 10.6h3.4"/></svg>',key:'<svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="6" cy="6.1" r="3"/><path d="M8.1 8.2 13 13.1"/><path d="M11.3 11.4 12.6 10.1"/><path d="M12.7 12.8 13.7 11.8"/></svg>',lock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.4a2.9 2.9 0 0 1 5.8 0V7"/><path d="M8 9.5v1.4"/></svg>',unlock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.3a2.9 2.9 0 0 1 5.1-1.9"/><path d="M8 9.5v1.4"/></svg>',close:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4.2 4.2 11.8 11.8"/><path d="M11.8 4.2 4.2 11.8"/></svg>',edit:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10.7 3.3 12.7 5.3 6.3 11.7 3.7 12.3 4.3 9.7 10.7 3.3z"/></svg>',history:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 7.8a4.8 4.8 0 1 0 1.4-3.4"/><path d="M3.2 3.1v3.2h3.2"/><path d="M8 5.4v3l2.1 1.2"/></svg>',restart:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M12.7 6.5A4.8 4.8 0 1 0 13 9"/><path d="M12.7 3.3v3.2H9.5"/></svg>',feishu:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 5.2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v3.3a2 2 0 0 1-2 2H7.1L4.3 13v-2.5H5"/><path d="M9.1 3.2h3.7v3.7"/><path d="M12.8 3.2 8.5 7.5"/></svg>'};function Je(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function gt(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let i=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await i.json().catch(()=>({}));if(!i.ok||r?.ok===!1||!r?.url){s?.close(),i.status!==401&&alert(`${o("sessions.writeLinkFail")}: ${r?.error??i.status}`);return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(i){s?.close(),alert(`${o("sessions.writeLinkFail")}: ${i}`)}finally{t&&(t.disabled=!1)}}function Cn(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,i=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${i||r||"unknown"}`}function ft(e){return e.status==="closed"?null:e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"?"needs-you":e.status==="starting"?"starting":e.status==="working"||e.status==="analyzing"||e.status==="active"?"working":(e.status==="dormant","idle")}function bt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),i=ve.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${i}${Be(t)}`,`${o("sessions.restartConfirmCli")}${i}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
2
+ `)}function ze(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo}async function pt(){try{let e=await fetch("/api/groups");if(!e.ok)return[];let t=await e.json();return(Array.isArray(t?.bots)?t.bots:[]).filter(i=>i&&typeof i.larkAppId=="string").map(i=>({larkAppId:i.larkAppId,botName:typeof i.botName=="string"&&i.botName?i.botName:i.larkAppId}))}catch{return[]}}var T=ye(Un(),1);var yt=["backlog","todo","in_progress","in_review","done"];function ht(e){return typeof e=="string"&&yt.includes(e)?e:null}function kt(e){if(e.status==="closed")return"done";let t=ht(e.kanbanColumn);return t||(e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"?"in_review":e.status==="starting"||e.status==="working"||e.status==="analyzing"||e.status==="active"?"in_progress":"todo")}var cs=1e15;function Ce(e){if(typeof e.kanbanPosition=="number"&&Number.isFinite(e.kanbanPosition))return e.kanbanPosition;let t=typeof e.lastMessageAt=="number"&&Number.isFinite(e.lastMessageAt)?e.lastMessageAt:0;return cs-t}function Sn(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var h=ye(Fe(),1),wt=[{id:"backlog",labelKey:"sessions.kanban.backlog"},{id:"todo",labelKey:"sessions.kanban.todo"},{id:"in_progress",labelKey:"sessions.kanban.inProgress"},{id:"in_review",labelKey:"sessions.kanban.inReview"},{id:"done",labelKey:"sessions.kanban.done"}],vn=50;function Ct(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function us(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function ms(e){return e.agentAttention?.reason?e.agentAttention.reason:e.agentAttention?o("sessions.board.signalAgent"):e.pendingRepo?o("sessions.board.signalRepo"):e.tuiPromptActive?o("sessions.board.signalPrompt"):e.status==="limited"?o("sessions.board.signalLimited"):""}function gs(e){let t=(s="")=>`<svg viewBox="0 0 14 14" aria-hidden="true"><circle cx="7" cy="7" r="5.4" fill="none" stroke="currentColor" stroke-width="1.6"${s}/>`;switch(e){case"backlog":return`${t(' stroke-dasharray="1.6 2.1"')}</svg>`;case"in_progress":return`${t()}<path d="M7,7 L7,3.6 A3.4,3.4 0 0 1 7,10.4 Z" fill="currentColor"/></svg>`;case"in_review":return`${t()}<path d="M7,7 L7,3.6 A3.4,3.4 0 1 1 3.6,7 Z" fill="currentColor"/></svg>`;case"done":return'<svg viewBox="0 0 14 14" aria-hidden="true"><circle cx="7" cy="7" r="6.2" fill="currentColor"/><path d="M4.4 7.2 6.2 9 9.7 5.4" fill="none" stroke="var(--surface)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>';default:return`${t()}</svg>`}}function Ie(e){return{__html:e}}function Xe(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function fs(e){return ee(e.title)||e.sessionId}function Nt(e){let t=[],s=new Map;for(let g of e){let m=String(g.chatId??g.sessionId),u=s.get(m);u||(u={chatId:m,rows:[]},s.set(m,u),t.push(u)),u.rows.push(g)}let i=[];return{clusters:t.map(g=>(i.push(...g.rows),g.rows.length<2?{type:"card",row:g.rows[0]}:{type:"cluster",chatId:g.chatId,rows:g.rows})),flat:i}}function St(e){let t=new Map(wt.map(i=>[i.id,[]]));for(let i of e)t.get(kt(i)).push(i);return{columns:wt.map(i=>{let r=(t.get(i.id)??[]).sort((p,N)=>Ce(p)-Ce(N)),g=0;i.id==="done"&&r.length>vn&&(g=r.length-vn,r=r.slice(0,vn));let{clusters:m,flat:u}=Nt(r);return t.set(i.id,u),{id:i.id,labelKey:i.labelKey,rows:r,clusters:m,hiddenCount:g}}),groups:t}}function bs(e){let t=new Map;for(let s of e){if(s.status==="closed")continue;let i=String(s.larkAppId||s.botName||"unknown"),r=t.get(i);r||(r={name:Q(s),larkAppId:s.larkAppId,rows:[]},t.set(i,r)),r.rows.push(s)}return[...t.values()].sort((s,i)=>s.name.localeCompare(i.name)).map(s=>{let i=s.rows.sort((g,m)=>Number(m.lastMessageAt??0)-Number(g.lastMessageAt??0)),{clusters:r}=Nt(i);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:i,clusters:r}})}function In(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function ps(e){if(e.groupBy==="bot"){let i=e.rows.filter(r=>!Xe(r));return{mode:"bot",columns:bs(i),groups:new Map,rowById:In(i),team:null,scope:null}}if(e.groupBy==="team"){if(!e.teamsLoaded)return{mode:"loading",groups:new Map,rowById:new Map,team:null,scope:null};let i=e.teams.find(I=>I.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(i??void 0),g=i?e.rows.filter(I=>r.has(String(I.chatId))):[],m=(e.teamBoardKey===i?.key?e.teamBoardData?.board:null)??{},u=(e.teamBoardKey===i?.key?e.teamBoardData?.remoteRows:null)??[],p=[...g,...u].map(I=>{let v=m[String(I.sessionId)];return v?{...I,kanbanColumn:v.column,kanbanPosition:v.position}:I}),{columns:N,groups:L}=St(p);return{mode:"flow",columns:N,groups:L,rowById:In(p),team:i,scope:{chats:r.size,sessions:p.length}}}let{columns:t,groups:s}=St(e.rows);return{mode:"flow",columns:t,groups:s,rowById:In(e.rows),team:null,scope:null}}function ys(e){let t=new Map;return e?.querySelectorAll(".kanban-col-list").forEach(s=>{let i=s.closest(".kanban-column")?.dataset.col;i&&s.scrollTop&&t.set(i,s.scrollTop)}),t}function hs(e,t){t?.size&&e?.querySelectorAll(".kanban-col-list").forEach(s=>{let i=s.closest(".kanban-column")?.dataset.col,r=i?t.get(i):void 0;r&&(s.scrollTop=r)})}function vt(e,t){for(let s of e.querySelectorAll(".kanban-card:not(.dragging)")){if(s.closest(".kanban-cluster.dragging"))continue;let i=s.getBoundingClientRect();if(t<i.top+i.height/2)return s}return null}function Pe(e){return(0,h.jsx)("button",{type:"button",className:`card-act kanban-card-act${e.className?` ${e.className}`:""}`,"data-action":e.action,title:e.label,"aria-label":e.label,onClick:t=>{t.stopPropagation(),e.onClick(t.currentTarget)},dangerouslySetInnerHTML:Ie(e.icon)})}function ks(e){let t=ee(e.row.title)||"",[s,i]=(0,T.useState)(t),r=(0,T.useRef)(null),g=(0,T.useRef)(!1);(0,T.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let m=(0,T.useCallback)(u=>{if(g.current)return;g.current=!0;let p=s.trim();u&&p&&p!==t&&e.onCommit(e.row,p),e.onCancel()},[t,e,s]);return(0,h.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:u=>i(u.currentTarget.value),onClick:u=>u.stopPropagation(),onBlur:()=>m(!0),onKeyDown:u=>{u.stopPropagation(),u.key==="Enter"?(u.preventDefault(),m(!0)):u.key==="Escape"&&(u.preventDefault(),m(!1))}})}function It(e){let{callbacks:t,row:s}=e,i=fs(s),r=Q(s),g=me(s),m=us(s.workingDir),u=ms(s),p=[g,m!=="-"?m:null].filter(Boolean).join(" \xB7 "),N=String(s.status??"unknown"),L=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",I=e.editingId===s.sessionId,v=t.selectedSessionIds.has(String(s.sessionId)),P=["kanban-card",v?"selected":"",L?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),H=L?null:(0,h.jsxs)("span",{className:"kanban-card-actions-rail",children:[(0,h.jsx)(Pe,{action:"history",icon:t.icons.history,label:o("sessions.history.title"),onClick:()=>t.onHistory(s)}),s.webPort?(0,h.jsx)(Pe,{action:"terminal",icon:t.icons.terminal,label:o("sessions.openTerminal"),onClick:()=>t.onOpenTerminal(s)}):null,s.feishuChatLink?(0,h.jsx)("a",{className:"card-act kanban-card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),onClick:A=>A.stopPropagation(),dangerouslySetInnerHTML:Ie(t.icons.feishu)}):null,(0,h.jsx)(Pe,{action:"lock",className:s.locked?"locked":"",icon:s.locked?t.icons.unlock:t.icons.lock,label:t.lockActionLabel(s),onClick:A=>t.onToggleLock(s,A)}),(0,h.jsx)(Pe,{action:"details",icon:t.icons.details,label:o("sessions.details"),onClick:()=>t.onDetails(s)}),t.canRestartSession(s)?(0,h.jsx)(Pe,{action:"restart",icon:t.icons.restart,label:o("sessions.restart"),onClick:A=>t.onRestart(s,A)}):null]});return(0,h.jsxs)("article",{className:P,"data-id":s.sessionId,tabIndex:0,role:"button","aria-pressed":v,draggable:!0,onClick:A=>e.onCardClick(s,A),onKeyDown:A=>e.onCardKeyDown(s,A),onDragStart:A=>e.onDragStartCard(s,A),children:[(0,h.jsxs)("div",{className:"kanban-card-top",children:[(0,h.jsx)("span",{className:`badge cli-${Ct(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,h.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,h.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,L?(0,h.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:L}),children:L}):null,H]}),(0,h.jsx)("div",{className:"kanban-card-title-row",children:I?(0,h.jsx)(ks,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,h.jsx)("p",{className:"kanban-card-title",title:String(s.title??i),onDoubleClick:A=>{A.stopPropagation(),e.cancelOpen(),L||e.onBeginEdit(s)},children:String(i).slice(0,140)})}),p||u?(0,h.jsxs)("div",{className:"kanban-card-meta-row",children:[p?(0,h.jsx)("p",{className:"kanban-card-desc",title:p,children:p}):(0,h.jsx)("span",{className:"kanban-card-desc kanban-card-desc-empty","aria-hidden":"true"}),u?(0,h.jsx)("span",{className:"session-signal",title:u,children:u}):null]}):null,(0,h.jsxs)("div",{className:"kanban-card-foot",children:[(0,h.jsx)("span",{className:"kanban-card-owner",dangerouslySetInnerHTML:Ie(`${ue({name:r,larkAppId:s.larkAppId,size:"sm"})}<span>${qn(r)}</span>`)}),(0,h.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:ke(s.lastMessageAt)}),(0,h.jsx)("span",{className:"kanban-card-dot","data-status":Ct(N),title:t.sessionStatusText(N)})]})]})]})}function Tt(e){let t=e.item;if(t.type==="card")return(0,h.jsx)(It,{...e.cardProps,row:t.row});let s=me(t.rows[0])??t.chatId,i=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,h.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${i?" dragging":""}`,"data-chat":t.chatId,children:[(0,h.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,h.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:Ie(Yn({chatId:t.chatId,name:s,size:"sm"}))}),(0,h.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,h.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,h.jsx)("button",{type:"button",className:"kanban-cluster-toggle","aria-expanded":e.expanded,title:o(e.expanded?"sessions.kanban.clusterCollapse":"sessions.kanban.clusterExpand"),"aria-label":o(e.expanded?"sessions.kanban.clusterCollapse":"sessions.kanban.clusterExpand"),onClick:r=>{r.stopPropagation(),e.onToggleExpanded()},children:(0,h.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,h.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,h.jsx)(It,{...e.cardProps,row:r},r.sessionId)):null]})}function Mt(e){let[t,s]=(0,T.useState)(e),[i,r]=(0,T.useState)(null),[g,m]=(0,T.useState)(null),[u,p]=(0,T.useState)(null),[N,L]=(0,T.useState)(null),[I,v]=(0,T.useState)(()=>new Set),P=(0,T.useRef)(null),H=(0,T.useRef)(null),A=(0,T.useRef)(null),G=(0,T.useRef)(new Map),q=(0,T.useRef)(new Map),V=(0,T.useRef)(g),F=!!i||!!g,D=(0,T.useCallback)(()=>{A.current!==null&&(clearTimeout(A.current),A.current=null)},[]),J=(0,T.useCallback)(k=>{H.current=ys(e.host),s(k)},[e.host]);(0,T.useEffect)(()=>{if(F){P.current=e;return}J(e)},[J,F,e]),(0,T.useEffect)(()=>{if(F||!P.current)return;let k=P.current;P.current=null,J(k)},[J,F]),(0,T.useLayoutEffect)(()=>{hs(e.host,H.current),H.current=null},[t,e.host]),(0,T.useEffect)(()=>{V.current=g},[g]),(0,T.useEffect)(()=>()=>D(),[D]);let M=(0,T.useMemo)(()=>ps(t),[t]);(0,T.useLayoutEffect)(()=>{G.current=M.groups,q.current=M.rowById},[M]),(0,T.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,T.useEffect)(()=>{t.groupBy==="team"&&M.mode==="flow"&&M.team&&t.onNeedTeamBoard(M.team)},[t,M]),(0,T.useEffect)(()=>{t.onTeamScope(M.mode==="flow"?M.scope:null)},[t,M]);let Y=(0,T.useCallback)(()=>{m(null),p(null),L(null)},[]),te=(0,T.useCallback)(k=>{v(S=>{let x=new Set(S);return x.has(k)?x.delete(k):x.add(k),x})},[]),C=(0,T.useCallback)(k=>{D(),!Xe(k)&&r(k.sessionId)},[D]),O=(0,T.useCallback)((k,S)=>{Xe(k)||S.target.closest("a, button, input, label")||(D(),A.current=setTimeout(()=>{A.current=null,t.onToggleSelect(k)},220))},[D,t]),j=(0,T.useCallback)((k,S)=>{S.key!=="Enter"&&S.key!==" "||S.target!==S.currentTarget||Xe(k)||(S.preventDefault(),t.onToggleSelect(k))},[t]),E=(0,T.useCallback)((k,S)=>{t.groupBy!=="bot"&&(D(),m({kind:"card",id:String(k.sessionId)}),S.dataTransfer&&(S.dataTransfer.effectAllowed="move",S.dataTransfer.setData("text/plain",String(k.sessionId))))},[D,t.groupBy]),K=(0,T.useCallback)((k,S,x)=>{t.groupBy!=="bot"&&(D(),m({kind:"cluster",chatId:k,col:S}),x.dataTransfer&&(x.dataTransfer.effectAllowed="move",x.dataTransfer.setData("text/plain",`cluster:${k}`)))},[D,t.groupBy]),Se=(0,T.useCallback)((k,S)=>{!V.current||t.groupBy==="bot"||(S.preventDefault(),S.dataTransfer&&(S.dataTransfer.dropEffect="move"),p(k),L(vt(S.currentTarget,S.clientY)?.dataset.id??null))},[t.groupBy]),We=(0,T.useCallback)((k,S)=>{let x=V.current;if(!x||t.groupBy==="bot")return;S.preventDefault();let be=vt(S.currentTarget,S.clientY);Y();let _=G.current,W=k;if(x.kind==="cluster"){let se=(_.get(x.col)??[]).filter(X=>String(X.chatId)===x.chatId).filter(X=>!(X.status==="closed"&&W!=="done"));if(!se.length)return;let Ne=new Set(se.map(X=>X.sessionId)),de=(_.get(W)??[]).filter(X=>!Ne.has(X.sessionId)),oe=be?de.findIndex(X=>X.sessionId===be.dataset.id):de.length;oe<0&&(oe=de.length);let He=oe>0?de[oe-1]:null,Me=oe<de.length?de[oe]:null,Ge=Sn(He?Ce(He):null,Me?Ce(Me):null);t.onMoveRows(se.map((X,qe)=>({row:X,column:W,position:Ge+qe*.001})));return}let pe=q.current.get(x.id);if(!pe||pe.status==="closed"&&W!=="done")return;let Z=(_.get(W)??[]).filter(se=>se.sessionId!==x.id),le=be?Z.findIndex(se=>se.sessionId===be.dataset.id):Z.length;le<0&&(le=Z.length);let Oe=le>0?Z[le-1]:null,$e=le<Z.length?Z[le]:null,Te=Sn(Oe?Ce(Oe):null,$e?Ce($e):null);t.onMoveRows([{row:pe,column:W,position:Te}])},[Y,t]),z={dragId:g?.kind==="card"?g.id:null,dropBeforeId:N,editingId:i,groupBy:t.groupBy,callbacks:t,cancelOpen:D,onBeginEdit:C,onCardClick:O,onCardKeyDown:j,onDragStartCard:E,onEditDone:()=>r(null)};return M.mode==="loading"?(0,h.jsx)(ge,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):M.mode==="bot"?M.columns.length?(0,h.jsx)(h.Fragment,{children:M.columns.map(k=>(0,h.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":k.key,children:[(0,h.jsxs)("header",{children:[(0,h.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:Ie(ue({name:k.name,larkAppId:k.larkAppId,size:"sm"}))}),(0,h.jsx)("h2",{children:k.name}),(0,h.jsx)("span",{className:"kanban-col-count",children:k.rows.length})]}),(0,h.jsx)("div",{className:"kanban-col-list",onDragOver:S=>Se(k.key,S),onDragEnd:Y,children:k.clusters.map(S=>(0,h.jsx)(Tt,{item:S,dragCluster:g?.kind==="cluster"?g:null,cardProps:z,expanded:S.type==="cluster"&&I.has(`bot:${k.key}:${S.chatId}`),onToggleExpanded:()=>{S.type==="cluster"&&te(`bot:${k.key}:${S.chatId}`)},onDragStartCluster:K},S.type==="card"?S.row.sessionId:S.chatId))})]},k.key))}):(0,h.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,h.jsx)(h.Fragment,{children:M.columns.map(k=>(0,h.jsxs)("section",{className:`kanban-column kanban-${k.id}${u===k.id?" drag-over":""}`,"data-col":k.id,onDragOver:S=>Se(k.id,S),onDrop:S=>We(k.id,S),onDragEnd:Y,children:[(0,h.jsxs)("header",{children:[(0,h.jsx)("span",{className:"kanban-col-icon",dangerouslySetInnerHTML:Ie(gs(k.id))}),(0,h.jsx)("h2",{children:o(k.labelKey)}),(0,h.jsx)("span",{className:"kanban-col-count",children:k.rows.length+k.hiddenCount})]}),(0,h.jsxs)("div",{className:"kanban-col-list",children:[k.rows.length?k.clusters.map(S=>(0,h.jsx)(Tt,{item:S,columnId:k.id,dragCluster:g?.kind==="cluster"?g:null,cardProps:z,expanded:S.type==="cluster"&&I.has(`${k.id}:${S.chatId}`),onToggleExpanded:()=>{S.type==="cluster"&&te(`${k.id}:${S.chatId}`)},onDragStartCluster:K},S.type==="card"?S.row.sessionId:S.chatId)):(0,h.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),k.hiddenCount?(0,h.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:k.hiddenCount})}):null]})]},k.id))})}var n=ye(Fe(),1);function ws(e){return e===168?"7d":`${e}H`}var Cs=mn.map(e=>({value:String(e),label:ws(e)}));function ne(e){return{__html:e}}function ie(){return typeof window>"u"?void 0:window.localStorage}function Ve(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${pn(t)}`,children:Be(t)})}function Mn(e){return e.row.locked?(0,n.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null}function re(e){let t=e.className??`card-act${e.kind?` ${e.kind}`:""}`;return(0,n.jsx)("button",{type:"button",id:e.id,className:t,"data-action":e.action,title:e.label,"aria-label":e.label,disabled:e.disabled,onClick:s=>{s.stopPropagation(),e.onClick(s.currentTarget)},dangerouslySetInnerHTML:ne(e.icon)})}function At(e){if(!e.url)return null;let t=!wn();return(0,n.jsx)("span",{className:`term-pill${t?" readonly":" writable"}`,children:t?(0,n.jsx)("a",{className:"term-btn term-open",href:e.url,target:"_blank",rel:"noopener",title:o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:ne(B.terminal)}):(0,n.jsx)("button",{type:"button",className:"term-btn term-write","data-action":"write-link",title:o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>{s.stopPropagation(),gt(e.row,s.currentTarget)},dangerouslySetInnerHTML:ne(B.terminal)})})}function Et(e){let t=e.row;return t.scope!=="chat"||!t.feishuChatLink?null:(0,n.jsx)("a",{className:e.className??"card-act",href:t.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.openChat"),"aria-label":o("sessions.openChat"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:ne(B.feishu)})}function Ss(e){let t=e.sortKey===e.sort;return(0,n.jsx)("th",{"data-sort":e.sort,"data-label":e.label,className:t?"sorted":void 0,"aria-sort":t?e.sortDir==="asc"?"ascending":"descending":"none",onClick:()=>e.onSort(e.sort),children:t?`${e.label} ${e.sortDir==="asc"?"\u25B2":"\u25BC"}`:e.label})}function Lt(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?je(e.tokenUsage?.in)??-1:t==="tokenOut"?je(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?we(e).toLowerCase():String(e[t]??"").toLowerCase()}function vs(e,t,s,i){let r=Lt(e,s),g=Lt(t,s),m=0;return typeof r=="number"&&typeof g=="number"?m=r-g:typeof r=="boolean"&&typeof g=="boolean"?m=Number(r)-Number(g):m=String(r).localeCompare(String(g)),m===0&&(m=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),i==="asc"?m:-m}function Is(e){return e.agentAttention?.reason?e.agentAttention.reason:e.agentAttention?o("sessions.board.signalAgent"):e.pendingRepo?o("sessions.board.signalRepo"):e.tuiPromptActive?o("sessions.board.signalPrompt"):e.status==="limited"?o("sessions.board.signalLimited"):""}function Ts(e,t,s){let i=s==="needs-you"?Ue(e):Number(e.lastMessageAt??0),r=s==="needs-you"?Ue(t):Number(t.lastMessageAt??0);return i!==r?s==="needs-you"?i-r:r-i:String(e.title??e.sessionId).localeCompare(String(t.title??t.sessionId))}function Ns(e){if(e==null||e==="")return"";let t=Number(e),s=Number.isFinite(t)&&t>0?new Date(t):new Date(String(e));return Number.isNaN(s.getTime())?"":s.toLocaleString()}function Ms(e){return e===void 0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m${Math.round(e%6e4/1e3)}s`}function Ln(e,t){(0,c.useEffect)(()=>{let s=e.current;if(s)if(t){if(!s.open)try{s.showModal()}catch{}}else s.open&&s.close()},[t,e])}function Tn(e){let[t,s]=(0,c.useState)(!1);return(0,n.jsx)("button",{type:"button","data-copy":e.value,onClick:()=>{navigator.clipboard.writeText(e.value),s(!0),window.setTimeout(()=>s(!1),800)},children:t?o("sessions.copied"):o("sessions.copy")})}function Ls(e){let[t,s]=(0,c.useState)(0),[i,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let g=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(g)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:i||t>0,onClick:async()=>{r(!0);let g=await e.locateSession(e.row);r(!1),g&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):i?o("sessions.locating"):o("sessions.locate")})}function As(e){let[t,s]=(0,c.useState)(0),[i,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let g=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(g)},[t]),(0,n.jsx)(re,{action:"locate",icon:B.pin,label:t>0?o("sessions.cooldown",{seconds:t}):o("sessions.locate"),disabled:i||t>0,onClick:async()=>{r(!0);let g=await e.onLocate(e.row);r(!1),g&&s(30)}})}function Es(e){let t=fe.filter(i=>e.selected.has(i)).length,s=(0,c.useRef)(null);return(0,c.useEffect)(()=>{let i=()=>{s.current?.open&&(s.current.open=!1)},r=m=>{let u=s.current;u?.open&&!u.contains(m.target)&&i()},g=m=>{m.key==="Escape"&&i()};return document.addEventListener("pointerdown",r,!0),document.addEventListener("keydown",g),()=>{document.removeEventListener("pointerdown",r,!0),document.removeEventListener("keydown",g)}},[]),(0,n.jsxs)("details",{className:"filter-cli",ref:s,children:[(0,n.jsxs)("summary",{children:[o("sessions.cli")," \xB7 ",(0,n.jsx)("b",{id:"cli-filter-count",className:t===fe.length?void 0:"cli-filter-active",children:t===fe.length?o("common.all"):`${t}/${fe.length}`})]}),(0,n.jsx)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:fe.map(i=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:i,checked:e.selected.has(i),onChange:r=>e.onToggle(i,r.currentTarget.checked)}),(0,n.jsx)("span",{children:i})]},i))})]})}function xs(e){let t=[{value:"",label:o("sessions.anyStatus")},...ct.map(u=>({value:u,label:Be(u)}))],s=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],i=t.find(u=>u.value===e.filters.status)?.label??o("sessions.anyStatus"),r=s.find(u=>u.value===e.filters.adopt)?.label??o("sessions.adoptAny"),g=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],m=g.find(u=>u.value===e.filters.chat)?.label??o("sessions.chatAny");return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters",onSubmit:u=>u.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:u=>e.setFilters(p=>({...p,q:u.currentTarget.value}))}),(0,n.jsx)(Re,{label:i,value:e.filters.status,options:t,onChange:u=>e.setFilters(p=>({...p,status:u}))}),(0,n.jsx)(Re,{label:r,value:e.filters.adopt,options:s,onChange:u=>e.setFilters(p=>({...p,adopt:u}))}),(0,n.jsx)(Re,{ariaLabel:o("sessions.location"),label:m,value:e.filters.chat,options:g,onChange:u=>e.setFilters(p=>({...p,chat:u}))}),(0,n.jsx)(Es,{selected:e.filters.cli,onToggle:(u,p)=>{e.setFilters(N=>{let L=new Set(N.cli);return p?L.add(u):L.delete(u),{...N,cli:L}})}}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"showUnknownChats",checked:e.filters.showUnknownChats,onChange:u=>{let p=u.currentTarget.checked;Vn(ie(),p),e.setFilters(N=>({...N,showUnknownChats:p}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.showUnknownChats")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"active",checked:e.filters.active,onChange:u=>e.setFilters(p=>({...p,active:u.currentTarget.checked}))}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.activeOnly")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsx)(Bs,{...e.idleCleanup})]})}function Rs(e){let t=!!e.closeProgress||!!e.lockProgress,s=e.lockProgress?.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.lockSelected"),i=e.lockProgress&&!e.lockProgress.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.unlockSelected");return(0,n.jsxs)("div",{id:"bulk-bar",className:"bulk-bar",hidden:e.selectedCount===0,children:[(0,n.jsx)("span",{id:"bulk-count",children:o("sessions.selectedCount",{count:e.selectedCount})}),(0,n.jsx)("button",{type:"button",id:"bulk-monitor-room",disabled:t||e.selectedCount===0,onClick:e.onAddToMonitorRoom,children:e.monitorRoomText??o("sessions.addToMonitorRoom")}),(0,n.jsx)("button",{type:"button",id:"bulk-lock",disabled:t||e.lockDisabled,onClick:()=>e.onLock(!0),children:s}),(0,n.jsx)("button",{type:"button",id:"bulk-unlock",disabled:t||e.unlockDisabled,onClick:()=>e.onLock(!1),children:i}),(0,n.jsx)("button",{type:"button",id:"bulk-close",className:"contrast",disabled:t,onClick:e.onClose,children:e.closeProgress?`${e.closeProgress.done}/${e.closeProgress.total}`:o("sessions.closeSelected")}),(0,n.jsx)("button",{type:"button",id:"bulk-clear",disabled:t,onClick:e.onClear,children:o("sessions.clearSelection")})]})}function Bs(e){let[t,s]=(0,c.useState)(!1),[i,r]=(0,c.useState)(e.hours),[g,m]=(0,c.useState)(),u=(0,c.useRef)(null),p=(0,c.useRef)(null),N=(0,c.useRef)(null),L=e.countForHours(i);return(0,c.useEffect)(()=>{t?r(e.hours):m(void 0)},[t,e.hours]),(0,c.useLayoutEffect)(()=>{if(!t)return;let I=()=>{let P=p.current,H=N.current;if(!P||!H)return;let A=12,G=window.innerWidth,q=window.innerHeight,V=Math.max(0,Math.min(292,G-A*2)),F=P.getBoundingClientRect(),D=H.offsetHeight,J=Math.max(A,G-V-A),M=F.left+F.width/2-V/2,Y=Math.min(Math.max(M,A),J),te=F.bottom+8,C=F.top-D-8,O=te+D<=q-A||C<A?Math.min(Math.max(te,A),Math.max(A,q-D-A)):Math.max(A,C);m({left:Y,top:O,width:V})},v=window.requestAnimationFrame(I);return window.addEventListener("resize",I),window.addEventListener("scroll",I,!0),()=>{window.cancelAnimationFrame(v),window.removeEventListener("resize",I),window.removeEventListener("scroll",I,!0)}},[t,e.busy,e.status]),(0,c.useEffect)(()=>{if(!t)return;let I=P=>{let H=P.target;H instanceof Node&&u.current?.contains(H)||H instanceof Node&&N.current?.contains(H)||s(!1)},v=P=>{P.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",I,!0),document.addEventListener("keydown",v),()=>{document.removeEventListener("pointerdown",I,!0),document.removeEventListener("keydown",v)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${L===0?" is-empty":""}${t?" is-open":""}`,ref:u,children:[(0,n.jsxs)("button",{ref:p,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(I=>!I),children:[(0,n.jsxs)("svg",{className:"idle-cleanup-icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,n.jsx)("path",{d:"M3.5 6.5h17"}),(0,n.jsx)("path",{d:"M9 3.5h6"}),(0,n.jsx)("path",{d:"m6.5 6.5.9 13h9.2l.9-13"}),(0,n.jsx)("path",{d:"M10 10.5v5M14 10.5v5"})]}),(0,n.jsx)("span",{children:o("sessions.idleCleanupRun")})]}),t&&typeof document<"u"?(0,Nn.createPortal)((0,n.jsxs)("div",{ref:N,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:g??{visibility:"hidden"},children:[(0,n.jsxs)("div",{className:"idle-cleanup-pop-head",children:[(0,n.jsx)("span",{className:"idle-cleanup-pop-title",children:o("sessions.idleCleanupRun")}),(0,n.jsxs)("span",{id:"idle-cleanup-count",className:"idle-cleanup-count",children:[(0,n.jsx)("span",{className:"idle-cleanup-dot","aria-hidden":"true"}),o("sessions.idleCleanupCount",{count:L})]})]}),(0,n.jsxs)("div",{className:"idle-cleanup-pop-field",children:[(0,n.jsx)("span",{className:"idle-cleanup-label",children:o("sessions.idleCleanupOlderThan")}),(0,n.jsx)("div",{id:"idle-cleanup-threshold",className:"idle-cleanup-threshold-options",role:"radiogroup","aria-label":o("sessions.idleCleanupThreshold"),children:Cs.map(I=>{let v=gn(I.value),P=v===i;return(0,n.jsx)("button",{type:"button",className:P?"active":void 0,"aria-pressed":P?"true":"false",disabled:e.busy,onClick:()=>r(v),children:I.label},I.value)})})]}),e.busy&&e.status?(0,n.jsx)("span",{id:"idle-cleanup-status",className:"idle-cleanup-status","aria-live":"polite",children:e.status}):null,(0,n.jsxs)("div",{className:"idle-cleanup-pop-actions",children:[(0,n.jsx)("button",{type:"button",className:"idle-cleanup-cancel",disabled:e.busy,onClick:()=>s(!1),children:o("sessions.idleCleanupCancel")}),(0,n.jsx)("button",{type:"button",className:"idle-cleanup-confirm",disabled:e.busy||L===0,onClick:()=>{e.onRun(i).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function Ds(e){let t=(0,c.useRef)(null);(0,c.useLayoutEffect)(()=>{t.current&&(t.current.indeterminate=e.selectAllIndeterminate)},[e.selectAllIndeterminate]);let s=[["botName",o("sessions.bot")],["cliId",o("sessions.cli")],["status",o("sessions.status")],["chat",o("sessions.location")],["tokenIn",o("sessions.tokenIn")],["tokenOut",o("sessions.tokenOut")],["title",o("sessions.titleCol")],["workingDir",o("sessions.workingDir")],["spawnedAt",o("sessions.created")],["lastMessageAt",o("sessions.last")],["adopt",o("sessions.adopt")]],i={select:o("sessions.selectSession"),botName:o("sessions.bot"),cliId:o("sessions.cli"),status:o("sessions.status"),chat:o("sessions.location"),tokenIn:o("sessions.tokenIn"),tokenOut:o("sessions.tokenOut"),title:o("sessions.titleCol"),workingDir:o("sessions.workingDir"),spawnedAt:o("sessions.created"),lastMessageAt:o("sessions.last"),adopt:o("sessions.adopt"),actions:o("sessions.actions")};return(0,n.jsxs)("table",{id:"sessions-table",hidden:e.hidden,children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:(0,n.jsx)("input",{ref:t,type:"checkbox",id:"select-all",title:o("sessions.activeOnly"),checked:e.selectAllChecked,disabled:e.selectAllDisabled,onChange:r=>e.onSelectAll(r.currentTarget.checked)})}),s.map(([r,g])=>(0,n.jsx)(Ss,{sort:r,label:g,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},r)),(0,n.jsx)("th",{children:o("sessions.actions")})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(r=>{let g=r.status==="closed",m=String(r.sessionId);return(0,n.jsxs)("tr",{"data-id":m,onClick:()=>e.onOpen(r),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":i.select,onClick:u=>u.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(m),disabled:g,onChange:u=>e.onSelect(m,u.currentTarget.checked)})}),(0,n.jsx)("td",{"data-label":i.botName,children:Q(r)}),(0,n.jsx)("td",{"data-label":i.cliId,children:(0,n.jsx)("span",{className:`badge cli-${pn(r.cliId)}`,children:r.cliId??"unknown"})}),(0,n.jsxs)("td",{"data-label":i.status,children:[(0,n.jsx)(Ve,{status:r.status}),(0,n.jsx)(Mn,{row:r})]}),(0,n.jsx)("td",{className:"session-location-cell","data-label":i.chat,title:kn(r),children:we(r)}),(0,n.jsx)("td",{className:"token-cell","data-label":i.tokenIn,children:fn(r.tokenUsage?.in)}),(0,n.jsx)("td",{className:"token-cell","data-label":i.tokenOut,children:fn(r.tokenUsage?.out)}),(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":i.title,title:String(r.title??""),children:ee(r.title??"").slice(0,48)}),(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":i.workingDir,title:r.workingDir??"",children:String(r.workingDir??"").slice(-34)}),(0,n.jsx)("td",{"data-label":i.spawnedAt,children:ke(r.spawnedAt)}),(0,n.jsx)("td",{"data-label":i.lastMessageAt,children:ke(r.lastMessageAt)}),(0,n.jsx)("td",{"data-label":i.adopt,children:r.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null}),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":i.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},m)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:13,className:"empty",children:o("sessions.empty")})})})]})}function Ps(e){let t=e.row,s=ee(t.title)||t.sessionId,i=Q(t),r=me(t),g=De(t),m=Is(t),u=yn(t.workingDir),p=N=>{N.target.closest("a, button, input, label")||e.onToggleSelect(t)};return(0,n.jsxs)("article",{className:`session-card${e.selected?" selected":""}${t.locked?" locked":""}`,"data-id":t.sessionId,"aria-pressed":e.selected,onClick:p,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:ne(ue({name:i,larkAppId:t.larkAppId,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-card-title",children:[(0,n.jsx)("strong",{title:String(t.title??s),children:String(s).slice(0,72)}),(0,n.jsxs)("span",{children:[i," \xB7 ",r??t.cliId??"unknown"]})]}),(0,n.jsxs)("span",{className:"session-card-status-group",children:[(0,n.jsx)(Ve,{status:t.status}),(0,n.jsx)(Mn,{row:t})]})]}),u!=="-"||t.adopt||m?(0,n.jsxs)("div",{className:"session-card-meta",children:[u!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:u}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,m?(0,n.jsx)("span",{className:"session-signal",title:m,children:m}):null]}):null,(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${ke(Ue(t))}`:`${o("sessions.last")}: ${ke(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(Et,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(As,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(re,{action:"details",icon:B.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),ze(t)?(0,n.jsx)(re,{action:"restart",icon:B.restart,label:o("sessions.restart"),onClick:N=>e.onRestart(t,N)}):null,(0,n.jsx)(At,{row:t,url:g}),(0,n.jsx)(re,{action:"lock",icon:t.locked?B.unlock:B.lock,label:Je(t),kind:t.locked?"locked":"",onClick:N=>e.onLock(t,!t.locked,N)}),(0,n.jsx)(re,{action:"close",icon:B.close,label:o("sessions.close"),kind:"danger",onClick:N=>e.onClose(t,N)})]})]})}function Os(e){(0,c.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(bn.map(i=>[i.id,[]]));for(let i of e.rows){let r=ft(i);r&&t.get(r).push(i)}let s=e.order.map(i=>bn.find(r=>r.id===i)).filter(i=>!!i);return(0,n.jsx)("div",{id:"sessions-board",className:`sessions-board${e.animated||e.hidden?"":" board-enter"}`,hidden:e.hidden,children:s.map((i,r)=>{let g=(t.get(i.id)??[]).sort((m,u)=>Ts(m,u,i.id));return(0,n.jsxs)("section",{className:`session-board-column session-board-${i.id}${e.dragColId===i.id?" dragging":""}${e.dragOverCol===i.id?" drag-over":""}`,"data-col":i.id,onDragOver:m=>{e.dragColId&&(m.preventDefault(),m.dataTransfer&&(m.dataTransfer.dropEffect="move"),e.dragColId!==i.id&&e.onDragOverCol(i.id))},onDrop:m=>{e.dragColId&&(m.preventDefault(),e.onMoveColumnTo(e.dragColId,i.id),e.onDragCol(null),e.onDragOverCol(null))},children:[(0,n.jsxs)("header",{draggable:!0,title:o("sessions.board.dragHint"),onDragStart:m=>{e.onDragCol(i.id),m.dataTransfer&&(m.dataTransfer.effectAllowed="move",m.dataTransfer.setData("text/plain",i.id))},onDragEnd:()=>{e.onDragCol(null),e.onDragOverCol(null)},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{children:o(i.labelKey)}),(0,n.jsx)("p",{children:o(i.hintKey)})]}),(0,n.jsxs)("span",{className:"session-board-head-right",children:[(0,n.jsxs)("span",{className:"session-board-move",children:[(0,n.jsx)("button",{type:"button","data-move-col":i.id,"data-dir":"-1","aria-label":o("sessions.board.moveLeft"),disabled:r===0,onClick:()=>e.onMoveColumn(i.id,-1),children:"\u2039"}),(0,n.jsx)("button",{type:"button","data-move-col":i.id,"data-dir":"1","aria-label":o("sessions.board.moveRight"),disabled:r===s.length-1,onClick:()=>e.onMoveColumn(i.id,1),children:"\u203A"})]}),(0,n.jsx)("span",{className:"session-board-count",children:g.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:g.length?g.map(m=>(0,n.jsx)(Ps,{row:m,selected:e.selected.has(m.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},m.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},i.id)})})}function $s(e){let t=e.message,s=t.senderType==="user",i=t.senderType==="app"||t.senderType==="bot",r=s?t.senderName||(e.ownerOpenId&&t.senderId===e.ownerOpenId?o("sessions.history.owner"):o("sessions.history.user")):t.senderName||String(t.senderId??"").slice(0,16)||o(i?"sessions.history.bot":"sessions.history.system"),g=String(t.content??"").trim()||`[${t.msgType??"message"}]`;return(0,n.jsxs)("div",{className:`history-msg${e.groupStart?" group-start":" continuation"}`,children:[e.groupStart?s?t.senderAvatar?(0,n.jsx)("img",{className:"history-avatar-img",src:String(t.senderAvatar),alt:"",decoding:"async",referrerPolicy:"no-referrer"}):(0,n.jsx)("span",{className:"history-avatar-user","aria-hidden":"true",children:String(r).slice(0,1)}):(0,n.jsx)("span",{className:"history-avatar-bot",dangerouslySetInnerHTML:ne(ue({name:r,larkAppId:t.senderBotAppId,avatarUrl:t.senderAvatar,size:"sm"}))}):(0,n.jsx)("span",{className:"history-avatar-spacer","aria-hidden":"true"}),(0,n.jsxs)("div",{className:"history-msg-main",children:[e.groupStart?(0,n.jsxs)("div",{className:"history-msg-meta",children:[(0,n.jsx)("span",{children:r}),(0,n.jsx)("time",{children:Ns(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:g})]})]})}function Hs(e){let t=(0,c.useRef)(null);Ln(t,!!e.state);let s=e.state?he.sessions.get(e.state.sessionId):null,i=(0,c.useRef)(null),r=!!e.state&&!e.state.loading&&!e.state.error&&e.state.messages.length>0;return(0,c.useEffect)(()=>{if(!r)return;let g=i.current;g&&(g.scrollTop=g.scrollHeight)},[r,e.state?.sessionId,e.state?.messages.length]),(0,n.jsx)("dialog",{id:"history-modal",className:"history-modal",ref:t,onClose:e.onClose,onClick:g=>{g.target===g.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:ne(ue({name:Q(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(ee(s.title)||s.sessionId).slice(0,60)}),(0,n.jsx)("span",{className:"history-scope-tag",children:o("sessions.history.title")})]}),(0,n.jsx)("span",{className:"term-modal-actions",children:(0,n.jsx)(re,{id:"history-close",icon:B.close,label:o("sessions.dismiss"),onClick:e.onClose})})]}),(0,n.jsxs)("div",{className:"history-body",ref:i,children:[e.state.loading?(0,n.jsx)(ge,{label:o("sessions.history.loading"),className:"term-modal-loading",compact:!0}):null,!e.state.loading&&e.state.error?(0,n.jsxs)("div",{className:"history-error",children:[o("sessions.history.fail"),": ",e.state.error,e.state.stale?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("span",{children:o("sessions.history.staleHint")})]}):null]}):null,!e.state.loading&&!e.state.error&&e.state.messages.length===0?(0,n.jsx)("div",{className:"history-error",children:o("sessions.history.empty")}):null,!e.state.loading&&!e.state.error&&e.state.messages.length>0?(0,n.jsx)("div",{className:"history-list",children:e.state.messages.map((g,m,u)=>(0,n.jsx)($s,{message:g,ownerOpenId:e.state?.ownerOpenId,groupStart:m===0||Cn(u[m-1])!==Cn(g)},g.messageId??m))}):null]})]}):null})}function Ks(e){let[t,s]=(0,c.useState)(!1),[i,r]=(0,c.useState)(""),g=(0,c.useRef)(null),m=ee(e.row.title)||e.row.sessionId;(0,c.useLayoutEffect)(()=>{if(!t||!g.current)return;let p=g.current;p.focus(),p.select(),(()=>{let L=getComputedStyle(p),I=document.createElement("span");I.style.cssText="position:absolute;visibility:hidden;white-space:pre",I.style.fontSize=L.fontSize,I.style.fontFamily=L.fontFamily,I.style.fontWeight=L.fontWeight,I.style.letterSpacing=L.letterSpacing,I.textContent=p.value||" ",document.body.appendChild(I);let v=Math.round(window.innerWidth*.6);p.style.width=`${Math.min(Math.max(I.offsetWidth+22,80),v)}px`,I.remove()})()},[t,i]);let u=p=>{let N=i.trim();s(!1),p&&N&&N!==m&&e.onRename(e.row,N)};return t?(0,n.jsx)("input",{ref:g,type:"text",className:"term-modal-name-input",maxLength:200,value:i,onChange:p=>r(p.currentTarget.value),onBlur:()=>u(!0),onKeyDown:p=>{p.stopPropagation(),p.key==="Enter"?(p.preventDefault(),u(!0)):p.key==="Escape"&&(p.preventDefault(),u(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??m),children:String(m).slice(0,60)}),(0,n.jsx)(re,{id:"term-modal-edit",icon:B.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(ee(e.row.title)||""),s(!0)}})]})}function _s(e){let t=(0,c.useRef)(null);Ln(t,!!e.state);let s=e.state?he.sessions.get(e.state.sessionId):null,i=s?De(s):null,r=e.state?.url??i??"",g=s?String(s.cliId??"unknown"):"",m=s?yn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:u=>{u.target===u.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:ne(ue({name:Q(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsxs)("span",{className:"term-modal-title-copy",children:[(0,n.jsxs)("span",{className:"term-modal-title-main",children:[(0,n.jsx)(Ks,{row:s,onRename:e.onRename}),(0,n.jsx)(Ve,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:Q(s)}),(0,n.jsx)("span",{children:g}),m!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:m}):null]})]})]}),(0,n.jsxs)("span",{className:"term-modal-actions",children:[s.feishuChatLink?(0,n.jsx)("a",{className:"card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),dangerouslySetInnerHTML:ne(B.feishu)}):null,(0,n.jsx)("a",{id:"term-modal-tab",className:"card-act",href:r,target:"_blank",rel:"noopener",title:o("sessions.kanban.openTab"),"aria-label":o("sessions.kanban.openTab"),dangerouslySetInnerHTML:ne(B.terminal)}),(0,n.jsx)(re,{id:"term-modal-close",icon:B.close,label:o("sessions.dismiss"),onClick:e.onClose})]})]}),(0,n.jsx)("div",{className:"term-modal-body",children:(0,n.jsx)("div",{className:"term-modal-frame-shell",children:e.state.loading?(0,n.jsx)(ge,{label:o("sessions.kanban.terminalLoading"),className:"term-modal-loading",compact:!0}):(0,n.jsx)("iframe",{className:"term-modal-frame",src:r,allow:"clipboard-read; clipboard-write"})})})]}):null})}function Us(e){let[t,s]=(0,c.useState)(null);(0,c.useEffect)(()=>s(null),[e.row.sessionId]);let i=async()=>{s({loading:!0});try{let m=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-diff`),u=await m.json().catch(()=>({}));if(!u.ok){s({loading:!1,message:(0,n.jsxs)("p",{children:[o("sessions.landUnavailable"),": ",String(u.error??m.status)]})});return}if(u.empty){s({loading:!1,message:(0,n.jsx)("p",{children:o("sessions.landEmpty")})});return}let p=String(u.patch??"");s({loading:!1,diff:u,patch:p.slice(0,2e4)+(p.length>2e4?`
3
+ ...(truncated)`:"")})}catch(m){s({loading:!1,message:(0,n.jsxs)("p",{children:[o("sessions.landUnavailable"),": ",String(m)]})})}},r=async()=>{let m=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-land/apply`,{method:"POST"}),u=await m.json().catch(()=>({}));s({loading:!1,message:u.ok?(0,n.jsxs)("p",{children:[o("sessions.landApplied"),": ",u.files," files (+",u.insertions,"/-",u.deletions,") \u2192 ",(0,n.jsx)("code",{children:String(u.workingDir??"")})]}):(0,n.jsxs)("p",{children:[o("sessions.landFailed"),": ",String(u.error??m.status)]})})},g=async()=>{await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-land/discard`,{method:"POST"}),s({loading:!1,message:(0,n.jsx)("p",{children:o("sessions.landDiscarded")})})};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"land-btn",type:"button",disabled:t?.loading,onClick:()=>{i()},children:o("sessions.land")}),(0,n.jsxs)("div",{id:"land-area",children:[t?.loading?(0,n.jsx)(ge,{label:o("sessions.landLoading"),compact:!0}):null,t?.message,t?.diff&&t.patch!==void 0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:t.diff.files})," files (+",t.diff.insertions,"/-",t.diff.deletions,") \u2192 ",(0,n.jsx)("code",{children:String(t.diff.workingDir??"")})]}),(0,n.jsx)("pre",{style:{maxHeight:320,overflow:"auto",whiteSpace:"pre-wrap"},children:t.patch}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)("button",{id:"land-apply",type:"button",className:"primary",onClick:()=>{r()},children:o("sessions.landApply")}),(0,n.jsx)("button",{id:"land-discard",type:"button",className:"contrast",onClick:()=>{g()},children:o("sessions.landDiscard")})]})]}):null]})]})}function Fs(e){let t=e.report;if(!t||t.status!=="ok"){let p=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",p]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let i=[t.meta?.asOf?o("sessions.insightAsOf",{asOf:String(t.meta.asOf)}):null,t.meta?.partial?o("sessions.insightPartial"):null].filter(Boolean),r=Array.isArray(t.suggestions)?t.suggestions:[],g=Array.isArray(t.spans)?t.spans:[],m=p=>p==="bad"||p==="warn"?"!":"i",u=p=>p==="error"?"!":p==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[i.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:i.join(" \xB7 ")}):null,(0,n.jsx)("p",{children:o("sessions.insightMetrics",{total:String(s.totalSpans??0),failed:String(s.failedSpans??0),slow:String(s.slowSpans??0),rw:s.readWriteRatio===null||s.readWriteRatio===void 0?"-":String(s.readWriteRatio),compactions:String(s.compactions??0)})}),r.length?(0,n.jsxs)("details",{open:!0,children:[(0,n.jsx)("summary",{children:o("sessions.insightSuggestions")}),(0,n.jsx)("ul",{style:{paddingLeft:18,margin:"6px 0"},children:r.map((p,N)=>(0,n.jsxs)("li",{children:[m(String(p.severity??""))," ",(0,n.jsx)("b",{children:String(p.title??"")})," - ",String(p.action??""),Array.isArray(p.evidence)&&p.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:p.evidence.join("; ")})]}):null]},N))})]}):null,g.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",g.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??g.length),total:String(t.meta.spansTotal??g.length)})}):null,(0,n.jsx)("div",{style:{maxHeight:320,overflow:"auto"},children:(0,n.jsx)("table",{style:{width:"100%",fontSize:12},children:(0,n.jsx)("tbody",{children:[...g].sort((p,N)=>(p.relStartMs??0)-(N.relStartMs??0)).map((p,N)=>{let L=[p.inputSummary,p.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:p.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:u(String(p.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(p.tool??"")})}),(0,n.jsx)("td",{children:String(p.phase??"")}),(0,n.jsx)("td",{children:Ms(p.durationMs)}),(0,n.jsxs)("td",{children:["#",String(p.turnIndex??0)]}),(0,n.jsx)("td",{children:L})]},N)})})})})]}):null]})}function js(e){let[t,s]=(0,c.useState)(null);if((0,c.useEffect)(()=>s(null),[e.row.sessionId]),!ve.authed)return null;let i=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),g=await r.json().catch(()=>({}));!g.ok||!g.report?s({loading:!1,error:String(g.error??r.status)}):s({loading:!1,report:g.report})}catch(r){s({loading:!1,error:String(r)})}};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"insight-btn",type:"button",disabled:t?.loading,onClick:()=>{i()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(ge,{label:o("sessions.insightLoading"),compact:!0}):null,t?.error?(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",t.error]}):null,t?.report?(0,n.jsx)(Fs,{report:t.report}):null]})]})}function Js(e){let t=(0,c.useRef)(null);Ln(t,!!e.row);let s=e.row,i=s?De(s):null;return(0,n.jsx)("dialog",{id:"drawer",ref:t,onClose:e.onClose,onClick:r=>{r.target===r.currentTarget&&e.onClose()},children:s?(0,n.jsxs)("article",{children:[(0,n.jsxs)("header",{children:[(0,n.jsxs)("div",{className:"drawer-title-row",children:[(0,n.jsx)("h3",{children:ee(s.title)||s.sessionId}),(0,n.jsx)(re,{id:"drawer-close",className:"card-act drawer-close-btn",icon:B.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(Ve,{status:s.status}),(0,n.jsx)(Mn,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(Tn,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",Q(s)," \xB7 ",(0,n.jsxs)("b",{children:[o("sessions.cli"),":"]})," ",s.cliId??"?"]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.location"),":"]})," ",we(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(Tn,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(Tn,{value:s.rootMessageId??""})]}),s.threadId?(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"threadId:"})," ",(0,n.jsx)("code",{children:s.threadId})]}):null,(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.workingDir"),":"]})," ",s.workingDir??"-"]}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)(Et,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(Ls,{row:s,locateSession:e.locateSession}):null,(0,n.jsx)("button",{id:"history-drawer-btn",type:"button",onClick:()=>e.openHistory(s),children:o("sessions.history.title")}),(0,n.jsx)(At,{row:s,url:i}),ze(s)?(0,n.jsx)("button",{id:"restart-btn",type:"button",onClick:async r=>{await e.restartSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.restart")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"lock-btn",type:"button",onClick:r=>{e.setSessionLocked(s,!s.locked,r.currentTarget)},children:Je(s)}):null,s.queued&&s.status!=="closed"?(0,n.jsx)("button",{id:"start-btn",type:"button",className:"primary",onClick:async r=>{await e.startSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.create.start")}):null,s.status==="closed"?(0,n.jsx)("button",{id:"resume-btn",type:"button",className:"primary",onClick:async r=>{await e.resumeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.resume")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"close-btn",type:"button",className:"contrast",onClick:async r=>{await e.closeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.close")}):null,(0,n.jsx)(Us,{row:s}),(0,n.jsx)(js,{row:s})]})]}):null})}function zs(e){let t=e.state;(0,c.useEffect)(()=>{let C=e.dialog;return()=>{C.open&&C.close()}},[e.dialog]),(0,c.useEffect)(()=>{let C=e.dialog;if(t){if(!C.open)try{C.showModal()}catch{}}else C.open&&C.close()},[e.dialog,t]),(0,c.useEffect)(()=>{let C=e.dialog,O=()=>e.onClose(),j=E=>{E.target===C&&e.onClose()};return C.addEventListener("close",O),C.addEventListener("click",j),()=>{C.removeEventListener("close",O),C.removeEventListener("click",j)}},[e]);let[s,i]=(0,c.useState)(""),[r,g]=(0,c.useState)(new Set),[m,u]=(0,c.useState)("lead"),[p,N]=(0,c.useState)(""),[L,I]=(0,c.useState)("in_progress"),[v,P]=(0,c.useState)(""),[H,A]=(0,c.useState)(""),[G,q]=(0,c.useState)(!1),[V,F]=(0,c.useState)(!1);if((0,c.useEffect)(()=>{t&&(i(""),g(new Set),u("lead"),N(""),I("in_progress"),P(""),A(""),q(!1),F(!1))},[t]),!t)return null;if(t.success){let C=t.success,O=typeof C.shareLink=="string"&&C.shareLink?C.shareLink:"",j=Array.isArray(C.failed)?C.failed.length:0,E=Array.isArray(C.spawned)?C.spawned.length:0,K=C.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress");return(0,n.jsxs)("article",{className:"cs-card",children:[(0,n.jsx)("header",{className:"cs-header",children:(0,n.jsx)("h3",{children:o("sessions.create.doneTitle")})}),(0,n.jsxs)("p",{children:[K,"\uFF08",E,"\uFF09"]}),j>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(j)})}):null,O?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:O,target:"_blank",rel:"noopener",children:o("sessions.create.openChat")})}):null,(0,n.jsx)("div",{className:"actions",children:(0,n.jsx)("button",{type:"button",id:"cs-done",className:"primary",onClick:e.onClose,children:o("sessions.create.close")})})]})}if(t.loading)return(0,n.jsxs)("article",{className:"cs-card",children:[(0,n.jsx)("header",{className:"cs-header",children:(0,n.jsx)("h3",{children:o("sessions.create.title")})}),(0,n.jsx)(ge,{label:o("common.loading"),className:"cs-loading",compact:!0}),(0,n.jsx)("div",{className:"actions cs-actions",children:(0,n.jsx)("button",{type:"button",id:"cs-cancel",onClick:e.onClose,children:o("sessions.create.cancel")})})]});let D=t.bots,J=[...r],M=J,Y=C=>D.find(O=>O.larkAppId===C)?.botName??C,te=async C=>{C.preventDefault();let O=s.trim();if(!O){alert(o("sessions.create.errContent"));return}if(J.length===0){alert(o("sessions.create.errNoBot"));return}let j=p||J[0]||"";if(m==="lead"&&(!j||!J.includes(j))){alert(o("sessions.create.errLead"));return}F(!0);try{let E=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:O,larkAppIds:J,mode:m,column:L,leadLarkAppId:m==="lead"?j:void 0,name:v.trim()||void 0,bindWorkingDir:H.trim()||void 0})}),K=await E.json().catch(()=>null);E.ok&&K?.ok?e.onSuccess(K):E.status!==401&&alert(`${o("sessions.create.failed")}: ${K?.error??E.status}`)}catch(E){alert(`${o("sessions.create.failed")}: ${E}`)}finally{F(!1)}};return(0,n.jsxs)("article",{className:"cs-card",children:[(0,n.jsx)("header",{className:"cs-header",children:(0,n.jsx)("h3",{children:o("sessions.create.title")})}),(0,n.jsxs)("form",{id:"cs-form",onSubmit:te,children:[(0,n.jsxs)("fieldset",{className:"cs-content",children:[(0,n.jsx)("legend",{children:o("sessions.create.content")}),(0,n.jsx)("textarea",{name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),required:!0,value:s,onChange:C=>i(C.currentTarget.value)})]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),D.length?(0,n.jsx)("div",{className:"cs-bot-list",children:D.map(C=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:C.larkAppId,checked:r.has(C.larkAppId),onChange:O=>{let j=O.currentTarget.checked;g(E=>{let K=new Set(E);return j?K.add(C.larkAppId):K.delete(C.larkAppId),K.has(p)||N(K.values().next().value??""),K})}})," ",(0,n.jsx)("span",{children:C.botName})]},C.larkAppId))}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBots")})]}),(0,n.jsxs)("fieldset",{className:"cs-mode",children:[(0,n.jsx)("legend",{children:o("sessions.create.mode")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"lead",checked:m==="lead",onChange:()=>u("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:m==="all",onChange:()=>u("all")})," ",o("sessions.create.modeAll")]}),(0,n.jsx)("small",{children:o("sessions.create.modeHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-lead-row",hidden:m!=="lead",children:[(0,n.jsx)("legend",{children:o("sessions.create.lead")}),(0,n.jsx)("select",{name:"lead",disabled:M.length===0,value:M.includes(p)?p:"",onChange:C=>N(C.currentTarget.value),children:M.length?M.map(C=>(0,n.jsx)("option",{value:C,children:Y(C)},C)):(0,n.jsx)("option",{value:"",disabled:!0,children:o("sessions.create.leadPickFirst")})}),(0,n.jsx)("small",{children:o("sessions.create.leadHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-column",children:[(0,n.jsx)("legend",{children:o("sessions.create.column")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"in_progress",checked:L==="in_progress",onChange:()=>I("in_progress")})," ",o("sessions.create.columnInProgress")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"backlog",checked:L==="backlog",onChange:()=>I("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${G?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":G,"aria-controls":"cs-advanced-fields",onClick:()=>q(C=>!C),children:o("sessions.create.optionalConfig")})}),G?(0,n.jsxs)("div",{id:"cs-advanced-fields",className:"cs-advanced-fields",children:[(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.groupName")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"name",maxLength:60,placeholder:o("sessions.create.groupNamePlaceholder"),value:v,onChange:C=>P(C.currentTarget.value)})]}),(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.workingDir")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"bindWorkingDir",placeholder:"e.g. ~/projects/foo",value:H,onChange:C=>A(C.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),(0,n.jsxs)("div",{className:"actions cs-actions",children:[(0,n.jsx)("button",{type:"button",id:"cs-cancel",onClick:e.onClose,children:o("sessions.create.cancel")}),(0,n.jsx)("button",{type:"submit",className:"cs-submit",disabled:V||D.length===0,children:V?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function Xs(){tt();let e=nt(a=>[...a.sessions.values()]),[t,s]=(0,c.useState)(0),i=(0,c.useCallback)(()=>s(a=>a+1),[]),[r,g]=(0,c.useState)({q:"",status:"",adopt:"",chat:"",showUnknownChats:Jn(ie()),active:!0,cli:new Set(fe)}),[m,u]=(0,c.useState)(new Set),[p,N]=(0,c.useState)("lastMessageAt"),[L,I]=(0,c.useState)("desc"),[v,P]=(0,c.useState)(()=>jn(ie())),[H,A]=(0,c.useState)(()=>zn(ie())),[G,q]=(0,c.useState)(!1),[V,F]=(0,c.useState)(null),[D,J]=(0,c.useState)(null),[M,Y]=(0,c.useState)(()=>Wn(ie())),te=`${v}:${v==="kanban"?M:"-"}`,C=(0,c.useRef)(!0),[O,j]=(0,c.useState)(0),[E,K]=(0,c.useState)([]),[Se,We]=(0,c.useState)(null),[z,k]=(0,c.useState)(!1),S=(0,c.useRef)(!1),[x,be]=(0,c.useState)(()=>{try{return window.localStorage.getItem(un)??""}catch{return""}}),[_,W]=(0,c.useState)({data:null,key:"",fetchedAt:0}),pe=(0,c.useRef)(!1),Z=(0,c.useRef)(new Set),[le,Oe]=(0,c.useState)(""),[$e,Te]=(0,c.useState)(null),[se,Ne]=(0,c.useState)(null),[de,oe]=(0,c.useState)(null),[He,Me]=(0,c.useState)(!1),[Ge,X]=(0,c.useState)(24),[qe,Ke]=(0,c.useState)(""),[An,Le]=(0,c.useState)(null),[xt,Ae]=(0,c.useState)(null),[Rt,Ye]=(0,c.useState)(null),[Bt,Dt]=(0,c.useState)(null),[Ze,Pt]=(0,c.useState)(null),[Ot,_e]=(0,c.useState)(null),[$t,Qe]=(0,c.useState)(!1),Ee=(0,c.useRef)(0);(0,c.useLayoutEffect)(()=>{if(C.current){C.current=!1;return}j(a=>a+1)},[te]),(0,c.useEffect)(()=>{Pt(document.getElementById("create-session-modal"))},[]),(0,c.useEffect)(()=>{Zn().then(i)},[i]);let en=(0,c.useMemo)(()=>{let a=new Map;for(let l of e){let d=String(l.chatId??"").trim();if(!d||!r.showUnknownChats&&hn(l))continue;let f=we(l),b=a.get(d);(!b||f<b)&&a.set(d,f)}return[...a.entries()].sort((l,d)=>l[1].localeCompare(d[1])).map(([l,d])=>({value:l,label:d}))},[r.showUnknownChats,t,e]);(0,c.useEffect)(()=>{r.chat&&(en.some(a=>a.value===r.chat)||g(a=>({...a,chat:""})))},[en,r.chat]);let ae=(0,c.useMemo)(()=>{let a=r.q.toLowerCase(),l=[...r.cli],d=l.length>0&&l.length<fe.length,f=v==="kanban";return e.filter(b=>!d||l.includes(b.cliId??"unknown")).filter(b=>r.showUnknownChats||!hn(b)).filter(b=>!r.status||b.status===r.status).filter(b=>!r.adopt||r.adopt==="yes"==!!b.adopt).filter(b=>!r.chat||String(b.chatId??"")===r.chat).filter(b=>!r.active||f||b.status!=="closed").filter(b=>!a||mt(b).includes(a)).sort((b,y)=>vs(b,y,p,L))},[r,t,L,p,e,v]),nn=(0,c.useMemo)(()=>ut(e),[e]),ce=(0,c.useMemo)(()=>new Map(e.map(a=>[a.sessionId,a])),[e,t]),En=(0,c.useMemo)(()=>ae.filter(a=>a.status!=="closed"),[ae]),xe=(v==="table"?ae:En).filter(a=>a.status!=="closed"),xn=[...m].map(a=>ce.get(a)).filter(a=>!!a&&a.status!=="closed"),Rn=xe.length>0&&xe.every(a=>m.has(a.sessionId)),Ht=xe.some(a=>m.has(a.sessionId))&&!Rn;(0,c.useEffect)(()=>{u(a=>{let l=!1,d=new Set;for(let f of a){let b=ce.get(f);b&&b.status!=="closed"?d.add(f):l=!0}return l?d:a})},[ce]);let tn=(0,c.useCallback)(a=>{let l=new Set;if(!a)return l;for(let d of a.groupChats)l.add(d);if(Se)for(let[d,f]of Se){if(l.has(d))continue;let b=!1;for(let y of a.botIds)if(f.botIds.has(y)){b=!0;break}if(b){for(let y of f.observedNames)if(a.botNames.has(y)){l.add(d);break}}}return l},[Se]),Bn=(0,c.useMemo)(()=>{if(v==="kanban"&&M==="team"){let a=E.find(d=>d.key===x)??E[0],l=tn(a);return ae.filter(d=>l.has(String(d.chatId)))}return ae},[M,x,E,ae,tn,v]),sn=(0,c.useCallback)(a=>it(Bn,a),[Bn]),on=(0,c.useCallback)(async()=>{if(!(S.current||z)){S.current=!0;try{let[a,l,d]=await Promise.all([fetch("/api/team/hosted").then(y=>y.json()).catch(()=>null),fetch("/api/team/remote-roster").then(y=>y.json()).catch(()=>null),fetch("/api/groups").then(y=>y.json()).catch(()=>null)]);Array.isArray(d?.chats)&&We(new Map(d.chats.map(y=>[String(y.chatId),{botIds:new Set((y.memberBots??[]).filter(w=>w.inChat).map(w=>String(w.larkAppId))),observedNames:new Set((y.observedBotNames??[]).map(w=>String(w)))}])));let f=y=>({ids:new Set(y.map(w=>String(w.larkAppId))),names:new Set(y.map(w=>String(w.name??"")).filter(Boolean))}),b=[];for(let y of a?.teams??[]){let{ids:w,names:R}=f(y.bots??[]);b.push({key:`local:${y.teamId}`,label:y.isDefault?o("team.myHostedTeam"):String(y.name??y.teamId),botIds:w,botNames:R,groupChats:new Set((y.groupChatIds??[]).map($=>String($)))})}for(let y of l?.memberships??[]){let{ids:w,names:R}=f(y.roster?.bots??[]);b.push({key:`${y.hubUrl}::${y.teamId}`,label:String(y.teamName??y.teamId??y.hubUrl),botIds:w,botNames:R,groupChats:new Set})}K(b),be(y=>b.length&&!b.some(w=>w.key===y)?b[0].key:y)}finally{k(!0),S.current=!1}}},[z]),Dn=(0,c.useCallback)(async(a,l,d,f,b)=>{try{let w=a.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(a.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:l,column:d,position:f})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:a,sessionId:l,column:d,position:f})}),R=await w.json().catch(()=>({}));(!w.ok||R?.ok===!1)&&(W($=>{if(!$.data||$.key!==a)return $;let U={...$.data.board};return b?U[l]=b:delete U[l],{...$,data:{...$.data,board:U}}}),w.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${R?.error??w.status}`))}catch(y){W(w=>{if(!w.data||w.key!==a)return w;let R={...w.data.board};return b?R[l]=b:delete R[l],{...w,data:{...w.data,board:R}}}),alert(`${o("sessions.kanban.moveFail")}: ${y}`)}},[]),Kt=(0,c.useCallback)(async a=>{let l=_.key===a.key&&Date.now()-_.fetchedAt<3e4;if(!(pe.current||l)){pe.current=!0;try{let f=a.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(a.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(a.key)}`,b=await fetch(f),y=await b.json().catch(()=>({}));if(!b.ok||y?.ok===!1)return;let w=typeof y.deploymentId=="string"?y.deploymentId:null,R=[];for(let $ of Array.isArray(y.reports)?y.reports:[])if(!(w&&$.deploymentId===w))for(let U of Array.isArray($.sessions)?$.sessions:[])R.push({...U,remoteDeployment:$.deploymentName||$.deploymentId});W({key:a.key,fetchedAt:Date.now(),data:{board:y.board&&typeof y.board=="object"?y.board:{},remoteRows:R}})}finally{pe.current=!1}}},[_.fetchedAt,_.key]);(0,c.useEffect)(()=>{v==="kanban"&&M==="team"&&!z&&on()},[M,z,on,v]),(0,c.useEffect)(()=>{let a=window.setInterval(()=>{v==="kanban"&&M==="team"&&(W(l=>({...l,fetchedAt:0})),i())},3e4);return()=>window.clearInterval(a)},[M,i,v]);let Pn=(0,c.useCallback)(async(a,l,d,f)=>{try{let b=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:l,position:d})}),y=await b.json().catch(()=>({}));(!b.ok||y?.ok===!1)&&(a.kanbanColumn=f.column,a.kanbanPosition=f.position,i(),b.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${y?.error??b.status}`))}catch(b){a.kanbanColumn=f.column,a.kanbanPosition=f.position,i(),alert(`${o("sessions.kanban.moveFail")}: ${b}`)}},[i]),_t=(0,c.useCallback)(a=>{let l=!1;for(let d of a){let f=String(d.row.sessionId);if(!f||d.row.status==="closed"&&d.column!=="done")continue;if(M==="team"){let w=E.find(U=>U.key===x)??E[0];if(!w)continue;let $=(_.key===w.key&&_.data?_.data.board:{})[f];W(U=>{let _n=U.key===w.key&&U.data?U.data:{board:{},remoteRows:U.data?.remoteRows??[]},ss={..._n.board,[f]:{column:d.column,position:d.position}};return{...U,key:w.key,data:{..._n,board:ss}}}),Dn(w.key,f,d.column,d.position,$),l=!0;continue}let b=he.sessions.get(f);if(!b)continue;let y={column:b.kanbanColumn,position:b.kanbanPosition};b.kanbanColumn=d.column,b.kanbanPosition=d.position,Pn(b,d.column,d.position,y),l=!0}l&&i()},[M,x,E,_,Pn,Dn,i]),On=(0,c.useCallback)(async(a,l)=>{let d=a.title;a.title=l,i();try{let f=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:l})}),b=await f.json().catch(()=>({}));(!f.ok||b?.ok===!1)&&(a.title=d,i(),f.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${b?.error??f.status}`))}catch(f){a.title=d,i(),alert(`${o("sessions.kanban.renameFail")}: ${f}`)}},[i]),$n=(0,c.useCallback)(async a=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/locate`,{method:"POST"}),d=await l.json();return d.ok?!0:(alert(`Locate failed: ${d.error??l.status}`),!1)}catch(l){return alert(`Locate error: ${l}`),!1}},[]),Hn=(0,c.useCallback)(async(a,l)=>{if(!confirm(o("sessions.closeConfirm")))return!1;l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/close`,{method:"POST"}),f=await d.json().catch(()=>({}));return!d.ok||f?.ok===!1?(d.status!==401&&alert(`Close failed: ${f?.error??d.status}`),!1):(u(b=>{let y=new Set(b);return y.delete(a.sessionId),y}),i(),!0)}catch(d){return alert(`Close error: ${d}`),!1}finally{l&&(l.disabled=!1)}},[i]),an=(0,c.useCallback)(async(a,l,d)=>{let f=!!a.locked;if(f===l)return!0;a.locked=l,i(),d&&(d.disabled=!0);try{let b=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:l})}),y=await b.json().catch(()=>({}));return!b.ok||y?.ok===!1?(a.locked=f,i(),b.status!==401&&alert(`${o("sessions.lockFailed")}: ${y?.error??b.status}`),!1):(a.locked=!!y.locked,i(),!0)}catch(b){return a.locked=f,i(),alert(`${o("sessions.lockFailed")}: ${b}`),!1}finally{d&&(d.disabled=!1)}},[i]),rn=(0,c.useCallback)(async(a,l)=>{if(Z.current.has(a.sessionId)||!confirm(bt(a)))return!1;l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/restart`,{method:"POST"}),f=await d.json().catch(()=>({}));return!d.ok||f?.ok===!1?(d.status!==401&&alert(`${o("sessions.restartFailed")}: ${f?.error??d.status}`),!1):(Z.current.add(a.sessionId),window.setTimeout(()=>Z.current.delete(a.sessionId),5e3),!0)}catch(d){return alert(`${o("sessions.restartFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),Ut=(0,c.useCallback)(async(a,l)=>{l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/resume`,{method:"POST"}),f=await d.json().catch(()=>({}));return!d.ok||f.ok===!1?(alert(`${o("sessions.resumeFailed")}: ${f?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.resumeFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),Ft=(0,c.useCallback)(async(a,l)=>{l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/start`,{method:"POST"}),f=await d.json().catch(()=>({}));return!d.ok||f.ok===!1?(d.status!==401&&alert(`${o("sessions.create.startFailed")}: ${f?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.create.startFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),ln=(0,c.useCallback)(a=>{Ae({sessionId:a.sessionId,loading:!0,messages:[]}),(async()=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/history?limit=80`),d=await l.json().catch(()=>({}));if(!l.ok||d?.ok===!1){let b=String(d?.error??l.status),y=b==="not_found_yet"||b==="not_found";Ae(w=>w?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:[],error:b,stale:y}:w);return}let f=Array.isArray(d.messages)?d.messages:[];Ae(b=>b?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:f,ownerOpenId:d.ownerOpenId}:b)}catch(l){Ae(d=>d?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:[],error:String(l)}:d)}})()},[]),jt=(0,c.useCallback)(a=>{let l=De(a);if(!l){Le(a.sessionId);return}Ye({sessionId:a.sessionId,url:l,loading:!0}),(async()=>{let d=l;if(wn())try{let f=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/write-link`),b=await f.json().catch(()=>({}));f.ok&&b?.ok!==!1&&b?.url&&(d=b.url)}catch{}Ye(f=>f?.sessionId===a.sessionId?{sessionId:a.sessionId,url:d,loading:!1}:f)})()},[]),Jt=(0,c.useCallback)(async()=>{let a=[...m];if(a.length===0||!confirm(o("sessions.closeBulkConfirm",{count:a.length})))return;Te({done:0,total:a.length});let l=0,d=0,f=[...a];async function b(){for(;f.length;){let y=f.shift();try{let w=await fetch(`/api/sessions/${encodeURIComponent(y)}/close`,{method:"POST"}),R=await w.json().catch(()=>({}));(!w.ok||R?.ok===!1)&&(d+=1)}catch{d+=1}finally{l+=1,Te({done:l,total:a.length})}}}await Promise.all(Array.from({length:Math.min(6,a.length)},()=>b())),Te(null),u(new Set),i(),d>0&&alert(`Failed: ${d}/${a.length}`)},[i,m]),zt=(0,c.useCallback)(async a=>{let l=[...m].map(w=>ce.get(w)).filter(w=>!!w&&w.status!=="closed"&&!!w.locked!==a);if(l.length===0)return;Ne({locked:a,done:0,total:l.length});let d=0,f=0,b=[...l];async function y(){for(;b.length;){let w=b.shift(),R=!!w.locked;try{let $=await fetch(`/api/sessions/${encodeURIComponent(w.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:a})}),U=await $.json().catch(()=>({}));!$.ok||U?.ok===!1?(f+=1,w.locked=R):w.locked=!!U.locked}catch{f+=1,w.locked=R}finally{d+=1,Ne({locked:a,done:d,total:l.length})}}}await Promise.all(Array.from({length:Math.min(6,l.length)},()=>y())),Ne(null),i(),f>0&&alert(`${o("sessions.lockFailed")}: ${f}/${l.length}`)},[i,ce,m]),Xt=(0,c.useCallback)(()=>{let a=[...m].filter(d=>!!ce.get(d));if(a.length===0)return;let l=ot(a);oe(o("sessions.monitorRoomAdded",{added:l.added,total:l.total})),window.setTimeout(()=>oe(null),1800)},[ce,m]),Vt=(0,c.useCallback)(async a=>{let l=gn(a);if(!l)return;let d=sn(l);if(d.length!==0){X(l),Me(!0),Ke(o("sessions.idleCleanupRunning"));try{let f=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:l,sessionIds:d.map(y=>y.sessionId)})}),b=await f.json().catch(()=>({}));if(!f.ok){f.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${b?.error??f.status}`),Ke("");return}u(y=>{let w=new Set(y);for(let R of b?.results??[])R?.ok&&R?.sessionId&&w.delete(String(R.sessionId));return w}),Ke(o("sessions.idleCleanupDone",{closed:Number(b?.closed??0),failed:Number(b?.failed??0)})),i()}catch(f){alert(`${o("sessions.idleCleanupFailed")}: ${f}`),Ke("")}finally{Me(!1)}}},[sn,i]),Wt=a=>{let l=Fn(a)??"board";l!==v&&(P(l),Xn(ie(),l))},Gt=(a,l)=>{A(d=>{let f=d.indexOf(a),b=f+l;if(f<0||b<0||b>=d.length)return d;let y=[...d];return y.splice(f,1),y.splice(b,0,a),cn(ie(),y),y})},qt=(a,l)=>{a!==l&&A(d=>{let f=d.indexOf(a),b=d.indexOf(l);if(f<0||b<0)return d;let y=[...d];return y.splice(f,1),y.splice(b,0,a),cn(ie(),y),y})},Yt=(0,c.useMemo)(()=>({rows:ae,groupBy:M,teams:E,teamsLoaded:z,teamKey:x,teamBoardData:_.data,teamBoardKey:_.key}),[M,x,E,z,ae,_.data,_.key]),Zt=An?ce.get(An)??null:null,dn=(0,c.useMemo)(()=>z?E.length?E.map(a=>({value:a.key,label:a.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[E,z]),Qt=!z||E.length===0,Kn=E.some(a=>a.key===x)?x:dn[0]?.value??"",es=dn.find(a=>a.value===Kn)?.label??o("sessions.kanban.groupTeam"),ns=(0,c.useCallback)(()=>{Ee.current+=1,Qe(!1),_e(null)},[]),ts=async()=>{let a=Ee.current+1;Ee.current=a,_e({bots:[],loading:!0}),Qe(!0);try{let l=await pt();if(Ee.current!==a)return;_e({bots:l})}finally{Ee.current===a&&Qe(!1)}};return(0,n.jsxs)("section",{className:"page sessions-page",children:[(0,n.jsxs)("div",{className:"page-heading",children:[(0,n.jsxs)("div",{className:"sessions-heading-main",children:[(0,n.jsx)("p",{className:"eyebrow",children:o("nav.sessions")}),(0,n.jsx)("h1",{children:o("sessions.title")}),(0,n.jsxs)("div",{className:"sessions-view-controls",children:[(0,n.jsx)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":o("sessions.viewMode"),children:[["kanban",o("sessions.viewKanban")],["board",o("sessions.viewBoard")],["table",o("sessions.viewTable")]].map(([a,l])=>(0,n.jsx)("button",{type:"button","data-view":a,className:v===a?"active":void 0,"aria-pressed":v===a,onClick:()=>Wt(a),children:l},a))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${v==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":v!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([a,l])=>(0,n.jsx)("button",{type:"button","data-groupby":a,className:M===a?"active":void 0,"aria-pressed":M===a,onClick:()=>{Y(a),Gn(ie(),a)},children:l},a))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(v==="kanban"&&M==="team"&&z),children:le}),(0,n.jsx)(Re,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(v==="kanban"&&M==="team"),disabled:Qt,label:es,value:Kn,options:dn,onChange:a=>{if(E.some(l=>l.key===a)){be(a);try{window.localStorage.setItem(un,a)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=at()},children:o("sessions.monitorRoom")}),ve.authed?(0,n.jsx)(Qn,{className:"page-primary-action create-session-btn",disabled:$t,onClick:()=>{ts()},children:o("sessions.create.button")}):null]})]}),(0,n.jsxs)("div",{className:"session-runtime-stats","aria-live":"polite",children:[(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(xs,{chatOptions:en,filters:r,setFilters:g,idleCleanup:{busy:He,hours:Ge,status:qe,countForHours:a=>sn(a).length,onRun:Vt}}),(0,n.jsx)(Rs,{selectedCount:m.size,lockDisabled:!xn.some(a=>!a.locked),unlockDisabled:!xn.some(a=>!!a.locked),closeProgress:$e,lockProgress:se,monitorRoomText:de,onClear:()=>u(new Set),onClose:()=>{Jt()},onAddToMonitorRoom:Xt,onLock:a=>{zt(a)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${O>0?" sessions-view-stage-enter":""}`,"data-view":v,"data-kanban-group":M,children:[(0,n.jsx)(Ds,{rows:ae,selected:m,hidden:v!=="table",sortKey:p,sortDir:L,selectAllChecked:Rn,selectAllIndeterminate:Ht,selectAllDisabled:xe.length===0,onOpen:a=>Le(a.sessionId),onSelect:(a,l)=>u(d=>{let f=new Set(d);return l?f.add(a):f.delete(a),f}),onSelectAll:a=>u(l=>{let d=new Set(l);for(let f of xe)a?d.add(f.sessionId):d.delete(f.sessionId);return d}),onSort:a=>{p===a?I(L==="asc"?"desc":"asc"):(N(a),I(a==="spawnedAt"||a==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(Os,{rows:En,selected:m,hidden:v!=="board",order:H,animated:G,dragColId:V,dragOverCol:D,onAnimated:()=>q(!0),onMoveColumn:Gt,onMoveColumnTo:qt,onDragCol:F,onDragOverCol:J,onToggleSelect:a=>u(l=>{let d=new Set(l);return d.has(a.sessionId)?d.delete(a.sessionId):d.add(a.sessionId),d}),onOpen:a=>Le(a.sessionId),onHistory:ln,onLocate:a=>$n(a),onRestart:(a,l)=>{rn(a,l)},onLock:(a,l,d)=>{an(a,l,d)},onClose:(a,l)=>{Hn(a,l)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:Dt,className:`sessions-kanban${M==="bot"?" kanban-mode-bot":""}`,hidden:v!=="kanban",children:v==="kanban"?(0,n.jsx)(Mt,{host:Bt,...Yt,canRestartSession:ze,getTeamChatIds:tn,icons:{details:B.details,feishu:B.feishu,history:B.history,lock:B.lock,restart:B.restart,terminal:B.terminal,unlock:B.unlock},lockActionLabel:Je,sessionStatusText:Be,onDetails:a=>Le(String(a.sessionId)),onHistory:ln,onMoveRows:_t,onNeedTeamBoard:a=>{Kt(a)},onNeedTeams:()=>{on()},onOpenTerminal:jt,onRename:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&On(d,l)},onRestart:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&rn(d,l)},onTeamScope:a=>Oe(a?o("sessions.kanban.teamScope",{chats:a.chats,sessions:a.sessions}):""),onToggleLock:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&an(d,!d.locked,l)},onToggleSelect:a=>u(l=>{let d=String(a.sessionId),f=new Set(l);return f.has(d)?f.delete(d):f.add(d),f}),selectedSessionIds:m}):null})]},O),(0,n.jsx)(Js,{row:Zt,onClose:()=>Le(null),locateSession:$n,openHistory:ln,resumeSession:Ut,restartSession:rn,closeSession:Hn,setSessionLocked:an,startSession:Ft}),(0,n.jsx)(_s,{state:Rt,onClose:()=>Ye(null),onRename:On}),(0,n.jsx)(Hs,{state:xt,onClose:()=>Ae(null)}),Ze?(0,Nn.createPortal)((0,n.jsx)(zs,{dialog:Ze,state:Ot,onClose:ns,onSuccess:a=>_e(l=>l&&{...l,success:a})}),Ze):null]})}function So(e){return et(e,(0,n.jsx)(Xs,{}))}export{Es as CliFilterGroup,So as renderSessionsPage};
@@ -0,0 +1,2 @@
1
+ import{a as ne,c as k}from"./chunk-BRTZFELS.js";import{a as E,c as Z,k as U,p as x}from"./chunk-6TPODDDC.js";import{a as ve,d as te}from"./chunk-ZJING6FY.js";import{c as Q,d as Y,s as ee}from"./chunk-XCPSHD3G.js";var l=Q(ve(),1);var t=Q(te(),1),j=["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 ae(e){return{publicReadOnly:e?.publicReadOnly===!0,openTerminalInFeishu:e?.openTerminalInFeishu===!0,chatBotDiscovery:e?.chatBotDiscovery!==!1,vcMeetingAgent:{enabled:e?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof e?.vcMeetingAgent?.listenerBotAppId=="string"?e.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(e?.vcMeetingAgent?.listenerBotOptions)?e.vcMeetingAgent.listenerBotOptions:[],larkCliVersion:e?.vcMeetingAgent?.larkCliVersion===void 0?void 0:e.vcMeetingAgent.larkCliVersion??null,larkCliMeetsRequirement:e?.vcMeetingAgent?.larkCliMeetsRequirement===!0,larkCliMinVersion:typeof e?.vcMeetingAgent?.larkCliMinVersion=="string"?e.vcMeetingAgent.larkCliMinVersion:void 0},repoPickerMode:e?.repoPickerMode==="repos"?"repos":"all",maintenance:e?.maintenance&&typeof e.maintenance=="object"?e.maintenance:{},localDevInstall:e?.localDevInstall===!0,autoUpdateSupported:e?.autoUpdateSupported!==!1,whiteboard:{enabled:e?.whiteboard?.enabled===!0},remoteAccess:e?.remoteAccess===!0,scheduleTimeZone:typeof e?.scheduleTimeZone=="string"?e.scheduleTimeZone:"",hostTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof e?.effectiveScheduleTimeZone=="string"&&e.effectiveScheduleTimeZone?e.effectiveScheduleTimeZone:typeof e?.scheduleTimeZone=="string"&&e.scheduleTimeZone?e.scheduleTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC"}}function ke(e,n){let a=e?.[n]??{};return{enabled:a.enabled===!0,time:typeof a.time=="string"?a.time:"04:00"}}function ie(e,n){return n(e==="npm-global"?"update.kindNpm":e==="pnpm-global"?"update.kindPnpm":e==="yarn-global"?"update.kindYarn":e==="bun-global"?"update.kindBun":e==="source-checkout"?"update.kindSource":"update.kindUnknown")}function ye(){let e=k(),n=(0,l.useRef)(!1),a=(0,l.useRef)(new Set),[o,u]=(0,l.useState)(null),[d,m]=(0,l.useState)(!1),[M,w]=(0,l.useState)(null),[C,N]=(0,l.useState)(!0),[B,L]=(0,l.useState)(!1),[i,r]=(0,l.useState)(null),[g,T]=(0,l.useState)(null),[F,$]=(0,l.useState)(null),[W,I]=(0,l.useState)(null),[le,P]=(0,l.useState)(null),[q,R]=(0,l.useState)(null),[K,V]=(0,l.useState)(!1),[oe,O]=(0,l.useState)(!0),[re,_]=(0,l.useState)(!1),[ce,de]=(0,l.useState)(""),[ue,f]=(0,l.useState)(!1),[ge,b]=(0,l.useState)(null),G=(0,l.useCallback)(()=>{for(let s of a.current)window.clearTimeout(s);a.current.clear()},[]),J=(0,l.useCallback)((s,c)=>{let p=window.setTimeout(()=>{a.current.delete(p),s()},c);return a.current.add(p),p},[]),D=(0,l.useCallback)(async()=>{try{let s=await fetch("/api/update/status"),c=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){I(null),P(c?.error??`HTTP ${s.status}`);return}I(c),P(null)}catch(s){if(!n.current)return;I(null),P(s instanceof Error?s.message:String(s))}},[]),z=(0,l.useCallback)(async()=>{try{let s=await fetch("/api/settings"),c=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){u(null),w(c?.error??`HTTP ${s.status}`),m(!0);return}u(ae(c.settings)),N(c.authed===!0),L(c.bound===!0),w(null),m(!0)}catch(s){if(!n.current)return;u(null),w(s instanceof Error?s.message:String(s)),m(!0)}},[]);(0,l.useEffect)(()=>(n.current=!0,z(),()=>{n.current=!1,G()}),[G,z]),(0,l.useEffect)(()=>{d&&(f(!1),b(null),V(!1),C&&D())},[C,D,d]);async function pe(s,c,p){if(!o)return;let h=o;u(p(o)),r(s),T({text:e("settings.saving")});try{let v=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(c)}),A=await v.json().catch(()=>({}));if(!n.current)return;if(!v.ok||A.ok===!1)throw typeof A?.feishuLoginQr=="string"&&A.feishuLoginQr&&$(A.feishuLoginQr),new Error(A?.error??`HTTP ${v.status}`);$(null);let H=ae(A.settings);u(H),ee.publicReadOnly=H.publicReadOnly,Y.setScheduleTimeZone(H.effectiveScheduleTimeZone),T({text:e("settings.saved"),cls:"hint-ok"})}catch(v){if(!n.current)return;u(h),T({text:`${e("settings.saveFailed")}: ${v instanceof Error?v.message:String(v)}`,cls:"hint-warn-inline"})}finally{n.current&&r(null)}}async function me(){R(null),O(!0),_(!1);try{let s=await fetch("/api/update/changelog"),c=await s.json().catch(()=>({}));if(!n.current)return;de(typeof c?.releasesUrl=="string"?c.releasesUrl:""),s.ok?(R(Array.isArray(c.releases)?c.releases:[]),O(c.ok!==!1),_(c.rateLimited===!0)):(R([]),O(!1))}catch{if(!n.current)return;R([]),O(!1)}}function he(){let s=Date.now(),c=async()=>{if(n.current){if(Date.now()-s>9e4){f(!1),b({text:e("update.restartSlow"),cls:"hint-warn-inline"});return}try{let p=await fetch("/__health",{cache:"no-store"});if(!n.current)return;if(p.ok){location.reload();return}}catch{}n.current&&J(()=>{c()},2e3)}};J(()=>{c()},3e3)}async function X(s){f(!0),b({text:e("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(c){if(!n.current)return;f(!1),b({text:e("update.restartFailed",{detail:c instanceof Error?c.message:String(c)}),cls:"hint-warn-inline"});return}he()}async function be(){let s=W;if(!s)return;if(!s.node.ok){window.alert(e("update.nodeTooOldAlert",{version:s.node.version,required:s.node.required}));return}if(!s.updateSupported||!s.updateCommand){window.alert(e("update.unsupportedInstall"));return}if(s.installs.multiple){let p=s.installs.entries.map(h=>`\u2022 ${h.binPath} (${ie(h.kind,e)})`).join(`
2
+ `);if(!window.confirm(e("update.confirmMultiInstall",{paths:p})))return}let c=s.latest?e("update.confirmUpdate",{version:`v${s.latest}`,command:s.updateCommand}):e("update.confirmUpdateNoVer",{command:s.updateCommand});if(window.confirm(c)){f(!0),b({text:e("update.updating",{command:s.updateCommand})});try{let p=await fetch("/api/update/run",{method:"POST"}),h=await p.json().catch(()=>({}));if(!n.current)return;if(!p.ok||h.ok===!1){let v=h?.detail??h?.error??`HTTP ${p.status}`;f(!1),b({text:e("update.updateFailed",{detail:v}),cls:"hint-warn-inline"});return}h.changed?(f(!1),b({text:e("update.updatedChanged",{old:`v${h.oldVersion}`,new:`v${h.newVersion}`}),cls:"hint-ok"}),window.confirm(e("update.confirmRestart"))?await X({oldVersion:h.oldVersion,newVersion:h.newVersion}):n.current&&b({text:e("update.noRestartHint"),cls:"hint-ok"})):(f(!1),b({text:e("update.alreadyLatestRun",{version:`v${h.newVersion}`}),cls:"hint-ok"}),await D())}catch(p){if(!n.current)return;f(!1),b({text:e("update.updateFailed",{detail:p instanceof Error?p.message:String(p)}),cls:"hint-warn-inline"})}}}let fe=o?(0,t.jsx)(Se,{settings:o,canWrite:C,bound:B,savingKey:i,message:g,updateBlock:(0,t.jsx)(Ce,{canWrite:C,status:W,statusError:le,changelog:q,changelogOpen:K,changelogOk:oe,changelogRateLimited:re,releasesUrl:ce,busy:ue,message:ge,onCheck:()=>{I(null),R(null),V(!1),b(null),P(null),D()},onToggleChangelog:()=>{let s=!K;V(s),s&&q===null&&me()},onUpdate:()=>{be()},onRestart:()=>{window.confirm(e("update.confirmPlainRestart"))&&X(null)}}),feishuLoginQr:F,onCloseFeishuLoginQr:()=>$(null),onSave:pe}):M?(0,t.jsxs)("p",{className:"hint-warn",children:[e("settings.loadFailed"),": ",M]}):(0,t.jsx)(Z,{label:e("settings.loading")});return(0,t.jsxs)("section",{className:"page settings-page",children:[(0,t.jsx)("div",{className:"page-heading",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"eyebrow",children:e("nav.settings")}),(0,t.jsx)("h1",{children:e("settings.title")})]})}),fe]})}function Se(e){let n=k(),{settings:a,canWrite:o,bound:u,savingKey:d}=e,m=!o,M=ke(a.maintenance,"autoUpdate"),w=!o||a.localDevInstall||!a.autoUpdateSupported,C=!o||a.maintenance.autoUpdate?.enabled!==!0,N=(i,r)=>{e.onSave(i,{[i]:r},g=>({...g,[i]:r}))},B=(0,l.useMemo)(()=>[{value:"all",label:n("settings.repoPickerModeAll")},{value:"repos",label:n("settings.repoPickerModeRepos")}],[n]),L=(0,l.useMemo)(()=>[{value:"",label:n("settings.vcMeetingListenerBotAuto")},...a.vcMeetingAgent.listenerBotOptions.map(i=>{let r=i.botName||i.larkAppId,g=i.cliId?` \xB7 ${i.cliId}`:"",T=[i.vcMeetingAgentEnabled===!0?void 0:n("settings.vcMeetingListenerBotDisabled"),i.hasLarkCliProfile===!0?void 0:n("settings.vcMeetingListenerBotNoProfile")].filter(Boolean),F=T.length>0?` \xB7 ${T.join(" \xB7 ")}`:"";return{value:i.larkAppId,label:`${r}${g}${F}`}})],[a.vcMeetingAgent.listenerBotOptions,n]);return(0,t.jsxs)("div",{className:"settings-layout",children:[o?null:(0,t.jsx)("article",{className:"bd-card settings-card settings-alert-card",children:(0,t.jsx)("p",{className:"hint-warn",children:n("settings.readOnlyVisitor")})}),(0,t.jsxs)(se,{className:"settings-group-main",children:[(0,t.jsxs)(y,{title:n("settings.sectionAccess"),children:[(0,t.jsx)(S,{title:n("settings.publicReadOnly"),help:n("settings.publicReadOnlyHelp"),checked:a.publicReadOnly,disabled:m||d==="publicReadOnly",onChange:i=>N("publicReadOnly",i)}),u?(0,t.jsx)(S,{title:n("settings.remoteAccess"),help:n("settings.remoteAccessHelp"),checked:a.remoteAccess,disabled:m||d==="remoteAccess",onChange:i=>N("remoteAccess",i)}):null]}),(0,t.jsx)(y,{title:n("settings.sectionCards"),children:(0,t.jsx)(S,{title:n("settings.openTerminalInFeishu"),help:n("settings.openTerminalInFeishuHelp"),checked:a.openTerminalInFeishu,disabled:m||d==="openTerminalInFeishu",onChange:i=>N("openTerminalInFeishu",i)})}),(0,t.jsx)(y,{title:n("settings.sectionExperimental"),children:(0,t.jsx)(S,{title:n("settings.chatBotDiscovery"),help:n("settings.chatBotDiscoveryHelp"),checked:a.chatBotDiscovery,disabled:m||d==="chatBotDiscovery",onChange:i=>N("chatBotDiscovery",i)})}),(0,t.jsx)(y,{title:n("settings.sectionWhiteboard"),children:(0,t.jsx)(S,{title:n("settings.whiteboardEnable"),help:n("settings.whiteboardEnableHelp"),checked:a.whiteboard.enabled,disabled:m||d==="whiteboard",onChange:i=>{e.onSave("whiteboard",{whiteboard:{enabled:i}},r=>({...r,whiteboard:{enabled:i}}))}})}),(0,t.jsx)(y,{title:n("settings.sectionRepoPicker"),children:(0,t.jsxs)("div",{className:"settings-field-row",children:[(0,t.jsx)(U,{help:n("settings.repoPickerModeHelp"),children:n("settings.repoPickerMode")}),(0,t.jsx)(x,{className:"settings-field-menu",ariaLabel:n("settings.repoPickerMode"),disabled:m||d==="repoPickerMode",value:a.repoPickerMode,label:E(B,a.repoPickerMode),options:B,onChange:i=>{e.onSave("repoPickerMode",{repoPickerMode:i},r=>({...r,repoPickerMode:i}))}})]})}),(0,t.jsx)(y,{title:n("settings.sectionSchedule"),children:(0,t.jsx)(we,{value:a.scheduleTimeZone,host:a.hostTimeZone,effective:a.effectiveScheduleTimeZone,disabled:m||d==="scheduleTimeZone",onSave:i=>{e.onSave("scheduleTimeZone",{scheduleTimeZone:i},r=>({...r,scheduleTimeZone:i??""}))}})}),(0,t.jsxs)(y,{className:"settings-vc-block",title:n("settings.sectionVcMeetingAgent"),children:[(0,t.jsx)(S,{title:n("settings.vcMeetingAgent"),help:n("settings.vcMeetingAgentHelp"),checked:a.vcMeetingAgent.enabled,disabled:m||d==="vcMeetingAgent",onChange:i=>{e.onSave("vcMeetingAgent",{vcMeetingAgent:{enabled:i}},r=>({...r,vcMeetingAgent:{...r.vcMeetingAgent,enabled:i}}))}}),(0,t.jsxs)("div",{className:"settings-field-row",children:[(0,t.jsx)(U,{help:n("settings.vcMeetingListenerBotHelp"),children:n("settings.vcMeetingListenerBot")}),(0,t.jsx)(x,{className:"settings-field-menu",ariaLabel:n("settings.vcMeetingListenerBot"),disabled:m||d==="vcMeetingAgent",value:a.vcMeetingAgent.listenerBotAppId??"",label:E(L,a.vcMeetingAgent.listenerBotAppId??""),options:L,onChange:i=>{let r=i||null;e.onSave("vcMeetingAgent",{vcMeetingAgent:{listenerBotAppId:r}},g=>({...g,vcMeetingAgent:{...g.vcMeetingAgent,listenerBotAppId:r}}))}})]}),(0,t.jsx)(Me,{settings:a.vcMeetingAgent}),e.feishuLoginQr?(0,t.jsxs)("div",{className:"settings-feishu-login",children:[(0,t.jsx)("button",{type:"button",className:"settings-feishu-login-close","aria-label":n("settings.feishuLoginClose"),title:n("settings.feishuLoginClose"),onClick:e.onCloseFeishuLoginQr}),(0,t.jsx)("p",{children:n("settings.feishuLoginRequired")}),(0,t.jsx)("img",{src:e.feishuLoginQr,alt:n("settings.feishuLoginQrAlt")})]}):null]})]}),(0,t.jsxs)(se,{className:"settings-group-ops",children:[(0,t.jsx)(y,{title:n("settings.sectionMaintenance"),titleExtra:a.localDevInstall?(0,t.jsx)("span",{className:"settings-title-note",children:n("settings.autoUpdateLocalDev")}):a.autoUpdateSupported?null:(0,t.jsx)("span",{className:"settings-title-note",children:n("settings.autoUpdateUnsupportedInstall")}),children:(0,t.jsxs)("div",{className:"settings-maintenance-grid",children:[(0,t.jsxs)("div",{className:"settings-maintenance-update",children:[(0,t.jsx)(S,{title:n("settings.autoUpdate"),help:n("settings.autoUpdateHelp"),checked:M.enabled,disabled:w||d==="autoUpdate",onChange:i=>{let r={enabled:i,time:M.time};e.onSave("autoUpdate",{maintenance:{autoUpdate:r}},g=>({...g,maintenance:{...g.maintenance,autoUpdate:r}}))}}),(0,t.jsx)("div",{className:"maint-time",children:(0,t.jsxs)("label",{children:[(0,t.jsx)("span",{children:n("settings.maintenanceTime")}),(0,t.jsx)("input",{type:"time",value:M.time,disabled:w||d==="autoUpdate",onChange:i=>{let r={enabled:M.enabled,time:i.currentTarget.value||"04:00"};e.onSave("autoUpdate",{maintenance:{autoUpdate:r}},g=>({...g,maintenance:{...g.maintenance,autoUpdate:r}}))}})]})})]}),(0,t.jsx)("div",{className:"settings-maintenance-restart",children:(0,t.jsx)(S,{title:n("settings.autoRestart"),help:n("settings.autoRestartHelp"),checked:a.maintenance.autoRestart?.enabled===!0,disabled:C||d==="autoRestart",onChange:i=>{let r={enabled:i};e.onSave("autoRestart",{maintenance:{autoRestart:r}},g=>({...g,maintenance:{...g.maintenance,autoRestart:r}}))}})})]})}),e.updateBlock]}),(0,t.jsx)("div",{className:"settings-status-row",children:(0,t.jsx)("span",{className:`oncall-status ${e.message?.cls??""}`,"data-settings-status":!0,children:e.message?.text??""})})]})}function Me(e){let n=k(),a=e.settings.larkCliVersion,o=typeof a=="string"&&e.settings.larkCliMeetsRequirement===!0,u=o?n("settings.larkCliReady",{version:a}):typeof a=="string"?n("settings.larkCliOutdated",{version:a,minimum:e.settings.larkCliMinVersion??"-"}):n("settings.larkCliMissing");return(0,t.jsxs)("div",{className:`settings-lark-cli-status ${o?"is-ready":"is-warning"}`,children:[(0,t.jsx)("span",{"aria-hidden":"true"}),(0,t.jsx)("strong",{children:u}),o?null:(0,t.jsx)("code",{children:"npm i -g @larksuite/cli@latest"})]})}function se(e){let n=["settings-group",e.className].filter(Boolean).join(" ");return(0,t.jsx)("section",{className:n,children:(0,t.jsx)("article",{className:"bd-card settings-group-card",children:e.children})})}function y(e){let n=["settings-block",e.className].filter(Boolean).join(" ");return(0,t.jsx)("section",{className:n,children:(0,t.jsxs)("article",{className:"bd-card settings-card",children:[(0,t.jsxs)("div",{className:"settings-block-title-row",children:[(0,t.jsx)("h2",{className:"bd-section-title",children:e.title}),e.titleExtra?(0,t.jsx)("div",{className:"settings-block-title-extra",children:e.titleExtra}):null]}),e.children]})})}function we(e){let n=k(),a=e.value.trim(),o=e.effective||e.value.trim()||e.host,u=(0,l.useMemo)(()=>{let d=a&&!j.includes(a)?[a,...j]:j;return[{value:"",label:n("settings.scheduleTimeZoneHost",{host:e.host})},...d.map(m=>({value:m,label:m}))]},[e.host,n,a]);return(0,t.jsxs)("div",{className:"settings-field-row settings-timezone-row",children:[(0,t.jsx)(U,{help:n("settings.scheduleTimeZoneHelp",{host:e.host,effective:o}),children:n("settings.scheduleTimeZone")}),(0,t.jsx)(x,{className:"settings-field-menu settings-timezone-menu",ariaLabel:n("settings.scheduleTimeZone"),value:a,label:E(u,a),options:u,disabled:e.disabled,onChange:d=>e.onSave(d===""?null:d)})]})}function S(e){return(0,t.jsxs)("label",{className:"toggle-row",children:[(0,t.jsx)("input",{type:"checkbox",checked:e.checked,disabled:e.disabled,onChange:n=>e.onChange(n.currentTarget.checked)}),(0,t.jsx)("span",{className:"switch","aria-hidden":"true"}),(0,t.jsx)("span",{className:"toggle-tx",children:(0,t.jsx)("strong",{children:(0,t.jsx)(U,{className:"settings-toggle-title",help:e.help,children:e.title})})})]})}function Ce(e){let n=k(),a;if(!e.canWrite)a=(0,t.jsx)("p",{className:"hint-warn",children:n("update.loginRequired")});else if(e.statusError)a=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:"hint-warn",children:[n("update.checkFailed"),": ",e.statusError]}),(0,t.jsx)("div",{className:"update-actions",children:(0,t.jsx)("button",{type:"button","data-up":"check",onClick:e.onCheck,children:n("update.btnCheck")})})]});else if(!e.status)a=(0,t.jsx)(Z,{label:n("update.loading"),compact:!0});else{let o=e.status,u=o.localDevInstall||!o.updateSupported||e.busy;a=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:"update-version",children:[(0,t.jsxs)("span",{children:[n("update.current"),": ",(0,t.jsxs)("strong",{children:["v",o.current]})]})," ",(0,t.jsx)(Ne,{status:o})]}),o.node.ok?null:(0,t.jsx)("p",{className:"hint-warn",children:n("update.nodeWarn",{version:o.node.version,required:o.node.required})}),!o.localDevInstall&&!o.updateSupported?(0,t.jsx)("p",{className:"hint-warn",children:n("update.unsupportedInstall")}):null,o.installs.multiple?(0,t.jsx)(Te,{entries:o.installs.entries}):null,(0,t.jsxs)("div",{className:"update-actions",children:[(0,t.jsx)("button",{type:"button","data-up":"check",disabled:e.busy,onClick:e.onCheck,children:n("update.btnCheck")}),(0,t.jsx)("button",{type:"button","data-up":"changelog",disabled:e.busy,onClick:e.onToggleChangelog,children:e.changelogOpen?n("update.btnChangelogHide"):n("update.btnChangelog")}),(0,t.jsx)("button",{type:"button",className:"page-primary-action","data-up":"update",disabled:u,onClick:e.onUpdate,children:n("update.btnUpdate")}),(0,t.jsx)("button",{type:"button","data-up":"restart",disabled:e.busy,onClick:e.onRestart,children:n("update.btnRestart")})]}),e.changelogOpen?(0,t.jsx)(Ae,{changelog:e.changelog,ok:e.changelogOk,rateLimited:e.changelogRateLimited,releasesUrl:e.releasesUrl}):null,e.message?(0,t.jsx)("p",{className:`oncall-status ${e.message.cls??""}`,children:e.message.text}):null]})}return(0,t.jsx)(y,{className:"settings-update-block",title:n("update.section"),titleExtra:e.status?.localDevInstall?(0,t.jsx)("span",{className:"settings-title-note",children:n("update.localDev")}):e.status&&!e.status.updateSupported?(0,t.jsx)("span",{className:"settings-title-note",children:n("update.unsupportedInstall")}):null,children:a})}function Ne(e){let n=k(),a=e.status;return a.latest?a.behind?(0,t.jsx)("span",{className:"update-badge update-badge-new",children:n("update.newAvailable",{version:`v${a.latest}`})}):(0,t.jsx)("span",{className:"update-badge update-badge-ok",children:n("update.upToDate")}):(0,t.jsx)("span",{className:"hint-warn-inline",children:n("update.checkUnavailable")})}function Te(e){let n=k();return(0,t.jsxs)("div",{className:"hint-warn",children:[(0,t.jsx)("p",{children:n("update.multiInstallWarn")}),(0,t.jsx)("ul",{className:"update-install-list",children:e.entries.map(a=>(0,t.jsxs)("li",{children:[(0,t.jsx)("code",{children:a.binPath})," \u2192 ",ie(a.kind,n)," ",(0,t.jsx)("small",{children:a.root})]},`${a.binPath}:${a.root}`))})]})}function Ae(e){let n=k();if(e.changelog===null)return(0,t.jsx)(Z,{label:n("update.changelogLoading"),compact:!0});if(!e.ok){let a=e.rateLimited?n("update.changelogRateLimited"):n("update.changelogFailed");return(0,t.jsxs)("p",{className:"hint-warn-inline",children:[a,e.releasesUrl?(0,t.jsxs)(t.Fragment,{children:[" ",(0,t.jsx)("a",{href:e.releasesUrl,target:"_blank",rel:"noopener",children:n("update.changelogViewOnGitHub")})]}):null]})}return e.changelog.length===0?(0,t.jsx)("p",{className:"empty",children:n("update.changelogEmpty")}):(0,t.jsx)("div",{className:"update-changelog",children:e.changelog.map(a=>{let o=a.name&&a.name!==`v${a.version}`?a.name:"",u=a.publishedAt?new Date(a.publishedAt).toLocaleDateString():"";return(0,t.jsxs)("details",{className:"update-release",open:!0,children:[(0,t.jsxs)("summary",{children:[(0,t.jsxs)("strong",{children:["v",a.version]})," ",o," ",(0,t.jsx)("small",{children:u})," ",(0,t.jsx)("a",{href:a.url,target:"_blank",rel:"noopener",children:"\u2197"})]}),(0,t.jsx)("pre",{className:"update-release-body",children:a.body||""})]},a.version)})})}function Oe(e){return ne(e,(0,t.jsx)(ye,{}))}export{we as TimeZoneRow,Oe as renderSettingsPage};
@@ -0,0 +1,3 @@
1
+ import{a as Le,c as F}from"./chunk-BRTZFELS.js";import{b as we,c as xe,d as z,h as Ee,k as ne}from"./chunk-6TPODDDC.js";import{a as dl,b as ul,d as Be}from"./chunk-ZJING6FY.js";import{c as ie,x as Se}from"./chunk-XCPSHD3G.js";var a=ie(dl(),1),je=ie(ul(),1);var e=ie(Be(),1),kl=2;function ml(l,t){let n=String(l??"").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 gl(l,t){let n=l.source??{};return n.type==="github"?`github:${n.owner}/${n.repo}/${n.path??""}`:n.type==="git"?`${n.url??"git"}#${n.path??""}`:n.type==="local-link"?ml(n.path,t)??t("skills.sourceLocalLink"):n.type==="local-copy"?t("skills.sourceBotmuxCopy"):String(n.type??"unknown")}function oe(l){return(l?.include??[]).filter(t=>t.startsWith("skill:")).map(t=>t.slice(6))}function fl(l){return oe(l).length}function vl(l){return oe(l).length>0}function ae(l){return`${l.cliId}
2
+ ${l.rootDir}`}function pl(l){return l>=1600?4:l<=620?1:l<=980?2:3}async function w(l,t){let n=await fetch(l,{...t,headers:{"content-type":"application/json",...t.headers??{}}}),f=await n.json().catch(()=>({}));if(!n.ok||f.ok===!1){let g=new Error(f?.error??`HTTP ${n.status}`);throw g.status=n.status,g.body=f,g}return f}function He(l){return`oncall-status${l?` ${l.ok?"hint-ok":"hint-warn-inline"}`:""}`}function Me(l){let t=l.options.find(n=>n.value===l.value);return(0,e.jsxs)("div",{className:"skills-segmented-control",children:[(0,e.jsx)("div",{className:"segmented skills-segmented",role:"group",children:l.options.map(n=>(0,e.jsx)("button",{type:"button",className:l.value===n.value?"active":"","aria-pressed":l.value===n.value?"true":"false",title:typeof n.help=="string"?n.help:void 0,disabled:l.disabled,onClick:()=>l.onChange(n.value),children:n.label},n.value))}),t?.help?(0,e.jsx)("span",{className:"skills-setting-hint",children:t.help}):null]})}function yl(l){let t=F(),n=(0,a.useRef)(null),f=l.installCandidates??[],g=l.selectedInstallSkills??new Set,p=f.length>0&&f.every(u=>g.has(u.name)),y=l.installBusy||l.installDiscovering;return(0,a.useEffect)(()=>{let u=n.current;if(u)if(l.installSelectionOpen&&!u.open)try{u.showModal()}catch{}else!l.installSelectionOpen&&u.open&&u.close()},[l.installSelectionOpen,f.length]),(0,e.jsxs)("article",{className:"bd-card skills-install-panel",children:[l.showTitle===!1?null:(0,e.jsx)("div",{className:"skills-install-title",children:(0,e.jsx)("h3",{className:"bd-section-title",children:(0,e.jsx)(ne,{help:t("skills.installInfo"),helpLabel:t("skills.installInfoLabel"),children:t("skills.install")})})}),(0,e.jsxs)("div",{className:"skills-install-grid",children:[(0,e.jsxs)("label",{className:"skills-source-label",children:[(0,e.jsx)(ne,{help:(0,e.jsxs)("span",{className:"skills-source-help",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:t("skills.sourceHelpRemoteLabel")}),t("skills.sourceHelpRemote")]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:t("skills.sourceHelpLocalLabel")}),t("skills.sourceHelpLocal")]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:t("skills.sourceHelpAgentbuddyLabel")}),t("skills.sourceHelpAgentbuddy")]})]}),helpLabel:t("skills.source"),children:t("skills.source")}),(0,e.jsx)("div",{className:"skills-source-control",children:(0,e.jsx)("input",{type:"text","data-install":"source","aria-label":t("skills.source"),placeholder:t("skills.sourcePlaceholder"),value:l.installSource,onChange:u=>l.onInstallSourceChange(u.currentTarget.value)})})]}),(0,e.jsxs)("label",{className:"skills-install-field-wide skills-install-path-field",children:[(0,e.jsx)("span",{children:t("skills.path")}),(0,e.jsx)("input",{type:"text","data-install":"path",placeholder:t("skills.pathPlaceholder"),value:l.installPath,onChange:u=>l.onInstallPathChange(u.currentTarget.value)})]}),(0,e.jsxs)("label",{className:"skills-install-field-wide skills-install-ref-field",children:[(0,e.jsx)("span",{children:t("skills.ref")}),(0,e.jsx)("input",{type:"text","data-install":"ref",placeholder:t("skills.refPlaceholder"),value:l.installRef,onChange:u=>l.onInstallRefChange(u.currentTarget.value)})]}),(0,e.jsx)("div",{className:"skills-install-actions",children:(0,e.jsx)("button",{type:"button","data-action":"install",disabled:y,onClick:()=>l.onInstall(),children:l.installDiscovering?t("skills.scanning"):l.installBusy?t("skills.jobRunning"):t("skills.installSubmit")})}),(0,e.jsx)("div",{className:"skills-install-bottom-row",children:(0,e.jsxs)("div",{className:"skills-local-discovery-panel",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("strong",{children:t("skills.localDiscoverTitle")}),(0,e.jsx)("span",{children:t("skills.localDiscoverHelp")})]}),(0,e.jsx)("button",{type:"button","data-action":"open-native-skill-discovery",onClick:()=>l.onOpenNativeDiscovery(),children:t("skills.localDiscover")})]})})]}),l.installStatus?(0,e.jsx)("div",{className:"actions skills-install-status-row",children:(0,e.jsx)("span",{className:He(l.installStatus),"data-skills-status":!0,children:l.installStatus.text})}):null,(0,e.jsx)("dialog",{className:"skills-discovery-dialog skills-install-selection-dialog","data-install-selection-dialog":!0,ref:n,onClose:()=>l.onCloseInstallSelection?.(),children:(0,e.jsxs)("article",{children:[(0,e.jsxs)("header",{children:[(0,e.jsx)("h3",{children:t("skills.installSelectionTitle")}),(0,e.jsx)("p",{children:t("skills.installSelectionHelp",{count:f.length})})]}),(0,e.jsx)("div",{className:"skills-discovery-body skills-install-selection-body",children:(0,e.jsxs)("div",{className:"skills-candidate-list","data-install-candidates":!0,children:[(0,e.jsxs)("div",{className:"skills-candidate-list-head",children:[(0,e.jsx)("span",{children:t("skills.scanFound",{count:f.length})}),l.onSelectAllInstallSkills?(0,e.jsx)("button",{type:"button","data-action":"toggle-all-source-skills",disabled:l.installBusy,onClick:()=>l.onSelectAllInstallSkills?.(!p),children:t(p?"skills.discoverClearSelection":"skills.discoverSelectAll")}):null]}),f.map(u=>(0,e.jsxs)("label",{className:"skills-candidate-row",children:[(0,e.jsx)("input",{type:"checkbox",checked:g.has(u.name),disabled:l.installBusy,onChange:()=>l.onToggleInstallSkill?.(u.name)}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:u.name}),(0,e.jsxs)("small",{children:[u.path,u.description?` \xB7 ${u.description}`:""]})]})]},`${u.name}:${u.path}`))]})}),(0,e.jsxs)("footer",{className:"actions",children:[(0,e.jsx)("button",{type:"button","data-action":"close-install-selection",disabled:l.installBusy,onClick:()=>l.onCloseInstallSelection?.(),children:t("skills.installSelectionCancel")}),(0,e.jsx)("button",{type:"button",className:"primary","data-action":"confirm-install-selection",disabled:l.installBusy||g.size===0,onClick:()=>l.onConfirmInstallSelection?.(),children:l.installBusy?t("skills.jobRunning"):t("skills.installSelected")})]})]})})]})}function bl(){let l=F(),t=(0,a.useRef)(!0),n=(0,a.useRef)(new Set),f=(0,a.useRef)(null),[g,p]=(0,a.useState)([]),[y,u]=(0,a.useState)([]),[v,h]=(0,a.useState)([]),[S,I]=(0,a.useState)("off"),[K,j]=(0,a.useState)("auto"),[A,N]=(0,a.useState)(null),[B,q]=(0,a.useState)(!0),[C,re]=(0,a.useState)(()=>window.innerWidth),[R,ce]=(0,a.useState)(""),[U,de]=(0,a.useState)(""),[x,r]=(0,a.useState)(""),[m,c]=(0,a.useState)(null),[E,H]=(0,a.useState)(!1),[ue,O]=(0,a.useState)(!1),[Q,T]=(0,a.useState)(!1),[X,V]=(0,a.useState)([]),[L,Y]=(0,a.useState)(()=>new Set),[ke,_]=(0,a.useState)(!1),[Oe,Ne]=(0,a.useState)(!1),[me,_e]=(0,a.useState)(null),[ge,fe]=(0,a.useState)(()=>new Set),[G,ve]=(0,a.useState)(0),[Ce,Z]=(0,a.useState)(null),[Ie,ee]=(0,a.useState)(null),[Ge,Pe]=(0,a.useState)(null),[Je,pe]=(0,a.useState)({}),le=(0,a.useMemo)(()=>new Set(g.map(s=>s.name)),[g]),se=pl(C)*kl,M=Math.max(1,Math.ceil(g.length/se)),We=g.slice(G*se,G*se+se),$=(0,a.useMemo)(()=>y.length===0?void 0:(me?y.find(i=>ae(i)===me):void 0)??y.find(i=>i.skills.length>0)??y[0],[me,y]),ye=$?ae($):"",J=(0,a.useMemo)(()=>$?$.skills.filter(s=>!le.has(s.name)).map(s=>s.rootDir??s.source?.root??"").filter(Boolean):[],[$,le]),Re=J.length>0&&J.every(s=>ge.has(s)),Te=(0,a.useCallback)(()=>{for(let s of n.current)window.clearTimeout(s);n.current.clear()},[]),ze=(0,a.useCallback)(s=>new Promise(i=>{let o=window.setTimeout(()=>{n.current.delete(o),i()},s);n.current.add(o)}),[]),$e=(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 k=o?.error??`skills HTTP ${s.status}`;throw new Error(k==="not_found_yet"||k==="not_found"?l("skills.apiUnavailable"):k)}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"}},[l]),D=(0,a.useCallback)(async()=>{q(!0);try{let s=await $e();if(!t.current)return;p(s.skills),u(s.nativeSkillGroups),h(s.bots),I(s.trustProjectSkills),j(s.delivery),N(null),fe(i=>{let o=new Set,d=new Set(s.skills.map(k=>k.name));for(let k of s.nativeSkillGroups)for(let b of k.skills){let W=b.rootDir??b.source?.root??"";W&&!d.has(b.name)&&i.has(W)&&o.add(W)}return o})}catch(s){if(!t.current)return;N(s?.message??String(s))}finally{t.current&&q(!1)}},[$e]);(0,a.useEffect)(()=>{t.current=!0,D();let s=()=>re(window.innerWidth);return window.addEventListener("resize",s),()=>{t.current=!1,Te(),window.removeEventListener("resize",s)}},[Te,D]),(0,a.useEffect)(()=>{ve(s=>Math.min(Math.max(0,s),M-1))},[M]),(0,a.useEffect)(()=>{let s=f.current;if(s)if(ke&&!s.open)try{s.showModal()}catch{}else!ke&&s.open&&s.close()},[ke,ye]);async function De(s,i,o=!0){let d=s;for(i({text:l("skills.jobRunning"),ok:!0});;){if(!t.current)return;if(d.status==="succeeded"){i({text:l("skills.saved"),ok:!0}),o&&await D();return}if(d.status==="failed")throw new Error(d.error??"job_failed");if(await ze(800),!t.current)return;let k=await w(`/api/skills/jobs/${encodeURIComponent(d.id)}`,{method:"GET"});if(!t.current)return;d=k.job}}function Fe(s){return v.filter(i=>oe(i.skills).includes(s)).map(i=>i.botName??i.larkAppId)}function te(){V([]),Y(new Set),T(!1)}function Ae(){return{source:R.trim(),path:U.trim()||void 0,ref:x.trim()||void 0}}function Ke(s){let i=s??[...L];return{...Ae(),skillNames:i.length>0?i:void 0}}async function qe(){O(!0),c({text:l("skills.scanning"),ok:!0});try{let s=await w("/api/skills/discover",{method:"POST",body:JSON.stringify(Ae())});if(!t.current)return{skills:[],directInstall:!1};let i=s.discovery?.directInstall===!0,o=Array.isArray(s.discovery?.skills)?s.discovery.skills:[];return V(o),Y(new Set(o.map(d=>d.name))),{skills:o,directInstall:i}}finally{t.current&&O(!1)}}function P(s){let i=s||"";return i.startsWith("agentbuddy_not_found")?l("skills.agentbuddyNotFound"):i.startsWith("agentbuddy_command_failed")?/login|credential|unauthor|not logged|401|403/i.test(i)?l("skills.agentbuddyNeedsLogin"):l("skills.agentbuddyCommandFailed"):i.startsWith("agentbuddy_clear_telemetry_failed")||i.startsWith("agentbuddy_telemetry_not_stripped")?l("skills.agentbuddyTelemetryFailed"):i.startsWith("agentbuddy_no_skill_produced")?l("skills.agentbuddyNoSkill"):i.startsWith("invalid_agentbuddy")?l("skills.agentbuddyInvalid"):i}async function be(s){H(!0);try{let i=await w("/api/skills/install",{method:"POST",body:JSON.stringify(Ke(s))});if(!t.current)return;await De(i.job,c),t.current&&te()}catch(i){t.current&&c({text:`${l("skills.failed")}: ${P(i?.message??String(i))}`,ok:!1})}finally{t.current&&H(!1)}}function Ue(s){Y(i=>{let o=new Set(i);return o.has(s)?o.delete(s):o.add(s),o})}function Qe(s){Y(s?new Set(X.map(i=>i.name)):new Set)}async function Xe(){if(!R.trim()){c({text:l("skills.sourceRequired"),ok:!1});return}try{T(!1);let{skills:s,directInstall:i}=await qe();if(!t.current)return;if(i){await be();return}if(s.length===0){c({text:l("skills.scanEmpty"),ok:!1});return}if(s.length===1){await be([s[0].name]);return}c({text:l("skills.scanFound",{count:s.length}),ok:!0}),T(!0)}catch(s){t.current&&c({text:`${l("skills.failed")}: ${P(s?.message??String(s))}`,ok:!1})}}async function Ve(){let s=[...L];if(s.length===0){c({text:l("skills.discoverNothingSelected"),ok:!1});return}await be(s)}async function Ye(){let s=[...ge].filter(Boolean);if(s.length===0){c({text:l("skills.discoverNothingSelected"),ok:!1});return}Ne(!0);try{if(c({text:l("skills.discoverRegisteringBatch",{total:s.length}),ok:!0}),await w("/api/skills/install-local-links",{method:"POST",body:JSON.stringify({sources:s})}),!t.current)return;_(!1),await D(),t.current&&c({text:l("skills.saved"),ok:!0})}catch(i){t.current&&c({text:`${l("skills.failed")}: ${P(i?.message??String(i))}`,ok:!1})}finally{t.current&&Ne(!1)}}async function Ze(s){if(S!==s){Z("project");try{let i=await w("/api/skills/global",{method:"PUT",body:JSON.stringify({trustProjectSkills:s})});if(!t.current)return;I(i.trustProjectSkills==="all"?"all":s)}catch(i){t.current&&window.alert(`${l("skills.failed")}: ${P(i?.message??String(i))}`)}finally{t.current&&Z(null)}}}async function el(s){if(K!==s){Z("delivery");try{let i=await w("/api/skills/global",{method:"PUT",body:JSON.stringify({delivery:s})});if(!t.current)return;j(i.delivery==="prompt"||i.delivery==="native"?i.delivery:s)}catch(i){t.current&&window.alert(`${l("skills.failed")}: ${P(i?.message??String(i))}`)}finally{t.current&&Z(null)}}}async function ll(s){ee(`${s}:update`);try{let i=await w(`/api/skills/${encodeURIComponent(s)}/update`,{method:"POST",body:"{}"});if(!t.current)return;await De(i.job,c)}catch(i){t.current&&window.alert(`${l("skills.failed")}: ${P(i?.message??String(i))}`)}finally{t.current&&ee(null)}}async function sl(s){if(window.confirm(`${l("skills.remove")} ${s}?`)){ee(`${s}:remove`);try{if(await w(`/api/skills/${encodeURIComponent(s)}`,{method:"DELETE",body:"{}"}),!t.current)return;await D()}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(k=>{let b=k?.botName||k?.larkAppId;return b?`${b}`:""}).filter(Boolean):Fe(s),d=[o.length?`Bot: ${o.join(", ")}`:""].filter(Boolean).join("; ")||"-";if(!window.confirm(l("skills.removeInUse",{skill:s,refs:d})))return;try{if(await w(`/api/skills/${encodeURIComponent(s)}?force=1`,{method:"DELETE",body:"{}"}),!t.current)return;await D();return}catch(k){t.current&&window.alert(`${l("skills.failed")}: ${k?.message??k}`);return}}window.alert(`${l("skills.failed")}: ${P(i?.message??String(i))}`)}finally{t.current&&ee(null)}}}async function tl(s,i){let o=`${s}:set`;Pe(o),pe(d=>({...d,[s]:null}));try{let d=await w(`/api/bots/${encodeURIComponent(s)}/skills`,{method:"PUT",body:JSON.stringify({action:"set",policy:i.length>0?{include:i.map(k=>`skill:${k}`)}:null})});if(!t.current)return;h(k=>k.map(b=>b.larkAppId===s?{...b,skills:d.skills??null}:b)),pe(k=>({...k,[s]:{text:l("skills.policySaved"),ok:!0}}))}catch(d){throw t.current&&pe(k=>({...k,[s]:{text:`${l("skills.failed")}: ${P(d?.message??String(d))}`,ok:!1}})),d}finally{t.current&&Pe(null)}}let il=v.filter(s=>vl(s.skills)).length,nl=v.reduce((s,i)=>s+fl(i.skills),0),al=(0,e.jsxs)("div",{className:"page-heading-actions skills-heading-actions",children:[(0,e.jsxs)("div",{className:"skills-metric-strip",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("small",{children:l("skills.metricInstalled")}),(0,e.jsx)("strong",{children:g.length})]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("small",{children:l("skills.metricBots")}),(0,e.jsxs)("strong",{children:[il,"/",v.length]})]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("small",{children:l("skills.metricAttached")}),(0,e.jsx)("strong",{children:nl})]})]}),(0,e.jsx)(Ee,{id:"skills-refresh",label:l("skills.refresh"),busy:B,disabled:B,onClick:()=>{D()}})]}),ol=(0,e.jsx)("div",{className:"skills-page-stack",children:B?(0,e.jsx)(xe,{label:l("common.loading")}):A?(0,e.jsx)("p",{className:"hint-warn",children:A}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"skills-config-row",children:[(0,e.jsxs)("section",{className:"skills-config-block",children:[(0,e.jsx)(z,{title:l("skills.globalDefaults")}),(0,e.jsxs)("article",{className:"bd-card skills-defaults-panel skills-config-card",children:[(0,e.jsxs)("div",{className:"skills-control-block",children:[(0,e.jsx)("span",{className:"skills-control-label",children:l("skills.globalProject")}),(0,e.jsx)(Me,{value:S,disabled:Ce==="project",options:[{value:"off",label:l("skills.globalProjectOff"),help:l("skills.globalProjectOffHelp")},{value:"all",label:l("skills.globalProjectAll"),help:l("skills.globalProjectAllHelp")}],onChange:s=>{Ze(s)}})]}),(0,e.jsxs)("div",{className:"skills-control-block",children:[(0,e.jsx)("span",{className:"skills-control-label",children:l("skills.globalDelivery")}),(0,e.jsx)(Me,{value:K,disabled:Ce==="delivery",options:[{value:"auto",label:l("skills.deliveryAuto"),help:l("skills.deliveryAutoHelp")},{value:"prompt",label:l("skills.deliveryPrompt"),help:l("skills.deliveryPromptHelp")},{value:"native",label:l("skills.deliveryNative"),help:l("skills.deliveryNativeHelp")}],onChange:s=>{el(s)}})]})]})]}),(0,e.jsxs)("section",{className:"skills-config-block",children:[(0,e.jsx)(z,{title:(0,e.jsx)(ne,{help:l("skills.installInfo"),helpLabel:l("skills.installInfoLabel"),children:l("skills.install")})}),(0,e.jsx)(yl,{showTitle:!1,installSource:R,installPath:U,installRef:x,installStatus:m,installBusy:E,installDiscovering:ue,installSelectionOpen:Q,installCandidates:X,selectedInstallSkills:L,onInstallSourceChange:s=>{ce(s),te()},onInstallPathChange:s=>{de(s),te()},onInstallRefChange:s=>{r(s),te()},onToggleInstallSkill:Ue,onSelectAllInstallSkills:Qe,onConfirmInstallSelection:()=>{Ve()},onCloseInstallSelection:()=>T(!1),onInstall:()=>{Xe()},onOpenNativeDiscovery:()=>_(!0)})]}),(0,e.jsxs)("section",{className:"skills-config-block",children:[(0,e.jsx)(z,{title:l("skills.bots"),count:l("skills.botCount",{count:v.length}),hint:l("skills.botsHelp")}),(0,e.jsx)("section",{className:"bd-card skills-bots-panel skills-config-card",children:(0,e.jsx)("div",{className:"skills-bot-grid",children:v.map(s=>(0,e.jsx)(wl,{bot:s,installedNames:le,skills:g,status:Je[s.larkAppId]??null,busyKey:Ge,onSave:tl},s.larkAppId))})})]})]}),(0,e.jsxs)("section",{className:"skills-installed-block",children:[(0,e.jsx)(z,{title:l("skills.installed"),count:l("skills.skillCount",{count:g.length}),hint:l("skills.installedHelp"),children:M>1?(0,e.jsx)("div",{className:"skills-installed-toolbar",children:(0,e.jsxs)("div",{className:"skills-pager",children:[(0,e.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"-1","aria-label":l("skills.prevPage"),title:l("skills.prevPage"),disabled:G===0,onClick:()=>ve(s=>Math.max(0,s-1)),children:"\u2039"}),(0,e.jsx)("span",{children:l("skills.pageStatus",{page:G+1,pages:M})}),(0,e.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"1","aria-label":l("skills.nextPage"),title:l("skills.nextPage"),disabled:G>=M-1,onClick:()=>ve(s=>Math.min(M-1,s+1)),children:"\u203A"})]})}):null}),(0,e.jsx)("section",{className:"bd-card skills-installed-panel",children:g.length===0?(0,e.jsx)("p",{className:"empty",children:l("skills.empty")}):(0,e.jsx)("div",{className:"skills-list",children:We.map(s=>(0,e.jsxs)("article",{className:"skills-row skills-installed-card","data-skill":s.name,children:[(0,e.jsxs)("div",{className:"skills-row-body",children:[(0,e.jsx)("strong",{children:s.name}),s.description?(0,e.jsx)("p",{children:s.description}):null,(0,e.jsx)("small",{className:"skills-source-badge",children:gl(s,l)})]}),(0,e.jsxs)("div",{className:"skills-card-actions",children:[(0,e.jsx)("button",{type:"button","data-action":"update-skill",disabled:Ie===`${s.name}:update`,onClick:()=>{ll(s.name)},children:l("skills.update")}),(0,e.jsx)("button",{type:"button","data-action":"remove-skill",disabled:Ie===`${s.name}:remove`,onClick:()=>{sl(s.name)},children:l("skills.remove")})]})]},s.name))})})]}),(0,e.jsx)("dialog",{className:"skills-discovery-dialog",id:"skills-discovery-dialog",ref:f,onClose:()=>_(!1),onClick:s=>{s.target===s.currentTarget&&_(!1)},children:(0,e.jsxs)("article",{children:[(0,e.jsxs)("header",{children:[(0,e.jsx)("h3",{children:l("skills.discoverTitle")}),(0,e.jsx)("p",{children:l("skills.discoverHelp")}),(0,e.jsx)("button",{type:"button",className:"skills-discovery-close","data-action":"close-discovery","aria-label":l("skills.discoverClose"),title:l("skills.discoverClose"),onClick:()=>_(!1)})]}),(0,e.jsx)("div",{className:"skills-discovery-body",children:$?(0,e.jsx)(e.Fragment,{children:(0,e.jsxs)("div",{className:"skills-discovery-layout",children:[(0,e.jsx)("div",{className:"skills-discovery-tabs",role:"tablist","aria-label":l("skills.discoverTitle"),children:y.map(s=>{let i=ae(s),o=i===ye;return(0,e.jsxs)("button",{type:"button",role:"tab","data-discovery-tab":i,className:o?"selected":"","aria-selected":o?"true":"false",onClick:()=>_e(i),children:[(0,e.jsx)("strong",{children:s.label??s.cliId}),(0,e.jsx)("small",{children:l("skills.skillCount",{count:s.skills.length})})]},i)})}),(0,e.jsxs)("div",{className:"skills-discovery-main",children:[(0,e.jsx)("div",{className:"skills-discovery-path",children:(0,e.jsx)("code",{children:$.rootDir})}),y.map(s=>{let i=ae(s);return(0,e.jsx)("section",{className:"skills-discovery-group","data-discovery-panel":i,hidden:!(i===ye),children:s.skills.length===0?(0,e.jsx)("p",{className:"empty",children:l("skills.discoverGroupEmpty")}):(0,e.jsx)("div",{className:"skills-discovery-list",children:s.skills.map(d=>{let k=le.has(d.name),b=d.rootDir??d.source?.root??"";return(0,e.jsxs)("label",{className:`skills-discovery-row${k?" installed":""}`,children:[(0,e.jsx)("input",{type:"checkbox","data-discovered-skill":!0,value:b,disabled:k,checked:!k&&ge.has(b),onChange:W=>{let rl=W.currentTarget.checked;fe(cl=>{let he=new Set(cl);return rl?he.add(b):he.delete(b),he})}}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:d.name}),d.description?(0,e.jsx)("small",{children:d.description}):null]}),k?(0,e.jsx)("em",{children:l("skills.discoverRegistered")}):null]},`${d.name}:${b}`)})})},i)})]})]})}):(0,e.jsx)("p",{className:"empty",children:l("skills.discoverEmpty")})}),(0,e.jsxs)("footer",{className:"actions",children:[(0,e.jsx)("button",{type:"button","data-action":"toggle-discovered-skills",disabled:J.length===0,onClick:()=>{fe(s=>{let i=new Set(s);return Re?J.forEach(o=>i.delete(o)):J.forEach(o=>i.add(o)),i})},children:l(Re?"skills.discoverClearSelection":"skills.discoverSelectAll")}),(0,e.jsx)("button",{type:"button",className:"primary","data-action":"register-discovered-skills",disabled:Oe,onClick:()=>{Ye()},children:l("skills.discoverRegister")})]})]})})]})});return(0,e.jsxs)("section",{className:"page skills-page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:l("nav.skills")}),(0,e.jsx)("h1",{children:l("skills.title")})]}),al]}),(0,e.jsx)("div",{id:"skills-body",children:ol})]})}function hl(l,t){return l.size===t.length&&t.every(n=>l.has(n))}function Sl(l){let t=F(),n=(0,a.useRef)(null),f=(0,a.useRef)(null),g=(0,a.useRef)(null),[p,y]=(0,a.useState)(!1),[u,v]=(0,a.useState)(""),[h,S]=(0,a.useState)(()=>new Set(l.names)),[I,K]=(0,a.useState)(null),j=l.names.join(`
3
+ `),A=u.trim().toLocaleLowerCase(),N=(0,a.useMemo)(()=>{let r=new Map(l.skills.map(m=>[m.name,m]));for(let m of l.names)r.has(m)||r.set(m,{name:m});return[...r.values()].sort((m,c)=>m.name.localeCompare(c.name))},[l.names,l.skills]),B=(0,a.useMemo)(()=>A?N.filter(r=>`${r.name} ${r.description||""}`.toLocaleLowerCase().includes(A)):N,[A,N]),q=!hl(h,l.names),C=(0,a.useCallback)(()=>{let r=f.current;if(!r||typeof window>"u")return;let m=r.getBoundingClientRect(),c=12,E=7,H=Math.min(370,Math.max(260,window.innerWidth-c*2)),ue=Math.min(Math.max(c,m.left),Math.max(c,window.innerWidth-H-c)),O=Math.max(0,m.top-E-c),Q=Math.max(0,window.innerHeight-m.bottom-E-c),T=O>Q,X=T?O:Q,V=118+Math.min(N.length,5)*42,L=Math.max(180,Math.min(V,X));K({left:ue,top:T?Math.max(c,m.top-E-L):m.bottom+E,width:H,height:L})},[N.length]);(0,a.useEffect)(()=>{p||S(new Set(l.names))},[j,p]),(0,a.useEffect)(()=>{if(!p||typeof document>"u")return;let r=m=>{n.current?.contains(m.target)||g.current?.contains(m.target)||(y(!1),v(""),S(new Set(l.names)))};return document.addEventListener("pointerdown",r),window.addEventListener("resize",C),window.addEventListener("scroll",C,!0),C(),()=>{document.removeEventListener("pointerdown",r),window.removeEventListener("resize",C),window.removeEventListener("scroll",C,!0)}},[j,p,C]);function re(){S(new Set(l.names)),v(""),C(),y(!0)}function R(){S(new Set(l.names)),v(""),y(!1)}function ce(r){S(m=>{let c=new Set(m);return c.has(r)?c.delete(r):c.add(r),c})}async function U(){let r=[...h].sort((m,c)=>m.localeCompare(c));try{await l.onSave(r),v(""),y(!1)}catch{}}let de=l.names.length===0?t("skills.pickerPlaceholder"):l.names.length===1?l.names[0]:t("skills.pickerSelectedCount",{count:l.names.length}),x=p?(0,e.jsxs)("div",{ref:g,className:"skills-multi-picker-popover",style:I?{left:I.left,top:I.top,width:I.width,height:I.height}:void 0,children:[(0,e.jsxs)("div",{className:"skills-multi-picker-head",children:[(0,e.jsxs)("label",{className:"skills-multi-picker-search",children:[(0,e.jsx)("span",{className:"skills-multi-picker-search-icon","aria-hidden":"true"}),(0,e.jsx)("input",{type:"search","data-action":"search-skills",autoFocus:!0,autoComplete:"off",value:u,placeholder:t("skills.pickerSearchPlaceholder"),onChange:r=>v(r.currentTarget.value),onKeyDown:r=>{r.key==="Escape"&&(r.preventDefault(),R())}})]}),(0,e.jsxs)("div",{className:"skills-multi-picker-meta",children:[(0,e.jsx)("span",{children:t("skills.pickerSelectionMeta",{selected:h.size,total:N.length})}),h.size>0?(0,e.jsx)("button",{type:"button",className:"skills-multi-picker-clear","data-action":"clear-skill-selection",onClick:()=>S(new Set),children:t("skills.pickerClear")}):null]})]}),(0,e.jsxs)("div",{className:"skills-multi-picker-options",role:"listbox","aria-label":t("skills.priority"),"aria-multiselectable":"true",children:[B.map(r=>{let m=h.has(r.name),c=!l.installedNames.has(r.name);return(0,e.jsxs)("button",{type:"button",className:`skills-multi-picker-option${m?" selected":""}${c?" dangling":""}`,role:"option","aria-selected":m,"data-skill-name":r.name,onClick:()=>ce(r.name),children:[(0,e.jsx)("span",{className:"skills-multi-picker-check","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"skills-multi-picker-option-copy",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("b",{children:r.name}),c?(0,e.jsx)("em",{children:t("skills.dangling")}):null]}),r.description?(0,e.jsx)("small",{children:r.description}):null]})]},r.name)}),B.length===0?(0,e.jsx)("p",{className:"skills-multi-picker-empty",children:t("skills.pickerNoResults")}):null]}),(0,e.jsxs)("footer",{className:"skills-multi-picker-actions",children:[(0,e.jsx)("button",{type:"button",className:"ghost","data-action":"cancel-skill-selection",disabled:l.busy,onClick:R,children:t("skills.cancel")}),(0,e.jsx)("button",{type:"button",className:"primary","data-action":"save-skill-selection",disabled:!q||l.busy,onClick:()=>{U()},children:l.busy?t("skills.saving"):t("skills.saveSelection")})]})]}):null;return(0,e.jsxs)("div",{ref:n,className:`skills-multi-picker${p?" open":""}`,"data-skill-picker":l.botId,children:[(0,e.jsxs)("button",{ref:f,type:"button",className:"skills-multi-picker-trigger","data-action":"open-skill-picker","aria-haspopup":"listbox","aria-expanded":p,disabled:l.busy,onClick:()=>p?R():re(),children:[(0,e.jsxs)("span",{className:"skills-multi-picker-trigger-copy",children:[(0,e.jsx)("b",{children:de}),(0,e.jsx)("small",{children:t("skills.pickerTriggerHint")})]}),(0,e.jsx)("span",{className:"skills-multi-picker-chevron","aria-hidden":"true"})]}),x&&typeof document<"u"?(0,je.createPortal)(x,document.body):x]})}function wl(l){let t=F(),{bot:n,installedNames:f,skills:g,status:p,busyKey:y,onSave:u}=l,v=n.botName??n.larkAppId,h=oe(n.skills);return n.error?(0,e.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,e.jsxs)("header",{children:[(0,e.jsx)(we,{html:Se({name:v,larkAppId:n.larkAppId,size:"sm"})}),(0,e.jsx)("strong",{children:v})]}),(0,e.jsx)("p",{className:"hint-warn-inline",children:n.error})]}):(0,e.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,e.jsxs)("header",{className:"skills-bot-head",children:[(0,e.jsx)(we,{html:Se({name:v,larkAppId:n.larkAppId,size:"sm",dot:"ok"})}),(0,e.jsxs)("div",{className:"skills-bot-title-line",children:[(0,e.jsx)("strong",{children:v}),(0,e.jsx)("span",{className:"skills-count-pill",children:t("skills.skillCount",{count:h.length})})]})]}),(0,e.jsxs)("section",{className:"skills-policy-panel",children:[(0,e.jsx)("div",{className:"skills-priority-head",children:(0,e.jsx)("h3",{className:"skills-priority-title",children:t("skills.priority")})}),(0,e.jsx)(Sl,{botId:n.larkAppId,names:h,installedNames:f,skills:g,busy:y===`${n.larkAppId}:set`,onSave:S=>u(n.larkAppId,S)})]}),(0,e.jsx)("span",{className:He(p),"data-bot-status":!0,children:p?.text??""})]})}function Rl(l){return Le(l,(0,e.jsx)(bl,{}))}export{wl as BotPolicyCard,Sl as SkillMultiPicker,yl as SkillsInstallPanel,Rl as renderSkillsPage};
@@ -0,0 +1 @@
1
+ import{a as G,b as J,c as S,d as re}from"./chunk-EVK77ASG.js";import{a as q,c as E}from"./chunk-BRTZFELS.js";import{a as oe,d as K,g as ie,p as se}from"./chunk-6TPODDDC.js";import{a as z,d as ne}from"./chunk-ZJING6FY.js";import{c as L}from"./chunk-XCPSHD3G.js";var d=L(z(),1);async function V(){return G("/api/team/hosted")}async function le(){return G("/api/team/remote-roster")}async function de(t,a){return re("/api/team/local-bots/"+encodeURIComponent(t)+"/capability",{capability:a})}async function me(t){return G("/api/team/local-bots/"+encodeURIComponent(t)+"/role")}async function ce(t){return S("/api/team/identity/auto-bind",t?{unionId:t}:void 0)}async function ue(t,a){return J("DELETE",`/api/team/hosted/${encodeURIComponent(t)}/members/${encodeURIComponent(a)}`)}async function pe(t,a,n){return S("/api/team/federated-group",{name:a,larkAppIds:n,teamId:t})}async function ge(t,a,n,o){return S("/api/team/remote-group",{hubUrl:t,teamId:a,name:n,larkAppIds:o})}async function ye(t){return S("/api/team/hosted",{name:t})}async function fe(t){return J("DELETE","/api/team/hosted/"+encodeURIComponent(t))}async function be(t){return S("/api/team/local-invite",{teamId:t})}async function ke(t,a){return S("/api/team/join-remote",{hubUrl:t,inviteCode:a})}function F(t,a){let n=a.query.trim().toLowerCase();return!(n&&!((t.name||"")+" "+(t.cliId||"")+" "+(t.capability||"")).toLowerCase().includes(n)||a.cliId&&t.cliId!==a.cliId||a.hasCapability&&!t.capability||a.hasRole&&!t.hasTeamRole)}function he(t){return Array.from(new Set(t.flatMap(a=>a.bots.map(n=>n.cliId)).filter(Boolean))).sort()}function ve(t,a){return(t.teams||[]).map(n=>({kind:"local",key:`local:${n.teamId}`,teamId:n.teamId,label:n.isDefault?a("team.myHostedTeam"):n.name,sub:"",ok:!0,deployments:n.deployments||[],bots:n.bots||[]}))}function Te(t,a){return(t.memberships||[]).map(o=>{let m=o.roster?.deployments||[],r=m.find(v=>v.local),p=r?.name?a("team.remoteTeamLabel",{name:r.name}):o.teamName||o.teamId;return{kind:"remote",key:`${o.hubUrl}::${o.teamId}`,teamId:o.teamId,label:p,sub:o.hubUrl,ok:!!o.ok,error:o.error,hubUrl:o.hubUrl,deployments:m,bots:o.roster?.bots||[]}})}function W(t,a,n){return t.map(o=>({...o,bots:o.bots.map(m=>m.larkAppId===a?{...m,capability:n.trim()||null}:m)}))}var e=L(ne(),1),we=L(z(),1);function Ie(){let t=(0,d.useRef)(!0);return(0,d.useEffect)(()=>(t.current=!0,()=>{t.current=!1}),[]),t}function Ce(t){let a=E(),n=t.active==="home",o=t.active==="manage";return(0,e.jsxs)("nav",{className:"team-subnav insight-tabs",role:"tablist","aria-label":a("team.eyebrow"),children:[(0,e.jsx)("a",{href:"#/team",className:`itab${n?" on":""}`,role:"tab","aria-selected":n,children:a("team.navHome")}),(0,e.jsx)("a",{href:"#/team/manage",className:`itab${o?" on":""}`,role:"tab","aria-selected":o,children:a("team.navManage")})]})}function Q(t,a){return t.get(a)??new Set}function He(){let t=E(),a=Ie(),[n,o]=(0,d.useState)([]),[m,r]=(0,d.useState)([]),[p,v]=(0,d.useState)(""),[N,T]=(0,d.useState)(t("team.unbound")),[u,R]=(0,d.useState)({query:"",cliId:"",hasCapability:!1,hasRole:!1}),[P,M]=(0,d.useState)(()=>new Map),[D,x]=(0,d.useState)(()=>new Map),[O,I]=(0,d.useState)(()=>new Set),[B,A]=(0,d.useState)(()=>new Set),[U,C]=(0,d.useState)({kind:"hidden"}),[j,c]=(0,d.useState)(()=>new Map),[g,h]=(0,d.useState)(null),y=(0,d.useMemo)(()=>[...n,...m],[n,m]),Y=(0,d.useMemo)(()=>he(y),[y]),Z=(0,d.useMemo)(()=>[{value:"",label:t("team.allCli")},...Y.map(i=>({value:i,label:i}))],[Y,t]),H=(0,d.useCallback)(async()=>{let i=await V();if(!a.current)return;let s=i.body;if(!s?.ok){o([]);return}v(s.deployment?.deploymentId??""),T(s.deployment?.ownerName||(s.deployment?.ownerUnionId?t("team.bound"):t("team.unbound"))),o(ve(s,t))},[a,t]),ee=(0,d.useCallback)(async()=>{let i=await le();a.current&&r(Te(i.body,t))},[a,t]);(0,d.useEffect)(()=>{M(new Map),x(new Map),I(new Set),A(new Set),H(),ee()},[H,ee]),(0,d.useEffect)(()=>{T(i=>i==="\u672A\u7ED1\u5B9A"||i==="Unbound"?t("team.unbound"):i)},[t]),(0,d.useEffect)(()=>{let i=new Map;for(let s of y)i.set(s.key,new Set(s.bots.filter(l=>F(l,u)).map(l=>l.larkAppId)));M(s=>{let l=!1,f=new Map;for(let[b,k]of s){let w=i.get(b),$=new Set([...k].filter(Ae=>w?.has(Ae)));$.size!==k.size&&(l=!0),$.size&&f.set(b,$)}return l?f:s})},[u,y]);let te=(0,d.useMemo)(()=>{if(!y.length)return"";let i=new Set,s=new Set;for(let b of y)b.bots.filter(w=>F(w,u)).forEach(w=>i.add(w.larkAppId)),b.bots.forEach(w=>s.add(w.larkAppId));let l=y.length>1?t("team.acrossTeams",{n:y.length}):"";return`\xB7 ${i.size===s.size?`${s.size}`:`${i.size} / ${s.size}`} ${t("team.botsWord")}${l}`},[u,y,t]);function _(i,s){c(l=>{let f=new Map(l);return f.set(i,s),f})}function Se(i,s,l){M(f=>{let b=new Map(f),k=new Set(b.get(i)??[]);return l?k.add(s):k.delete(s),k.size?b.set(i,k):b.delete(i),b})}function Me(i,s){x(l=>{let f=new Map(l);return s?f.set(i,s):f.delete(i),f})}async function xe(i,s){await de(i,s),a.current&&(o(l=>W(l,i,s)),r(l=>W(l,i,s)))}async function Be(i,s){let l=await me(i);a.current&&h({app:i,name:s,content:l.body?.role||""})}async function Pe(i,s,l){confirm(t("team.removeMemberConfirm",{name:l}))&&(await ue(i,s),a.current&&H())}async function De(i){let s=[...Q(P,i.key)];if(!s.length){_(i.key,{kind:"err",key:"team.errPickBot"});return}let l=(D.get(i.key)||"").trim()||t("team.defaultGroupName");_(i.key,{kind:"muted",key:"team.creatingGroup"});let f=i.kind==="local"?await pe(i.teamId,l,s):await ge(i.hubUrl,i.teamId,l,s);a.current&&(_(i.key,{kind:"group-result",body:f.body,status:f.status}),f.body?.ok&&(M(b=>{let k=new Map(b);return k.delete(i.key),k}),x(b=>{let k=new Map(b);return k.delete(i.key),k}),i.kind==="local"&&H()))}async function ae(i){C({kind:"loading",key:i?"team.binding":"team.identifying"});let s=await ce(i);if(!a.current)return;let l=s.body;if(l?.ok&&l.owner){C({kind:"ok",name:l.owner.name||l.owner.unionId||""}),H();return}if(l?.ok&&l.needChoice&&Array.isArray(l.candidates)){C({kind:"choice",candidates:l.candidates});return}if(l?.error==="no_candidates"){C({kind:"err",key:"team.noCandidates"});return}C({kind:"bind-fail",error:String(l?.error||"unknown")})}return(0,e.jsxs)("section",{className:"page team-page team-home-page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("team.eyebrow")}),(0,e.jsx)("h1",{children:t("team.homeTitle")})]}),(0,e.jsx)("div",{className:"page-heading-actions",children:(0,e.jsx)(Ce,{active:"home"})})]}),(0,e.jsxs)("section",{className:"overview-block team-identity-section",children:[(0,e.jsx)(K,{title:t("team.localDeployTitle"),hint:t("team.bindHint")}),(0,e.jsx)("div",{className:"card team-card team-identity-card",children:(0,e.jsxs)("p",{className:"team-identity-row",children:[(0,e.jsx)("span",{className:"team-identity-label",children:t("team.myIdentity")}),(0,e.jsx)("b",{id:"tf-owner",children:N}),(0,e.jsx)("button",{type:"button",id:"tf-autobind",className:"page-primary-action",onClick:()=>{ae()},children:t("team.bindBtn")}),(0,e.jsx)("span",{id:"tf-bind-out",className:"team-bind-status",hidden:U.kind==="hidden",children:(0,e.jsx)(Le,{state:U,tr:t,onPick:i=>{ae(i)}})})]})})]}),(0,e.jsxs)("section",{className:"overview-block team-roster-section",children:[(0,e.jsx)(K,{title:t("team.myTeams"),count:te?te.replace(/^·\s*/,""):void 0,hint:t("team.teamsHint")}),(0,e.jsxs)("div",{className:"card team-card team-roster-card",children:[(0,e.jsxs)("form",{className:"team-filters dashboard-toolbar",onSubmit:i=>i.preventDefault(),children:[(0,e.jsx)("input",{id:"tf-search",type:"search",placeholder:t("team.searchPh"),value:u.query,onChange:i=>R(s=>({...s,query:i.target.value}))}),(0,e.jsx)(se,{id:"tf-cli",className:"team-cli-menu",ariaLabel:t("team.allCli"),value:u.cliId,label:oe(Z,u.cliId),options:Z,onChange:i=>R(s=>({...s,cliId:i}))}),(0,e.jsxs)("label",{className:"filter-toggle",children:[(0,e.jsx)("input",{type:"checkbox",id:"tf-fcap",checked:u.hasCapability,onChange:i=>R(s=>({...s,hasCapability:i.target.checked}))}),(0,e.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"}),(0,e.jsx)("span",{className:"filter-toggle-label",children:t("team.hasCap")})]}),(0,e.jsxs)("label",{className:"filter-toggle",children:[(0,e.jsx)("input",{type:"checkbox",id:"tf-frole",checked:u.hasRole,onChange:i=>R(s=>({...s,hasRole:i.target.checked}))}),(0,e.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"}),(0,e.jsx)("span",{className:"filter-toggle-label",children:t("team.hasRole")})]})]}),(0,e.jsx)("div",{id:"tf-teams",children:(0,e.jsx)(Oe,{teams:y,filters:u,pickedByTeam:P,gnameByTeam:D,expandedTeams:O,expandedDeps:B,groupOutputs:j,myDeploymentId:p,tr:t,onToggleTeam:i=>I(s=>Ne(s,i)),onToggleDep:i=>A(s=>Ne(s,i)),onPick:Se,onGroupNameChange:Me,onCapabilityChange:(i,s)=>{xe(i,s)},onOpenRole:(i,s)=>{Be(i,s)},onRemoveMember:(i,s,l)=>{Pe(i,s,l)},onPullGroup:i=>{De(i)}})})]})]}),(0,e.jsx)(_e,{state:g,tr:t,onClose:()=>h(null)})]})}function Ne(t,a){let n=new Set(t);return n.has(a)?n.delete(a):n.add(a),n}function Le(t){let{state:a,tr:n}=t;return a.kind==="hidden"?null:a.kind==="loading"?(0,e.jsx)("span",{className:"team-bind-loading",children:n(a.key)}):a.kind==="ok"?(0,e.jsx)("span",{className:"ok",children:n("team.bound2",{name:a.name})}):a.kind==="choice"?(0,e.jsxs)(e.Fragment,{children:[n("team.multiCandidate"),(0,e.jsx)("br",{}),a.candidates.map(o=>(0,e.jsx)("button",{type:"button",className:"tf-pickowner ghost","data-union":o.unionId,style:{margin:"2px"},onClick:()=>t.onPick(o.unionId),children:o.name||o.unionId},o.unionId))]}):a.kind==="err"?(0,e.jsx)("span",{className:"err",children:n(a.key)}):(0,e.jsx)("span",{className:"err",children:n("team.bindFail",{error:a.error})})}function Oe(t){let{tr:a}=t;return t.teams.length?(0,e.jsx)(e.Fragment,{children:t.teams.map(n=>{let o=n.bots.filter(p=>F(p,t.filters)),m=!t.expandedTeams.has(n.key),r=n.kind==="remote"?n.ok?(0,e.jsx)("span",{className:"team-status-pill ok",children:a("team.connected")}):(0,e.jsx)("span",{className:"team-status-pill err",children:a("team.connectFail",{error:n.error||""})}):(0,e.jsx)("span",{className:"team-status-pill muted",children:a("team.iHost")});return(0,e.jsxs)("article",{className:"card team-list-card",children:[(0,e.jsxs)("button",{type:"button",className:"tf-team-h","data-tk":n.key,"aria-expanded":!m,onClick:()=>t.onToggleTeam(n.key),children:[(0,e.jsx)("span",{className:"team-chevron","aria-hidden":"true",children:m?"\u203A":"\u2304"}),(0,e.jsx)("b",{children:n.label}),n.sub?(0,e.jsx)("span",{className:"muted",children:n.sub}):null,r,(0,e.jsx)("span",{className:"team-meta-pill",children:a("team.teamMeta",{deps:n.deployments.length,bots:n.bots.length})})]}),m?null:n.kind==="remote"&&!n.ok?(0,e.jsx)("p",{className:"muted",style:{margin:"8px 0 0"},children:a("team.rosterFail")}):(0,e.jsx)(Ue,{...t,team:n,filtered:o})]},n.key)})}):(0,e.jsx)("p",{className:"muted",children:a("team.noTeams")})}function Ue(t){let{team:a,tr:n}=t,o=[...a.deployments].sort((r,p)=>r.local===p.local?0:r.local?-1:1),m=o.some(r=>t.filtered.some(p=>p.deployment.id===r.id));return(0,e.jsxs)(e.Fragment,{children:[o.map(r=>(0,we.createElement)(je,{...t,deployment:r,key:r.id})),m?null:(0,e.jsx)("p",{className:"muted",style:{margin:"8px 0 0"},children:n("team.noMatch")}),(0,e.jsxs)("div",{className:"team-pull-row",children:[(0,e.jsxs)("label",{className:"team-pill-field team-group-name-field",children:[(0,e.jsx)("span",{children:n("team.gnameLabel")}),(0,e.jsx)("input",{className:"tf-gname","data-tk":a.key,value:t.gnameByTeam.get(a.key)||"",placeholder:n("team.gnamePlaceholder"),onChange:r=>t.onGroupNameChange(a.key,r.target.value)})]}),(0,e.jsx)("button",{className:"tf-grp page-primary-action","data-tk":a.key,onClick:()=>t.onPullGroup(a),children:n("team.pullGroupBtn")}),(0,e.jsx)("span",{className:"muted team-pull-hint",children:n("team.pullGroupHint")}),(0,e.jsx)("span",{className:"tf-gout","data-tk":a.key,children:(0,e.jsx)(Ge,{output:t.groupOutputs.get(a.key),tr:n})})]})]})}function je(t){let{team:a,deployment:n,tr:o}=t,m=t.filtered.filter(u=>u.deployment.id===n.id);if(!m.length)return null;let r=n.id===t.myDeploymentId,p=r?o("team.tagLocal"):n.stale?o("team.tagRemoteStale"):o("team.tagRemote"),v=`${a.key}::${n.id}`,N=t.expandedDeps.has(v),T=m.filter(u=>Q(t.pickedByTeam,a.key).has(u.larkAppId)).length;return(0,e.jsxs)("section",{className:"team-deployment-block",children:[(0,e.jsxs)("div",{className:"tf-dep-h","data-dk":v,"aria-expanded":N,role:"button",tabIndex:0,onClick:()=>t.onToggleDep(v),onKeyDown:u=>{u.key!=="Enter"&&u.key!==" "||(u.preventDefault(),t.onToggleDep(v))},children:[(0,e.jsx)("span",{className:"team-chevron","aria-hidden":"true",children:N?"\u2304":"\u203A"}),(0,e.jsx)("b",{children:n.name}),(0,e.jsxs)("span",{className:"muted",children:[o("team.depTag",{tag:p})," \xB7 ",o("team.depCount",{count:m.length}),T?o("team.depSelected",{n:T}):""]}),a.kind==="local"&&!r?(0,e.jsx)("button",{type:"button",className:"tf-rmmember ghost","data-team":a.teamId,"data-dep":n.id,"data-name":n.name,onClick:u=>{u.stopPropagation(),t.onRemoveMember(a.teamId,n.id,n.name)},children:o("team.removeMember")}):null]}),N?(0,e.jsx)("div",{className:"team-roster-list",children:m.map(u=>(0,e.jsx)(Ee,{bot:u,mine:r,picked:Q(t.pickedByTeam,a.key).has(u.larkAppId),teamKey:a.key,tr:o,onPick:t.onPick,onCapabilityChange:t.onCapabilityChange,onOpenRole:t.onOpenRole},u.larkAppId))}):null]})}function Ee(t){let{bot:a,tr:n}=t,o=a.deployment.stale?{opacity:.55}:void 0,m=()=>t.onPick(t.teamKey,a.larkAppId,!t.picked);return(0,e.jsxs)("article",{className:`team-bot-row${t.picked?" selected":""}`,style:o,role:"checkbox","aria-checked":t.picked,tabIndex:0,onClick:r=>{Re(r.target)||m()},onKeyDown:r=>{r.key!=="Enter"&&r.key!==" "||Re(r.target)||(r.preventDefault(),m())},children:[(0,e.jsxs)("label",{className:`team-check-pill${t.picked?" selected":""}`,onClick:r=>r.stopPropagation(),children:[(0,e.jsx)("input",{type:"checkbox",className:"tf-pick","data-tk":t.teamKey,"data-app":a.larkAppId,checked:t.picked,onChange:r=>t.onPick(t.teamKey,a.larkAppId,r.target.checked)}),(0,e.jsx)("span",{className:"team-check-dot","aria-hidden":"true"})]}),(0,e.jsxs)("div",{className:"team-bot-main",children:[(0,e.jsx)("strong",{children:a.name}),(0,e.jsx)("span",{children:a.larkAppId})]}),(0,e.jsx)("span",{className:"team-meta-pill",children:a.cliId}),(0,e.jsx)("div",{className:"team-capability-cell",children:t.mine?(0,e.jsxs)("label",{className:"team-pill-field team-cap-field",children:[(0,e.jsx)("span",{children:n("team.capLabel")}),(0,e.jsx)("input",{className:"tf-cap","data-app":a.larkAppId,defaultValue:a.capability||"",placeholder:n("team.capPh"),onBlur:r=>{let p=r.target.value;p!==(a.capability||"")&&t.onCapabilityChange(a.larkAppId,p)},onKeyDown:r=>{r.key==="Enter"&&(r.preventDefault(),r.currentTarget.blur())}})]}):a.capability||null}),(0,e.jsx)("div",{className:"team-role-cell",children:a.hasTeamRole?t.mine?(0,e.jsx)("button",{className:"tf-role","data-app":a.larkAppId,"data-name":a.name,onClick:()=>t.onOpenRole(a.larkAppId,a.name),children:n("team.viewRole")}):n("team.hasRoleShort"):(0,e.jsx)("span",{className:"muted",children:"\u2014"})})]})}function Re(t){return t instanceof HTMLElement?!!t.closest('button, input, textarea, select, a, label, [contenteditable="true"]'):!1}function Ge(t){let{output:a,tr:n}=t;return a?a.kind==="muted"?(0,e.jsx)("span",{className:"muted",children:n(a.key)}):a.kind==="err"?(0,e.jsx)("span",{className:"err",children:n(a.key)}):(0,e.jsx)(Fe,{body:a.body,status:a.status,tr:n}):null}function Fe(t){let{body:a,status:n,tr:o}=t;if(a?.ok&&a.chatId){let p=a.shareLink||"https://applink.feishu.cn/client/chat/open?openChatId="+encodeURIComponent(a.chatId);return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{className:"ok",children:o("team.groupCreated")}),a.delegatedTo?o("team.delegatedBy",{name:String(a.delegatedTo)}):""," \xB7 ",(0,e.jsx)("a",{href:p,target:"_blank",rel:"noreferrer",children:o("team.openInLark")}),(a.invalidBotIds||[]).length?(0,e.jsxs)("span",{className:"err",children:[" \xB7 ",o("team.invalidBots",{ids:(a.invalidBotIds||[]).join(", ")})]}):null,(a.invalidOwnerUnionIds||[]).length?(0,e.jsxs)("span",{className:"err",children:[" \xB7 ",o("team.invalidOwners",{n:(a.invalidOwnerUnionIds||[]).length})]}):null,a.missingOperatorIdentity?(0,e.jsxs)("span",{className:"err",children:[" \xB7 ",o("team.missingIdentity")]}):null,(a.skippedNoOwner||[]).length?(0,e.jsxs)("span",{className:"err",children:[" \xB7 ",o("team.skippedNoOwner",{n:(a.skippedNoOwner||[]).length})]}):null]})}let m=a?.error||n,r=m==="no_local_online_bot"?o("team.errNoLocalBot"):m==="all_bots_skipped_no_owner"?o("team.errAllSkipped"):m==="no_creator_available"?o("team.errNoCreator"):m==="delegation_timeout"?o("team.errDelegationTimeout"):o("team.errGroupCreate",{error:String(m)});return(0,e.jsx)("span",{className:"err",children:r})}function _e(t){let{state:a,tr:n}=t;return(0,e.jsx)("div",{id:"tf-modal",className:"team-role-modal","data-app":a?.app,hidden:!a,children:(0,e.jsxs)("div",{className:"team-role-dialog",children:[(0,e.jsx)("h2",{id:"tf-modal-title",children:a?n("team.roleModalTitleName",{name:a.name}):n("team.roleModalTitle")}),(0,e.jsx)("p",{className:"muted",style:{fontSize:"13px"},children:n("team.roleModalHint")}),(0,e.jsx)("textarea",{id:"tf-modal-text",readOnly:!0,value:a?.content??""}),(0,e.jsx)("div",{className:"team-role-actions",children:(0,e.jsx)("button",{type:"button",id:"tf-modal-cancel",onClick:t.onClose,children:n("team.close")})})]})})}function $e(){let t=E(),a=Ie(),[n,o]=(0,d.useState)([]),[m,r]=(0,d.useState)(""),[p,v]=(0,d.useState)(""),[N,T]=(0,d.useState)({kind:"none"}),[u,R]=(0,d.useState)(()=>new Map),[P,M]=(0,d.useState)(""),[D,x]=(0,d.useState)(""),[O,I]=(0,d.useState)({kind:"none"}),B=(0,d.useCallback)(async()=>{let c=await V();if(!a.current)return;let g=c.body;r(h=>g?.suggestedHubUrl||h),o(g?.teams||[])},[a]);(0,d.useEffect)(()=>{B()},[B]);async function A(){let c=p.trim();if(!c){T({kind:"err",key:"team.errName"});return}T({kind:"muted",key:"team.creating"});let g=await ye(c);a.current&&(g.body?.ok?(T({kind:"ok",key:"team.created"}),v(""),B()):T({kind:"create-fail",error:String(g.body?.error||g.status)}))}async function U(c){R(h=>{let y=new Map(h);return y.set(c,{kind:"muted",key:"team.generating"}),y});let g=await be(c);a.current&&R(h=>{let y=new Map(h);return y.set(c,g.body?.code?{kind:"invite",code:g.body.code}:{kind:"err",key:"team.genFail"}),y})}async function C(c,g){confirm(t("team.delConfirm",{name:g}))&&(await fe(c),a.current&&B())}async function j(){let c=P.trim(),g=D.trim();if(I({kind:"muted",key:"team.joining"}),!c||!g){I({kind:"err",key:"team.errHubCode"});return}let h=await ke(c,g);a.current&&(h.body?.ok?(I({kind:"joined",name:String(h.body.teamName||"")}),x("")):I({kind:"join-fail",error:h.body?.error||h.status}))}return(0,e.jsxs)("section",{className:"page team-page team-manage-page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("team.eyebrow")}),(0,e.jsx)("h1",{children:t("team.manageTitle")})]}),(0,e.jsx)("div",{className:"page-heading-actions",children:(0,e.jsx)(Ce,{active:"manage"})})]}),(0,e.jsxs)("div",{className:"card team-card",children:[(0,e.jsx)("div",{className:"team-card-head",children:(0,e.jsx)("h2",{children:t("team.hostedTitle")})}),(0,e.jsxs)("form",{className:"team-inline-form dashboard-toolbar",onSubmit:c=>{c.preventDefault(),A()},children:[(0,e.jsx)("input",{id:"tm-newname",type:"text",placeholder:t("team.newTeamPh"),value:p,onChange:c=>v(c.target.value)}),(0,e.jsx)(ie,{id:"tm-create",className:"page-primary-action",onClick:()=>{A()},children:t("team.createTeamBtn")}),(0,e.jsx)("span",{className:"toolbar-status tm-cout",children:(0,e.jsx)(X,{status:N,tr:t})})]}),(0,e.jsx)("div",{id:"tm-list",children:(0,e.jsx)(ze,{teams:n,suggestedHubUrl:m,inviteStatuses:u,tr:t,onInvite:c=>{U(c)},onDelete:(c,g)=>{C(c,g)}})})]}),(0,e.jsxs)("div",{className:"card team-card",children:[(0,e.jsx)("div",{className:"team-card-head",children:(0,e.jsx)("h2",{children:t("team.joinTitle")})}),(0,e.jsxs)("form",{className:"team-inline-form dashboard-toolbar team-join-form",onSubmit:c=>{c.preventDefault(),j()},children:[(0,e.jsx)("input",{id:"tm-hub",type:"text",placeholder:t("team.hubPh"),value:P,onChange:c=>M(c.target.value)}),(0,e.jsx)("input",{id:"tm-code",type:"text",placeholder:t("team.codePh"),value:D,onChange:c=>x(c.target.value)}),(0,e.jsx)("button",{type:"button",id:"tm-join",className:"page-primary-action",onClick:()=>{j()},children:t("team.joinBtn")})]}),(0,e.jsx)("div",{id:"tm-join-out",className:"team-inline-output",hidden:O.kind==="none",children:(0,e.jsx)(X,{status:O,tr:t})})]})]})}function ze(t){let{teams:a,tr:n}=t;return a.length?(0,e.jsx)(e.Fragment,{children:a.map(o=>{let m=(o.deployments||[]).filter(p=>!p.local).length,r=t.inviteStatuses.get(o.teamId)??{kind:"none"};return(0,e.jsxs)("div",{className:"card team-list-card team-manage-card",children:[(0,e.jsxs)("div",{className:"team-manage-head",children:[(0,e.jsx)("b",{children:o.name}),o.isDefault?(0,e.jsx)("span",{className:"team-status-pill muted",children:n("team.default")}):null,(0,e.jsxs)("span",{className:"team-meta-pill",children:[n("team.manageMetaDeps",{count:(o.deployments||[]).length}),m?n("team.manageMetaRemote",{r:m}):""," \xB7 ",n("team.manageMetaBots",{count:(o.bots||[]).length})]}),(0,e.jsxs)("span",{className:"team-manage-actions",children:[(0,e.jsx)("button",{className:"tm-invite ghost","data-team":o.teamId,onClick:()=>t.onInvite(o.teamId),children:n("team.genInvite")}),o.isDefault?null:(0,e.jsx)("button",{className:"tm-del ghost","data-team":o.teamId,"data-name":o.name,onClick:()=>t.onDelete(o.teamId,o.name),children:n("team.delBtn")})]})]}),(0,e.jsx)("div",{className:"tm-inv-out team-inline-output","data-team":o.teamId,hidden:r.kind==="none",children:(0,e.jsx)(X,{status:r,tr:n,suggestedHubUrl:t.suggestedHubUrl})})]},o.teamId)})}):(0,e.jsx)("p",{className:"muted",children:n("team.noTeamsShort")})}function X(t){let{status:a,tr:n}=t;if(a.kind==="none")return null;if(a.kind==="muted")return(0,e.jsx)("span",{className:"muted",children:n(a.key)});if(a.kind==="ok")return(0,e.jsx)("span",{className:"ok",children:n(a.key)});if(a.kind==="err")return(0,e.jsx)("span",{className:"err",children:n(a.key)});if(a.kind==="create-fail")return(0,e.jsx)("span",{className:"err",children:n("team.createFail",{error:a.error})});if(a.kind==="invite")return(0,e.jsxs)(e.Fragment,{children:[n("team.inviteResultLede"),(0,e.jsx)("br",{}),n("team.inviteHub"),(0,e.jsx)("code",{children:t.suggestedHubUrl||""}),(0,e.jsx)("br",{}),n("team.inviteCode"),(0,e.jsx)("code",{className:"team-invite-code",children:a.code})]});if(a.kind==="joined")return(0,e.jsx)("span",{className:"ok",children:n("team.joined",{name:a.name})});let o=a.error,m=o==="cannot_join_self"?n("team.joinErrSelf"):o==="deployment_already_joined"?n("team.joinErrAlready"):o==="hub_unreachable"?n("team.joinErrUnreachable"):o==="hub_timeout"?n("team.joinErrTimeout"):n("team.joinErrGeneric",{error:String(o)});return(0,e.jsx)("span",{className:"err",children:m})}function Xe(t){return q(t,(0,e.jsx)(He,{}))}function Ye(t){return q(t,(0,e.jsx)($e,{}))}export{Xe as renderTeamFederationPage,Ye as renderTeamManagePage};