botmux 3.6.0 → 3.7.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 (177) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/riff-backend.d.ts +7 -6
  3. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/riff-backend.js +8 -7
  5. package/dist/adapters/backend/riff-backend.js.map +1 -1
  6. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  7. package/dist/adapters/backend/sandbox.js +5 -2
  8. package/dist/adapters/backend/sandbox.js.map +1 -1
  9. package/dist/adapters/cli/codex.d.ts.map +1 -1
  10. package/dist/adapters/cli/codex.js +15 -6
  11. package/dist/adapters/cli/codex.js.map +1 -1
  12. package/dist/adapters/cli/fs-policy.d.ts +62 -6
  13. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  14. package/dist/adapters/cli/fs-policy.js +70 -7
  15. package/dist/adapters/cli/fs-policy.js.map +1 -1
  16. package/dist/bot-registry.d.ts +13 -0
  17. package/dist/bot-registry.d.ts.map +1 -1
  18. package/dist/bot-registry.js +15 -7
  19. package/dist/bot-registry.js.map +1 -1
  20. package/dist/cli/daemon-lifecycle-env.d.ts +1 -1
  21. package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
  22. package/dist/cli/daemon-lifecycle-env.js +12 -0
  23. package/dist/cli/daemon-lifecycle-env.js.map +1 -1
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +23 -7
  26. package/dist/cli.js.map +1 -1
  27. package/dist/core/command-handler.d.ts +7 -5
  28. package/dist/core/command-handler.d.ts.map +1 -1
  29. package/dist/core/command-handler.js +37 -21
  30. package/dist/core/command-handler.js.map +1 -1
  31. package/dist/core/cost-calculator.d.ts +3 -0
  32. package/dist/core/cost-calculator.d.ts.map +1 -1
  33. package/dist/core/cost-calculator.js.map +1 -1
  34. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  35. package/dist/core/dashboard-ipc-server.js +12 -9
  36. package/dist/core/dashboard-ipc-server.js.map +1 -1
  37. package/dist/core/dashboard-rows.d.ts.map +1 -1
  38. package/dist/core/dashboard-rows.js +1 -0
  39. package/dist/core/dashboard-rows.js.map +1 -1
  40. package/dist/core/initial-user-turn.d.ts +14 -0
  41. package/dist/core/initial-user-turn.d.ts.map +1 -0
  42. package/dist/core/initial-user-turn.js +65 -0
  43. package/dist/core/initial-user-turn.js.map +1 -0
  44. package/dist/core/maintenance.d.ts.map +1 -1
  45. package/dist/core/maintenance.js +6 -0
  46. package/dist/core/maintenance.js.map +1 -1
  47. package/dist/core/per-bot-env.d.ts.map +1 -1
  48. package/dist/core/per-bot-env.js +10 -0
  49. package/dist/core/per-bot-env.js.map +1 -1
  50. package/dist/core/plugins/pm2.d.ts.map +1 -1
  51. package/dist/core/plugins/pm2.js +4 -0
  52. package/dist/core/plugins/pm2.js.map +1 -1
  53. package/dist/core/session-discovery.d.ts +23 -0
  54. package/dist/core/session-discovery.d.ts.map +1 -1
  55. package/dist/core/session-discovery.js +162 -82
  56. package/dist/core/session-discovery.js.map +1 -1
  57. package/dist/core/session-manager.d.ts.map +1 -1
  58. package/dist/core/session-manager.js +23 -4
  59. package/dist/core/session-manager.js.map +1 -1
  60. package/dist/core/worker-pool.d.ts +2 -0
  61. package/dist/core/worker-pool.d.ts.map +1 -1
  62. package/dist/core/worker-pool.js +27 -4
  63. package/dist/core/worker-pool.js.map +1 -1
  64. package/dist/daemon.d.ts +18 -0
  65. package/dist/daemon.d.ts.map +1 -1
  66. package/dist/daemon.js +205 -39
  67. package/dist/daemon.js.map +1 -1
  68. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  69. package/dist/dashboard/bot-onboarding.js +29 -5
  70. package/dist/dashboard/bot-onboarding.js.map +1 -1
  71. package/dist/dashboard/bot-payload.js +3 -3
  72. package/dist/dashboard/bot-payload.js.map +1 -1
  73. package/dist/dashboard/web/bot-defaults-page.js +5 -5
  74. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  75. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  76. package/dist/dashboard/web/bot-onboarding.js +1 -1
  77. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  78. package/dist/dashboard/web/i18n.js +18 -18
  79. package/dist/dashboard/web/i18n.js.map +1 -1
  80. package/dist/dashboard-web/app.js +1 -1
  81. package/dist/dashboard-web/chunks/{bot-defaults-page-VQMPUJ4Y.js → bot-defaults-page-UKA7K4JV.js} +2 -2
  82. package/dist/dashboard-web/chunks/{chunk-NP4JUBGS.js → chunk-3QAUJXAS.js} +1 -1
  83. package/dist/dashboard-web/chunks/{chunk-JMRGZQDB.js → chunk-FLGXZJTD.js} +1 -1
  84. package/dist/dashboard-web/chunks/chunk-FNPGOZMX.js +1 -0
  85. package/dist/dashboard-web/chunks/{chunk-SNKATZWK.js → chunk-KQB42ML5.js} +4 -4
  86. package/dist/dashboard-web/chunks/{connectors-page-DOY4J3ZL.js → connectors-page-A77YAB5Y.js} +1 -1
  87. package/dist/dashboard-web/chunks/{groups-page-74TS2DIH.js → groups-page-RUZNVXQB.js} +1 -1
  88. package/dist/dashboard-web/chunks/{insights-page-AYCO65JC.js → insights-page-RF7U7RTA.js} +1 -1
  89. package/dist/dashboard-web/chunks/{monitor-room-YKYLTSAN.js → monitor-room-7IVIS75W.js} +1 -1
  90. package/dist/dashboard-web/chunks/{monitoring-page-QBIUNRBR.js → monitoring-page-5SSJRQZF.js} +1 -1
  91. package/dist/dashboard-web/chunks/{office-page-4PH2A26P.js → office-page-EOND3L5D.js} +1 -1
  92. package/dist/dashboard-web/chunks/{overview-page-H73D5UT4.js → overview-page-NISBVBBJ.js} +1 -1
  93. package/dist/dashboard-web/chunks/{roles-page-U4BTOQ7F.js → roles-page-BUMKD7Y4.js} +1 -1
  94. package/dist/dashboard-web/chunks/{schedules-page-RHRHX7R7.js → schedules-page-AVOOKLUH.js} +1 -1
  95. package/dist/dashboard-web/chunks/{sessions-page-VSC6AM5G.js → sessions-page-6HLSEAB7.js} +2 -2
  96. package/dist/dashboard-web/chunks/{settings-page-LF3RKM5P.js → settings-page-MJDZHQ4X.js} +1 -1
  97. package/dist/dashboard-web/chunks/{skills-page-SYOIGGXH.js → skills-page-5MW54PCC.js} +1 -1
  98. package/dist/dashboard-web/chunks/{team-federation-page-RMBLASTW.js → team-federation-page-2SNIMVXI.js} +1 -1
  99. package/dist/dashboard-web/chunks/{v3-page-XJXKKJRN.js → v3-page-W6SBXXQC.js} +1 -1
  100. package/dist/dashboard-web/chunks/{whiteboards-page-K3YVSTHJ.js → whiteboards-page-STC54KTP.js} +1 -1
  101. package/dist/dashboard-web/style.css +5 -0
  102. package/dist/dashboard.js +2 -2
  103. package/dist/dashboard.js.map +1 -1
  104. package/dist/desktop/main/dashboard-compat.js +1 -1
  105. package/dist/i18n/en.js +6 -6
  106. package/dist/i18n/en.js.map +1 -1
  107. package/dist/i18n/zh.js +6 -6
  108. package/dist/i18n/zh.js.map +1 -1
  109. package/dist/im/lark/card-builder.d.ts.map +1 -1
  110. package/dist/im/lark/card-builder.js +5 -4
  111. package/dist/im/lark/card-builder.js.map +1 -1
  112. package/dist/im/lark/card-handler.d.ts.map +1 -1
  113. package/dist/im/lark/card-handler.js +40 -7
  114. package/dist/im/lark/card-handler.js.map +1 -1
  115. package/dist/im/lark/client.d.ts.map +1 -1
  116. package/dist/im/lark/client.js +82 -1
  117. package/dist/im/lark/client.js.map +1 -1
  118. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  119. package/dist/im/lark/event-dispatcher.js +46 -12
  120. package/dist/im/lark/event-dispatcher.js.map +1 -1
  121. package/dist/im/lark/relay-target-routing.d.ts.map +1 -1
  122. package/dist/im/lark/relay-target-routing.js +12 -11
  123. package/dist/im/lark/relay-target-routing.js.map +1 -1
  124. package/dist/im/lark/reply-mode-command.d.ts.map +1 -1
  125. package/dist/im/lark/reply-mode-command.js +4 -3
  126. package/dist/im/lark/reply-mode-command.js.map +1 -1
  127. package/dist/index-daemon.js +6 -1
  128. package/dist/index-daemon.js.map +1 -1
  129. package/dist/mir-runner.js +1 -1
  130. package/dist/mir-runner.js.map +1 -1
  131. package/dist/services/bot-config-store.d.ts +1 -1
  132. package/dist/services/bot-config-store.d.ts.map +1 -1
  133. package/dist/services/bot-config-store.js +1 -1
  134. package/dist/services/bot-config-store.js.map +1 -1
  135. package/dist/services/card-prefs-store.js +8 -8
  136. package/dist/services/card-prefs-store.js.map +1 -1
  137. package/dist/services/chat-reply-mode-store.d.ts.map +1 -1
  138. package/dist/services/chat-reply-mode-store.js +16 -11
  139. package/dist/services/chat-reply-mode-store.js.map +1 -1
  140. package/dist/services/insight/types.d.ts +3 -1
  141. package/dist/services/insight/types.d.ts.map +1 -1
  142. package/dist/services/insight/types.js.map +1 -1
  143. package/dist/services/project-scanner.d.ts +4 -4
  144. package/dist/services/project-scanner.d.ts.map +1 -1
  145. package/dist/services/project-scanner.js +13 -5
  146. package/dist/services/project-scanner.js.map +1 -1
  147. package/dist/services/transcript-resolver.d.ts +4 -0
  148. package/dist/services/transcript-resolver.d.ts.map +1 -1
  149. package/dist/services/transcript-resolver.js +53 -5
  150. package/dist/services/transcript-resolver.js.map +1 -1
  151. package/dist/services/usage-ledger.d.ts.map +1 -1
  152. package/dist/services/usage-ledger.js +1 -0
  153. package/dist/services/usage-ledger.js.map +1 -1
  154. package/dist/setup/bot-config-editor.d.ts +37 -1
  155. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  156. package/dist/setup/bot-config-editor.js +61 -3
  157. package/dist/setup/bot-config-editor.js.map +1 -1
  158. package/dist/setup/setup-args.js +1 -1
  159. package/dist/setup/setup-args.js.map +1 -1
  160. package/dist/types.d.ts +20 -0
  161. package/dist/types.d.ts.map +1 -1
  162. package/dist/utils/allowed-users-apply.d.ts.map +1 -1
  163. package/dist/utils/allowed-users-apply.js +3 -2
  164. package/dist/utils/allowed-users-apply.js.map +1 -1
  165. package/dist/utils/child-env.d.ts +31 -2
  166. package/dist/utils/child-env.d.ts.map +1 -1
  167. package/dist/utils/child-env.js +61 -3
  168. package/dist/utils/child-env.js.map +1 -1
  169. package/dist/utils/file-lock.d.ts +10 -0
  170. package/dist/utils/file-lock.d.ts.map +1 -1
  171. package/dist/utils/file-lock.js +295 -53
  172. package/dist/utils/file-lock.js.map +1 -1
  173. package/dist/worker.js +52 -3
  174. package/dist/worker.js.map +1 -1
  175. package/dist/workflows/v3/run-envelope.d.ts +24 -24
  176. package/package.json +1 -1
  177. package/dist/dashboard-web/chunks/chunk-P327LXOT.js +0 -1
