botmux 3.2.1 → 3.4.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 (277) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +47 -0
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +137 -0
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/cli/pi.d.ts.map +1 -1
  6. package/dist/adapters/cli/pi.js +4 -0
  7. package/dist/adapters/cli/pi.js.map +1 -1
  8. package/dist/adapters/cli/read-isolation.d.ts +72 -3
  9. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  10. package/dist/adapters/cli/read-isolation.js +143 -6
  11. package/dist/adapters/cli/read-isolation.js.map +1 -1
  12. package/dist/adapters/cli/registry.d.ts.map +1 -1
  13. package/dist/adapters/cli/registry.js +8 -2
  14. package/dist/adapters/cli/registry.js.map +1 -1
  15. package/dist/adapters/cli/types.d.ts +8 -1
  16. package/dist/adapters/cli/types.d.ts.map +1 -1
  17. package/dist/cli/deferred-topic-send.d.ts +37 -0
  18. package/dist/cli/deferred-topic-send.d.ts.map +1 -0
  19. package/dist/cli/deferred-topic-send.js +69 -0
  20. package/dist/cli/deferred-topic-send.js.map +1 -0
  21. package/dist/cli/pm2-command.d.ts.map +1 -1
  22. package/dist/cli/pm2-command.js +6 -0
  23. package/dist/cli/pm2-command.js.map +1 -1
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +173 -34
  26. package/dist/cli.js.map +1 -1
  27. package/dist/core/command-handler.d.ts.map +1 -1
  28. package/dist/core/command-handler.js +17 -12
  29. package/dist/core/command-handler.js.map +1 -1
  30. package/dist/core/dashboard-ipc-server.d.ts +4 -1
  31. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  32. package/dist/core/dashboard-ipc-server.js +99 -8
  33. package/dist/core/dashboard-ipc-server.js.map +1 -1
  34. package/dist/core/deferred-schedule-settlement.d.ts +20 -0
  35. package/dist/core/deferred-schedule-settlement.d.ts.map +1 -0
  36. package/dist/core/deferred-schedule-settlement.js +18 -0
  37. package/dist/core/deferred-schedule-settlement.js.map +1 -0
  38. package/dist/core/deferred-topic-binding.d.ts +19 -0
  39. package/dist/core/deferred-topic-binding.d.ts.map +1 -0
  40. package/dist/core/deferred-topic-binding.js +55 -0
  41. package/dist/core/deferred-topic-binding.js.map +1 -0
  42. package/dist/core/device-isolation-activation.d.ts +56 -0
  43. package/dist/core/device-isolation-activation.d.ts.map +1 -0
  44. package/dist/core/device-isolation-activation.js +110 -0
  45. package/dist/core/device-isolation-activation.js.map +1 -0
  46. package/dist/core/device-isolation-daemon.d.ts +84 -0
  47. package/dist/core/device-isolation-daemon.d.ts.map +1 -0
  48. package/dist/core/device-isolation-daemon.js +591 -0
  49. package/dist/core/device-isolation-daemon.js.map +1 -0
  50. package/dist/core/scheduler.d.ts +26 -20
  51. package/dist/core/scheduler.d.ts.map +1 -1
  52. package/dist/core/scheduler.js +114 -56
  53. package/dist/core/scheduler.js.map +1 -1
  54. package/dist/core/session-discovery.d.ts.map +1 -1
  55. package/dist/core/session-discovery.js +47 -15
  56. package/dist/core/session-discovery.js.map +1 -1
  57. package/dist/core/session-manager.d.ts +17 -1
  58. package/dist/core/session-manager.d.ts.map +1 -1
  59. package/dist/core/session-manager.js +178 -84
  60. package/dist/core/session-manager.js.map +1 -1
  61. package/dist/core/types.d.ts +13 -0
  62. package/dist/core/types.d.ts.map +1 -1
  63. package/dist/core/types.js +10 -0
  64. package/dist/core/types.js.map +1 -1
  65. package/dist/core/worker-pool.d.ts +7 -0
  66. package/dist/core/worker-pool.d.ts.map +1 -1
  67. package/dist/core/worker-pool.js +86 -1
  68. package/dist/core/worker-pool.js.map +1 -1
  69. package/dist/daemon.d.ts.map +1 -1
  70. package/dist/daemon.js +95 -5
  71. package/dist/daemon.js.map +1 -1
  72. package/dist/dashboard/schedule-card-model.d.ts +12 -3
  73. package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
  74. package/dist/dashboard/schedule-card-model.js +32 -8
  75. package/dist/dashboard/schedule-card-model.js.map +1 -1
  76. package/dist/dashboard/web/dashboard-components.d.ts +7 -0
  77. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
  78. package/dist/dashboard/web/dashboard-components.js +11 -2
  79. package/dist/dashboard/web/dashboard-components.js.map +1 -1
  80. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  81. package/dist/dashboard/web/i18n.js +30 -6
  82. package/dist/dashboard/web/i18n.js.map +1 -1
  83. package/dist/dashboard/web/schedules-page.d.ts +2 -0
  84. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  85. package/dist/dashboard/web/schedules-page.js +74 -27
  86. package/dist/dashboard/web/schedules-page.js.map +1 -1
  87. package/dist/dashboard-web/app.js +1 -1
  88. package/dist/dashboard-web/chunks/{bot-defaults-page-O37SAQD5.js → bot-defaults-page-B5AY4B2J.js} +1 -1
  89. package/dist/dashboard-web/chunks/{chunk-6QHMLMIM.js → chunk-CUV65BIQ.js} +3 -3
  90. package/dist/dashboard-web/chunks/{chunk-O2DPQL7C.js → chunk-JNRSPKLS.js} +1 -1
  91. package/dist/dashboard-web/chunks/{chunk-FYALHCPG.js → chunk-P6GO5KT4.js} +1 -1
  92. package/dist/dashboard-web/chunks/chunk-QFMH6ITB.js +1 -0
  93. package/dist/dashboard-web/chunks/{chunk-B42PCL5P.js → chunk-UBOLHQCK.js} +1 -1
  94. package/dist/dashboard-web/chunks/{connectors-page-DZBQ42MH.js → connectors-page-KTC2QWNW.js} +1 -1
  95. package/dist/dashboard-web/chunks/{groups-page-3IEGRZKQ.js → groups-page-B3EKGOLY.js} +1 -1
  96. package/dist/dashboard-web/chunks/{insights-page-X3ADRON3.js → insights-page-X6RXNCWX.js} +1 -1
  97. package/dist/dashboard-web/chunks/{monitor-room-IV36RGQY.js → monitor-room-LLRA5LQW.js} +1 -1
  98. package/dist/dashboard-web/chunks/{monitoring-page-ADFKVON4.js → monitoring-page-7MT5FEOS.js} +1 -1
  99. package/dist/dashboard-web/chunks/{office-page-CALAOWNS.js → office-page-KD46D5TD.js} +1 -1
  100. package/dist/dashboard-web/chunks/{overview-page-SLMGLK3M.js → overview-page-JUWNH32O.js} +1 -1
  101. package/dist/dashboard-web/chunks/{roles-page-L7JJ4FFV.js → roles-page-P6F7NLOI.js} +1 -1
  102. package/dist/dashboard-web/chunks/schedules-page-XIHWZST4.js +1 -0
  103. package/dist/dashboard-web/chunks/{sessions-page-OKJ5YWUZ.js → sessions-page-2VECQ27T.js} +1 -1
  104. package/dist/dashboard-web/chunks/{settings-page-P6MI2ZUE.js → settings-page-HMIUE2JA.js} +1 -1
  105. package/dist/dashboard-web/chunks/{skills-page-FT7BVZ6X.js → skills-page-A46KVWBL.js} +1 -1
  106. package/dist/dashboard-web/chunks/{team-federation-page-DEYCPUFB.js → team-federation-page-SDUC56DF.js} +1 -1
  107. package/dist/dashboard-web/chunks/{v3-page-4IOWREZG.js → v3-page-J5JOTUSQ.js} +1 -1
  108. package/dist/dashboard-web/chunks/{whiteboards-page-2VMBETZH.js → whiteboards-page-U7LSOAWI.js} +1 -1
  109. package/dist/dashboard-web/style.css +34 -4
  110. package/dist/dashboard.js +16 -1
  111. package/dist/dashboard.js.map +1 -1
  112. package/dist/desktop/main/auto-start.d.ts +2 -0
  113. package/dist/desktop/main/auto-start.d.ts.map +1 -1
  114. package/dist/desktop/main/auto-start.js +10 -6
  115. package/dist/desktop/main/auto-start.js.map +1 -1
  116. package/dist/desktop/main/bundled-runtime.d.ts +12 -0
  117. package/dist/desktop/main/bundled-runtime.d.ts.map +1 -0
  118. package/dist/desktop/main/bundled-runtime.js +30 -0
  119. package/dist/desktop/main/bundled-runtime.js.map +1 -0
  120. package/dist/desktop/main/device-status.d.ts +15 -0
  121. package/dist/desktop/main/device-status.d.ts.map +1 -0
  122. package/dist/desktop/main/device-status.js +94 -0
  123. package/dist/desktop/main/device-status.js.map +1 -0
  124. package/dist/desktop/main/external-runtime.d.ts +9 -0
  125. package/dist/desktop/main/external-runtime.d.ts.map +1 -1
  126. package/dist/desktop/main/external-runtime.js +88 -18
  127. package/dist/desktop/main/external-runtime.js.map +1 -1
  128. package/dist/desktop/main/ipc.d.ts.map +1 -1
  129. package/dist/desktop/main/ipc.js +1 -0
  130. package/dist/desktop/main/ipc.js.map +1 -1
  131. package/dist/desktop/main/node-command.d.ts +21 -0
  132. package/dist/desktop/main/node-command.d.ts.map +1 -1
  133. package/dist/desktop/main/node-command.js +41 -0
  134. package/dist/desktop/main/node-command.js.map +1 -1
  135. package/dist/desktop/main/pm2-apps.d.ts +4 -2
  136. package/dist/desktop/main/pm2-apps.d.ts.map +1 -1
  137. package/dist/desktop/main/pm2-apps.js +11 -3
  138. package/dist/desktop/main/pm2-apps.js.map +1 -1
  139. package/dist/desktop/main/runtime-service.d.ts +21 -5
  140. package/dist/desktop/main/runtime-service.d.ts.map +1 -1
  141. package/dist/desktop/main/runtime-service.js +94 -10
  142. package/dist/desktop/main/runtime-service.js.map +1 -1
  143. package/dist/desktop/main/runtime-source.d.ts +2 -0
  144. package/dist/desktop/main/runtime-source.d.ts.map +1 -1
  145. package/dist/desktop/main/runtime-source.js +12 -6
  146. package/dist/desktop/main/runtime-source.js.map +1 -1
  147. package/dist/desktop/main/tray.d.ts +1 -0
  148. package/dist/desktop/main/tray.d.ts.map +1 -1
  149. package/dist/desktop/main/tray.js +3 -3
  150. package/dist/desktop/main/tray.js.map +1 -1
  151. package/dist/desktop/main.js +28 -8
  152. package/dist/desktop/main.js.map +1 -1
  153. package/dist/desktop/preload.js +3 -0
  154. package/dist/desktop/preload.js.map +1 -1
  155. package/dist/desktop/renderer/app.d.ts +2 -1
  156. package/dist/desktop/renderer/app.d.ts.map +1 -1
  157. package/dist/desktop/renderer/app.js +6 -1
  158. package/dist/desktop/renderer/app.js.map +1 -1
  159. package/dist/desktop/renderer/runtime-state.d.ts.map +1 -1
  160. package/dist/desktop/renderer/runtime-state.js +2 -0
  161. package/dist/desktop/renderer/runtime-state.js.map +1 -1
  162. package/dist/desktop/shared/shell-path-probes.d.ts +24 -0
  163. package/dist/desktop/shared/shell-path-probes.d.ts.map +1 -0
  164. package/dist/desktop/shared/shell-path-probes.js +38 -0
  165. package/dist/desktop/shared/shell-path-probes.js.map +1 -0
  166. package/dist/desktop/shared/types.d.ts +21 -1
  167. package/dist/desktop/shared/types.d.ts.map +1 -1
  168. package/dist/desktop/smoke.d.ts +1 -0
  169. package/dist/desktop/smoke.d.ts.map +1 -1
  170. package/dist/desktop/smoke.js +20 -5
  171. package/dist/desktop/smoke.js.map +1 -1
  172. package/dist/i18n/en.d.ts.map +1 -1
  173. package/dist/i18n/en.js +16 -7
  174. package/dist/i18n/en.js.map +1 -1
  175. package/dist/i18n/zh.d.ts.map +1 -1
  176. package/dist/i18n/zh.js +16 -7
  177. package/dist/i18n/zh.js.map +1 -1
  178. package/dist/im/lark/card-handler.d.ts.map +1 -1
  179. package/dist/im/lark/card-handler.js +3 -0
  180. package/dist/im/lark/card-handler.js.map +1 -1
  181. package/dist/im/lark/event-dispatcher.d.ts +1 -0
  182. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  183. package/dist/im/lark/event-dispatcher.js +1 -1
  184. package/dist/im/lark/event-dispatcher.js.map +1 -1
  185. package/dist/im/lark/schedules-card.d.ts +2 -2
  186. package/dist/im/lark/schedules-card.d.ts.map +1 -1
  187. package/dist/im/lark/schedules-card.js +50 -34
  188. package/dist/im/lark/schedules-card.js.map +1 -1
  189. package/dist/index-daemon.js +13 -1
  190. package/dist/index-daemon.js.map +1 -1
  191. package/dist/platform/bind.d.ts +4 -1
  192. package/dist/platform/bind.d.ts.map +1 -1
  193. package/dist/platform/bind.js +10 -1
  194. package/dist/platform/bind.js.map +1 -1
  195. package/dist/platform/binding.d.ts.map +1 -1
  196. package/dist/platform/binding.js +15 -9
  197. package/dist/platform/binding.js.map +1 -1
  198. package/dist/platform/device-command.d.ts +35 -0
  199. package/dist/platform/device-command.d.ts.map +1 -0
  200. package/dist/platform/device-command.js +187 -0
  201. package/dist/platform/device-command.js.map +1 -0
  202. package/dist/platform/device-enroll.d.ts +156 -0
  203. package/dist/platform/device-enroll.d.ts.map +1 -0
  204. package/dist/platform/device-enroll.js +781 -0
  205. package/dist/platform/device-enroll.js.map +1 -0
  206. package/dist/platform/device-isolation-activation-client.d.ts +28 -0
  207. package/dist/platform/device-isolation-activation-client.d.ts.map +1 -0
  208. package/dist/platform/device-isolation-activation-client.js +279 -0
  209. package/dist/platform/device-isolation-activation-client.js.map +1 -0
  210. package/dist/platform/device-isolation.d.ts +35 -0
  211. package/dist/platform/device-isolation.d.ts.map +1 -0
  212. package/dist/platform/device-isolation.js +90 -0
  213. package/dist/platform/device-isolation.js.map +1 -0
  214. package/dist/platform/device-paths.d.ts +9 -0
  215. package/dist/platform/device-paths.d.ts.map +1 -0
  216. package/dist/platform/device-paths.js +14 -0
  217. package/dist/platform/device-paths.js.map +1 -0
  218. package/dist/platform/device.d.ts +77 -0
  219. package/dist/platform/device.d.ts.map +1 -0
  220. package/dist/platform/device.js +212 -0
  221. package/dist/platform/device.js.map +1 -0
  222. package/dist/platform/host-command-context.d.ts +15 -0
  223. package/dist/platform/host-command-context.d.ts.map +1 -0
  224. package/dist/platform/host-command-context.js +26 -0
  225. package/dist/platform/host-command-context.js.map +1 -0
  226. package/dist/platform/secure-host-file.d.ts +12 -0
  227. package/dist/platform/secure-host-file.d.ts.map +1 -0
  228. package/dist/platform/secure-host-file.js +182 -0
  229. package/dist/platform/secure-host-file.js.map +1 -0
  230. package/dist/services/schedule-store.d.ts +6 -2
  231. package/dist/services/schedule-store.d.ts.map +1 -1
  232. package/dist/services/schedule-store.js +19 -4
  233. package/dist/services/schedule-store.js.map +1 -1
  234. package/dist/skills/definitions.d.ts.map +1 -1
  235. package/dist/skills/definitions.js +4 -5
  236. package/dist/skills/definitions.js.map +1 -1
  237. package/dist/types.d.ts +45 -8
  238. package/dist/types.d.ts.map +1 -1
  239. package/dist/utils/atomic-write.d.ts +13 -0
  240. package/dist/utils/atomic-write.d.ts.map +1 -1
  241. package/dist/utils/atomic-write.js +89 -9
  242. package/dist/utils/atomic-write.js.map +1 -1
  243. package/dist/utils/child-env.d.ts +40 -1
  244. package/dist/utils/child-env.d.ts.map +1 -1
  245. package/dist/utils/child-env.js +45 -0
  246. package/dist/utils/child-env.js.map +1 -1
  247. package/dist/utils/pending-input-queue.d.ts +10 -0
  248. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  249. package/dist/utils/pending-input-queue.js +15 -0
  250. package/dist/utils/pending-input-queue.js.map +1 -1
  251. package/dist/worker.js +391 -28
  252. package/dist/worker.js.map +1 -1
  253. package/dist/workflows/events/payloads.d.ts +4 -4
  254. package/dist/workflows/events/schema.d.ts +16 -16
  255. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +3 -1
  256. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  257. package/dist/workflows/hostExecutors/botmux-schedule.js +14 -3
  258. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  259. package/dist/workflows/v3/architect.js +1 -1
  260. package/dist/workflows/v3/architect.js.map +1 -1
  261. package/dist/workflows/v3/contract.d.ts +8 -0
  262. package/dist/workflows/v3/contract.d.ts.map +1 -1
  263. package/dist/workflows/v3/contract.js.map +1 -1
  264. package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
  265. package/dist/workflows/v3/daemon-run.js +2 -0
  266. package/dist/workflows/v3/daemon-run.js.map +1 -1
  267. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
  268. package/dist/workflows/v3/ephemeral-pool.js +10 -2
  269. package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
  270. package/dist/workflows/v3/run-envelope.d.ts +24 -24
  271. package/dist/workflows/v3/runtime.d.ts +5 -0
  272. package/dist/workflows/v3/runtime.d.ts.map +1 -1
  273. package/dist/workflows/v3/runtime.js +1 -0
  274. package/dist/workflows/v3/runtime.js.map +1 -1
  275. package/package.json +6 -3
  276. package/dist/dashboard-web/chunks/chunk-I35DXGM4.js +0 -1
  277. package/dist/dashboard-web/chunks/schedules-page-Z3672POL.js +0 -1
@@ -1 +1 @@
1
- import{a as Oe,b as He,c as Ve,d as _e}from"./chunk-R3FXBFQH.js";import{b as Ue}from"./chunk-FYALHCPG.js";import{b as Fe,c as ne,h as le,p as se}from"./chunk-I35DXGM4.js";import{A as $e,w as je}from"./chunk-6QHMLMIM.js";import{a as re}from"./chunk-SYC6D5XU.js";import{a as Jt,d as De}from"./chunk-5THX4DI2.js";import{c as oe}from"./chunk-7SZRL6FY.js";var l=oe(Jt(),1);var w=32768,Je=Math.floor(w*.95),Kt=/^[A-Za-z0-9._-]{1,64}$/;function ae(n){return Kt.test(n)&&n!=="."&&n!==".."}function Ke(n=location.hash){let[,t=""]=n.split("?");return new URLSearchParams(t).get("chatId")?.trim()||null}function ie(n,t){return Ve(n,t)}function de(n){return new TextEncoder().encode(n).length}function ce(n){return n.memberBots.filter(t=>t.inChat&&t.hasRole).length}function We(n){return n.memberBots.filter(t=>t.inChat).length}function D(n,t){return t?n.find(o=>o.larkAppId===t):void 0}function qe(n,t){let o=t.toLowerCase();return o?n.filter(i=>{let d=i.chatId.toLowerCase().includes(o)||(i.name??"").toLowerCase().includes(o),y=i.memberBots.some(p=>p.larkAppId.toLowerCase().includes(o)||(p.botName??"").toLowerCase().includes(o));return d||y}):n}function Ye(n,t){let o=t.toLowerCase();return n.filter(i=>!o||i.profileId.toLowerCase().includes(o))}async function C(n){return n.json().catch(()=>({}))}async function ze(){let n=await fetch("/api/groups"),t=await C(n);return{bots:(t.bots??[]).map(o=>({larkAppId:o.larkAppId,botName:o.botName??o.larkAppId,botAvatarUrl:o.botAvatarUrl})),groups:(t.chats??[]).map(o=>({chatId:o.chatId,name:o.name??o.chatId,memberBots:(o.memberBots??[]).map(i=>({larkAppId:i.larkAppId,botName:i.botName??i.larkAppId,inChat:i.inChat??!1,hasRole:i.hasRole??!1,oncallChat:i.oncallChat??null}))}))}}async function Xe(){let n=await fetch("/api/role-profiles");return(await C(n)).profiles??[]}async function x(n){let t=await fetch(`/api/role-profiles/${encodeURIComponent(n)}`);return(await C(t)).entries??[]}async function pe(n,t){let o=await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`);return C(o)}async function Ze(n,t,o,i){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,injectMode:i})})).ok}async function Qe(n,t,o){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({injectMode:o})})).ok}async function et(n,t){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}async function tt(n,t){let o=await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`);return C(o)}async function ot(n,t,o){return(await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,allowEmpty:!0})})).ok}async function rt(n,t){return(await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}async function nt(n,t){let o=await Promise.all(t.map(async p=>{try{let c=await fetch(`/api/role-profiles/${encodeURIComponent(p.profileId)}`),f=await C(c);return[p.profileId,Array.isArray(f.entries)?f.entries:[]]}catch{return[p.profileId,[]]}})),i=new Set,d=[];for(let p of n)for(let c of p.memberBots){if(!c.inChat||!c.hasRole)continue;let f=ie(c.larkAppId,p.chatId);i.has(f)||(i.add(f),d.push({larkAppId:c.larkAppId,chatId:p.chatId}))}let y=await _e(d);return{entriesByProfile:new Map(o),effectiveRolesByBot:y}}async function lt(n){let t=await fetch(`/api/role-profiles/${encodeURIComponent(n.profileId)}/apply`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({chatId:n.chatId,larkAppId:n.larkAppId,force:n.force,preview:n.preview})}),o=await C(t);return{larkAppId:n.larkAppId,ok:t.ok&&o.ok!==!1,status:t.status,error:o.error,wouldRefuse:o.wouldRefuse}}var e=oe(De(),1);function Wt(){let n=(0,l.useRef)(!0);return(0,l.useEffect)(()=>(n.current=!0,()=>{n.current=!1}),[]),n}function qt(){let n=(0,l.useRef)(new Set);return(0,l.useEffect)(()=>()=>{for(let t of n.current)window.clearTimeout(t);n.current.clear()},[]),(0,l.useCallback)((t,o)=>{let i=window.setTimeout(()=>{n.current.delete(i),t()},o);return n.current.add(i),i},[])}function it(n){return(0,e.jsx)(Fe,{html:je({name:n.bot.botName,larkAppId:n.bot.larkAppId,avatarUrl:n.bot.botAvatarUrl,size:"sm"})})}function dt(n){let t=Ue(),o=Wt(),i=qt(),[d,y]=(0,l.useState)([]),[p,c]=(0,l.useState)([]),[f,P]=(0,l.useState)([]),[ct,ue]=(0,l.useState)({entriesByProfile:new Map,effectiveRolesByBot:new Map}),[pt,F]=(0,l.useState)(!1),[ft,J]=(0,l.useState)(!0),[ut,K]=(0,l.useState)(!0),[W,mt]=(0,l.useState)(""),[q,vt]=(0,l.useState)(""),[ht,me]=(0,l.useState)(()=>new Set),[v,ve]=(0,l.useState)(null),[h,he]=(0,l.useState)(null),[yt,U]=(0,l.useState)(null),[R,O]=(0,l.useState)(""),[S,E]=(0,l.useState)("every"),[ye,ge]=(0,l.useState)(!1),[Ie,be]=(0,l.useState)(!1),[gt,Pe]=(0,l.useState)(!1),[It,Y]=(0,l.useState)(null),[bt,Re]=(0,l.useState)(null),[m,Pt]=(0,l.useState)(null),[I,ke]=(0,l.useState)(null),[B,M]=(0,l.useState)([]),[L,H]=(0,l.useState)(""),[k,G]=(0,l.useState)(null),[Ne,Rt]=(0,l.useState)(!1),[we,Ce]=(0,l.useState)(()=>new Set),[Ae,xe]=(0,l.useState)(!1),[Se,Ee]=(0,l.useState)(!1),[kt,z]=(0,l.useState)(null),[Nt,T]=(0,l.useState)({kind:"idle"}),Be=(0,l.useRef)(0),j=(0,l.useRef)(0),Me=(0,l.useRef)(null),X=v?d.find(r=>r.chatId===v):void 0,wt=X&&h?X.memberBots.find(r=>r.larkAppId===h):void 0,Z=I?p.find(r=>r.larkAppId===I):void 0,Ct=D(B,I),Q=k?d.find(r=>r.chatId===k):void 0,V=Q?.memberBots.filter(r=>r.inChat)??[],At=V.map(r=>r.larkAppId).join("\0"),xt=B.map(r=>r.larkAppId).sort().join("\0"),St=(0,l.useMemo)(()=>qe(d,W),[d,W]),Et=(0,l.useMemo)(()=>Ye(f,q),[f,q]),ee=de(R),te=de(L),_=(0,l.useCallback)((r,s,a=!1)=>{let u=Date.now()+Math.random();r({text:s,isError:a,id:u}),i(()=>{r(g=>g?.id===u?null:g)},a?3e3:2e3)},[i]),b=(0,l.useCallback)(async(r,s)=>{try{let a=await nt(r,s);if(!o.current)return;ue(a),F(!0)}catch{if(!o.current)return;ue({entriesByProfile:new Map,effectiveRolesByBot:new Map}),F(!0)}},[o]),N=(0,l.useCallback)(async()=>{let r=await ze();return o.current&&(y(r.groups),c(r.bots)),r},[o]),$=(0,l.useCallback)(async()=>{let r=await Xe();return o.current&&P(r),r},[o]),Le=(0,l.useCallback)(async()=>{J(!0),K(!0),F(!1);try{let r=await N();if(!o.current)return;let s=await $();if(!o.current||(await $e(),!o.current))return;if(me(new Set(r.groups.filter(a=>ce(a)>0).map(a=>a.chatId))),n.tab==="profiles"){let a=Ke();G(u=>u||(a&&r.groups.some(g=>g.chatId===a)?a:r.groups[0]?.chatId??null))}else G(a=>a??r.groups[0]?.chatId??null);J(!1),K(!1),b(r.groups,s)}catch{if(!o.current)return;J(!1),K(!1),F(!0)}},[o,n.tab,N,$,b]);(0,l.useEffect)(()=>{Le()},[Le]),(0,l.useEffect)(()=>{k||d.length===0||G(d[0].chatId)},[d,k]),(0,l.useEffect)(()=>{let r=new Set(V.filter(s=>!!D(B,s.larkAppId)).map(s=>s.larkAppId));Ce(r),T({kind:"idle"})},[xt,At]);async function Bt(r,s){let a=++Be.current;ve(r),he(s);let u=await pe(s,r);!o.current||a!==Be.current||(U(u),O(u.content??""),E(u.injectMode==="once"?"once":"every"),Y(null),Re(null))}async function Mt(){let r=await N();if(o.current&&(b(r.groups,f),v&&h)){let s=await pe(h,v);if(!o.current)return;U(s),O(s.content??""),E(s.injectMode==="once"?"once":"every")}}async function Lt(){if(!(!v||!h)){ge(!0);try{let r=await Ze(h,v,R,S);if(!o.current)return;if(r){let s=await N();if(!o.current)return;U(a=>a&&{...a,content:R,hasRole:!0,injectMode:S}),b(s.groups,f),_(Y,t("roles.saved"))}else _(Y,R.trim().length===0?t("roles.emptyError"):t("roles.saveFailed"),!0)}finally{o.current&&ge(!1)}}}async function Gt(){if(!(!v||!h)&&confirm(t("roles.confirmDelete"))){be(!0);try{let r=await et(h,v);if(!o.current)return;if(r){let s=await N();if(!o.current)return;ve(null),he(null),U(null),O(""),E("every"),b(s.groups,f)}}finally{o.current&&be(!1)}}}async function Tt(r){if(!v||!h)return;let s=S;E(r),Pe(!0);try{let a=await Qe(h,v,r);if(!o.current)return;a||E(s),_(Re,t(a?"roles.saved":"roles.saveFailed"),!a)}finally{o.current&&Pe(!1)}}async function Ge(r){let s=r.trim();if(!ae(s))return;let a=++j.current;Pt(s),ke(null),H(""),T({kind:"idle"}),G(g=>g??d[0]?.chatId??null);let u=await x(s);!o.current||a!==j.current||(M(u),z(null))}async function jt(r){if(!m)return;let s=++j.current;ke(r);let a=await tt(m,r);if(!o.current||s!==j.current)return;H(a.content??"");let u=await x(m);!o.current||s!==j.current||(M(u),z(null))}async function $t(){let r=await N();if(!o.current)return;let s=await $();if(o.current){if(m){let a=await x(m);if(!o.current)return;M(a)}b(r.groups,s)}}async function Dt(){let r=Me.current,s=r?.value.trim()??"";if(s){if(!ae(s)){r?.setCustomValidity(t("roles.profileIdInvalid")),r?.reportValidity();return}r?.setCustomValidity(""),await Ge(s),o.current&&(location.hash.startsWith("#/roles/profile")||(location.hash="#/roles/profile"))}}async function Ft(){if(!(!m||!I)){xe(!0);try{let r=await ot(m,I,L);if(!o.current)return;let s=await $();if(!o.current)return;let a=await x(m);if(!o.current)return;M(a),b(d,s),_(z,t(r?"roles.saved":"roles.saveFailed"),!r)}finally{o.current&&xe(!1)}}}async function Ut(){if(!(!m||!I)&&confirm(t("roles.confirmDeleteProfileEntry"))){Ee(!0);try{if(await rt(m,I),!o.current)return;H("");let r=await $();if(!o.current)return;let s=await x(m);if(!o.current)return;M(s),b(d,r)}finally{o.current&&Ee(!1)}}}function Ot(r,s){Ce(a=>{let u=new Set(a);return s?u.add(r):u.delete(r),u})}async function Te(r){if(!m)return;let s=k??d[0]?.chatId;if(!s)return;let a=[...we];if(a.length===0){T({kind:"text",text:t("roles.applyPickBots")});return}T({kind:"text",text:"..."});let u=await Promise.all(a.map(g=>lt({profileId:m,chatId:s,larkAppId:g,force:Ne,preview:r})));if(o.current&&(T({kind:"results",preview:r,results:u}),!r)){let g=await N();if(!o.current)return;b(g.groups,f)}}let Ht=ye||ee>w||R.trim().length===0,Vt=Ae||te>w||L.trim().length===0,A=n.tab==="profiles",_t=(0,e.jsxs)("nav",{className:"roles-subnav insight-tabs",role:"tablist","aria-label":t("roles.title"),children:[(0,e.jsx)("a",{href:"#/roles",className:`itab${A?"":" on"}`,role:"tab","aria-selected":!A,children:t("roles.tabGroups")}),(0,e.jsx)("a",{href:"#/roles/profile",className:`itab${A?" on":""}`,role:"tab","aria-selected":A,children:t("roles.tabProfiles")})]});return(0,e.jsxs)("section",{className:"page roles-page",children:[(0,e.jsxs)("div",{className:"page-heading roles-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.roles")}),(0,e.jsx)("h1",{children:t("roles.title")})]}),(0,e.jsx)("div",{className:"page-heading-actions",children:_t})]}),(0,e.jsxs)("div",{id:"roles-by-group-view",className:"roles-layout",hidden:A,children:[(0,e.jsxs)("div",{className:"roles-tree-panel",children:[(0,e.jsxs)("div",{className:"roles-tree-header dashboard-toolbar",children:[(0,e.jsx)("input",{type:"search",id:"roles-search",placeholder:t("roles.search"),value:W,onChange:r=>mt(r.target.value)}),(0,e.jsx)(le,{id:"roles-refresh",label:t("roles.refresh"),onClick:()=>{Mt()}})]}),(0,e.jsx)("div",{id:"roles-tree",className:"roles-tree",children:ft?(0,e.jsx)(ne,{label:t("common.loading")}):(0,e.jsx)(zt,{groups:St,profiles:f,context:ct,contextLoaded:pt,expandedGroups:ht,selectedGroupId:v,selectedBotId:h,tr:t,onToggleGroup:r=>me(s=>Yt(s,r)),onSelectBot:(r,s)=>{Bt(r,s)}})})]}),(0,e.jsx)("div",{className:"roles-editor-panel",children:!v||!h?(0,e.jsx)("div",{id:"roles-editor-empty",className:"roles-editor-empty",children:t("roles.selectHint")}):(0,e.jsxs)("div",{id:"roles-editor-form",className:"roles-editor-form",children:[(0,e.jsxs)("div",{className:"roles-editor-head",children:[(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"roles-editor-breadcrumb",children:[(0,e.jsx)("span",{id:"roles-editor-group-name",children:X?.name??v}),(0,e.jsx)("span",{className:"roles-breadcrumb-sep",children:"\u203A"}),(0,e.jsx)("span",{id:"roles-editor-bot-name",children:wt?.botName??h})]}),(0,e.jsx)("div",{className:"roles-editor-meta",children:(0,e.jsxs)("span",{id:"roles-editor-chat-id",className:"roles-editor-meta-line",children:[v," \xB7 ",h]})})]}),(0,e.jsxs)("div",{className:"roles-editor-actions roles-editor-head-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-delete",className:"danger",style:{display:yt?.hasRole?"":"none"},disabled:Ie,onClick:()=>{Gt()},children:Ie?"...":t("roles.delete")}),(0,e.jsx)("button",{type:"button",id:"roles-save",className:"primary",disabled:Ht,onClick:()=>{Lt()},children:ye?"...":t("roles.save")})]})]}),(0,e.jsxs)("div",{className:"roles-editor-inject",children:[(0,e.jsx)("span",{className:"roles-field-label",children:t("roles.injectModeLabel")}),(0,e.jsx)(se,{id:"roles-editor-inject-mode",className:"roles-inline-menu",ariaLabel:t("roles.injectModeLabel"),disabled:gt,label:t(S==="once"?"roles.injectModeOnce":"roles.injectModeEvery"),value:S,options:[{value:"every",label:t("roles.injectModeEvery")},{value:"once",label:t("roles.injectModeOnce")}],onChange:r=>{Tt(r==="once"?"once":"every")}}),(0,e.jsx)("span",{className:"roles-editor-inject-hint",children:t("roles.injectModeHint")}),(0,e.jsx)(fe,{flash:bt})]}),(0,e.jsx)("textarea",{id:"roles-editor-textarea",placeholder:t("roles.editorPlaceholder"),rows:14,value:R,onChange:r=>O(r.target.value)}),(0,e.jsxs)("div",{className:"roles-editor-footer",children:[(0,e.jsxs)("span",{id:"roles-editor-bytecount",className:st(ee),children:[ee," / ",w," bytes"]}),(0,e.jsx)(fe,{flash:It})]}),(0,e.jsx)(at,{content:R,tr:t,id:"roles-preview"})]})})]}),(0,e.jsxs)("div",{id:"roles-profiles-view",className:"roles-layout roles-profiles-layout",hidden:!A,children:[(0,e.jsxs)("div",{className:"roles-tree-panel",children:[(0,e.jsxs)("div",{className:"roles-tree-header roles-profile-create dashboard-toolbar",children:[(0,e.jsx)("input",{type:"text",id:"roles-profile-id",placeholder:t("roles.profileIdPlaceholder"),maxLength:64,ref:Me,onChange:r=>r.currentTarget.setCustomValidity("")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-select",onClick:()=>{Dt()},children:t("roles.openProfile")})]}),(0,e.jsxs)("div",{className:"roles-tree-header dashboard-toolbar",children:[(0,e.jsx)("input",{type:"search",id:"roles-profile-search",placeholder:t("roles.profileSearch"),value:q,onChange:r=>vt(r.target.value)}),(0,e.jsx)(le,{id:"roles-profile-refresh",label:t("roles.refresh"),onClick:()=>{$t()}})]}),(0,e.jsx)("div",{id:"roles-profile-list",className:"roles-tree",children:ut?(0,e.jsx)(ne,{label:t("common.loading")}):(0,e.jsx)(Zt,{profiles:Et,selectedProfileId:m,tr:t,onSelect:r=>{Ge(r)}})})]}),(0,e.jsx)("div",{className:"roles-editor-panel",children:m?(0,e.jsxs)("div",{id:"roles-profile-detail",className:"roles-editor-form roles-profile-detail",children:[(0,e.jsx)("div",{className:"roles-profile-title",children:(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"roles-editor-breadcrumb",children:[(0,e.jsx)("span",{children:m}),Z?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{className:"roles-breadcrumb-sep",children:"\u203A"}),(0,e.jsx)("span",{children:Z.botName??Z.larkAppId})]}):null]}),(0,e.jsx)("div",{className:"roles-editor-meta-line",children:t("roles.profileRuntimeHint")})]})}),(0,e.jsxs)("div",{className:"roles-profile-grid",children:[(0,e.jsxs)("div",{className:"roles-profile-bots",children:[(0,e.jsx)("div",{className:"roles-profile-section-title",children:t("roles.profileBots")}),(0,e.jsx)("div",{className:"roles-profile-bot-list",children:p.map(r=>{let s=!!D(B,r.larkAppId),a=I===r.larkAppId;return(0,e.jsxs)("div",{className:`roles-bot-row roles-profile-bot-row ${a?"selected":""}`,"data-profile-bot-id":r.larkAppId,onClick:()=>{jt(r.larkAppId)},children:[(0,e.jsx)(it,{bot:r}),(0,e.jsxs)("div",{className:"roles-bot-info",children:[(0,e.jsx)("div",{className:"roles-bot-name",children:r.botName??r.larkAppId}),(0,e.jsx)("div",{className:"roles-bot-id",children:r.larkAppId})]}),(0,e.jsx)("span",{className:`roles-badge ${s?"has-role":"no-role"}`,children:t(s?"roles.configured":"roles.unconfigured")})]},r.larkAppId)})})]}),(0,e.jsx)("div",{className:"roles-profile-editor",children:I?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"roles-profile-editor-head",children:[(0,e.jsxs)("span",{id:"roles-profile-bytecount",className:st(te),children:[te," / ",w," bytes"]}),(0,e.jsxs)("div",{className:"roles-editor-actions roles-editor-head-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-profile-delete",className:"danger",style:{display:Ct?"":"none"},disabled:Se,onClick:()=>{Ut()},children:Se?"...":t("roles.delete")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-save",className:"primary",disabled:Vt,onClick:()=>{Ft()},children:Ae?"...":t("roles.saveEntry")})]})]}),(0,e.jsx)("textarea",{id:"roles-profile-textarea",placeholder:t("roles.profileEditorPlaceholder"),rows:12,value:L,onChange:r=>H(r.target.value)}),(0,e.jsx)("div",{className:"roles-editor-footer",children:(0,e.jsx)(fe,{flash:kt})}),(0,e.jsx)(at,{content:L,tr:t,id:"roles-profile-preview"})]}):(0,e.jsx)("div",{className:"roles-editor-empty roles-profile-inline-empty",children:t("roles.profileBotSelectHint")})})]}),(0,e.jsxs)("div",{className:"roles-profile-apply",children:[(0,e.jsx)("div",{className:"roles-profile-section-title",children:t("roles.applyToGroup")}),(0,e.jsxs)("div",{className:"roles-profile-apply-controls",children:[(0,e.jsx)(se,{id:"roles-profile-apply-group",className:"roles-apply-group-menu",ariaLabel:t("roles.applyToGroup"),disabled:d.length===0,label:Q?.name??k??t("roles.noChats"),value:k??"",options:d.map(r=>({value:r.chatId,label:r.name??r.chatId})),onChange:r=>G(r)}),(0,e.jsxs)("label",{className:"roles-profile-force",children:[(0,e.jsx)("input",{type:"checkbox",id:"roles-profile-apply-force",checked:Ne,onChange:r=>Rt(r.target.checked)})," ",t("roles.applyForce")]})]}),(0,e.jsx)("div",{id:"roles-profile-apply-bots",children:!Q||V.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.noChats")}):V.map(r=>{let s=!!D(B,r.larkAppId);return(0,e.jsxs)("label",{className:"checkbox-row roles-profile-apply-bot",children:[(0,e.jsx)("input",{type:"checkbox",name:"profile-apply-bot",value:r.larkAppId,checked:we.has(r.larkAppId),onChange:a=>Ot(r.larkAppId,a.target.checked)}),(0,e.jsx)("span",{children:r.botName??r.larkAppId}),(0,e.jsx)("small",{children:t(s?"roles.configured":"roles.profileMissing")})]},r.larkAppId)})}),(0,e.jsxs)("div",{className:"roles-editor-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-profile-preview-apply",onClick:()=>{Te(!0)},children:t("roles.previewApply")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-apply",className:"primary",onClick:()=>{Te(!1)},children:t("roles.applyProfile")})]}),(0,e.jsx)("div",{id:"roles-profile-apply-status",className:"roles-profile-status",children:(0,e.jsx)(Qt,{status:Nt,bots:p,tr:t})})]})]}):(0,e.jsx)("div",{id:"roles-profile-empty",className:"roles-editor-empty",children:t("roles.profileSelectHint")})})]})]})}function Yt(n,t){let o=new Set(n);return o.has(t)?o.delete(t):o.add(t),o}function st(n){return`roles-bytecount ${n>Je?"warn":""} ${n>w?"over":""}`}function fe(n){return n.flash?(0,e.jsxs)("span",{className:`roles-saved-flash ${n.flash.isError?"roles-save-error":""}`,children:[" ",n.flash.text]}):null}function zt(n){let{tr:t}=n;return n.groups.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.noChats")}):(0,e.jsx)(e.Fragment,{children:n.groups.map(o=>{let i=n.expandedGroups.has(o.chatId),d=o.memberBots.filter(c=>c.inChat),y=ce(o),p=We(o);return(0,e.jsxs)("div",{className:"roles-group-section",children:[(0,e.jsxs)("div",{className:`roles-group-row ${i?"expanded":""} ${n.selectedGroupId===o.chatId&&!n.selectedBotId?"selected":""}`,"data-group-id":o.chatId,onClick:()=>n.onToggleGroup(o.chatId),children:[(0,e.jsx)("span",{className:"roles-group-arrow",children:i?"\u25BE":"\u25B8"}),(0,e.jsx)("span",{className:"roles-group-icon","aria-hidden":"true",children:(0,e.jsxs)("svg",{viewBox:"0 0 16 16",children:[(0,e.jsx)("circle",{cx:"5.6",cy:"5.8",r:"2.4"}),(0,e.jsx)("path",{d:"M1.8 13.2c.5-2.4 2-3.6 3.8-3.6s3.3 1.2 3.8 3.6"}),(0,e.jsx)("circle",{cx:"11",cy:"6.8",r:"1.9"}),(0,e.jsx)("path",{d:"M9.8 12.6c.4-1.7 1.5-2.6 2.8-2.6 1 0 1.9.5 2.4 1.6"})]})}),(0,e.jsxs)("div",{className:"roles-group-info",children:[(0,e.jsx)("div",{className:"roles-group-name",children:o.name??o.chatId}),(0,e.jsxs)("div",{className:"roles-group-meta",children:[y,"/",p," ",t("roles.botsWithRoles")]}),(0,e.jsx)(Xt,{group:o,profiles:n.profiles,context:n.context,loaded:n.contextLoaded,tr:t})]}),(0,e.jsx)("span",{className:"roles-group-chevron"})]}),(0,e.jsx)("div",{className:"roles-bot-list",children:i?d.map(c=>{let f=n.selectedGroupId===o.chatId&&n.selectedBotId===c.larkAppId;return(0,e.jsxs)("div",{className:`roles-bot-row ${f?"selected":""}`,"data-group-id":o.chatId,"data-bot-id":c.larkAppId,onClick:P=>{P.stopPropagation(),n.onSelectBot(o.chatId,c.larkAppId)},children:[(0,e.jsx)("span",{className:"roles-bot-indent"}),(0,e.jsx)(it,{bot:c}),(0,e.jsxs)("div",{className:"roles-bot-info",children:[(0,e.jsx)("div",{className:"roles-bot-name",children:c.botName}),(0,e.jsx)("div",{className:"roles-bot-id",children:c.larkAppId})]}),(0,e.jsx)("span",{className:`roles-badge ${c.hasRole?"has-role":"no-role"}`,children:c.hasRole?t("roles.configured"):t("roles.unconfigured")})]},c.larkAppId)}):null})]},o.chatId)})})}function Xt(n){let{group:t,profiles:o,context:i,loaded:d,tr:y}=n;if(!o.length||!d)return null;let p=new Map;for(let P of t.memberBots)P.inChat&&p.set(P.larkAppId,i.effectiveRolesByBot.get(ie(P.larkAppId,t.chatId))??null);if(!Oe(p))return null;let c=He(t.memberBots,o,i.entriesByProfile,p)[0];if(!c)return(0,e.jsx)("div",{className:"roles-profile-match muted",children:y("groups.profileStatusUnmatched")});let f=c.kind==="full"?"groups.profileStatusFullChat":"groups.profileStatusPartial";return(0,e.jsx)("div",{className:`roles-profile-match ${c.kind}`,children:y(f,{name:c.profileId,matched:c.matched,total:c.total,chat:c.chatMatched})})}function at(n){return(0,e.jsx)("div",{id:n.id,className:"roles-preview",children:n.content.trim()?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("strong",{children:n.tr("roles.preview")}),(0,e.jsx)("pre",{children:n.content})]}):(0,e.jsx)("small",{children:n.tr("roles.previewEmpty")})})}function Zt(n){let{tr:t}=n;return n.profiles.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.profileEmpty")}):(0,e.jsx)(e.Fragment,{children:n.profiles.map(o=>{let i=n.selectedProfileId===o.profileId,d=(o.botEntries??[]).some(y=>y.hasEntry);return(0,e.jsxs)("div",{className:`roles-profile-row ${i?"selected":""}`,"data-profile-id":o.profileId,onClick:()=>n.onSelect(o.profileId),children:[(0,e.jsxs)("div",{className:"roles-profile-row-main",children:[(0,e.jsx)("div",{className:"roles-profile-name",children:o.profileId}),(0,e.jsxs)("div",{className:"roles-group-meta",children:[o.entryCount," ",t("roles.profileEntries")]})]}),(0,e.jsx)("span",{className:`roles-badge ${d?"has-role":"no-role"}`,children:t(d?"roles.configured":"roles.profileMissing")})]},o.profileId)})})}function Qt(n){let{status:t,bots:o,tr:i}=n;return t.kind==="idle"?null:t.kind==="text"?(0,e.jsx)(e.Fragment,{children:t.text}):(0,e.jsx)(e.Fragment,{children:t.results.map(d=>{let p=o.find(f=>f.larkAppId===d.larkAppId)?.botName??d.larkAppId,c=d.ok?t.preview?d.wouldRefuse?i("roles.applyWouldRefuse"):i("roles.applyPreviewOk"):i("roles.applyOk"):`${i("roles.applyFailed")}: ${String(d.error??`HTTP ${d.status}`)}`;return(0,e.jsxs)("div",{children:[p,": ",c]},d.larkAppId)})})}function io(n){return re(n,(0,e.jsx)(dt,{tab:"groups"}))}function co(n){return re(n,(0,e.jsx)(dt,{tab:"profiles"}))}export{co as renderRoleProfilesPage,io as renderRolesPage};
1
+ import{a as Oe,b as He,c as Ve,d as _e}from"./chunk-R3FXBFQH.js";import{b as Ue}from"./chunk-P6GO5KT4.js";import{b as Fe,c as ne,h as le,p as se}from"./chunk-QFMH6ITB.js";import{A as $e,w as je}from"./chunk-CUV65BIQ.js";import{a as re}from"./chunk-SYC6D5XU.js";import{a as Jt,d as De}from"./chunk-5THX4DI2.js";import{c as oe}from"./chunk-7SZRL6FY.js";var l=oe(Jt(),1);var w=32768,Je=Math.floor(w*.95),Kt=/^[A-Za-z0-9._-]{1,64}$/;function ae(n){return Kt.test(n)&&n!=="."&&n!==".."}function Ke(n=location.hash){let[,t=""]=n.split("?");return new URLSearchParams(t).get("chatId")?.trim()||null}function ie(n,t){return Ve(n,t)}function de(n){return new TextEncoder().encode(n).length}function ce(n){return n.memberBots.filter(t=>t.inChat&&t.hasRole).length}function We(n){return n.memberBots.filter(t=>t.inChat).length}function D(n,t){return t?n.find(o=>o.larkAppId===t):void 0}function qe(n,t){let o=t.toLowerCase();return o?n.filter(i=>{let d=i.chatId.toLowerCase().includes(o)||(i.name??"").toLowerCase().includes(o),y=i.memberBots.some(p=>p.larkAppId.toLowerCase().includes(o)||(p.botName??"").toLowerCase().includes(o));return d||y}):n}function Ye(n,t){let o=t.toLowerCase();return n.filter(i=>!o||i.profileId.toLowerCase().includes(o))}async function C(n){return n.json().catch(()=>({}))}async function ze(){let n=await fetch("/api/groups"),t=await C(n);return{bots:(t.bots??[]).map(o=>({larkAppId:o.larkAppId,botName:o.botName??o.larkAppId,botAvatarUrl:o.botAvatarUrl})),groups:(t.chats??[]).map(o=>({chatId:o.chatId,name:o.name??o.chatId,memberBots:(o.memberBots??[]).map(i=>({larkAppId:i.larkAppId,botName:i.botName??i.larkAppId,inChat:i.inChat??!1,hasRole:i.hasRole??!1,oncallChat:i.oncallChat??null}))}))}}async function Xe(){let n=await fetch("/api/role-profiles");return(await C(n)).profiles??[]}async function x(n){let t=await fetch(`/api/role-profiles/${encodeURIComponent(n)}`);return(await C(t)).entries??[]}async function pe(n,t){let o=await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`);return C(o)}async function Ze(n,t,o,i){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,injectMode:i})})).ok}async function Qe(n,t,o){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({injectMode:o})})).ok}async function et(n,t){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}async function tt(n,t){let o=await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`);return C(o)}async function ot(n,t,o){return(await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,allowEmpty:!0})})).ok}async function rt(n,t){return(await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}async function nt(n,t){let o=await Promise.all(t.map(async p=>{try{let c=await fetch(`/api/role-profiles/${encodeURIComponent(p.profileId)}`),f=await C(c);return[p.profileId,Array.isArray(f.entries)?f.entries:[]]}catch{return[p.profileId,[]]}})),i=new Set,d=[];for(let p of n)for(let c of p.memberBots){if(!c.inChat||!c.hasRole)continue;let f=ie(c.larkAppId,p.chatId);i.has(f)||(i.add(f),d.push({larkAppId:c.larkAppId,chatId:p.chatId}))}let y=await _e(d);return{entriesByProfile:new Map(o),effectiveRolesByBot:y}}async function lt(n){let t=await fetch(`/api/role-profiles/${encodeURIComponent(n.profileId)}/apply`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({chatId:n.chatId,larkAppId:n.larkAppId,force:n.force,preview:n.preview})}),o=await C(t);return{larkAppId:n.larkAppId,ok:t.ok&&o.ok!==!1,status:t.status,error:o.error,wouldRefuse:o.wouldRefuse}}var e=oe(De(),1);function Wt(){let n=(0,l.useRef)(!0);return(0,l.useEffect)(()=>(n.current=!0,()=>{n.current=!1}),[]),n}function qt(){let n=(0,l.useRef)(new Set);return(0,l.useEffect)(()=>()=>{for(let t of n.current)window.clearTimeout(t);n.current.clear()},[]),(0,l.useCallback)((t,o)=>{let i=window.setTimeout(()=>{n.current.delete(i),t()},o);return n.current.add(i),i},[])}function it(n){return(0,e.jsx)(Fe,{html:je({name:n.bot.botName,larkAppId:n.bot.larkAppId,avatarUrl:n.bot.botAvatarUrl,size:"sm"})})}function dt(n){let t=Ue(),o=Wt(),i=qt(),[d,y]=(0,l.useState)([]),[p,c]=(0,l.useState)([]),[f,P]=(0,l.useState)([]),[ct,ue]=(0,l.useState)({entriesByProfile:new Map,effectiveRolesByBot:new Map}),[pt,F]=(0,l.useState)(!1),[ft,J]=(0,l.useState)(!0),[ut,K]=(0,l.useState)(!0),[W,mt]=(0,l.useState)(""),[q,vt]=(0,l.useState)(""),[ht,me]=(0,l.useState)(()=>new Set),[v,ve]=(0,l.useState)(null),[h,he]=(0,l.useState)(null),[yt,U]=(0,l.useState)(null),[R,O]=(0,l.useState)(""),[S,E]=(0,l.useState)("every"),[ye,ge]=(0,l.useState)(!1),[Ie,be]=(0,l.useState)(!1),[gt,Pe]=(0,l.useState)(!1),[It,Y]=(0,l.useState)(null),[bt,Re]=(0,l.useState)(null),[m,Pt]=(0,l.useState)(null),[I,ke]=(0,l.useState)(null),[B,M]=(0,l.useState)([]),[L,H]=(0,l.useState)(""),[k,G]=(0,l.useState)(null),[Ne,Rt]=(0,l.useState)(!1),[we,Ce]=(0,l.useState)(()=>new Set),[Ae,xe]=(0,l.useState)(!1),[Se,Ee]=(0,l.useState)(!1),[kt,z]=(0,l.useState)(null),[Nt,T]=(0,l.useState)({kind:"idle"}),Be=(0,l.useRef)(0),j=(0,l.useRef)(0),Me=(0,l.useRef)(null),X=v?d.find(r=>r.chatId===v):void 0,wt=X&&h?X.memberBots.find(r=>r.larkAppId===h):void 0,Z=I?p.find(r=>r.larkAppId===I):void 0,Ct=D(B,I),Q=k?d.find(r=>r.chatId===k):void 0,V=Q?.memberBots.filter(r=>r.inChat)??[],At=V.map(r=>r.larkAppId).join("\0"),xt=B.map(r=>r.larkAppId).sort().join("\0"),St=(0,l.useMemo)(()=>qe(d,W),[d,W]),Et=(0,l.useMemo)(()=>Ye(f,q),[f,q]),ee=de(R),te=de(L),_=(0,l.useCallback)((r,s,a=!1)=>{let u=Date.now()+Math.random();r({text:s,isError:a,id:u}),i(()=>{r(g=>g?.id===u?null:g)},a?3e3:2e3)},[i]),b=(0,l.useCallback)(async(r,s)=>{try{let a=await nt(r,s);if(!o.current)return;ue(a),F(!0)}catch{if(!o.current)return;ue({entriesByProfile:new Map,effectiveRolesByBot:new Map}),F(!0)}},[o]),N=(0,l.useCallback)(async()=>{let r=await ze();return o.current&&(y(r.groups),c(r.bots)),r},[o]),$=(0,l.useCallback)(async()=>{let r=await Xe();return o.current&&P(r),r},[o]),Le=(0,l.useCallback)(async()=>{J(!0),K(!0),F(!1);try{let r=await N();if(!o.current)return;let s=await $();if(!o.current||(await $e(),!o.current))return;if(me(new Set(r.groups.filter(a=>ce(a)>0).map(a=>a.chatId))),n.tab==="profiles"){let a=Ke();G(u=>u||(a&&r.groups.some(g=>g.chatId===a)?a:r.groups[0]?.chatId??null))}else G(a=>a??r.groups[0]?.chatId??null);J(!1),K(!1),b(r.groups,s)}catch{if(!o.current)return;J(!1),K(!1),F(!0)}},[o,n.tab,N,$,b]);(0,l.useEffect)(()=>{Le()},[Le]),(0,l.useEffect)(()=>{k||d.length===0||G(d[0].chatId)},[d,k]),(0,l.useEffect)(()=>{let r=new Set(V.filter(s=>!!D(B,s.larkAppId)).map(s=>s.larkAppId));Ce(r),T({kind:"idle"})},[xt,At]);async function Bt(r,s){let a=++Be.current;ve(r),he(s);let u=await pe(s,r);!o.current||a!==Be.current||(U(u),O(u.content??""),E(u.injectMode==="once"?"once":"every"),Y(null),Re(null))}async function Mt(){let r=await N();if(o.current&&(b(r.groups,f),v&&h)){let s=await pe(h,v);if(!o.current)return;U(s),O(s.content??""),E(s.injectMode==="once"?"once":"every")}}async function Lt(){if(!(!v||!h)){ge(!0);try{let r=await Ze(h,v,R,S);if(!o.current)return;if(r){let s=await N();if(!o.current)return;U(a=>a&&{...a,content:R,hasRole:!0,injectMode:S}),b(s.groups,f),_(Y,t("roles.saved"))}else _(Y,R.trim().length===0?t("roles.emptyError"):t("roles.saveFailed"),!0)}finally{o.current&&ge(!1)}}}async function Gt(){if(!(!v||!h)&&confirm(t("roles.confirmDelete"))){be(!0);try{let r=await et(h,v);if(!o.current)return;if(r){let s=await N();if(!o.current)return;ve(null),he(null),U(null),O(""),E("every"),b(s.groups,f)}}finally{o.current&&be(!1)}}}async function Tt(r){if(!v||!h)return;let s=S;E(r),Pe(!0);try{let a=await Qe(h,v,r);if(!o.current)return;a||E(s),_(Re,t(a?"roles.saved":"roles.saveFailed"),!a)}finally{o.current&&Pe(!1)}}async function Ge(r){let s=r.trim();if(!ae(s))return;let a=++j.current;Pt(s),ke(null),H(""),T({kind:"idle"}),G(g=>g??d[0]?.chatId??null);let u=await x(s);!o.current||a!==j.current||(M(u),z(null))}async function jt(r){if(!m)return;let s=++j.current;ke(r);let a=await tt(m,r);if(!o.current||s!==j.current)return;H(a.content??"");let u=await x(m);!o.current||s!==j.current||(M(u),z(null))}async function $t(){let r=await N();if(!o.current)return;let s=await $();if(o.current){if(m){let a=await x(m);if(!o.current)return;M(a)}b(r.groups,s)}}async function Dt(){let r=Me.current,s=r?.value.trim()??"";if(s){if(!ae(s)){r?.setCustomValidity(t("roles.profileIdInvalid")),r?.reportValidity();return}r?.setCustomValidity(""),await Ge(s),o.current&&(location.hash.startsWith("#/roles/profile")||(location.hash="#/roles/profile"))}}async function Ft(){if(!(!m||!I)){xe(!0);try{let r=await ot(m,I,L);if(!o.current)return;let s=await $();if(!o.current)return;let a=await x(m);if(!o.current)return;M(a),b(d,s),_(z,t(r?"roles.saved":"roles.saveFailed"),!r)}finally{o.current&&xe(!1)}}}async function Ut(){if(!(!m||!I)&&confirm(t("roles.confirmDeleteProfileEntry"))){Ee(!0);try{if(await rt(m,I),!o.current)return;H("");let r=await $();if(!o.current)return;let s=await x(m);if(!o.current)return;M(s),b(d,r)}finally{o.current&&Ee(!1)}}}function Ot(r,s){Ce(a=>{let u=new Set(a);return s?u.add(r):u.delete(r),u})}async function Te(r){if(!m)return;let s=k??d[0]?.chatId;if(!s)return;let a=[...we];if(a.length===0){T({kind:"text",text:t("roles.applyPickBots")});return}T({kind:"text",text:"..."});let u=await Promise.all(a.map(g=>lt({profileId:m,chatId:s,larkAppId:g,force:Ne,preview:r})));if(o.current&&(T({kind:"results",preview:r,results:u}),!r)){let g=await N();if(!o.current)return;b(g.groups,f)}}let Ht=ye||ee>w||R.trim().length===0,Vt=Ae||te>w||L.trim().length===0,A=n.tab==="profiles",_t=(0,e.jsxs)("nav",{className:"roles-subnav insight-tabs",role:"tablist","aria-label":t("roles.title"),children:[(0,e.jsx)("a",{href:"#/roles",className:`itab${A?"":" on"}`,role:"tab","aria-selected":!A,children:t("roles.tabGroups")}),(0,e.jsx)("a",{href:"#/roles/profile",className:`itab${A?" on":""}`,role:"tab","aria-selected":A,children:t("roles.tabProfiles")})]});return(0,e.jsxs)("section",{className:"page roles-page",children:[(0,e.jsxs)("div",{className:"page-heading roles-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.roles")}),(0,e.jsx)("h1",{children:t("roles.title")})]}),(0,e.jsx)("div",{className:"page-heading-actions",children:_t})]}),(0,e.jsxs)("div",{id:"roles-by-group-view",className:"roles-layout",hidden:A,children:[(0,e.jsxs)("div",{className:"roles-tree-panel",children:[(0,e.jsxs)("div",{className:"roles-tree-header dashboard-toolbar",children:[(0,e.jsx)("input",{type:"search",id:"roles-search",placeholder:t("roles.search"),value:W,onChange:r=>mt(r.target.value)}),(0,e.jsx)(le,{id:"roles-refresh",label:t("roles.refresh"),onClick:()=>{Mt()}})]}),(0,e.jsx)("div",{id:"roles-tree",className:"roles-tree",children:ft?(0,e.jsx)(ne,{label:t("common.loading")}):(0,e.jsx)(zt,{groups:St,profiles:f,context:ct,contextLoaded:pt,expandedGroups:ht,selectedGroupId:v,selectedBotId:h,tr:t,onToggleGroup:r=>me(s=>Yt(s,r)),onSelectBot:(r,s)=>{Bt(r,s)}})})]}),(0,e.jsx)("div",{className:"roles-editor-panel",children:!v||!h?(0,e.jsx)("div",{id:"roles-editor-empty",className:"roles-editor-empty",children:t("roles.selectHint")}):(0,e.jsxs)("div",{id:"roles-editor-form",className:"roles-editor-form",children:[(0,e.jsxs)("div",{className:"roles-editor-head",children:[(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"roles-editor-breadcrumb",children:[(0,e.jsx)("span",{id:"roles-editor-group-name",children:X?.name??v}),(0,e.jsx)("span",{className:"roles-breadcrumb-sep",children:"\u203A"}),(0,e.jsx)("span",{id:"roles-editor-bot-name",children:wt?.botName??h})]}),(0,e.jsx)("div",{className:"roles-editor-meta",children:(0,e.jsxs)("span",{id:"roles-editor-chat-id",className:"roles-editor-meta-line",children:[v," \xB7 ",h]})})]}),(0,e.jsxs)("div",{className:"roles-editor-actions roles-editor-head-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-delete",className:"danger",style:{display:yt?.hasRole?"":"none"},disabled:Ie,onClick:()=>{Gt()},children:Ie?"...":t("roles.delete")}),(0,e.jsx)("button",{type:"button",id:"roles-save",className:"primary",disabled:Ht,onClick:()=>{Lt()},children:ye?"...":t("roles.save")})]})]}),(0,e.jsxs)("div",{className:"roles-editor-inject",children:[(0,e.jsx)("span",{className:"roles-field-label",children:t("roles.injectModeLabel")}),(0,e.jsx)(se,{id:"roles-editor-inject-mode",className:"roles-inline-menu",ariaLabel:t("roles.injectModeLabel"),disabled:gt,label:t(S==="once"?"roles.injectModeOnce":"roles.injectModeEvery"),value:S,options:[{value:"every",label:t("roles.injectModeEvery")},{value:"once",label:t("roles.injectModeOnce")}],onChange:r=>{Tt(r==="once"?"once":"every")}}),(0,e.jsx)("span",{className:"roles-editor-inject-hint",children:t("roles.injectModeHint")}),(0,e.jsx)(fe,{flash:bt})]}),(0,e.jsx)("textarea",{id:"roles-editor-textarea",placeholder:t("roles.editorPlaceholder"),rows:14,value:R,onChange:r=>O(r.target.value)}),(0,e.jsxs)("div",{className:"roles-editor-footer",children:[(0,e.jsxs)("span",{id:"roles-editor-bytecount",className:st(ee),children:[ee," / ",w," bytes"]}),(0,e.jsx)(fe,{flash:It})]}),(0,e.jsx)(at,{content:R,tr:t,id:"roles-preview"})]})})]}),(0,e.jsxs)("div",{id:"roles-profiles-view",className:"roles-layout roles-profiles-layout",hidden:!A,children:[(0,e.jsxs)("div",{className:"roles-tree-panel",children:[(0,e.jsxs)("div",{className:"roles-tree-header roles-profile-create dashboard-toolbar",children:[(0,e.jsx)("input",{type:"text",id:"roles-profile-id",placeholder:t("roles.profileIdPlaceholder"),maxLength:64,ref:Me,onChange:r=>r.currentTarget.setCustomValidity("")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-select",onClick:()=>{Dt()},children:t("roles.openProfile")})]}),(0,e.jsxs)("div",{className:"roles-tree-header dashboard-toolbar",children:[(0,e.jsx)("input",{type:"search",id:"roles-profile-search",placeholder:t("roles.profileSearch"),value:q,onChange:r=>vt(r.target.value)}),(0,e.jsx)(le,{id:"roles-profile-refresh",label:t("roles.refresh"),onClick:()=>{$t()}})]}),(0,e.jsx)("div",{id:"roles-profile-list",className:"roles-tree",children:ut?(0,e.jsx)(ne,{label:t("common.loading")}):(0,e.jsx)(Zt,{profiles:Et,selectedProfileId:m,tr:t,onSelect:r=>{Ge(r)}})})]}),(0,e.jsx)("div",{className:"roles-editor-panel",children:m?(0,e.jsxs)("div",{id:"roles-profile-detail",className:"roles-editor-form roles-profile-detail",children:[(0,e.jsx)("div",{className:"roles-profile-title",children:(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"roles-editor-breadcrumb",children:[(0,e.jsx)("span",{children:m}),Z?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{className:"roles-breadcrumb-sep",children:"\u203A"}),(0,e.jsx)("span",{children:Z.botName??Z.larkAppId})]}):null]}),(0,e.jsx)("div",{className:"roles-editor-meta-line",children:t("roles.profileRuntimeHint")})]})}),(0,e.jsxs)("div",{className:"roles-profile-grid",children:[(0,e.jsxs)("div",{className:"roles-profile-bots",children:[(0,e.jsx)("div",{className:"roles-profile-section-title",children:t("roles.profileBots")}),(0,e.jsx)("div",{className:"roles-profile-bot-list",children:p.map(r=>{let s=!!D(B,r.larkAppId),a=I===r.larkAppId;return(0,e.jsxs)("div",{className:`roles-bot-row roles-profile-bot-row ${a?"selected":""}`,"data-profile-bot-id":r.larkAppId,onClick:()=>{jt(r.larkAppId)},children:[(0,e.jsx)(it,{bot:r}),(0,e.jsxs)("div",{className:"roles-bot-info",children:[(0,e.jsx)("div",{className:"roles-bot-name",children:r.botName??r.larkAppId}),(0,e.jsx)("div",{className:"roles-bot-id",children:r.larkAppId})]}),(0,e.jsx)("span",{className:`roles-badge ${s?"has-role":"no-role"}`,children:t(s?"roles.configured":"roles.unconfigured")})]},r.larkAppId)})})]}),(0,e.jsx)("div",{className:"roles-profile-editor",children:I?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"roles-profile-editor-head",children:[(0,e.jsxs)("span",{id:"roles-profile-bytecount",className:st(te),children:[te," / ",w," bytes"]}),(0,e.jsxs)("div",{className:"roles-editor-actions roles-editor-head-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-profile-delete",className:"danger",style:{display:Ct?"":"none"},disabled:Se,onClick:()=>{Ut()},children:Se?"...":t("roles.delete")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-save",className:"primary",disabled:Vt,onClick:()=>{Ft()},children:Ae?"...":t("roles.saveEntry")})]})]}),(0,e.jsx)("textarea",{id:"roles-profile-textarea",placeholder:t("roles.profileEditorPlaceholder"),rows:12,value:L,onChange:r=>H(r.target.value)}),(0,e.jsx)("div",{className:"roles-editor-footer",children:(0,e.jsx)(fe,{flash:kt})}),(0,e.jsx)(at,{content:L,tr:t,id:"roles-profile-preview"})]}):(0,e.jsx)("div",{className:"roles-editor-empty roles-profile-inline-empty",children:t("roles.profileBotSelectHint")})})]}),(0,e.jsxs)("div",{className:"roles-profile-apply",children:[(0,e.jsx)("div",{className:"roles-profile-section-title",children:t("roles.applyToGroup")}),(0,e.jsxs)("div",{className:"roles-profile-apply-controls",children:[(0,e.jsx)(se,{id:"roles-profile-apply-group",className:"roles-apply-group-menu",ariaLabel:t("roles.applyToGroup"),disabled:d.length===0,label:Q?.name??k??t("roles.noChats"),value:k??"",options:d.map(r=>({value:r.chatId,label:r.name??r.chatId})),onChange:r=>G(r)}),(0,e.jsxs)("label",{className:"roles-profile-force",children:[(0,e.jsx)("input",{type:"checkbox",id:"roles-profile-apply-force",checked:Ne,onChange:r=>Rt(r.target.checked)})," ",t("roles.applyForce")]})]}),(0,e.jsx)("div",{id:"roles-profile-apply-bots",children:!Q||V.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.noChats")}):V.map(r=>{let s=!!D(B,r.larkAppId);return(0,e.jsxs)("label",{className:"checkbox-row roles-profile-apply-bot",children:[(0,e.jsx)("input",{type:"checkbox",name:"profile-apply-bot",value:r.larkAppId,checked:we.has(r.larkAppId),onChange:a=>Ot(r.larkAppId,a.target.checked)}),(0,e.jsx)("span",{children:r.botName??r.larkAppId}),(0,e.jsx)("small",{children:t(s?"roles.configured":"roles.profileMissing")})]},r.larkAppId)})}),(0,e.jsxs)("div",{className:"roles-editor-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-profile-preview-apply",onClick:()=>{Te(!0)},children:t("roles.previewApply")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-apply",className:"primary",onClick:()=>{Te(!1)},children:t("roles.applyProfile")})]}),(0,e.jsx)("div",{id:"roles-profile-apply-status",className:"roles-profile-status",children:(0,e.jsx)(Qt,{status:Nt,bots:p,tr:t})})]})]}):(0,e.jsx)("div",{id:"roles-profile-empty",className:"roles-editor-empty",children:t("roles.profileSelectHint")})})]})]})}function Yt(n,t){let o=new Set(n);return o.has(t)?o.delete(t):o.add(t),o}function st(n){return`roles-bytecount ${n>Je?"warn":""} ${n>w?"over":""}`}function fe(n){return n.flash?(0,e.jsxs)("span",{className:`roles-saved-flash ${n.flash.isError?"roles-save-error":""}`,children:[" ",n.flash.text]}):null}function zt(n){let{tr:t}=n;return n.groups.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.noChats")}):(0,e.jsx)(e.Fragment,{children:n.groups.map(o=>{let i=n.expandedGroups.has(o.chatId),d=o.memberBots.filter(c=>c.inChat),y=ce(o),p=We(o);return(0,e.jsxs)("div",{className:"roles-group-section",children:[(0,e.jsxs)("div",{className:`roles-group-row ${i?"expanded":""} ${n.selectedGroupId===o.chatId&&!n.selectedBotId?"selected":""}`,"data-group-id":o.chatId,onClick:()=>n.onToggleGroup(o.chatId),children:[(0,e.jsx)("span",{className:"roles-group-arrow",children:i?"\u25BE":"\u25B8"}),(0,e.jsx)("span",{className:"roles-group-icon","aria-hidden":"true",children:(0,e.jsxs)("svg",{viewBox:"0 0 16 16",children:[(0,e.jsx)("circle",{cx:"5.6",cy:"5.8",r:"2.4"}),(0,e.jsx)("path",{d:"M1.8 13.2c.5-2.4 2-3.6 3.8-3.6s3.3 1.2 3.8 3.6"}),(0,e.jsx)("circle",{cx:"11",cy:"6.8",r:"1.9"}),(0,e.jsx)("path",{d:"M9.8 12.6c.4-1.7 1.5-2.6 2.8-2.6 1 0 1.9.5 2.4 1.6"})]})}),(0,e.jsxs)("div",{className:"roles-group-info",children:[(0,e.jsx)("div",{className:"roles-group-name",children:o.name??o.chatId}),(0,e.jsxs)("div",{className:"roles-group-meta",children:[y,"/",p," ",t("roles.botsWithRoles")]}),(0,e.jsx)(Xt,{group:o,profiles:n.profiles,context:n.context,loaded:n.contextLoaded,tr:t})]}),(0,e.jsx)("span",{className:"roles-group-chevron"})]}),(0,e.jsx)("div",{className:"roles-bot-list",children:i?d.map(c=>{let f=n.selectedGroupId===o.chatId&&n.selectedBotId===c.larkAppId;return(0,e.jsxs)("div",{className:`roles-bot-row ${f?"selected":""}`,"data-group-id":o.chatId,"data-bot-id":c.larkAppId,onClick:P=>{P.stopPropagation(),n.onSelectBot(o.chatId,c.larkAppId)},children:[(0,e.jsx)("span",{className:"roles-bot-indent"}),(0,e.jsx)(it,{bot:c}),(0,e.jsxs)("div",{className:"roles-bot-info",children:[(0,e.jsx)("div",{className:"roles-bot-name",children:c.botName}),(0,e.jsx)("div",{className:"roles-bot-id",children:c.larkAppId})]}),(0,e.jsx)("span",{className:`roles-badge ${c.hasRole?"has-role":"no-role"}`,children:c.hasRole?t("roles.configured"):t("roles.unconfigured")})]},c.larkAppId)}):null})]},o.chatId)})})}function Xt(n){let{group:t,profiles:o,context:i,loaded:d,tr:y}=n;if(!o.length||!d)return null;let p=new Map;for(let P of t.memberBots)P.inChat&&p.set(P.larkAppId,i.effectiveRolesByBot.get(ie(P.larkAppId,t.chatId))??null);if(!Oe(p))return null;let c=He(t.memberBots,o,i.entriesByProfile,p)[0];if(!c)return(0,e.jsx)("div",{className:"roles-profile-match muted",children:y("groups.profileStatusUnmatched")});let f=c.kind==="full"?"groups.profileStatusFullChat":"groups.profileStatusPartial";return(0,e.jsx)("div",{className:`roles-profile-match ${c.kind}`,children:y(f,{name:c.profileId,matched:c.matched,total:c.total,chat:c.chatMatched})})}function at(n){return(0,e.jsx)("div",{id:n.id,className:"roles-preview",children:n.content.trim()?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("strong",{children:n.tr("roles.preview")}),(0,e.jsx)("pre",{children:n.content})]}):(0,e.jsx)("small",{children:n.tr("roles.previewEmpty")})})}function Zt(n){let{tr:t}=n;return n.profiles.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.profileEmpty")}):(0,e.jsx)(e.Fragment,{children:n.profiles.map(o=>{let i=n.selectedProfileId===o.profileId,d=(o.botEntries??[]).some(y=>y.hasEntry);return(0,e.jsxs)("div",{className:`roles-profile-row ${i?"selected":""}`,"data-profile-id":o.profileId,onClick:()=>n.onSelect(o.profileId),children:[(0,e.jsxs)("div",{className:"roles-profile-row-main",children:[(0,e.jsx)("div",{className:"roles-profile-name",children:o.profileId}),(0,e.jsxs)("div",{className:"roles-group-meta",children:[o.entryCount," ",t("roles.profileEntries")]})]}),(0,e.jsx)("span",{className:`roles-badge ${d?"has-role":"no-role"}`,children:t(d?"roles.configured":"roles.profileMissing")})]},o.profileId)})})}function Qt(n){let{status:t,bots:o,tr:i}=n;return t.kind==="idle"?null:t.kind==="text"?(0,e.jsx)(e.Fragment,{children:t.text}):(0,e.jsx)(e.Fragment,{children:t.results.map(d=>{let p=o.find(f=>f.larkAppId===d.larkAppId)?.botName??d.larkAppId,c=d.ok?t.preview?d.wouldRefuse?i("roles.applyWouldRefuse"):i("roles.applyPreviewOk"):i("roles.applyOk"):`${i("roles.applyFailed")}: ${String(d.error??`HTTP ${d.status}`)}`;return(0,e.jsxs)("div",{children:[p,": ",c]},d.larkAppId)})})}function io(n){return re(n,(0,e.jsx)(dt,{tab:"groups"}))}function co(n){return re(n,(0,e.jsx)(dt,{tab:"profiles"}))}export{co as renderRoleProfilesPage,io as renderRolesPage};
@@ -0,0 +1 @@
1
+ import{a as j,b as F}from"./chunk-P6GO5KT4.js";import{g as q,l as Z,m as _,n as B,o as K,p as U}from"./chunk-QFMH6ITB.js";import"./chunk-CUV65BIQ.js";import{a as D}from"./chunk-SYC6D5XU.js";import{a as G,d as H}from"./chunk-5THX4DI2.js";import{c as $}from"./chunk-7SZRL6FY.js";var i=$(G(),1);var e=$(H(),1),z=1e3;function J(l,t){if(!l)return"\u2014";try{return new Date(l).toLocaleString(void 0,t?{timeZone:t,timeZoneName:"short"}:void 0)}catch{return l}}function Q(l,t){let n=t.q.toLowerCase();return l.filter(o=>!t.kind||o.parsed?.kind===t.kind).filter(o=>!t.enabledOnly||o.enabled).filter(o=>!n||JSON.stringify(o).toLowerCase().includes(n)).sort((o,d)=>{if(o.enabled!==d.enabled)return o.enabled?-1:1;let f=o.nextRunAt?Date.parse(o.nextRunAt):1/0,p=d.nextRunAt?Date.parse(d.nextRunAt):1/0;return f-p})}function O(l){return l.deliver==="local"?"local":l.executionPosition==="new-topic"?"new-topic":l.executionPosition==="topic"?l.rootMessageId?"thread":"chat":l.executionPosition==="top-level"?"chat":l.deliver==="new-topic"?"new-topic":l.scope==="chat"?"chat":l.rootMessageId?"thread":"chat"}function V(l,t){let n=O(l);return t(n==="local"?"schedules.deliveryLocal":n==="new-topic"?"schedules.deliveryNewTopic":n==="thread"?"schedules.deliveryThread":"schedules.deliveryTopLevel")}function W(l){return l.repeat?`${l.repeat.completed}/${l.repeat.times??"\u221E"}`:"\u2014"}function X(l){return new Promise(t=>window.setTimeout(t,l))}function Y(l){let{schedule:t,scheduleTimeZone:n,tr:o}=l,d=String(t.parsed?.kind??"unknown"),f=t.enabled?"pause":"resume",p=`${t.id}:${f}`,y=`${t.id}:run`;return(0,e.jsxs)(_,{kind:"schedule",className:"schedule-list-row","data-id":t.id,children:[(0,e.jsxs)(B,{children:[(0,e.jsxs)("div",{className:"schedule-row-head",children:[(0,e.jsx)("b",{children:t.name??t.id}),(0,e.jsx)("span",{className:`schedule-state ${t.enabled?"enabled":"paused"}`,children:t.enabled?o("schedules.enabled"):o("schedules.paused")})]}),(0,e.jsxs)("div",{className:"schedule-row-meta",children:[(0,e.jsx)("span",{children:t.botName??t.larkAppId??"-"}),(0,e.jsx)("span",{children:"\xB7"}),(0,e.jsx)("code",{children:t.parsed?.display??"?"})]}),(0,e.jsxs)("div",{className:"schedule-chip-strip",children:[(0,e.jsx)("span",{children:d}),(0,e.jsxs)("span",{children:[o("schedules.delivery"),": ",V(t,o)]}),t.silent?(0,e.jsxs)("span",{children:["\u{1F507} ",o("schedules.silent")]}):null,(0,e.jsxs)("span",{children:[o("schedules.next"),": ",J(t.nextRunAt,n)]}),(0,e.jsxs)("span",{children:[o("schedules.last"),": ",J(t.lastRunAt,n)]}),t.lastStatus==="error"?(0,e.jsxs)("span",{className:"schedule-error-chip",title:typeof t.lastError=="string"?t.lastError:void 0,children:["\u26A0 ",o("schedules.error"),": ",typeof t.lastError=="string"&&t.lastError.length>60?t.lastError.slice(0,60)+"\u2026":t.lastError??o("schedules.errorUnknown")]}):null,(0,e.jsxs)("span",{children:[o("schedules.repeat"),": ",W(t)]})]})]}),(0,e.jsx)(K,{children:(0,e.jsxs)("div",{className:"schedule-actions",children:[(0,e.jsx)(te,{op:"run",label:o("schedules.runNow"),pending:l.pending===y,feedback:l.feedback[y]??null,onClick:()=>l.onAction(t.id,"run")}),(0,e.jsx)(se,{checked:!!t.enabled,pending:l.pending===p,feedback:l.feedback[p]??null,tr:o,onClick:()=>l.onAction(t.id,f)}),(0,e.jsx)("button",{type:"button",className:"schedule-action-button schedule-edit-button",onClick:()=>l.onEdit(t),title:o("schedules.edit"),children:(0,e.jsx)("span",{className:"schedule-action-label",children:o("schedules.edit")})}),(0,e.jsx)("button",{type:"button",className:"schedule-action-button schedule-delete-button",onClick:()=>l.onDelete(t),title:o("schedules.delete"),children:(0,e.jsx)("span",{className:"schedule-action-label",children:o("schedules.delete")})})]})})]})}function ee(){let l=F(),{scheduleRows:t,scheduleTimeZone:n}=j(s=>({scheduleRows:[...s.schedules.values()],scheduleTimeZone:s.scheduleTimeZone})),[o,d]=(0,i.useState)({q:"",kind:"",enabledOnly:!1}),[f,p]=(0,i.useState)(null),[y,I]=(0,i.useState)({}),w=(0,i.useRef)(new Map),[P,k]=(0,i.useState)(!1),[u,N]=(0,i.useState)(null),[T,S]=(0,i.useState)(null),[A,E]=(0,i.useState)([]);(0,i.useEffect)(()=>{fetch("/api/bots").then(s=>s.json()).then(s=>{Array.isArray(s?.bots)&&E(s.bots)}).catch(()=>{})},[]);let C=(0,i.useMemo)(()=>Q(t,o),[t,o]);(0,i.useEffect)(()=>()=>{w.current.forEach(s=>window.clearTimeout(s)),w.current.clear()},[]);function R(s,c){I(m=>({...m,[s]:c}));let r=w.current.get(s);r&&window.clearTimeout(r);let v=window.setTimeout(()=>{I(m=>{let h={...m};return delete h[s],h}),w.current.delete(s)},c==="success"?1600:2200);w.current.set(s,v)}async function b(s,c){let r=`${s}:${c}`,v=performance.now(),m="success";p(r);try{let h=await fetch(`/api/schedules/${encodeURIComponent(s)}/${c}`,{method:"POST"}),M=await h.json().catch(()=>({}));if(!h.ok||M.ok===!1)throw new Error(`Failed: ${h.status} ${M?.error??""}`.trim())}catch{m="error"}finally{if(c==="run"){let h=z-(performance.now()-v);h>0&&await X(h)}R(r,m),p(h=>h===r?null:h)}}function x(){N(null),S(null),k(!0)}function g(s){N(s),S(null),k(!0)}async function L(s){if(!window.confirm(l("schedules.deleteConfirm")))return;let c=`${s.id}:delete`;p(c);try{let r=await fetch(`/api/schedules/${encodeURIComponent(s.id)}`,{method:"DELETE"}),v=await r.json().catch(()=>({}));if(!r.ok||v.ok===!1)throw new Error(v?.error??`HTTP ${r.status}`);R(c,"success")}catch{R(c,"error")}finally{p(r=>r===c?null:r)}}async function a(s){S(null);try{let c=u?`/api/schedules/${encodeURIComponent(u.id)}`:"/api/schedules",r=u?"PATCH":"POST",v=u?{name:s.name,schedule:s.schedule,prompt:s.prompt,silent:s.silent,...s.updateExecutionPosition?{executionPosition:s.executionPosition,rootMessageId:s.rootMessageId,topicTitle:s.topicTitle}:{}}:{name:s.name,schedule:s.schedule,prompt:s.prompt,silent:s.silent,executionPosition:s.executionPosition,rootMessageId:s.rootMessageId,topicTitle:s.topicTitle,chatId:s.chatId,larkAppId:s.larkAppId},m=await fetch(c,{method:r,headers:{"Content-Type":"application/json"},body:JSON.stringify(v)}),h=await m.json().catch(()=>({}));if(!m.ok||h.ok===!1)throw new Error(h?.error??`HTTP ${m.status}`);k(!1)}catch(c){S(c instanceof Error?c.message:String(c))}}return(0,e.jsxs)("section",{className:"page schedules-page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:l("nav.schedules")}),(0,e.jsx)("h1",{children:l("schedules.title")})]}),(0,e.jsx)(q,{onClick:x,disabled:A.length===0,children:l("schedules.create")})]}),(0,e.jsxs)("form",{id:"sched-filters",className:"filters dashboard-toolbar",children:[(0,e.jsx)("input",{type:"search",name:"q",placeholder:l("schedules.search"),value:o.q,onChange:s=>{let c=s.currentTarget.value;d(r=>({...r,q:c}))}}),(0,e.jsx)(U,{id:"sched-kind-menu",ariaLabel:l("schedules.anyKind"),label:o.kind||l("schedules.anyKind"),value:o.kind,options:[{value:"",label:l("schedules.anyKind")},{value:"cron",label:"cron"},{value:"interval",label:"interval"},{value:"once",label:"once"}],onChange:s=>d(c=>({...c,kind:s}))}),(0,e.jsxs)("label",{className:"filter-toggle",children:[(0,e.jsx)("input",{type:"checkbox",name:"enabled",checked:o.enabledOnly,onChange:s=>{let c=s.currentTarget.checked;d(r=>({...r,enabledOnly:c}))}}),(0,e.jsx)("span",{className:"filter-toggle-label",children:l("schedules.enabledOnly")}),(0,e.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,e.jsx)("span",{className:"schedules-toolbar-spacer","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"schedules-toolbar-count",children:[C.length,"/",t.length]})]}),(0,e.jsx)("section",{className:"overview-block schedules-list-section",children:(0,e.jsx)("div",{className:"schedules-list-wrap",children:C.length===0?(0,e.jsx)("div",{id:"schedules-tbody",className:"empty schedules-list-empty",children:l("schedules.empty")}):(0,e.jsx)(Z,{id:"schedules-tbody",className:"schedules-list",children:C.map(s=>(0,e.jsx)(Y,{schedule:s,scheduleTimeZone:n,pending:f,feedback:y,tr:l,onAction:(c,r)=>{b(c,r)},onEdit:g,onDelete:c=>{L(c)}},s.id))})})}),P?(0,e.jsx)(ne,{editing:u,error:T,bots:A,tr:l,onClose:()=>k(!1),onSubmit:s=>{a(s)}}):null]})}function le(l,t,n,o,d){return n?d(l==="run"?"schedules.running":"schedules.saving"):o==="success"?d(l==="run"?"schedules.runDone":"schedules.saved"):o==="error"?d("schedules.failed"):t}function te(l){let t=F(),n=l.feedback?` is-${l.feedback}`:"";return(0,e.jsx)("button",{type:"button",className:`schedule-action-button${l.pending?" is-pending":""}${n}`,"data-op":l.op,disabled:l.pending,onClick:l.onClick,children:(0,e.jsx)("span",{className:"schedule-action-label",children:le(l.op,l.label,l.pending,l.feedback,t)})})}function se(l){let t=l.feedback==="error"?l.tr("schedules.failed"):l.checked?l.tr("schedules.enabled"):l.tr("schedules.paused");return(0,e.jsxs)("button",{type:"button",className:`schedule-enabled-switch${l.checked?" is-on":""}${l.pending?" is-pending":""}${l.feedback?` is-${l.feedback}`:""}`,"aria-pressed":l.checked,disabled:l.pending,onClick:l.onClick,children:[(0,e.jsx)("span",{className:"schedule-enabled-switch-label",children:t}),(0,e.jsx)("span",{className:"schedule-enabled-switch-track","aria-hidden":"true",children:(0,e.jsx)("span",{})})]})}function ie(l){return D(l,(0,e.jsx)(ee,{}))}function ne(l){let{editing:t,tr:n,bots:o}=l,[d,f]=(0,i.useState)(t?.name??""),[p,y]=(0,i.useState)(t?.schedule??""),[I,w]=(0,i.useState)(t?.prompt??""),[P,k]=(0,i.useState)(t?.silent===!0),[u,N]=(0,i.useState)(t&&O(t)==="thread"?"topic":t&&O(t)==="new-topic"?"new-topic":"top-level"),[T,S]=(0,i.useState)(t?.rootMessageId??""),[A,E]=(0,i.useState)(t?.topicTitle??""),[C,R]=(0,i.useState)(t?.chatId??""),[b,x]=(0,i.useState)(t?.larkAppId??o[0]?.larkAppId??""),g=t?.deliver==="local";(0,i.useEffect)(()=>{!t&&!b&&o.length>0&&x(o[0].larkAppId)},[t,b,o]);function L(a){a.preventDefault(),!(!t&&!b)&&(!g&&u==="topic"&&!T.trim()||l.onSubmit({name:d,schedule:p,prompt:I,silent:P,executionPosition:u,rootMessageId:T.trim(),topicTitle:A.trim(),updateExecutionPosition:!g,chatId:C,larkAppId:b}))}return(0,e.jsx)("div",{className:"schedule-form-overlay",onClick:l.onClose,children:(0,e.jsxs)("div",{className:"schedule-form-dialog",role:"dialog","aria-modal":"true",onClick:a=>a.stopPropagation(),children:[(0,e.jsx)("h2",{children:n(t?"schedules.edit":"schedules.create")}),(0,e.jsxs)("form",{onSubmit:L,className:"schedule-form",children:[t?null:(0,e.jsxs)("label",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.bot")}),(0,e.jsx)("select",{value:b,onChange:a=>x(a.target.value),required:!0,children:o.map(a=>(0,e.jsx)("option",{value:a.larkAppId,children:a.botName??a.larkAppId},a.larkAppId))})]}),(0,e.jsxs)("label",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.name")}),(0,e.jsx)("input",{type:"text",value:d,onChange:a=>f(a.target.value),required:!0,autoFocus:!0})]}),(0,e.jsxs)("label",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.schedule")}),(0,e.jsx)("input",{type:"text",value:p,onChange:a=>y(a.target.value),placeholder:n("schedules.form.scheduleHelp"),required:!0}),(0,e.jsx)("small",{className:"schedule-form-help",children:n("schedules.form.scheduleHelp")})]}),(0,e.jsxs)("label",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.prompt")}),(0,e.jsx)("textarea",{value:I,onChange:a=>w(a.target.value),rows:4,required:!0}),(0,e.jsx)("small",{className:"schedule-form-help",children:n("schedules.form.promptHelp")})]}),t?null:(0,e.jsxs)("label",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.chat")}),(0,e.jsx)("input",{type:"text",value:C,onChange:a=>R(a.target.value),placeholder:"oc_...",required:!0})]}),g?(0,e.jsxs)("div",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.deliver")}),(0,e.jsxs)("div",{className:"schedule-form-placement",children:[(0,e.jsx)("strong",{children:n("schedules.deliveryLocal")}),(0,e.jsx)("small",{className:"schedule-form-help",children:n("schedules.form.localHelp")})]})]}):(0,e.jsxs)("div",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.deliver")}),(0,e.jsxs)("div",{className:"schedule-form-radio-group",children:[(0,e.jsxs)("label",{children:[(0,e.jsx)("input",{type:"radio",name:"executionPosition",value:"top-level",checked:u==="top-level",onChange:()=>N("top-level")}),n("schedules.deliveryTopLevel")]}),(0,e.jsxs)("label",{children:[(0,e.jsx)("input",{type:"radio",name:"executionPosition",value:"topic",checked:u==="topic",onChange:()=>N("topic")}),n("schedules.deliveryThread")]}),(0,e.jsxs)("label",{children:[(0,e.jsx)("input",{type:"radio",name:"executionPosition",value:"new-topic",checked:u==="new-topic",onChange:()=>{N("new-topic"),k(!1)}}),n("schedules.deliveryNewTopic")]})]}),(0,e.jsx)("small",{className:"schedule-form-help",children:n(u==="top-level"?"schedules.form.topLevelHelp":u==="topic"?"schedules.form.topicHelp":"schedules.form.newTopicHelp")})]}),!g&&u==="topic"?(0,e.jsxs)("label",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.topicRoot")}),(0,e.jsx)("input",{type:"text",value:T,onChange:a=>S(a.target.value),placeholder:"om_...",required:!0}),(0,e.jsx)("small",{className:"schedule-form-help",children:n("schedules.form.topicRootHelp")})]}):null,!g&&u==="new-topic"?(0,e.jsxs)("label",{className:"schedule-form-field",children:[(0,e.jsx)("span",{className:"schedule-form-label",children:n("schedules.form.topicTitle")}),(0,e.jsx)("input",{type:"text",value:A,onChange:a=>E(a.target.value),placeholder:n("schedules.form.topicTitlePlaceholder"),maxLength:200}),(0,e.jsxs)("small",{className:"schedule-form-help schedule-form-help-with-count",children:[n("schedules.form.topicTitleHelp"),(0,e.jsxs)("span",{children:[Array.from(A).length,"/200"]})]})]}):null,(0,e.jsxs)("label",{className:"schedule-form-field schedule-form-toggle",children:[(0,e.jsx)("input",{type:"checkbox",checked:P,onChange:a=>k(a.target.checked)}),(0,e.jsxs)("span",{children:[n("schedules.form.silent"),(0,e.jsx)("small",{className:"schedule-form-help",children:n("schedules.form.silentHelp")})]})]}),u==="new-topic"&&P?(0,e.jsx)("p",{className:"schedule-form-help",children:n("schedules.form.silentNewTopicConflict")}):null,l.error?(0,e.jsx)("p",{className:"schedule-form-error",children:l.error}):null,(0,e.jsxs)("div",{className:"schedule-form-actions",children:[(0,e.jsx)("button",{type:"button",className:"schedule-form-cancel",onClick:l.onClose,children:n("schedules.form.cancel")}),(0,e.jsx)("button",{type:"submit",className:"schedule-form-submit",disabled:!t&&!b||!g&&u==="topic"&&!T.trim(),children:n(t?"schedules.form.save":"schedules.form.create")})]})]})]})})}export{Q as filterSchedules,J as fmtScheduleDate,ie as renderSchedulesPage,O as scheduleExecutionPlacement};
@@ -1,3 +1,3 @@
1
- import{a as gt,c as ft,h as pt}from"./chunk-DFLNXQNT.js";import{a as kn,c as mt}from"./chunk-SZOB6VK2.js";import{a as dt,b as ut}from"./chunk-FYALHCPG.js";import{c as Te,g as ct,p as Ue}from"./chunk-I35DXGM4.js";import{A as rt,C as be,D as Ie,E as ie,G as Ye,a as Re,f as qn,g as Yn,h as Qn,i as Zn,j as hn,k as et,l as nt,m as tt,n as st,o as yn,p as ot,q as at,r as Be,s as o,t as it,u as Se,w as ve,y as qe}from"./chunk-6QHMLMIM.js";import{a as lt}from"./chunk-SYC6D5XU.js";import{a as Wn,b as ws,d as Qe}from"./chunk-5THX4DI2.js";import{c as Ee}from"./chunk-7SZRL6FY.js";var d=Ee(Wn(),1),$n=Ee(ws(),1);var wn=[24,72,168],Cs=new Set(wn);function Cn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!Cs.has(t)?null:t}function Ss(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function vs(e,t=Date.now()){return t-e*60*60*1e3}function Is(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let a=Ss(e.lastMessageAt);return a!==null&&a<vs(t,s)}function bt(e,t,s=Date.now()){return e.filter(a=>Is(a,t,s))}var ht={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",23:"kiro-cli",24:"riff"},Co=new Set(Object.values(ht)),Ts={"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","kiro-cli":"Kiro",riff:"Riff"},yt=Object.values(ht).map(e=>({id:e,label:Ts[e]??e}));function Ze(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Sn(e){let t=Ze(e);return t===null?"-":t.toLocaleString("en-US")}var Ne=[...yt.map(e=>e.id),"unknown"],vn=[{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 In(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var wt=["starting","working","idle","dormant","analyzing","active","limited","closed"];function Fe(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function Ct(e){let t=0,s=0,a=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&a++);return{logical:t,resident:s,dormant:a}}function Tn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function kt(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Me(e){let t=String(e?.chatId??"").trim(),s=Ie(e);return s?`${kt(e)} \xB7 ${s}`:t?`${kt(e)} \xB7 ${t}`:o("sessions.chatUnknown")}function Nn(e,t=Ie){return!!String(e?.chatId??"").trim()&&!t(e)}function Mn(e){let t=Me(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function St(e){return`${JSON.stringify(e)} ${Me(e)} ${Mn(e)}`.toLowerCase()}function re(e){return typeof e=="string"?e.trim():""}function vt(e){let t=re(e?.chatId),s=re(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function An(e){let t=re(e?.chatId),s=re(e?.rootMessageId),a=vt(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(re(e?.sessionId)||"unknown")}`}function Ns(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=re(a?.title);if(r)return r}return t}function en(e){let t=new Map;for(let a of e){let r=An(a),u=t.get(r);u?u.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let u=[...r].sort((K,Q)=>Number(Q.lastMessageAt??0)-Number(K.lastMessageAt??0)),g=u[0]??{},m=vt(g),f=re(g.chatId),S=m==="thread"?re(g.rootMessageId):"",T=new Set(u.map(K=>re(K.larkAppId)||re(K.botName)).filter(Boolean)),N=Math.max(1,T.size),I=u.filter(K=>K.status!=="closed").length,$=u.filter(K=>K.lastInputFromBot===!0).length,U=u.reduce((K,Q)=>Math.max(K,Number(Q.lastMessageAt??0)),0),x=S||f||re(g.sessionId)||a;s.push({key:a,kind:m,chatId:f,...S?{rootMessageId:S}:{},title:Ns(u,x),rows:u,botCount:N,activeCount:I,closedCount:u.length-I,inferredBotInputCount:$,latestActivityAt:U,multiBot:T.size>1,inferredBotTriggered:$>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var je=gt;function Ln(e=Be){return e.authed?!0:(e.publicReadOnly,!1)}var H={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 nn(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function It(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let a=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await a.json().catch(()=>({}));if(!a.ok||r?.ok===!1||!r?.url){s?.close(),a.status!==401&&alert(`${o("sessions.writeLinkFail")}: ${r?.error??a.status}`);return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(a){s?.close(),alert(`${o("sessions.writeLinkFail")}: ${a}`)}finally{t&&(t.disabled=!1)}}function xn(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,a=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${a||r||"unknown"}`}function Tt(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 Nt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),a=Be.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${a}${Fe(t)}`,`${o("sessions.restartConfirmCli")}${a}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
1
+ import{a as gt,c as ft,h as pt}from"./chunk-DFLNXQNT.js";import{a as kn,c as mt}from"./chunk-SZOB6VK2.js";import{a as dt,b as ut}from"./chunk-P6GO5KT4.js";import{c as Te,g as ct,p as Ue}from"./chunk-QFMH6ITB.js";import{A as rt,C as be,D as Ie,E as ie,G as Ye,a as Re,f as qn,g as Yn,h as Qn,i as Zn,j as hn,k as et,l as nt,m as tt,n as st,o as yn,p as ot,q as at,r as Be,s as o,t as it,u as Se,w as ve,y as qe}from"./chunk-CUV65BIQ.js";import{a as lt}from"./chunk-SYC6D5XU.js";import{a as Wn,b as ws,d as Qe}from"./chunk-5THX4DI2.js";import{c as Ee}from"./chunk-7SZRL6FY.js";var d=Ee(Wn(),1),$n=Ee(ws(),1);var wn=[24,72,168],Cs=new Set(wn);function Cn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!Cs.has(t)?null:t}function Ss(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function vs(e,t=Date.now()){return t-e*60*60*1e3}function Is(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let a=Ss(e.lastMessageAt);return a!==null&&a<vs(t,s)}function bt(e,t,s=Date.now()){return e.filter(a=>Is(a,t,s))}var ht={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",23:"kiro-cli",24:"riff"},Co=new Set(Object.values(ht)),Ts={"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","kiro-cli":"Kiro",riff:"Riff"},yt=Object.values(ht).map(e=>({id:e,label:Ts[e]??e}));function Ze(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Sn(e){let t=Ze(e);return t===null?"-":t.toLocaleString("en-US")}var Ne=[...yt.map(e=>e.id),"unknown"],vn=[{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 In(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var wt=["starting","working","idle","dormant","analyzing","active","limited","closed"];function Fe(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function Ct(e){let t=0,s=0,a=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&a++);return{logical:t,resident:s,dormant:a}}function Tn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function kt(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Me(e){let t=String(e?.chatId??"").trim(),s=Ie(e);return s?`${kt(e)} \xB7 ${s}`:t?`${kt(e)} \xB7 ${t}`:o("sessions.chatUnknown")}function Nn(e,t=Ie){return!!String(e?.chatId??"").trim()&&!t(e)}function Mn(e){let t=Me(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function St(e){return`${JSON.stringify(e)} ${Me(e)} ${Mn(e)}`.toLowerCase()}function re(e){return typeof e=="string"?e.trim():""}function vt(e){let t=re(e?.chatId),s=re(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function An(e){let t=re(e?.chatId),s=re(e?.rootMessageId),a=vt(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(re(e?.sessionId)||"unknown")}`}function Ns(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=re(a?.title);if(r)return r}return t}function en(e){let t=new Map;for(let a of e){let r=An(a),u=t.get(r);u?u.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let u=[...r].sort((K,Q)=>Number(Q.lastMessageAt??0)-Number(K.lastMessageAt??0)),g=u[0]??{},m=vt(g),f=re(g.chatId),S=m==="thread"?re(g.rootMessageId):"",T=new Set(u.map(K=>re(K.larkAppId)||re(K.botName)).filter(Boolean)),N=Math.max(1,T.size),I=u.filter(K=>K.status!=="closed").length,$=u.filter(K=>K.lastInputFromBot===!0).length,U=u.reduce((K,Q)=>Math.max(K,Number(Q.lastMessageAt??0)),0),x=S||f||re(g.sessionId)||a;s.push({key:a,kind:m,chatId:f,...S?{rootMessageId:S}:{},title:Ns(u,x),rows:u,botCount:N,activeCount:I,closedCount:u.length-I,inferredBotInputCount:$,latestActivityAt:U,multiBot:T.size>1,inferredBotTriggered:$>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var je=gt;function Ln(e=Be){return e.authed?!0:(e.publicReadOnly,!1)}var H={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 nn(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function It(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let a=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await a.json().catch(()=>({}));if(!a.ok||r?.ok===!1||!r?.url){s?.close(),a.status!==401&&alert(`${o("sessions.writeLinkFail")}: ${r?.error??a.status}`);return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(a){s?.close(),alert(`${o("sessions.writeLinkFail")}: ${a}`)}finally{t&&(t.disabled=!1)}}function xn(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,a=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${a||r||"unknown"}`}function Tt(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 Nt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),a=Be.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${a}${Fe(t)}`,`${o("sessions.restartConfirmCli")}${a}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
2
2
  `)}function tn(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo}async function Mt(){try{let e=await fetch("/api/groups");if(!e.ok)return[];let t=await e.json();return(Array.isArray(t?.bots)?t.bots:[]).filter(a=>a&&typeof a.larkAppId=="string").map(a=>({larkAppId:a.larkAppId,botName:typeof a.botName=="string"&&a.botName?a.botName:a.larkAppId}))}catch{return[]}}function En(e,t){let s=Math.max(0,Math.min(t,e.length)),r=e.slice(0,s).match(/(?:^|\s)@([^\s@]*)$/u);if(!r)return null;let u=r[1]??"";return{start:s-u.length-1,end:s,query:u}}function At(e,t,s){let a=`@${s} `,r=e[t.end]===" "?t.end+1:t.end;return{text:e.slice(0,t.start)+a+e.slice(r),caret:t.start+a.length}}function Lt(e,t){let s=t.trim().toLocaleLowerCase();return s?e.filter(a=>a.botName.toLocaleLowerCase().includes(s)||a.larkAppId.toLocaleLowerCase().includes(s)):[...e]}function xt(e,t,s,a){if(a.length===0)return{text:e,caret:Math.max(0,Math.min(t,e.length))};let r=Math.max(0,Math.min(t,e.length)),u=Math.max(r,Math.min(s,e.length)),g=e.slice(0,r),m=e.slice(u),f=g&&!/\s$/u.test(g)?" ":"",S=m&&!/^\s/u.test(m)?" ":"",T=`${f}${a.join(" ")}${S}`;return{text:g+T+m,caret:g.length+T.length}}function Ms(e,t){let s=e.indexOf(t);if(s<0)return e;let a=e.slice(0,s),r=e.slice(s+t.length);return/\s$/u.test(a)&&/^\s/u.test(r)&&(r=r.slice(1)),a+r}function Et(e,t,s,a){let r=Ms(e,t),u=s.map((g,m)=>a(m));return s.forEach((g,m)=>{let f=r.indexOf(g);f<0||g===u[m]||(r=r.slice(0,f)+u[m]+r.slice(f+g.length))}),{text:r,markers:u}}var M=Ee(Wn(),1);var Rt=["backlog","todo","in_progress","in_review","done"];function Bt(e){return typeof e=="string"&&Rt.includes(e)?e:null}function Dt(e){if(e.status==="closed")return"done";let t=Bt(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 As=1e15;function De(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 As-t}function Rn(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var C=Ee(Qe(),1),Pt=[{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"}],Bn=50;function $t(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function Ls(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function xs(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 Es(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 He(e){return{__html:e}}function sn(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function Rs(e){return ie(e.title)||e.sessionId}function Ut(e){let t=[],s=new Map;for(let u of e){let g=String(u.chatId??u.sessionId),m=s.get(g);m||(m={chatId:g,rows:[]},s.set(g,m),t.push(m)),m.rows.push(u)}let a=[];return{clusters:t.map(u=>(a.push(...u.rows),u.rows.length<2?{type:"card",row:u.rows[0]}:{type:"cluster",chatId:u.chatId,rows:u.rows})),flat:a}}function Ot(e){let t=new Map(Pt.map(a=>[a.id,[]]));for(let a of e)t.get(Dt(a)).push(a);return{columns:Pt.map(a=>{let r=(t.get(a.id)??[]).sort((f,S)=>De(f)-De(S)),u=0;a.id==="done"&&r.length>Bn&&(u=r.length-Bn,r=r.slice(0,Bn));let{clusters:g,flat:m}=Ut(r);return t.set(a.id,m),{id:a.id,labelKey:a.labelKey,rows:r,clusters:g,hiddenCount:u}}),groups:t}}function Bs(e){let t=new Map;for(let s of e){if(s.status==="closed")continue;let a=String(s.larkAppId||s.botName||"unknown"),r=t.get(a);r||(r={name:be(s),larkAppId:s.larkAppId,rows:[]},t.set(a,r)),r.rows.push(s)}return[...t.values()].sort((s,a)=>s.name.localeCompare(a.name)).map(s=>{let a=s.rows.sort((u,g)=>Number(g.lastMessageAt??0)-Number(u.lastMessageAt??0)),{clusters:r}=Ut(a);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:a,clusters:r}})}function Dn(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function Ds(e){if(e.groupBy==="bot"){let a=e.rows.filter(r=>!sn(r));return{mode:"bot",columns:Bs(a),groups:new Map,rowById:Dn(a),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 a=e.teams.find(N=>N.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(a??void 0),u=a?e.rows.filter(N=>r.has(String(N.chatId))):[],g=(e.teamBoardKey===a?.key?e.teamBoardData?.board:null)??{},m=(e.teamBoardKey===a?.key?e.teamBoardData?.remoteRows:null)??[],f=[...u,...m].map(N=>{let I=g[String(N.sessionId)];return I?{...N,kanbanColumn:I.column,kanbanPosition:I.position}:N}),{columns:S,groups:T}=Ot(f);return{mode:"flow",columns:S,groups:T,rowById:Dn(f),team:a,scope:{chats:r.size,sessions:f.length}}}let{columns:t,groups:s}=Ot(e.rows);return{mode:"flow",columns:t,groups:s,rowById:Dn(e.rows),team:null,scope:null}}function Ps(e){let t=new Map;return e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col;a&&s.scrollTop&&t.set(a,s.scrollTop)}),t}function $s(e,t){t?.size&&e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col,r=a?t.get(a):void 0;r&&(s.scrollTop=r)})}function Ht(e,t){for(let s of e.querySelectorAll(".kanban-card:not(.dragging)")){if(s.closest(".kanban-cluster.dragging"))continue;let a=s.getBoundingClientRect();if(t<a.top+a.height/2)return s}return null}function ze(e){return(0,C.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:He(e.icon)})}function Os(e){let t=ie(e.row.title)||"",[s,a]=(0,M.useState)(t),r=(0,M.useRef)(null),u=(0,M.useRef)(!1);(0,M.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let g=(0,M.useCallback)(m=>{if(u.current)return;u.current=!0;let f=s.trim();m&&f&&f!==t&&e.onCommit(e.row,f),e.onCancel()},[t,e,s]);return(0,C.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:m=>a(m.currentTarget.value),onClick:m=>m.stopPropagation(),onBlur:()=>g(!0),onKeyDown:m=>{m.stopPropagation(),m.key==="Enter"?(m.preventDefault(),g(!0)):m.key==="Escape"&&(m.preventDefault(),g(!1))}})}function Kt(e){let{callbacks:t,row:s}=e,a=Rs(s),r=be(s),u=Ie(s),g=Ls(s.workingDir),m=xs(s),f=[u,g!=="-"?g:null].filter(Boolean).join(" \xB7 "),S=String(s.status??"unknown"),T=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",N=e.editingId===s.sessionId,I=t.selectedSessionIds.has(String(s.sessionId)),$=["kanban-card",I?"selected":"",T?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),U=T?null:(0,C.jsxs)("span",{className:"kanban-card-actions-rail",children:[(0,C.jsx)(ze,{action:"history",icon:t.icons.history,label:o("sessions.history.title"),onClick:()=>t.onHistory(s)}),s.webPort?(0,C.jsx)(ze,{action:"terminal",icon:t.icons.terminal,label:o("sessions.openTerminal"),onClick:()=>t.onOpenTerminal(s)}):null,s.feishuChatLink?(0,C.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:x=>x.stopPropagation(),dangerouslySetInnerHTML:He(t.icons.feishu)}):null,(0,C.jsx)(ze,{action:"lock",className:s.locked?"locked":"",icon:s.locked?t.icons.unlock:t.icons.lock,label:t.lockActionLabel(s),onClick:x=>t.onToggleLock(s,x)}),(0,C.jsx)(ze,{action:"details",icon:t.icons.details,label:o("sessions.details"),onClick:()=>t.onDetails(s)}),t.canRestartSession(s)?(0,C.jsx)(ze,{action:"restart",icon:t.icons.restart,label:o("sessions.restart"),onClick:x=>t.onRestart(s,x)}):null]});return(0,C.jsxs)("article",{className:$,"data-id":s.sessionId,tabIndex:0,role:"button","aria-pressed":I,draggable:!0,onClick:x=>e.onCardClick(s,x),onKeyDown:x=>e.onCardKeyDown(s,x),onDragStart:x=>e.onDragStartCard(s,x),children:[(0,C.jsxs)("div",{className:"kanban-card-top",children:[(0,C.jsx)("span",{className:`badge cli-${$t(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,C.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,C.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,T?(0,C.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:T}),children:T}):null,U]}),(0,C.jsx)("div",{className:"kanban-card-title-row",children:N?(0,C.jsx)(Os,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,C.jsx)("p",{className:"kanban-card-title",title:String(s.title??a),onDoubleClick:x=>{x.stopPropagation(),e.cancelOpen(),T||e.onBeginEdit(s)},children:String(a).slice(0,140)})}),f||m?(0,C.jsxs)("div",{className:"kanban-card-meta-row",children:[f?(0,C.jsx)("p",{className:"kanban-card-desc",title:f,children:f}):(0,C.jsx)("span",{className:"kanban-card-desc kanban-card-desc-empty","aria-hidden":"true"}),m?(0,C.jsx)("span",{className:"session-signal",title:m,children:m}):null]}):null,(0,C.jsxs)("div",{className:"kanban-card-foot",children:[(0,C.jsx)("span",{className:"kanban-card-owner",dangerouslySetInnerHTML:He(`${ve({name:r,larkAppId:s.larkAppId,size:"sm"})}<span>${it(r)}</span>`)}),(0,C.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:Se(s.lastMessageAt)}),(0,C.jsx)("span",{className:"kanban-card-dot","data-status":$t(S),title:t.sessionStatusText(S)})]})]})]})}function _t(e){let t=e.item;if(t.type==="card")return(0,C.jsx)(Kt,{...e.cardProps,row:t.row});let s=Ie(t.rows[0])??t.chatId,a=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,C.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${a?" dragging":""}`,"data-chat":t.chatId,children:[(0,C.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,C.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:He(qe({chatId:t.chatId,name:s,size:"sm"}))}),(0,C.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,C.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,C.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,C.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,C.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,C.jsx)(Kt,{...e.cardProps,row:r},r.sessionId)):null]})}function Ft(e){let[t,s]=(0,M.useState)(e),[a,r]=(0,M.useState)(null),[u,g]=(0,M.useState)(null),[m,f]=(0,M.useState)(null),[S,T]=(0,M.useState)(null),[N,I]=(0,M.useState)(()=>new Set),$=(0,M.useRef)(null),U=(0,M.useRef)(null),x=(0,M.useRef)(null),K=(0,M.useRef)(new Map),Q=(0,M.useRef)(new Map),ee=(0,M.useRef)(u),Z=!!a||!!u,F=(0,M.useCallback)(()=>{x.current!==null&&(clearTimeout(x.current),x.current=null)},[]),ne=(0,M.useCallback)(w=>{U.current=Ps(e.host),s(w)},[e.host]);(0,M.useEffect)(()=>{if(Z){$.current=e;return}ne(e)},[ne,Z,e]),(0,M.useEffect)(()=>{if(Z||!$.current)return;let w=$.current;$.current=null,ne(w)},[ne,Z]),(0,M.useLayoutEffect)(()=>{$s(e.host,U.current),U.current=null},[t,e.host]),(0,M.useEffect)(()=>{ee.current=u},[u]),(0,M.useEffect)(()=>()=>F(),[F]);let E=(0,M.useMemo)(()=>Ds(t),[t]);(0,M.useLayoutEffect)(()=>{K.current=E.groups,Q.current=E.rowById},[E]),(0,M.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,M.useEffect)(()=>{t.groupBy==="team"&&E.mode==="flow"&&E.team&&t.onNeedTeamBoard(E.team)},[t,E]),(0,M.useEffect)(()=>{t.onTeamScope(E.mode==="flow"?E.scope:null)},[t,E]);let oe=(0,M.useCallback)(()=>{g(null),f(null),T(null)},[]),de=(0,M.useCallback)(w=>{I(v=>{let R=new Set(v);return R.has(w)?R.delete(w):R.add(w),R})},[]),he=(0,M.useCallback)(w=>{F(),!sn(w)&&r(w.sessionId)},[F]),q=(0,M.useCallback)((w,v)=>{sn(w)||v.target.closest("a, button, input, label")||(F(),x.current=setTimeout(()=>{x.current=null,t.onToggleSelect(w)},220))},[F,t]),Ae=(0,M.useCallback)((w,v)=>{v.key!=="Enter"&&v.key!==" "||v.target!==v.currentTarget||sn(w)||(v.preventDefault(),t.onToggleSelect(w))},[t]),O=(0,M.useCallback)((w,v)=>{t.groupBy!=="bot"&&(F(),g({kind:"card",id:String(w.sessionId)}),v.dataTransfer&&(v.dataTransfer.effectAllowed="move",v.dataTransfer.setData("text/plain",String(w.sessionId))))},[F,t.groupBy]),te=(0,M.useCallback)((w,v,R)=>{t.groupBy!=="bot"&&(F(),g({kind:"cluster",chatId:w,col:v}),R.dataTransfer&&(R.dataTransfer.effectAllowed="move",R.dataTransfer.setData("text/plain",`cluster:${w}`)))},[F,t.groupBy]),ue=(0,M.useCallback)((w,v)=>{!ee.current||t.groupBy==="bot"||(v.preventDefault(),v.dataTransfer&&(v.dataTransfer.dropEffect="move"),f(w),T(Ht(v.currentTarget,v.clientY)?.dataset.id??null))},[t.groupBy]),ke=(0,M.useCallback)((w,v)=>{let R=ee.current;if(!R||t.groupBy==="bot")return;v.preventDefault();let se=Ht(v.currentTarget,v.clientY);oe();let z=K.current,V=w;if(R.kind==="cluster"){let p=(z.get(R.col)??[]).filter(_=>String(_.chatId)===R.chatId).filter(_=>!(_.status==="closed"&&V!=="done"));if(!p.length)return;let L=new Set(p.map(_=>_.sessionId)),A=(z.get(V)??[]).filter(_=>!L.has(_.sessionId)),B=se?A.findIndex(_=>_.sessionId===se.dataset.id):A.length;B<0&&(B=A.length);let P=B>0?A[B-1]:null,ge=B<A.length?A[B]:null,Y=Rn(P?De(P):null,ge?De(ge):null);t.onMoveRows(p.map((_,xe)=>({row:_,column:V,position:Y+xe*.001})));return}let me=Q.current.get(R.id);if(!me||me.status==="closed"&&V!=="done")return;let J=(z.get(V)??[]).filter(p=>p.sessionId!==R.id),ae=se?J.findIndex(p=>p.sessionId===se.dataset.id):J.length;ae<0&&(ae=J.length);let Pe=ae>0?J[ae-1]:null,$e=ae<J.length?J[ae]:null,Le=Rn(Pe?De(Pe):null,$e?De($e):null);t.onMoveRows([{row:me,column:V,position:Le}])},[oe,t]),X={dragId:u?.kind==="card"?u.id:null,dropBeforeId:S,editingId:a,groupBy:t.groupBy,callbacks:t,cancelOpen:F,onBeginEdit:he,onCardClick:q,onCardKeyDown:Ae,onDragStartCard:O,onEditDone:()=>r(null)};return E.mode==="loading"?(0,C.jsx)(Te,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):E.mode==="bot"?E.columns.length?(0,C.jsx)(C.Fragment,{children:E.columns.map(w=>(0,C.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":w.key,children:[(0,C.jsxs)("header",{children:[(0,C.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:He(ve({name:w.name,larkAppId:w.larkAppId,size:"sm"}))}),(0,C.jsx)("h2",{children:w.name}),(0,C.jsx)("span",{className:"kanban-col-count",children:w.rows.length})]}),(0,C.jsx)("div",{className:"kanban-col-list",onDragOver:v=>ue(w.key,v),onDragEnd:oe,children:w.clusters.map(v=>(0,C.jsx)(_t,{item:v,dragCluster:u?.kind==="cluster"?u:null,cardProps:X,expanded:v.type==="cluster"&&N.has(`bot:${w.key}:${v.chatId}`),onToggleExpanded:()=>{v.type==="cluster"&&de(`bot:${w.key}:${v.chatId}`)},onDragStartCluster:te},v.type==="card"?v.row.sessionId:v.chatId))})]},w.key))}):(0,C.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,C.jsx)(C.Fragment,{children:E.columns.map(w=>(0,C.jsxs)("section",{className:`kanban-column kanban-${w.id}${m===w.id?" drag-over":""}`,"data-col":w.id,onDragOver:v=>ue(w.id,v),onDrop:v=>ke(w.id,v),onDragEnd:oe,children:[(0,C.jsxs)("header",{children:[(0,C.jsx)("span",{className:"kanban-col-icon",dangerouslySetInnerHTML:He(Es(w.id))}),(0,C.jsx)("h2",{children:o(w.labelKey)}),(0,C.jsx)("span",{className:"kanban-col-count",children:w.rows.length+w.hiddenCount})]}),(0,C.jsxs)("div",{className:"kanban-col-list",children:[w.rows.length?w.clusters.map(v=>(0,C.jsx)(_t,{item:v,columnId:w.id,dragCluster:u?.kind==="cluster"?u:null,cardProps:X,expanded:v.type==="cluster"&&N.has(`${w.id}:${v.chatId}`),onToggleExpanded:()=>{v.type==="cluster"&&de(`${w.id}:${v.chatId}`)},onDragStartCluster:te},v.type==="card"?v.row.sessionId:v.chatId)):(0,C.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),w.hiddenCount?(0,C.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:w.hiddenCount})}):null]})]},w.id))})}var n=Ee(Qe(),1),Hs=new Set(["image/png","image/jpeg","image/gif","image/webp"]),jt=8,Ks=10*1024*1024,_s=25*1024*1024;function Us(e){return new Promise((t,s)=>{let a=new FileReader;a.onload=()=>typeof a.result=="string"?t(a.result):s(new Error("bad_image_data")),a.onerror=()=>s(a.error??new Error("image_read_failed")),a.readAsDataURL(e)})}function Fs(e){return e===168?"7d":`${e}H`}var js=wn.map(e=>({value:String(e),label:Fs(e)}));function ce(e){return{__html:e}}function le(){return typeof window>"u"?void 0:window.localStorage}function on(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${In(t)}`,children:Fe(t)})}function On(e){return e.row.locked?(0,n.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null}function ye(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:ce(e.icon)})}function Xt(e){if(!e.url)return null;let t=!Ln();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:ce(H.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(),It(e.row,s.currentTarget)},dangerouslySetInnerHTML:ce(H.terminal)})})}function Gt(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:ce(H.feishu)})}function zs(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 zt(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?Ze(e.tokenUsage?.in)??-1:t==="tokenOut"?Ze(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?Me(e).toLowerCase():String(e[t]??"").toLowerCase()}function Jt(e,t,s,a){let r=zt(e,s),u=zt(t,s),g=0;return typeof r=="number"&&typeof u=="number"?g=r-u:typeof r=="boolean"&&typeof u=="boolean"?g=Number(r)-Number(u):g=String(r).localeCompare(String(u)),g===0&&(g=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),a==="asc"?g:-g}function Js(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 Xs(e,t,s){let a=s==="needs-you"?Ye(e):Number(e.lastMessageAt??0),r=s==="needs-you"?Ye(t):Number(t.lastMessageAt??0);return a!==r?s==="needs-you"?a-r:r-a:String(e.title??e.sessionId).localeCompare(String(t.title??t.sessionId))}function Gs(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 Vs(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 Hn(e,t){(0,d.useEffect)(()=>{let s=e.current;if(s)if(t){if(!s.open)try{s.showModal()}catch{}}else s.open&&s.close()},[t,e])}function Pn(e){let[t,s]=(0,d.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 Ws(e){let[t,s]=(0,d.useState)(0),[a,r]=(0,d.useState)(!1);return(0,d.useEffect)(()=>{if(t<=0)return;let u=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(u)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:a||t>0,onClick:async()=>{r(!0);let u=await e.locateSession(e.row);r(!1),u&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):a?o("sessions.locating"):o("sessions.locate")})}function qs(e){let[t,s]=(0,d.useState)(0),[a,r]=(0,d.useState)(!1);return(0,d.useEffect)(()=>{if(t<=0)return;let u=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(u)},[t]),(0,n.jsx)(ye,{action:"locate",icon:H.pin,label:t>0?o("sessions.cooldown",{seconds:t}):o("sessions.locate"),disabled:a||t>0,onClick:async()=>{r(!0);let u=await e.onLocate(e.row);r(!1),u&&s(30)}})}function Ys(e){let t=Ne.filter(a=>e.selected.has(a)).length,s=(0,d.useRef)(null);return(0,d.useEffect)(()=>{let a=()=>{s.current?.open&&(s.current.open=!1)},r=g=>{let m=s.current;m?.open&&!m.contains(g.target)&&a()},u=g=>{g.key==="Escape"&&a()};return document.addEventListener("pointerdown",r,!0),document.addEventListener("keydown",u),()=>{document.removeEventListener("pointerdown",r,!0),document.removeEventListener("keydown",u)}},[]),(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===Ne.length?void 0:"cli-filter-active",children:t===Ne.length?o("common.all"):`${t}/${Ne.length}`})]}),(0,n.jsx)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:Ne.map(a=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:a,checked:e.selected.has(a),onChange:r=>e.onToggle(a,r.currentTarget.checked)}),(0,n.jsx)("span",{children:a})]},a))})]})}function Qs(e){let t=[{value:"",label:o("sessions.anyStatus")},...wt.map(m=>({value:m,label:Fe(m)}))],s=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],a=t.find(m=>m.value===e.filters.status)?.label??o("sessions.anyStatus"),r=s.find(m=>m.value===e.filters.adopt)?.label??o("sessions.adoptAny"),u=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],g=u.find(m=>m.value===e.filters.chat)?.label??o("sessions.chatAny");return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters",onSubmit:m=>m.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:m=>{let f=m.currentTarget.value;e.setFilters(S=>({...S,q:f}))}}),(0,n.jsx)(Ue,{label:a,value:e.filters.status,options:t,onChange:m=>e.setFilters(f=>({...f,status:m}))}),(0,n.jsx)(Ue,{label:r,value:e.filters.adopt,options:s,onChange:m=>e.setFilters(f=>({...f,adopt:m}))}),(0,n.jsx)(Ue,{ariaLabel:o("sessions.location"),label:g,value:e.filters.chat,options:u,onChange:m=>e.setFilters(f=>({...f,chat:m}))}),(0,n.jsx)(Ys,{selected:e.filters.cli,onToggle:(m,f)=>{e.setFilters(S=>{let T=new Set(S.cli);return f?T.add(m):T.delete(m),{...S,cli:T}})}}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"multiBotTopics",checked:e.filters.multiBotTopics,onChange:m=>{let f=m.currentTarget.checked;e.setFilters(S=>({...S,multiBotTopics:f}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.multiBotTopics")}),(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:"botTriggeredTopics",checked:e.filters.botTriggeredTopics,onChange:m=>{let f=m.currentTarget.checked;e.setFilters(S=>({...S,botTriggeredTopics:f}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.botTriggeredTopics")}),(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:"showUnknownChats",checked:e.filters.showUnknownChats,onChange:m=>{let f=m.currentTarget.checked;nt(le(),f),e.setFilters(S=>({...S,showUnknownChats:f}))}}),(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:m=>{let f=m.currentTarget.checked;e.setFilters(S=>({...S,active:f}))}}),(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)(eo,{...e.idleCleanup})]})}function Zs(e){let t=!!e.closeProgress||!!e.lockProgress,s=e.lockProgress?.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.lockSelected"),a=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:a}),(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 eo(e){let[t,s]=(0,d.useState)(!1),[a,r]=(0,d.useState)(e.hours),[u,g]=(0,d.useState)(),m=(0,d.useRef)(null),f=(0,d.useRef)(null),S=(0,d.useRef)(null),T=e.countForHours(a);return(0,d.useEffect)(()=>{t?r(e.hours):g(void 0)},[t,e.hours]),(0,d.useLayoutEffect)(()=>{if(!t)return;let N=()=>{let $=f.current,U=S.current;if(!$||!U)return;let x=12,K=window.innerWidth,Q=window.innerHeight,ee=Math.max(0,Math.min(292,K-x*2)),Z=$.getBoundingClientRect(),F=U.offsetHeight,ne=Math.max(x,K-ee-x),E=Z.left+Z.width/2-ee/2,oe=Math.min(Math.max(E,x),ne),de=Z.bottom+8,he=Z.top-F-8,q=de+F<=Q-x||he<x?Math.min(Math.max(de,x),Math.max(x,Q-F-x)):Math.max(x,he);g({left:oe,top:q,width:ee})},I=window.requestAnimationFrame(N);return window.addEventListener("resize",N),window.addEventListener("scroll",N,!0),()=>{window.cancelAnimationFrame(I),window.removeEventListener("resize",N),window.removeEventListener("scroll",N,!0)}},[t,e.busy,e.status]),(0,d.useEffect)(()=>{if(!t)return;let N=$=>{let U=$.target;U instanceof Node&&m.current?.contains(U)||U instanceof Node&&S.current?.contains(U)||s(!1)},I=$=>{$.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",N,!0),document.addEventListener("keydown",I),()=>{document.removeEventListener("pointerdown",N,!0),document.removeEventListener("keydown",I)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${T===0?" is-empty":""}${t?" is-open":""}`,ref:m,children:[(0,n.jsxs)("button",{ref:f,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(N=>!N),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,$n.createPortal)((0,n.jsxs)("div",{ref:S,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:u??{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:T})]})]}),(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:js.map(N=>{let I=Cn(N.value),$=I===a;return(0,n.jsx)("button",{type:"button",className:$?"active":void 0,"aria-pressed":$?"true":"false",disabled:e.busy,onClick:()=>r(I),children:N.label},N.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||T===0,onClick:()=>{e.onRun(a).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function no(e){let t=(0,d.useRef)(null);(0,d.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")]],a={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,u])=>(0,n.jsx)(zs,{sort:r,label:u,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 u=r.status==="closed",g=String(r.sessionId);return(0,n.jsxs)("tr",{"data-id":g,onClick:()=>e.onOpen(r),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":a.select,onClick:m=>m.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(g),disabled:u,onChange:m=>e.onSelect(g,m.currentTarget.checked)})}),(0,n.jsx)("td",{"data-label":a.botName,children:be(r)}),(0,n.jsx)("td",{"data-label":a.cliId,children:(0,n.jsx)("span",{className:`badge cli-${In(r.cliId)}`,children:r.cliId??"unknown"})}),(0,n.jsxs)("td",{"data-label":a.status,children:[(0,n.jsx)(on,{status:r.status}),(0,n.jsx)(On,{row:r})]}),(0,n.jsx)("td",{className:"session-location-cell","data-label":a.chat,title:Mn(r),children:Me(r)}),(0,n.jsx)("td",{className:"token-cell","data-label":a.tokenIn,children:Sn(r.tokenUsage?.in)}),(0,n.jsx)("td",{className:"token-cell","data-label":a.tokenOut,children:Sn(r.tokenUsage?.out)}),(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":a.title,title:String(r.title??""),children:ie(r.title??"").slice(0,48)}),(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":a.workingDir,title:r.workingDir??"",children:String(r.workingDir??"").slice(-34)}),(0,n.jsx)("td",{"data-label":a.spawnedAt,children:Se(r.spawnedAt)}),(0,n.jsx)("td",{"data-label":a.lastMessageAt,children:Se(r.lastMessageAt)}),(0,n.jsx)("td",{"data-label":a.adopt,children:r.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null}),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":a.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},g)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:13,className:"empty",children:o("sessions.empty")})})})]})}function Vt(e){let t=e.row,s=ie(t.title)||t.sessionId,a=be(t),r=Ie(t),u=je(t),g=Js(t),m=Tn(t.workingDir),f=S=>{S.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:f,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:ce(ve({name:a,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:[a," \xB7 ",r??t.cliId??"unknown"]})]}),(0,n.jsxs)("span",{className:"session-card-status-group",children:[(0,n.jsx)(on,{status:t.status}),(0,n.jsx)(On,{row:t})]})]}),m!=="-"||t.adopt||g?(0,n.jsxs)("div",{className:"session-card-meta",children:[m!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:m}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,g?(0,n.jsx)("span",{className:"session-signal",title:g,children:g}):null]}):null,(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${Se(Ye(t))}`:`${o("sessions.last")}: ${Se(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(Gt,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(qs,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(ye,{action:"details",icon:H.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),tn(t)?(0,n.jsx)(ye,{action:"restart",icon:H.restart,label:o("sessions.restart"),onClick:S=>e.onRestart(t,S)}):null,(0,n.jsx)(Xt,{row:t,url:u}),t.status!=="closed"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(ye,{action:"lock",icon:t.locked?H.unlock:H.lock,label:nn(t),kind:t.locked?"locked":"",onClick:S=>e.onLock(t,!t.locked,S)}),(0,n.jsx)(ye,{action:"close",icon:H.close,label:o("sessions.close"),kind:"danger",onClick:S=>e.onClose(t,S)})]}):null]})]})}function to(e){(0,d.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(vn.map(a=>[a.id,[]]));for(let a of e.rows){let r=Tt(a);r&&t.get(r).push(a)}let s=e.order.map(a=>vn.find(r=>r.id===a)).filter(a=>!!a);return(0,n.jsx)("div",{id:"sessions-board",className:`sessions-board${e.animated||e.hidden?"":" board-enter"}`,hidden:e.hidden,children:s.map((a,r)=>{let u=(t.get(a.id)??[]).sort((g,m)=>Xs(g,m,a.id));return(0,n.jsxs)("section",{className:`session-board-column session-board-${a.id}${e.dragColId===a.id?" dragging":""}${e.dragOverCol===a.id?" drag-over":""}`,"data-col":a.id,onDragOver:g=>{e.dragColId&&(g.preventDefault(),g.dataTransfer&&(g.dataTransfer.dropEffect="move"),e.dragColId!==a.id&&e.onDragOverCol(a.id))},onDrop:g=>{e.dragColId&&(g.preventDefault(),e.onMoveColumnTo(e.dragColId,a.id),e.onDragCol(null),e.onDragOverCol(null))},children:[(0,n.jsxs)("header",{draggable:!0,title:o("sessions.board.dragHint"),onDragStart:g=>{e.onDragCol(a.id),g.dataTransfer&&(g.dataTransfer.effectAllowed="move",g.dataTransfer.setData("text/plain",a.id))},onDragEnd:()=>{e.onDragCol(null),e.onDragOverCol(null)},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{children:o(a.labelKey)}),(0,n.jsx)("p",{children:o(a.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":a.id,"data-dir":"-1","aria-label":o("sessions.board.moveLeft"),disabled:r===0,onClick:()=>e.onMoveColumn(a.id,-1),children:"\u2039"}),(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"1","aria-label":o("sessions.board.moveRight"),disabled:r===s.length-1,onClick:()=>e.onMoveColumn(a.id,1),children:"\u203A"})]}),(0,n.jsx)("span",{className:"session-board-count",children:u.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:u.length?u.map(g=>(0,n.jsx)(Vt,{row:g,selected:e.selected.has(g.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},g.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},a.id)})})}function so(e){let t=ie(e.title).trim();return t||(e.kind==="thread"?o("sessions.topic.untitled"):e.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession"))}function oo(e){let t=(0,d.useMemo)(()=>en(e.rows),[e.rows]),s=(0,d.useMemo)(()=>new Map(en(e.relationRows??e.rows).map(a=>[a.key,a])),[e.relationRows,e.rows]);return(0,n.jsx)("div",{id:"sessions-topics",className:"sessions-topic-view",hidden:e.hidden,children:t.length?t.map(a=>{let r=s.get(a.key)??a,u=a.rows[0],g=Me(u),m=so(r),f=r.rootMessageId||r.chatId;return(0,n.jsxs)("section",{className:`session-topic-group${r.multiBot?" multi-bot":""}${r.inferredBotTriggered?" inferred-bot-trigger":""}`,"data-topic-key":a.key,children:[(0,n.jsxs)("header",{children:[(0,n.jsx)("span",{className:"session-topic-avatar",dangerouslySetInnerHTML:ce(qe({chatId:a.chatId,name:g,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-topic-heading",children:[(0,n.jsx)("span",{className:"session-topic-location",children:g}),(0,n.jsx)("h2",{title:r.title,children:m}),(0,n.jsx)("code",{title:f,children:r.kind==="thread"?f:r.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession")})]}),(0,n.jsxs)("div",{className:"session-topic-summary","aria-label":o("sessions.topic.summary"),children:[r.multiBot?(0,n.jsx)("span",{className:"topic-chip collaboration",children:o("sessions.topic.collaboration")}):null,(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.sessions",{count:r.rows.length})}),(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.bots",{count:r.botCount})}),(0,n.jsx)("span",{className:"topic-chip active",children:o("sessions.topic.active",{count:r.activeCount})}),r.closedCount?(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.closed",{count:r.closedCount})}):null,r.inferredBotInputCount?(0,n.jsx)("span",{className:"topic-chip inferred",title:o("sessions.topic.inferredHint"),children:o("sessions.topic.botInputs",{count:r.inferredBotInputCount})}):null,(0,n.jsxs)("span",{className:"session-topic-updated",children:[o("sessions.last"),": ",Se(r.latestActivityAt)]})]})]}),(0,n.jsx)("div",{className:"session-topic-members",children:a.rows.map(S=>(0,n.jsx)(Vt,{row:S,selected:e.selected.has(S.sessionId),onToggleSelect:T=>{T.status!=="closed"?e.onToggleSelect(T):e.onOpen(T)},onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},S.sessionId))})]},a.key)}):(0,n.jsx)("div",{className:"sessions-topic-empty",children:o("sessions.topic.empty")})})}function ao(e){let t=e.message,s=t.senderType==="user",a=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(a?"sessions.history.bot":"sessions.history.system"),u=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:ce(ve({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:Gs(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:u})]})]})}function io(e){let t=(0,d.useRef)(null);Hn(t,!!e.state);let s=e.state?Re.sessions.get(e.state.sessionId):null,a=(0,d.useRef)(null),r=!!e.state&&!e.state.loading&&!e.state.error&&e.state.messages.length>0;return(0,d.useEffect)(()=>{if(!r)return;let u=a.current;u&&(u.scrollTop=u.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: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:ce(ve({name:be(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(ie(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)(ye,{id:"history-close",icon:H.close,label:o("sessions.dismiss"),onClick:e.onClose})})]}),(0,n.jsxs)("div",{className:"history-body",ref:a,children:[e.state.loading?(0,n.jsx)(Te,{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((u,g,m)=>(0,n.jsx)(ao,{message:u,ownerOpenId:e.state?.ownerOpenId,groupStart:g===0||xn(m[g-1])!==xn(u)},u.messageId??g))}):null]})]}):null})}function ro(e){let[t,s]=(0,d.useState)(!1),[a,r]=(0,d.useState)(""),u=(0,d.useRef)(null),g=ie(e.row.title)||e.row.sessionId;(0,d.useLayoutEffect)(()=>{if(!t||!u.current)return;let f=u.current;f.focus(),f.select(),(()=>{let T=getComputedStyle(f),N=document.createElement("span");N.style.cssText="position:absolute;visibility:hidden;white-space:pre",N.style.fontSize=T.fontSize,N.style.fontFamily=T.fontFamily,N.style.fontWeight=T.fontWeight,N.style.letterSpacing=T.letterSpacing,N.textContent=f.value||" ",document.body.appendChild(N);let I=Math.round(window.innerWidth*.6);f.style.width=`${Math.min(Math.max(N.offsetWidth+22,80),I)}px`,N.remove()})()},[t,a]);let m=f=>{let S=a.trim();s(!1),f&&S&&S!==g&&e.onRename(e.row,S)};return t?(0,n.jsx)("input",{ref:u,type:"text",className:"term-modal-name-input",maxLength:200,value:a,onChange:f=>r(f.currentTarget.value),onBlur:()=>m(!0),onKeyDown:f=>{f.stopPropagation(),f.key==="Enter"?(f.preventDefault(),m(!0)):f.key==="Escape"&&(f.preventDefault(),m(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??g),children:String(g).slice(0,60)}),(0,n.jsx)(ye,{id:"term-modal-edit",icon:H.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(ie(e.row.title)||""),s(!0)}})]})}function lo(e){let t=(0,d.useRef)(null);Hn(t,!!e.state);let s=e.state?Re.sessions.get(e.state.sessionId):null,a=s?je(s):null,r=e.state?.url??a??"",u=s?String(s.cliId??"unknown"):"",g=s?Tn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:m=>{m.target===m.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:ce(ve({name:be(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)(ro,{row:s,onRename:e.onRename}),(0,n.jsx)(on,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:be(s)}),(0,n.jsx)("span",{children:u}),g!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:g}):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:ce(H.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:ce(H.terminal)}),(0,n.jsx)(ye,{id:"term-modal-close",icon:H.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)(Te,{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 co(e){let[t,s]=(0,d.useState)(null);(0,d.useEffect)(()=>s(null),[e.row.sessionId]);let a=async()=>{s({loading:!0});try{let g=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-diff`),m=await g.json().catch(()=>({}));if(!m.ok){s({loading:!1,message:(0,n.jsxs)("p",{children:[o("sessions.landUnavailable"),": ",String(m.error??g.status)]})});return}if(m.empty){s({loading:!1,message:(0,n.jsx)("p",{children:o("sessions.landEmpty")})});return}let f=String(m.patch??"");s({loading:!1,diff:m,patch:f.slice(0,2e4)+(f.length>2e4?`
3
3
  ...(truncated)`:"")})}catch(g){s({loading:!1,message:(0,n.jsxs)("p",{children:[o("sessions.landUnavailable"),": ",String(g)]})})}},r=async()=>{let g=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-land/apply`,{method:"POST"}),m=await g.json().catch(()=>({}));s({loading:!1,message:m.ok?(0,n.jsxs)("p",{children:[o("sessions.landApplied"),": ",m.files," files (+",m.insertions,"/-",m.deletions,") \u2192 ",(0,n.jsx)("code",{children:String(m.workingDir??"")})]}):(0,n.jsxs)("p",{children:[o("sessions.landFailed"),": ",String(m.error??g.status)]})})},u=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:()=>{a()},children:o("sessions.land")}),(0,n.jsxs)("div",{id:"land-area",children:[t?.loading?(0,n.jsx)(Te,{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:()=>{u()},children:o("sessions.landDiscard")})]})]}):null]})]})}function uo(e){let t=e.report;if(!t||t.status!=="ok"){let f=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",f]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let a=[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:[],u=Array.isArray(t.spans)?t.spans:[],g=f=>f==="bad"||f==="warn"?"!":"i",m=f=>f==="error"?"!":f==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[a.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:a.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((f,S)=>(0,n.jsxs)("li",{children:[g(String(f.severity??""))," ",(0,n.jsx)("b",{children:String(f.title??"")})," - ",String(f.action??""),Array.isArray(f.evidence)&&f.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:f.evidence.join("; ")})]}):null]},S))})]}):null,u.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",u.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??u.length),total:String(t.meta.spansTotal??u.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:[...u].sort((f,S)=>(f.relStartMs??0)-(S.relStartMs??0)).map((f,S)=>{let T=[f.inputSummary,f.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:f.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:m(String(f.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(f.tool??"")})}),(0,n.jsx)("td",{children:String(f.phase??"")}),(0,n.jsx)("td",{children:Vs(f.durationMs)}),(0,n.jsxs)("td",{children:["#",String(f.turnIndex??0)]}),(0,n.jsx)("td",{children:T})]},S)})})})})]}):null]})}function mo(e){let[t,s]=(0,d.useState)(null);if((0,d.useEffect)(()=>s(null),[e.row.sessionId]),!Be.authed)return null;let a=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),u=await r.json().catch(()=>({}));!u.ok||!u.report?s({loading:!1,error:String(u.error??r.status)}):s({loading:!1,report:u.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:()=>{a()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(Te,{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)(uo,{report:t.report}):null]})]})}function go(e){let t=(0,d.useRef)(null);Hn(t,!!e.row);let s=e.row,a=s?je(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:ie(s.title)||s.sessionId}),(0,n.jsx)(ye,{id:"drawer-close",className:"card-act drawer-close-btn",icon:H.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(on,{status:s.status}),(0,n.jsx)(On,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(Pn,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",be(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"),":"]})," ",Me(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(Pn,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(Pn,{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)(Gt,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(Ws,{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)(Xt,{row:s,url:a}),tn(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:nn(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)(co,{row:s}),(0,n.jsx)(mo,{row:s})]})]}):null})}function fo(e){let t=e.state;(0,d.useEffect)(()=>{let p=e.dialog;return()=>{p.open&&p.close()}},[e.dialog]),(0,d.useEffect)(()=>{let p=e.dialog;if(t){if(!p.open)try{p.showModal()}catch{}}else p.open&&p.close()},[e.dialog,t]),(0,d.useEffect)(()=>{let p=e.dialog,L=()=>e.onClose(),A=B=>{B.target===p&&e.onClose()};return p.addEventListener("close",L),p.addEventListener("click",A),()=>{p.removeEventListener("close",L),p.removeEventListener("click",A)}},[e]);let[s,a]=(0,d.useState)(""),[r,u]=(0,d.useState)([]),[g,m]=(0,d.useState)(new Set),[f,S]=(0,d.useState)("lead"),[T,N]=(0,d.useState)(""),[I,$]=(0,d.useState)("in_progress"),[U,x]=(0,d.useState)(""),[K,Q]=(0,d.useState)(""),[ee,Z]=(0,d.useState)(!1),[F,ne]=(0,d.useState)(!1),[E,oe]=(0,d.useState)(""),[de,he]=(0,d.useState)(()=>tt(le())),[q,Ae]=(0,d.useState)(null),[O,te]=(0,d.useState)(null),[ue,ke]=(0,d.useState)(0),X=(0,d.useRef)(null),w=(0,d.useRef)(1);if((0,d.useEffect)(()=>{t&&(a(""),u([]),m(new Set),S("lead"),N(""),$("in_progress"),x(""),Q(""),Z(!1),ne(!1),oe(""),Ae(null),te(null),ke(0),w.current=1)},[t]),!t)return null;if(t.success){let p=t.success,L=typeof p.shareLink=="string"&&p.shareLink?p.shareLink:"",A=Array.isArray(p.failed)?p.failed.length:0,B=Array.isArray(p.spawned)?p.spawned.length:0,P=p.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:[P,"\uFF08",B,"\uFF09"]}),A>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(A)})}):null,L?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:L,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)(Te,{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 v=t.bots,R=[...g],se=R,z=p=>v.find(L=>L.larkAppId===p)?.botName??p,V=E.trim().toLowerCase(),me=V?v.filter(p=>p.botName.toLowerCase().includes(V)||p.larkAppId.toLowerCase().includes(V)):v,J=O?Lt(v,O.query).slice(0,8):[],ae=p=>{if(!O)return;let L=At(s,O,p.botName);a(L.text),te(null),ke(0),m(A=>new Set(A).add(p.larkAppId)),N(A=>A||p.larkAppId),requestAnimationFrame(()=>{let A=X.current;A&&(A.focus(),A.setSelectionRange(L.caret,L.caret))})},Pe=p=>{if(!(!O||J.length===0)){if(p.key==="ArrowDown"||p.key==="ArrowUp"){p.preventDefault();let L=p.key==="ArrowDown"?1:-1;ke(A=>(A+L+J.length)%J.length);return}if(p.key==="Enter"||p.key==="Tab"){p.preventDefault(),ae(J[Math.min(ue,J.length-1)]);return}p.key==="Escape"&&(p.preventDefault(),te(null))}},$e=async p=>{let L=[...p.clipboardData.files].filter(Y=>Y.type.startsWith("image/"));if(L.length===0)return;p.preventDefault();let A=p.currentTarget.selectionStart??s.length,B=p.currentTarget.selectionEnd??A,P=L.filter(Y=>Hs.has(Y.type.toLowerCase()));if(P.length!==L.length){alert(o("sessions.create.imageUnsupported"));return}if(r.length+P.length>jt){alert(o("sessions.create.imageCountLimit",{n:String(jt)}));return}if(P.some(Y=>Y.size>Ks)){alert(o("sessions.create.imageSizeLimit"));return}if(r.reduce((Y,_)=>Y+_.size,0)+P.reduce((Y,_)=>Y+_.size,0)>_s){alert(o("sessions.create.imageTotalLimit"));return}try{let Y=w.current,_=await Promise.all(P.map(async(G,Oe)=>{let fe=await Us(G),Je=fe.indexOf(",");if(Je<0)throw new Error("bad_image_data");let we=Y+Oe;return{id:`${Date.now()}-${Oe}-${Math.random().toString(36).slice(2)}`,ordinal:we,marker:`[${o("sessions.create.imageMarker",{n:String(we)})}]`,name:G.name||`pasted-image-${r.length+Oe+1}`,mimeType:G.type.toLowerCase(),size:G.size,dataBase64:fe.slice(Je+1),previewUrl:fe}}));w.current+=_.length;let xe=xt(s,A,B,_.map(G=>G.marker));a(xe.text),u(G=>[...G,..._]),te(null),requestAnimationFrame(()=>{let G=X.current;G&&(G.focus(),G.setSelectionRange(xe.caret,xe.caret))})}catch{alert(o("sessions.create.imageReadFailed"))}},Le=async p=>{p.preventDefault();let L=s.trim();if(!L){alert(o("sessions.create.errContent"));return}if(R.length===0){alert(o("sessions.create.errNoBot"));return}let A=T||R[0]||"";if(f==="lead"&&(!A||!R.includes(A))){alert(o("sessions.create.errLead"));return}ne(!0),Ae(null);try{let B=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:L,larkAppIds:R,mode:f,column:I,leadLarkAppId:f==="lead"?A:void 0,name:U.trim()||void 0,bindWorkingDir:K.trim()||void 0,images:r.map(ge=>({name:ge.name,mimeType:ge.mimeType,dataBase64:ge.dataBase64}))})}),P=await B.json().catch(()=>null);B.ok&&P?.ok?de?(Ae(P),a(""),u([]),w.current=1,x("")):e.onSuccess(P):B.status!==401&&alert(`${o("sessions.create.failed")}: ${P?.error??B.status}`)}catch(B){alert(`${o("sessions.create.failed")}: ${B}`)}finally{ne(!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:Le,children:[(0,n.jsxs)("fieldset",{className:"cs-content",children:[(0,n.jsx)("legend",{children:o("sessions.create.content")}),(0,n.jsxs)("div",{className:"cs-composer",children:[(0,n.jsx)("textarea",{ref:X,name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),"aria-describedby":"cs-content-help",required:!0,value:s,onChange:p=>{let L=p.currentTarget,A=L.value;a(A),te(En(A,L.selectionStart??A.length)),ke(0)},onClick:p=>te(En(s,p.currentTarget.selectionStart??s.length)),onKeyDown:Pe,onPaste:p=>{$e(p)},onBlur:()=>setTimeout(()=>te(null),0)}),O?(0,n.jsx)("div",{className:"cs-mention-menu",role:"listbox","aria-label":o("sessions.create.mentionBots"),children:J.length?J.map((p,L)=>(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":L===ue,className:L===ue?"active":void 0,onMouseDown:A=>A.preventDefault(),onClick:()=>ae(p),children:[(0,n.jsxs)("strong",{children:["@",p.botName]}),(0,n.jsx)("small",{children:p.larkAppId})]},p.larkAppId)):(0,n.jsx)("p",{children:o("sessions.create.noBotMatch")})}):null]}),(0,n.jsx)("small",{id:"cs-content-help",children:o("sessions.create.contentHelp")}),r.length?(0,n.jsx)("div",{className:"cs-image-list","aria-label":o("sessions.create.pastedImages"),children:r.map(p=>(0,n.jsxs)("figure",{className:"cs-image-item",children:[(0,n.jsx)("img",{src:p.previewUrl,alt:p.name}),(0,n.jsxs)("figcaption",{title:`${p.marker} ${p.name}`,children:[(0,n.jsx)("strong",{children:p.marker}),(0,n.jsx)("span",{children:p.name})]}),(0,n.jsx)("button",{type:"button",className:"cs-image-remove","aria-label":o("sessions.create.removeImage",{name:`${p.marker} ${p.name}`}),title:o("sessions.create.removeImage",{name:`${p.marker} ${p.name}`}),onClick:()=>{let L=r.filter(B=>B.id!==p.id),A=Et(s,p.marker,L.map(B=>B.marker),B=>`[${o("sessions.create.imageMarker",{n:String(B+1)})}]`);a(A.text),u(L.map((B,P)=>({...B,ordinal:P+1,marker:A.markers[P]}))),w.current=L.length+1},children:(0,n.jsx)("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{d:"M7 7l10 10M17 7 7 17"})})})]},p.id))}):null]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),v.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("input",{className:"cs-bot-search",type:"search",name:"botSearch",placeholder:o("sessions.create.botSearchPlaceholder"),"aria-label":o("sessions.create.botSearchPlaceholder"),value:E,onChange:p=>oe(p.currentTarget.value)}),me.length?(0,n.jsx)("div",{className:"cs-bot-list",children:me.map(p=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:p.larkAppId,checked:g.has(p.larkAppId),onChange:L=>{let A=L.currentTarget.checked;m(B=>{let P=new Set(B);return A?P.add(p.larkAppId):P.delete(p.larkAppId),P.has(T)||N(P.values().next().value??""),P})}})," ",(0,n.jsx)("span",{children:p.botName})]},p.larkAppId))}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBotMatch")}),R.length?(0,n.jsx)("small",{children:o("sessions.create.selectedCount",{n:String(R.length)})}):null]}):(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:f==="lead",onChange:()=>S("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:f==="all",onChange:()=>S("all")})," ",o("sessions.create.modeAll")]}),(0,n.jsx)("small",{children:o("sessions.create.modeHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-lead-row",hidden:f!=="lead",children:[(0,n.jsx)("legend",{children:o("sessions.create.lead")}),(0,n.jsx)("select",{name:"lead",disabled:se.length===0,value:se.includes(T)?T:"",onChange:p=>N(p.currentTarget.value),children:se.length?se.map(p=>(0,n.jsx)("option",{value:p,children:z(p)},p)):(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:I==="in_progress",onChange:()=>$("in_progress")})," ",o("sessions.create.columnInProgress")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"backlog",checked:I==="backlog",onChange:()=>$("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${ee?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":ee,"aria-controls":"cs-advanced-fields",onClick:()=>Z(p=>!p),children:o("sessions.create.optionalConfig")})}),ee?(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:U,onChange:p=>x(p.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:K,onChange:p=>Q(p.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),q?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[q.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(q.failed)&&q.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(q.failed.length)})}`:""]}),typeof q.shareLink=="string"&&q.shareLink?(0,n.jsx)("a",{href:q.shareLink,target:"_blank",rel:"noopener",children:o("sessions.create.openChat")}):null]}):null,(0,n.jsxs)("div",{className:"actions cs-actions",children:[(0,n.jsxs)("label",{className:"cs-keep-open",title:o("sessions.create.keepOpenHelp"),children:[(0,n.jsx)("input",{type:"checkbox",name:"keepOpen",checked:de,onChange:p=>{let L=p.currentTarget.checked;he(L),st(le(),L)}}),(0,n.jsx)("span",{children:o("sessions.create.keepOpen")})]}),(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:F||v.length===0,children:F?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function po(){ut();let e=dt(i=>[...i.sessions.values()]),[t,s]=(0,d.useState)(0),a=(0,d.useCallback)(()=>s(i=>i+1),[]),[r,u]=(0,d.useState)({q:"",status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:Qn(le()),active:!0,cli:new Set(Ne)}),[g,m]=(0,d.useState)(new Set),[f,S]=(0,d.useState)("lastMessageAt"),[T,N]=(0,d.useState)("desc"),[I,$]=(0,d.useState)(()=>Yn(le())),[U,x]=(0,d.useState)(()=>Zn(le())),[K,Q]=(0,d.useState)(!1),[ee,Z]=(0,d.useState)(null),[F,ne]=(0,d.useState)(null),[E,oe]=(0,d.useState)(()=>ot(le())),de=`${I}:${I==="kanban"?E:"-"}`,he=(0,d.useRef)(!0),[q,Ae]=(0,d.useState)(0),[O,te]=(0,d.useState)([]),[ue,ke]=(0,d.useState)(null),[X,w]=(0,d.useState)(!1),v=(0,d.useRef)(!1),[R,se]=(0,d.useState)(()=>{try{return window.localStorage.getItem(yn)??""}catch{return""}}),[z,V]=(0,d.useState)({data:null,key:"",fetchedAt:0}),me=(0,d.useRef)(!1),J=(0,d.useRef)(new Set),[ae,Pe]=(0,d.useState)(""),[$e,Le]=(0,d.useState)(null),[p,L]=(0,d.useState)(null),[A,B]=(0,d.useState)(null),[P,ge]=(0,d.useState)(!1),[Y,_]=(0,d.useState)(24),[xe,G]=(0,d.useState)(""),[Oe,fe]=(0,d.useState)(null),[Je,we]=(0,d.useState)(null),[Wt,an]=(0,d.useState)(null),[qt,Yt]=(0,d.useState)(null),[rn,Qt]=(0,d.useState)(null),[Zt,Xe]=(0,d.useState)(null),[es,ln]=(0,d.useState)(!1),Ke=(0,d.useRef)(0);(0,d.useLayoutEffect)(()=>{if(he.current){he.current=!1;return}Ae(i=>i+1)},[de]),(0,d.useEffect)(()=>{Qt(document.getElementById("create-session-modal"))},[]),(0,d.useEffect)(()=>{rt().then(a)},[a]);let cn=(0,d.useMemo)(()=>{let i=new Map;for(let l of e){let c=String(l.chatId??"").trim();if(!c||!r.showUnknownChats&&Nn(l))continue;let b=Me(l),y=i.get(c);(!y||b<y)&&i.set(c,b)}return[...i.entries()].sort((l,c)=>l[1].localeCompare(c[1])).map(([l,c])=>({value:l,label:c}))},[r.showUnknownChats,t,e]);(0,d.useEffect)(()=>{r.chat&&(cn.some(i=>i.value===r.chat)||u(i=>({...i,chat:""})))},[cn,r.chat]);let pe=(0,d.useMemo)(()=>{let i=r.q.toLowerCase(),l=[...r.cli],c=l.length>0&&l.length<Ne.length,b=I==="kanban",y=r.multiBotTopics||r.botTriggeredTopics?new Set(en(e).filter(h=>!r.multiBotTopics||h.multiBot).filter(h=>!r.botTriggeredTopics||h.inferredBotTriggered).map(h=>h.key)):null,k=e.filter(h=>!c||l.includes(h.cliId??"unknown")).filter(h=>r.showUnknownChats||!Nn(h)).filter(h=>!r.status||h.status===r.status).filter(h=>!r.adopt||r.adopt==="yes"==!!h.adopt).filter(h=>!r.chat||String(h.chatId??"")===r.chat).filter(h=>!r.active||b||h.status!=="closed").filter(h=>!i||St(h).includes(i));return y?k.filter(h=>y.has(An(h))).sort((h,D)=>Jt(h,D,f,T)):k.sort((h,D)=>Jt(h,D,f,T))},[r,t,T,f,e,I]),dn=(0,d.useMemo)(()=>Ct(e),[e]),Ce=(0,d.useMemo)(()=>new Map(e.map(i=>[i.sessionId,i])),[e,t]),Kn=(0,d.useMemo)(()=>pe.filter(i=>i.status!=="closed"),[pe]),_e=(I==="table"||I==="topics"?pe:Kn).filter(i=>i.status!=="closed"),_n=[...g].map(i=>Ce.get(i)).filter(i=>!!i&&i.status!=="closed"),Un=_e.length>0&&_e.every(i=>g.has(i.sessionId)),ns=_e.some(i=>g.has(i.sessionId))&&!Un;(0,d.useEffect)(()=>{m(i=>{let l=!1,c=new Set;for(let b of i){let y=Ce.get(b);y&&y.status!=="closed"?c.add(b):l=!0}return l?c:i})},[Ce]);let un=(0,d.useCallback)(i=>{let l=new Set;if(!i)return l;for(let c of i.groupChats)l.add(c);if(ue)for(let[c,b]of ue){if(l.has(c))continue;let y=!1;for(let k of i.botIds)if(b.botIds.has(k)){y=!0;break}if(y){for(let k of b.observedNames)if(i.botNames.has(k)){l.add(c);break}}}return l},[ue]),Fn=(0,d.useMemo)(()=>{if(I==="kanban"&&E==="team"){let i=O.find(c=>c.key===R)??O[0],l=un(i);return pe.filter(c=>l.has(String(c.chatId)))}return pe},[E,R,O,pe,un,I]),mn=(0,d.useCallback)(i=>bt(Fn,i),[Fn]),gn=(0,d.useCallback)(async()=>{if(!(v.current||X)){v.current=!0;try{let[i,l,c]=await Promise.all([fetch("/api/team/hosted").then(k=>k.json()).catch(()=>null),fetch("/api/team/remote-roster").then(k=>k.json()).catch(()=>null),fetch("/api/groups").then(k=>k.json()).catch(()=>null)]);Array.isArray(c?.chats)&&ke(new Map(c.chats.map(k=>[String(k.chatId),{botIds:new Set((k.memberBots??[]).filter(h=>h.inChat).map(h=>String(h.larkAppId))),observedNames:new Set((k.observedBotNames??[]).map(h=>String(h)))}])));let b=k=>({ids:new Set(k.map(h=>String(h.larkAppId))),names:new Set(k.map(h=>String(h.name??"")).filter(Boolean))}),y=[];for(let k of i?.teams??[]){let{ids:h,names:D}=b(k.bots??[]);y.push({key:`local:${k.teamId}`,label:k.isDefault?o("team.myHostedTeam"):String(k.name??k.teamId),botIds:h,botNames:D,groupChats:new Set((k.groupChatIds??[]).map(j=>String(j)))})}for(let k of l?.memberships??[]){let{ids:h,names:D}=b(k.roster?.bots??[]);y.push({key:`${k.hubUrl}::${k.teamId}`,label:String(k.teamName??k.teamId??k.hubUrl),botIds:h,botNames:D,groupChats:new Set})}te(y),se(k=>y.length&&!y.some(h=>h.key===k)?y[0].key:k)}finally{w(!0),v.current=!1}}},[X]),jn=(0,d.useCallback)(async(i,l,c,b,y)=>{try{let h=i.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(i.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:l,column:c,position:b})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:i,sessionId:l,column:c,position:b})}),D=await h.json().catch(()=>({}));(!h.ok||D?.ok===!1)&&(V(j=>{if(!j.data||j.key!==i)return j;let W={...j.data.board};return y?W[l]=y:delete W[l],{...j,data:{...j.data,board:W}}}),h.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${D?.error??h.status}`))}catch(k){V(h=>{if(!h.data||h.key!==i)return h;let D={...h.data.board};return y?D[l]=y:delete D[l],{...h,data:{...h.data,board:D}}}),alert(`${o("sessions.kanban.moveFail")}: ${k}`)}},[]),ts=(0,d.useCallback)(async i=>{let l=z.key===i.key&&Date.now()-z.fetchedAt<3e4;if(!(me.current||l)){me.current=!0;try{let b=i.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(i.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(i.key)}`,y=await fetch(b),k=await y.json().catch(()=>({}));if(!y.ok||k?.ok===!1)return;let h=typeof k.deploymentId=="string"?k.deploymentId:null,D=[];for(let j of Array.isArray(k.reports)?k.reports:[])if(!(h&&j.deploymentId===h))for(let W of Array.isArray(j.sessions)?j.sessions:[])D.push({...W,remoteDeployment:j.deploymentName||j.deploymentId});V({key:i.key,fetchedAt:Date.now(),data:{board:k.board&&typeof k.board=="object"?k.board:{},remoteRows:D}})}finally{me.current=!1}}},[z.fetchedAt,z.key]);(0,d.useEffect)(()=>{I==="kanban"&&E==="team"&&!X&&gn()},[E,X,gn,I]),(0,d.useEffect)(()=>{let i=window.setInterval(()=>{I==="kanban"&&E==="team"&&(V(l=>({...l,fetchedAt:0})),a())},3e4);return()=>window.clearInterval(i)},[E,a,I]);let zn=(0,d.useCallback)(async(i,l,c,b)=>{try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:l,position:c})}),k=await y.json().catch(()=>({}));(!y.ok||k?.ok===!1)&&(i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),y.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${k?.error??y.status}`))}catch(y){i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),alert(`${o("sessions.kanban.moveFail")}: ${y}`)}},[a]),ss=(0,d.useCallback)(i=>{let l=!1;for(let c of i){let b=String(c.row.sessionId);if(!b||c.row.status==="closed"&&c.column!=="done")continue;if(E==="team"){let h=O.find(W=>W.key===R)??O[0];if(!h)continue;let j=(z.key===h.key&&z.data?z.data.board:{})[b];V(W=>{let Vn=W.key===h.key&&W.data?W.data:{board:{},remoteRows:W.data?.remoteRows??[]},ks={...Vn.board,[b]:{column:c.column,position:c.position}};return{...W,key:h.key,data:{...Vn,board:ks}}}),jn(h.key,b,c.column,c.position,j),l=!0;continue}let y=Re.sessions.get(b);if(!y)continue;let k={column:y.kanbanColumn,position:y.kanbanPosition};y.kanbanColumn=c.column,y.kanbanPosition=c.position,zn(y,c.column,c.position,k),l=!0}l&&a()},[E,R,O,z,zn,jn,a]),Jn=(0,d.useCallback)(async(i,l)=>{let c=i.title;i.title=l,a();try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:l})}),y=await b.json().catch(()=>({}));(!b.ok||y?.ok===!1)&&(i.title=c,a(),b.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${y?.error??b.status}`))}catch(b){i.title=c,a(),alert(`${o("sessions.kanban.renameFail")}: ${b}`)}},[a]),fn=(0,d.useCallback)(async i=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/locate`,{method:"POST"}),c=await l.json();return c.ok?!0:(alert(`Locate failed: ${c.error??l.status}`),!1)}catch(l){return alert(`Locate error: ${l}`),!1}},[]),pn=(0,d.useCallback)(async(i,l)=>{if(!confirm(o("sessions.closeConfirm")))return!1;l&&(l.disabled=!0);try{let c=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/close`,{method:"POST"}),b=await c.json().catch(()=>({}));return!c.ok||b?.ok===!1?(c.status!==401&&alert(`Close failed: ${b?.error??c.status}`),!1):(m(y=>{let k=new Set(y);return k.delete(i.sessionId),k}),a(),!0)}catch(c){return alert(`Close error: ${c}`),!1}finally{l&&(l.disabled=!1)}},[a]),Ge=(0,d.useCallback)(async(i,l,c)=>{let b=!!i.locked;if(b===l)return!0;i.locked=l,a(),c&&(c.disabled=!0);try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:l})}),k=await y.json().catch(()=>({}));return!y.ok||k?.ok===!1?(i.locked=b,a(),y.status!==401&&alert(`${o("sessions.lockFailed")}: ${k?.error??y.status}`),!1):(i.locked=!!k.locked,a(),!0)}catch(y){return i.locked=b,a(),alert(`${o("sessions.lockFailed")}: ${y}`),!1}finally{c&&(c.disabled=!1)}},[a]),Ve=(0,d.useCallback)(async(i,l)=>{if(J.current.has(i.sessionId)||!confirm(Nt(i)))return!1;l&&(l.disabled=!0);try{let c=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/restart`,{method:"POST"}),b=await c.json().catch(()=>({}));return!c.ok||b?.ok===!1?(c.status!==401&&alert(`${o("sessions.restartFailed")}: ${b?.error??c.status}`),!1):(J.current.add(i.sessionId),window.setTimeout(()=>J.current.delete(i.sessionId),5e3),!0)}catch(c){return alert(`${o("sessions.restartFailed")}: ${c}`),!1}finally{l&&(l.disabled=!1)}},[]),os=(0,d.useCallback)(async(i,l)=>{l&&(l.disabled=!0);try{let c=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/resume`,{method:"POST"}),b=await c.json().catch(()=>({}));return!c.ok||b.ok===!1?(alert(`${o("sessions.resumeFailed")}: ${b?.error??c.status}`),!1):!0}catch(c){return alert(`${o("sessions.resumeFailed")}: ${c}`),!1}finally{l&&(l.disabled=!1)}},[]),as=(0,d.useCallback)(async(i,l)=>{l&&(l.disabled=!0);try{let c=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/start`,{method:"POST"}),b=await c.json().catch(()=>({}));return!c.ok||b.ok===!1?(c.status!==401&&alert(`${o("sessions.create.startFailed")}: ${b?.error??c.status}`),!1):!0}catch(c){return alert(`${o("sessions.create.startFailed")}: ${c}`),!1}finally{l&&(l.disabled=!1)}},[]),We=(0,d.useCallback)(i=>{we({sessionId:i.sessionId,loading:!0,messages:[]}),(async()=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/history?limit=80`),c=await l.json().catch(()=>({}));if(!l.ok||c?.ok===!1){let y=String(c?.error??l.status),k=y==="not_found_yet"||y==="not_found";we(h=>h?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:y,stale:k}:h);return}let b=Array.isArray(c.messages)?c.messages:[];we(y=>y?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:b,ownerOpenId:c.ownerOpenId}:y)}catch(l){we(c=>c?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:String(l)}:c)}})()},[]),is=(0,d.useCallback)(i=>{let l=je(i);if(!l){fe(i.sessionId);return}an({sessionId:i.sessionId,url:l,loading:!0}),(async()=>{let c=l;if(Ln())try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/write-link`),y=await b.json().catch(()=>({}));b.ok&&y?.ok!==!1&&y?.url&&(c=y.url)}catch{}an(b=>b?.sessionId===i.sessionId?{sessionId:i.sessionId,url:c,loading:!1}:b)})()},[]),rs=(0,d.useCallback)(async()=>{let i=[...g];if(i.length===0||!confirm(o("sessions.closeBulkConfirm",{count:i.length})))return;Le({done:0,total:i.length});let l=0,c=0,b=[...i];async function y(){for(;b.length;){let k=b.shift();try{let h=await fetch(`/api/sessions/${encodeURIComponent(k)}/close`,{method:"POST"}),D=await h.json().catch(()=>({}));(!h.ok||D?.ok===!1)&&(c+=1)}catch{c+=1}finally{l+=1,Le({done:l,total:i.length})}}}await Promise.all(Array.from({length:Math.min(6,i.length)},()=>y())),Le(null),m(new Set),a(),c>0&&alert(`Failed: ${c}/${i.length}`)},[a,g]),ls=(0,d.useCallback)(async i=>{let l=[...g].map(h=>Ce.get(h)).filter(h=>!!h&&h.status!=="closed"&&!!h.locked!==i);if(l.length===0)return;L({locked:i,done:0,total:l.length});let c=0,b=0,y=[...l];async function k(){for(;y.length;){let h=y.shift(),D=!!h.locked;try{let j=await fetch(`/api/sessions/${encodeURIComponent(h.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:i})}),W=await j.json().catch(()=>({}));!j.ok||W?.ok===!1?(b+=1,h.locked=D):h.locked=!!W.locked}catch{b+=1,h.locked=D}finally{c+=1,L({locked:i,done:c,total:l.length})}}}await Promise.all(Array.from({length:Math.min(6,l.length)},()=>k())),L(null),a(),b>0&&alert(`${o("sessions.lockFailed")}: ${b}/${l.length}`)},[a,Ce,g]),cs=(0,d.useCallback)(()=>{let i=[...g].filter(c=>!!Ce.get(c));if(i.length===0)return;let l=ft(i);B(o("sessions.monitorRoomAdded",{added:l.added,total:l.total})),window.setTimeout(()=>B(null),1800)},[Ce,g]),ds=(0,d.useCallback)(async i=>{let l=Cn(i);if(!l)return;let c=mn(l);if(c.length!==0){_(l),ge(!0),G(o("sessions.idleCleanupRunning"));try{let b=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:l,sessionIds:c.map(k=>k.sessionId)})}),y=await b.json().catch(()=>({}));if(!b.ok){b.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${y?.error??b.status}`),G("");return}m(k=>{let h=new Set(k);for(let D of y?.results??[])D?.ok&&D?.sessionId&&h.delete(String(D.sessionId));return h}),G(o("sessions.idleCleanupDone",{closed:Number(y?.closed??0),failed:Number(y?.failed??0)})),a()}catch(b){alert(`${o("sessions.idleCleanupFailed")}: ${b}`),G("")}finally{ge(!1)}}},[mn,a]),us=i=>{let l=qn(i)??"board";l!==I&&($(l),et(le(),l))},ms=(i,l)=>{x(c=>{let b=c.indexOf(i),y=b+l;if(b<0||y<0||y>=c.length)return c;let k=[...c];return k.splice(b,1),k.splice(y,0,i),hn(le(),k),k})},gs=(i,l)=>{i!==l&&x(c=>{let b=c.indexOf(i),y=c.indexOf(l);if(b<0||y<0)return c;let k=[...c];return k.splice(b,1),k.splice(y,0,i),hn(le(),k),k})},fs=(0,d.useMemo)(()=>({rows:pe,groupBy:E,teams:O,teamsLoaded:X,teamKey:R,teamBoardData:z.data,teamBoardKey:z.key}),[E,R,O,X,pe,z.data,z.key]),ps=Oe?Ce.get(Oe)??null:null,bn=(0,d.useMemo)(()=>X?O.length?O.map(i=>({value:i.key,label:i.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[O,X]),bs=!X||O.length===0,Xn=O.some(i=>i.key===R)?R:bn[0]?.value??"",hs=bn.find(i=>i.value===Xn)?.label??o("sessions.kanban.groupTeam"),ys=(0,d.useCallback)(()=>{Ke.current+=1,ln(!1),Xe(null)},[]),Gn=(0,d.useCallback)(async()=>{let i=Ke.current+1;Ke.current=i,Xe({bots:[],loading:!0}),ln(!0);try{let l=await Mt();if(Ke.current!==i)return;Xe({bots:l})}finally{Ke.current===i&&ln(!1)}},[]);return(0,d.useEffect)(()=>{let i=()=>{mt()&&Be.authed&&Gn()};return i(),window.addEventListener(kn,i),()=>window.removeEventListener(kn,i)},[]),(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")],["topics",o("sessions.viewTopics")],["table",o("sessions.viewTable")]].map(([i,l])=>(0,n.jsx)("button",{type:"button","data-view":i,className:I===i?"active":void 0,"aria-pressed":I===i,onClick:()=>us(i),children:l},i))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${I==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":I!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([i,l])=>(0,n.jsx)("button",{type:"button","data-groupby":i,className:E===i?"active":void 0,"aria-pressed":E===i,onClick:()=>{oe(i),at(le(),i)},children:l},i))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(I==="kanban"&&E==="team"&&X),children:ae}),(0,n.jsx)(Ue,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(I==="kanban"&&E==="team"),disabled:bs,label:hs,value:Xn,options:bn,onChange:i=>{if(O.some(l=>l.key===i)){se(i);try{window.localStorage.setItem(yn,i)}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=pt()},children:o("sessions.monitorRoom")}),Be.authed?(0,n.jsx)(ct,{className:"page-primary-action create-session-btn",disabled:es,onClick:()=>{Gn()},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:dn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:dn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:dn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(Qs,{chatOptions:cn,filters:r,setFilters:u,idleCleanup:{busy:P,hours:Y,status:xe,countForHours:i=>mn(i).length,onRun:ds}}),(0,n.jsx)(Zs,{selectedCount:g.size,lockDisabled:!_n.some(i=>!i.locked),unlockDisabled:!_n.some(i=>!!i.locked),closeProgress:$e,lockProgress:p,monitorRoomText:A,onClear:()=>m(new Set),onClose:()=>{rs()},onAddToMonitorRoom:cs,onLock:i=>{ls(i)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${q>0?" sessions-view-stage-enter":""}`,"data-view":I,"data-kanban-group":E,children:[(0,n.jsx)(no,{rows:pe,selected:g,hidden:I!=="table",sortKey:f,sortDir:T,selectAllChecked:Un,selectAllIndeterminate:ns,selectAllDisabled:_e.length===0,onOpen:i=>fe(i.sessionId),onSelect:(i,l)=>m(c=>{let b=new Set(c);return l?b.add(i):b.delete(i),b}),onSelectAll:i=>m(l=>{let c=new Set(l);for(let b of _e)i?c.add(b.sessionId):c.delete(b.sessionId);return c}),onSort:i=>{f===i?N(T==="asc"?"desc":"asc"):(S(i),N(i==="spawnedAt"||i==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(to,{rows:Kn,selected:g,hidden:I!=="board",order:U,animated:K,dragColId:ee,dragOverCol:F,onAnimated:()=>Q(!0),onMoveColumn:ms,onMoveColumnTo:gs,onDragCol:Z,onDragOverCol:ne,onToggleSelect:i=>m(l=>{let c=new Set(l);return c.has(i.sessionId)?c.delete(i.sessionId):c.add(i.sessionId),c}),onOpen:i=>fe(i.sessionId),onHistory:We,onLocate:i=>fn(i),onRestart:(i,l)=>{Ve(i,l)},onLock:(i,l,c)=>{Ge(i,l,c)},onClose:(i,l)=>{pn(i,l)}}),(0,n.jsx)(oo,{rows:pe,relationRows:e,selected:g,hidden:I!=="topics",onToggleSelect:i=>m(l=>{let c=new Set(l);return c.has(i.sessionId)?c.delete(i.sessionId):c.add(i.sessionId),c}),onOpen:i=>fe(i.sessionId),onHistory:We,onLocate:i=>fn(i),onRestart:(i,l)=>{Ve(i,l)},onLock:(i,l,c)=>{Ge(i,l,c)},onClose:(i,l)=>{pn(i,l)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:Yt,className:`sessions-kanban${E==="bot"?" kanban-mode-bot":""}`,hidden:I!=="kanban",children:I==="kanban"?(0,n.jsx)(Ft,{host:qt,...fs,canRestartSession:tn,getTeamChatIds:un,icons:{details:H.details,feishu:H.feishu,history:H.history,lock:H.lock,restart:H.restart,terminal:H.terminal,unlock:H.unlock},lockActionLabel:nn,sessionStatusText:Fe,onDetails:i=>fe(String(i.sessionId)),onHistory:We,onMoveRows:ss,onNeedTeamBoard:i=>{ts(i)},onNeedTeams:()=>{gn()},onOpenTerminal:is,onRename:(i,l)=>{let c=Re.sessions.get(String(i.sessionId));c&&Jn(c,l)},onRestart:(i,l)=>{let c=Re.sessions.get(String(i.sessionId));c&&Ve(c,l)},onTeamScope:i=>Pe(i?o("sessions.kanban.teamScope",{chats:i.chats,sessions:i.sessions}):""),onToggleLock:(i,l)=>{let c=Re.sessions.get(String(i.sessionId));c&&Ge(c,!c.locked,l)},onToggleSelect:i=>m(l=>{let c=String(i.sessionId),b=new Set(l);return b.has(c)?b.delete(c):b.add(c),b}),selectedSessionIds:g}):null})]},q),(0,n.jsx)(go,{row:ps,onClose:()=>fe(null),locateSession:fn,openHistory:We,resumeSession:os,restartSession:Ve,closeSession:pn,setSessionLocked:Ge,startSession:as}),(0,n.jsx)(lo,{state:Wt,onClose:()=>an(null),onRename:Jn}),(0,n.jsx)(io,{state:Je,onClose:()=>we(null)}),rn?(0,$n.createPortal)((0,n.jsx)(fo,{dialog:rn,state:Zt,onClose:ys,onSuccess:i=>Xe(l=>l&&{...l,success:i})}),rn):null]})}function Go(e){return lt(e,(0,n.jsx)(po,{}))}export{Ys as CliFilterGroup,oo as TopicGroupsView,Go as renderSessionsPage};