@@ -1,2 +1,2 @@
1
- import{a as ht,c as yt,h as kt}from"./chunk-DFLNXQNT.js";import{a as vn,c as bt,f as Pe}from"./chunk-AGCPF6MT.js";import{a as ft,c as pt}from"./chunk-JMRGZQDB.js";import{c as Be,g as gt,p as ze}from"./chunk-QFMH6ITB.js";import{A as Qe,C as ut,E as re,F as Ae,G as de,I as Ze,a as Re,f as Zn,g as wn,h as et,i as nt,j as tt,k as st,l as Cn,m as ot,n as at,o as it,p as rt,q as Sn,r as lt,s as ct,t as Te,u as o,v as dt,w as Ne,y as Me}from"./chunk-SNKATZWK.js";import{a as mt}from"./chunk-SYC6D5XU.js";import{a as Qn,b as Ms,d as en}from"./chunk-5THX4DI2.js";import{c as Ee}from"./chunk-7SZRL6FY.js";var u=Ee(Qn(),1),Kn=Ee(Ms(),1);var In=[24,72,168],As=new Set(In);function Tn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!As.has(t)?null:t}function xs(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Ls(e,t=Date.now()){return t-e*60*60*1e3}function Es(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let a=xs(e.lastMessageAt);return a!==null&&a<Ls(t,s)}function wt(e,t,s=Date.now()){return e.filter(a=>Es(a,t,s))}var Ct={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"},Ao=new Set(Object.values(Ct)),Rs={"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"},St=Object.values(Ct).map(e=>({id:e,label:Rs[e]??e}));function nn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Nn(e){let t=nn(e);return t===null?"-":t.toLocaleString("en-US")}var me=[...St.map(e=>e.id),"unknown"],Mn=[{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 An(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var It=["starting","working","idle","dormant","analyzing","active","limited","closed"];function Je(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function Tt(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 xn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function vt(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Bs(e){let t=o("sessions.directChat"),s=String(e?.chatDisplayName??"").trim()||String(e?.chatId??"").trim()||o("sessions.chatUnknown"),a=re(e);return`${t} \xB7 ${s} - ${a}`}function xe(e){let t=String(e?.chatId??"").trim();if(e?.chatType==="p2p")return Bs(e);let s=Ae(e),a=e?.chatType==="p2p"?(()=>{let r=String(e?.botName??"").trim();return r?` \xB7 ${r}`:""})():"";return s?`${vt(e)} \xB7 ${s}${a}`:t?`${vt(e)} \xB7 ${t}${a}`:o("sessions.chatUnknown")}function Ln(e,t=Ae){return!!String(e?.chatId??"").trim()&&!t(e)}function En(e){let t=xe(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function Nt(e){return`${JSON.stringify(e)} ${xe(e)} ${En(e)}`.toLowerCase()}function ue(e){return typeof e=="string"?e.trim():""}function Mt(e){let t=ue(e?.chatId),s=ue(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function Rn(e){let t=ue(e?.chatId),s=ue(e?.rootMessageId),a=Mt(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(ue(e?.sessionId)||"unknown")}`}function Ds(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=ue(a?.title);if(r)return r}return t}function tn(e){let t=new Map;for(let a of e){let r=Rn(a),m=t.get(r);m?m.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let m=[...r].sort((F,V)=>Number(V.lastMessageAt??0)-Number(F.lastMessageAt??0)),f=m[0]??{},l=Mt(f),g=ue(f.chatId),w=l==="thread"?ue(f.rootMessageId):"",I=new Set(m.map(F=>ue(F.larkAppId)||ue(F.botName)).filter(Boolean)),T=Math.max(1,I.size),R=m.filter(F=>F.status!=="closed").length,D=m.filter(F=>F.lastInputFromBot===!0).length,N=m.reduce((F,V)=>Math.max(F,Number(V.lastMessageAt??0)),0),L=w||g||ue(f.sessionId)||a;s.push({key:a,kind:l,chatId:g,...w?{rootMessageId:w}:{},title:Ds(m,L),rows:m,botCount:T,activeCount:R,closedCount:m.length-R,inferredBotInputCount:D,latestActivityAt:N,multiBot:I.size>1,inferredBotTriggered:D>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var Xe=ht;function sn(e=Te){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>',copy:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="5.5" y="5.5" width="7.5" height="7.5" rx="1.4"/><path d="M10.5 5.5V4.1a1.4 1.4 0 0 0-1.4-1.4H4.1a1.4 1.4 0 0 0-1.4 1.4v5a1.4 1.4 0 0 0 1.4 1.4h1.4"/></svg>'};function on(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function At(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)}}async function xt(e,t){t&&(t.disabled=!0);try{let s=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/spawn-command`),a=await s.json().catch(()=>({}));if(!s.ok||a?.ok===!1||!a?.command){s.status!==401&&alert(`${o("sessions.copyCommandFail")}: ${a?.error??s.status}`);return}try{if(await navigator.clipboard.writeText(a.command),t){let r=t.textContent;t.textContent=o("sessions.copyCommandDone"),setTimeout(()=>{r!==null&&(t.textContent=r)},1500)}}catch{window.prompt(o("sessions.copyCommand"),a.command)}}catch(s){alert(`${o("sessions.copyCommandFail")}: ${s}`)}finally{t&&(t.disabled=!1)}}function Bn(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 Lt(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 Et(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),a=Te.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${a}${Je(t)}`,`${o("sessions.restartConfirmCli")}${a}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
2
- `)}function an(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo}async function Rt(){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 Dn(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 m=r[1]??"";return{start:s-m.length-1,end:s,query:m}}function Bt(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 Dt(e,t){let s=t.trim().toLocaleLowerCase();return s?e.filter(a=>a.botName.toLocaleLowerCase().includes(s)||a.larkAppId.toLocaleLowerCase().includes(s)):[...e]}function $t(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)),m=Math.max(r,Math.min(s,e.length)),f=e.slice(0,r),l=e.slice(m),g=f&&!/\s$/u.test(f)?" ":"",w=l&&!/^\s/u.test(l)?" ":"",I=`${g}${a.join(" ")}${w}`;return{text:f+I+l,caret:f.length+I.length}}function $s(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 Pt(e,t,s,a){let r=$s(e,t),m=s.map((f,l)=>a(l));return s.forEach((f,l)=>{let g=r.indexOf(f);g<0||f===m[l]||(r=r.slice(0,g)+m[l]+r.slice(g+f.length))}),{text:r,markers:m}}var M=Ee(Qn(),1);var Ot=["backlog","todo","in_progress","in_review","done"];function Ht(e){return typeof e=="string"&&Ot.includes(e)?e:null}function Kt(e){if(e.status==="closed")return"done";let t=Ht(e.kanbanColumn);return t||(e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"?"in_review":e.status==="starting"||e.status==="working"||e.status==="analyzing"||e.status==="active"?"in_progress":"todo")}var Ps=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 Ps-t}function $n(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var v=Ee(en(),1),_t=[{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"}],Pn=50;function Ft(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function Os(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function Hs(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 Ks(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 Oe(e){return{__html:e}}function rn(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function _s(e){return de(e.title)||e.sessionId}function Xt(e){let t=[],s=new Map;for(let m of e){let f=String(m.chatId??m.sessionId),l=s.get(f);l||(l={chatId:f,rows:[]},s.set(f,l),t.push(l)),l.rows.push(m)}let a=[];return{clusters:t.map(m=>(a.push(...m.rows),m.rows.length<2?{type:"card",row:m.rows[0]}:{type:"cluster",chatId:m.chatId,rows:m.rows})),flat:a}}function Ut(e){let t=new Map(_t.map(a=>[a.id,[]]));for(let a of e)t.get(Kt(a)).push(a);return{columns:_t.map(a=>{let r=(t.get(a.id)??[]).sort((g,w)=>De(g)-De(w)),m=0;a.id==="done"&&r.length>Pn&&(m=r.length-Pn,r=r.slice(0,Pn));let{clusters:f,flat:l}=Xt(r);return t.set(a.id,l),{id:a.id,labelKey:a.labelKey,rows:r,clusters:f,hiddenCount:m}}),groups:t}}function Fs(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:re(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((m,f)=>Number(f.lastMessageAt??0)-Number(m.lastMessageAt??0)),{clusters:r}=Xt(a);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:a,clusters:r}})}function On(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function Us(e){if(e.groupBy==="bot"){let a=e.rows.filter(r=>!rn(r));return{mode:"bot",columns:Fs(a),groups:new Map,rowById:On(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(T=>T.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(a??void 0),m=a?e.rows.filter(T=>r.has(String(T.chatId))):[],f=(e.teamBoardKey===a?.key?e.teamBoardData?.board:null)??{},l=(e.teamBoardKey===a?.key?e.teamBoardData?.remoteRows:null)??[],g=[...m,...l].map(T=>{let R=f[String(T.sessionId)];return R?{...T,kanbanColumn:R.column,kanbanPosition:R.position}:T}),{columns:w,groups:I}=Ut(g);return{mode:"flow",columns:w,groups:I,rowById:On(g),team:a,scope:{chats:r.size,sessions:g.length}}}let{columns:t,groups:s}=Ut(e.rows);return{mode:"flow",columns:t,groups:s,rowById:On(e.rows),team:null,scope:null}}function js(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 zs(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 jt(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 Ge(e){return(0,v.jsx)("button",{type:"button",className:`card-act kanban-card-act${e.className?` ${e.className}`:""}`,"data-action":e.action,"data-tip":e.label,"aria-label":e.label,onClick:t=>{t.stopPropagation(),e.onClick(t.currentTarget)},dangerouslySetInnerHTML:Oe(e.icon)})}function Js(e){let t=de(e.row.title)||"",[s,a]=(0,M.useState)(t),r=(0,M.useRef)(null),m=(0,M.useRef)(!1);(0,M.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let f=(0,M.useCallback)(l=>{if(m.current)return;m.current=!0;let g=s.trim();l&&g&&g!==t&&e.onCommit(e.row,g),e.onCancel()},[t,e,s]);return(0,v.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:l=>a(l.currentTarget.value),onClick:l=>l.stopPropagation(),onBlur:()=>f(!0),onKeyDown:l=>{l.stopPropagation(),l.key==="Enter"?(l.preventDefault(),f(!0)):l.key==="Escape"&&(l.preventDefault(),f(!1))}})}function zt(e){let{callbacks:t,row:s}=e,a=_s(s),r=re(s),m=Ae(s),f=Os(s.workingDir),l=Hs(s),g=[m,f!=="-"?f:null].filter(Boolean).join(" \xB7 "),w=String(s.status??"unknown"),I=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",T=e.editingId===s.sessionId,R=t.selectedSessionIds.has(String(s.sessionId)),D=["kanban-card",R?"selected":"",I?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),N=I?null:(0,v.jsxs)("span",{className:"kanban-card-actions-rail",children:[(0,v.jsx)(Ge,{action:"history",icon:t.icons.history,label:o("sessions.history.title"),onClick:()=>t.onHistory(s)}),s.webPort&&t.onOpenTerminal?(0,v.jsx)(Ge,{action:"terminal",icon:t.icons.terminal,label:o("sessions.openTerminal"),onClick:()=>t.onOpenTerminal?.(s)}):null,s.feishuChatLink?(0,v.jsx)("a",{className:"card-act kanban-card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener","data-tip":o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),onClick:L=>L.stopPropagation(),dangerouslySetInnerHTML:Oe(t.icons.feishu)}):null,(0,v.jsx)(Ge,{action:"lock",className:s.locked?"locked":"",icon:s.locked?t.icons.unlock:t.icons.lock,label:t.lockActionLabel(s),onClick:L=>t.onToggleLock(s,L)}),(0,v.jsx)(Ge,{action:"details",icon:t.icons.details,label:o("sessions.details"),onClick:()=>t.onDetails(s)}),t.canRestartSession(s)?(0,v.jsx)(Ge,{action:"restart",icon:t.icons.restart,label:o("sessions.restart"),onClick:L=>t.onRestart(s,L)}):null]});return(0,v.jsxs)("article",{className:D,"data-id":s.sessionId,tabIndex:0,role:"button","aria-pressed":R,draggable:!0,onClick:L=>e.onCardClick(s,L),onKeyDown:L=>e.onCardKeyDown(s,L),onDragStart:L=>e.onDragStartCard(s,L),children:[(0,v.jsxs)("div",{className:"kanban-card-top",children:[(0,v.jsx)("span",{className:`badge cli-${Ft(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,v.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,v.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,I?(0,v.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:I}),children:I}):null,N]}),(0,v.jsx)("div",{className:"kanban-card-title-row",children:T?(0,v.jsx)(Js,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,v.jsx)("p",{className:"kanban-card-title",title:String(s.title??a),onDoubleClick:L=>{L.stopPropagation(),e.cancelOpen(),I||e.onBeginEdit(s)},children:String(a).slice(0,140)})}),g||l?(0,v.jsxs)("div",{className:"kanban-card-meta-row",children:[g?(0,v.jsx)("p",{className:"kanban-card-desc",title:g,children:g}):(0,v.jsx)("span",{className:"kanban-card-desc kanban-card-desc-empty","aria-hidden":"true"}),l?(0,v.jsx)("span",{className:"session-signal",title:l,children:l}):null]}):null,(0,v.jsxs)("div",{className:"kanban-card-foot",children:[(0,v.jsx)("span",{className:"kanban-card-owner",dangerouslySetInnerHTML:Oe(`${Me({name:r,larkAppId:s.larkAppId,size:"sm"})}<span>${dt(r)}</span>`)}),(0,v.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:Ne(s.lastMessageAt)}),(0,v.jsx)("span",{className:"kanban-card-dot","data-status":Ft(w),title:t.sessionStatusText(w)})]})]})]})}function Jt(e){let t=e.item;if(t.type==="card")return(0,v.jsx)(zt,{...e.cardProps,row:t.row});let s=Ae(t.rows[0])??t.chatId,a=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,v.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${a?" dragging":""}`,"data-chat":t.chatId,children:[(0,v.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,v.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:Oe(Qe({chatId:t.chatId,name:s,size:"sm"}))}),(0,v.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,v.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,v.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,v.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,v.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,v.jsx)(zt,{...e.cardProps,row:r},r.sessionId)):null]})}function Gt(e){let[t,s]=(0,M.useState)(e),[a,r]=(0,M.useState)(null),[m,f]=(0,M.useState)(null),[l,g]=(0,M.useState)(null),[w,I]=(0,M.useState)(null),[T,R]=(0,M.useState)(()=>new Set),D=(0,M.useRef)(null),N=(0,M.useRef)(null),L=(0,M.useRef)(null),F=(0,M.useRef)(new Map),V=(0,M.useRef)(new Map),ne=(0,M.useRef)(m),q=!!a||!!m,j=(0,M.useCallback)(()=>{L.current!==null&&(clearTimeout(L.current),L.current=null)},[]),ae=(0,M.useCallback)(S=>{N.current=js(e.host),s(S)},[e.host]);(0,M.useEffect)(()=>{if(q){D.current=e;return}ae(e)},[ae,q,e]),(0,M.useEffect)(()=>{if(q||!D.current)return;let S=D.current;D.current=null,ae(S)},[ae,q]),(0,M.useLayoutEffect)(()=>{zs(e.host,N.current),N.current=null},[t,e.host]),(0,M.useEffect)(()=>{ne.current=m},[m]),(0,M.useEffect)(()=>()=>j(),[j]);let K=(0,M.useMemo)(()=>Us(t),[t]);(0,M.useLayoutEffect)(()=>{F.current=K.groups,V.current=K.rowById},[K]),(0,M.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,M.useEffect)(()=>{t.groupBy==="team"&&K.mode==="flow"&&K.team&&t.onNeedTeamBoard(K.team)},[t,K]),(0,M.useEffect)(()=>{t.onTeamScope(K.mode==="flow"?K.scope:null)},[t,K]);let le=(0,M.useCallback)(()=>{f(null),g(null),I(null)},[]),$=(0,M.useCallback)(S=>{R(C=>{let P=new Set(C);return P.has(S)?P.delete(S):P.add(S),P})},[]),ke=(0,M.useCallback)(S=>{j(),!rn(S)&&r(S.sessionId)},[j]),Y=(0,M.useCallback)((S,C)=>{rn(S)||C.target.closest("a, button, input, label")||(j(),L.current=setTimeout(()=>{L.current=null,t.onToggleSelect(S)},220))},[j,t]),we=(0,M.useCallback)((S,C)=>{C.key!=="Enter"&&C.key!==" "||C.target!==C.currentTarget||rn(S)||(C.preventDefault(),t.onToggleSelect(S))},[t]),ce=(0,M.useCallback)((S,C)=>{t.groupBy!=="bot"&&(j(),f({kind:"card",id:String(S.sessionId)}),C.dataTransfer&&(C.dataTransfer.effectAllowed="move",C.dataTransfer.setData("text/plain",String(S.sessionId))))},[j,t.groupBy]),ie=(0,M.useCallback)((S,C,P)=>{t.groupBy!=="bot"&&(j(),f({kind:"cluster",chatId:S,col:C}),P.dataTransfer&&(P.dataTransfer.effectAllowed="move",P.dataTransfer.setData("text/plain",`cluster:${S}`)))},[j,t.groupBy]),U=(0,M.useCallback)((S,C)=>{!ne.current||t.groupBy==="bot"||(C.preventDefault(),C.dataTransfer&&(C.dataTransfer.dropEffect="move"),g(S),I(jt(C.currentTarget,C.clientY)?.dataset.id??null))},[t.groupBy]),Ce=(0,M.useCallback)((S,C)=>{let P=ne.current;if(!P||t.groupBy==="bot")return;C.preventDefault();let te=jt(C.currentTarget,C.clientY);le();let Q=F.current,se=S;if(P.kind==="cluster"){let p=(Q.get(P.col)??[]).filter(_=>String(_.chatId)===P.chatId).filter(_=>!(_.status==="closed"&&se!=="done"));if(!p.length)return;let x=new Set(p.map(_=>_.sessionId)),A=(Q.get(se)??[]).filter(_=>!x.has(_.sessionId)),E=te?A.findIndex(_=>_.sessionId===te.dataset.id):A.length;E<0&&(E=A.length);let O=E>0?A[E-1]:null,pe=E<A.length?A[E]:null,W=$n(O?De(O):null,pe?De(pe):null);t.onMoveRows(p.map((_,Le)=>({row:_,column:se,position:W+Le*.001})));return}let J=V.current.get(P.id);if(!J||J.status==="closed"&&se!=="done")return;let z=(Q.get(se)??[]).filter(p=>p.sessionId!==P.id),oe=te?z.findIndex(p=>p.sessionId===te.dataset.id):z.length;oe<0&&(oe=z.length);let Se=oe>0?z[oe-1]:null,$e=oe<z.length?z[oe]:null,He=$n(Se?De(Se):null,$e?De($e):null);t.onMoveRows([{row:J,column:se,position:He}])},[le,t]),fe={dragId:m?.kind==="card"?m.id:null,dropBeforeId:w,editingId:a,groupBy:t.groupBy,callbacks:t,cancelOpen:j,onBeginEdit:ke,onCardClick:Y,onCardKeyDown:we,onDragStartCard:ce,onEditDone:()=>r(null)};return K.mode==="loading"?(0,v.jsx)(Be,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):K.mode==="bot"?K.columns.length?(0,v.jsx)(v.Fragment,{children:K.columns.map(S=>(0,v.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":S.key,children:[(0,v.jsxs)("header",{children:[(0,v.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:Oe(Me({name:S.name,larkAppId:S.larkAppId,size:"sm"}))}),(0,v.jsx)("h2",{children:S.name}),(0,v.jsx)("span",{className:"kanban-col-count",children:S.rows.length})]}),(0,v.jsx)("div",{className:"kanban-col-list",onDragOver:C=>U(S.key,C),onDragEnd:le,children:S.clusters.map(C=>(0,v.jsx)(Jt,{item:C,dragCluster:m?.kind==="cluster"?m:null,cardProps:fe,expanded:C.type==="cluster"&&T.has(`bot:${S.key}:${C.chatId}`),onToggleExpanded:()=>{C.type==="cluster"&&$(`bot:${S.key}:${C.chatId}`)},onDragStartCluster:ie},C.type==="card"?C.row.sessionId:C.chatId))})]},S.key))}):(0,v.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,v.jsx)(v.Fragment,{children:K.columns.map(S=>(0,v.jsxs)("section",{className:`kanban-column kanban-${S.id}${l===S.id?" drag-over":""}`,"data-col":S.id,onDragOver:C=>U(S.id,C),onDrop:C=>Ce(S.id,C),onDragEnd:le,children:[(0,v.jsxs)("header",{children:[(0,v.jsx)("span",{className:"kanban-col-icon",dangerouslySetInnerHTML:Oe(Ks(S.id))}),(0,v.jsx)("h2",{children:o(S.labelKey)}),(0,v.jsx)("span",{className:"kanban-col-count",children:S.rows.length+S.hiddenCount})]}),(0,v.jsxs)("div",{className:"kanban-col-list",children:[S.rows.length?S.clusters.map(C=>(0,v.jsx)(Jt,{item:C,columnId:S.id,dragCluster:m?.kind==="cluster"?m:null,cardProps:fe,expanded:C.type==="cluster"&&T.has(`${S.id}:${C.chatId}`),onToggleExpanded:()=>{C.type==="cluster"&&$(`${S.id}:${C.chatId}`)},onDragStartCluster:ie},C.type==="card"?C.row.sessionId:C.chatId)):(0,v.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),S.hiddenCount?(0,v.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:S.hiddenCount})}):null]})]},S.id))})}var n=Ee(en(),1),Xs=new Set(["image/png","image/jpeg","image/gif","image/webp"]),Vt=8,Gs=10*1024*1024,Vs=25*1024*1024;function Ws(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 qs(e){return e===168?"7d":`${e}H`}var Ys=In.map(e=>({value:String(e),label:qs(e)}));function ge(e){return{__html:e}}function ee(){return typeof window>"u"?void 0:window.localStorage}function ln(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${An(t)}`,children:Je(t)})}function _n(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,"data-tip":e.label,"aria-label":e.label,disabled:e.disabled,onClick:s=>{s.stopPropagation(),e.onClick(s.currentTarget)},dangerouslySetInnerHTML:ge(e.icon)})}function Yt(e){if(!e.url||!Pe())return null;let t=!sn();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","data-tip":o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:ge(H.terminal)}):(0,n.jsx)("button",{type:"button",className:"term-btn term-write","data-action":"write-link","data-tip":o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>{s.stopPropagation(),At(e.row,s.currentTarget)},dangerouslySetInnerHTML:ge(H.terminal)})})}function Qt(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","data-tip":o("sessions.openChat"),"aria-label":o("sessions.openChat"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:ge(H.feishu)})}function Qs(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 Wt(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?nn(e.tokenUsage?.in)??-1:t==="tokenOut"?nn(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?xe(e).toLowerCase():String(e[t]??"").toLowerCase()}function qt(e,t,s,a){let r=Wt(e,s),m=Wt(t,s),f=0;return typeof r=="number"&&typeof m=="number"?f=r-m:typeof r=="boolean"&&typeof m=="boolean"?f=Number(r)-Number(m):f=String(r).localeCompare(String(m)),f===0&&(f=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),a==="asc"?f:-f}function Zs(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 eo(e,t,s){let a=s==="needs-you"?Ze(e):Number(e.lastMessageAt??0),r=s==="needs-you"?Ze(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 no(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 to(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 Fn(e,t){(0,u.useEffect)(()=>{let s=e.current;if(s)if(t){if(!s.open)try{s.showModal()}catch{}}else s.open&&s.close()},[t,e])}function Hn(e){let[t,s]=(0,u.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 so(e){let[t,s]=(0,u.useState)(0),[a,r]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:a||t>0,onClick:async()=>{r(!0);let m=await e.locateSession(e.row);r(!1),m&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):a?o("sessions.locating"):o("sessions.locate")})}function oo(e){let[t,s]=(0,u.useState)(0),[a,r]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[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 m=await e.onLocate(e.row);r(!1),m&&s(30)}})}function ao(e){let t=me.filter(l=>e.selected.has(l)).length,s=(0,u.useRef)(null),[a,r]=(0,u.useState)("");(0,u.useEffect)(()=>{let l=()=>{s.current?.open&&(s.current.open=!1)},g=I=>{let T=s.current;T?.open&&!T.contains(I.target)&&l()},w=I=>{I.key==="Escape"&&l()};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",w),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",w)}},[]);let m=a.trim().toLowerCase(),f=m?me.filter(l=>l.toLowerCase().includes(m)):me;return(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===me.length?void 0:"cli-filter-active",children:t===me.length?o("common.all"):`${t}/${me.length}`})]}),(0,n.jsxs)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:[(0,n.jsxs)("div",{className:"filter-cli-head",children:[(0,n.jsx)("input",{type:"search",className:"filter-cli-search",placeholder:o("sessions.cliSearch"),value:a,autoFocus:!0,onChange:l=>r(l.currentTarget.value),onClick:l=>l.stopPropagation()}),(0,n.jsxs)("div",{className:"filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of me)e.selected.has(l)||e.onToggle(l,!0)},children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of me)e.selected.has(l)&&e.onToggle(l,!1)},children:o("sessions.cliClear")})]})]}),(0,n.jsx)("div",{className:"filter-cli-options",children:f.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):f.map(l=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:l,checked:e.selected.has(l),onChange:g=>e.onToggle(l,g.currentTarget.checked)}),(0,n.jsx)("span",{children:l})]},l))})]})]})}function io(e){let t=[{value:"",label:o("sessions.anyStatus")},...It.map(l=>({value:l,label:Je(l)}))],s=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],a=t.find(l=>l.value===e.filters.status)?.label??o("sessions.anyStatus"),r=s.find(l=>l.value===e.filters.adopt)?.label??o("sessions.adoptAny"),m=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],f=m.find(l=>l.value===e.filters.chat)?.label??o("sessions.chatAny");return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters",onSubmit:l=>l.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:l=>{let g=l.currentTarget.value;e.setFilters(w=>({...w,q:g}))}}),(0,n.jsx)(ze,{label:a,value:e.filters.status,options:t,onChange:l=>e.setFilters(g=>({...g,status:l}))}),(0,n.jsx)(ze,{label:r,value:e.filters.adopt,options:s,onChange:l=>e.setFilters(g=>({...g,adopt:l}))}),(0,n.jsx)(ze,{ariaLabel:o("sessions.location"),className:"filter-chat-menu",label:f,value:e.filters.chat,options:m,searchable:!0,searchPlaceholder:o("sessions.chatSearch"),searchEmptyLabel:o("sessions.chatNoMatch"),onChange:l=>e.setFilters(g=>({...g,chat:l}))}),(0,n.jsx)(ao,{selected:e.filters.cli,onToggle:(l,g)=>{e.setFilters(w=>{let I=new Set(w.cli);return g?I.add(l):I.delete(l),{...w,cli:I}})}}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"multiBotTopics",checked:e.filters.multiBotTopics,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(w=>({...w,multiBotTopics:g}))}}),(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:l=>{let g=l.currentTarget.checked;e.setFilters(w=>({...w,botTriggeredTopics:g}))}}),(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:l=>{let g=l.currentTarget.checked;at(ee(),g),e.setFilters(w=>({...w,showUnknownChats:g}))}}),(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:l=>{let g=l.currentTarget.checked;e.setFilters(w=>({...w,active:g}))}}),(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)(lo,{...e.idleCleanup})]})}function ro(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"),r=Pe();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})}),r?(0,n.jsx)("button",{type:"button",id:"bulk-monitor-room",disabled:t||e.selectedCount===0,onClick:e.onAddToMonitorRoom,children:e.monitorRoomText??o("sessions.addToMonitorRoom")}):null,(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 lo(e){let[t,s]=(0,u.useState)(!1),[a,r]=(0,u.useState)(e.hours),[m,f]=(0,u.useState)(),l=(0,u.useRef)(null),g=(0,u.useRef)(null),w=(0,u.useRef)(null),I=e.countForHours(a);return(0,u.useEffect)(()=>{t?r(e.hours):f(void 0)},[t,e.hours]),(0,u.useLayoutEffect)(()=>{if(!t)return;let T=()=>{let D=g.current,N=w.current;if(!D||!N)return;let L=12,F=window.innerWidth,V=window.innerHeight,ne=Math.max(0,Math.min(292,F-L*2)),q=D.getBoundingClientRect(),j=N.offsetHeight,ae=Math.max(L,F-ne-L),K=q.left+q.width/2-ne/2,le=Math.min(Math.max(K,L),ae),$=q.bottom+8,ke=q.top-j-8,Y=$+j<=V-L||ke<L?Math.min(Math.max($,L),Math.max(L,V-j-L)):Math.max(L,ke);f({left:le,top:Y,width:ne})},R=window.requestAnimationFrame(T);return window.addEventListener("resize",T),window.addEventListener("scroll",T,!0),()=>{window.cancelAnimationFrame(R),window.removeEventListener("resize",T),window.removeEventListener("scroll",T,!0)}},[t,e.busy,e.status]),(0,u.useEffect)(()=>{if(!t)return;let T=D=>{let N=D.target;N instanceof Node&&l.current?.contains(N)||N instanceof Node&&w.current?.contains(N)||s(!1)},R=D=>{D.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",T,!0),document.addEventListener("keydown",R),()=>{document.removeEventListener("pointerdown",T,!0),document.removeEventListener("keydown",R)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${I===0?" is-empty":""}${t?" is-open":""}`,ref:l,children:[(0,n.jsxs)("button",{ref:g,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(T=>!T),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,Kn.createPortal)((0,n.jsxs)("div",{ref:w,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:m??{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:I})]})]}),(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:Ys.map(T=>{let R=Tn(T.value),D=R===a;return(0,n.jsx)("button",{type:"button",className:D?"active":void 0,"aria-pressed":D?"true":"false",disabled:e.busy,onClick:()=>r(R),children:T.label},T.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||I===0,onClick:()=>{e.onRun(a).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function co(e){let t=(0,u.useRef)(null);(0,u.useLayoutEffect)(()=>{t.current&&(t.current.indeterminate=e.selectAllIndeterminate)},[e.selectAllIndeterminate]);let s=[{id:"botName",label:o("sessions.bot")},{id:"cliId",label:o("sessions.cli")},{id:"status",label:o("sessions.status")},{id:"chat",label:o("sessions.location")},{id:"tokenIn",label:o("sessions.tokenIn")},{id:"tokenOut",label:o("sessions.tokenOut")},{id:"title",label:o("sessions.titleCol")},{id:"workingDir",label:o("sessions.workingDir")},{id:"spawnedAt",label:o("sessions.created")},{id:"lastMessageAt",label:o("sessions.last")},{id:"adopt",label:o("sessions.adopt")}],a=s.filter(l=>!e.hiddenColumns.has(l.id)),r=2+a.length,m={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")};function f(l,g){switch(g){case"botName":return(0,n.jsx)("td",{"data-label":m.botName,children:re(l)});case"cliId":return(0,n.jsx)("td",{"data-label":m.cliId,children:(0,n.jsx)("span",{className:`badge cli-${An(l.cliId)}`,children:l.cliId??"unknown"})});case"status":return(0,n.jsxs)("td",{"data-label":m.status,children:[(0,n.jsx)(ln,{status:l.status}),(0,n.jsx)(_n,{row:l})]});case"chat":return(0,n.jsx)("td",{className:"session-location-cell","data-label":m.chat,title:En(l),children:xe(l)});case"tokenIn":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenIn,children:Nn(l.tokenUsage?.in)});case"tokenOut":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenOut,children:Nn(l.tokenUsage?.out)});case"title":return(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":m.title,title:String(l.title??""),children:de(l.title??"").slice(0,48)});case"workingDir":return(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":m.workingDir,title:l.workingDir??"",children:String(l.workingDir??"").slice(-34)});case"spawnedAt":return(0,n.jsx)("td",{"data-label":m.spawnedAt,children:Ne(l.spawnedAt)});case"lastMessageAt":return(0,n.jsx)("td",{"data-label":m.lastMessageAt,children:Ne(l.lastMessageAt)});case"adopt":return(0,n.jsx)("td",{"data-label":m.adopt,children:l.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null});default:return null}}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:l=>e.onSelectAll(l.currentTarget.checked)})}),a.map(l=>(0,n.jsx)(Qs,{sort:l.id,label:l.label,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},l.id)),(0,n.jsx)("th",{className:"session-table-columns-th",children:(0,n.jsxs)("details",{className:"session-table-columns-menu",children:[(0,n.jsxs)("summary",{title:o("sessions.columns"),children:[(0,n.jsx)("span",{className:"session-table-columns-icon","aria-hidden":"true",children:(0,n.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,n.jsx)("path",{d:"M2 4h12M2 8h12M2 12h12"})})}),o("sessions.columns")]}),(0,n.jsxs)("div",{className:"session-table-columns-dropdown",role:"menu",children:[(0,n.jsxs)("div",{className:"session-table-columns-header",children:[(0,n.jsx)("span",{children:o("sessions.columnsMenu")}),(0,n.jsx)("button",{type:"button",className:"session-table-columns-reset",onClick:e.onResetColumns,children:o("sessions.columnsReset")})]}),s.map(l=>(0,n.jsxs)("label",{className:"session-table-columns-item",children:[(0,n.jsx)("input",{type:"checkbox",checked:!e.hiddenColumns.has(l.id),onChange:()=>e.onToggleColumn(l.id)}),l.label]},l.id))]})]})})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(l=>{let g=l.status==="closed",w=String(l.sessionId);return(0,n.jsxs)("tr",{"data-id":w,onClick:()=>e.onOpen(l),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":m.select,onClick:I=>I.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(w),disabled:g,onChange:I=>e.onSelect(w,I.currentTarget.checked)})}),a.map(I=>(0,n.jsx)(u.Fragment,{children:f(l,I.id)},I.id)),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":m.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},w)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:r,className:"empty",children:o("sessions.empty")})})})]})}function Zt(e){let t=e.row,s=de(t.title)||t.sessionId,a=re(t),r=Ae(t),m=Xe(t),f=Zs(t),l=xn(t.workingDir),g=w=>{w.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:g,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:ge(Me({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)(ln,{status:t.status}),(0,n.jsx)(_n,{row:t})]})]}),l!=="-"||t.adopt||f?(0,n.jsxs)("div",{className:"session-card-meta",children:[l!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:l}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,f?(0,n.jsx)("span",{className:"session-signal",title:f,children:f}):null]}):null,(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${Ne(Ze(t))}`:`${o("sessions.last")}: ${Ne(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(Qt,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(oo,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(ye,{action:"details",icon:H.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),an(t)?(0,n.jsx)(ye,{action:"restart",icon:H.restart,label:o("sessions.restart"),onClick:w=>e.onRestart(t,w)}):null,(0,n.jsx)(Yt,{row:t,url:m}),t.status!=="closed"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(ye,{action:"lock",icon:t.locked?H.unlock:H.lock,label:on(t),kind:t.locked?"locked":"",onClick:w=>e.onLock(t,!t.locked,w)}),(0,n.jsx)(ye,{action:"close",icon:H.close,label:o("sessions.close"),kind:"danger",onClick:w=>e.onClose(t,w)})]}):null]})]})}function uo(e){(0,u.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(Mn.map(a=>[a.id,[]]));for(let a of e.rows){let r=Lt(a);r&&t.get(r).push(a)}let s=e.order.map(a=>Mn.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 m=(t.get(a.id)??[]).sort((f,l)=>eo(f,l,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:f=>{e.dragColId&&(f.preventDefault(),f.dataTransfer&&(f.dataTransfer.dropEffect="move"),e.dragColId!==a.id&&e.onDragOverCol(a.id))},onDrop:f=>{e.dragColId&&(f.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:f=>{e.onDragCol(a.id),f.dataTransfer&&(f.dataTransfer.effectAllowed="move",f.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:m.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:m.length?m.map(f=>(0,n.jsx)(Zt,{row:f,selected:e.selected.has(f.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},f.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},a.id)})})}function mo(e){let t=de(e.title).trim();return t||(e.kind==="thread"?o("sessions.topic.untitled"):e.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession"))}function go(e){let t=(0,u.useMemo)(()=>tn(e.rows),[e.rows]),s=(0,u.useMemo)(()=>new Map(tn(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,m=a.rows[0],f=xe(m),l=mo(r),g=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:ge(Qe({chatId:a.chatId,name:f,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-topic-heading",children:[(0,n.jsx)("span",{className:"session-topic-location",children:f}),(0,n.jsx)("h2",{title:r.title,children:l}),(0,n.jsx)("code",{title:g,children:r.kind==="thread"?g: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"),": ",Ne(r.latestActivityAt)]})]})]}),(0,n.jsx)("div",{className:"session-topic-members",children:a.rows.map(w=>(0,n.jsx)(Zt,{row:w,selected:e.selected.has(w.sessionId),onToggleSelect:I=>{I.status!=="closed"?e.onToggleSelect(I):e.onOpen(I)},onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},w.sessionId))})]},a.key)}):(0,n.jsx)("div",{className:"sessions-topic-empty",children:o("sessions.topic.empty")})})}function fo(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"),m=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:ge(Me({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:no(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:m})]})]})}function po(e){let t=(0,u.useRef)(null);Fn(t,!!e.state);let s=e.state?Re.sessions.get(e.state.sessionId):null,a=(0,u.useRef)(null),r=!!e.state&&!e.state.loading&&!e.state.error&&e.state.messages.length>0;return(0,u.useEffect)(()=>{if(!r)return;let m=a.current;m&&(m.scrollTop=m.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: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:ge(Me({name:re(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(de(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)(Be,{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((m,f,l)=>(0,n.jsx)(fo,{message:m,ownerOpenId:e.state?.ownerOpenId,groupStart:f===0||Bn(l[f-1])!==Bn(m)},m.messageId??f))}):null]})]}):null})}function bo(e){let[t,s]=(0,u.useState)(!1),[a,r]=(0,u.useState)(""),m=(0,u.useRef)(null),f=de(e.row.title)||e.row.sessionId;(0,u.useLayoutEffect)(()=>{if(!t||!m.current)return;let g=m.current;g.focus(),g.select(),(()=>{let I=getComputedStyle(g),T=document.createElement("span");T.style.cssText="position:absolute;visibility:hidden;white-space:pre",T.style.fontSize=I.fontSize,T.style.fontFamily=I.fontFamily,T.style.fontWeight=I.fontWeight,T.style.letterSpacing=I.letterSpacing,T.textContent=g.value||" ",document.body.appendChild(T);let R=Math.round(window.innerWidth*.6);g.style.width=`${Math.min(Math.max(T.offsetWidth+22,80),R)}px`,T.remove()})()},[t,a]);let l=g=>{let w=a.trim();s(!1),g&&w&&w!==f&&e.onRename(e.row,w)};return t?(0,n.jsx)("input",{ref:m,type:"text",className:"term-modal-name-input",maxLength:200,value:a,onChange:g=>r(g.currentTarget.value),onBlur:()=>l(!0),onKeyDown:g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),l(!0)):g.key==="Escape"&&(g.preventDefault(),l(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??f),children:String(f).slice(0,60)}),(0,n.jsx)(ye,{id:"term-modal-edit",icon:H.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(de(e.row.title)||""),s(!0)}})]})}function ho(e){let t=(0,u.useRef)(null);Fn(t,!!e.state);let s=e.state?Re.sessions.get(e.state.sessionId):null,a=s?Xe(s):null,r=e.state?.url??a??"",m=s?String(s.cliId??"unknown"):"",f=s?xn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:l=>{l.target===l.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:ge(Me({name:re(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)(bo,{row:s,onRename:e.onRename}),(0,n.jsx)(ln,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:re(s)}),(0,n.jsx)("span",{children:m}),f!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:f}):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:ge(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:ge(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)(Be,{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 yo(e){let t=e.report;if(!t||t.status!=="ok"){let g=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",g]})}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:[],m=Array.isArray(t.spans)?t.spans:[],f=g=>g==="bad"||g==="warn"?"!":"i",l=g=>g==="error"?"!":g==="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((g,w)=>(0,n.jsxs)("li",{children:[f(String(g.severity??""))," ",(0,n.jsx)("b",{children:String(g.title??"")})," - ",String(g.action??""),Array.isArray(g.evidence)&&g.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:g.evidence.join("; ")})]}):null]},w))})]}):null,m.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",m.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??m.length),total:String(t.meta.spansTotal??m.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:[...m].sort((g,w)=>(g.relStartMs??0)-(w.relStartMs??0)).map((g,w)=>{let I=[g.inputSummary,g.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:g.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:l(String(g.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(g.tool??"")})}),(0,n.jsx)("td",{children:String(g.phase??"")}),(0,n.jsx)("td",{children:to(g.durationMs)}),(0,n.jsxs)("td",{children:["#",String(g.turnIndex??0)]}),(0,n.jsx)("td",{children:I})]},w)})})})})]}):null]})}function ko(e){let[t,s]=(0,u.useState)(null);if((0,u.useEffect)(()=>s(null),[e.row.sessionId]),!Te.authed)return null;let a=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),m=await r.json().catch(()=>({}));!m.ok||!m.report?s({loading:!1,error:String(m.error??r.status)}):s({loading:!1,report:m.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)(Be,{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)(yo,{report:t.report}):null]})]})}function wo(e){let t=(0,u.useRef)(null);Fn(t,!!e.row);let s=e.row,a=s?Xe(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:de(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)(ln,{status:s.status}),(0,n.jsx)(_n,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(Hn,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",re(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"),":"]})," ",xe(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(Hn,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(Hn,{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)(Qt,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(so,{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)(Yt,{row:s,url:a}),sn()&&s.status!=="closed"?(0,n.jsx)("button",{id:"copy-cmd-btn",type:"button","data-tip":o("sessions.copyCommandHint"),onClick:r=>{xt(s,r.currentTarget)},children:o("sessions.copyCommand")}):null,an(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,(0,n.jsx)("button",{id:"lock-btn",type:"button",onClick:r=>{e.setSessionLocked(s,!s.locked,r.currentTarget)},children:on(s)}),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)(ko,{row:s})]})]}):null})}function Co(e){let t=e.state;(0,u.useEffect)(()=>{let p=e.dialog;return()=>{p.open&&p.close()}},[e.dialog]),(0,u.useEffect)(()=>{let p=e.dialog;if(t){if(!p.open)try{p.showModal()}catch{}}else p.open&&p.close()},[e.dialog,t]),(0,u.useEffect)(()=>{let p=e.dialog,x=()=>e.onClose(),A=E=>{E.target===p&&e.onClose()};return p.addEventListener("close",x),p.addEventListener("click",A),()=>{p.removeEventListener("close",x),p.removeEventListener("click",A)}},[e]);let[s,a]=(0,u.useState)(""),[r,m]=(0,u.useState)([]),[f,l]=(0,u.useState)(new Set),[g,w]=(0,u.useState)("lead"),[I,T]=(0,u.useState)(""),[R,D]=(0,u.useState)("in_progress"),[N,L]=(0,u.useState)(""),[F,V]=(0,u.useState)(""),[ne,q]=(0,u.useState)(!1),[j,ae]=(0,u.useState)(!1),[K,le]=(0,u.useState)(""),[$,ke]=(0,u.useState)(()=>it(ee())),[Y,we]=(0,u.useState)(null),[ce,ie]=(0,u.useState)(null),[U,Ce]=(0,u.useState)(0),fe=(0,u.useRef)(null),S=(0,u.useRef)(1);if((0,u.useEffect)(()=>{t&&(a(""),m([]),l(new Set),w("lead"),T(""),D("in_progress"),L(""),V(""),q(!1),ae(!1),le(""),we(null),ie(null),Ce(0),S.current=1)},[t]),!t)return null;if(t.success){let p=t.success,x=typeof p.shareLink=="string"&&p.shareLink?p.shareLink:"",A=Array.isArray(p.failed)?p.failed.length:0,E=Array.isArray(p.spawned)?p.spawned.length:0,O=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:[O,"\uFF08",E,"\uFF09"]}),A>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(A)})}):null,x?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:x,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)(Be,{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 C=t.bots,P=[...f],te=P,Q=p=>C.find(x=>x.larkAppId===p)?.botName??p,se=K.trim().toLowerCase(),J=se?C.filter(p=>p.botName.toLowerCase().includes(se)||p.larkAppId.toLowerCase().includes(se)):C,z=ce?Dt(C,ce.query).slice(0,8):[],oe=p=>{if(!ce)return;let x=Bt(s,ce,p.botName);a(x.text),ie(null),Ce(0),l(A=>new Set(A).add(p.larkAppId)),T(A=>A||p.larkAppId),requestAnimationFrame(()=>{let A=fe.current;A&&(A.focus(),A.setSelectionRange(x.caret,x.caret))})},Se=p=>{if(!(!ce||z.length===0)){if(p.key==="ArrowDown"||p.key==="ArrowUp"){p.preventDefault();let x=p.key==="ArrowDown"?1:-1;Ce(A=>(A+x+z.length)%z.length);return}if(p.key==="Enter"||p.key==="Tab"){p.preventDefault(),oe(z[Math.min(U,z.length-1)]);return}p.key==="Escape"&&(p.preventDefault(),ie(null))}},$e=async p=>{let x=[...p.clipboardData.files].filter(W=>W.type.startsWith("image/"));if(x.length===0)return;p.preventDefault();let A=p.currentTarget.selectionStart??s.length,E=p.currentTarget.selectionEnd??A,O=x.filter(W=>Xs.has(W.type.toLowerCase()));if(O.length!==x.length){alert(o("sessions.create.imageUnsupported"));return}if(r.length+O.length>Vt){alert(o("sessions.create.imageCountLimit",{n:String(Vt)}));return}if(O.some(W=>W.size>Gs)){alert(o("sessions.create.imageSizeLimit"));return}if(r.reduce((W,_)=>W+_.size,0)+O.reduce((W,_)=>W+_.size,0)>Vs){alert(o("sessions.create.imageTotalLimit"));return}try{let W=S.current,_=await Promise.all(O.map(async(Z,Ke)=>{let ve=await Ws(Z),_e=ve.indexOf(",");if(_e<0)throw new Error("bad_image_data");let he=W+Ke;return{id:`${Date.now()}-${Ke}-${Math.random().toString(36).slice(2)}`,ordinal:he,marker:`[${o("sessions.create.imageMarker",{n:String(he)})}]`,name:Z.name||`pasted-image-${r.length+Ke+1}`,mimeType:Z.type.toLowerCase(),size:Z.size,dataBase64:ve.slice(_e+1),previewUrl:ve}}));S.current+=_.length;let Le=$t(s,A,E,_.map(Z=>Z.marker));a(Le.text),m(Z=>[...Z,..._]),ie(null),requestAnimationFrame(()=>{let Z=fe.current;Z&&(Z.focus(),Z.setSelectionRange(Le.caret,Le.caret))})}catch{alert(o("sessions.create.imageReadFailed"))}},He=async p=>{p.preventDefault();let x=s.trim();if(!x){alert(o("sessions.create.errContent"));return}if(P.length===0){alert(o("sessions.create.errNoBot"));return}let A=I||P[0]||"";if(g==="lead"&&(!A||!P.includes(A))){alert(o("sessions.create.errLead"));return}ae(!0),we(null);try{let E=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:x,larkAppIds:P,mode:g,column:R,leadLarkAppId:g==="lead"?A:void 0,name:N.trim()||void 0,bindWorkingDir:F.trim()||void 0,images:r.map(pe=>({name:pe.name,mimeType:pe.mimeType,dataBase64:pe.dataBase64}))})}),O=await E.json().catch(()=>null);E.ok&&O?.ok?$?(we(O),a(""),m([]),S.current=1,L("")):e.onSuccess(O):E.status!==401&&alert(`${o("sessions.create.failed")}: ${O?.error??E.status}`)}catch(E){alert(`${o("sessions.create.failed")}: ${E}`)}finally{ae(!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:He,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:fe,name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),"aria-describedby":"cs-content-help",required:!0,value:s,onChange:p=>{let x=p.currentTarget,A=x.value;a(A),ie(Dn(A,x.selectionStart??A.length)),Ce(0)},onClick:p=>ie(Dn(s,p.currentTarget.selectionStart??s.length)),onKeyDown:Se,onPaste:p=>{$e(p)},onBlur:()=>setTimeout(()=>ie(null),0)}),ce?(0,n.jsx)("div",{className:"cs-mention-menu",role:"listbox","aria-label":o("sessions.create.mentionBots"),children:z.length?z.map((p,x)=>(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":x===U,className:x===U?"active":void 0,onMouseDown:A=>A.preventDefault(),onClick:()=>oe(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 x=r.filter(E=>E.id!==p.id),A=Pt(s,p.marker,x.map(E=>E.marker),E=>`[${o("sessions.create.imageMarker",{n:String(E+1)})}]`);a(A.text),m(x.map((E,O)=>({...E,ordinal:O+1,marker:A.markers[O]}))),S.current=x.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")}),C.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:K,onChange:p=>le(p.currentTarget.value)}),J.length?(0,n.jsx)("div",{className:"cs-bot-list",children:J.map(p=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:p.larkAppId,checked:f.has(p.larkAppId),onChange:x=>{let A=x.currentTarget.checked;l(E=>{let O=new Set(E);return A?O.add(p.larkAppId):O.delete(p.larkAppId),O.has(I)||T(O.values().next().value??""),O})}})," ",(0,n.jsx)("span",{children:p.botName})]},p.larkAppId))}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBotMatch")}),P.length?(0,n.jsx)("small",{children:o("sessions.create.selectedCount",{n:String(P.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:g==="lead",onChange:()=>w("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:g==="all",onChange:()=>w("all")})," ",o("sessions.create.modeAll")]}),(0,n.jsx)("small",{children:o("sessions.create.modeHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-lead-row",hidden:g!=="lead",children:[(0,n.jsx)("legend",{children:o("sessions.create.lead")}),(0,n.jsx)("select",{name:"lead",disabled:te.length===0,value:te.includes(I)?I:"",onChange:p=>T(p.currentTarget.value),children:te.length?te.map(p=>(0,n.jsx)("option",{value:p,children:Q(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:R==="in_progress",onChange:()=>D("in_progress")})," ",o("sessions.create.columnInProgress")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"backlog",checked:R==="backlog",onChange:()=>D("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${ne?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":ne,"aria-controls":"cs-advanced-fields",onClick:()=>q(p=>!p),children:o("sessions.create.optionalConfig")})}),ne?(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:N,onChange:p=>L(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:F,onChange:p=>V(p.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),Y?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[Y.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(Y.failed)&&Y.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(Y.failed.length)})}`:""]}),typeof Y.shareLink=="string"&&Y.shareLink?(0,n.jsx)("a",{href:Y.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:$,onChange:p=>{let x=p.currentTarget.checked;ke(x),rt(ee(),x)}}),(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:j||C.length===0,children:j?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function So(){pt();let e=ft(i=>[...i.sessions.values()]),[t,s]=(0,u.useState)(0),a=(0,u.useCallback)(()=>s(i=>i+1),[]),[r,m]=(0,u.useState)({q:"",status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:tt(ee()),active:!0,cli:new Set(me)}),[f,l]=(0,u.useState)(new Set),[g,w]=(0,u.useState)("lastMessageAt"),[I,T]=(0,u.useState)("desc"),[R,D]=(0,u.useState)(()=>new Set(Zn(ee()))),[N,L]=(0,u.useState)(()=>nt(ee())),[F,V]=(0,u.useState)(()=>st(ee())),[ne,q]=(0,u.useState)(!1),[j,ae]=(0,u.useState)(null),[K,le]=(0,u.useState)(null),[$,ke]=(0,u.useState)(()=>lt(ee())),Y=`${N}:${N==="kanban"?$:"-"}`,we=(0,u.useRef)(!0),[ce,ie]=(0,u.useState)(0),[U,Ce]=(0,u.useState)([]),[fe,S]=(0,u.useState)(null),[C,P]=(0,u.useState)(!1),te=(0,u.useRef)(!1),[Q,se]=(0,u.useState)(()=>{try{return window.localStorage.getItem(Sn)??""}catch{return""}}),[J,z]=(0,u.useState)({data:null,key:"",fetchedAt:0}),oe=(0,u.useRef)(!1),Se=(0,u.useRef)(new Set),[$e,He]=(0,u.useState)(""),[p,x]=(0,u.useState)(null),[A,E]=(0,u.useState)(null),[O,pe]=(0,u.useState)(null),[W,_]=(0,u.useState)(!1),[Le,Z]=(0,u.useState)(24),[Ke,ve]=(0,u.useState)(""),[_e,he]=(0,u.useState)(null),[es,Fe]=(0,u.useState)(null),[ns,cn]=(0,u.useState)(null),[ts,ss]=(0,u.useState)(null),[dn,os]=(0,u.useState)(null),[as,Ve]=(0,u.useState)(null),[is,un]=(0,u.useState)(!1),Ue=(0,u.useRef)(0);(0,u.useLayoutEffect)(()=>{if(we.current){we.current=!1;return}ie(i=>i+1)},[Y]),(0,u.useEffect)(()=>{os(document.getElementById("create-session-modal"))},[]),(0,u.useEffect)(()=>{ut().then(a)},[a]);let mn=(0,u.useMemo)(()=>{let i=new Map;for(let d of e){let c=String(d.chatId??"").trim();if(!c||!r.showUnknownChats&&Ln(d))continue;let b=xe(d),h=i.get(c);(!h||b<h)&&i.set(c,b)}return[...i.entries()].sort((d,c)=>d[1].localeCompare(c[1])).map(([d,c])=>({value:d,label:c}))},[r.showUnknownChats,t,e]);(0,u.useEffect)(()=>{r.chat&&(mn.some(i=>i.value===r.chat)||m(i=>({...i,chat:""})))},[mn,r.chat]);let be=(0,u.useMemo)(()=>{let i=r.q.toLowerCase(),d=[...r.cli],c=d.length>0&&d.length<me.length,b=N==="kanban",h=r.multiBotTopics||r.botTriggeredTopics?new Set(tn(e).filter(y=>!r.multiBotTopics||y.multiBot).filter(y=>!r.botTriggeredTopics||y.inferredBotTriggered).map(y=>y.key)):null,k=e.filter(y=>!c||d.includes(y.cliId??"unknown")).filter(y=>r.showUnknownChats||!Ln(y)).filter(y=>!r.status||y.status===r.status).filter(y=>!r.adopt||r.adopt==="yes"==!!y.adopt).filter(y=>!r.chat||String(y.chatId??"")===r.chat).filter(y=>!r.active||b||y.status!=="closed").filter(y=>!i||Nt(y).includes(i));return h?k.filter(y=>h.has(Rn(y))).sort((y,B)=>qt(y,B,g,I)):k.sort((y,B)=>qt(y,B,g,I))},[r,t,I,g,e,N]),gn=(0,u.useMemo)(()=>Tt(e),[e]),Ie=(0,u.useMemo)(()=>new Map(e.map(i=>[i.sessionId,i])),[e,t]),Un=(0,u.useMemo)(()=>be.filter(i=>i.status!=="closed"),[be]),je=(N==="table"||N==="topics"?be:Un).filter(i=>i.status!=="closed"),jn=[...f].map(i=>Ie.get(i)).filter(i=>!!i&&i.status!=="closed"),zn=je.length>0&&je.every(i=>f.has(i.sessionId)),rs=je.some(i=>f.has(i.sessionId))&&!zn;(0,u.useEffect)(()=>{l(i=>{let d=!1,c=new Set;for(let b of i){let h=Ie.get(b);h&&h.status!=="closed"?c.add(b):d=!0}return d?c:i})},[Ie]);let fn=(0,u.useCallback)(i=>{let d=new Set;if(!i)return d;for(let c of i.groupChats)d.add(c);if(fe)for(let[c,b]of fe){if(d.has(c))continue;let h=!1;for(let k of i.botIds)if(b.botIds.has(k)){h=!0;break}if(h){for(let k of b.observedNames)if(i.botNames.has(k)){d.add(c);break}}}return d},[fe]),Jn=(0,u.useMemo)(()=>{if(N==="kanban"&&$==="team"){let i=U.find(c=>c.key===Q)??U[0],d=fn(i);return be.filter(c=>d.has(String(c.chatId)))}return be},[$,Q,U,be,fn,N]),pn=(0,u.useCallback)(i=>wt(Jn,i),[Jn]),bn=(0,u.useCallback)(async()=>{if(!(te.current||C)){te.current=!0;try{let[i,d,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)&&S(new Map(c.chats.map(k=>[String(k.chatId),{botIds:new Set((k.memberBots??[]).filter(y=>y.inChat).map(y=>String(y.larkAppId))),observedNames:new Set((k.observedBotNames??[]).map(y=>String(y)))}])));let b=k=>({ids:new Set(k.map(y=>String(y.larkAppId))),names:new Set(k.map(y=>String(y.name??"")).filter(Boolean))}),h=[];for(let k of i?.teams??[]){let{ids:y,names:B}=b(k.bots??[]);h.push({key:`local:${k.teamId}`,label:k.isDefault?o("team.myHostedTeam"):String(k.name??k.teamId),botIds:y,botNames:B,groupChats:new Set((k.groupChatIds??[]).map(X=>String(X)))})}for(let k of d?.memberships??[]){let{ids:y,names:B}=b(k.roster?.bots??[]);h.push({key:`${k.hubUrl}::${k.teamId}`,label:String(k.teamName??k.teamId??k.hubUrl),botIds:y,botNames:B,groupChats:new Set})}Ce(h),se(k=>h.length&&!h.some(y=>y.key===k)?h[0].key:k)}finally{P(!0),te.current=!1}}},[C]),Xn=(0,u.useCallback)(async(i,d,c,b,h)=>{try{let y=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:d,column:c,position:b})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:i,sessionId:d,column:c,position:b})}),B=await y.json().catch(()=>({}));(!y.ok||B?.ok===!1)&&(z(X=>{if(!X.data||X.key!==i)return X;let G={...X.data.board};return h?G[d]=h:delete G[d],{...X,data:{...X.data,board:G}}}),y.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${B?.error??y.status}`))}catch(k){z(y=>{if(!y.data||y.key!==i)return y;let B={...y.data.board};return h?B[d]=h:delete B[d],{...y,data:{...y.data,board:B}}}),alert(`${o("sessions.kanban.moveFail")}: ${k}`)}},[]),ls=(0,u.useCallback)(async i=>{let d=J.key===i.key&&Date.now()-J.fetchedAt<3e4;if(!(oe.current||d)){oe.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)}`,h=await fetch(b),k=await h.json().catch(()=>({}));if(!h.ok||k?.ok===!1)return;let y=typeof k.deploymentId=="string"?k.deploymentId:null,B=[];for(let X of Array.isArray(k.reports)?k.reports:[])if(!(y&&X.deploymentId===y))for(let G of Array.isArray(X.sessions)?X.sessions:[])B.push({...G,remoteDeployment:X.deploymentName||X.deploymentId});z({key:i.key,fetchedAt:Date.now(),data:{board:k.board&&typeof k.board=="object"?k.board:{},remoteRows:B}})}finally{oe.current=!1}}},[J.fetchedAt,J.key]);(0,u.useEffect)(()=>{N==="kanban"&&$==="team"&&!C&&bn()},[$,C,bn,N]),(0,u.useEffect)(()=>{let i=window.setInterval(()=>{N==="kanban"&&$==="team"&&(z(d=>({...d,fetchedAt:0})),a())},3e4);return()=>window.clearInterval(i)},[$,a,N]);let Gn=(0,u.useCallback)(async(i,d,c,b)=>{try{let h=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:d,position:c})}),k=await h.json().catch(()=>({}));(!h.ok||k?.ok===!1)&&(i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),h.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${k?.error??h.status}`))}catch(h){i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),alert(`${o("sessions.kanban.moveFail")}: ${h}`)}},[a]),cs=(0,u.useCallback)(i=>{let d=!1;for(let c of i){let b=String(c.row.sessionId);if(!b||c.row.status==="closed"&&c.column!=="done")continue;if($==="team"){let y=U.find(G=>G.key===Q)??U[0];if(!y)continue;let X=(J.key===y.key&&J.data?J.data.board:{})[b];z(G=>{let Yn=G.key===y.key&&G.data?G.data:{board:{},remoteRows:G.data?.remoteRows??[]},Ns={...Yn.board,[b]:{column:c.column,position:c.position}};return{...G,key:y.key,data:{...Yn,board:Ns}}}),Xn(y.key,b,c.column,c.position,X),d=!0;continue}let h=Re.sessions.get(b);if(!h)continue;let k={column:h.kanbanColumn,position:h.kanbanPosition};h.kanbanColumn=c.column,h.kanbanPosition=c.position,Gn(h,c.column,c.position,k),d=!0}d&&a()},[$,Q,U,J,Gn,Xn,a]),Vn=(0,u.useCallback)(async(i,d)=>{let c=i.title;i.title=d,a();try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:d})}),h=await b.json().catch(()=>({}));(!b.ok||h?.ok===!1)&&(i.title=c,a(),b.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${h?.error??b.status}`))}catch(b){i.title=c,a(),alert(`${o("sessions.kanban.renameFail")}: ${b}`)}},[a]),hn=(0,u.useCallback)(async i=>{try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/locate`,{method:"POST"}),c=await d.json();return c.ok?!0:(alert(`Locate failed: ${c.error??d.status}`),!1)}catch(d){return alert(`Locate error: ${d}`),!1}},[]),yn=(0,u.useCallback)(async(i,d)=>{if(!confirm(o("sessions.closeConfirm")))return!1;d&&(d.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):(l(h=>{let k=new Set(h);return k.delete(i.sessionId),k}),a(),!0)}catch(c){return alert(`Close error: ${c}`),!1}finally{d&&(d.disabled=!1)}},[a]),We=(0,u.useCallback)(async(i,d,c)=>{let b=!!i.locked;if(b===d)return!0;i.locked=d,a(),c&&(c.disabled=!0);try{let h=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:d})}),k=await h.json().catch(()=>({}));return!h.ok||k?.ok===!1?(i.locked=b,a(),h.status!==401&&alert(`${o("sessions.lockFailed")}: ${k?.error??h.status}`),!1):(i.locked=!!k.locked,a(),!0)}catch(h){return i.locked=b,a(),alert(`${o("sessions.lockFailed")}: ${h}`),!1}finally{c&&(c.disabled=!1)}},[a]),qe=(0,u.useCallback)(async(i,d)=>{if(Se.current.has(i.sessionId)||!confirm(Et(i)))return!1;d&&(d.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):(Se.current.add(i.sessionId),window.setTimeout(()=>Se.current.delete(i.sessionId),5e3),!0)}catch(c){return alert(`${o("sessions.restartFailed")}: ${c}`),!1}finally{d&&(d.disabled=!1)}},[]),ds=(0,u.useCallback)(async(i,d)=>{d&&(d.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{d&&(d.disabled=!1)}},[]),us=(0,u.useCallback)(async(i,d)=>{d&&(d.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{d&&(d.disabled=!1)}},[]),Ye=(0,u.useCallback)(i=>{Fe({sessionId:i.sessionId,loading:!0,messages:[]}),(async()=>{try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/history?limit=80`),c=await d.json().catch(()=>({}));if(!d.ok||c?.ok===!1){let h=String(c?.error??d.status),k=h==="not_found_yet"||h==="not_found";Fe(y=>y?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:h,stale:k}:y);return}let b=Array.isArray(c.messages)?c.messages:[];Fe(h=>h?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:b,ownerOpenId:c.ownerOpenId}:h)}catch(d){Fe(c=>c?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:String(d)}:c)}})()},[]),ms=(0,u.useCallback)(i=>{if(!Pe())return;let d=Xe(i);if(!d){he(i.sessionId);return}cn({sessionId:i.sessionId,url:d,loading:!0}),(async()=>{let c=d;if(sn())try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/write-link`),h=await b.json().catch(()=>({}));b.ok&&h?.ok!==!1&&h?.url&&(c=h.url)}catch{}cn(b=>b?.sessionId===i.sessionId?{sessionId:i.sessionId,url:c,loading:!1}:b)})()},[]),gs=(0,u.useCallback)(async()=>{let i=[...f];if(i.length===0||!confirm(o("sessions.closeBulkConfirm",{count:i.length})))return;x({done:0,total:i.length});let d=0,c=0,b=[...i];async function h(){for(;b.length;){let k=b.shift();try{let y=await fetch(`/api/sessions/${encodeURIComponent(k)}/close`,{method:"POST"}),B=await y.json().catch(()=>({}));(!y.ok||B?.ok===!1)&&(c+=1)}catch{c+=1}finally{d+=1,x({done:d,total:i.length})}}}await Promise.all(Array.from({length:Math.min(6,i.length)},()=>h())),x(null),l(new Set),a(),c>0&&alert(`Failed: ${c}/${i.length}`)},[a,f]),fs=(0,u.useCallback)(async i=>{let d=[...f].map(y=>Ie.get(y)).filter(y=>!!y&&y.status!=="closed"&&!!y.locked!==i);if(d.length===0)return;E({locked:i,done:0,total:d.length});let c=0,b=0,h=[...d];async function k(){for(;h.length;){let y=h.shift(),B=!!y.locked;try{let X=await fetch(`/api/sessions/${encodeURIComponent(y.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:i})}),G=await X.json().catch(()=>({}));!X.ok||G?.ok===!1?(b+=1,y.locked=B):y.locked=!!G.locked}catch{b+=1,y.locked=B}finally{c+=1,E({locked:i,done:c,total:d.length})}}}await Promise.all(Array.from({length:Math.min(6,d.length)},()=>k())),E(null),a(),b>0&&alert(`${o("sessions.lockFailed")}: ${b}/${d.length}`)},[a,Ie,f]),ps=(0,u.useCallback)(()=>{let i=[...f].filter(c=>!!Ie.get(c));if(i.length===0)return;let d=yt(i);pe(o("sessions.monitorRoomAdded",{added:d.added,total:d.total})),window.setTimeout(()=>pe(null),1800)},[Ie,f]),bs=(0,u.useCallback)(async i=>{let d=Tn(i);if(!d)return;let c=pn(d);if(c.length!==0){Z(d),_(!0),ve(o("sessions.idleCleanupRunning"));try{let b=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:d,sessionIds:c.map(k=>k.sessionId)})}),h=await b.json().catch(()=>({}));if(!b.ok){b.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${h?.error??b.status}`),ve("");return}l(k=>{let y=new Set(k);for(let B of h?.results??[])B?.ok&&B?.sessionId&&y.delete(String(B.sessionId));return y}),ve(o("sessions.idleCleanupDone",{closed:Number(h?.closed??0),failed:Number(h?.failed??0)})),a()}catch(b){alert(`${o("sessions.idleCleanupFailed")}: ${b}`),ve("")}finally{_(!1)}}},[pn,a]),hs=i=>{let d=et(i)??"board";d!==N&&(L(d),ot(ee(),d))},ys=(i,d)=>{V(c=>{let b=c.indexOf(i),h=b+d;if(b<0||h<0||h>=c.length)return c;let k=[...c];return k.splice(b,1),k.splice(h,0,i),Cn(ee(),k),k})},ks=(i,d)=>{i!==d&&V(c=>{let b=c.indexOf(i),h=c.indexOf(d);if(b<0||h<0)return c;let k=[...c];return k.splice(b,1),k.splice(h,0,i),Cn(ee(),k),k})},ws=(0,u.useMemo)(()=>({rows:be,groupBy:$,teams:U,teamsLoaded:C,teamKey:Q,teamBoardData:J.data,teamBoardKey:J.key}),[$,Q,U,C,be,J.data,J.key]),Cs=_e?Ie.get(_e)??null:null,kn=(0,u.useMemo)(()=>C?U.length?U.map(i=>({value:i.key,label:i.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[U,C]),Ss=!C||U.length===0,Wn=U.some(i=>i.key===Q)?Q:kn[0]?.value??"",vs=kn.find(i=>i.value===Wn)?.label??o("sessions.kanban.groupTeam"),Is=(0,u.useCallback)(()=>{Ue.current+=1,un(!1),Ve(null)},[]),qn=(0,u.useCallback)(async()=>{let i=Ue.current+1;Ue.current=i,Ve({bots:[],loading:!0}),un(!0);try{let d=await Rt();if(Ue.current!==i)return;Ve({bots:d})}finally{Ue.current===i&&un(!1)}},[]),Ts=(0,u.useCallback)(async()=>{let i=window.prompt(o("sessions.debugTerminalPrompt"),"");if(i===null)return;let d=i.trim(),c=window.open("about:blank","_blank");c&&(c.opener=null);try{let b=await fetch("/api/debug-terminal",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(d?{workingDir:d}:{})}),h=await b.json().catch(()=>({}));if(!b.ok||h?.ok===!1||!h?.url){c?.close(),b.status!==401&&alert(`${o("sessions.debugTerminalFail")}: ${h?.error??b.status}`);return}c?c.location.href=h.url:window.open(h.url,"_blank","noopener")}catch(b){c?.close(),alert(`${o("sessions.debugTerminalFail")}: ${b}`)}},[]);return(0,u.useEffect)(()=>{let i=()=>{bt()&&Te.authed&&qn()};return i(),window.addEventListener(vn,i),()=>window.removeEventListener(vn,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,d])=>(0,n.jsx)("button",{type:"button","data-view":i,className:N===i?"active":void 0,"aria-pressed":N===i,onClick:()=>hs(i),children:d},i))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${N==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":N!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([i,d])=>(0,n.jsx)("button",{type:"button","data-groupby":i,className:$===i?"active":void 0,"aria-pressed":$===i,onClick:()=>{ke(i),ct(ee(),i)},children:d},i))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(N==="kanban"&&$==="team"&&C),children:$e}),(0,n.jsx)(ze,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(N==="kanban"&&$==="team"),disabled:Ss,label:vs,value:Wn,options:kn,onChange:i=>{if(U.some(d=>d.key===i)){se(i);try{window.localStorage.setItem(Sn,i)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[Pe()?(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=kt()},children:o("sessions.monitorRoom")}):null,Te.authed?(0,n.jsx)("button",{type:"button",className:"debug-terminal-btn",title:o("sessions.debugTerminalHint"),onClick:()=>{Ts()},children:o("sessions.debugTerminal")}):null,Te.authed?(0,n.jsx)(gt,{className:"page-primary-action create-session-btn",disabled:is,onClick:()=>{qn()},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:gn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:gn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:gn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(io,{chatOptions:mn,filters:r,setFilters:m,idleCleanup:{busy:W,hours:Le,status:Ke,countForHours:i=>pn(i).length,onRun:bs}}),(0,n.jsx)(ro,{selectedCount:f.size,lockDisabled:!jn.some(i=>!i.locked),unlockDisabled:!jn.some(i=>!!i.locked),closeProgress:p,lockProgress:A,monitorRoomText:O,onClear:()=>l(new Set),onClose:()=>{gs()},onAddToMonitorRoom:ps,onLock:i=>{fs(i)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${ce>0?" sessions-view-stage-enter":""}`,"data-view":N,"data-kanban-group":$,children:[(0,n.jsx)(co,{rows:be,selected:f,hidden:N!=="table",sortKey:g,sortDir:I,selectAllChecked:zn,selectAllIndeterminate:rs,selectAllDisabled:je.length===0,hiddenColumns:R,onToggleColumn:i=>{let d=!R.has(i),c=new Set(R);d?c.add(i):c.delete(i),wn(ee(),Array.from(c)),D(c),d&&i===g&&(w("lastMessageAt"),T("desc"))},onResetColumns:()=>{D(new Set),wn(ee(),[])},onOpen:i=>he(i.sessionId),onSelect:(i,d)=>l(c=>{let b=new Set(c);return d?b.add(i):b.delete(i),b}),onSelectAll:i=>l(d=>{let c=new Set(d);for(let b of je)i?c.add(b.sessionId):c.delete(b.sessionId);return c}),onSort:i=>{g===i?T(I==="asc"?"desc":"asc"):(w(i),T(i==="spawnedAt"||i==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(uo,{rows:Un,selected:f,hidden:N!=="board",order:F,animated:ne,dragColId:j,dragOverCol:K,onAnimated:()=>q(!0),onMoveColumn:ys,onMoveColumnTo:ks,onDragCol:ae,onDragOverCol:le,onToggleSelect:i=>l(d=>{let c=new Set(d);return c.has(i.sessionId)?c.delete(i.sessionId):c.add(i.sessionId),c}),onOpen:i=>he(i.sessionId),onHistory:Ye,onLocate:i=>hn(i),onRestart:(i,d)=>{qe(i,d)},onLock:(i,d,c)=>{We(i,d,c)},onClose:(i,d)=>{yn(i,d)}}),(0,n.jsx)(go,{rows:be,relationRows:e,selected:f,hidden:N!=="topics",onToggleSelect:i=>l(d=>{let c=new Set(d);return c.has(i.sessionId)?c.delete(i.sessionId):c.add(i.sessionId),c}),onOpen:i=>he(i.sessionId),onHistory:Ye,onLocate:i=>hn(i),onRestart:(i,d)=>{qe(i,d)},onLock:(i,d,c)=>{We(i,d,c)},onClose:(i,d)=>{yn(i,d)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:ss,className:`sessions-kanban${$==="bot"?" kanban-mode-bot":""}`,hidden:N!=="kanban",children:N==="kanban"?(0,n.jsx)(Gt,{host:ts,...ws,canRestartSession:an,getTeamChatIds:fn,icons:{details:H.details,feishu:H.feishu,history:H.history,lock:H.lock,restart:H.restart,terminal:H.terminal,unlock:H.unlock},lockActionLabel:on,sessionStatusText:Je,onDetails:i=>he(String(i.sessionId)),onHistory:Ye,onMoveRows:cs,onNeedTeamBoard:i=>{ls(i)},onNeedTeams:()=>{bn()},onOpenTerminal:Pe()?ms:void 0,onRename:(i,d)=>{let c=Re.sessions.get(String(i.sessionId));c&&Vn(c,d)},onRestart:(i,d)=>{let c=Re.sessions.get(String(i.sessionId));c&&qe(c,d)},onTeamScope:i=>He(i?o("sessions.kanban.teamScope",{chats:i.chats,sessions:i.sessions}):""),onToggleLock:(i,d)=>{let c=Re.sessions.get(String(i.sessionId));c&&We(c,!c.locked,d)},onToggleSelect:i=>l(d=>{let c=String(i.sessionId),b=new Set(d);return b.has(c)?b.delete(c):b.add(c),b}),selectedSessionIds:f}):null})]},ce),(0,n.jsx)(wo,{row:Cs,onClose:()=>he(null),locateSession:hn,openHistory:Ye,resumeSession:ds,restartSession:qe,closeSession:yn,setSessionLocked:We,startSession:us}),(0,n.jsx)(ho,{state:ns,onClose:()=>cn(null),onRename:Vn}),(0,n.jsx)(po,{state:es,onClose:()=>Fe(null)}),dn?(0,Kn.createPortal)((0,n.jsx)(Co,{dialog:dn,state:as,onClose:Is,onSuccess:i=>Ve(d=>d&&{...d,success:i})}),dn):null]})}function ta(e){return mt(e,(0,n.jsx)(So,{}))}export{ao as CliFilterGroup,go as TopicGroupsView,ta as renderSessionsPage};
1
+ import{a as ht,c as yt,h as kt}from"./chunk-DFLNXQNT.js";import{a as vn,c as bt,f as Oe}from"./chunk-AGCPF6MT.js";import{a as ft,c as pt}from"./chunk-FLGXZJTD.js";import{c as Be,g as gt,p as ze}from"./chunk-QFMH6ITB.js";import{A as Qe,C as ut,E as re,F as Ae,G as de,I as Ze,a as Re,f as Zn,g as wn,h as et,i as nt,j as tt,k as st,l as Cn,m as ot,n as at,o as it,p as rt,q as Sn,r as lt,s as ct,t as Te,u as o,v as dt,w as Ne,y as Me}from"./chunk-KQB42ML5.js";import{a as mt}from"./chunk-SYC6D5XU.js";import{a as Qn,b as Ms,d as en}from"./chunk-5THX4DI2.js";import{c as Le}from"./chunk-7SZRL6FY.js";var u=Le(Qn(),1),Kn=Le(Ms(),1);var In=[24,72,168],As=new Set(In);function Tn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!As.has(t)?null:t}function Es(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function xs(e,t=Date.now()){return t-e*60*60*1e3}function Ls(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let a=Es(e.lastMessageAt);return a!==null&&a<xs(t,s)}function wt(e,t,s=Date.now()){return e.filter(a=>Ls(a,t,s))}var Ct={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"},Ao=new Set(Object.values(Ct)),Rs={"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"},St=Object.values(Ct).map(e=>({id:e,label:Rs[e]??e}));function nn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Nn(e){let t=nn(e);return t===null?"-":t.toLocaleString("en-US")}var me=[...St.map(e=>e.id),"unknown"],Mn=[{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 An(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var It=["starting","working","idle","dormant","analyzing","active","limited","closed"];function Je(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function Tt(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 En(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function vt(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Bs(e){let t=o("sessions.directChat"),s=String(e?.chatDisplayName??"").trim()||String(e?.chatId??"").trim()||o("sessions.chatUnknown"),a=re(e);return`${t} \xB7 ${s} - ${a}`}function Ee(e){let t=String(e?.chatId??"").trim();if(e?.chatType==="p2p")return Bs(e);let s=Ae(e),a=e?.chatType==="p2p"?(()=>{let r=String(e?.botName??"").trim();return r?` \xB7 ${r}`:""})():"";return s?`${vt(e)} \xB7 ${s}${a}`:t?`${vt(e)} \xB7 ${t}${a}`:o("sessions.chatUnknown")}function xn(e,t=Ae){return!!String(e?.chatId??"").trim()&&!t(e)}function Ln(e){let t=Ee(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function Nt(e){return`${JSON.stringify(e)} ${Ee(e)} ${Ln(e)}`.toLowerCase()}function ue(e){return typeof e=="string"?e.trim():""}function Mt(e){let t=ue(e?.chatId),s=ue(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function Rn(e){let t=ue(e?.chatId),s=ue(e?.rootMessageId),a=Mt(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(ue(e?.sessionId)||"unknown")}`}function Ds(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=ue(a?.title);if(r)return r}return t}function tn(e){let t=new Map;for(let a of e){let r=Rn(a),m=t.get(r);m?m.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let m=[...r].sort((U,V)=>Number(V.lastMessageAt??0)-Number(U.lastMessageAt??0)),f=m[0]??{},l=Mt(f),g=ue(f.chatId),w=l==="thread"?ue(f.rootMessageId):"",I=new Set(m.map(U=>ue(U.larkAppId)||ue(U.botName)).filter(Boolean)),T=Math.max(1,I.size),R=m.filter(U=>U.status!=="closed").length,D=m.filter(U=>U.lastInputFromBot===!0).length,N=m.reduce((U,V)=>Math.max(U,Number(V.lastMessageAt??0)),0),x=w||g||ue(f.sessionId)||a;s.push({key:a,kind:l,chatId:g,...w?{rootMessageId:w}:{},title:Ds(m,x),rows:m,botCount:T,activeCount:R,closedCount:m.length-R,inferredBotInputCount:D,latestActivityAt:N,multiBot:I.size>1,inferredBotTriggered:D>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var Xe=ht;function sn(e=Te){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>',copy:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="5.5" y="5.5" width="7.5" height="7.5" rx="1.4"/><path d="M10.5 5.5V4.1a1.4 1.4 0 0 0-1.4-1.4H4.1a1.4 1.4 0 0 0-1.4 1.4v5a1.4 1.4 0 0 0 1.4 1.4h1.4"/></svg>'};function on(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function At(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)}}async function Et(e,t){t&&(t.disabled=!0);try{let s=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/spawn-command`),a=await s.json().catch(()=>({}));if(!s.ok||a?.ok===!1||!a?.command){s.status!==401&&alert(`${o("sessions.copyCommandFail")}: ${a?.error??s.status}`);return}try{if(await navigator.clipboard.writeText(a.command),t){let r=t.textContent;t.textContent=o("sessions.copyCommandDone"),setTimeout(()=>{r!==null&&(t.textContent=r)},1500)}}catch{window.prompt(o("sessions.copyCommand"),a.command)}}catch(s){alert(`${o("sessions.copyCommandFail")}: ${s}`)}finally{t&&(t.disabled=!1)}}function Bn(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 xt(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 Lt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),a=Te.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${a}${Je(t)}`,`${o("sessions.restartConfirmCli")}${a}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
2
+ `)}function an(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo}async function Rt(){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 Dn(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 m=r[1]??"";return{start:s-m.length-1,end:s,query:m}}function Bt(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 Dt(e,t){let s=t.trim().toLocaleLowerCase();return s?e.filter(a=>a.botName.toLocaleLowerCase().includes(s)||a.larkAppId.toLocaleLowerCase().includes(s)):[...e]}function $t(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)),m=Math.max(r,Math.min(s,e.length)),f=e.slice(0,r),l=e.slice(m),g=f&&!/\s$/u.test(f)?" ":"",w=l&&!/^\s/u.test(l)?" ":"",I=`${g}${a.join(" ")}${w}`;return{text:f+I+l,caret:f.length+I.length}}function $s(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 Ot(e,t,s,a){let r=$s(e,t),m=s.map((f,l)=>a(l));return s.forEach((f,l)=>{let g=r.indexOf(f);g<0||f===m[l]||(r=r.slice(0,g)+m[l]+r.slice(g+f.length))}),{text:r,markers:m}}var M=Le(Qn(),1);var Pt=["backlog","todo","in_progress","in_review","done"];function Ht(e){return typeof e=="string"&&Pt.includes(e)?e:null}function Kt(e){if(e.status==="closed")return"done";let t=Ht(e.kanbanColumn);return t||(e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"?"in_review":e.status==="starting"||e.status==="working"||e.status==="analyzing"||e.status==="active"?"in_progress":"todo")}var Os=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 Os-t}function $n(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var v=Le(en(),1),_t=[{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"}],On=50;function Ut(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function Ps(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function Hs(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 Ks(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 Pe(e){return{__html:e}}function rn(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function _s(e){return de(e.title)||e.sessionId}function Xt(e){let t=[],s=new Map;for(let m of e){let f=String(m.chatId??m.sessionId),l=s.get(f);l||(l={chatId:f,rows:[]},s.set(f,l),t.push(l)),l.rows.push(m)}let a=[];return{clusters:t.map(m=>(a.push(...m.rows),m.rows.length<2?{type:"card",row:m.rows[0]}:{type:"cluster",chatId:m.chatId,rows:m.rows})),flat:a}}function Ft(e){let t=new Map(_t.map(a=>[a.id,[]]));for(let a of e)t.get(Kt(a)).push(a);return{columns:_t.map(a=>{let r=(t.get(a.id)??[]).sort((g,w)=>De(g)-De(w)),m=0;a.id==="done"&&r.length>On&&(m=r.length-On,r=r.slice(0,On));let{clusters:f,flat:l}=Xt(r);return t.set(a.id,l),{id:a.id,labelKey:a.labelKey,rows:r,clusters:f,hiddenCount:m}}),groups:t}}function Us(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:re(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((m,f)=>Number(f.lastMessageAt??0)-Number(m.lastMessageAt??0)),{clusters:r}=Xt(a);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:a,clusters:r}})}function Pn(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function Fs(e){if(e.groupBy==="bot"){let a=e.rows.filter(r=>!rn(r));return{mode:"bot",columns:Us(a),groups:new Map,rowById:Pn(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(T=>T.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(a??void 0),m=a?e.rows.filter(T=>r.has(String(T.chatId))):[],f=(e.teamBoardKey===a?.key?e.teamBoardData?.board:null)??{},l=(e.teamBoardKey===a?.key?e.teamBoardData?.remoteRows:null)??[],g=[...m,...l].map(T=>{let R=f[String(T.sessionId)];return R?{...T,kanbanColumn:R.column,kanbanPosition:R.position}:T}),{columns:w,groups:I}=Ft(g);return{mode:"flow",columns:w,groups:I,rowById:Pn(g),team:a,scope:{chats:r.size,sessions:g.length}}}let{columns:t,groups:s}=Ft(e.rows);return{mode:"flow",columns:t,groups:s,rowById:Pn(e.rows),team:null,scope:null}}function js(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 zs(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 jt(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 Ge(e){return(0,v.jsx)("button",{type:"button",className:`card-act kanban-card-act${e.className?` ${e.className}`:""}`,"data-action":e.action,"data-tip":e.label,"aria-label":e.label,onClick:t=>{t.stopPropagation(),e.onClick(t.currentTarget)},dangerouslySetInnerHTML:Pe(e.icon)})}function Js(e){let t=de(e.row.title)||"",[s,a]=(0,M.useState)(t),r=(0,M.useRef)(null),m=(0,M.useRef)(!1);(0,M.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let f=(0,M.useCallback)(l=>{if(m.current)return;m.current=!0;let g=s.trim();l&&g&&g!==t&&e.onCommit(e.row,g),e.onCancel()},[t,e,s]);return(0,v.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:l=>a(l.currentTarget.value),onClick:l=>l.stopPropagation(),onBlur:()=>f(!0),onKeyDown:l=>{l.stopPropagation(),l.key==="Enter"?(l.preventDefault(),f(!0)):l.key==="Escape"&&(l.preventDefault(),f(!1))}})}function zt(e){let{callbacks:t,row:s}=e,a=_s(s),r=re(s),m=Ae(s),f=Ps(s.workingDir),l=Hs(s),g=[m,f!=="-"?f:null].filter(Boolean).join(" \xB7 "),w=String(s.status??"unknown"),I=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",T=e.editingId===s.sessionId,R=t.selectedSessionIds.has(String(s.sessionId)),D=["kanban-card",R?"selected":"",I?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),N=I?null:(0,v.jsxs)("span",{className:"kanban-card-actions-rail",children:[(0,v.jsx)(Ge,{action:"history",icon:t.icons.history,label:o("sessions.history.title"),onClick:()=>t.onHistory(s)}),s.webPort&&t.onOpenTerminal?(0,v.jsx)(Ge,{action:"terminal",icon:t.icons.terminal,label:o("sessions.openTerminal"),onClick:()=>t.onOpenTerminal?.(s)}):null,s.feishuChatLink?(0,v.jsx)("a",{className:"card-act kanban-card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener","data-tip":o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),onClick:x=>x.stopPropagation(),dangerouslySetInnerHTML:Pe(t.icons.feishu)}):null,(0,v.jsx)(Ge,{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,v.jsx)(Ge,{action:"details",icon:t.icons.details,label:o("sessions.details"),onClick:()=>t.onDetails(s)}),t.canRestartSession(s)?(0,v.jsx)(Ge,{action:"restart",icon:t.icons.restart,label:o("sessions.restart"),onClick:x=>t.onRestart(s,x)}):null]});return(0,v.jsxs)("article",{className:D,"data-id":s.sessionId,tabIndex:0,role:"button","aria-pressed":R,draggable:!0,onClick:x=>e.onCardClick(s,x),onKeyDown:x=>e.onCardKeyDown(s,x),onDragStart:x=>e.onDragStartCard(s,x),children:[(0,v.jsxs)("div",{className:"kanban-card-top",children:[(0,v.jsx)("span",{className:`badge cli-${Ut(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,v.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,v.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,I?(0,v.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:I}),children:I}):null,N]}),(0,v.jsx)("div",{className:"kanban-card-title-row",children:T?(0,v.jsx)(Js,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,v.jsx)("p",{className:"kanban-card-title",title:String(s.title??a),onDoubleClick:x=>{x.stopPropagation(),e.cancelOpen(),I||e.onBeginEdit(s)},children:String(a).slice(0,140)})}),g||l?(0,v.jsxs)("div",{className:"kanban-card-meta-row",children:[g?(0,v.jsx)("p",{className:"kanban-card-desc",title:g,children:g}):(0,v.jsx)("span",{className:"kanban-card-desc kanban-card-desc-empty","aria-hidden":"true"}),l?(0,v.jsx)("span",{className:"session-signal",title:l,children:l}):null]}):null,(0,v.jsxs)("div",{className:"kanban-card-foot",children:[(0,v.jsx)("span",{className:"kanban-card-owner",dangerouslySetInnerHTML:Pe(`${Me({name:r,larkAppId:s.larkAppId,size:"sm"})}<span>${dt(r)}</span>`)}),(0,v.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:Ne(s.lastMessageAt)}),(0,v.jsx)("span",{className:"kanban-card-dot","data-status":Ut(w),title:t.sessionStatusText(w)})]})]})]})}function Jt(e){let t=e.item;if(t.type==="card")return(0,v.jsx)(zt,{...e.cardProps,row:t.row});let s=Ae(t.rows[0])??t.chatId,a=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,v.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${a?" dragging":""}`,"data-chat":t.chatId,children:[(0,v.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,v.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:Pe(Qe({chatId:t.chatId,name:s,size:"sm"}))}),(0,v.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,v.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,v.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,v.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,v.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,v.jsx)(zt,{...e.cardProps,row:r},r.sessionId)):null]})}function Gt(e){let[t,s]=(0,M.useState)(e),[a,r]=(0,M.useState)(null),[m,f]=(0,M.useState)(null),[l,g]=(0,M.useState)(null),[w,I]=(0,M.useState)(null),[T,R]=(0,M.useState)(()=>new Set),D=(0,M.useRef)(null),N=(0,M.useRef)(null),x=(0,M.useRef)(null),U=(0,M.useRef)(new Map),V=(0,M.useRef)(new Map),ne=(0,M.useRef)(m),q=!!a||!!m,j=(0,M.useCallback)(()=>{x.current!==null&&(clearTimeout(x.current),x.current=null)},[]),ae=(0,M.useCallback)(S=>{N.current=js(e.host),s(S)},[e.host]);(0,M.useEffect)(()=>{if(q){D.current=e;return}ae(e)},[ae,q,e]),(0,M.useEffect)(()=>{if(q||!D.current)return;let S=D.current;D.current=null,ae(S)},[ae,q]),(0,M.useLayoutEffect)(()=>{zs(e.host,N.current),N.current=null},[t,e.host]),(0,M.useEffect)(()=>{ne.current=m},[m]),(0,M.useEffect)(()=>()=>j(),[j]);let K=(0,M.useMemo)(()=>Fs(t),[t]);(0,M.useLayoutEffect)(()=>{U.current=K.groups,V.current=K.rowById},[K]),(0,M.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,M.useEffect)(()=>{t.groupBy==="team"&&K.mode==="flow"&&K.team&&t.onNeedTeamBoard(K.team)},[t,K]),(0,M.useEffect)(()=>{t.onTeamScope(K.mode==="flow"?K.scope:null)},[t,K]);let le=(0,M.useCallback)(()=>{f(null),g(null),I(null)},[]),$=(0,M.useCallback)(S=>{R(C=>{let O=new Set(C);return O.has(S)?O.delete(S):O.add(S),O})},[]),ke=(0,M.useCallback)(S=>{j(),!rn(S)&&r(S.sessionId)},[j]),Y=(0,M.useCallback)((S,C)=>{rn(S)||C.target.closest("a, button, input, label")||(j(),x.current=setTimeout(()=>{x.current=null,t.onToggleSelect(S)},220))},[j,t]),we=(0,M.useCallback)((S,C)=>{C.key!=="Enter"&&C.key!==" "||C.target!==C.currentTarget||rn(S)||(C.preventDefault(),t.onToggleSelect(S))},[t]),ce=(0,M.useCallback)((S,C)=>{t.groupBy!=="bot"&&(j(),f({kind:"card",id:String(S.sessionId)}),C.dataTransfer&&(C.dataTransfer.effectAllowed="move",C.dataTransfer.setData("text/plain",String(S.sessionId))))},[j,t.groupBy]),ie=(0,M.useCallback)((S,C,O)=>{t.groupBy!=="bot"&&(j(),f({kind:"cluster",chatId:S,col:C}),O.dataTransfer&&(O.dataTransfer.effectAllowed="move",O.dataTransfer.setData("text/plain",`cluster:${S}`)))},[j,t.groupBy]),F=(0,M.useCallback)((S,C)=>{!ne.current||t.groupBy==="bot"||(C.preventDefault(),C.dataTransfer&&(C.dataTransfer.dropEffect="move"),g(S),I(jt(C.currentTarget,C.clientY)?.dataset.id??null))},[t.groupBy]),Ce=(0,M.useCallback)((S,C)=>{let O=ne.current;if(!O||t.groupBy==="bot")return;C.preventDefault();let te=jt(C.currentTarget,C.clientY);le();let Q=U.current,se=S;if(O.kind==="cluster"){let p=(Q.get(O.col)??[]).filter(_=>String(_.chatId)===O.chatId).filter(_=>!(_.status==="closed"&&se!=="done"));if(!p.length)return;let E=new Set(p.map(_=>_.sessionId)),A=(Q.get(se)??[]).filter(_=>!E.has(_.sessionId)),L=te?A.findIndex(_=>_.sessionId===te.dataset.id):A.length;L<0&&(L=A.length);let P=L>0?A[L-1]:null,pe=L<A.length?A[L]:null,W=$n(P?De(P):null,pe?De(pe):null);t.onMoveRows(p.map((_,xe)=>({row:_,column:se,position:W+xe*.001})));return}let J=V.current.get(O.id);if(!J||J.status==="closed"&&se!=="done")return;let z=(Q.get(se)??[]).filter(p=>p.sessionId!==O.id),oe=te?z.findIndex(p=>p.sessionId===te.dataset.id):z.length;oe<0&&(oe=z.length);let Se=oe>0?z[oe-1]:null,$e=oe<z.length?z[oe]:null,He=$n(Se?De(Se):null,$e?De($e):null);t.onMoveRows([{row:J,column:se,position:He}])},[le,t]),fe={dragId:m?.kind==="card"?m.id:null,dropBeforeId:w,editingId:a,groupBy:t.groupBy,callbacks:t,cancelOpen:j,onBeginEdit:ke,onCardClick:Y,onCardKeyDown:we,onDragStartCard:ce,onEditDone:()=>r(null)};return K.mode==="loading"?(0,v.jsx)(Be,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):K.mode==="bot"?K.columns.length?(0,v.jsx)(v.Fragment,{children:K.columns.map(S=>(0,v.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":S.key,children:[(0,v.jsxs)("header",{children:[(0,v.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:Pe(Me({name:S.name,larkAppId:S.larkAppId,size:"sm"}))}),(0,v.jsx)("h2",{children:S.name}),(0,v.jsx)("span",{className:"kanban-col-count",children:S.rows.length})]}),(0,v.jsx)("div",{className:"kanban-col-list",onDragOver:C=>F(S.key,C),onDragEnd:le,children:S.clusters.map(C=>(0,v.jsx)(Jt,{item:C,dragCluster:m?.kind==="cluster"?m:null,cardProps:fe,expanded:C.type==="cluster"&&T.has(`bot:${S.key}:${C.chatId}`),onToggleExpanded:()=>{C.type==="cluster"&&$(`bot:${S.key}:${C.chatId}`)},onDragStartCluster:ie},C.type==="card"?C.row.sessionId:C.chatId))})]},S.key))}):(0,v.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,v.jsx)(v.Fragment,{children:K.columns.map(S=>(0,v.jsxs)("section",{className:`kanban-column kanban-${S.id}${l===S.id?" drag-over":""}`,"data-col":S.id,onDragOver:C=>F(S.id,C),onDrop:C=>Ce(S.id,C),onDragEnd:le,children:[(0,v.jsxs)("header",{children:[(0,v.jsx)("span",{className:"kanban-col-icon",dangerouslySetInnerHTML:Pe(Ks(S.id))}),(0,v.jsx)("h2",{children:o(S.labelKey)}),(0,v.jsx)("span",{className:"kanban-col-count",children:S.rows.length+S.hiddenCount})]}),(0,v.jsxs)("div",{className:"kanban-col-list",children:[S.rows.length?S.clusters.map(C=>(0,v.jsx)(Jt,{item:C,columnId:S.id,dragCluster:m?.kind==="cluster"?m:null,cardProps:fe,expanded:C.type==="cluster"&&T.has(`${S.id}:${C.chatId}`),onToggleExpanded:()=>{C.type==="cluster"&&$(`${S.id}:${C.chatId}`)},onDragStartCluster:ie},C.type==="card"?C.row.sessionId:C.chatId)):(0,v.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),S.hiddenCount?(0,v.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:S.hiddenCount})}):null]})]},S.id))})}var n=Le(en(),1),Xs=new Set(["image/png","image/jpeg","image/gif","image/webp"]),Vt=8,Gs=10*1024*1024,Vs=25*1024*1024;function Ws(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 qs(e){return e===168?"7d":`${e}H`}var Ys=In.map(e=>({value:String(e),label:qs(e)}));function ge(e){return{__html:e}}function ee(){return typeof window>"u"?void 0:window.localStorage}function ln(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${An(t)}`,children:Je(t)})}function _n(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,"data-tip":e.label,"aria-label":e.label,disabled:e.disabled,onClick:s=>{s.stopPropagation(),e.onClick(s.currentTarget)},dangerouslySetInnerHTML:ge(e.icon)})}function Yt(e){if(!e.url||!Oe())return null;let t=!sn();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","data-tip":o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:ge(H.terminal)}):(0,n.jsx)("button",{type:"button",className:"term-btn term-write","data-action":"write-link","data-tip":o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>{s.stopPropagation(),At(e.row,s.currentTarget)},dangerouslySetInnerHTML:ge(H.terminal)})})}function Qt(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","data-tip":o("sessions.openChat"),"aria-label":o("sessions.openChat"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:ge(H.feishu)})}function Qs(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 Wt(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?nn(e.tokenUsage?.in)??-1:t==="tokenOut"?nn(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?Ee(e).toLowerCase():String(e[t]??"").toLowerCase()}function qt(e,t,s,a){let r=Wt(e,s),m=Wt(t,s),f=0;return typeof r=="number"&&typeof m=="number"?f=r-m:typeof r=="boolean"&&typeof m=="boolean"?f=Number(r)-Number(m):f=String(r).localeCompare(String(m)),f===0&&(f=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),a==="asc"?f:-f}function Zs(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 eo(e,t,s){let a=s==="needs-you"?Ze(e):Number(e.lastMessageAt??0),r=s==="needs-you"?Ze(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 no(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 to(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 Un(e,t){(0,u.useEffect)(()=>{let s=e.current;if(s)if(t){if(!s.open)try{s.showModal()}catch{}}else s.open&&s.close()},[t,e])}function Hn(e){let[t,s]=(0,u.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 so(e){let[t,s]=(0,u.useState)(0),[a,r]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:a||t>0,onClick:async()=>{r(!0);let m=await e.locateSession(e.row);r(!1),m&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):a?o("sessions.locating"):o("sessions.locate")})}function oo(e){let[t,s]=(0,u.useState)(0),[a,r]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[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 m=await e.onLocate(e.row);r(!1),m&&s(30)}})}function ao(e){let t=me.filter(l=>e.selected.has(l)).length,s=(0,u.useRef)(null),[a,r]=(0,u.useState)("");(0,u.useEffect)(()=>{let l=()=>{s.current?.open&&(s.current.open=!1)},g=I=>{let T=s.current;T?.open&&!T.contains(I.target)&&l()},w=I=>{I.key==="Escape"&&l()};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",w),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",w)}},[]);let m=a.trim().toLowerCase(),f=m?me.filter(l=>l.toLowerCase().includes(m)):me;return(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===me.length?void 0:"cli-filter-active",children:t===me.length?o("common.all"):`${t}/${me.length}`})]}),(0,n.jsxs)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:[(0,n.jsxs)("div",{className:"filter-cli-head",children:[(0,n.jsx)("input",{type:"search",className:"filter-cli-search",placeholder:o("sessions.cliSearch"),value:a,autoFocus:!0,onChange:l=>r(l.currentTarget.value),onClick:l=>l.stopPropagation()}),(0,n.jsxs)("div",{className:"filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of me)e.selected.has(l)||e.onToggle(l,!0)},children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of me)e.selected.has(l)&&e.onToggle(l,!1)},children:o("sessions.cliClear")})]})]}),(0,n.jsx)("div",{className:"filter-cli-options",children:f.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):f.map(l=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:l,checked:e.selected.has(l),onChange:g=>e.onToggle(l,g.currentTarget.checked)}),(0,n.jsx)("span",{children:l})]},l))})]})]})}function io(e){let t=[{value:"",label:o("sessions.anyStatus")},...It.map(l=>({value:l,label:Je(l)}))],s=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],a=t.find(l=>l.value===e.filters.status)?.label??o("sessions.anyStatus"),r=s.find(l=>l.value===e.filters.adopt)?.label??o("sessions.adoptAny"),m=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],f=m.find(l=>l.value===e.filters.chat)?.label??o("sessions.chatAny");return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters",onSubmit:l=>l.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:l=>{let g=l.currentTarget.value;e.setFilters(w=>({...w,q:g}))}}),(0,n.jsx)(ze,{label:a,value:e.filters.status,options:t,onChange:l=>e.setFilters(g=>({...g,status:l}))}),(0,n.jsx)(ze,{label:r,value:e.filters.adopt,options:s,onChange:l=>e.setFilters(g=>({...g,adopt:l}))}),(0,n.jsx)(ze,{ariaLabel:o("sessions.location"),className:"filter-chat-menu",label:f,value:e.filters.chat,options:m,searchable:!0,searchPlaceholder:o("sessions.chatSearch"),searchEmptyLabel:o("sessions.chatNoMatch"),onChange:l=>e.setFilters(g=>({...g,chat:l}))}),(0,n.jsx)(ao,{selected:e.filters.cli,onToggle:(l,g)=>{e.setFilters(w=>{let I=new Set(w.cli);return g?I.add(l):I.delete(l),{...w,cli:I}})}}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"multiBotTopics",checked:e.filters.multiBotTopics,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(w=>({...w,multiBotTopics:g}))}}),(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:l=>{let g=l.currentTarget.checked;e.setFilters(w=>({...w,botTriggeredTopics:g}))}}),(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:l=>{let g=l.currentTarget.checked;at(ee(),g),e.setFilters(w=>({...w,showUnknownChats:g}))}}),(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:l=>{let g=l.currentTarget.checked;e.setFilters(w=>({...w,active:g}))}}),(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)(lo,{...e.idleCleanup})]})}function ro(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"),r=Oe();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})}),r?(0,n.jsx)("button",{type:"button",id:"bulk-monitor-room",disabled:t||e.selectedCount===0,onClick:e.onAddToMonitorRoom,children:e.monitorRoomText??o("sessions.addToMonitorRoom")}):null,(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 lo(e){let[t,s]=(0,u.useState)(!1),[a,r]=(0,u.useState)(e.hours),[m,f]=(0,u.useState)(),l=(0,u.useRef)(null),g=(0,u.useRef)(null),w=(0,u.useRef)(null),I=e.countForHours(a);return(0,u.useEffect)(()=>{t?r(e.hours):f(void 0)},[t,e.hours]),(0,u.useLayoutEffect)(()=>{if(!t)return;let T=()=>{let D=g.current,N=w.current;if(!D||!N)return;let x=12,U=window.innerWidth,V=window.innerHeight,ne=Math.max(0,Math.min(292,U-x*2)),q=D.getBoundingClientRect(),j=N.offsetHeight,ae=Math.max(x,U-ne-x),K=q.left+q.width/2-ne/2,le=Math.min(Math.max(K,x),ae),$=q.bottom+8,ke=q.top-j-8,Y=$+j<=V-x||ke<x?Math.min(Math.max($,x),Math.max(x,V-j-x)):Math.max(x,ke);f({left:le,top:Y,width:ne})},R=window.requestAnimationFrame(T);return window.addEventListener("resize",T),window.addEventListener("scroll",T,!0),()=>{window.cancelAnimationFrame(R),window.removeEventListener("resize",T),window.removeEventListener("scroll",T,!0)}},[t,e.busy,e.status]),(0,u.useEffect)(()=>{if(!t)return;let T=D=>{let N=D.target;N instanceof Node&&l.current?.contains(N)||N instanceof Node&&w.current?.contains(N)||s(!1)},R=D=>{D.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",T,!0),document.addEventListener("keydown",R),()=>{document.removeEventListener("pointerdown",T,!0),document.removeEventListener("keydown",R)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${I===0?" is-empty":""}${t?" is-open":""}`,ref:l,children:[(0,n.jsxs)("button",{ref:g,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(T=>!T),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,Kn.createPortal)((0,n.jsxs)("div",{ref:w,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:m??{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:I})]})]}),(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:Ys.map(T=>{let R=Tn(T.value),D=R===a;return(0,n.jsx)("button",{type:"button",className:D?"active":void 0,"aria-pressed":D?"true":"false",disabled:e.busy,onClick:()=>r(R),children:T.label},T.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||I===0,onClick:()=>{e.onRun(a).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function co(e){let t=(0,u.useRef)(null);(0,u.useLayoutEffect)(()=>{t.current&&(t.current.indeterminate=e.selectAllIndeterminate)},[e.selectAllIndeterminate]);let s=[{id:"botName",label:o("sessions.bot")},{id:"cliId",label:o("sessions.cli")},{id:"status",label:o("sessions.status")},{id:"chat",label:o("sessions.location")},{id:"tokenIn",label:o("sessions.tokenIn")},{id:"tokenOut",label:o("sessions.tokenOut")},{id:"title",label:o("sessions.titleCol")},{id:"workingDir",label:o("sessions.workingDir")},{id:"spawnedAt",label:o("sessions.created")},{id:"lastMessageAt",label:o("sessions.last")},{id:"adopt",label:o("sessions.adopt")}],a=s.filter(l=>!e.hiddenColumns.has(l.id)),r=2+a.length,m={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")};function f(l,g){switch(g){case"botName":return(0,n.jsx)("td",{"data-label":m.botName,children:re(l)});case"cliId":return(0,n.jsx)("td",{"data-label":m.cliId,children:(0,n.jsx)("span",{className:`badge cli-${An(l.cliId)}`,children:l.cliId??"unknown"})});case"status":return(0,n.jsxs)("td",{"data-label":m.status,children:[(0,n.jsx)(ln,{status:l.status}),(0,n.jsx)(_n,{row:l})]});case"chat":return(0,n.jsx)("td",{className:"session-location-cell","data-label":m.chat,title:Ln(l),children:Ee(l)});case"tokenIn":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenIn,children:Nn(l.tokenUsage?.in)});case"tokenOut":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenOut,children:Nn(l.tokenUsage?.out)});case"title":return(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":m.title,title:String(l.title??""),children:de(l.title??"").slice(0,48)});case"workingDir":return(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":m.workingDir,title:l.workingDir??"",children:String(l.workingDir??"").slice(-34)});case"spawnedAt":return(0,n.jsx)("td",{"data-label":m.spawnedAt,children:Ne(l.spawnedAt)});case"lastMessageAt":return(0,n.jsx)("td",{"data-label":m.lastMessageAt,children:Ne(l.lastMessageAt)});case"adopt":return(0,n.jsx)("td",{"data-label":m.adopt,children:l.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null});default:return null}}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:l=>e.onSelectAll(l.currentTarget.checked)})}),a.map(l=>(0,n.jsx)(Qs,{sort:l.id,label:l.label,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},l.id)),(0,n.jsx)("th",{className:"session-table-columns-th",children:(0,n.jsxs)("details",{className:"session-table-columns-menu",children:[(0,n.jsxs)("summary",{title:o("sessions.columns"),children:[(0,n.jsx)("span",{className:"session-table-columns-icon","aria-hidden":"true",children:(0,n.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,n.jsx)("path",{d:"M2 4h12M2 8h12M2 12h12"})})}),o("sessions.columns")]}),(0,n.jsxs)("div",{className:"session-table-columns-dropdown",role:"menu",children:[(0,n.jsxs)("div",{className:"session-table-columns-header",children:[(0,n.jsx)("span",{children:o("sessions.columnsMenu")}),(0,n.jsx)("button",{type:"button",className:"session-table-columns-reset",onClick:e.onResetColumns,children:o("sessions.columnsReset")})]}),s.map(l=>(0,n.jsxs)("label",{className:"session-table-columns-item",children:[(0,n.jsx)("input",{type:"checkbox",checked:!e.hiddenColumns.has(l.id),onChange:()=>e.onToggleColumn(l.id)}),l.label]},l.id))]})]})})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(l=>{let g=l.status==="closed",w=String(l.sessionId);return(0,n.jsxs)("tr",{"data-id":w,onClick:()=>e.onOpen(l),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":m.select,onClick:I=>I.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(w),disabled:g,onChange:I=>e.onSelect(w,I.currentTarget.checked)})}),a.map(I=>(0,n.jsx)(u.Fragment,{children:f(l,I.id)},I.id)),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":m.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},w)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:r,className:"empty",children:o("sessions.empty")})})})]})}function Zt(e){let t=e.row,s=de(t.title)||t.sessionId,a=re(t),r=Ae(t),m=Xe(t),f=Zs(t),l=En(t.workingDir),g=w=>{w.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:g,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:ge(Me({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)(ln,{status:t.status}),(0,n.jsx)(_n,{row:t})]})]}),l!=="-"||t.adopt||f?(0,n.jsxs)("div",{className:"session-card-meta",children:[l!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:l}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,f?(0,n.jsx)("span",{className:"session-signal",title:f,children:f}):null]}):null,(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${Ne(Ze(t))}`:`${o("sessions.last")}: ${Ne(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(Qt,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(oo,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(ye,{action:"details",icon:H.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),an(t)?(0,n.jsx)(ye,{action:"restart",icon:H.restart,label:o("sessions.restart"),onClick:w=>e.onRestart(t,w)}):null,(0,n.jsx)(Yt,{row:t,url:m}),t.status!=="closed"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(ye,{action:"lock",icon:t.locked?H.unlock:H.lock,label:on(t),kind:t.locked?"locked":"",onClick:w=>e.onLock(t,!t.locked,w)}),(0,n.jsx)(ye,{action:"close",icon:H.close,label:o("sessions.close"),kind:"danger",onClick:w=>e.onClose(t,w)})]}):null]})]})}function uo(e){(0,u.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(Mn.map(a=>[a.id,[]]));for(let a of e.rows){let r=xt(a);r&&t.get(r).push(a)}let s=e.order.map(a=>Mn.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 m=(t.get(a.id)??[]).sort((f,l)=>eo(f,l,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:f=>{e.dragColId&&(f.preventDefault(),f.dataTransfer&&(f.dataTransfer.dropEffect="move"),e.dragColId!==a.id&&e.onDragOverCol(a.id))},onDrop:f=>{e.dragColId&&(f.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:f=>{e.onDragCol(a.id),f.dataTransfer&&(f.dataTransfer.effectAllowed="move",f.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:m.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:m.length?m.map(f=>(0,n.jsx)(Zt,{row:f,selected:e.selected.has(f.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},f.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},a.id)})})}function mo(e){let t=de(e.title).trim();return t||(e.kind==="thread"?o("sessions.topic.untitled"):e.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession"))}function go(e){let t=(0,u.useMemo)(()=>tn(e.rows),[e.rows]),s=(0,u.useMemo)(()=>new Map(tn(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,m=a.rows[0],f=Ee(m),l=mo(r),g=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:ge(Qe({chatId:a.chatId,name:f,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-topic-heading",children:[(0,n.jsx)("span",{className:"session-topic-location",children:f}),(0,n.jsx)("h2",{title:r.title,children:l}),(0,n.jsx)("code",{title:g,children:r.kind==="thread"?g: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"),": ",Ne(r.latestActivityAt)]})]})]}),(0,n.jsx)("div",{className:"session-topic-members",children:a.rows.map(w=>(0,n.jsx)(Zt,{row:w,selected:e.selected.has(w.sessionId),onToggleSelect:I=>{I.status!=="closed"?e.onToggleSelect(I):e.onOpen(I)},onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},w.sessionId))})]},a.key)}):(0,n.jsx)("div",{className:"sessions-topic-empty",children:o("sessions.topic.empty")})})}function fo(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"),m=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:ge(Me({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:no(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:m})]})]})}function po(e){let t=(0,u.useRef)(null);Un(t,!!e.state);let s=e.state?Re.sessions.get(e.state.sessionId):null,a=(0,u.useRef)(null),r=!!e.state&&!e.state.loading&&!e.state.error&&e.state.messages.length>0;return(0,u.useEffect)(()=>{if(!r)return;let m=a.current;m&&(m.scrollTop=m.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: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:ge(Me({name:re(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(de(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)(Be,{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((m,f,l)=>(0,n.jsx)(fo,{message:m,ownerOpenId:e.state?.ownerOpenId,groupStart:f===0||Bn(l[f-1])!==Bn(m)},m.messageId??f))}):null]})]}):null})}function bo(e){let[t,s]=(0,u.useState)(!1),[a,r]=(0,u.useState)(""),m=(0,u.useRef)(null),f=de(e.row.title)||e.row.sessionId;(0,u.useLayoutEffect)(()=>{if(!t||!m.current)return;let g=m.current;g.focus(),g.select(),(()=>{let I=getComputedStyle(g),T=document.createElement("span");T.style.cssText="position:absolute;visibility:hidden;white-space:pre",T.style.fontSize=I.fontSize,T.style.fontFamily=I.fontFamily,T.style.fontWeight=I.fontWeight,T.style.letterSpacing=I.letterSpacing,T.textContent=g.value||" ",document.body.appendChild(T);let R=Math.round(window.innerWidth*.6);g.style.width=`${Math.min(Math.max(T.offsetWidth+22,80),R)}px`,T.remove()})()},[t,a]);let l=g=>{let w=a.trim();s(!1),g&&w&&w!==f&&e.onRename(e.row,w)};return t?(0,n.jsx)("input",{ref:m,type:"text",className:"term-modal-name-input",maxLength:200,value:a,onChange:g=>r(g.currentTarget.value),onBlur:()=>l(!0),onKeyDown:g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),l(!0)):g.key==="Escape"&&(g.preventDefault(),l(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??f),children:String(f).slice(0,60)}),(0,n.jsx)(ye,{id:"term-modal-edit",icon:H.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(de(e.row.title)||""),s(!0)}})]})}function ho(e){let t=(0,u.useRef)(null);Un(t,!!e.state);let s=e.state?Re.sessions.get(e.state.sessionId):null,a=s?Xe(s):null,r=e.state?.url??a??"",m=s?String(s.cliId??"unknown"):"",f=s?En(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:l=>{l.target===l.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:ge(Me({name:re(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)(bo,{row:s,onRename:e.onRename}),(0,n.jsx)(ln,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:re(s)}),(0,n.jsx)("span",{children:m}),f!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:f}):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:ge(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:ge(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)(Be,{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 yo(e){let t=e.report;if(!t||t.status!=="ok"){let g=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",g]})}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:[],m=Array.isArray(t.spans)?t.spans:[],f=g=>g==="bad"||g==="warn"?"!":"i",l=g=>g==="error"?"!":g==="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((g,w)=>(0,n.jsxs)("li",{children:[f(String(g.severity??""))," ",(0,n.jsx)("b",{children:String(g.title??"")})," - ",String(g.action??""),Array.isArray(g.evidence)&&g.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:g.evidence.join("; ")})]}):null]},w))})]}):null,m.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",m.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??m.length),total:String(t.meta.spansTotal??m.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:[...m].sort((g,w)=>(g.relStartMs??0)-(w.relStartMs??0)).map((g,w)=>{let I=[g.inputSummary,g.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:g.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:l(String(g.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(g.tool??"")})}),(0,n.jsx)("td",{children:String(g.phase??"")}),(0,n.jsx)("td",{children:to(g.durationMs)}),(0,n.jsxs)("td",{children:["#",String(g.turnIndex??0)]}),(0,n.jsx)("td",{children:I})]},w)})})})})]}):null]})}function ko(e){let[t,s]=(0,u.useState)(null);if((0,u.useEffect)(()=>s(null),[e.row.sessionId]),!Te.authed)return null;let a=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),m=await r.json().catch(()=>({}));!m.ok||!m.report?s({loading:!1,error:String(m.error??r.status)}):s({loading:!1,report:m.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)(Be,{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)(yo,{report:t.report}):null]})]})}function wo(e){let t=(0,u.useRef)(null);Un(t,!!e.row);let s=e.row,a=s?Xe(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:de(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)(ln,{status:s.status}),(0,n.jsx)(_n,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(Hn,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",re(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"),":"]})," ",Ee(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(Hn,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(Hn,{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)(Qt,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(so,{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)(Yt,{row:s,url:a}),sn()&&s.status!=="closed"?(0,n.jsx)("button",{id:"copy-cmd-btn",type:"button","data-tip":o("sessions.copyCommandHint"),onClick:r=>{Et(s,r.currentTarget)},children:o("sessions.copyCommand")}):null,an(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,(0,n.jsx)("button",{id:"lock-btn",type:"button",onClick:r=>{e.setSessionLocked(s,!s.locked,r.currentTarget)},children:on(s)}),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)(ko,{row:s})]})]}):null})}function Co(e){let t=e.state;(0,u.useEffect)(()=>{let p=e.dialog;return()=>{p.open&&p.close()}},[e.dialog]),(0,u.useEffect)(()=>{let p=e.dialog;if(t){if(!p.open)try{p.showModal()}catch{}}else p.open&&p.close()},[e.dialog,t]),(0,u.useEffect)(()=>{let p=e.dialog,E=()=>e.onClose(),A=L=>{L.target===p&&e.onClose()};return p.addEventListener("close",E),p.addEventListener("click",A),()=>{p.removeEventListener("close",E),p.removeEventListener("click",A)}},[e]);let[s,a]=(0,u.useState)(""),[r,m]=(0,u.useState)([]),[f,l]=(0,u.useState)(new Set),[g,w]=(0,u.useState)("lead"),[I,T]=(0,u.useState)(""),[R,D]=(0,u.useState)("in_progress"),[N,x]=(0,u.useState)(""),[U,V]=(0,u.useState)(""),[ne,q]=(0,u.useState)(!1),[j,ae]=(0,u.useState)(!1),[K,le]=(0,u.useState)(""),[$,ke]=(0,u.useState)(()=>it(ee())),[Y,we]=(0,u.useState)(null),[ce,ie]=(0,u.useState)(null),[F,Ce]=(0,u.useState)(0),fe=(0,u.useRef)(null),S=(0,u.useRef)(1);if((0,u.useEffect)(()=>{t&&(a(""),m([]),l(new Set),w("lead"),T(""),D("in_progress"),x(""),V(""),q(!1),ae(!1),le(""),we(null),ie(null),Ce(0),S.current=1)},[t]),!t)return null;if(t.success){let p=t.success,E=typeof p.shareLink=="string"&&p.shareLink?p.shareLink:"",A=Array.isArray(p.failed)?p.failed.length:0,L=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",L,"\uFF09"]}),A>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(A)})}):null,E?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:E,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)(Be,{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 C=t.bots,O=[...f],te=O,Q=p=>C.find(E=>E.larkAppId===p)?.botName??p,se=K.trim().toLowerCase(),J=se?C.filter(p=>p.botName.toLowerCase().includes(se)||p.larkAppId.toLowerCase().includes(se)):C,z=ce?Dt(C,ce.query).slice(0,8):[],oe=p=>{if(!ce)return;let E=Bt(s,ce,p.botName);a(E.text),ie(null),Ce(0),l(A=>new Set(A).add(p.larkAppId)),T(A=>A||p.larkAppId),requestAnimationFrame(()=>{let A=fe.current;A&&(A.focus(),A.setSelectionRange(E.caret,E.caret))})},Se=p=>{if(!(!ce||z.length===0)){if(p.key==="ArrowDown"||p.key==="ArrowUp"){p.preventDefault();let E=p.key==="ArrowDown"?1:-1;Ce(A=>(A+E+z.length)%z.length);return}if(p.key==="Enter"||p.key==="Tab"){p.preventDefault(),oe(z[Math.min(F,z.length-1)]);return}p.key==="Escape"&&(p.preventDefault(),ie(null))}},$e=async p=>{let E=[...p.clipboardData.files].filter(W=>W.type.startsWith("image/"));if(E.length===0)return;p.preventDefault();let A=p.currentTarget.selectionStart??s.length,L=p.currentTarget.selectionEnd??A,P=E.filter(W=>Xs.has(W.type.toLowerCase()));if(P.length!==E.length){alert(o("sessions.create.imageUnsupported"));return}if(r.length+P.length>Vt){alert(o("sessions.create.imageCountLimit",{n:String(Vt)}));return}if(P.some(W=>W.size>Gs)){alert(o("sessions.create.imageSizeLimit"));return}if(r.reduce((W,_)=>W+_.size,0)+P.reduce((W,_)=>W+_.size,0)>Vs){alert(o("sessions.create.imageTotalLimit"));return}try{let W=S.current,_=await Promise.all(P.map(async(Z,Ke)=>{let ve=await Ws(Z),_e=ve.indexOf(",");if(_e<0)throw new Error("bad_image_data");let he=W+Ke;return{id:`${Date.now()}-${Ke}-${Math.random().toString(36).slice(2)}`,ordinal:he,marker:`[${o("sessions.create.imageMarker",{n:String(he)})}]`,name:Z.name||`pasted-image-${r.length+Ke+1}`,mimeType:Z.type.toLowerCase(),size:Z.size,dataBase64:ve.slice(_e+1),previewUrl:ve}}));S.current+=_.length;let xe=$t(s,A,L,_.map(Z=>Z.marker));a(xe.text),m(Z=>[...Z,..._]),ie(null),requestAnimationFrame(()=>{let Z=fe.current;Z&&(Z.focus(),Z.setSelectionRange(xe.caret,xe.caret))})}catch{alert(o("sessions.create.imageReadFailed"))}},He=async p=>{p.preventDefault();let E=s.trim();if(!E){alert(o("sessions.create.errContent"));return}if(O.length===0){alert(o("sessions.create.errNoBot"));return}let A=I||O[0]||"";if(g==="lead"&&(!A||!O.includes(A))){alert(o("sessions.create.errLead"));return}ae(!0),we(null);try{let L=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:E,larkAppIds:O,mode:g,column:R,leadLarkAppId:g==="lead"?A:void 0,name:N.trim()||void 0,bindWorkingDir:U.trim()||void 0,images:r.map(pe=>({name:pe.name,mimeType:pe.mimeType,dataBase64:pe.dataBase64}))})}),P=await L.json().catch(()=>null);L.ok&&P?.ok?$?(we(P),a(""),m([]),S.current=1,x("")):e.onSuccess(P):L.status!==401&&alert(`${o("sessions.create.failed")}: ${P?.error??L.status}`)}catch(L){alert(`${o("sessions.create.failed")}: ${L}`)}finally{ae(!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:He,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:fe,name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),"aria-describedby":"cs-content-help",required:!0,value:s,onChange:p=>{let E=p.currentTarget,A=E.value;a(A),ie(Dn(A,E.selectionStart??A.length)),Ce(0)},onClick:p=>ie(Dn(s,p.currentTarget.selectionStart??s.length)),onKeyDown:Se,onPaste:p=>{$e(p)},onBlur:()=>setTimeout(()=>ie(null),0)}),ce?(0,n.jsx)("div",{className:"cs-mention-menu",role:"listbox","aria-label":o("sessions.create.mentionBots"),children:z.length?z.map((p,E)=>(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":E===F,className:E===F?"active":void 0,onMouseDown:A=>A.preventDefault(),onClick:()=>oe(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 E=r.filter(L=>L.id!==p.id),A=Ot(s,p.marker,E.map(L=>L.marker),L=>`[${o("sessions.create.imageMarker",{n:String(L+1)})}]`);a(A.text),m(E.map((L,P)=>({...L,ordinal:P+1,marker:A.markers[P]}))),S.current=E.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")}),C.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:K,onChange:p=>le(p.currentTarget.value)}),J.length?(0,n.jsx)("div",{className:"cs-bot-list",children:J.map(p=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:p.larkAppId,checked:f.has(p.larkAppId),onChange:E=>{let A=E.currentTarget.checked;l(L=>{let P=new Set(L);return A?P.add(p.larkAppId):P.delete(p.larkAppId),P.has(I)||T(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")}),O.length?(0,n.jsx)("small",{children:o("sessions.create.selectedCount",{n:String(O.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:g==="lead",onChange:()=>w("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:g==="all",onChange:()=>w("all")})," ",o("sessions.create.modeAll")]}),(0,n.jsx)("small",{children:o("sessions.create.modeHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-lead-row",hidden:g!=="lead",children:[(0,n.jsx)("legend",{children:o("sessions.create.lead")}),(0,n.jsx)("select",{name:"lead",disabled:te.length===0,value:te.includes(I)?I:"",onChange:p=>T(p.currentTarget.value),children:te.length?te.map(p=>(0,n.jsx)("option",{value:p,children:Q(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:R==="in_progress",onChange:()=>D("in_progress")})," ",o("sessions.create.columnInProgress")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"backlog",checked:R==="backlog",onChange:()=>D("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${ne?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":ne,"aria-controls":"cs-advanced-fields",onClick:()=>q(p=>!p),children:o("sessions.create.optionalConfig")})}),ne?(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:N,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:U,onChange:p=>V(p.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),Y?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[Y.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(Y.failed)&&Y.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(Y.failed.length)})}`:""]}),typeof Y.shareLink=="string"&&Y.shareLink?(0,n.jsx)("a",{href:Y.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:$,onChange:p=>{let E=p.currentTarget.checked;ke(E),rt(ee(),E)}}),(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:j||C.length===0,children:j?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function So(){pt();let e=ft(i=>[...i.sessions.values()]),[t,s]=(0,u.useState)(0),a=(0,u.useCallback)(()=>s(i=>i+1),[]),[r,m]=(0,u.useState)({q:"",status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:tt(ee()),active:!0,cli:new Set(me)}),[f,l]=(0,u.useState)(new Set),[g,w]=(0,u.useState)("lastMessageAt"),[I,T]=(0,u.useState)("desc"),[R,D]=(0,u.useState)(()=>new Set(Zn(ee()))),[N,x]=(0,u.useState)(()=>nt(ee())),[U,V]=(0,u.useState)(()=>st(ee())),[ne,q]=(0,u.useState)(!1),[j,ae]=(0,u.useState)(null),[K,le]=(0,u.useState)(null),[$,ke]=(0,u.useState)(()=>lt(ee())),Y=`${N}:${N==="kanban"?$:"-"}`,we=(0,u.useRef)(!0),[ce,ie]=(0,u.useState)(0),[F,Ce]=(0,u.useState)([]),[fe,S]=(0,u.useState)(null),[C,O]=(0,u.useState)(!1),te=(0,u.useRef)(!1),[Q,se]=(0,u.useState)(()=>{try{return window.localStorage.getItem(Sn)??""}catch{return""}}),[J,z]=(0,u.useState)({data:null,key:"",fetchedAt:0}),oe=(0,u.useRef)(!1),Se=(0,u.useRef)(new Set),[$e,He]=(0,u.useState)(""),[p,E]=(0,u.useState)(null),[A,L]=(0,u.useState)(null),[P,pe]=(0,u.useState)(null),[W,_]=(0,u.useState)(!1),[xe,Z]=(0,u.useState)(24),[Ke,ve]=(0,u.useState)(""),[_e,he]=(0,u.useState)(null),[es,Ue]=(0,u.useState)(null),[ns,cn]=(0,u.useState)(null),[ts,ss]=(0,u.useState)(null),[dn,os]=(0,u.useState)(null),[as,Ve]=(0,u.useState)(null),[is,un]=(0,u.useState)(!1),Fe=(0,u.useRef)(0);(0,u.useLayoutEffect)(()=>{if(we.current){we.current=!1;return}ie(i=>i+1)},[Y]),(0,u.useEffect)(()=>{os(document.getElementById("create-session-modal"))},[]),(0,u.useEffect)(()=>{ut().then(a)},[a]);let mn=(0,u.useMemo)(()=>{let i=new Map;for(let d of e){let c=String(d.chatId??"").trim();if(!c||!r.showUnknownChats&&xn(d))continue;let b=Ee(d),h=i.get(c);(!h||b<h)&&i.set(c,b)}return[...i.entries()].sort((d,c)=>d[1].localeCompare(c[1])).map(([d,c])=>({value:d,label:c}))},[r.showUnknownChats,t,e]);(0,u.useEffect)(()=>{r.chat&&(mn.some(i=>i.value===r.chat)||m(i=>({...i,chat:""})))},[mn,r.chat]);let be=(0,u.useMemo)(()=>{let i=r.q.toLowerCase(),d=[...r.cli],c=d.length>0&&d.length<me.length,b=N==="kanban",h=r.multiBotTopics||r.botTriggeredTopics?new Set(tn(e).filter(y=>!r.multiBotTopics||y.multiBot).filter(y=>!r.botTriggeredTopics||y.inferredBotTriggered).map(y=>y.key)):null,k=e.filter(y=>!c||d.includes(y.cliId??"unknown")).filter(y=>r.showUnknownChats||!xn(y)).filter(y=>!r.status||y.status===r.status).filter(y=>!r.adopt||r.adopt==="yes"==!!y.adopt).filter(y=>!r.chat||String(y.chatId??"")===r.chat).filter(y=>!r.active||b||y.status!=="closed").filter(y=>!i||Nt(y).includes(i));return h?k.filter(y=>h.has(Rn(y))).sort((y,B)=>qt(y,B,g,I)):k.sort((y,B)=>qt(y,B,g,I))},[r,t,I,g,e,N]),gn=(0,u.useMemo)(()=>Tt(e),[e]),Ie=(0,u.useMemo)(()=>new Map(e.map(i=>[i.sessionId,i])),[e,t]),Fn=(0,u.useMemo)(()=>be.filter(i=>i.status!=="closed"),[be]),je=(N==="table"||N==="topics"?be:Fn).filter(i=>i.status!=="closed"),jn=[...f].map(i=>Ie.get(i)).filter(i=>!!i&&i.status!=="closed"),zn=je.length>0&&je.every(i=>f.has(i.sessionId)),rs=je.some(i=>f.has(i.sessionId))&&!zn;(0,u.useEffect)(()=>{l(i=>{let d=!1,c=new Set;for(let b of i){let h=Ie.get(b);h&&h.status!=="closed"?c.add(b):d=!0}return d?c:i})},[Ie]);let fn=(0,u.useCallback)(i=>{let d=new Set;if(!i)return d;for(let c of i.groupChats)d.add(c);if(fe)for(let[c,b]of fe){if(d.has(c))continue;let h=!1;for(let k of i.botIds)if(b.botIds.has(k)){h=!0;break}if(h){for(let k of b.observedNames)if(i.botNames.has(k)){d.add(c);break}}}return d},[fe]),Jn=(0,u.useMemo)(()=>{if(N==="kanban"&&$==="team"){let i=F.find(c=>c.key===Q)??F[0],d=fn(i);return be.filter(c=>d.has(String(c.chatId)))}return be},[$,Q,F,be,fn,N]),pn=(0,u.useCallback)(i=>wt(Jn,i),[Jn]),bn=(0,u.useCallback)(async()=>{if(!(te.current||C)){te.current=!0;try{let[i,d,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)&&S(new Map(c.chats.map(k=>[String(k.chatId),{botIds:new Set((k.memberBots??[]).filter(y=>y.inChat).map(y=>String(y.larkAppId))),observedNames:new Set((k.observedBotNames??[]).map(y=>String(y)))}])));let b=k=>({ids:new Set(k.map(y=>String(y.larkAppId))),names:new Set(k.map(y=>String(y.name??"")).filter(Boolean))}),h=[];for(let k of i?.teams??[]){let{ids:y,names:B}=b(k.bots??[]);h.push({key:`local:${k.teamId}`,label:k.isDefault?o("team.myHostedTeam"):String(k.name??k.teamId),botIds:y,botNames:B,groupChats:new Set((k.groupChatIds??[]).map(X=>String(X)))})}for(let k of d?.memberships??[]){let{ids:y,names:B}=b(k.roster?.bots??[]);h.push({key:`${k.hubUrl}::${k.teamId}`,label:String(k.teamName??k.teamId??k.hubUrl),botIds:y,botNames:B,groupChats:new Set})}Ce(h),se(k=>h.length&&!h.some(y=>y.key===k)?h[0].key:k)}finally{O(!0),te.current=!1}}},[C]),Xn=(0,u.useCallback)(async(i,d,c,b,h)=>{try{let y=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:d,column:c,position:b})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:i,sessionId:d,column:c,position:b})}),B=await y.json().catch(()=>({}));(!y.ok||B?.ok===!1)&&(z(X=>{if(!X.data||X.key!==i)return X;let G={...X.data.board};return h?G[d]=h:delete G[d],{...X,data:{...X.data,board:G}}}),y.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${B?.error??y.status}`))}catch(k){z(y=>{if(!y.data||y.key!==i)return y;let B={...y.data.board};return h?B[d]=h:delete B[d],{...y,data:{...y.data,board:B}}}),alert(`${o("sessions.kanban.moveFail")}: ${k}`)}},[]),ls=(0,u.useCallback)(async i=>{let d=J.key===i.key&&Date.now()-J.fetchedAt<3e4;if(!(oe.current||d)){oe.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)}`,h=await fetch(b),k=await h.json().catch(()=>({}));if(!h.ok||k?.ok===!1)return;let y=typeof k.deploymentId=="string"?k.deploymentId:null,B=[];for(let X of Array.isArray(k.reports)?k.reports:[])if(!(y&&X.deploymentId===y))for(let G of Array.isArray(X.sessions)?X.sessions:[])B.push({...G,remoteDeployment:X.deploymentName||X.deploymentId});z({key:i.key,fetchedAt:Date.now(),data:{board:k.board&&typeof k.board=="object"?k.board:{},remoteRows:B}})}finally{oe.current=!1}}},[J.fetchedAt,J.key]);(0,u.useEffect)(()=>{N==="kanban"&&$==="team"&&!C&&bn()},[$,C,bn,N]),(0,u.useEffect)(()=>{let i=window.setInterval(()=>{N==="kanban"&&$==="team"&&(z(d=>({...d,fetchedAt:0})),a())},3e4);return()=>window.clearInterval(i)},[$,a,N]);let Gn=(0,u.useCallback)(async(i,d,c,b)=>{try{let h=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:d,position:c})}),k=await h.json().catch(()=>({}));(!h.ok||k?.ok===!1)&&(i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),h.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${k?.error??h.status}`))}catch(h){i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),alert(`${o("sessions.kanban.moveFail")}: ${h}`)}},[a]),cs=(0,u.useCallback)(i=>{let d=!1;for(let c of i){let b=String(c.row.sessionId);if(!b||c.row.status==="closed"&&c.column!=="done")continue;if($==="team"){let y=F.find(G=>G.key===Q)??F[0];if(!y)continue;let X=(J.key===y.key&&J.data?J.data.board:{})[b];z(G=>{let Yn=G.key===y.key&&G.data?G.data:{board:{},remoteRows:G.data?.remoteRows??[]},Ns={...Yn.board,[b]:{column:c.column,position:c.position}};return{...G,key:y.key,data:{...Yn,board:Ns}}}),Xn(y.key,b,c.column,c.position,X),d=!0;continue}let h=Re.sessions.get(b);if(!h)continue;let k={column:h.kanbanColumn,position:h.kanbanPosition};h.kanbanColumn=c.column,h.kanbanPosition=c.position,Gn(h,c.column,c.position,k),d=!0}d&&a()},[$,Q,F,J,Gn,Xn,a]),Vn=(0,u.useCallback)(async(i,d)=>{let c=i.title;i.title=d,a();try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:d})}),h=await b.json().catch(()=>({}));(!b.ok||h?.ok===!1)&&(i.title=c,a(),b.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${h?.error??b.status}`))}catch(b){i.title=c,a(),alert(`${o("sessions.kanban.renameFail")}: ${b}`)}},[a]),hn=(0,u.useCallback)(async i=>{try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/locate`,{method:"POST"}),c=await d.json();return c.ok?!0:(alert(`Locate failed: ${c.error??d.status}`),!1)}catch(d){return alert(`Locate error: ${d}`),!1}},[]),yn=(0,u.useCallback)(async(i,d)=>{if(!confirm(o("sessions.closeConfirm")))return!1;d&&(d.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):(l(h=>{let k=new Set(h);return k.delete(i.sessionId),k}),a(),!0)}catch(c){return alert(`Close error: ${c}`),!1}finally{d&&(d.disabled=!1)}},[a]),We=(0,u.useCallback)(async(i,d,c)=>{let b=!!i.locked;if(b===d)return!0;i.locked=d,a(),c&&(c.disabled=!0);try{let h=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:d})}),k=await h.json().catch(()=>({}));return!h.ok||k?.ok===!1?(i.locked=b,a(),h.status!==401&&alert(`${o("sessions.lockFailed")}: ${k?.error??h.status}`),!1):(i.locked=!!k.locked,a(),!0)}catch(h){return i.locked=b,a(),alert(`${o("sessions.lockFailed")}: ${h}`),!1}finally{c&&(c.disabled=!1)}},[a]),qe=(0,u.useCallback)(async(i,d)=>{if(Se.current.has(i.sessionId)||!confirm(Lt(i)))return!1;d&&(d.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):(Se.current.add(i.sessionId),window.setTimeout(()=>Se.current.delete(i.sessionId),5e3),!0)}catch(c){return alert(`${o("sessions.restartFailed")}: ${c}`),!1}finally{d&&(d.disabled=!1)}},[]),ds=(0,u.useCallback)(async(i,d)=>{d&&(d.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{d&&(d.disabled=!1)}},[]),us=(0,u.useCallback)(async(i,d)=>{d&&(d.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{d&&(d.disabled=!1)}},[]),Ye=(0,u.useCallback)(i=>{Ue({sessionId:i.sessionId,loading:!0,messages:[]}),(async()=>{try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/history?limit=80`),c=await d.json().catch(()=>({}));if(!d.ok||c?.ok===!1){let h=String(c?.error??d.status),k=h==="not_found_yet"||h==="not_found";Ue(y=>y?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:h,stale:k}:y);return}let b=Array.isArray(c.messages)?c.messages:[];Ue(h=>h?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:b,ownerOpenId:c.ownerOpenId}:h)}catch(d){Ue(c=>c?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:String(d)}:c)}})()},[]),ms=(0,u.useCallback)(i=>{if(!Oe())return;let d=Xe(i);if(!d){he(i.sessionId);return}cn({sessionId:i.sessionId,url:d,loading:!0}),(async()=>{let c=d;if(sn())try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/write-link`),h=await b.json().catch(()=>({}));b.ok&&h?.ok!==!1&&h?.url&&(c=h.url)}catch{}cn(b=>b?.sessionId===i.sessionId?{sessionId:i.sessionId,url:c,loading:!1}:b)})()},[]),gs=(0,u.useCallback)(async()=>{let i=[...f];if(i.length===0||!confirm(o("sessions.closeBulkConfirm",{count:i.length})))return;E({done:0,total:i.length});let d=0,c=0,b=[...i];async function h(){for(;b.length;){let k=b.shift();try{let y=await fetch(`/api/sessions/${encodeURIComponent(k)}/close`,{method:"POST"}),B=await y.json().catch(()=>({}));(!y.ok||B?.ok===!1)&&(c+=1)}catch{c+=1}finally{d+=1,E({done:d,total:i.length})}}}await Promise.all(Array.from({length:Math.min(6,i.length)},()=>h())),E(null),l(new Set),a(),c>0&&alert(`Failed: ${c}/${i.length}`)},[a,f]),fs=(0,u.useCallback)(async i=>{let d=[...f].map(y=>Ie.get(y)).filter(y=>!!y&&y.status!=="closed"&&!!y.locked!==i);if(d.length===0)return;L({locked:i,done:0,total:d.length});let c=0,b=0,h=[...d];async function k(){for(;h.length;){let y=h.shift(),B=!!y.locked;try{let X=await fetch(`/api/sessions/${encodeURIComponent(y.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:i})}),G=await X.json().catch(()=>({}));!X.ok||G?.ok===!1?(b+=1,y.locked=B):y.locked=!!G.locked}catch{b+=1,y.locked=B}finally{c+=1,L({locked:i,done:c,total:d.length})}}}await Promise.all(Array.from({length:Math.min(6,d.length)},()=>k())),L(null),a(),b>0&&alert(`${o("sessions.lockFailed")}: ${b}/${d.length}`)},[a,Ie,f]),ps=(0,u.useCallback)(()=>{let i=[...f].filter(c=>!!Ie.get(c));if(i.length===0)return;let d=yt(i);pe(o("sessions.monitorRoomAdded",{added:d.added,total:d.total})),window.setTimeout(()=>pe(null),1800)},[Ie,f]),bs=(0,u.useCallback)(async i=>{let d=Tn(i);if(!d)return;let c=pn(d);if(c.length!==0){Z(d),_(!0),ve(o("sessions.idleCleanupRunning"));try{let b=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:d,sessionIds:c.map(k=>k.sessionId)})}),h=await b.json().catch(()=>({}));if(!b.ok){b.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${h?.error??b.status}`),ve("");return}l(k=>{let y=new Set(k);for(let B of h?.results??[])B?.ok&&B?.sessionId&&y.delete(String(B.sessionId));return y}),ve(o("sessions.idleCleanupDone",{closed:Number(h?.closed??0),failed:Number(h?.failed??0)})),a()}catch(b){alert(`${o("sessions.idleCleanupFailed")}: ${b}`),ve("")}finally{_(!1)}}},[pn,a]),hs=i=>{let d=et(i)??"board";d!==N&&(x(d),ot(ee(),d))},ys=(i,d)=>{V(c=>{let b=c.indexOf(i),h=b+d;if(b<0||h<0||h>=c.length)return c;let k=[...c];return k.splice(b,1),k.splice(h,0,i),Cn(ee(),k),k})},ks=(i,d)=>{i!==d&&V(c=>{let b=c.indexOf(i),h=c.indexOf(d);if(b<0||h<0)return c;let k=[...c];return k.splice(b,1),k.splice(h,0,i),Cn(ee(),k),k})},ws=(0,u.useMemo)(()=>({rows:be,groupBy:$,teams:F,teamsLoaded:C,teamKey:Q,teamBoardData:J.data,teamBoardKey:J.key}),[$,Q,F,C,be,J.data,J.key]),Cs=_e?Ie.get(_e)??null:null,kn=(0,u.useMemo)(()=>C?F.length?F.map(i=>({value:i.key,label:i.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[F,C]),Ss=!C||F.length===0,Wn=F.some(i=>i.key===Q)?Q:kn[0]?.value??"",vs=kn.find(i=>i.value===Wn)?.label??o("sessions.kanban.groupTeam"),Is=(0,u.useCallback)(()=>{Fe.current+=1,un(!1),Ve(null)},[]),qn=(0,u.useCallback)(async()=>{let i=Fe.current+1;Fe.current=i,Ve({bots:[],loading:!0}),un(!0);try{let d=await Rt();if(Fe.current!==i)return;Ve({bots:d})}finally{Fe.current===i&&un(!1)}},[]),Ts=(0,u.useCallback)(async()=>{let i=window.prompt(o("sessions.debugTerminalPrompt"),"");if(i===null)return;let d=i.trim(),c=window.open("about:blank","_blank");c&&(c.opener=null);try{let b=await fetch("/api/debug-terminal",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(d?{workingDir:d}:{})}),h=await b.json().catch(()=>({}));if(!b.ok||h?.ok===!1||!h?.url){c?.close(),b.status!==401&&alert(`${o("sessions.debugTerminalFail")}: ${h?.error??b.status}`);return}c?c.location.href=h.url:window.open(h.url,"_blank","noopener")}catch(b){c?.close(),alert(`${o("sessions.debugTerminalFail")}: ${b}`)}},[]);return(0,u.useEffect)(()=>{let i=()=>{bt()&&Te.authed&&qn()};return i(),window.addEventListener(vn,i),()=>window.removeEventListener(vn,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,d])=>(0,n.jsx)("button",{type:"button","data-view":i,className:N===i?"active":void 0,"aria-pressed":N===i,onClick:()=>hs(i),children:d},i))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${N==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":N!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([i,d])=>(0,n.jsx)("button",{type:"button","data-groupby":i,className:$===i?"active":void 0,"aria-pressed":$===i,onClick:()=>{ke(i),ct(ee(),i)},children:d},i))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(N==="kanban"&&$==="team"&&C),children:$e}),(0,n.jsx)(ze,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(N==="kanban"&&$==="team"),disabled:Ss,label:vs,value:Wn,options:kn,onChange:i=>{if(F.some(d=>d.key===i)){se(i);try{window.localStorage.setItem(Sn,i)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[Oe()?(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=kt()},children:o("sessions.monitorRoom")}):null,Te.authed?(0,n.jsx)("button",{type:"button",className:"debug-terminal-btn",title:o("sessions.debugTerminalHint"),onClick:()=>{Ts()},children:o("sessions.debugTerminal")}):null,Te.authed?(0,n.jsx)(gt,{className:"page-primary-action create-session-btn",disabled:is,onClick:()=>{qn()},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:gn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:gn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:gn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(io,{chatOptions:mn,filters:r,setFilters:m,idleCleanup:{busy:W,hours:xe,status:Ke,countForHours:i=>pn(i).length,onRun:bs}}),(0,n.jsx)(ro,{selectedCount:f.size,lockDisabled:!jn.some(i=>!i.locked),unlockDisabled:!jn.some(i=>!!i.locked),closeProgress:p,lockProgress:A,monitorRoomText:P,onClear:()=>l(new Set),onClose:()=>{gs()},onAddToMonitorRoom:ps,onLock:i=>{fs(i)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${ce>0?" sessions-view-stage-enter":""}`,"data-view":N,"data-kanban-group":$,children:[(0,n.jsx)(co,{rows:be,selected:f,hidden:N!=="table",sortKey:g,sortDir:I,selectAllChecked:zn,selectAllIndeterminate:rs,selectAllDisabled:je.length===0,hiddenColumns:R,onToggleColumn:i=>{let d=!R.has(i),c=new Set(R);d?c.add(i):c.delete(i),wn(ee(),Array.from(c)),D(c),d&&i===g&&(w("lastMessageAt"),T("desc"))},onResetColumns:()=>{D(new Set),wn(ee(),[])},onOpen:i=>he(i.sessionId),onSelect:(i,d)=>l(c=>{let b=new Set(c);return d?b.add(i):b.delete(i),b}),onSelectAll:i=>l(d=>{let c=new Set(d);for(let b of je)i?c.add(b.sessionId):c.delete(b.sessionId);return c}),onSort:i=>{g===i?T(I==="asc"?"desc":"asc"):(w(i),T(i==="spawnedAt"||i==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(uo,{rows:Fn,selected:f,hidden:N!=="board",order:U,animated:ne,dragColId:j,dragOverCol:K,onAnimated:()=>q(!0),onMoveColumn:ys,onMoveColumnTo:ks,onDragCol:ae,onDragOverCol:le,onToggleSelect:i=>l(d=>{let c=new Set(d);return c.has(i.sessionId)?c.delete(i.sessionId):c.add(i.sessionId),c}),onOpen:i=>he(i.sessionId),onHistory:Ye,onLocate:i=>hn(i),onRestart:(i,d)=>{qe(i,d)},onLock:(i,d,c)=>{We(i,d,c)},onClose:(i,d)=>{yn(i,d)}}),(0,n.jsx)(go,{rows:be,relationRows:e,selected:f,hidden:N!=="topics",onToggleSelect:i=>l(d=>{let c=new Set(d);return c.has(i.sessionId)?c.delete(i.sessionId):c.add(i.sessionId),c}),onOpen:i=>he(i.sessionId),onHistory:Ye,onLocate:i=>hn(i),onRestart:(i,d)=>{qe(i,d)},onLock:(i,d,c)=>{We(i,d,c)},onClose:(i,d)=>{yn(i,d)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:ss,className:`sessions-kanban${$==="bot"?" kanban-mode-bot":""}`,hidden:N!=="kanban",children:N==="kanban"?(0,n.jsx)(Gt,{host:ts,...ws,canRestartSession:an,getTeamChatIds:fn,icons:{details:H.details,feishu:H.feishu,history:H.history,lock:H.lock,restart:H.restart,terminal:H.terminal,unlock:H.unlock},lockActionLabel:on,sessionStatusText:Je,onDetails:i=>he(String(i.sessionId)),onHistory:Ye,onMoveRows:cs,onNeedTeamBoard:i=>{ls(i)},onNeedTeams:()=>{bn()},onOpenTerminal:Oe()?ms:void 0,onRename:(i,d)=>{let c=Re.sessions.get(String(i.sessionId));c&&Vn(c,d)},onRestart:(i,d)=>{let c=Re.sessions.get(String(i.sessionId));c&&qe(c,d)},onTeamScope:i=>He(i?o("sessions.kanban.teamScope",{chats:i.chats,sessions:i.sessions}):""),onToggleLock:(i,d)=>{let c=Re.sessions.get(String(i.sessionId));c&&We(c,!c.locked,d)},onToggleSelect:i=>l(d=>{let c=String(i.sessionId),b=new Set(d);return b.has(c)?b.delete(c):b.add(c),b}),selectedSessionIds:f}):null})]},ce),(0,n.jsx)(wo,{row:Cs,onClose:()=>he(null),locateSession:hn,openHistory:Ye,resumeSession:ds,restartSession:qe,closeSession:yn,setSessionLocked:We,startSession:us}),(0,n.jsx)(ho,{state:ns,onClose:()=>cn(null),onRename:Vn}),(0,n.jsx)(po,{state:es,onClose:()=>Ue(null)}),dn?(0,Kn.createPortal)((0,n.jsx)(Co,{dialog:dn,state:as,onClose:Is,onSuccess:i=>Ve(d=>d&&{...d,success:i})}),dn):null]})}function ta(e){return mt(e,(0,n.jsx)(So,{}))}export{ao as CliFilterGroup,go as TopicGroupsView,ta as renderSessionsPage};