botmux 2.114.0 → 3.0.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 (136) hide show
  1. package/dist/adapters/backend/riff-backend.d.ts +15 -0
  2. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  3. package/dist/adapters/backend/riff-backend.js +9 -3
  4. package/dist/adapters/backend/riff-backend.js.map +1 -1
  5. package/dist/core/dashboard-ipc-server.js +2 -2
  6. package/dist/core/dashboard-ipc-server.js.map +1 -1
  7. package/dist/dashboard/compat.d.ts +19 -0
  8. package/dist/dashboard/compat.d.ts.map +1 -0
  9. package/dist/dashboard/compat.js +38 -0
  10. package/dist/dashboard/compat.js.map +1 -0
  11. package/dist/dashboard/stale-chunk-module.d.ts +3 -0
  12. package/dist/dashboard/stale-chunk-module.d.ts.map +1 -0
  13. package/dist/dashboard/stale-chunk-module.js +55 -0
  14. package/dist/dashboard/stale-chunk-module.js.map +1 -0
  15. package/dist/dashboard/web/app.d.ts.map +1 -1
  16. package/dist/dashboard/web/app.js +64 -2
  17. package/dist/dashboard/web/app.js.map +1 -1
  18. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  19. package/dist/dashboard/web/bot-defaults-page.js +9 -7
  20. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  21. package/dist/dashboard/web/i18n.js +10 -10
  22. package/dist/dashboard/web/i18n.js.map +1 -1
  23. package/dist/dashboard/web/sessions-page.js +2 -2
  24. package/dist/dashboard/web/sessions-page.js.map +1 -1
  25. package/dist/dashboard/web/stale-chunk-reload.d.ts +16 -0
  26. package/dist/dashboard/web/stale-chunk-reload.d.ts.map +1 -0
  27. package/dist/dashboard/web/stale-chunk-reload.js +51 -0
  28. package/dist/dashboard/web/stale-chunk-reload.js.map +1 -0
  29. package/dist/dashboard-web/app.js +1 -1
  30. package/dist/dashboard-web/chunks/{bot-defaults-page-SRCBF7Z3.js → bot-defaults-page-MBORWWP7.js} +5 -5
  31. package/dist/dashboard-web/chunks/{chunk-3H6MVXXU.js → chunk-4QTBR7UF.js} +2 -2
  32. package/dist/dashboard-web/chunks/{chunk-77KD4TK2.js → chunk-7STGZ5BX.js} +1 -1
  33. package/dist/dashboard-web/chunks/{chunk-D2I5F4MY.js → chunk-EIO5AWDA.js} +1 -1
  34. package/dist/dashboard-web/chunks/{chunk-NGRUZCXP.js → chunk-G43RUPUN.js} +1 -1
  35. package/dist/dashboard-web/chunks/{connectors-page-RM3BJVMV.js → connectors-page-LKDT4WBG.js} +1 -1
  36. package/dist/dashboard-web/chunks/{groups-page-3D4YSYLA.js → groups-page-XKIWJ2TP.js} +1 -1
  37. package/dist/dashboard-web/chunks/{insights-page-CRFJKA54.js → insights-page-CBEZCYKV.js} +1 -1
  38. package/dist/dashboard-web/chunks/{monitor-room-HLK3XDT2.js → monitor-room-AQTHAWXA.js} +1 -1
  39. package/dist/dashboard-web/chunks/{monitoring-page-E3SNZFFN.js → monitoring-page-2R4NCNBQ.js} +1 -1
  40. package/dist/dashboard-web/chunks/{office-page-MKQ2TENK.js → office-page-5M6MQIIL.js} +1 -1
  41. package/dist/dashboard-web/chunks/{overview-page-ICFKKRLV.js → overview-page-N22HDZ2V.js} +1 -1
  42. package/dist/dashboard-web/chunks/{roles-page-2DFJ7YRU.js → roles-page-J6K2HWFX.js} +1 -1
  43. package/dist/dashboard-web/chunks/{schedules-page-S4WDIXH5.js → schedules-page-CGAQCB4J.js} +1 -1
  44. package/dist/dashboard-web/chunks/{sessions-page-4XWGUGB5.js → sessions-page-WJ2QYTIE.js} +2 -2
  45. package/dist/dashboard-web/chunks/{settings-page-OBTE4LYP.js → settings-page-GLRWV5KU.js} +1 -1
  46. package/dist/dashboard-web/chunks/{skills-page-CTRQJR47.js → skills-page-KQVW42QU.js} +1 -1
  47. package/dist/dashboard-web/chunks/{team-federation-page-GICLDKJP.js → team-federation-page-5PYUOV5M.js} +1 -1
  48. package/dist/dashboard-web/chunks/{v3-page-DI55IRL5.js → v3-page-DXPFILRZ.js} +1 -1
  49. package/dist/dashboard-web/chunks/{whiteboards-page-7KFWMILV.js → whiteboards-page-NUH6VZ4I.js} +1 -1
  50. package/dist/dashboard.js +26 -0
  51. package/dist/dashboard.js.map +1 -1
  52. package/dist/desktop/main/auto-start.d.ts +17 -0
  53. package/dist/desktop/main/auto-start.d.ts.map +1 -0
  54. package/dist/desktop/main/auto-start.js +37 -0
  55. package/dist/desktop/main/auto-start.js.map +1 -0
  56. package/dist/desktop/main/dashboard-compat.d.ts +25 -0
  57. package/dist/desktop/main/dashboard-compat.d.ts.map +1 -0
  58. package/dist/desktop/main/dashboard-compat.js +117 -0
  59. package/dist/desktop/main/dashboard-compat.js.map +1 -0
  60. package/dist/desktop/main/external-runtime.d.ts +29 -0
  61. package/dist/desktop/main/external-runtime.d.ts.map +1 -0
  62. package/dist/desktop/main/external-runtime.js +202 -0
  63. package/dist/desktop/main/external-runtime.js.map +1 -0
  64. package/dist/desktop/main/ipc.d.ts +20 -0
  65. package/dist/desktop/main/ipc.d.ts.map +1 -0
  66. package/dist/desktop/main/ipc.js +241 -0
  67. package/dist/desktop/main/ipc.js.map +1 -0
  68. package/dist/desktop/main/log-service.d.ts +4 -0
  69. package/dist/desktop/main/log-service.d.ts.map +1 -0
  70. package/dist/desktop/main/log-service.js +53 -0
  71. package/dist/desktop/main/log-service.js.map +1 -0
  72. package/dist/desktop/main/login-item.d.ts +10 -0
  73. package/dist/desktop/main/login-item.d.ts.map +1 -0
  74. package/dist/desktop/main/login-item.js +11 -0
  75. package/dist/desktop/main/login-item.js.map +1 -0
  76. package/dist/desktop/main/node-command.d.ts +22 -0
  77. package/dist/desktop/main/node-command.d.ts.map +1 -0
  78. package/dist/desktop/main/node-command.js +56 -0
  79. package/dist/desktop/main/node-command.js.map +1 -0
  80. package/dist/desktop/main/paths.d.ts +11 -0
  81. package/dist/desktop/main/paths.d.ts.map +1 -0
  82. package/dist/desktop/main/paths.js +13 -0
  83. package/dist/desktop/main/paths.js.map +1 -0
  84. package/dist/desktop/main/pm2-apps.d.ts +15 -0
  85. package/dist/desktop/main/pm2-apps.d.ts.map +1 -0
  86. package/dist/desktop/main/pm2-apps.js +97 -0
  87. package/dist/desktop/main/pm2-apps.js.map +1 -0
  88. package/dist/desktop/main/runtime-service.d.ts +49 -0
  89. package/dist/desktop/main/runtime-service.d.ts.map +1 -0
  90. package/dist/desktop/main/runtime-service.js +297 -0
  91. package/dist/desktop/main/runtime-service.js.map +1 -0
  92. package/dist/desktop/main/runtime-source.d.ts +17 -0
  93. package/dist/desktop/main/runtime-source.d.ts.map +1 -0
  94. package/dist/desktop/main/runtime-source.js +61 -0
  95. package/dist/desktop/main/runtime-source.js.map +1 -0
  96. package/dist/desktop/main/tray.d.ts +10 -0
  97. package/dist/desktop/main/tray.d.ts.map +1 -0
  98. package/dist/desktop/main/tray.js +27 -0
  99. package/dist/desktop/main/tray.js.map +1 -0
  100. package/dist/desktop/main/window.d.ts +16 -0
  101. package/dist/desktop/main/window.d.ts.map +1 -0
  102. package/dist/desktop/main/window.js +113 -0
  103. package/dist/desktop/main/window.js.map +1 -0
  104. package/dist/desktop/main.d.ts +2 -0
  105. package/dist/desktop/main.d.ts.map +1 -0
  106. package/dist/desktop/main.js +175 -0
  107. package/dist/desktop/main.js.map +1 -0
  108. package/dist/desktop/preload.d.ts +2 -0
  109. package/dist/desktop/preload.d.ts.map +1 -0
  110. package/dist/desktop/preload.js +24 -0
  111. package/dist/desktop/preload.js.map +1 -0
  112. package/dist/desktop/renderer/app.d.ts +35 -0
  113. package/dist/desktop/renderer/app.d.ts.map +1 -0
  114. package/dist/desktop/renderer/app.js +945 -0
  115. package/dist/desktop/renderer/app.js.map +1 -0
  116. package/dist/desktop/renderer/dashboard-url.d.ts +13 -0
  117. package/dist/desktop/renderer/dashboard-url.d.ts.map +1 -0
  118. package/dist/desktop/renderer/dashboard-url.js +98 -0
  119. package/dist/desktop/renderer/dashboard-url.js.map +1 -0
  120. package/dist/desktop/renderer/runtime-state.d.ts +8 -0
  121. package/dist/desktop/renderer/runtime-state.d.ts.map +1 -0
  122. package/dist/desktop/renderer/runtime-state.js +67 -0
  123. package/dist/desktop/renderer/runtime-state.js.map +1 -0
  124. package/dist/desktop/shared/types.d.ts +48 -0
  125. package/dist/desktop/shared/types.d.ts.map +1 -0
  126. package/dist/desktop/shared/types.js +2 -0
  127. package/dist/desktop/shared/types.js.map +1 -0
  128. package/dist/desktop/smoke.d.ts +28 -0
  129. package/dist/desktop/smoke.d.ts.map +1 -0
  130. package/dist/desktop/smoke.js +258 -0
  131. package/dist/desktop/smoke.js.map +1 -0
  132. package/dist/utils/version-info.d.ts +25 -0
  133. package/dist/utils/version-info.d.ts.map +1 -0
  134. package/dist/utils/version-info.js +48 -0
  135. package/dist/utils/version-info.js.map +1 -0
  136. package/package.json +9 -1
@@ -1,3 +1,3 @@
1
- import{a as lt,c as dt,h as ct}from"./chunk-DFLNXQNT.js";import{a as mn,c as rt}from"./chunk-SZOB6VK2.js";import{a as at,b as it}from"./chunk-D2I5F4MY.js";import{c as fe,g as ot,p as Be}from"./chunk-I35DXGM4.js";import{A as tt,C as te,D as ge,E as se,G as Fe,a as he,f as Jn,g as zn,h as Xn,i as Vn,j as cn,k as Wn,l as Gn,m as qn,n as Yn,o as un,p as Qn,q as Zn,r as ke,s as o,t as et,u as we,w as me,y as nt}from"./chunk-3H6MVXXU.js";import{a as st}from"./chunk-SYC6D5XU.js";import{a as jn,b as ls,d as je}from"./chunk-5THX4DI2.js";import{c as ye}from"./chunk-7SZRL6FY.js";var c=ye(jn(),1),Mn=ye(ls(),1);var gn=[24,72,168],ds=new Set(gn);function fn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!ds.has(t)?null:t}function cs(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function us(e,t=Date.now()){return t-e*60*60*1e3}function ms(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let i=cs(e.lastMessageAt);return i!==null&&i<us(t,s)}function ut(e,t,s=Date.now()){return e.filter(i=>ms(i,t,s))}var mt={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"},to=new Set(Object.values(mt)),gs={"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"},gt=Object.values(mt).map(e=>({id:e,label:gs[e]??e}));function Je(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function bn(e){let t=Je(e);return t===null?"-":t.toLocaleString("en-US")}var be=[...gt.map(e=>e.id),"unknown"],pn=[{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 yn(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var bt=["starting","working","idle","dormant","analyzing","active","limited","closed"];function De(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,i=o(s);return i===s?t:i}function pt(e){let t=0,s=0,i=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&i++);return{logical:t,resident:s,dormant:i}}function hn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function ft(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Ce(e){let t=String(e?.chatId??"").trim(),s=ge(e);return s?`${ft(e)} \xB7 ${s}`:t?`${ft(e)} \xB7 ${t}`:o("sessions.chatUnknown")}function kn(e,t=ge){return!!String(e?.chatId??"").trim()&&!t(e)}function wn(e){let t=Ce(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function yt(e){return`${JSON.stringify(e)} ${Ce(e)} ${wn(e)}`.toLowerCase()}var Pe=lt;function Cn(e=ke){return e.authed?!0:(e.publicReadOnly,!1)}var R={pin:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 14.3s4.2-3.9 4.2-7.3A4.2 4.2 0 0 0 8 2.9a4.2 4.2 0 0 0-4.2 4.1C3.8 10.4 8 14.3 8 14.3z"/><circle cx="8" cy="6.9" r="1.5"/></svg>',openChat:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.8h3.8v3.8"/><path d="M13.2 2.8 7.3 8.7"/><path d="M11.5 9.3v2.9a1.2 1.2 0 0 1-1.2 1.2H3.8a1.2 1.2 0 0 1-1.2-1.2V5.7a1.2 1.2 0 0 1 1.2-1.2h2.9"/></svg>',details:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.6" width="11.2" height="10.8" rx="2"/><path d="M5.2 5.4h5.6"/><path d="M5.2 8h5.6"/><path d="M5.2 10.6h3.2"/></svg>',terminal:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="1.8" y="2.2" width="12.4" height="10.5" rx="2"/><path d="M1.8 5h12.4"/><circle cx="4" cy="3.6" r=".45" fill="currentColor" stroke="none"/><path d="m4.2 7.3 1.8 1.6-1.8 1.6"/><path d="M8 10.6h3.4"/></svg>',key:'<svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="6" cy="6.1" r="3"/><path d="M8.1 8.2 13 13.1"/><path d="M11.3 11.4 12.6 10.1"/><path d="M12.7 12.8 13.7 11.8"/></svg>',lock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.4a2.9 2.9 0 0 1 5.8 0V7"/><path d="M8 9.5v1.4"/></svg>',unlock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.3a2.9 2.9 0 0 1 5.1-1.9"/><path d="M8 9.5v1.4"/></svg>',close:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4.2 4.2 11.8 11.8"/><path d="M11.8 4.2 4.2 11.8"/></svg>',edit:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10.7 3.3 12.7 5.3 6.3 11.7 3.7 12.3 4.3 9.7 10.7 3.3z"/></svg>',history:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 7.8a4.8 4.8 0 1 0 1.4-3.4"/><path d="M3.2 3.1v3.2h3.2"/><path d="M8 5.4v3l2.1 1.2"/></svg>',restart:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M12.7 6.5A4.8 4.8 0 1 0 13 9"/><path d="M12.7 3.3v3.2H9.5"/></svg>',feishu:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 5.2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v3.3a2 2 0 0 1-2 2H7.1L4.3 13v-2.5H5"/><path d="M9.1 3.2h3.7v3.7"/><path d="M12.8 3.2 8.5 7.5"/></svg>'};function ze(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function ht(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let i=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await i.json().catch(()=>({}));if(!i.ok||r?.ok===!1||!r?.url){s?.close(),i.status!==401&&alert(`${o("sessions.writeLinkFail")}: ${r?.error??i.status}`);return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(i){s?.close(),alert(`${o("sessions.writeLinkFail")}: ${i}`)}finally{t&&(t.disabled=!1)}}function Sn(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,i=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${i||r||"unknown"}`}function kt(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 wt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),i=ke.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${i}${De(t)}`,`${o("sessions.restartConfirmCli")}${i}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
1
+ import{a as lt,c as dt,h as ct}from"./chunk-DFLNXQNT.js";import{a as mn,c as rt}from"./chunk-SZOB6VK2.js";import{a as at,b as it}from"./chunk-EIO5AWDA.js";import{c as fe,g as ot,p as Be}from"./chunk-I35DXGM4.js";import{A as tt,C as te,D as ge,E as se,G as Fe,a as he,f as Jn,g as zn,h as Xn,i as Vn,j as cn,k as Wn,l as Gn,m as qn,n as Yn,o as un,p as Qn,q as Zn,r as ke,s as o,t as et,u as we,w as me,y as nt}from"./chunk-4QTBR7UF.js";import{a as st}from"./chunk-SYC6D5XU.js";import{a as jn,b as ls,d as je}from"./chunk-5THX4DI2.js";import{c as ye}from"./chunk-7SZRL6FY.js";var c=ye(jn(),1),Mn=ye(ls(),1);var gn=[24,72,168],ds=new Set(gn);function fn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!ds.has(t)?null:t}function cs(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function us(e,t=Date.now()){return t-e*60*60*1e3}function ms(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let i=cs(e.lastMessageAt);return i!==null&&i<us(t,s)}function ut(e,t,s=Date.now()){return e.filter(i=>ms(i,t,s))}var mt={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"},to=new Set(Object.values(mt)),gs={"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"},gt=Object.values(mt).map(e=>({id:e,label:gs[e]??e}));function Je(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function bn(e){let t=Je(e);return t===null?"-":t.toLocaleString("en-US")}var be=[...gt.map(e=>e.id),"unknown"],pn=[{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 yn(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var bt=["starting","working","idle","dormant","analyzing","active","limited","closed"];function De(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,i=o(s);return i===s?t:i}function pt(e){let t=0,s=0,i=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&i++);return{logical:t,resident:s,dormant:i}}function hn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function ft(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Ce(e){let t=String(e?.chatId??"").trim(),s=ge(e);return s?`${ft(e)} \xB7 ${s}`:t?`${ft(e)} \xB7 ${t}`:o("sessions.chatUnknown")}function kn(e,t=ge){return!!String(e?.chatId??"").trim()&&!t(e)}function wn(e){let t=Ce(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function yt(e){return`${JSON.stringify(e)} ${Ce(e)} ${wn(e)}`.toLowerCase()}var Pe=lt;function Cn(e=ke){return e.authed?!0:(e.publicReadOnly,!1)}var R={pin:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 14.3s4.2-3.9 4.2-7.3A4.2 4.2 0 0 0 8 2.9a4.2 4.2 0 0 0-4.2 4.1C3.8 10.4 8 14.3 8 14.3z"/><circle cx="8" cy="6.9" r="1.5"/></svg>',openChat:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.8h3.8v3.8"/><path d="M13.2 2.8 7.3 8.7"/><path d="M11.5 9.3v2.9a1.2 1.2 0 0 1-1.2 1.2H3.8a1.2 1.2 0 0 1-1.2-1.2V5.7a1.2 1.2 0 0 1 1.2-1.2h2.9"/></svg>',details:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.6" width="11.2" height="10.8" rx="2"/><path d="M5.2 5.4h5.6"/><path d="M5.2 8h5.6"/><path d="M5.2 10.6h3.2"/></svg>',terminal:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="1.8" y="2.2" width="12.4" height="10.5" rx="2"/><path d="M1.8 5h12.4"/><circle cx="4" cy="3.6" r=".45" fill="currentColor" stroke="none"/><path d="m4.2 7.3 1.8 1.6-1.8 1.6"/><path d="M8 10.6h3.4"/></svg>',key:'<svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="6" cy="6.1" r="3"/><path d="M8.1 8.2 13 13.1"/><path d="M11.3 11.4 12.6 10.1"/><path d="M12.7 12.8 13.7 11.8"/></svg>',lock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.4a2.9 2.9 0 0 1 5.8 0V7"/><path d="M8 9.5v1.4"/></svg>',unlock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.3a2.9 2.9 0 0 1 5.1-1.9"/><path d="M8 9.5v1.4"/></svg>',close:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4.2 4.2 11.8 11.8"/><path d="M11.8 4.2 4.2 11.8"/></svg>',edit:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10.7 3.3 12.7 5.3 6.3 11.7 3.7 12.3 4.3 9.7 10.7 3.3z"/></svg>',history:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 7.8a4.8 4.8 0 1 0 1.4-3.4"/><path d="M3.2 3.1v3.2h3.2"/><path d="M8 5.4v3l2.1 1.2"/></svg>',restart:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M12.7 6.5A4.8 4.8 0 1 0 13 9"/><path d="M12.7 3.3v3.2H9.5"/></svg>',feishu:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 5.2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v3.3a2 2 0 0 1-2 2H7.1L4.3 13v-2.5H5"/><path d="M9.1 3.2h3.7v3.7"/><path d="M12.8 3.2 8.5 7.5"/></svg>'};function ze(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function ht(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let i=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await i.json().catch(()=>({}));if(!i.ok||r?.ok===!1||!r?.url){s?.close(),i.status!==401&&alert(`${o("sessions.writeLinkFail")}: ${r?.error??i.status}`);return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(i){s?.close(),alert(`${o("sessions.writeLinkFail")}: ${i}`)}finally{t&&(t.disabled=!1)}}function Sn(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,i=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${i||r||"unknown"}`}function kt(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 wt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),i=ke.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${i}${De(t)}`,`${o("sessions.restartConfirmCli")}${i}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
2
2
  `)}function Xe(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo}async function Ct(){try{let e=await fetch("/api/groups");if(!e.ok)return[];let t=await e.json();return(Array.isArray(t?.bots)?t.bots:[]).filter(i=>i&&typeof i.larkAppId=="string").map(i=>({larkAppId:i.larkAppId,botName:typeof i.botName=="string"&&i.botName?i.botName:i.larkAppId}))}catch{return[]}}var T=ye(jn(),1);var St=["backlog","todo","in_progress","in_review","done"];function vt(e){return typeof e=="string"&&St.includes(e)?e:null}function It(e){if(e.status==="closed")return"done";let t=vt(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 fs=1e15;function Se(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 fs-t}function vn(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var w=ye(je(),1),Tt=[{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"}],In=50;function Nt(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function bs(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function ps(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 ys(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 Te(e){return{__html:e}}function Ve(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function hs(e){return se(e.title)||e.sessionId}function xt(e){let t=[],s=new Map;for(let f of e){let g=String(f.chatId??f.sessionId),m=s.get(g);m||(m={chatId:g,rows:[]},s.set(g,m),t.push(m)),m.rows.push(f)}let i=[];return{clusters:t.map(f=>(i.push(...f.rows),f.rows.length<2?{type:"card",row:f.rows[0]}:{type:"cluster",chatId:f.chatId,rows:f.rows})),flat:i}}function Mt(e){let t=new Map(Tt.map(i=>[i.id,[]]));for(let i of e)t.get(It(i)).push(i);return{columns:Tt.map(i=>{let r=(t.get(i.id)??[]).sort((y,S)=>Se(y)-Se(S)),f=0;i.id==="done"&&r.length>In&&(f=r.length-In,r=r.slice(0,In));let{clusters:g,flat:m}=xt(r);return t.set(i.id,m),{id:i.id,labelKey:i.labelKey,rows:r,clusters:g,hiddenCount:f}}),groups:t}}function ks(e){let t=new Map;for(let s of e){if(s.status==="closed")continue;let i=String(s.larkAppId||s.botName||"unknown"),r=t.get(i);r||(r={name:te(s),larkAppId:s.larkAppId,rows:[]},t.set(i,r)),r.rows.push(s)}return[...t.values()].sort((s,i)=>s.name.localeCompare(i.name)).map(s=>{let i=s.rows.sort((f,g)=>Number(g.lastMessageAt??0)-Number(f.lastMessageAt??0)),{clusters:r}=xt(i);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:i,clusters:r}})}function Tn(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function ws(e){if(e.groupBy==="bot"){let i=e.rows.filter(r=>!Ve(r));return{mode:"bot",columns:ks(i),groups:new Map,rowById:Tn(i),team:null,scope:null}}if(e.groupBy==="team"){if(!e.teamsLoaded)return{mode:"loading",groups:new Map,rowById:new Map,team:null,scope:null};let i=e.teams.find(I=>I.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(i??void 0),f=i?e.rows.filter(I=>r.has(String(I.chatId))):[],g=(e.teamBoardKey===i?.key?e.teamBoardData?.board:null)??{},m=(e.teamBoardKey===i?.key?e.teamBoardData?.remoteRows:null)??[],y=[...f,...m].map(I=>{let v=g[String(I.sessionId)];return v?{...I,kanbanColumn:v.column,kanbanPosition:v.position}:I}),{columns:S,groups:L}=Mt(y);return{mode:"flow",columns:S,groups:L,rowById:Tn(y),team:i,scope:{chats:r.size,sessions:y.length}}}let{columns:t,groups:s}=Mt(e.rows);return{mode:"flow",columns:t,groups:s,rowById:Tn(e.rows),team:null,scope:null}}function Cs(e){let t=new Map;return e?.querySelectorAll(".kanban-col-list").forEach(s=>{let i=s.closest(".kanban-column")?.dataset.col;i&&s.scrollTop&&t.set(i,s.scrollTop)}),t}function Ss(e,t){t?.size&&e?.querySelectorAll(".kanban-col-list").forEach(s=>{let i=s.closest(".kanban-column")?.dataset.col,r=i?t.get(i):void 0;r&&(s.scrollTop=r)})}function Lt(e,t){for(let s of e.querySelectorAll(".kanban-card:not(.dragging)")){if(s.closest(".kanban-cluster.dragging"))continue;let i=s.getBoundingClientRect();if(t<i.top+i.height/2)return s}return null}function Oe(e){return(0,w.jsx)("button",{type:"button",className:`card-act kanban-card-act${e.className?` ${e.className}`:""}`,"data-action":e.action,title:e.label,"aria-label":e.label,onClick:t=>{t.stopPropagation(),e.onClick(t.currentTarget)},dangerouslySetInnerHTML:Te(e.icon)})}function vs(e){let t=se(e.row.title)||"",[s,i]=(0,T.useState)(t),r=(0,T.useRef)(null),f=(0,T.useRef)(!1);(0,T.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let g=(0,T.useCallback)(m=>{if(f.current)return;f.current=!0;let y=s.trim();m&&y&&y!==t&&e.onCommit(e.row,y),e.onCancel()},[t,e,s]);return(0,w.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:m=>i(m.currentTarget.value),onClick:m=>m.stopPropagation(),onBlur:()=>g(!0),onKeyDown:m=>{m.stopPropagation(),m.key==="Enter"?(m.preventDefault(),g(!0)):m.key==="Escape"&&(m.preventDefault(),g(!1))}})}function Et(e){let{callbacks:t,row:s}=e,i=hs(s),r=te(s),f=ge(s),g=bs(s.workingDir),m=ps(s),y=[f,g!=="-"?g:null].filter(Boolean).join(" \xB7 "),S=String(s.status??"unknown"),L=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",I=e.editingId===s.sessionId,v=t.selectedSessionIds.has(String(s.sessionId)),B=["kanban-card",v?"selected":"",L?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),H=L?null:(0,w.jsxs)("span",{className:"kanban-card-actions-rail",children:[(0,w.jsx)(Oe,{action:"history",icon:t.icons.history,label:o("sessions.history.title"),onClick:()=>t.onHistory(s)}),s.webPort?(0,w.jsx)(Oe,{action:"terminal",icon:t.icons.terminal,label:o("sessions.openTerminal"),onClick:()=>t.onOpenTerminal(s)}):null,s.feishuChatLink?(0,w.jsx)("a",{className:"card-act kanban-card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),onClick:E=>E.stopPropagation(),dangerouslySetInnerHTML:Te(t.icons.feishu)}):null,(0,w.jsx)(Oe,{action:"lock",className:s.locked?"locked":"",icon:s.locked?t.icons.unlock:t.icons.lock,label:t.lockActionLabel(s),onClick:E=>t.onToggleLock(s,E)}),(0,w.jsx)(Oe,{action:"details",icon:t.icons.details,label:o("sessions.details"),onClick:()=>t.onDetails(s)}),t.canRestartSession(s)?(0,w.jsx)(Oe,{action:"restart",icon:t.icons.restart,label:o("sessions.restart"),onClick:E=>t.onRestart(s,E)}):null]});return(0,w.jsxs)("article",{className:B,"data-id":s.sessionId,tabIndex:0,role:"button","aria-pressed":v,draggable:!0,onClick:E=>e.onCardClick(s,E),onKeyDown:E=>e.onCardKeyDown(s,E),onDragStart:E=>e.onDragStartCard(s,E),children:[(0,w.jsxs)("div",{className:"kanban-card-top",children:[(0,w.jsx)("span",{className:`badge cli-${Nt(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,w.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,w.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,L?(0,w.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:L}),children:L}):null,H]}),(0,w.jsx)("div",{className:"kanban-card-title-row",children:I?(0,w.jsx)(vs,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,w.jsx)("p",{className:"kanban-card-title",title:String(s.title??i),onDoubleClick:E=>{E.stopPropagation(),e.cancelOpen(),L||e.onBeginEdit(s)},children:String(i).slice(0,140)})}),y||m?(0,w.jsxs)("div",{className:"kanban-card-meta-row",children:[y?(0,w.jsx)("p",{className:"kanban-card-desc",title:y,children:y}):(0,w.jsx)("span",{className:"kanban-card-desc kanban-card-desc-empty","aria-hidden":"true"}),m?(0,w.jsx)("span",{className:"session-signal",title:m,children:m}):null]}):null,(0,w.jsxs)("div",{className:"kanban-card-foot",children:[(0,w.jsx)("span",{className:"kanban-card-owner",dangerouslySetInnerHTML:Te(`${me({name:r,larkAppId:s.larkAppId,size:"sm"})}<span>${et(r)}</span>`)}),(0,w.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:we(s.lastMessageAt)}),(0,w.jsx)("span",{className:"kanban-card-dot","data-status":Nt(S),title:t.sessionStatusText(S)})]})]})]})}function At(e){let t=e.item;if(t.type==="card")return(0,w.jsx)(Et,{...e.cardProps,row:t.row});let s=ge(t.rows[0])??t.chatId,i=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,w.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${i?" dragging":""}`,"data-chat":t.chatId,children:[(0,w.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,w.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:Te(nt({chatId:t.chatId,name:s,size:"sm"}))}),(0,w.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,w.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,w.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,w.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,w.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,w.jsx)(Et,{...e.cardProps,row:r},r.sessionId)):null]})}function Rt(e){let[t,s]=(0,T.useState)(e),[i,r]=(0,T.useState)(null),[f,g]=(0,T.useState)(null),[m,y]=(0,T.useState)(null),[S,L]=(0,T.useState)(null),[I,v]=(0,T.useState)(()=>new Set),B=(0,T.useRef)(null),H=(0,T.useRef)(null),E=(0,T.useRef)(null),V=(0,T.useRef)(new Map),Q=(0,T.useRef)(new Map),J=(0,T.useRef)(f),U=!!i||!!f,P=(0,T.useCallback)(()=>{E.current!==null&&(clearTimeout(E.current),E.current=null)},[]),W=(0,T.useCallback)(u=>{H.current=Cs(e.host),s(u)},[e.host]);(0,T.useEffect)(()=>{if(U){B.current=e;return}W(e)},[W,U,e]),(0,T.useEffect)(()=>{if(U||!B.current)return;let u=B.current;B.current=null,W(u)},[W,U]),(0,T.useLayoutEffect)(()=>{Ss(e.host,H.current),H.current=null},[t,e.host]),(0,T.useEffect)(()=>{J.current=f},[f]),(0,T.useEffect)(()=>()=>P(),[P]);let N=(0,T.useMemo)(()=>ws(t),[t]);(0,T.useLayoutEffect)(()=>{V.current=N.groups,Q.current=N.rowById},[N]),(0,T.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,T.useEffect)(()=>{t.groupBy==="team"&&N.mode==="flow"&&N.team&&t.onNeedTeamBoard(N.team)},[t,N]),(0,T.useEffect)(()=>{t.onTeamScope(N.mode==="flow"?N.scope:null)},[t,N]);let Z=(0,T.useCallback)(()=>{g(null),y(null),L(null)},[]),K=(0,T.useCallback)(u=>{v(k=>{let M=new Set(k);return M.has(u)?M.delete(u):M.add(u),M})},[]),G=(0,T.useCallback)(u=>{P(),!Ve(u)&&r(u.sessionId)},[P]),z=(0,T.useCallback)((u,k)=>{Ve(u)||k.target.closest("a, button, input, label")||(P(),E.current=setTimeout(()=>{E.current=null,t.onToggleSelect(u)},220))},[P,t]),q=(0,T.useCallback)((u,k)=>{k.key!=="Enter"&&k.key!==" "||k.target!==k.currentTarget||Ve(u)||(k.preventDefault(),t.onToggleSelect(u))},[t]),D=(0,T.useCallback)((u,k)=>{t.groupBy!=="bot"&&(P(),g({kind:"card",id:String(u.sessionId)}),k.dataTransfer&&(k.dataTransfer.effectAllowed="move",k.dataTransfer.setData("text/plain",String(u.sessionId))))},[P,t.groupBy]),ve=(0,T.useCallback)((u,k,M)=>{t.groupBy!=="bot"&&(P(),g({kind:"cluster",chatId:u,col:k}),M.dataTransfer&&(M.dataTransfer.effectAllowed="move",M.dataTransfer.setData("text/plain",`cluster:${u}`)))},[P,t.groupBy]),ee=(0,T.useCallback)((u,k)=>{!J.current||t.groupBy==="bot"||(k.preventDefault(),k.dataTransfer&&(k.dataTransfer.dropEffect="move"),y(u),L(Lt(k.currentTarget,k.clientY)?.dataset.id??null))},[t.groupBy]),Ie=(0,T.useCallback)((u,k)=>{let M=J.current;if(!M||t.groupBy==="bot")return;k.preventDefault();let O=Lt(k.currentTarget,k.clientY);Z();let A=V.current,X=u;if(M.kind==="cluster"){let ae=(A.get(M.col)??[]).filter(j=>String(j.chatId)===M.chatId).filter(j=>!(j.status==="closed"&&X!=="done"));if(!ae.length)return;let Me=new Set(ae.map(j=>j.sessionId)),ce=(A.get(X)??[]).filter(j=>!Me.has(j.sessionId)),ie=O?ce.findIndex(j=>j.sessionId===O.dataset.id):ce.length;ie<0&&(ie=ce.length);let Ke=ie>0?ce[ie-1]:null,Le=ie<ce.length?ce[ie]:null,Ge=vn(Ke?Se(Ke):null,Le?Se(Le):null);t.onMoveRows(ae.map((j,qe)=>({row:j,column:X,position:Ge+qe*.001})));return}let pe=Q.current.get(M.id);if(!pe||pe.status==="closed"&&X!=="done")return;let ne=(A.get(X)??[]).filter(ae=>ae.sessionId!==M.id),de=O?ne.findIndex(ae=>ae.sessionId===O.dataset.id):ne.length;de<0&&(de=ne.length);let $e=de>0?ne[de-1]:null,He=de<ne.length?ne[de]:null,Ne=vn($e?Se($e):null,He?Se(He):null);t.onMoveRows([{row:pe,column:X,position:Ne}])},[Z,t]),F={dragId:f?.kind==="card"?f.id:null,dropBeforeId:S,editingId:i,groupBy:t.groupBy,callbacks:t,cancelOpen:P,onBeginEdit:G,onCardClick:z,onCardKeyDown:q,onDragStartCard:D,onEditDone:()=>r(null)};return N.mode==="loading"?(0,w.jsx)(fe,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):N.mode==="bot"?N.columns.length?(0,w.jsx)(w.Fragment,{children:N.columns.map(u=>(0,w.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":u.key,children:[(0,w.jsxs)("header",{children:[(0,w.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:Te(me({name:u.name,larkAppId:u.larkAppId,size:"sm"}))}),(0,w.jsx)("h2",{children:u.name}),(0,w.jsx)("span",{className:"kanban-col-count",children:u.rows.length})]}),(0,w.jsx)("div",{className:"kanban-col-list",onDragOver:k=>ee(u.key,k),onDragEnd:Z,children:u.clusters.map(k=>(0,w.jsx)(At,{item:k,dragCluster:f?.kind==="cluster"?f:null,cardProps:F,expanded:k.type==="cluster"&&I.has(`bot:${u.key}:${k.chatId}`),onToggleExpanded:()=>{k.type==="cluster"&&K(`bot:${u.key}:${k.chatId}`)},onDragStartCluster:ve},k.type==="card"?k.row.sessionId:k.chatId))})]},u.key))}):(0,w.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,w.jsx)(w.Fragment,{children:N.columns.map(u=>(0,w.jsxs)("section",{className:`kanban-column kanban-${u.id}${m===u.id?" drag-over":""}`,"data-col":u.id,onDragOver:k=>ee(u.id,k),onDrop:k=>Ie(u.id,k),onDragEnd:Z,children:[(0,w.jsxs)("header",{children:[(0,w.jsx)("span",{className:"kanban-col-icon",dangerouslySetInnerHTML:Te(ys(u.id))}),(0,w.jsx)("h2",{children:o(u.labelKey)}),(0,w.jsx)("span",{className:"kanban-col-count",children:u.rows.length+u.hiddenCount})]}),(0,w.jsxs)("div",{className:"kanban-col-list",children:[u.rows.length?u.clusters.map(k=>(0,w.jsx)(At,{item:k,columnId:u.id,dragCluster:f?.kind==="cluster"?f:null,cardProps:F,expanded:k.type==="cluster"&&I.has(`${u.id}:${k.chatId}`),onToggleExpanded:()=>{k.type==="cluster"&&K(`${u.id}:${k.chatId}`)},onDragStartCluster:ve},k.type==="card"?k.row.sessionId:k.chatId)):(0,w.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),u.hiddenCount?(0,w.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:u.hiddenCount})}):null]})]},u.id))})}var n=ye(je(),1);function Is(e){return e===168?"7d":`${e}H`}var Ts=gn.map(e=>({value:String(e),label:Is(e)}));function oe(e){return{__html:e}}function Y(){return typeof window>"u"?void 0:window.localStorage}function We(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${yn(t)}`,children:De(t)})}function Ln(e){return e.row.locked?(0,n.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null}function le(e){let t=e.className??`card-act${e.kind?` ${e.kind}`:""}`;return(0,n.jsx)("button",{type:"button",id:e.id,className:t,"data-action":e.action,title:e.label,"aria-label":e.label,disabled:e.disabled,onClick:s=>{s.stopPropagation(),e.onClick(s.currentTarget)},dangerouslySetInnerHTML:oe(e.icon)})}function Dt(e){if(!e.url)return null;let t=!Cn();return(0,n.jsx)("span",{className:`term-pill${t?" readonly":" writable"}`,children:t?(0,n.jsx)("a",{className:"term-btn term-open",href:e.url,target:"_blank",rel:"noopener",title:o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:oe(R.terminal)}):(0,n.jsx)("button",{type:"button",className:"term-btn term-write","data-action":"write-link",title:o("sessions.openTerminal"),"aria-label":o("sessions.openTerminal"),onClick:s=>{s.stopPropagation(),ht(e.row,s.currentTarget)},dangerouslySetInnerHTML:oe(R.terminal)})})}function Pt(e){let t=e.row;return t.scope!=="chat"||!t.feishuChatLink?null:(0,n.jsx)("a",{className:e.className??"card-act",href:t.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.openChat"),"aria-label":o("sessions.openChat"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:oe(R.feishu)})}function Ns(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 Bt(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?Je(e.tokenUsage?.in)??-1:t==="tokenOut"?Je(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?Ce(e).toLowerCase():String(e[t]??"").toLowerCase()}function Ms(e,t,s,i){let r=Bt(e,s),f=Bt(t,s),g=0;return typeof r=="number"&&typeof f=="number"?g=r-f:typeof r=="boolean"&&typeof f=="boolean"?g=Number(r)-Number(f):g=String(r).localeCompare(String(f)),g===0&&(g=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),i==="asc"?g:-g}function Ls(e){return e.agentAttention?.reason?e.agentAttention.reason:e.agentAttention?o("sessions.board.signalAgent"):e.pendingRepo?o("sessions.board.signalRepo"):e.tuiPromptActive?o("sessions.board.signalPrompt"):e.status==="limited"?o("sessions.board.signalLimited"):""}function Es(e,t,s){let i=s==="needs-you"?Fe(e):Number(e.lastMessageAt??0),r=s==="needs-you"?Fe(t):Number(t.lastMessageAt??0);return i!==r?s==="needs-you"?i-r:r-i:String(e.title??e.sessionId).localeCompare(String(t.title??t.sessionId))}function As(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 xs(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 En(e,t){(0,c.useEffect)(()=>{let s=e.current;if(s)if(t){if(!s.open)try{s.showModal()}catch{}}else s.open&&s.close()},[t,e])}function Nn(e){let[t,s]=(0,c.useState)(!1);return(0,n.jsx)("button",{type:"button","data-copy":e.value,onClick:()=>{navigator.clipboard.writeText(e.value),s(!0),window.setTimeout(()=>s(!1),800)},children:t?o("sessions.copied"):o("sessions.copy")})}function Rs(e){let[t,s]=(0,c.useState)(0),[i,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let f=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(f)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:i||t>0,onClick:async()=>{r(!0);let f=await e.locateSession(e.row);r(!1),f&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):i?o("sessions.locating"):o("sessions.locate")})}function Bs(e){let[t,s]=(0,c.useState)(0),[i,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let f=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(f)},[t]),(0,n.jsx)(le,{action:"locate",icon:R.pin,label:t>0?o("sessions.cooldown",{seconds:t}):o("sessions.locate"),disabled:i||t>0,onClick:async()=>{r(!0);let f=await e.onLocate(e.row);r(!1),f&&s(30)}})}function Ds(e){let t=be.filter(i=>e.selected.has(i)).length,s=(0,c.useRef)(null);return(0,c.useEffect)(()=>{let i=()=>{s.current?.open&&(s.current.open=!1)},r=g=>{let m=s.current;m?.open&&!m.contains(g.target)&&i()},f=g=>{g.key==="Escape"&&i()};return document.addEventListener("pointerdown",r,!0),document.addEventListener("keydown",f),()=>{document.removeEventListener("pointerdown",r,!0),document.removeEventListener("keydown",f)}},[]),(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===be.length?void 0:"cli-filter-active",children:t===be.length?o("common.all"):`${t}/${be.length}`})]}),(0,n.jsx)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:be.map(i=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:i,checked:e.selected.has(i),onChange:r=>e.onToggle(i,r.currentTarget.checked)}),(0,n.jsx)("span",{children:i})]},i))})]})}function Ps(e){let t=[{value:"",label:o("sessions.anyStatus")},...bt.map(m=>({value:m,label:De(m)}))],s=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],i=t.find(m=>m.value===e.filters.status)?.label??o("sessions.anyStatus"),r=s.find(m=>m.value===e.filters.adopt)?.label??o("sessions.adoptAny"),f=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],g=f.find(m=>m.value===e.filters.chat)?.label??o("sessions.chatAny");return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters",onSubmit:m=>m.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:m=>{let y=m.currentTarget.value;e.setFilters(S=>({...S,q:y}))}}),(0,n.jsx)(Be,{label:i,value:e.filters.status,options:t,onChange:m=>e.setFilters(y=>({...y,status:m}))}),(0,n.jsx)(Be,{label:r,value:e.filters.adopt,options:s,onChange:m=>e.setFilters(y=>({...y,adopt:m}))}),(0,n.jsx)(Be,{ariaLabel:o("sessions.location"),label:g,value:e.filters.chat,options:f,onChange:m=>e.setFilters(y=>({...y,chat:m}))}),(0,n.jsx)(Ds,{selected:e.filters.cli,onToggle:(m,y)=>{e.setFilters(S=>{let L=new Set(S.cli);return y?L.add(m):L.delete(m),{...S,cli:L}})}}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"showUnknownChats",checked:e.filters.showUnknownChats,onChange:m=>{let y=m.currentTarget.checked;Gn(Y(),y),e.setFilters(S=>({...S,showUnknownChats:y}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.showUnknownChats")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"active",checked:e.filters.active,onChange:m=>{let y=m.currentTarget.checked;e.setFilters(S=>({...S,active:y}))}}),(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)($s,{...e.idleCleanup})]})}function Os(e){let t=!!e.closeProgress||!!e.lockProgress,s=e.lockProgress?.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.lockSelected"),i=e.lockProgress&&!e.lockProgress.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.unlockSelected");return(0,n.jsxs)("div",{id:"bulk-bar",className:"bulk-bar",hidden:e.selectedCount===0,children:[(0,n.jsx)("span",{id:"bulk-count",children:o("sessions.selectedCount",{count:e.selectedCount})}),(0,n.jsx)("button",{type:"button",id:"bulk-monitor-room",disabled:t||e.selectedCount===0,onClick:e.onAddToMonitorRoom,children:e.monitorRoomText??o("sessions.addToMonitorRoom")}),(0,n.jsx)("button",{type:"button",id:"bulk-lock",disabled:t||e.lockDisabled,onClick:()=>e.onLock(!0),children:s}),(0,n.jsx)("button",{type:"button",id:"bulk-unlock",disabled:t||e.unlockDisabled,onClick:()=>e.onLock(!1),children:i}),(0,n.jsx)("button",{type:"button",id:"bulk-close",className:"contrast",disabled:t,onClick:e.onClose,children:e.closeProgress?`${e.closeProgress.done}/${e.closeProgress.total}`:o("sessions.closeSelected")}),(0,n.jsx)("button",{type:"button",id:"bulk-clear",disabled:t,onClick:e.onClear,children:o("sessions.clearSelection")})]})}function $s(e){let[t,s]=(0,c.useState)(!1),[i,r]=(0,c.useState)(e.hours),[f,g]=(0,c.useState)(),m=(0,c.useRef)(null),y=(0,c.useRef)(null),S=(0,c.useRef)(null),L=e.countForHours(i);return(0,c.useEffect)(()=>{t?r(e.hours):g(void 0)},[t,e.hours]),(0,c.useLayoutEffect)(()=>{if(!t)return;let I=()=>{let B=y.current,H=S.current;if(!B||!H)return;let E=12,V=window.innerWidth,Q=window.innerHeight,J=Math.max(0,Math.min(292,V-E*2)),U=B.getBoundingClientRect(),P=H.offsetHeight,W=Math.max(E,V-J-E),N=U.left+U.width/2-J/2,Z=Math.min(Math.max(N,E),W),K=U.bottom+8,G=U.top-P-8,z=K+P<=Q-E||G<E?Math.min(Math.max(K,E),Math.max(E,Q-P-E)):Math.max(E,G);g({left:Z,top:z,width:J})},v=window.requestAnimationFrame(I);return window.addEventListener("resize",I),window.addEventListener("scroll",I,!0),()=>{window.cancelAnimationFrame(v),window.removeEventListener("resize",I),window.removeEventListener("scroll",I,!0)}},[t,e.busy,e.status]),(0,c.useEffect)(()=>{if(!t)return;let I=B=>{let H=B.target;H instanceof Node&&m.current?.contains(H)||H instanceof Node&&S.current?.contains(H)||s(!1)},v=B=>{B.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",I,!0),document.addEventListener("keydown",v),()=>{document.removeEventListener("pointerdown",I,!0),document.removeEventListener("keydown",v)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${L===0?" is-empty":""}${t?" is-open":""}`,ref:m,children:[(0,n.jsxs)("button",{ref:y,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(I=>!I),children:[(0,n.jsxs)("svg",{className:"idle-cleanup-icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,n.jsx)("path",{d:"M3.5 6.5h17"}),(0,n.jsx)("path",{d:"M9 3.5h6"}),(0,n.jsx)("path",{d:"m6.5 6.5.9 13h9.2l.9-13"}),(0,n.jsx)("path",{d:"M10 10.5v5M14 10.5v5"})]}),(0,n.jsx)("span",{children:o("sessions.idleCleanupRun")})]}),t&&typeof document<"u"?(0,Mn.createPortal)((0,n.jsxs)("div",{ref:S,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:f??{visibility:"hidden"},children:[(0,n.jsxs)("div",{className:"idle-cleanup-pop-head",children:[(0,n.jsx)("span",{className:"idle-cleanup-pop-title",children:o("sessions.idleCleanupRun")}),(0,n.jsxs)("span",{id:"idle-cleanup-count",className:"idle-cleanup-count",children:[(0,n.jsx)("span",{className:"idle-cleanup-dot","aria-hidden":"true"}),o("sessions.idleCleanupCount",{count:L})]})]}),(0,n.jsxs)("div",{className:"idle-cleanup-pop-field",children:[(0,n.jsx)("span",{className:"idle-cleanup-label",children:o("sessions.idleCleanupOlderThan")}),(0,n.jsx)("div",{id:"idle-cleanup-threshold",className:"idle-cleanup-threshold-options",role:"radiogroup","aria-label":o("sessions.idleCleanupThreshold"),children:Ts.map(I=>{let v=fn(I.value),B=v===i;return(0,n.jsx)("button",{type:"button",className:B?"active":void 0,"aria-pressed":B?"true":"false",disabled:e.busy,onClick:()=>r(v),children:I.label},I.value)})})]}),e.busy&&e.status?(0,n.jsx)("span",{id:"idle-cleanup-status",className:"idle-cleanup-status","aria-live":"polite",children:e.status}):null,(0,n.jsxs)("div",{className:"idle-cleanup-pop-actions",children:[(0,n.jsx)("button",{type:"button",className:"idle-cleanup-cancel",disabled:e.busy,onClick:()=>s(!1),children:o("sessions.idleCleanupCancel")}),(0,n.jsx)("button",{type:"button",className:"idle-cleanup-confirm",disabled:e.busy||L===0,onClick:()=>{e.onRun(i).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function Hs(e){let t=(0,c.useRef)(null);(0,c.useLayoutEffect)(()=>{t.current&&(t.current.indeterminate=e.selectAllIndeterminate)},[e.selectAllIndeterminate]);let s=[["botName",o("sessions.bot")],["cliId",o("sessions.cli")],["status",o("sessions.status")],["chat",o("sessions.location")],["tokenIn",o("sessions.tokenIn")],["tokenOut",o("sessions.tokenOut")],["title",o("sessions.titleCol")],["workingDir",o("sessions.workingDir")],["spawnedAt",o("sessions.created")],["lastMessageAt",o("sessions.last")],["adopt",o("sessions.adopt")]],i={select:o("sessions.selectSession"),botName:o("sessions.bot"),cliId:o("sessions.cli"),status:o("sessions.status"),chat:o("sessions.location"),tokenIn:o("sessions.tokenIn"),tokenOut:o("sessions.tokenOut"),title:o("sessions.titleCol"),workingDir:o("sessions.workingDir"),spawnedAt:o("sessions.created"),lastMessageAt:o("sessions.last"),adopt:o("sessions.adopt"),actions:o("sessions.actions")};return(0,n.jsxs)("table",{id:"sessions-table",hidden:e.hidden,children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:(0,n.jsx)("input",{ref:t,type:"checkbox",id:"select-all",title:o("sessions.activeOnly"),checked:e.selectAllChecked,disabled:e.selectAllDisabled,onChange:r=>e.onSelectAll(r.currentTarget.checked)})}),s.map(([r,f])=>(0,n.jsx)(Ns,{sort:r,label:f,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},r)),(0,n.jsx)("th",{children:o("sessions.actions")})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(r=>{let f=r.status==="closed",g=String(r.sessionId);return(0,n.jsxs)("tr",{"data-id":g,onClick:()=>e.onOpen(r),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":i.select,onClick:m=>m.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(g),disabled:f,onChange:m=>e.onSelect(g,m.currentTarget.checked)})}),(0,n.jsx)("td",{"data-label":i.botName,children:te(r)}),(0,n.jsx)("td",{"data-label":i.cliId,children:(0,n.jsx)("span",{className:`badge cli-${yn(r.cliId)}`,children:r.cliId??"unknown"})}),(0,n.jsxs)("td",{"data-label":i.status,children:[(0,n.jsx)(We,{status:r.status}),(0,n.jsx)(Ln,{row:r})]}),(0,n.jsx)("td",{className:"session-location-cell","data-label":i.chat,title:wn(r),children:Ce(r)}),(0,n.jsx)("td",{className:"token-cell","data-label":i.tokenIn,children:bn(r.tokenUsage?.in)}),(0,n.jsx)("td",{className:"token-cell","data-label":i.tokenOut,children:bn(r.tokenUsage?.out)}),(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":i.title,title:String(r.title??""),children:se(r.title??"").slice(0,48)}),(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":i.workingDir,title:r.workingDir??"",children:String(r.workingDir??"").slice(-34)}),(0,n.jsx)("td",{"data-label":i.spawnedAt,children:we(r.spawnedAt)}),(0,n.jsx)("td",{"data-label":i.lastMessageAt,children:we(r.lastMessageAt)}),(0,n.jsx)("td",{"data-label":i.adopt,children:r.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null}),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":i.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},g)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:13,className:"empty",children:o("sessions.empty")})})})]})}function Ks(e){let t=e.row,s=se(t.title)||t.sessionId,i=te(t),r=ge(t),f=Pe(t),g=Ls(t),m=hn(t.workingDir),y=S=>{S.target.closest("a, button, input, label")||e.onToggleSelect(t)};return(0,n.jsxs)("article",{className:`session-card${e.selected?" selected":""}${t.locked?" locked":""}`,"data-id":t.sessionId,"aria-pressed":e.selected,onClick:y,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:oe(me({name:i,larkAppId:t.larkAppId,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-card-title",children:[(0,n.jsx)("strong",{title:String(t.title??s),children:String(s).slice(0,72)}),(0,n.jsxs)("span",{children:[i," \xB7 ",r??t.cliId??"unknown"]})]}),(0,n.jsxs)("span",{className:"session-card-status-group",children:[(0,n.jsx)(We,{status:t.status}),(0,n.jsx)(Ln,{row:t})]})]}),m!=="-"||t.adopt||g?(0,n.jsxs)("div",{className:"session-card-meta",children:[m!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:m}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,g?(0,n.jsx)("span",{className:"session-signal",title:g,children:g}):null]}):null,(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${we(Fe(t))}`:`${o("sessions.last")}: ${we(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(Pt,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(Bs,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(le,{action:"details",icon:R.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),Xe(t)?(0,n.jsx)(le,{action:"restart",icon:R.restart,label:o("sessions.restart"),onClick:S=>e.onRestart(t,S)}):null,(0,n.jsx)(Dt,{row:t,url:f}),(0,n.jsx)(le,{action:"lock",icon:t.locked?R.unlock:R.lock,label:ze(t),kind:t.locked?"locked":"",onClick:S=>e.onLock(t,!t.locked,S)}),(0,n.jsx)(le,{action:"close",icon:R.close,label:o("sessions.close"),kind:"danger",onClick:S=>e.onClose(t,S)})]})]})}function _s(e){(0,c.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(pn.map(i=>[i.id,[]]));for(let i of e.rows){let r=kt(i);r&&t.get(r).push(i)}let s=e.order.map(i=>pn.find(r=>r.id===i)).filter(i=>!!i);return(0,n.jsx)("div",{id:"sessions-board",className:`sessions-board${e.animated||e.hidden?"":" board-enter"}`,hidden:e.hidden,children:s.map((i,r)=>{let f=(t.get(i.id)??[]).sort((g,m)=>Es(g,m,i.id));return(0,n.jsxs)("section",{className:`session-board-column session-board-${i.id}${e.dragColId===i.id?" dragging":""}${e.dragOverCol===i.id?" drag-over":""}`,"data-col":i.id,onDragOver:g=>{e.dragColId&&(g.preventDefault(),g.dataTransfer&&(g.dataTransfer.dropEffect="move"),e.dragColId!==i.id&&e.onDragOverCol(i.id))},onDrop:g=>{e.dragColId&&(g.preventDefault(),e.onMoveColumnTo(e.dragColId,i.id),e.onDragCol(null),e.onDragOverCol(null))},children:[(0,n.jsxs)("header",{draggable:!0,title:o("sessions.board.dragHint"),onDragStart:g=>{e.onDragCol(i.id),g.dataTransfer&&(g.dataTransfer.effectAllowed="move",g.dataTransfer.setData("text/plain",i.id))},onDragEnd:()=>{e.onDragCol(null),e.onDragOverCol(null)},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{children:o(i.labelKey)}),(0,n.jsx)("p",{children:o(i.hintKey)})]}),(0,n.jsxs)("span",{className:"session-board-head-right",children:[(0,n.jsxs)("span",{className:"session-board-move",children:[(0,n.jsx)("button",{type:"button","data-move-col":i.id,"data-dir":"-1","aria-label":o("sessions.board.moveLeft"),disabled:r===0,onClick:()=>e.onMoveColumn(i.id,-1),children:"\u2039"}),(0,n.jsx)("button",{type:"button","data-move-col":i.id,"data-dir":"1","aria-label":o("sessions.board.moveRight"),disabled:r===s.length-1,onClick:()=>e.onMoveColumn(i.id,1),children:"\u203A"})]}),(0,n.jsx)("span",{className:"session-board-count",children:f.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:f.length?f.map(g=>(0,n.jsx)(Ks,{row:g,selected:e.selected.has(g.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},g.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},i.id)})})}function Us(e){let t=e.message,s=t.senderType==="user",i=t.senderType==="app"||t.senderType==="bot",r=s?t.senderName||(e.ownerOpenId&&t.senderId===e.ownerOpenId?o("sessions.history.owner"):o("sessions.history.user")):t.senderName||String(t.senderId??"").slice(0,16)||o(i?"sessions.history.bot":"sessions.history.system"),f=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:oe(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:As(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:f})]})]})}function Fs(e){let t=(0,c.useRef)(null);En(t,!!e.state);let s=e.state?he.sessions.get(e.state.sessionId):null,i=(0,c.useRef)(null),r=!!e.state&&!e.state.loading&&!e.state.error&&e.state.messages.length>0;return(0,c.useEffect)(()=>{if(!r)return;let f=i.current;f&&(f.scrollTop=f.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:f=>{f.target===f.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:oe(me({name:te(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(se(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)(le,{id:"history-close",icon:R.close,label:o("sessions.dismiss"),onClick:e.onClose})})]}),(0,n.jsxs)("div",{className:"history-body",ref:i,children:[e.state.loading?(0,n.jsx)(fe,{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((f,g,m)=>(0,n.jsx)(Us,{message:f,ownerOpenId:e.state?.ownerOpenId,groupStart:g===0||Sn(m[g-1])!==Sn(f)},f.messageId??g))}):null]})]}):null})}function js(e){let[t,s]=(0,c.useState)(!1),[i,r]=(0,c.useState)(""),f=(0,c.useRef)(null),g=se(e.row.title)||e.row.sessionId;(0,c.useLayoutEffect)(()=>{if(!t||!f.current)return;let y=f.current;y.focus(),y.select(),(()=>{let L=getComputedStyle(y),I=document.createElement("span");I.style.cssText="position:absolute;visibility:hidden;white-space:pre",I.style.fontSize=L.fontSize,I.style.fontFamily=L.fontFamily,I.style.fontWeight=L.fontWeight,I.style.letterSpacing=L.letterSpacing,I.textContent=y.value||" ",document.body.appendChild(I);let v=Math.round(window.innerWidth*.6);y.style.width=`${Math.min(Math.max(I.offsetWidth+22,80),v)}px`,I.remove()})()},[t,i]);let m=y=>{let S=i.trim();s(!1),y&&S&&S!==g&&e.onRename(e.row,S)};return t?(0,n.jsx)("input",{ref:f,type:"text",className:"term-modal-name-input",maxLength:200,value:i,onChange:y=>r(y.currentTarget.value),onBlur:()=>m(!0),onKeyDown:y=>{y.stopPropagation(),y.key==="Enter"?(y.preventDefault(),m(!0)):y.key==="Escape"&&(y.preventDefault(),m(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??g),children:String(g).slice(0,60)}),(0,n.jsx)(le,{id:"term-modal-edit",icon:R.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(se(e.row.title)||""),s(!0)}})]})}function Js(e){let t=(0,c.useRef)(null);En(t,!!e.state);let s=e.state?he.sessions.get(e.state.sessionId):null,i=s?Pe(s):null,r=e.state?.url??i??"",f=s?String(s.cliId??"unknown"):"",g=s?hn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:m=>{m.target===m.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:oe(me({name:te(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)(js,{row:s,onRename:e.onRename}),(0,n.jsx)(We,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:te(s)}),(0,n.jsx)("span",{children:f}),g!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:g}):null]})]})]}),(0,n.jsxs)("span",{className:"term-modal-actions",children:[s.feishuChatLink?(0,n.jsx)("a",{className:"card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),dangerouslySetInnerHTML:oe(R.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:oe(R.terminal)}),(0,n.jsx)(le,{id:"term-modal-close",icon:R.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)(fe,{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 zs(e){let[t,s]=(0,c.useState)(null);(0,c.useEffect)(()=>s(null),[e.row.sessionId]);let i=async()=>{s({loading:!0});try{let g=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-diff`),m=await g.json().catch(()=>({}));if(!m.ok){s({loading:!1,message:(0,n.jsxs)("p",{children:[o("sessions.landUnavailable"),": ",String(m.error??g.status)]})});return}if(m.empty){s({loading:!1,message:(0,n.jsx)("p",{children:o("sessions.landEmpty")})});return}let y=String(m.patch??"");s({loading:!1,diff:m,patch:y.slice(0,2e4)+(y.length>2e4?`
3
- ...(truncated)`:"")})}catch(g){s({loading:!1,message:(0,n.jsxs)("p",{children:[o("sessions.landUnavailable"),": ",String(g)]})})}},r=async()=>{let g=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-land/apply`,{method:"POST"}),m=await g.json().catch(()=>({}));s({loading:!1,message:m.ok?(0,n.jsxs)("p",{children:[o("sessions.landApplied"),": ",m.files," files (+",m.insertions,"/-",m.deletions,") \u2192 ",(0,n.jsx)("code",{children:String(m.workingDir??"")})]}):(0,n.jsxs)("p",{children:[o("sessions.landFailed"),": ",String(m.error??g.status)]})})},f=async()=>{await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-land/discard`,{method:"POST"}),s({loading:!1,message:(0,n.jsx)("p",{children:o("sessions.landDiscarded")})})};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"land-btn",type:"button",disabled:t?.loading,onClick:()=>{i()},children:o("sessions.land")}),(0,n.jsxs)("div",{id:"land-area",children:[t?.loading?(0,n.jsx)(fe,{label:o("sessions.landLoading"),compact:!0}):null,t?.message,t?.diff&&t.patch!==void 0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:t.diff.files})," files (+",t.diff.insertions,"/-",t.diff.deletions,") \u2192 ",(0,n.jsx)("code",{children:String(t.diff.workingDir??"")})]}),(0,n.jsx)("pre",{style:{maxHeight:320,overflow:"auto",whiteSpace:"pre-wrap"},children:t.patch}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)("button",{id:"land-apply",type:"button",className:"primary",onClick:()=>{r()},children:o("sessions.landApply")}),(0,n.jsx)("button",{id:"land-discard",type:"button",className:"contrast",onClick:()=>{f()},children:o("sessions.landDiscard")})]})]}):null]})]})}function Xs(e){let t=e.report;if(!t||t.status!=="ok"){let y=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",y]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let i=[t.meta?.asOf?o("sessions.insightAsOf",{asOf:String(t.meta.asOf)}):null,t.meta?.partial?o("sessions.insightPartial"):null].filter(Boolean),r=Array.isArray(t.suggestions)?t.suggestions:[],f=Array.isArray(t.spans)?t.spans:[],g=y=>y==="bad"||y==="warn"?"!":"i",m=y=>y==="error"?"!":y==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[i.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:i.join(" \xB7 ")}):null,(0,n.jsx)("p",{children:o("sessions.insightMetrics",{total:String(s.totalSpans??0),failed:String(s.failedSpans??0),slow:String(s.slowSpans??0),rw:s.readWriteRatio===null||s.readWriteRatio===void 0?"-":String(s.readWriteRatio),compactions:String(s.compactions??0)})}),r.length?(0,n.jsxs)("details",{open:!0,children:[(0,n.jsx)("summary",{children:o("sessions.insightSuggestions")}),(0,n.jsx)("ul",{style:{paddingLeft:18,margin:"6px 0"},children:r.map((y,S)=>(0,n.jsxs)("li",{children:[g(String(y.severity??""))," ",(0,n.jsx)("b",{children:String(y.title??"")})," - ",String(y.action??""),Array.isArray(y.evidence)&&y.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:y.evidence.join("; ")})]}):null]},S))})]}):null,f.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",f.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??f.length),total:String(t.meta.spansTotal??f.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:[...f].sort((y,S)=>(y.relStartMs??0)-(S.relStartMs??0)).map((y,S)=>{let L=[y.inputSummary,y.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:y.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:m(String(y.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(y.tool??"")})}),(0,n.jsx)("td",{children:String(y.phase??"")}),(0,n.jsx)("td",{children:xs(y.durationMs)}),(0,n.jsxs)("td",{children:["#",String(y.turnIndex??0)]}),(0,n.jsx)("td",{children:L})]},S)})})})})]}):null]})}function Vs(e){let[t,s]=(0,c.useState)(null);if((0,c.useEffect)(()=>s(null),[e.row.sessionId]),!ke.authed)return null;let i=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),f=await r.json().catch(()=>({}));!f.ok||!f.report?s({loading:!1,error:String(f.error??r.status)}):s({loading:!1,report:f.report})}catch(r){s({loading:!1,error:String(r)})}};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"insight-btn",type:"button",disabled:t?.loading,onClick:()=>{i()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(fe,{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)(Xs,{report:t.report}):null]})]})}function Ws(e){let t=(0,c.useRef)(null);En(t,!!e.row);let s=e.row,i=s?Pe(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:se(s.title)||s.sessionId}),(0,n.jsx)(le,{id:"drawer-close",className:"card-act drawer-close-btn",icon:R.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(We,{status:s.status}),(0,n.jsx)(Ln,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(Nn,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",te(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"),":"]})," ",Ce(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(Nn,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(Nn,{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)(Pt,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(Rs,{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)(Dt,{row:s,url:i}),Xe(s)?(0,n.jsx)("button",{id:"restart-btn",type:"button",onClick:async r=>{await e.restartSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.restart")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"lock-btn",type:"button",onClick:r=>{e.setSessionLocked(s,!s.locked,r.currentTarget)},children:ze(s)}):null,s.queued&&s.status!=="closed"?(0,n.jsx)("button",{id:"start-btn",type:"button",className:"primary",onClick:async r=>{await e.startSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.create.start")}):null,s.status==="closed"?(0,n.jsx)("button",{id:"resume-btn",type:"button",className:"primary",onClick:async r=>{await e.resumeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.resume")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"close-btn",type:"button",className:"contrast",onClick:async r=>{await e.closeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.close")}):null,(0,n.jsx)(zs,{row:s}),(0,n.jsx)(Vs,{row:s})]})]}):null})}function Gs(e){let t=e.state;(0,c.useEffect)(()=>{let u=e.dialog;return()=>{u.open&&u.close()}},[e.dialog]),(0,c.useEffect)(()=>{let u=e.dialog;if(t){if(!u.open)try{u.showModal()}catch{}}else u.open&&u.close()},[e.dialog,t]),(0,c.useEffect)(()=>{let u=e.dialog,k=()=>e.onClose(),M=O=>{O.target===u&&e.onClose()};return u.addEventListener("close",k),u.addEventListener("click",M),()=>{u.removeEventListener("close",k),u.removeEventListener("click",M)}},[e]);let[s,i]=(0,c.useState)(""),[r,f]=(0,c.useState)(new Set),[g,m]=(0,c.useState)("lead"),[y,S]=(0,c.useState)(""),[L,I]=(0,c.useState)("in_progress"),[v,B]=(0,c.useState)(""),[H,E]=(0,c.useState)(""),[V,Q]=(0,c.useState)(!1),[J,U]=(0,c.useState)(!1),[P,W]=(0,c.useState)(""),[N,Z]=(0,c.useState)(()=>qn(Y())),[K,G]=(0,c.useState)(null);if((0,c.useEffect)(()=>{t&&(i(""),f(new Set),m("lead"),S(""),I("in_progress"),B(""),E(""),Q(!1),U(!1),W(""),G(null))},[t]),!t)return null;if(t.success){let u=t.success,k=typeof u.shareLink=="string"&&u.shareLink?u.shareLink:"",M=Array.isArray(u.failed)?u.failed.length:0,O=Array.isArray(u.spawned)?u.spawned.length:0,A=u.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:[A,"\uFF08",O,"\uFF09"]}),M>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(M)})}):null,k?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:k,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)(fe,{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 z=t.bots,q=[...r],D=q,ve=u=>z.find(k=>k.larkAppId===u)?.botName??u,ee=P.trim().toLowerCase(),Ie=ee?z.filter(u=>u.botName.toLowerCase().includes(ee)||u.larkAppId.toLowerCase().includes(ee)):z,F=async u=>{u.preventDefault();let k=s.trim();if(!k){alert(o("sessions.create.errContent"));return}if(q.length===0){alert(o("sessions.create.errNoBot"));return}let M=y||q[0]||"";if(g==="lead"&&(!M||!q.includes(M))){alert(o("sessions.create.errLead"));return}U(!0),G(null);try{let O=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:k,larkAppIds:q,mode:g,column:L,leadLarkAppId:g==="lead"?M:void 0,name:v.trim()||void 0,bindWorkingDir:H.trim()||void 0})}),A=await O.json().catch(()=>null);O.ok&&A?.ok?N?(G(A),i(""),B("")):e.onSuccess(A):O.status!==401&&alert(`${o("sessions.create.failed")}: ${A?.error??O.status}`)}catch(O){alert(`${o("sessions.create.failed")}: ${O}`)}finally{U(!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:F,children:[(0,n.jsxs)("fieldset",{className:"cs-content",children:[(0,n.jsx)("legend",{children:o("sessions.create.content")}),(0,n.jsx)("textarea",{name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),required:!0,value:s,onChange:u=>i(u.currentTarget.value)})]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),z.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:P,onChange:u=>W(u.currentTarget.value)}),Ie.length?(0,n.jsx)("div",{className:"cs-bot-list",children:Ie.map(u=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:u.larkAppId,checked:r.has(u.larkAppId),onChange:k=>{let M=k.currentTarget.checked;f(O=>{let A=new Set(O);return M?A.add(u.larkAppId):A.delete(u.larkAppId),A.has(y)||S(A.values().next().value??""),A})}})," ",(0,n.jsx)("span",{children:u.botName})]},u.larkAppId))}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBotMatch")}),q.length?(0,n.jsx)("small",{children:o("sessions.create.selectedCount",{n:String(q.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:()=>m("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:g==="all",onChange:()=>m("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:D.length===0,value:D.includes(y)?y:"",onChange:u=>S(u.currentTarget.value),children:D.length?D.map(u=>(0,n.jsx)("option",{value:u,children:ve(u)},u)):(0,n.jsx)("option",{value:"",disabled:!0,children:o("sessions.create.leadPickFirst")})}),(0,n.jsx)("small",{children:o("sessions.create.leadHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-column",children:[(0,n.jsx)("legend",{children:o("sessions.create.column")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"in_progress",checked:L==="in_progress",onChange:()=>I("in_progress")})," ",o("sessions.create.columnInProgress")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"backlog",checked:L==="backlog",onChange:()=>I("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${V?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":V,"aria-controls":"cs-advanced-fields",onClick:()=>Q(u=>!u),children:o("sessions.create.optionalConfig")})}),V?(0,n.jsxs)("div",{id:"cs-advanced-fields",className:"cs-advanced-fields",children:[(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.groupName")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"name",maxLength:60,placeholder:o("sessions.create.groupNamePlaceholder"),value:v,onChange:u=>B(u.currentTarget.value)})]}),(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.workingDir")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"bindWorkingDir",placeholder:"e.g. ~/projects/foo",value:H,onChange:u=>E(u.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),K?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[K.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(K.failed)&&K.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(K.failed.length)})}`:""]}),typeof K.shareLink=="string"&&K.shareLink?(0,n.jsx)("a",{href:K.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:N,onChange:u=>{let k=u.currentTarget.checked;Z(k),Yn(Y(),k)}}),(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||z.length===0,children:J?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function qs(){it();let e=at(a=>[...a.sessions.values()]),[t,s]=(0,c.useState)(0),i=(0,c.useCallback)(()=>s(a=>a+1),[]),[r,f]=(0,c.useState)({q:"",status:"",adopt:"",chat:"",showUnknownChats:Xn(Y()),active:!0,cli:new Set(be)}),[g,m]=(0,c.useState)(new Set),[y,S]=(0,c.useState)("lastMessageAt"),[L,I]=(0,c.useState)("desc"),[v,B]=(0,c.useState)(()=>zn(Y())),[H,E]=(0,c.useState)(()=>Vn(Y())),[V,Q]=(0,c.useState)(!1),[J,U]=(0,c.useState)(null),[P,W]=(0,c.useState)(null),[N,Z]=(0,c.useState)(()=>Qn(Y())),K=`${v}:${v==="kanban"?N:"-"}`,G=(0,c.useRef)(!0),[z,q]=(0,c.useState)(0),[D,ve]=(0,c.useState)([]),[ee,Ie]=(0,c.useState)(null),[F,u]=(0,c.useState)(!1),k=(0,c.useRef)(!1),[M,O]=(0,c.useState)(()=>{try{return window.localStorage.getItem(un)??""}catch{return""}}),[A,X]=(0,c.useState)({data:null,key:"",fetchedAt:0}),pe=(0,c.useRef)(!1),ne=(0,c.useRef)(new Set),[de,$e]=(0,c.useState)(""),[He,Ne]=(0,c.useState)(null),[ae,Me]=(0,c.useState)(null),[ce,ie]=(0,c.useState)(null),[Ke,Le]=(0,c.useState)(!1),[Ge,j]=(0,c.useState)(24),[qe,_e]=(0,c.useState)(""),[An,Ee]=(0,c.useState)(null),[Ot,Ae]=(0,c.useState)(null),[$t,Ye]=(0,c.useState)(null),[Ht,Kt]=(0,c.useState)(null),[Qe,_t]=(0,c.useState)(null),[Ut,Ue]=(0,c.useState)(null),[Ft,Ze]=(0,c.useState)(!1),xe=(0,c.useRef)(0);(0,c.useLayoutEffect)(()=>{if(G.current){G.current=!1;return}q(a=>a+1)},[K]),(0,c.useEffect)(()=>{_t(document.getElementById("create-session-modal"))},[]),(0,c.useEffect)(()=>{tt().then(i)},[i]);let en=(0,c.useMemo)(()=>{let a=new Map;for(let l of e){let d=String(l.chatId??"").trim();if(!d||!r.showUnknownChats&&kn(l))continue;let b=Ce(l),p=a.get(d);(!p||b<p)&&a.set(d,b)}return[...a.entries()].sort((l,d)=>l[1].localeCompare(d[1])).map(([l,d])=>({value:l,label:d}))},[r.showUnknownChats,t,e]);(0,c.useEffect)(()=>{r.chat&&(en.some(a=>a.value===r.chat)||f(a=>({...a,chat:""})))},[en,r.chat]);let re=(0,c.useMemo)(()=>{let a=r.q.toLowerCase(),l=[...r.cli],d=l.length>0&&l.length<be.length,b=v==="kanban";return e.filter(p=>!d||l.includes(p.cliId??"unknown")).filter(p=>r.showUnknownChats||!kn(p)).filter(p=>!r.status||p.status===r.status).filter(p=>!r.adopt||r.adopt==="yes"==!!p.adopt).filter(p=>!r.chat||String(p.chatId??"")===r.chat).filter(p=>!r.active||b||p.status!=="closed").filter(p=>!a||yt(p).includes(a)).sort((p,h)=>Ms(p,h,y,L))},[r,t,L,y,e,v]),nn=(0,c.useMemo)(()=>pt(e),[e]),ue=(0,c.useMemo)(()=>new Map(e.map(a=>[a.sessionId,a])),[e,t]),xn=(0,c.useMemo)(()=>re.filter(a=>a.status!=="closed"),[re]),Re=(v==="table"?re:xn).filter(a=>a.status!=="closed"),Rn=[...g].map(a=>ue.get(a)).filter(a=>!!a&&a.status!=="closed"),Bn=Re.length>0&&Re.every(a=>g.has(a.sessionId)),jt=Re.some(a=>g.has(a.sessionId))&&!Bn;(0,c.useEffect)(()=>{m(a=>{let l=!1,d=new Set;for(let b of a){let p=ue.get(b);p&&p.status!=="closed"?d.add(b):l=!0}return l?d:a})},[ue]);let tn=(0,c.useCallback)(a=>{let l=new Set;if(!a)return l;for(let d of a.groupChats)l.add(d);if(ee)for(let[d,b]of ee){if(l.has(d))continue;let p=!1;for(let h of a.botIds)if(b.botIds.has(h)){p=!0;break}if(p){for(let h of b.observedNames)if(a.botNames.has(h)){l.add(d);break}}}return l},[ee]),Dn=(0,c.useMemo)(()=>{if(v==="kanban"&&N==="team"){let a=D.find(d=>d.key===M)??D[0],l=tn(a);return re.filter(d=>l.has(String(d.chatId)))}return re},[N,M,D,re,tn,v]),sn=(0,c.useCallback)(a=>ut(Dn,a),[Dn]),on=(0,c.useCallback)(async()=>{if(!(k.current||F)){k.current=!0;try{let[a,l,d]=await Promise.all([fetch("/api/team/hosted").then(h=>h.json()).catch(()=>null),fetch("/api/team/remote-roster").then(h=>h.json()).catch(()=>null),fetch("/api/groups").then(h=>h.json()).catch(()=>null)]);Array.isArray(d?.chats)&&Ie(new Map(d.chats.map(h=>[String(h.chatId),{botIds:new Set((h.memberBots??[]).filter(C=>C.inChat).map(C=>String(C.larkAppId))),observedNames:new Set((h.observedBotNames??[]).map(C=>String(C)))}])));let b=h=>({ids:new Set(h.map(C=>String(C.larkAppId))),names:new Set(h.map(C=>String(C.name??"")).filter(Boolean))}),p=[];for(let h of a?.teams??[]){let{ids:C,names:x}=b(h.bots??[]);p.push({key:`local:${h.teamId}`,label:h.isDefault?o("team.myHostedTeam"):String(h.name??h.teamId),botIds:C,botNames:x,groupChats:new Set((h.groupChatIds??[]).map($=>String($)))})}for(let h of l?.memberships??[]){let{ids:C,names:x}=b(h.roster?.bots??[]);p.push({key:`${h.hubUrl}::${h.teamId}`,label:String(h.teamName??h.teamId??h.hubUrl),botIds:C,botNames:x,groupChats:new Set})}ve(p),O(h=>p.length&&!p.some(C=>C.key===h)?p[0].key:h)}finally{u(!0),k.current=!1}}},[F]),Pn=(0,c.useCallback)(async(a,l,d,b,p)=>{try{let C=a.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(a.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:l,column:d,position:b})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:a,sessionId:l,column:d,position:b})}),x=await C.json().catch(()=>({}));(!C.ok||x?.ok===!1)&&(X($=>{if(!$.data||$.key!==a)return $;let _={...$.data.board};return p?_[l]=p:delete _[l],{...$,data:{...$.data,board:_}}}),C.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${x?.error??C.status}`))}catch(h){X(C=>{if(!C.data||C.key!==a)return C;let x={...C.data.board};return p?x[l]=p:delete x[l],{...C,data:{...C.data,board:x}}}),alert(`${o("sessions.kanban.moveFail")}: ${h}`)}},[]),Jt=(0,c.useCallback)(async a=>{let l=A.key===a.key&&Date.now()-A.fetchedAt<3e4;if(!(pe.current||l)){pe.current=!0;try{let b=a.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(a.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(a.key)}`,p=await fetch(b),h=await p.json().catch(()=>({}));if(!p.ok||h?.ok===!1)return;let C=typeof h.deploymentId=="string"?h.deploymentId:null,x=[];for(let $ of Array.isArray(h.reports)?h.reports:[])if(!(C&&$.deploymentId===C))for(let _ of Array.isArray($.sessions)?$.sessions:[])x.push({..._,remoteDeployment:$.deploymentName||$.deploymentId});X({key:a.key,fetchedAt:Date.now(),data:{board:h.board&&typeof h.board=="object"?h.board:{},remoteRows:x}})}finally{pe.current=!1}}},[A.fetchedAt,A.key]);(0,c.useEffect)(()=>{v==="kanban"&&N==="team"&&!F&&on()},[N,F,on,v]),(0,c.useEffect)(()=>{let a=window.setInterval(()=>{v==="kanban"&&N==="team"&&(X(l=>({...l,fetchedAt:0})),i())},3e4);return()=>window.clearInterval(a)},[N,i,v]);let On=(0,c.useCallback)(async(a,l,d,b)=>{try{let p=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:l,position:d})}),h=await p.json().catch(()=>({}));(!p.ok||h?.ok===!1)&&(a.kanbanColumn=b.column,a.kanbanPosition=b.position,i(),p.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${h?.error??p.status}`))}catch(p){a.kanbanColumn=b.column,a.kanbanPosition=b.position,i(),alert(`${o("sessions.kanban.moveFail")}: ${p}`)}},[i]),zt=(0,c.useCallback)(a=>{let l=!1;for(let d of a){let b=String(d.row.sessionId);if(!b||d.row.status==="closed"&&d.column!=="done")continue;if(N==="team"){let C=D.find(_=>_.key===M)??D[0];if(!C)continue;let $=(A.key===C.key&&A.data?A.data.board:{})[b];X(_=>{let Fn=_.key===C.key&&_.data?_.data:{board:{},remoteRows:_.data?.remoteRows??[]},rs={...Fn.board,[b]:{column:d.column,position:d.position}};return{..._,key:C.key,data:{...Fn,board:rs}}}),Pn(C.key,b,d.column,d.position,$),l=!0;continue}let p=he.sessions.get(b);if(!p)continue;let h={column:p.kanbanColumn,position:p.kanbanPosition};p.kanbanColumn=d.column,p.kanbanPosition=d.position,On(p,d.column,d.position,h),l=!0}l&&i()},[N,M,D,A,On,Pn,i]),$n=(0,c.useCallback)(async(a,l)=>{let d=a.title;a.title=l,i();try{let b=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:l})}),p=await b.json().catch(()=>({}));(!b.ok||p?.ok===!1)&&(a.title=d,i(),b.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${p?.error??b.status}`))}catch(b){a.title=d,i(),alert(`${o("sessions.kanban.renameFail")}: ${b}`)}},[i]),Hn=(0,c.useCallback)(async a=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/locate`,{method:"POST"}),d=await l.json();return d.ok?!0:(alert(`Locate failed: ${d.error??l.status}`),!1)}catch(l){return alert(`Locate error: ${l}`),!1}},[]),Kn=(0,c.useCallback)(async(a,l)=>{if(!confirm(o("sessions.closeConfirm")))return!1;l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/close`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`Close failed: ${b?.error??d.status}`),!1):(m(p=>{let h=new Set(p);return h.delete(a.sessionId),h}),i(),!0)}catch(d){return alert(`Close error: ${d}`),!1}finally{l&&(l.disabled=!1)}},[i]),an=(0,c.useCallback)(async(a,l,d)=>{let b=!!a.locked;if(b===l)return!0;a.locked=l,i(),d&&(d.disabled=!0);try{let p=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:l})}),h=await p.json().catch(()=>({}));return!p.ok||h?.ok===!1?(a.locked=b,i(),p.status!==401&&alert(`${o("sessions.lockFailed")}: ${h?.error??p.status}`),!1):(a.locked=!!h.locked,i(),!0)}catch(p){return a.locked=b,i(),alert(`${o("sessions.lockFailed")}: ${p}`),!1}finally{d&&(d.disabled=!1)}},[i]),rn=(0,c.useCallback)(async(a,l)=>{if(ne.current.has(a.sessionId)||!confirm(wt(a)))return!1;l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/restart`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`${o("sessions.restartFailed")}: ${b?.error??d.status}`),!1):(ne.current.add(a.sessionId),window.setTimeout(()=>ne.current.delete(a.sessionId),5e3),!0)}catch(d){return alert(`${o("sessions.restartFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),Xt=(0,c.useCallback)(async(a,l)=>{l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/resume`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(alert(`${o("sessions.resumeFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.resumeFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),Vt=(0,c.useCallback)(async(a,l)=>{l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/start`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(d.status!==401&&alert(`${o("sessions.create.startFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.create.startFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),ln=(0,c.useCallback)(a=>{Ae({sessionId:a.sessionId,loading:!0,messages:[]}),(async()=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/history?limit=80`),d=await l.json().catch(()=>({}));if(!l.ok||d?.ok===!1){let p=String(d?.error??l.status),h=p==="not_found_yet"||p==="not_found";Ae(C=>C?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:[],error:p,stale:h}:C);return}let b=Array.isArray(d.messages)?d.messages:[];Ae(p=>p?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:b,ownerOpenId:d.ownerOpenId}:p)}catch(l){Ae(d=>d?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:[],error:String(l)}:d)}})()},[]),Wt=(0,c.useCallback)(a=>{let l=Pe(a);if(!l){Ee(a.sessionId);return}Ye({sessionId:a.sessionId,url:l,loading:!0}),(async()=>{let d=l;if(Cn())try{let b=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/write-link`),p=await b.json().catch(()=>({}));b.ok&&p?.ok!==!1&&p?.url&&(d=p.url)}catch{}Ye(b=>b?.sessionId===a.sessionId?{sessionId:a.sessionId,url:d,loading:!1}:b)})()},[]),Gt=(0,c.useCallback)(async()=>{let a=[...g];if(a.length===0||!confirm(o("sessions.closeBulkConfirm",{count:a.length})))return;Ne({done:0,total:a.length});let l=0,d=0,b=[...a];async function p(){for(;b.length;){let h=b.shift();try{let C=await fetch(`/api/sessions/${encodeURIComponent(h)}/close`,{method:"POST"}),x=await C.json().catch(()=>({}));(!C.ok||x?.ok===!1)&&(d+=1)}catch{d+=1}finally{l+=1,Ne({done:l,total:a.length})}}}await Promise.all(Array.from({length:Math.min(6,a.length)},()=>p())),Ne(null),m(new Set),i(),d>0&&alert(`Failed: ${d}/${a.length}`)},[i,g]),qt=(0,c.useCallback)(async a=>{let l=[...g].map(C=>ue.get(C)).filter(C=>!!C&&C.status!=="closed"&&!!C.locked!==a);if(l.length===0)return;Me({locked:a,done:0,total:l.length});let d=0,b=0,p=[...l];async function h(){for(;p.length;){let C=p.shift(),x=!!C.locked;try{let $=await fetch(`/api/sessions/${encodeURIComponent(C.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:a})}),_=await $.json().catch(()=>({}));!$.ok||_?.ok===!1?(b+=1,C.locked=x):C.locked=!!_.locked}catch{b+=1,C.locked=x}finally{d+=1,Me({locked:a,done:d,total:l.length})}}}await Promise.all(Array.from({length:Math.min(6,l.length)},()=>h())),Me(null),i(),b>0&&alert(`${o("sessions.lockFailed")}: ${b}/${l.length}`)},[i,ue,g]),Yt=(0,c.useCallback)(()=>{let a=[...g].filter(d=>!!ue.get(d));if(a.length===0)return;let l=dt(a);ie(o("sessions.monitorRoomAdded",{added:l.added,total:l.total})),window.setTimeout(()=>ie(null),1800)},[ue,g]),Qt=(0,c.useCallback)(async a=>{let l=fn(a);if(!l)return;let d=sn(l);if(d.length!==0){j(l),Le(!0),_e(o("sessions.idleCleanupRunning"));try{let b=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:l,sessionIds:d.map(h=>h.sessionId)})}),p=await b.json().catch(()=>({}));if(!b.ok){b.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${p?.error??b.status}`),_e("");return}m(h=>{let C=new Set(h);for(let x of p?.results??[])x?.ok&&x?.sessionId&&C.delete(String(x.sessionId));return C}),_e(o("sessions.idleCleanupDone",{closed:Number(p?.closed??0),failed:Number(p?.failed??0)})),i()}catch(b){alert(`${o("sessions.idleCleanupFailed")}: ${b}`),_e("")}finally{Le(!1)}}},[sn,i]),Zt=a=>{let l=Jn(a)??"board";l!==v&&(B(l),Wn(Y(),l))},es=(a,l)=>{E(d=>{let b=d.indexOf(a),p=b+l;if(b<0||p<0||p>=d.length)return d;let h=[...d];return h.splice(b,1),h.splice(p,0,a),cn(Y(),h),h})},ns=(a,l)=>{a!==l&&E(d=>{let b=d.indexOf(a),p=d.indexOf(l);if(b<0||p<0)return d;let h=[...d];return h.splice(b,1),h.splice(p,0,a),cn(Y(),h),h})},ts=(0,c.useMemo)(()=>({rows:re,groupBy:N,teams:D,teamsLoaded:F,teamKey:M,teamBoardData:A.data,teamBoardKey:A.key}),[N,M,D,F,re,A.data,A.key]),ss=An?ue.get(An)??null:null,dn=(0,c.useMemo)(()=>F?D.length?D.map(a=>({value:a.key,label:a.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[D,F]),os=!F||D.length===0,_n=D.some(a=>a.key===M)?M:dn[0]?.value??"",as=dn.find(a=>a.value===_n)?.label??o("sessions.kanban.groupTeam"),is=(0,c.useCallback)(()=>{xe.current+=1,Ze(!1),Ue(null)},[]),Un=async()=>{let a=xe.current+1;xe.current=a,Ue({bots:[],loading:!0}),Ze(!0);try{let l=await Ct();if(xe.current!==a)return;Ue({bots:l})}finally{xe.current===a&&Ze(!1)}};return(0,c.useEffect)(()=>{let a=()=>{rt()&&ke.authed&&Un()};return a(),window.addEventListener(mn,a),()=>window.removeEventListener(mn,a)},[]),(0,n.jsxs)("section",{className:"page sessions-page",children:[(0,n.jsxs)("div",{className:"page-heading",children:[(0,n.jsxs)("div",{className:"sessions-heading-main",children:[(0,n.jsx)("p",{className:"eyebrow",children:o("nav.sessions")}),(0,n.jsx)("h1",{children:o("sessions.title")}),(0,n.jsxs)("div",{className:"sessions-view-controls",children:[(0,n.jsx)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":o("sessions.viewMode"),children:[["kanban",o("sessions.viewKanban")],["board",o("sessions.viewBoard")],["table",o("sessions.viewTable")]].map(([a,l])=>(0,n.jsx)("button",{type:"button","data-view":a,className:v===a?"active":void 0,"aria-pressed":v===a,onClick:()=>Zt(a),children:l},a))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${v==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":v!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([a,l])=>(0,n.jsx)("button",{type:"button","data-groupby":a,className:N===a?"active":void 0,"aria-pressed":N===a,onClick:()=>{Z(a),Zn(Y(),a)},children:l},a))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(v==="kanban"&&N==="team"&&F),children:de}),(0,n.jsx)(Be,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(v==="kanban"&&N==="team"),disabled:os,label:as,value:_n,options:dn,onChange:a=>{if(D.some(l=>l.key===a)){O(a);try{window.localStorage.setItem(un,a)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=ct()},children:o("sessions.monitorRoom")}),ke.authed?(0,n.jsx)(ot,{className:"page-primary-action create-session-btn",disabled:Ft,onClick:()=>{Un()},children:o("sessions.create.button")}):null]})]}),(0,n.jsxs)("div",{className:"session-runtime-stats","aria-live":"polite",children:[(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(Ps,{chatOptions:en,filters:r,setFilters:f,idleCleanup:{busy:Ke,hours:Ge,status:qe,countForHours:a=>sn(a).length,onRun:Qt}}),(0,n.jsx)(Os,{selectedCount:g.size,lockDisabled:!Rn.some(a=>!a.locked),unlockDisabled:!Rn.some(a=>!!a.locked),closeProgress:He,lockProgress:ae,monitorRoomText:ce,onClear:()=>m(new Set),onClose:()=>{Gt()},onAddToMonitorRoom:Yt,onLock:a=>{qt(a)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${z>0?" sessions-view-stage-enter":""}`,"data-view":v,"data-kanban-group":N,children:[(0,n.jsx)(Hs,{rows:re,selected:g,hidden:v!=="table",sortKey:y,sortDir:L,selectAllChecked:Bn,selectAllIndeterminate:jt,selectAllDisabled:Re.length===0,onOpen:a=>Ee(a.sessionId),onSelect:(a,l)=>m(d=>{let b=new Set(d);return l?b.add(a):b.delete(a),b}),onSelectAll:a=>m(l=>{let d=new Set(l);for(let b of Re)a?d.add(b.sessionId):d.delete(b.sessionId);return d}),onSort:a=>{y===a?I(L==="asc"?"desc":"asc"):(S(a),I(a==="spawnedAt"||a==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(_s,{rows:xn,selected:g,hidden:v!=="board",order:H,animated:V,dragColId:J,dragOverCol:P,onAnimated:()=>Q(!0),onMoveColumn:es,onMoveColumnTo:ns,onDragCol:U,onDragOverCol:W,onToggleSelect:a=>m(l=>{let d=new Set(l);return d.has(a.sessionId)?d.delete(a.sessionId):d.add(a.sessionId),d}),onOpen:a=>Ee(a.sessionId),onHistory:ln,onLocate:a=>Hn(a),onRestart:(a,l)=>{rn(a,l)},onLock:(a,l,d)=>{an(a,l,d)},onClose:(a,l)=>{Kn(a,l)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:Kt,className:`sessions-kanban${N==="bot"?" kanban-mode-bot":""}`,hidden:v!=="kanban",children:v==="kanban"?(0,n.jsx)(Rt,{host:Ht,...ts,canRestartSession:Xe,getTeamChatIds:tn,icons:{details:R.details,feishu:R.feishu,history:R.history,lock:R.lock,restart:R.restart,terminal:R.terminal,unlock:R.unlock},lockActionLabel:ze,sessionStatusText:De,onDetails:a=>Ee(String(a.sessionId)),onHistory:ln,onMoveRows:zt,onNeedTeamBoard:a=>{Jt(a)},onNeedTeams:()=>{on()},onOpenTerminal:Wt,onRename:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&$n(d,l)},onRestart:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&rn(d,l)},onTeamScope:a=>$e(a?o("sessions.kanban.teamScope",{chats:a.chats,sessions:a.sessions}):""),onToggleLock:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&an(d,!d.locked,l)},onToggleSelect:a=>m(l=>{let d=String(a.sessionId),b=new Set(l);return b.has(d)?b.delete(d):b.add(d),b}),selectedSessionIds:g}):null})]},z),(0,n.jsx)(Ws,{row:ss,onClose:()=>Ee(null),locateSession:Hn,openHistory:ln,resumeSession:Xt,restartSession:rn,closeSession:Kn,setSessionLocked:an,startSession:Vt}),(0,n.jsx)(Js,{state:$t,onClose:()=>Ye(null),onRename:$n}),(0,n.jsx)(Fs,{state:Ot,onClose:()=>Ae(null)}),Qe?(0,Mn.createPortal)((0,n.jsx)(Gs,{dialog:Qe,state:Ut,onClose:is,onSuccess:a=>Ue(l=>l&&{...l,success:a})}),Qe):null]})}function Mo(e){return st(e,(0,n.jsx)(qs,{}))}export{Ds as CliFilterGroup,Mo as renderSessionsPage};
3
+ ...(truncated)`:"")})}catch(g){s({loading:!1,message:(0,n.jsxs)("p",{children:[o("sessions.landUnavailable"),": ",String(g)]})})}},r=async()=>{let g=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-land/apply`,{method:"POST"}),m=await g.json().catch(()=>({}));s({loading:!1,message:m.ok?(0,n.jsxs)("p",{children:[o("sessions.landApplied"),": ",m.files," files (+",m.insertions,"/-",m.deletions,") \u2192 ",(0,n.jsx)("code",{children:String(m.workingDir??"")})]}):(0,n.jsxs)("p",{children:[o("sessions.landFailed"),": ",String(m.error??g.status)]})})},f=async()=>{await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/sandbox-land/discard`,{method:"POST"}),s({loading:!1,message:(0,n.jsx)("p",{children:o("sessions.landDiscarded")})})};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"land-btn",type:"button",disabled:t?.loading,onClick:()=>{i()},children:o("sessions.land")}),(0,n.jsxs)("div",{id:"land-area",children:[t?.loading?(0,n.jsx)(fe,{label:o("sessions.landLoading"),compact:!0}):null,t?.message,t?.diff&&t.patch!==void 0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:t.diff.files})," files (+",t.diff.insertions,"/-",t.diff.deletions,") \u2192 ",(0,n.jsx)("code",{children:String(t.diff.workingDir??"")})]}),(0,n.jsx)("pre",{style:{maxHeight:320,overflow:"auto",whiteSpace:"pre-wrap"},children:t.patch}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)("button",{id:"land-apply",type:"button",className:"primary",onClick:()=>{r()},children:o("sessions.landApply")}),(0,n.jsx)("button",{id:"land-discard",type:"button",className:"contrast",onClick:()=>{f()},children:o("sessions.landDiscard")})]})]}):null]})]})}function Xs(e){let t=e.report;if(!t||t.status!=="ok"){let y=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",y]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let i=[t.meta?.asOf?o("sessions.insightAsOf",{asOf:String(t.meta.asOf)}):null,t.meta?.partial?o("sessions.insightPartial"):null].filter(Boolean),r=Array.isArray(t.suggestions)?t.suggestions:[],f=Array.isArray(t.spans)?t.spans:[],g=y=>y==="bad"||y==="warn"?"!":"i",m=y=>y==="error"?"!":y==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[i.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:i.join(" \xB7 ")}):null,(0,n.jsx)("p",{children:o("sessions.insightMetrics",{total:String(s.totalSpans??0),failed:String(s.failedSpans??0),slow:String(s.slowSpans??0),rw:s.readWriteRatio===null||s.readWriteRatio===void 0?"-":String(s.readWriteRatio),compactions:String(s.compactions??0)})}),r.length?(0,n.jsxs)("details",{open:!0,children:[(0,n.jsx)("summary",{children:o("sessions.insightSuggestions")}),(0,n.jsx)("ul",{style:{paddingLeft:18,margin:"6px 0"},children:r.map((y,S)=>(0,n.jsxs)("li",{children:[g(String(y.severity??""))," ",(0,n.jsx)("b",{children:String(y.title??"")})," - ",String(y.action??""),Array.isArray(y.evidence)&&y.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:y.evidence.join("; ")})]}):null]},S))})]}):null,f.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",f.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??f.length),total:String(t.meta.spansTotal??f.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:[...f].sort((y,S)=>(y.relStartMs??0)-(S.relStartMs??0)).map((y,S)=>{let L=[y.inputSummary,y.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:y.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:m(String(y.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(y.tool??"")})}),(0,n.jsx)("td",{children:String(y.phase??"")}),(0,n.jsx)("td",{children:xs(y.durationMs)}),(0,n.jsxs)("td",{children:["#",String(y.turnIndex??0)]}),(0,n.jsx)("td",{children:L})]},S)})})})})]}):null]})}function Vs(e){let[t,s]=(0,c.useState)(null);if((0,c.useEffect)(()=>s(null),[e.row.sessionId]),!ke.authed)return null;let i=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),f=await r.json().catch(()=>({}));!f.ok||!f.report?s({loading:!1,error:String(f.error??r.status)}):s({loading:!1,report:f.report})}catch(r){s({loading:!1,error:String(r)})}};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"insight-btn",type:"button",disabled:t?.loading,onClick:()=>{i()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(fe,{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)(Xs,{report:t.report}):null]})]})}function Ws(e){let t=(0,c.useRef)(null);En(t,!!e.row);let s=e.row,i=s?Pe(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:se(s.title)||s.sessionId}),(0,n.jsx)(le,{id:"drawer-close",className:"card-act drawer-close-btn",icon:R.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(We,{status:s.status}),(0,n.jsx)(Ln,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(Nn,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",te(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"),":"]})," ",Ce(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(Nn,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(Nn,{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)(Pt,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(Rs,{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)(Dt,{row:s,url:i}),Xe(s)?(0,n.jsx)("button",{id:"restart-btn",type:"button",onClick:async r=>{await e.restartSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.restart")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"lock-btn",type:"button",onClick:r=>{e.setSessionLocked(s,!s.locked,r.currentTarget)},children:ze(s)}):null,s.queued&&s.status!=="closed"?(0,n.jsx)("button",{id:"start-btn",type:"button",className:"primary",onClick:async r=>{await e.startSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.create.start")}):null,s.status==="closed"?(0,n.jsx)("button",{id:"resume-btn",type:"button",className:"primary",onClick:async r=>{await e.resumeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.resume")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"close-btn",type:"button",className:"contrast",onClick:async r=>{await e.closeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.close")}):null,(0,n.jsx)(zs,{row:s}),(0,n.jsx)(Vs,{row:s})]})]}):null})}function Gs(e){let t=e.state;(0,c.useEffect)(()=>{let u=e.dialog;return()=>{u.open&&u.close()}},[e.dialog]),(0,c.useEffect)(()=>{let u=e.dialog;if(t){if(!u.open)try{u.showModal()}catch{}}else u.open&&u.close()},[e.dialog,t]),(0,c.useEffect)(()=>{let u=e.dialog,k=()=>e.onClose(),M=O=>{O.target===u&&e.onClose()};return u.addEventListener("close",k),u.addEventListener("click",M),()=>{u.removeEventListener("close",k),u.removeEventListener("click",M)}},[e]);let[s,i]=(0,c.useState)(""),[r,f]=(0,c.useState)(new Set),[g,m]=(0,c.useState)("lead"),[y,S]=(0,c.useState)(""),[L,I]=(0,c.useState)("in_progress"),[v,B]=(0,c.useState)(""),[H,E]=(0,c.useState)(""),[V,Q]=(0,c.useState)(!1),[J,U]=(0,c.useState)(!1),[P,W]=(0,c.useState)(""),[N,Z]=(0,c.useState)(()=>qn(Y())),[K,G]=(0,c.useState)(null);if((0,c.useEffect)(()=>{t&&(i(""),f(new Set),m("lead"),S(""),I("in_progress"),B(""),E(""),Q(!1),U(!1),W(""),G(null))},[t]),!t)return null;if(t.success){let u=t.success,k=typeof u.shareLink=="string"&&u.shareLink?u.shareLink:"",M=Array.isArray(u.failed)?u.failed.length:0,O=Array.isArray(u.spawned)?u.spawned.length:0,A=u.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:[A,"\uFF08",O,"\uFF09"]}),M>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(M)})}):null,k?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:k,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)(fe,{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 z=t.bots,q=[...r],D=q,ve=u=>z.find(k=>k.larkAppId===u)?.botName??u,ee=P.trim().toLowerCase(),Ie=ee?z.filter(u=>u.botName.toLowerCase().includes(ee)||u.larkAppId.toLowerCase().includes(ee)):z,F=async u=>{u.preventDefault();let k=s.trim();if(!k){alert(o("sessions.create.errContent"));return}if(q.length===0){alert(o("sessions.create.errNoBot"));return}let M=y||q[0]||"";if(g==="lead"&&(!M||!q.includes(M))){alert(o("sessions.create.errLead"));return}U(!0),G(null);try{let O=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:k,larkAppIds:q,mode:g,column:L,leadLarkAppId:g==="lead"?M:void 0,name:v.trim()||void 0,bindWorkingDir:H.trim()||void 0})}),A=await O.json().catch(()=>null);O.ok&&A?.ok?N?(G(A),i(""),B("")):e.onSuccess(A):O.status!==401&&alert(`${o("sessions.create.failed")}: ${A?.error??O.status}`)}catch(O){alert(`${o("sessions.create.failed")}: ${O}`)}finally{U(!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:F,children:[(0,n.jsxs)("fieldset",{className:"cs-content",children:[(0,n.jsx)("legend",{children:o("sessions.create.content")}),(0,n.jsx)("textarea",{name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),required:!0,value:s,onChange:u=>i(u.currentTarget.value)})]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),z.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:P,onChange:u=>W(u.currentTarget.value)}),Ie.length?(0,n.jsx)("div",{className:"cs-bot-list",children:Ie.map(u=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:u.larkAppId,checked:r.has(u.larkAppId),onChange:k=>{let M=k.currentTarget.checked;f(O=>{let A=new Set(O);return M?A.add(u.larkAppId):A.delete(u.larkAppId),A.has(y)||S(A.values().next().value??""),A})}})," ",(0,n.jsx)("span",{children:u.botName})]},u.larkAppId))}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBotMatch")}),q.length?(0,n.jsx)("small",{children:o("sessions.create.selectedCount",{n:String(q.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:()=>m("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:g==="all",onChange:()=>m("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:D.length===0,value:D.includes(y)?y:"",onChange:u=>S(u.currentTarget.value),children:D.length?D.map(u=>(0,n.jsx)("option",{value:u,children:ve(u)},u)):(0,n.jsx)("option",{value:"",disabled:!0,children:o("sessions.create.leadPickFirst")})}),(0,n.jsx)("small",{children:o("sessions.create.leadHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-column",children:[(0,n.jsx)("legend",{children:o("sessions.create.column")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"in_progress",checked:L==="in_progress",onChange:()=>I("in_progress")})," ",o("sessions.create.columnInProgress")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"backlog",checked:L==="backlog",onChange:()=>I("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${V?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":V,"aria-controls":"cs-advanced-fields",onClick:()=>Q(u=>!u),children:o("sessions.create.optionalConfig")})}),V?(0,n.jsxs)("div",{id:"cs-advanced-fields",className:"cs-advanced-fields",children:[(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.groupName")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"name",maxLength:60,placeholder:o("sessions.create.groupNamePlaceholder"),value:v,onChange:u=>B(u.currentTarget.value)})]}),(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.workingDir")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"bindWorkingDir",placeholder:"e.g. ~/projects/foo",value:H,onChange:u=>E(u.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),K?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[K.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(K.failed)&&K.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(K.failed.length)})}`:""]}),typeof K.shareLink=="string"&&K.shareLink?(0,n.jsx)("a",{href:K.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:N,onChange:u=>{let k=u.currentTarget.checked;Z(k),Yn(Y(),k)}}),(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||z.length===0,children:J?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function qs(){it();let e=at(a=>[...a.sessions.values()]),[t,s]=(0,c.useState)(0),i=(0,c.useCallback)(()=>s(a=>a+1),[]),[r,f]=(0,c.useState)({q:"",status:"",adopt:"",chat:"",showUnknownChats:Xn(Y()),active:!0,cli:new Set(be)}),[g,m]=(0,c.useState)(new Set),[y,S]=(0,c.useState)("lastMessageAt"),[L,I]=(0,c.useState)("desc"),[v,B]=(0,c.useState)(()=>zn(Y())),[H,E]=(0,c.useState)(()=>Vn(Y())),[V,Q]=(0,c.useState)(!1),[J,U]=(0,c.useState)(null),[P,W]=(0,c.useState)(null),[N,Z]=(0,c.useState)(()=>Qn(Y())),K=`${v}:${v==="kanban"?N:"-"}`,G=(0,c.useRef)(!0),[z,q]=(0,c.useState)(0),[D,ve]=(0,c.useState)([]),[ee,Ie]=(0,c.useState)(null),[F,u]=(0,c.useState)(!1),k=(0,c.useRef)(!1),[M,O]=(0,c.useState)(()=>{try{return window.localStorage.getItem(un)??""}catch{return""}}),[A,X]=(0,c.useState)({data:null,key:"",fetchedAt:0}),pe=(0,c.useRef)(!1),ne=(0,c.useRef)(new Set),[de,$e]=(0,c.useState)(""),[He,Ne]=(0,c.useState)(null),[ae,Me]=(0,c.useState)(null),[ce,ie]=(0,c.useState)(null),[Ke,Le]=(0,c.useState)(!1),[Ge,j]=(0,c.useState)(24),[qe,_e]=(0,c.useState)(""),[An,Ee]=(0,c.useState)(null),[Ot,Ae]=(0,c.useState)(null),[$t,Ye]=(0,c.useState)(null),[Ht,Kt]=(0,c.useState)(null),[Qe,_t]=(0,c.useState)(null),[Ut,Ue]=(0,c.useState)(null),[Ft,Ze]=(0,c.useState)(!1),xe=(0,c.useRef)(0);(0,c.useLayoutEffect)(()=>{if(G.current){G.current=!1;return}q(a=>a+1)},[K]),(0,c.useEffect)(()=>{_t(document.getElementById("create-session-modal"))},[]),(0,c.useEffect)(()=>{tt().then(i)},[i]);let en=(0,c.useMemo)(()=>{let a=new Map;for(let l of e){let d=String(l.chatId??"").trim();if(!d||!r.showUnknownChats&&kn(l))continue;let b=Ce(l),p=a.get(d);(!p||b<p)&&a.set(d,b)}return[...a.entries()].sort((l,d)=>l[1].localeCompare(d[1])).map(([l,d])=>({value:l,label:d}))},[r.showUnknownChats,t,e]);(0,c.useEffect)(()=>{r.chat&&(en.some(a=>a.value===r.chat)||f(a=>({...a,chat:""})))},[en,r.chat]);let re=(0,c.useMemo)(()=>{let a=r.q.toLowerCase(),l=[...r.cli],d=l.length>0&&l.length<be.length,b=v==="kanban";return e.filter(p=>!d||l.includes(p.cliId??"unknown")).filter(p=>r.showUnknownChats||!kn(p)).filter(p=>!r.status||p.status===r.status).filter(p=>!r.adopt||r.adopt==="yes"==!!p.adopt).filter(p=>!r.chat||String(p.chatId??"")===r.chat).filter(p=>!r.active||b||p.status!=="closed").filter(p=>!a||yt(p).includes(a)).sort((p,h)=>Ms(p,h,y,L))},[r,t,L,y,e,v]),nn=(0,c.useMemo)(()=>pt(e),[e]),ue=(0,c.useMemo)(()=>new Map(e.map(a=>[a.sessionId,a])),[e,t]),xn=(0,c.useMemo)(()=>re.filter(a=>a.status!=="closed"),[re]),Re=(v==="table"?re:xn).filter(a=>a.status!=="closed"),Rn=[...g].map(a=>ue.get(a)).filter(a=>!!a&&a.status!=="closed"),Bn=Re.length>0&&Re.every(a=>g.has(a.sessionId)),jt=Re.some(a=>g.has(a.sessionId))&&!Bn;(0,c.useEffect)(()=>{m(a=>{let l=!1,d=new Set;for(let b of a){let p=ue.get(b);p&&p.status!=="closed"?d.add(b):l=!0}return l?d:a})},[ue]);let tn=(0,c.useCallback)(a=>{let l=new Set;if(!a)return l;for(let d of a.groupChats)l.add(d);if(ee)for(let[d,b]of ee){if(l.has(d))continue;let p=!1;for(let h of a.botIds)if(b.botIds.has(h)){p=!0;break}if(p){for(let h of b.observedNames)if(a.botNames.has(h)){l.add(d);break}}}return l},[ee]),Dn=(0,c.useMemo)(()=>{if(v==="kanban"&&N==="team"){let a=D.find(d=>d.key===M)??D[0],l=tn(a);return re.filter(d=>l.has(String(d.chatId)))}return re},[N,M,D,re,tn,v]),sn=(0,c.useCallback)(a=>ut(Dn,a),[Dn]),on=(0,c.useCallback)(async()=>{if(!(k.current||F)){k.current=!0;try{let[a,l,d]=await Promise.all([fetch("/api/team/hosted").then(h=>h.json()).catch(()=>null),fetch("/api/team/remote-roster").then(h=>h.json()).catch(()=>null),fetch("/api/groups").then(h=>h.json()).catch(()=>null)]);Array.isArray(d?.chats)&&Ie(new Map(d.chats.map(h=>[String(h.chatId),{botIds:new Set((h.memberBots??[]).filter(C=>C.inChat).map(C=>String(C.larkAppId))),observedNames:new Set((h.observedBotNames??[]).map(C=>String(C)))}])));let b=h=>({ids:new Set(h.map(C=>String(C.larkAppId))),names:new Set(h.map(C=>String(C.name??"")).filter(Boolean))}),p=[];for(let h of a?.teams??[]){let{ids:C,names:x}=b(h.bots??[]);p.push({key:`local:${h.teamId}`,label:h.isDefault?o("team.myHostedTeam"):String(h.name??h.teamId),botIds:C,botNames:x,groupChats:new Set((h.groupChatIds??[]).map($=>String($)))})}for(let h of l?.memberships??[]){let{ids:C,names:x}=b(h.roster?.bots??[]);p.push({key:`${h.hubUrl}::${h.teamId}`,label:String(h.teamName??h.teamId??h.hubUrl),botIds:C,botNames:x,groupChats:new Set})}ve(p),O(h=>p.length&&!p.some(C=>C.key===h)?p[0].key:h)}finally{u(!0),k.current=!1}}},[F]),Pn=(0,c.useCallback)(async(a,l,d,b,p)=>{try{let C=a.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(a.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:l,column:d,position:b})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:a,sessionId:l,column:d,position:b})}),x=await C.json().catch(()=>({}));(!C.ok||x?.ok===!1)&&(X($=>{if(!$.data||$.key!==a)return $;let _={...$.data.board};return p?_[l]=p:delete _[l],{...$,data:{...$.data,board:_}}}),C.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${x?.error??C.status}`))}catch(h){X(C=>{if(!C.data||C.key!==a)return C;let x={...C.data.board};return p?x[l]=p:delete x[l],{...C,data:{...C.data,board:x}}}),alert(`${o("sessions.kanban.moveFail")}: ${h}`)}},[]),Jt=(0,c.useCallback)(async a=>{let l=A.key===a.key&&Date.now()-A.fetchedAt<3e4;if(!(pe.current||l)){pe.current=!0;try{let b=a.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(a.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(a.key)}`,p=await fetch(b),h=await p.json().catch(()=>({}));if(!p.ok||h?.ok===!1)return;let C=typeof h.deploymentId=="string"?h.deploymentId:null,x=[];for(let $ of Array.isArray(h.reports)?h.reports:[])if(!(C&&$.deploymentId===C))for(let _ of Array.isArray($.sessions)?$.sessions:[])x.push({..._,remoteDeployment:$.deploymentName||$.deploymentId});X({key:a.key,fetchedAt:Date.now(),data:{board:h.board&&typeof h.board=="object"?h.board:{},remoteRows:x}})}finally{pe.current=!1}}},[A.fetchedAt,A.key]);(0,c.useEffect)(()=>{v==="kanban"&&N==="team"&&!F&&on()},[N,F,on,v]),(0,c.useEffect)(()=>{let a=window.setInterval(()=>{v==="kanban"&&N==="team"&&(X(l=>({...l,fetchedAt:0})),i())},3e4);return()=>window.clearInterval(a)},[N,i,v]);let On=(0,c.useCallback)(async(a,l,d,b)=>{try{let p=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:l,position:d})}),h=await p.json().catch(()=>({}));(!p.ok||h?.ok===!1)&&(a.kanbanColumn=b.column,a.kanbanPosition=b.position,i(),p.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${h?.error??p.status}`))}catch(p){a.kanbanColumn=b.column,a.kanbanPosition=b.position,i(),alert(`${o("sessions.kanban.moveFail")}: ${p}`)}},[i]),zt=(0,c.useCallback)(a=>{let l=!1;for(let d of a){let b=String(d.row.sessionId);if(!b||d.row.status==="closed"&&d.column!=="done")continue;if(N==="team"){let C=D.find(_=>_.key===M)??D[0];if(!C)continue;let $=(A.key===C.key&&A.data?A.data.board:{})[b];X(_=>{let Fn=_.key===C.key&&_.data?_.data:{board:{},remoteRows:_.data?.remoteRows??[]},rs={...Fn.board,[b]:{column:d.column,position:d.position}};return{..._,key:C.key,data:{...Fn,board:rs}}}),Pn(C.key,b,d.column,d.position,$),l=!0;continue}let p=he.sessions.get(b);if(!p)continue;let h={column:p.kanbanColumn,position:p.kanbanPosition};p.kanbanColumn=d.column,p.kanbanPosition=d.position,On(p,d.column,d.position,h),l=!0}l&&i()},[N,M,D,A,On,Pn,i]),$n=(0,c.useCallback)(async(a,l)=>{let d=a.title;a.title=l,i();try{let b=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:l})}),p=await b.json().catch(()=>({}));(!b.ok||p?.ok===!1)&&(a.title=d,i(),b.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${p?.error??b.status}`))}catch(b){a.title=d,i(),alert(`${o("sessions.kanban.renameFail")}: ${b}`)}},[i]),Hn=(0,c.useCallback)(async a=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/locate`,{method:"POST"}),d=await l.json();return d.ok?!0:(alert(`Locate failed: ${d.error??l.status}`),!1)}catch(l){return alert(`Locate error: ${l}`),!1}},[]),Kn=(0,c.useCallback)(async(a,l)=>{if(!confirm(o("sessions.closeConfirm")))return!1;l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/close`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`Close failed: ${b?.error??d.status}`),!1):(m(p=>{let h=new Set(p);return h.delete(a.sessionId),h}),i(),!0)}catch(d){return alert(`Close error: ${d}`),!1}finally{l&&(l.disabled=!1)}},[i]),an=(0,c.useCallback)(async(a,l,d)=>{let b=!!a.locked;if(b===l)return!0;a.locked=l,i(),d&&(d.disabled=!0);try{let p=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:l})}),h=await p.json().catch(()=>({}));return!p.ok||h?.ok===!1?(a.locked=b,i(),p.status!==401&&alert(`${o("sessions.lockFailed")}: ${h?.error??p.status}`),!1):(a.locked=!!h.locked,i(),!0)}catch(p){return a.locked=b,i(),alert(`${o("sessions.lockFailed")}: ${p}`),!1}finally{d&&(d.disabled=!1)}},[i]),rn=(0,c.useCallback)(async(a,l)=>{if(ne.current.has(a.sessionId)||!confirm(wt(a)))return!1;l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/restart`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`${o("sessions.restartFailed")}: ${b?.error??d.status}`),!1):(ne.current.add(a.sessionId),window.setTimeout(()=>ne.current.delete(a.sessionId),5e3),!0)}catch(d){return alert(`${o("sessions.restartFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),Xt=(0,c.useCallback)(async(a,l)=>{l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/resume`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(alert(`${o("sessions.resumeFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.resumeFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),Vt=(0,c.useCallback)(async(a,l)=>{l&&(l.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/start`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(d.status!==401&&alert(`${o("sessions.create.startFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.create.startFailed")}: ${d}`),!1}finally{l&&(l.disabled=!1)}},[]),ln=(0,c.useCallback)(a=>{Ae({sessionId:a.sessionId,loading:!0,messages:[]}),(async()=>{try{let l=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/history?limit=80`),d=await l.json().catch(()=>({}));if(!l.ok||d?.ok===!1){let p=String(d?.error??l.status),h=p==="not_found_yet"||p==="not_found";Ae(C=>C?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:[],error:p,stale:h}:C);return}let b=Array.isArray(d.messages)?d.messages:[];Ae(p=>p?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:b,ownerOpenId:d.ownerOpenId}:p)}catch(l){Ae(d=>d?.sessionId===a.sessionId?{sessionId:a.sessionId,loading:!1,messages:[],error:String(l)}:d)}})()},[]),Wt=(0,c.useCallback)(a=>{let l=Pe(a);if(!l){Ee(a.sessionId);return}Ye({sessionId:a.sessionId,url:l,loading:!0}),(async()=>{let d=l;if(Cn())try{let b=await fetch(`/api/sessions/${encodeURIComponent(a.sessionId)}/write-link`),p=await b.json().catch(()=>({}));b.ok&&p?.ok!==!1&&p?.url&&(d=p.url)}catch{}Ye(b=>b?.sessionId===a.sessionId?{sessionId:a.sessionId,url:d,loading:!1}:b)})()},[]),Gt=(0,c.useCallback)(async()=>{let a=[...g];if(a.length===0||!confirm(o("sessions.closeBulkConfirm",{count:a.length})))return;Ne({done:0,total:a.length});let l=0,d=0,b=[...a];async function p(){for(;b.length;){let h=b.shift();try{let C=await fetch(`/api/sessions/${encodeURIComponent(h)}/close`,{method:"POST"}),x=await C.json().catch(()=>({}));(!C.ok||x?.ok===!1)&&(d+=1)}catch{d+=1}finally{l+=1,Ne({done:l,total:a.length})}}}await Promise.all(Array.from({length:Math.min(6,a.length)},()=>p())),Ne(null),m(new Set),i(),d>0&&alert(`Failed: ${d}/${a.length}`)},[i,g]),qt=(0,c.useCallback)(async a=>{let l=[...g].map(C=>ue.get(C)).filter(C=>!!C&&C.status!=="closed"&&!!C.locked!==a);if(l.length===0)return;Me({locked:a,done:0,total:l.length});let d=0,b=0,p=[...l];async function h(){for(;p.length;){let C=p.shift(),x=!!C.locked;try{let $=await fetch(`/api/sessions/${encodeURIComponent(C.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:a})}),_=await $.json().catch(()=>({}));!$.ok||_?.ok===!1?(b+=1,C.locked=x):C.locked=!!_.locked}catch{b+=1,C.locked=x}finally{d+=1,Me({locked:a,done:d,total:l.length})}}}await Promise.all(Array.from({length:Math.min(6,l.length)},()=>h())),Me(null),i(),b>0&&alert(`${o("sessions.lockFailed")}: ${b}/${l.length}`)},[i,ue,g]),Yt=(0,c.useCallback)(()=>{let a=[...g].filter(d=>!!ue.get(d));if(a.length===0)return;let l=dt(a);ie(o("sessions.monitorRoomAdded",{added:l.added,total:l.total})),window.setTimeout(()=>ie(null),1800)},[ue,g]),Qt=(0,c.useCallback)(async a=>{let l=fn(a);if(!l)return;let d=sn(l);if(d.length!==0){j(l),Le(!0),_e(o("sessions.idleCleanupRunning"));try{let b=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:l,sessionIds:d.map(h=>h.sessionId)})}),p=await b.json().catch(()=>({}));if(!b.ok){b.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${p?.error??b.status}`),_e("");return}m(h=>{let C=new Set(h);for(let x of p?.results??[])x?.ok&&x?.sessionId&&C.delete(String(x.sessionId));return C}),_e(o("sessions.idleCleanupDone",{closed:Number(p?.closed??0),failed:Number(p?.failed??0)})),i()}catch(b){alert(`${o("sessions.idleCleanupFailed")}: ${b}`),_e("")}finally{Le(!1)}}},[sn,i]),Zt=a=>{let l=Jn(a)??"board";l!==v&&(B(l),Wn(Y(),l))},es=(a,l)=>{E(d=>{let b=d.indexOf(a),p=b+l;if(b<0||p<0||p>=d.length)return d;let h=[...d];return h.splice(b,1),h.splice(p,0,a),cn(Y(),h),h})},ns=(a,l)=>{a!==l&&E(d=>{let b=d.indexOf(a),p=d.indexOf(l);if(b<0||p<0)return d;let h=[...d];return h.splice(b,1),h.splice(p,0,a),cn(Y(),h),h})},ts=(0,c.useMemo)(()=>({rows:re,groupBy:N,teams:D,teamsLoaded:F,teamKey:M,teamBoardData:A.data,teamBoardKey:A.key}),[N,M,D,F,re,A.data,A.key]),ss=An?ue.get(An)??null:null,dn=(0,c.useMemo)(()=>F?D.length?D.map(a=>({value:a.key,label:a.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[D,F]),os=!F||D.length===0,_n=D.some(a=>a.key===M)?M:dn[0]?.value??"",as=dn.find(a=>a.value===_n)?.label??o("sessions.kanban.groupTeam"),is=(0,c.useCallback)(()=>{xe.current+=1,Ze(!1),Ue(null)},[]),Un=(0,c.useCallback)(async()=>{let a=xe.current+1;xe.current=a,Ue({bots:[],loading:!0}),Ze(!0);try{let l=await Ct();if(xe.current!==a)return;Ue({bots:l})}finally{xe.current===a&&Ze(!1)}},[]);return(0,c.useEffect)(()=>{let a=()=>{rt()&&ke.authed&&Un()};return a(),window.addEventListener(mn,a),()=>window.removeEventListener(mn,a)},[]),(0,n.jsxs)("section",{className:"page sessions-page",children:[(0,n.jsxs)("div",{className:"page-heading",children:[(0,n.jsxs)("div",{className:"sessions-heading-main",children:[(0,n.jsx)("p",{className:"eyebrow",children:o("nav.sessions")}),(0,n.jsx)("h1",{children:o("sessions.title")}),(0,n.jsxs)("div",{className:"sessions-view-controls",children:[(0,n.jsx)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":o("sessions.viewMode"),children:[["kanban",o("sessions.viewKanban")],["board",o("sessions.viewBoard")],["table",o("sessions.viewTable")]].map(([a,l])=>(0,n.jsx)("button",{type:"button","data-view":a,className:v===a?"active":void 0,"aria-pressed":v===a,onClick:()=>Zt(a),children:l},a))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${v==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":v!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([a,l])=>(0,n.jsx)("button",{type:"button","data-groupby":a,className:N===a?"active":void 0,"aria-pressed":N===a,onClick:()=>{Z(a),Zn(Y(),a)},children:l},a))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(v==="kanban"&&N==="team"&&F),children:de}),(0,n.jsx)(Be,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(v==="kanban"&&N==="team"),disabled:os,label:as,value:_n,options:dn,onChange:a=>{if(D.some(l=>l.key===a)){O(a);try{window.localStorage.setItem(un,a)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=ct()},children:o("sessions.monitorRoom")}),ke.authed?(0,n.jsx)(ot,{className:"page-primary-action create-session-btn",disabled:Ft,onClick:()=>{Un()},children:o("sessions.create.button")}):null]})]}),(0,n.jsxs)("div",{className:"session-runtime-stats","aria-live":"polite",children:[(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:nn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(Ps,{chatOptions:en,filters:r,setFilters:f,idleCleanup:{busy:Ke,hours:Ge,status:qe,countForHours:a=>sn(a).length,onRun:Qt}}),(0,n.jsx)(Os,{selectedCount:g.size,lockDisabled:!Rn.some(a=>!a.locked),unlockDisabled:!Rn.some(a=>!!a.locked),closeProgress:He,lockProgress:ae,monitorRoomText:ce,onClear:()=>m(new Set),onClose:()=>{Gt()},onAddToMonitorRoom:Yt,onLock:a=>{qt(a)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${z>0?" sessions-view-stage-enter":""}`,"data-view":v,"data-kanban-group":N,children:[(0,n.jsx)(Hs,{rows:re,selected:g,hidden:v!=="table",sortKey:y,sortDir:L,selectAllChecked:Bn,selectAllIndeterminate:jt,selectAllDisabled:Re.length===0,onOpen:a=>Ee(a.sessionId),onSelect:(a,l)=>m(d=>{let b=new Set(d);return l?b.add(a):b.delete(a),b}),onSelectAll:a=>m(l=>{let d=new Set(l);for(let b of Re)a?d.add(b.sessionId):d.delete(b.sessionId);return d}),onSort:a=>{y===a?I(L==="asc"?"desc":"asc"):(S(a),I(a==="spawnedAt"||a==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(_s,{rows:xn,selected:g,hidden:v!=="board",order:H,animated:V,dragColId:J,dragOverCol:P,onAnimated:()=>Q(!0),onMoveColumn:es,onMoveColumnTo:ns,onDragCol:U,onDragOverCol:W,onToggleSelect:a=>m(l=>{let d=new Set(l);return d.has(a.sessionId)?d.delete(a.sessionId):d.add(a.sessionId),d}),onOpen:a=>Ee(a.sessionId),onHistory:ln,onLocate:a=>Hn(a),onRestart:(a,l)=>{rn(a,l)},onLock:(a,l,d)=>{an(a,l,d)},onClose:(a,l)=>{Kn(a,l)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:Kt,className:`sessions-kanban${N==="bot"?" kanban-mode-bot":""}`,hidden:v!=="kanban",children:v==="kanban"?(0,n.jsx)(Rt,{host:Ht,...ts,canRestartSession:Xe,getTeamChatIds:tn,icons:{details:R.details,feishu:R.feishu,history:R.history,lock:R.lock,restart:R.restart,terminal:R.terminal,unlock:R.unlock},lockActionLabel:ze,sessionStatusText:De,onDetails:a=>Ee(String(a.sessionId)),onHistory:ln,onMoveRows:zt,onNeedTeamBoard:a=>{Jt(a)},onNeedTeams:()=>{on()},onOpenTerminal:Wt,onRename:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&$n(d,l)},onRestart:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&rn(d,l)},onTeamScope:a=>$e(a?o("sessions.kanban.teamScope",{chats:a.chats,sessions:a.sessions}):""),onToggleLock:(a,l)=>{let d=he.sessions.get(String(a.sessionId));d&&an(d,!d.locked,l)},onToggleSelect:a=>m(l=>{let d=String(a.sessionId),b=new Set(l);return b.has(d)?b.delete(d):b.add(d),b}),selectedSessionIds:g}):null})]},z),(0,n.jsx)(Ws,{row:ss,onClose:()=>Ee(null),locateSession:Hn,openHistory:ln,resumeSession:Xt,restartSession:rn,closeSession:Kn,setSessionLocked:an,startSession:Vt}),(0,n.jsx)(Js,{state:$t,onClose:()=>Ye(null),onRename:$n}),(0,n.jsx)(Fs,{state:Ot,onClose:()=>Ae(null)}),Qe?(0,Mn.createPortal)((0,n.jsx)(Gs,{dialog:Qe,state:Ut,onClose:is,onSuccess:a=>Ue(l=>l&&{...l,success:a})}),Qe):null]})}function Mo(e){return st(e,(0,n.jsx)(qs,{}))}export{Ds as CliFilterGroup,Mo as renderSessionsPage};
@@ -1,2 +1,2 @@
1
- import{b as w}from"./chunk-D2I5F4MY.js";import{a as q,c as re,i as Ce,k as D,p as E}from"./chunk-I35DXGM4.js";import{a as pe,r as fe}from"./chunk-3H6MVXXU.js";import{a as Pe}from"./chunk-SYC6D5XU.js";import{a as ke,d as oe}from"./chunk-5THX4DI2.js";import{c as te}from"./chunk-7SZRL6FY.js";var f=te(ke(),1);var b=te(ke(),1);var a=te(oe(),1),Re=["transcript_received","chat_received","participant_joined","participant_left","magic_share_started","magic_share_ended"],me=8e3,Be=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,xe="\u6301\u7EED\u6574\u7406\u4F1A\u8BAE\u7EAA\u8981\uFF0C\u91CD\u70B9\u8BB0\u5F55\u5DF2\u786E\u8BA4\u7684\u51B3\u7B56\u3001\u5F85\u529E\u4E8B\u9879\uFF08\u542B\u8D1F\u8D23\u4EBA\u548C\u622A\u6B62\u65F6\u95F4\uFF09\u4EE5\u53CA\u672A\u89E3\u51B3\u98CE\u9669\uFF1B\u5B57\u5E55\u4FEE\u8BA2\u65F6\u66F4\u65B0\u5DF2\u6709\u6761\u76EE\uFF0C\u4E0D\u91CD\u590D\u8BB0\u5F55\u540C\u4E00\u4E8B\u9879\u3002\u4EC5\u5728\u51FA\u73B0\u65B0\u7684\u5173\u952E\u51B3\u7B56\u3001\u660E\u786E\u5F85\u529E\u6216\u98CE\u9669\uFF0C\u6216\u88AB\u7528\u6237\u70B9\u540D\u65F6\uFF0C\u624D\u5728\u76D1\u542C\u7FA4\u8F93\u51FA\u7B80\u6D01\u589E\u91CF\uFF1B\u65E0\u5B9E\u8D28\u589E\u91CF\u65F6\u4FDD\u6301\u9759\u9ED8\uFF0C\u4E0D\u53D1\u9001\u786E\u8BA4\u6216\u5FC3\u8DF3\u3002\u9700\u8981\u5411\u4F1A\u8BAE\u5185\u53D1\u9001\u6587\u5B57\u6216\u8BED\u97F3\u65F6\uFF0C\u5FC5\u987B\u901A\u8FC7 botmux \u53D7\u7BA1 request-output/action gate \u63D0\u4EA4\uFF0C\u4E0D\u5F97\u7ED5\u8FC7\u6743\u9650\u3001\u6240\u6709\u6743\u4E0E\u5BA1\u6838\u7B56\u7565\u3002",Ne=0;function Te(){return Ne+=1,`p${Ne}`}function Se(e){return{...e,uiKey:Te(),isNew:!1}}function Le(e){let{uiKey:t,isNew:i,...g}=e;return g}function Q(e){return(0,a.jsxs)("span",{className:"vc-profile-field-head",children:[e.title,(0,a.jsx)(Ce,{label:e.title,children:(0,a.jsx)("span",{className:"vc-profile-help",children:e.help})})]})}function Me(e){let t=w();return e.enabled?e.canWrite?(0,a.jsx)(Ue,{canWrite:e.canWrite,listenerBotAppId:e.listenerBotAppId,listenerBotOptions:e.listenerBotOptions}):(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.needAuth")}):null}function Ue(e){let t=w(),i=(0,b.useRef)(!1),g=e.listenerBotOptions,[m,v]=(0,b.useState)(e.listenerBotAppId??g[0]?.larkAppId??""),[c,C]=(0,b.useState)(null),[I,T]=(0,b.useState)(null),[k,z]=(0,b.useState)(!1),[x,H]=(0,b.useState)(!1),[M,r]=(0,b.useState)(!1),[p,P]=(0,b.useState)(!1),[j,L]=(0,b.useState)({}),[G,ie]=(0,b.useState)(!1);(0,b.useEffect)(()=>(i.current=!0,()=>{i.current=!1}),[]);let V=(0,b.useRef)(0);(0,b.useEffect)(()=>{e.listenerBotAppId&&e.listenerBotAppId!==m&&!x&&v(e.listenerBotAppId)},[x,e.listenerBotAppId,m]);let J=(0,b.useCallback)(async s=>{let o=++V.current;if(C(null),H(!1),P(!1),L({}),!s){T(null);return}z(!0);try{let l=await fetch(`/api/vc-meeting/consumer-profiles?listenerBotAppId=${encodeURIComponent(s)}`),u=await l.json().catch(()=>({}));if(!i.current||V.current!==o)return;!l.ok||u?.ok!==!0?(C(null),T(typeof u?.error=="string"?u.error:`HTTP ${l.status}`)):(C({forBot:s,revision:u.revision,catalogState:u.catalogState==="explicit_empty"||u.catalogState==="legacy_or_partial"||u.catalogState==="profiles"?u.catalogState:"uninitialized",defaultMode:u.defaultMode==="agents"?"agents":"listenOnly",defaultConsumerIds:Array.isArray(u.defaultConsumerIds)?u.defaultConsumerIds:[],profiles:(Array.isArray(u.profiles)?u.profiles:[]).map(Se),agentOptions:Array.isArray(u.agentOptions)?u.agentOptions:[],...u.migrationOffer==="enable_seeded_minutes_default"?{migrationOffer:u.migrationOffer}:{}}),T(null),H(!1))}catch(l){if(!i.current||V.current!==o)return;C(null),T(l instanceof Error?l.message:String(l))}finally{i.current&&V.current===o&&z(!1)}},[]);(0,b.useEffect)(()=>{J(m)},[J,m]);let S=(0,b.useCallback)(s=>{C(o=>o&&s(o)),H(!0),ie(!1)},[]),Z=(0,b.useCallback)((s,o)=>{S(l=>({...l,profiles:l.profiles.map(u=>u.uiKey===s?{...u,...o}:u)}))},[S]),ne=(0,b.useCallback)(async()=>{if(!c||M||k||!c.forBot||c.forBot!==m)return;let s={};if(c.profiles.forEach((o,l)=>{Be.test(o.id)||(s[`profiles[${l}].id`]=t("settings.vcProfiles.idInvalid")),(o.instructions??"").length>me&&(s[`profiles[${l}].instructions`]=t("settings.vcProfiles.instructionsTooLong"))}),Object.keys(s).length>0){L(s);return}r(!0),P(!1),L({});try{let o=await fetch("/api/vc-meeting/consumer-profiles",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({listenerBotAppId:c.forBot,expectedRevision:c.revision,defaultMode:c.defaultMode,defaultConsumerIds:c.defaultConsumerIds,profiles:c.profiles.map(Le)})}),l=await o.json().catch(()=>({}));if(!i.current||c.forBot!==m)return;if(o.status===409){P(!0);return}if(o.status===422){let u={};for(let R of Array.isArray(l?.fieldErrors)?l.fieldErrors:[])typeof R?.path=="string"&&typeof R?.message=="string"&&(u[R.path]=R.message);L(Object.keys(u).length>0?u:{profiles:t("settings.vcProfiles.validationFailed")});return}if(!o.ok||l?.ok!==!0){L({profiles:typeof l?.error=="string"?l.error:`HTTP ${o.status}`});return}C({forBot:c.forBot,revision:l.revision,catalogState:l.catalogState==="explicit_empty"||l.catalogState==="legacy_or_partial"||l.catalogState==="profiles"?l.catalogState:"uninitialized",defaultMode:l.defaultMode==="agents"?"agents":"listenOnly",defaultConsumerIds:Array.isArray(l.defaultConsumerIds)?l.defaultConsumerIds:[],profiles:(Array.isArray(l.profiles)?l.profiles:[]).map(Se),agentOptions:Array.isArray(l.agentOptions)?l.agentOptions:[],...l.migrationOffer==="enable_seeded_minutes_default"?{migrationOffer:l.migrationOffer}:{}}),H(!1),ie(!0)}catch(o){if(!i.current)return;L({profiles:o instanceof Error?o.message:String(o)})}finally{i.current&&r(!1)}},[c,M,m,t]),X=(0,b.useMemo)(()=>g.map(s=>({value:s.larkAppId,label:s.botName||s.larkAppId})),[g]),Y=X.find(s=>s.value===m)?.label??m,ce=(0,b.useMemo)(()=>c?c.agentOptions.map(s=>{let o=[s.online?void 0:t("settings.vcProfiles.agentOffline"),s.workingDirReady?void 0:t("settings.vcProfiles.agentNoWorkingDir"),s.reliableTurnTerminal?void 0:t("settings.vcProfiles.agentNoReliableTerminal"),s.managedSideEffectIsolation?void 0:t("settings.vcProfiles.agentNoManagedIsolation")].filter(Boolean);return{value:s.appId,label:(0,a.jsxs)("span",{className:"vc-agent-option",children:[(0,a.jsxs)("span",{className:"vc-agent-option-name",children:[s.label,s.cliId?(0,a.jsx)("em",{className:"vc-agent-option-cli",children:s.cliId}):null]}),o.length>0?(0,a.jsxs)("span",{className:"vc-agent-option-warn",children:["\u26A0 ",o.join(" \xB7 ")]}):null]})}}):[],[c,t]),se=s=>{let o=c?.agentOptions.find(u=>u.appId===s);return o?!o.online||!o.workingDirReady||!o.reliableTurnTerminal||!o.managedSideEffectIsolation?`\u26A0 ${o.label}`:o.label:s},ae=(0,b.useCallback)(s=>{let l=["observe_only","meeting_text","meeting_voice","meeting_text_voice"].map(u=>({value:u,label:t(`settings.vcProfiles.preset.${u}`)}));return(!s.isNew||s.permissionPreset==="custom")&&l.push({value:"custom",label:t("settings.vcProfiles.preset.custom")}),l},[t]),de=(0,b.useCallback)(()=>{S(s=>({...s,profiles:[...s.profiles,{uiKey:Te(),isNew:!0,id:"",agentAppId:s.agentOptions[0]?.appId??"",responseMode:"silent",permissionPreset:"observe_only"}]}))},[S]),ue=(0,b.useCallback)(s=>{S(o=>({...o,profiles:o.profiles.filter(l=>l.uiKey!==s),defaultConsumerIds:o.defaultConsumerIds.filter(l=>o.profiles.some(u=>u.uiKey!==s&&u.id===l))}))},[S]);if(g.length===0)return null;let h=s=>j[s],B=!e.canWrite||M||k,O=c?.agentOptions.some(s=>s.workingDirReady&&s.reliableTurnTerminal&&s.managedSideEffectIsolation)??!1;return(0,a.jsxs)("div",{className:"vc-profiles-section",children:[(0,a.jsxs)("div",{className:"settings-field-row",children:[(0,a.jsx)(D,{help:t("settings.vcProfiles.help"),children:t("settings.vcProfiles.title")}),e.listenerBotAppId===null&&X.length>1?(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:t("settings.vcProfiles.listenerOwner")}),(0,a.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcProfiles.listenerOwner"),disabled:k||M,value:m,label:q(X,m),options:X,onChange:s=>{s!==m&&(x&&!window.confirm(t("settings.vcProfiles.discardConfirm"))||v(s))}})]}):(0,a.jsx)("span",{className:"vc-profile-config-target",children:t("settings.vcProfiles.configuringBot",{bot:Y})})]}),(0,a.jsx)("p",{className:"hint vc-profiles-freeze",children:t("settings.vcProfiles.freezeNotice")}),k?(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.loading")}):null,I?(0,a.jsx)("p",{className:"hint-warn",children:I==="bot_not_in_config"?t("settings.vcProfiles.botNotInConfig"):`${t("settings.vcProfiles.loadFailed")}: ${I}`}):null,p?(0,a.jsxs)("p",{className:"hint-warn",children:[t("settings.vcProfiles.conflict")," ",(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",onClick:()=>{J(m)},children:t("settings.vcProfiles.reload")})]}):null,h("profiles")?(0,a.jsx)("p",{className:"hint-warn",children:h("profiles")}):null,c?(0,a.jsxs)(a.Fragment,{children:[c.migrationOffer==="enable_seeded_minutes_default"?(0,a.jsxs)("p",{className:"hint-warn vc-profile-migration-offer",children:[t("settings.vcProfiles.migrationOffer")," ",(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",disabled:B||x,onClick:()=>S(s=>({...s,defaultMode:"agents",defaultConsumerIds:["minutes"],profiles:s.profiles.map(o=>o.id==="minutes"?{...o,instructions:xe,responseMode:"listener_thread",permissionPreset:"meeting_text_voice"}:o),migrationOffer:void 0})),children:t("settings.vcProfiles.migrationEnable")})]}):null,c.catalogState==="uninitialized"&&c.profiles.length===0&&!O?(0,a.jsx)("p",{className:"hint-warn",children:t("settings.vcProfiles.noEligibleDefaultAgent")}):null,c.catalogState==="legacy_or_partial"?(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.legacyCatalog")}):null,c.profiles.map((s,o)=>(0,a.jsxs)("div",{className:"vc-profile-card",children:[(0,a.jsxs)("div",{className:"vc-profile-grid",children:[(0,a.jsxs)("label",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldId"),help:t("settings.vcProfiles.idHelp")})}),(0,a.jsx)("input",{type:"text",value:s.id,disabled:B||!s.isNew,placeholder:"minutes",onChange:l=>{let u=l.target.value,R=s.id;S(_=>({..._,profiles:_.profiles.map($=>$.uiKey===s.uiKey?{...$,id:u}:$),defaultConsumerIds:_.defaultConsumerIds.map($=>$===R&&R?u:$).filter($=>!!$)}))}}),h(`profiles[${o}].id`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].id`)}):null]}),(0,a.jsxs)("label",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldLabel"),help:t("settings.vcProfiles.labelHelp")})}),(0,a.jsx)("input",{type:"text",value:s.label??"",disabled:B,onChange:l=>Z(s.uiKey,{label:l.target.value||void 0})}),h(`profiles[${o}].label`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].label`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldAgent"),help:t("settings.vcProfiles.agentHelp")})}),(0,a.jsx)(E,{className:"vc-profile-agent-menu",ariaLabel:t("settings.vcProfiles.fieldAgent"),disabled:B,value:s.agentAppId,label:se(s.agentAppId),options:ce,onChange:l=>Z(s.uiKey,{agentAppId:l})}),h(`profiles[${o}].agentAppId`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].agentAppId`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldResponseMode"),help:t("settings.vcProfiles.responseModeHelp")})}),(0,a.jsx)(E,{ariaLabel:t("settings.vcProfiles.fieldResponseMode"),disabled:B,value:s.responseMode,label:s.responseMode==="listener_thread"?t("settings.vcProfiles.responseListener"):t("settings.vcProfiles.responseSilent"),options:[{value:"silent",label:t("settings.vcProfiles.responseSilent")},{value:"listener_thread",label:t("settings.vcProfiles.responseListener")}],onChange:l=>Z(s.uiKey,{responseMode:l})}),h(`profiles[${o}].responseMode`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].responseMode`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldPreset"),help:t("settings.vcProfiles.presetHelp")})}),(0,a.jsx)(E,{ariaLabel:t("settings.vcProfiles.fieldPreset"),disabled:B,value:s.permissionPreset,label:q(ae(s),s.permissionPreset),options:ae(s),onChange:l=>Z(s.uiKey,{permissionPreset:l})}),h(`profiles[${o}].permissionPreset`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].permissionPreset`)}):null]})]}),(0,a.jsxs)("label",{className:"vc-profile-field vc-profile-instructions",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldInstructions"),help:t("settings.vcProfiles.instructionsHelp")}),(0,a.jsxs)("em",{className:"vc-profile-count",children:[(s.instructions??"").length,"/",me]})]}),(0,a.jsx)("textarea",{rows:4,maxLength:me,value:s.instructions??"",disabled:B,placeholder:t("settings.vcProfiles.instructionsPlaceholder"),onChange:l=>Z(s.uiKey,{instructions:l.target.value||void 0})}),h(`profiles[${o}].instructions`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].instructions`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldActivityTypes"),help:t("settings.vcProfiles.activityHelp")})}),(0,a.jsx)("div",{className:"vc-profile-activity",children:Re.map(l=>{let u=s.activityTypes?.includes(l)??!1;return(0,a.jsxs)("label",{className:"vc-profile-check",children:[(0,a.jsx)("input",{type:"checkbox",checked:u,disabled:B,onChange:R=>{let _=new Set(s.activityTypes??[]);R.target.checked?_.add(l):_.delete(l),Z(s.uiKey,{activityTypes:_.size>0?[..._]:void 0})}}),t(`settings.vcProfiles.activity.${l}`)]},l)})}),(0,a.jsx)("em",{className:"vc-profile-hint",children:t("settings.vcProfiles.activityAllHint")}),h(`profiles[${o}].activityTypes`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].activityTypes`)}):null]}),e.canWrite?(0,a.jsx)("button",{type:"button",className:"vc-profiles-link vc-profile-remove",disabled:M||k,onClick:()=>ue(s.uiKey),children:t("settings.vcProfiles.remove")}):null]},s.uiKey)),e.canWrite?(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",disabled:M||k,onClick:de,children:t("settings.vcProfiles.add")}):null,(0,a.jsxs)("div",{className:"settings-field-row",children:[(0,a.jsx)(D,{help:t("settings.vcProfiles.defaultModeHelp"),children:t("settings.vcProfiles.defaultMode")}),(0,a.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcProfiles.defaultMode"),disabled:B,value:c.defaultMode,label:c.defaultMode==="agents"?t("settings.vcProfiles.defaultModeAgents"):t("settings.vcProfiles.defaultModeListenOnly"),options:[{value:"listenOnly",label:t("settings.vcProfiles.defaultModeListenOnly")},{value:"agents",label:t("settings.vcProfiles.defaultModeAgents")}],onChange:s=>S(o=>({...o,defaultMode:s==="agents"?"agents":"listenOnly"}))})]}),c.defaultMode==="agents"?(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:t("settings.vcProfiles.defaultConsumers")}),(0,a.jsx)("div",{className:"vc-profile-activity",children:c.profiles.filter(s=>s.id).map(s=>{let o=c.defaultConsumerIds.includes(s.id);return(0,a.jsxs)("label",{className:"vc-profile-check",children:[(0,a.jsx)("input",{type:"checkbox",checked:o,disabled:B,onChange:l=>{S(u=>({...u,defaultConsumerIds:l.target.checked?[...u.defaultConsumerIds,s.id]:u.defaultConsumerIds.filter(R=>R!==s.id)}))}}),s.label||s.id]},s.uiKey)})}),h("defaultConsumerIds")?(0,a.jsx)("em",{className:"vc-profile-err",children:h("defaultConsumerIds")}):null,h("defaultMode")?(0,a.jsx)("em",{className:"vc-profile-err",children:h("defaultMode")}):null]}):null,e.canWrite?(0,a.jsxs)("div",{className:"vc-profiles-actions",children:[(0,a.jsx)("button",{type:"button",className:"vc-profiles-save",disabled:!x||M||p,onClick:()=>{ne()},children:t(M?"settings.vcProfiles.saving":"settings.vcProfiles.save")}),G?(0,a.jsx)("span",{className:"vc-profile-hint",children:t("settings.vcProfiles.saved")}):null,x&&!M?(0,a.jsx)("span",{className:"vc-profile-hint",children:t("settings.vcProfiles.unsaved")}):null]}):null]}):null]})}var n=te(oe(),1),ve=["Asia/Shanghai","Asia/Hong_Kong","Asia/Tokyo","Asia/Singapore","Asia/Kolkata","UTC","Europe/London","Europe/Paris","Europe/Moscow","America/Los_Angeles","America/New_York","America/Sao_Paulo","Australia/Sydney"];function De(e,t){if(!e||typeof e!="object")return null;if(e.failed){let i=e.failed.step==="install"?t("settings.herdrTraexInstallStepInstall"):t("settings.herdrTraexInstallStepAction");return{text:`${t("settings.herdrTraexInstallFailed")}\uFF08${i}\uFF09: ${e.failed.reason??""}`,cls:"hint-warn-inline"}}if(e.skippedReason==="plugin_unsupported"){let i=typeof e.herdrVersion=="string"&&e.herdrVersion?` (${e.herdrVersion})`:"";return{text:`${t("settings.herdrTraexUnsupported")}${i}`,cls:"hint-warn-inline"}}return e.installed||e.actionInvoked?{text:t("settings.herdrTraexInstalled"),cls:"hint-ok"}:e.alreadyInstalled?{text:t("settings.herdrTraexAlreadyInstalled"),cls:"hint-ok"}:null}function he(e){return{publicReadOnly:e?.publicReadOnly===!0,openTerminalInFeishu:e?.openTerminalInFeishu===!0,enableLocalCliOpen:e?.enableLocalCliOpen===!0,localCliOpenMode:e?.localCliOpenMode==="resume"?"resume":"attach",chatBotDiscovery:e?.chatBotDiscovery!==!1,herdrTraexPlugin:{enabled:e?.herdrTraexPlugin?.enabled===!0,source:typeof e?.herdrTraexPlugin?.source=="string"?e.herdrTraexPlugin.source:"",ref:typeof e?.herdrTraexPlugin?.ref=="string"?e.herdrTraexPlugin.ref:"",recommendedSource:typeof e?.herdrTraexPlugin?.recommendedSource=="string"?e.herdrTraexPlugin.recommendedSource:"",recommendedRef:typeof e?.herdrTraexPlugin?.recommendedRef=="string"?e.herdrTraexPlugin.recommendedRef:""},vcMeetingAgent:{enabled:e?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof e?.vcMeetingAgent?.listenerBotAppId=="string"?e.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(e?.vcMeetingAgent?.listenerBotOptions)?e.vcMeetingAgent.listenerBotOptions:[],larkCliVersion:e?.vcMeetingAgent?.larkCliVersion===void 0?void 0:e.vcMeetingAgent.larkCliVersion??null,larkCliMeetsRequirement:e?.vcMeetingAgent?.larkCliMeetsRequirement===!0,larkCliMinVersion:typeof e?.vcMeetingAgent?.larkCliMinVersion=="string"?e.vcMeetingAgent.larkCliMinVersion:void 0},repoPickerMode:e?.repoPickerMode==="repos"?"repos":"all",maintenance:e?.maintenance&&typeof e.maintenance=="object"?e.maintenance:{},localDevInstall:e?.localDevInstall===!0,autoUpdateSupported:e?.autoUpdateSupported!==!1,whiteboard:{enabled:e?.whiteboard?.enabled===!0},remoteAccess:e?.remoteAccess===!0,scheduleTimeZone:typeof e?.scheduleTimeZone=="string"?e.scheduleTimeZone:"",hostTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof e?.effectiveScheduleTimeZone=="string"&&e.effectiveScheduleTimeZone?e.effectiveScheduleTimeZone:typeof e?.scheduleTimeZone=="string"&&e.scheduleTimeZone?e.scheduleTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC"}}function Ee(e,t){let i=e?.[t]??{};return{enabled:i.enabled===!0,time:typeof i.time=="string"?i.time:"04:00"}}function we(e,t){return t(e==="npm-global"?"update.kindNpm":e==="pnpm-global"?"update.kindPnpm":e==="yarn-global"?"update.kindYarn":e==="bun-global"?"update.kindBun":e==="source-checkout"?"update.kindSource":"update.kindUnknown")}function _e(){let e=w(),t=(0,f.useRef)(!1),i=(0,f.useRef)(new Set),[g,m]=(0,f.useState)(null),[v,c]=(0,f.useState)(!1),[C,I]=(0,f.useState)(null),[T,k]=(0,f.useState)(!0),[z,x]=(0,f.useState)(!1),[H,M]=(0,f.useState)(null),[r,p]=(0,f.useState)(null),[P,j]=(0,f.useState)(null),[L,G]=(0,f.useState)(null),[ie,V]=(0,f.useState)(null),[J,S]=(0,f.useState)(null),[Z,ne]=(0,f.useState)(!1),[X,Y]=(0,f.useState)(!0),[ce,se]=(0,f.useState)(!1),[ae,de]=(0,f.useState)(""),[ue,h]=(0,f.useState)(!1),[B,O]=(0,f.useState)(null),s=(0,f.useCallback)(()=>{for(let d of i.current)window.clearTimeout(d);i.current.clear()},[]),o=(0,f.useCallback)((d,y)=>{let N=window.setTimeout(()=>{i.current.delete(N),d()},y);return i.current.add(N),N},[]),l=(0,f.useCallback)(async()=>{try{let d=await fetch("/api/update/status"),y=await d.json().catch(()=>({}));if(!t.current)return;if(!d.ok){G(null),V(y?.error??`HTTP ${d.status}`);return}G(y),V(null)}catch(d){if(!t.current)return;G(null),V(d instanceof Error?d.message:String(d))}},[]),u=(0,f.useCallback)(async()=>{try{let d=await fetch("/api/settings"),y=await d.json().catch(()=>({}));if(!t.current)return;if(!d.ok){m(null),I(y?.error??`HTTP ${d.status}`),c(!0);return}m(he(y.settings)),k(y.authed===!0),x(y.bound===!0),I(null),c(!0)}catch(d){if(!t.current)return;m(null),I(d instanceof Error?d.message:String(d)),c(!0)}},[]);(0,f.useEffect)(()=>(t.current=!0,u(),()=>{t.current=!1,s()}),[s,u]),(0,f.useEffect)(()=>{v&&(h(!1),O(null),ne(!1),T&&l())},[T,l,v]);async function R(d,y,N){if(!g)return;let A=g;m(N(g)),M(d),p({text:e("settings.saving")});try{let K=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(y)}),U=await K.json().catch(()=>({}));if(!t.current)return;if(!K.ok||U.ok===!1)throw typeof U?.feishuLoginQr=="string"&&U.feishuLoginQr&&j(U.feishuLoginQr),new Error(U?.error??`HTTP ${K.status}`);j(null);let ee=he(U.settings);m(ee),fe.publicReadOnly=ee.publicReadOnly,pe.setScheduleTimeZone(ee.effectiveScheduleTimeZone);let le=De(U.herdrTraexInstall,e);p(le??{text:e("settings.saved"),cls:"hint-ok"})}catch(K){if(!t.current)return;let U=!1;try{let le=await fetch("/api/settings"),ye=await le.json().catch(()=>({}));if(t.current&&le.ok&&ye?.settings){let ge=he(ye.settings);m(ge),fe.publicReadOnly=ge.publicReadOnly,pe.setScheduleTimeZone(ge.effectiveScheduleTimeZone),U=!0}}catch{}if(!t.current)return;U||m(A);let ee=K instanceof Error?K.message:String(K);p({text:U?`${e("settings.saveReconciled")}: ${ee}`:`${e("settings.saveFailed")}: ${ee}`,cls:"hint-warn-inline"})}finally{t.current&&M(null)}}async function _(){S(null),Y(!0),se(!1);try{let d=await fetch("/api/update/changelog"),y=await d.json().catch(()=>({}));if(!t.current)return;de(typeof y?.releasesUrl=="string"?y.releasesUrl:""),d.ok?(S(Array.isArray(y.releases)?y.releases:[]),Y(y.ok!==!1),se(y.rateLimited===!0)):(S([]),Y(!1))}catch{if(!t.current)return;S([]),Y(!1)}}function $(){let d=Date.now(),y=async()=>{if(t.current){if(Date.now()-d>9e4){h(!1),O({text:e("update.restartSlow"),cls:"hint-warn-inline"});return}try{let N=await fetch("/__health",{cache:"no-store"});if(!t.current)return;if(N.ok){location.reload();return}}catch{}t.current&&o(()=>{y()},2e3)}};o(()=>{y()},3e3)}async function be(d){h(!0),O({text:e("update.restarting")});try{if(await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(d?{update:d}:{})}),!t.current)return}catch(y){if(!t.current)return;h(!1),O({text:e("update.restartFailed",{detail:y instanceof Error?y.message:String(y)}),cls:"hint-warn-inline"});return}$()}async function Ie(){let d=L;if(!d)return;if(!d.node.ok){window.alert(e("update.nodeTooOldAlert",{version:d.node.version,required:d.node.required}));return}if(!d.updateSupported||!d.updateCommand){window.alert(e("update.unsupportedInstall"));return}if(d.installs.multiple){let N=d.installs.entries.map(A=>`\u2022 ${A.binPath} (${we(A.kind,e)})`).join(`
1
+ import{b as w}from"./chunk-EIO5AWDA.js";import{a as q,c as re,i as Ce,k as D,p as E}from"./chunk-I35DXGM4.js";import{a as pe,r as fe}from"./chunk-4QTBR7UF.js";import{a as Pe}from"./chunk-SYC6D5XU.js";import{a as ke,d as oe}from"./chunk-5THX4DI2.js";import{c as te}from"./chunk-7SZRL6FY.js";var f=te(ke(),1);var b=te(ke(),1);var a=te(oe(),1),Re=["transcript_received","chat_received","participant_joined","participant_left","magic_share_started","magic_share_ended"],me=8e3,Be=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,xe="\u6301\u7EED\u6574\u7406\u4F1A\u8BAE\u7EAA\u8981\uFF0C\u91CD\u70B9\u8BB0\u5F55\u5DF2\u786E\u8BA4\u7684\u51B3\u7B56\u3001\u5F85\u529E\u4E8B\u9879\uFF08\u542B\u8D1F\u8D23\u4EBA\u548C\u622A\u6B62\u65F6\u95F4\uFF09\u4EE5\u53CA\u672A\u89E3\u51B3\u98CE\u9669\uFF1B\u5B57\u5E55\u4FEE\u8BA2\u65F6\u66F4\u65B0\u5DF2\u6709\u6761\u76EE\uFF0C\u4E0D\u91CD\u590D\u8BB0\u5F55\u540C\u4E00\u4E8B\u9879\u3002\u4EC5\u5728\u51FA\u73B0\u65B0\u7684\u5173\u952E\u51B3\u7B56\u3001\u660E\u786E\u5F85\u529E\u6216\u98CE\u9669\uFF0C\u6216\u88AB\u7528\u6237\u70B9\u540D\u65F6\uFF0C\u624D\u5728\u76D1\u542C\u7FA4\u8F93\u51FA\u7B80\u6D01\u589E\u91CF\uFF1B\u65E0\u5B9E\u8D28\u589E\u91CF\u65F6\u4FDD\u6301\u9759\u9ED8\uFF0C\u4E0D\u53D1\u9001\u786E\u8BA4\u6216\u5FC3\u8DF3\u3002\u9700\u8981\u5411\u4F1A\u8BAE\u5185\u53D1\u9001\u6587\u5B57\u6216\u8BED\u97F3\u65F6\uFF0C\u5FC5\u987B\u901A\u8FC7 botmux \u53D7\u7BA1 request-output/action gate \u63D0\u4EA4\uFF0C\u4E0D\u5F97\u7ED5\u8FC7\u6743\u9650\u3001\u6240\u6709\u6743\u4E0E\u5BA1\u6838\u7B56\u7565\u3002",Ne=0;function Te(){return Ne+=1,`p${Ne}`}function Se(e){return{...e,uiKey:Te(),isNew:!1}}function Le(e){let{uiKey:t,isNew:i,...g}=e;return g}function Q(e){return(0,a.jsxs)("span",{className:"vc-profile-field-head",children:[e.title,(0,a.jsx)(Ce,{label:e.title,children:(0,a.jsx)("span",{className:"vc-profile-help",children:e.help})})]})}function Me(e){let t=w();return e.enabled?e.canWrite?(0,a.jsx)(Ue,{canWrite:e.canWrite,listenerBotAppId:e.listenerBotAppId,listenerBotOptions:e.listenerBotOptions}):(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.needAuth")}):null}function Ue(e){let t=w(),i=(0,b.useRef)(!1),g=e.listenerBotOptions,[m,v]=(0,b.useState)(e.listenerBotAppId??g[0]?.larkAppId??""),[c,C]=(0,b.useState)(null),[I,T]=(0,b.useState)(null),[k,z]=(0,b.useState)(!1),[x,H]=(0,b.useState)(!1),[M,r]=(0,b.useState)(!1),[p,P]=(0,b.useState)(!1),[j,L]=(0,b.useState)({}),[G,ie]=(0,b.useState)(!1);(0,b.useEffect)(()=>(i.current=!0,()=>{i.current=!1}),[]);let V=(0,b.useRef)(0);(0,b.useEffect)(()=>{e.listenerBotAppId&&e.listenerBotAppId!==m&&!x&&v(e.listenerBotAppId)},[x,e.listenerBotAppId,m]);let J=(0,b.useCallback)(async s=>{let o=++V.current;if(C(null),H(!1),P(!1),L({}),!s){T(null);return}z(!0);try{let l=await fetch(`/api/vc-meeting/consumer-profiles?listenerBotAppId=${encodeURIComponent(s)}`),u=await l.json().catch(()=>({}));if(!i.current||V.current!==o)return;!l.ok||u?.ok!==!0?(C(null),T(typeof u?.error=="string"?u.error:`HTTP ${l.status}`)):(C({forBot:s,revision:u.revision,catalogState:u.catalogState==="explicit_empty"||u.catalogState==="legacy_or_partial"||u.catalogState==="profiles"?u.catalogState:"uninitialized",defaultMode:u.defaultMode==="agents"?"agents":"listenOnly",defaultConsumerIds:Array.isArray(u.defaultConsumerIds)?u.defaultConsumerIds:[],profiles:(Array.isArray(u.profiles)?u.profiles:[]).map(Se),agentOptions:Array.isArray(u.agentOptions)?u.agentOptions:[],...u.migrationOffer==="enable_seeded_minutes_default"?{migrationOffer:u.migrationOffer}:{}}),T(null),H(!1))}catch(l){if(!i.current||V.current!==o)return;C(null),T(l instanceof Error?l.message:String(l))}finally{i.current&&V.current===o&&z(!1)}},[]);(0,b.useEffect)(()=>{J(m)},[J,m]);let S=(0,b.useCallback)(s=>{C(o=>o&&s(o)),H(!0),ie(!1)},[]),Z=(0,b.useCallback)((s,o)=>{S(l=>({...l,profiles:l.profiles.map(u=>u.uiKey===s?{...u,...o}:u)}))},[S]),ne=(0,b.useCallback)(async()=>{if(!c||M||k||!c.forBot||c.forBot!==m)return;let s={};if(c.profiles.forEach((o,l)=>{Be.test(o.id)||(s[`profiles[${l}].id`]=t("settings.vcProfiles.idInvalid")),(o.instructions??"").length>me&&(s[`profiles[${l}].instructions`]=t("settings.vcProfiles.instructionsTooLong"))}),Object.keys(s).length>0){L(s);return}r(!0),P(!1),L({});try{let o=await fetch("/api/vc-meeting/consumer-profiles",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({listenerBotAppId:c.forBot,expectedRevision:c.revision,defaultMode:c.defaultMode,defaultConsumerIds:c.defaultConsumerIds,profiles:c.profiles.map(Le)})}),l=await o.json().catch(()=>({}));if(!i.current||c.forBot!==m)return;if(o.status===409){P(!0);return}if(o.status===422){let u={};for(let R of Array.isArray(l?.fieldErrors)?l.fieldErrors:[])typeof R?.path=="string"&&typeof R?.message=="string"&&(u[R.path]=R.message);L(Object.keys(u).length>0?u:{profiles:t("settings.vcProfiles.validationFailed")});return}if(!o.ok||l?.ok!==!0){L({profiles:typeof l?.error=="string"?l.error:`HTTP ${o.status}`});return}C({forBot:c.forBot,revision:l.revision,catalogState:l.catalogState==="explicit_empty"||l.catalogState==="legacy_or_partial"||l.catalogState==="profiles"?l.catalogState:"uninitialized",defaultMode:l.defaultMode==="agents"?"agents":"listenOnly",defaultConsumerIds:Array.isArray(l.defaultConsumerIds)?l.defaultConsumerIds:[],profiles:(Array.isArray(l.profiles)?l.profiles:[]).map(Se),agentOptions:Array.isArray(l.agentOptions)?l.agentOptions:[],...l.migrationOffer==="enable_seeded_minutes_default"?{migrationOffer:l.migrationOffer}:{}}),H(!1),ie(!0)}catch(o){if(!i.current)return;L({profiles:o instanceof Error?o.message:String(o)})}finally{i.current&&r(!1)}},[c,M,m,t]),X=(0,b.useMemo)(()=>g.map(s=>({value:s.larkAppId,label:s.botName||s.larkAppId})),[g]),Y=X.find(s=>s.value===m)?.label??m,ce=(0,b.useMemo)(()=>c?c.agentOptions.map(s=>{let o=[s.online?void 0:t("settings.vcProfiles.agentOffline"),s.workingDirReady?void 0:t("settings.vcProfiles.agentNoWorkingDir"),s.reliableTurnTerminal?void 0:t("settings.vcProfiles.agentNoReliableTerminal"),s.managedSideEffectIsolation?void 0:t("settings.vcProfiles.agentNoManagedIsolation")].filter(Boolean);return{value:s.appId,label:(0,a.jsxs)("span",{className:"vc-agent-option",children:[(0,a.jsxs)("span",{className:"vc-agent-option-name",children:[s.label,s.cliId?(0,a.jsx)("em",{className:"vc-agent-option-cli",children:s.cliId}):null]}),o.length>0?(0,a.jsxs)("span",{className:"vc-agent-option-warn",children:["\u26A0 ",o.join(" \xB7 ")]}):null]})}}):[],[c,t]),se=s=>{let o=c?.agentOptions.find(u=>u.appId===s);return o?!o.online||!o.workingDirReady||!o.reliableTurnTerminal||!o.managedSideEffectIsolation?`\u26A0 ${o.label}`:o.label:s},ae=(0,b.useCallback)(s=>{let l=["observe_only","meeting_text","meeting_voice","meeting_text_voice"].map(u=>({value:u,label:t(`settings.vcProfiles.preset.${u}`)}));return(!s.isNew||s.permissionPreset==="custom")&&l.push({value:"custom",label:t("settings.vcProfiles.preset.custom")}),l},[t]),de=(0,b.useCallback)(()=>{S(s=>({...s,profiles:[...s.profiles,{uiKey:Te(),isNew:!0,id:"",agentAppId:s.agentOptions[0]?.appId??"",responseMode:"silent",permissionPreset:"observe_only"}]}))},[S]),ue=(0,b.useCallback)(s=>{S(o=>({...o,profiles:o.profiles.filter(l=>l.uiKey!==s),defaultConsumerIds:o.defaultConsumerIds.filter(l=>o.profiles.some(u=>u.uiKey!==s&&u.id===l))}))},[S]);if(g.length===0)return null;let h=s=>j[s],B=!e.canWrite||M||k,O=c?.agentOptions.some(s=>s.workingDirReady&&s.reliableTurnTerminal&&s.managedSideEffectIsolation)??!1;return(0,a.jsxs)("div",{className:"vc-profiles-section",children:[(0,a.jsxs)("div",{className:"settings-field-row",children:[(0,a.jsx)(D,{help:t("settings.vcProfiles.help"),children:t("settings.vcProfiles.title")}),e.listenerBotAppId===null&&X.length>1?(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:t("settings.vcProfiles.listenerOwner")}),(0,a.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcProfiles.listenerOwner"),disabled:k||M,value:m,label:q(X,m),options:X,onChange:s=>{s!==m&&(x&&!window.confirm(t("settings.vcProfiles.discardConfirm"))||v(s))}})]}):(0,a.jsx)("span",{className:"vc-profile-config-target",children:t("settings.vcProfiles.configuringBot",{bot:Y})})]}),(0,a.jsx)("p",{className:"hint vc-profiles-freeze",children:t("settings.vcProfiles.freezeNotice")}),k?(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.loading")}):null,I?(0,a.jsx)("p",{className:"hint-warn",children:I==="bot_not_in_config"?t("settings.vcProfiles.botNotInConfig"):`${t("settings.vcProfiles.loadFailed")}: ${I}`}):null,p?(0,a.jsxs)("p",{className:"hint-warn",children:[t("settings.vcProfiles.conflict")," ",(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",onClick:()=>{J(m)},children:t("settings.vcProfiles.reload")})]}):null,h("profiles")?(0,a.jsx)("p",{className:"hint-warn",children:h("profiles")}):null,c?(0,a.jsxs)(a.Fragment,{children:[c.migrationOffer==="enable_seeded_minutes_default"?(0,a.jsxs)("p",{className:"hint-warn vc-profile-migration-offer",children:[t("settings.vcProfiles.migrationOffer")," ",(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",disabled:B||x,onClick:()=>S(s=>({...s,defaultMode:"agents",defaultConsumerIds:["minutes"],profiles:s.profiles.map(o=>o.id==="minutes"?{...o,instructions:xe,responseMode:"listener_thread",permissionPreset:"meeting_text_voice"}:o),migrationOffer:void 0})),children:t("settings.vcProfiles.migrationEnable")})]}):null,c.catalogState==="uninitialized"&&c.profiles.length===0&&!O?(0,a.jsx)("p",{className:"hint-warn",children:t("settings.vcProfiles.noEligibleDefaultAgent")}):null,c.catalogState==="legacy_or_partial"?(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.legacyCatalog")}):null,c.profiles.map((s,o)=>(0,a.jsxs)("div",{className:"vc-profile-card",children:[(0,a.jsxs)("div",{className:"vc-profile-grid",children:[(0,a.jsxs)("label",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldId"),help:t("settings.vcProfiles.idHelp")})}),(0,a.jsx)("input",{type:"text",value:s.id,disabled:B||!s.isNew,placeholder:"minutes",onChange:l=>{let u=l.target.value,R=s.id;S(_=>({..._,profiles:_.profiles.map($=>$.uiKey===s.uiKey?{...$,id:u}:$),defaultConsumerIds:_.defaultConsumerIds.map($=>$===R&&R?u:$).filter($=>!!$)}))}}),h(`profiles[${o}].id`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].id`)}):null]}),(0,a.jsxs)("label",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldLabel"),help:t("settings.vcProfiles.labelHelp")})}),(0,a.jsx)("input",{type:"text",value:s.label??"",disabled:B,onChange:l=>Z(s.uiKey,{label:l.target.value||void 0})}),h(`profiles[${o}].label`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].label`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldAgent"),help:t("settings.vcProfiles.agentHelp")})}),(0,a.jsx)(E,{className:"vc-profile-agent-menu",ariaLabel:t("settings.vcProfiles.fieldAgent"),disabled:B,value:s.agentAppId,label:se(s.agentAppId),options:ce,onChange:l=>Z(s.uiKey,{agentAppId:l})}),h(`profiles[${o}].agentAppId`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].agentAppId`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldResponseMode"),help:t("settings.vcProfiles.responseModeHelp")})}),(0,a.jsx)(E,{ariaLabel:t("settings.vcProfiles.fieldResponseMode"),disabled:B,value:s.responseMode,label:s.responseMode==="listener_thread"?t("settings.vcProfiles.responseListener"):t("settings.vcProfiles.responseSilent"),options:[{value:"silent",label:t("settings.vcProfiles.responseSilent")},{value:"listener_thread",label:t("settings.vcProfiles.responseListener")}],onChange:l=>Z(s.uiKey,{responseMode:l})}),h(`profiles[${o}].responseMode`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].responseMode`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldPreset"),help:t("settings.vcProfiles.presetHelp")})}),(0,a.jsx)(E,{ariaLabel:t("settings.vcProfiles.fieldPreset"),disabled:B,value:s.permissionPreset,label:q(ae(s),s.permissionPreset),options:ae(s),onChange:l=>Z(s.uiKey,{permissionPreset:l})}),h(`profiles[${o}].permissionPreset`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].permissionPreset`)}):null]})]}),(0,a.jsxs)("label",{className:"vc-profile-field vc-profile-instructions",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldInstructions"),help:t("settings.vcProfiles.instructionsHelp")}),(0,a.jsxs)("em",{className:"vc-profile-count",children:[(s.instructions??"").length,"/",me]})]}),(0,a.jsx)("textarea",{rows:4,maxLength:me,value:s.instructions??"",disabled:B,placeholder:t("settings.vcProfiles.instructionsPlaceholder"),onChange:l=>Z(s.uiKey,{instructions:l.target.value||void 0})}),h(`profiles[${o}].instructions`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].instructions`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldActivityTypes"),help:t("settings.vcProfiles.activityHelp")})}),(0,a.jsx)("div",{className:"vc-profile-activity",children:Re.map(l=>{let u=s.activityTypes?.includes(l)??!1;return(0,a.jsxs)("label",{className:"vc-profile-check",children:[(0,a.jsx)("input",{type:"checkbox",checked:u,disabled:B,onChange:R=>{let _=new Set(s.activityTypes??[]);R.target.checked?_.add(l):_.delete(l),Z(s.uiKey,{activityTypes:_.size>0?[..._]:void 0})}}),t(`settings.vcProfiles.activity.${l}`)]},l)})}),(0,a.jsx)("em",{className:"vc-profile-hint",children:t("settings.vcProfiles.activityAllHint")}),h(`profiles[${o}].activityTypes`)?(0,a.jsx)("em",{className:"vc-profile-err",children:h(`profiles[${o}].activityTypes`)}):null]}),e.canWrite?(0,a.jsx)("button",{type:"button",className:"vc-profiles-link vc-profile-remove",disabled:M||k,onClick:()=>ue(s.uiKey),children:t("settings.vcProfiles.remove")}):null]},s.uiKey)),e.canWrite?(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",disabled:M||k,onClick:de,children:t("settings.vcProfiles.add")}):null,(0,a.jsxs)("div",{className:"settings-field-row",children:[(0,a.jsx)(D,{help:t("settings.vcProfiles.defaultModeHelp"),children:t("settings.vcProfiles.defaultMode")}),(0,a.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcProfiles.defaultMode"),disabled:B,value:c.defaultMode,label:c.defaultMode==="agents"?t("settings.vcProfiles.defaultModeAgents"):t("settings.vcProfiles.defaultModeListenOnly"),options:[{value:"listenOnly",label:t("settings.vcProfiles.defaultModeListenOnly")},{value:"agents",label:t("settings.vcProfiles.defaultModeAgents")}],onChange:s=>S(o=>({...o,defaultMode:s==="agents"?"agents":"listenOnly"}))})]}),c.defaultMode==="agents"?(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:t("settings.vcProfiles.defaultConsumers")}),(0,a.jsx)("div",{className:"vc-profile-activity",children:c.profiles.filter(s=>s.id).map(s=>{let o=c.defaultConsumerIds.includes(s.id);return(0,a.jsxs)("label",{className:"vc-profile-check",children:[(0,a.jsx)("input",{type:"checkbox",checked:o,disabled:B,onChange:l=>{S(u=>({...u,defaultConsumerIds:l.target.checked?[...u.defaultConsumerIds,s.id]:u.defaultConsumerIds.filter(R=>R!==s.id)}))}}),s.label||s.id]},s.uiKey)})}),h("defaultConsumerIds")?(0,a.jsx)("em",{className:"vc-profile-err",children:h("defaultConsumerIds")}):null,h("defaultMode")?(0,a.jsx)("em",{className:"vc-profile-err",children:h("defaultMode")}):null]}):null,e.canWrite?(0,a.jsxs)("div",{className:"vc-profiles-actions",children:[(0,a.jsx)("button",{type:"button",className:"vc-profiles-save",disabled:!x||M||p,onClick:()=>{ne()},children:t(M?"settings.vcProfiles.saving":"settings.vcProfiles.save")}),G?(0,a.jsx)("span",{className:"vc-profile-hint",children:t("settings.vcProfiles.saved")}):null,x&&!M?(0,a.jsx)("span",{className:"vc-profile-hint",children:t("settings.vcProfiles.unsaved")}):null]}):null]}):null]})}var n=te(oe(),1),ve=["Asia/Shanghai","Asia/Hong_Kong","Asia/Tokyo","Asia/Singapore","Asia/Kolkata","UTC","Europe/London","Europe/Paris","Europe/Moscow","America/Los_Angeles","America/New_York","America/Sao_Paulo","Australia/Sydney"];function De(e,t){if(!e||typeof e!="object")return null;if(e.failed){let i=e.failed.step==="install"?t("settings.herdrTraexInstallStepInstall"):t("settings.herdrTraexInstallStepAction");return{text:`${t("settings.herdrTraexInstallFailed")}\uFF08${i}\uFF09: ${e.failed.reason??""}`,cls:"hint-warn-inline"}}if(e.skippedReason==="plugin_unsupported"){let i=typeof e.herdrVersion=="string"&&e.herdrVersion?` (${e.herdrVersion})`:"";return{text:`${t("settings.herdrTraexUnsupported")}${i}`,cls:"hint-warn-inline"}}return e.installed||e.actionInvoked?{text:t("settings.herdrTraexInstalled"),cls:"hint-ok"}:e.alreadyInstalled?{text:t("settings.herdrTraexAlreadyInstalled"),cls:"hint-ok"}:null}function he(e){return{publicReadOnly:e?.publicReadOnly===!0,openTerminalInFeishu:e?.openTerminalInFeishu===!0,enableLocalCliOpen:e?.enableLocalCliOpen===!0,localCliOpenMode:e?.localCliOpenMode==="resume"?"resume":"attach",chatBotDiscovery:e?.chatBotDiscovery!==!1,herdrTraexPlugin:{enabled:e?.herdrTraexPlugin?.enabled===!0,source:typeof e?.herdrTraexPlugin?.source=="string"?e.herdrTraexPlugin.source:"",ref:typeof e?.herdrTraexPlugin?.ref=="string"?e.herdrTraexPlugin.ref:"",recommendedSource:typeof e?.herdrTraexPlugin?.recommendedSource=="string"?e.herdrTraexPlugin.recommendedSource:"",recommendedRef:typeof e?.herdrTraexPlugin?.recommendedRef=="string"?e.herdrTraexPlugin.recommendedRef:""},vcMeetingAgent:{enabled:e?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof e?.vcMeetingAgent?.listenerBotAppId=="string"?e.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(e?.vcMeetingAgent?.listenerBotOptions)?e.vcMeetingAgent.listenerBotOptions:[],larkCliVersion:e?.vcMeetingAgent?.larkCliVersion===void 0?void 0:e.vcMeetingAgent.larkCliVersion??null,larkCliMeetsRequirement:e?.vcMeetingAgent?.larkCliMeetsRequirement===!0,larkCliMinVersion:typeof e?.vcMeetingAgent?.larkCliMinVersion=="string"?e.vcMeetingAgent.larkCliMinVersion:void 0},repoPickerMode:e?.repoPickerMode==="repos"?"repos":"all",maintenance:e?.maintenance&&typeof e.maintenance=="object"?e.maintenance:{},localDevInstall:e?.localDevInstall===!0,autoUpdateSupported:e?.autoUpdateSupported!==!1,whiteboard:{enabled:e?.whiteboard?.enabled===!0},remoteAccess:e?.remoteAccess===!0,scheduleTimeZone:typeof e?.scheduleTimeZone=="string"?e.scheduleTimeZone:"",hostTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof e?.effectiveScheduleTimeZone=="string"&&e.effectiveScheduleTimeZone?e.effectiveScheduleTimeZone:typeof e?.scheduleTimeZone=="string"&&e.scheduleTimeZone?e.scheduleTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC"}}function Ee(e,t){let i=e?.[t]??{};return{enabled:i.enabled===!0,time:typeof i.time=="string"?i.time:"04:00"}}function we(e,t){return t(e==="npm-global"?"update.kindNpm":e==="pnpm-global"?"update.kindPnpm":e==="yarn-global"?"update.kindYarn":e==="bun-global"?"update.kindBun":e==="source-checkout"?"update.kindSource":"update.kindUnknown")}function _e(){let e=w(),t=(0,f.useRef)(!1),i=(0,f.useRef)(new Set),[g,m]=(0,f.useState)(null),[v,c]=(0,f.useState)(!1),[C,I]=(0,f.useState)(null),[T,k]=(0,f.useState)(!0),[z,x]=(0,f.useState)(!1),[H,M]=(0,f.useState)(null),[r,p]=(0,f.useState)(null),[P,j]=(0,f.useState)(null),[L,G]=(0,f.useState)(null),[ie,V]=(0,f.useState)(null),[J,S]=(0,f.useState)(null),[Z,ne]=(0,f.useState)(!1),[X,Y]=(0,f.useState)(!0),[ce,se]=(0,f.useState)(!1),[ae,de]=(0,f.useState)(""),[ue,h]=(0,f.useState)(!1),[B,O]=(0,f.useState)(null),s=(0,f.useCallback)(()=>{for(let d of i.current)window.clearTimeout(d);i.current.clear()},[]),o=(0,f.useCallback)((d,y)=>{let N=window.setTimeout(()=>{i.current.delete(N),d()},y);return i.current.add(N),N},[]),l=(0,f.useCallback)(async()=>{try{let d=await fetch("/api/update/status"),y=await d.json().catch(()=>({}));if(!t.current)return;if(!d.ok){G(null),V(y?.error??`HTTP ${d.status}`);return}G(y),V(null)}catch(d){if(!t.current)return;G(null),V(d instanceof Error?d.message:String(d))}},[]),u=(0,f.useCallback)(async()=>{try{let d=await fetch("/api/settings"),y=await d.json().catch(()=>({}));if(!t.current)return;if(!d.ok){m(null),I(y?.error??`HTTP ${d.status}`),c(!0);return}m(he(y.settings)),k(y.authed===!0),x(y.bound===!0),I(null),c(!0)}catch(d){if(!t.current)return;m(null),I(d instanceof Error?d.message:String(d)),c(!0)}},[]);(0,f.useEffect)(()=>(t.current=!0,u(),()=>{t.current=!1,s()}),[s,u]),(0,f.useEffect)(()=>{v&&(h(!1),O(null),ne(!1),T&&l())},[T,l,v]);async function R(d,y,N){if(!g)return;let A=g;m(N(g)),M(d),p({text:e("settings.saving")});try{let K=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(y)}),U=await K.json().catch(()=>({}));if(!t.current)return;if(!K.ok||U.ok===!1)throw typeof U?.feishuLoginQr=="string"&&U.feishuLoginQr&&j(U.feishuLoginQr),new Error(U?.error??`HTTP ${K.status}`);j(null);let ee=he(U.settings);m(ee),fe.publicReadOnly=ee.publicReadOnly,pe.setScheduleTimeZone(ee.effectiveScheduleTimeZone);let le=De(U.herdrTraexInstall,e);p(le??{text:e("settings.saved"),cls:"hint-ok"})}catch(K){if(!t.current)return;let U=!1;try{let le=await fetch("/api/settings"),ye=await le.json().catch(()=>({}));if(t.current&&le.ok&&ye?.settings){let ge=he(ye.settings);m(ge),fe.publicReadOnly=ge.publicReadOnly,pe.setScheduleTimeZone(ge.effectiveScheduleTimeZone),U=!0}}catch{}if(!t.current)return;U||m(A);let ee=K instanceof Error?K.message:String(K);p({text:U?`${e("settings.saveReconciled")}: ${ee}`:`${e("settings.saveFailed")}: ${ee}`,cls:"hint-warn-inline"})}finally{t.current&&M(null)}}async function _(){S(null),Y(!0),se(!1);try{let d=await fetch("/api/update/changelog"),y=await d.json().catch(()=>({}));if(!t.current)return;de(typeof y?.releasesUrl=="string"?y.releasesUrl:""),d.ok?(S(Array.isArray(y.releases)?y.releases:[]),Y(y.ok!==!1),se(y.rateLimited===!0)):(S([]),Y(!1))}catch{if(!t.current)return;S([]),Y(!1)}}function $(){let d=Date.now(),y=async()=>{if(t.current){if(Date.now()-d>9e4){h(!1),O({text:e("update.restartSlow"),cls:"hint-warn-inline"});return}try{let N=await fetch("/__health",{cache:"no-store"});if(!t.current)return;if(N.ok){location.reload();return}}catch{}t.current&&o(()=>{y()},2e3)}};o(()=>{y()},3e3)}async function be(d){h(!0),O({text:e("update.restarting")});try{if(await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(d?{update:d}:{})}),!t.current)return}catch(y){if(!t.current)return;h(!1),O({text:e("update.restartFailed",{detail:y instanceof Error?y.message:String(y)}),cls:"hint-warn-inline"});return}$()}async function Ie(){let d=L;if(!d)return;if(!d.node.ok){window.alert(e("update.nodeTooOldAlert",{version:d.node.version,required:d.node.required}));return}if(!d.updateSupported||!d.updateCommand){window.alert(e("update.unsupportedInstall"));return}if(d.installs.multiple){let N=d.installs.entries.map(A=>`\u2022 ${A.binPath} (${we(A.kind,e)})`).join(`
2
2
  `);if(!window.confirm(e("update.confirmMultiInstall",{paths:N})))return}let y=d.latest?e("update.confirmUpdate",{version:`v${d.latest}`,command:d.updateCommand}):e("update.confirmUpdateNoVer",{command:d.updateCommand});if(window.confirm(y)){h(!0),O({text:e("update.updating",{command:d.updateCommand})});try{let N=await fetch("/api/update/run",{method:"POST"}),A=await N.json().catch(()=>({}));if(!t.current)return;if(!N.ok||A.ok===!1){let K=A?.detail??A?.error??`HTTP ${N.status}`;h(!1),O({text:e("update.updateFailed",{detail:K}),cls:"hint-warn-inline"});return}A.changed?(h(!1),O({text:e("update.updatedChanged",{old:`v${A.oldVersion}`,new:`v${A.newVersion}`}),cls:"hint-ok"}),window.confirm(e("update.confirmRestart"))?await be({oldVersion:A.oldVersion,newVersion:A.newVersion}):t.current&&O({text:e("update.noRestartHint"),cls:"hint-ok"})):(h(!1),O({text:e("update.alreadyLatestRun",{version:`v${A.newVersion}`}),cls:"hint-ok"}),await l())}catch(N){if(!t.current)return;h(!1),O({text:e("update.updateFailed",{detail:N instanceof Error?N.message:String(N)}),cls:"hint-warn-inline"})}}}let Oe=g?(0,n.jsx)($e,{settings:g,canWrite:T,bound:z,savingKey:H,message:r,updateBlock:(0,n.jsx)(Ze,{canWrite:T,status:L,statusError:ie,changelog:J,changelogOpen:Z,changelogOk:X,changelogRateLimited:ce,releasesUrl:ae,busy:ue,message:B,onCheck:()=>{G(null),S(null),ne(!1),O(null),V(null),l()},onToggleChangelog:()=>{let d=!Z;ne(d),d&&J===null&&_()},onUpdate:()=>{Ie()},onRestart:()=>{window.confirm(e("update.confirmPlainRestart"))&&be(null)}}),feishuLoginQr:P,onCloseFeishuLoginQr:()=>j(null),onSave:R}):C?(0,n.jsxs)("p",{className:"hint-warn",children:[e("settings.loadFailed"),": ",C]}):(0,n.jsx)(re,{label:e("settings.loading")});return(0,n.jsxs)("section",{className:"page settings-page",children:[(0,n.jsx)("div",{className:"page-heading",children:(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{className:"eyebrow",children:e("nav.settings")}),(0,n.jsx)("h1",{children:e("settings.title")})]})}),Oe]})}function $e(e){let t=w(),{settings:i,canWrite:g,bound:m,savingKey:v}=e,c=!g,C=Ee(i.maintenance,"autoUpdate"),I=!g||i.localDevInstall||!i.autoUpdateSupported,T=!g||i.maintenance.autoUpdate?.enabled!==!0,k=(r,p)=>{e.onSave(r,{[r]:p},P=>({...P,[r]:p}))},z=r=>e.onSave("herdrTraexPlugin",{herdrTraexPlugin:r},p=>({...p,herdrTraexPlugin:{...p.herdrTraexPlugin,...r}})),x=(0,f.useMemo)(()=>[{value:"all",label:t("settings.repoPickerModeAll")},{value:"repos",label:t("settings.repoPickerModeRepos")}],[t]),H=(0,f.useMemo)(()=>[{value:"attach",label:t("settings.localCliOpenModeAttach")},{value:"resume",label:t("settings.localCliOpenModeResume")}],[t]),M=(0,f.useMemo)(()=>[{value:"",label:t("settings.vcMeetingListenerBotAuto")},...i.vcMeetingAgent.listenerBotOptions.map(r=>{let p=r.botName||r.larkAppId,P=r.cliId?` \xB7 ${r.cliId}`:"",j=[r.vcMeetingAgentEnabled===!0?void 0:t("settings.vcMeetingListenerBotDisabled"),r.hasLarkCliProfile===!0?void 0:t("settings.vcMeetingListenerBotNoProfile")].filter(Boolean),L=j.length>0?` \xB7 ${j.join(" \xB7 ")}`:"";return{value:r.larkAppId,label:`${p}${P}${L}`}})],[i.vcMeetingAgent.listenerBotOptions,t]);return(0,n.jsxs)("div",{className:"settings-layout",children:[g?null:(0,n.jsx)("article",{className:"bd-card settings-card settings-alert-card",children:(0,n.jsx)("p",{className:"hint-warn",children:t("settings.readOnlyVisitor")})}),(0,n.jsxs)(Ae,{className:"settings-group-main",children:[(0,n.jsxs)(W,{title:t("settings.sectionAccess"),children:[(0,n.jsx)(F,{title:t("settings.publicReadOnly"),help:t("settings.publicReadOnlyHelp"),checked:i.publicReadOnly,disabled:c||v==="publicReadOnly",onChange:r=>k("publicReadOnly",r)}),m?(0,n.jsx)(F,{title:t("settings.remoteAccess"),help:t("settings.remoteAccessHelp"),checked:i.remoteAccess,disabled:c||v==="remoteAccess",onChange:r=>k("remoteAccess",r)}):null]}),(0,n.jsxs)(W,{title:t("settings.sectionCards"),children:[(0,n.jsx)(F,{title:t("settings.openTerminalInFeishu"),help:t("settings.openTerminalInFeishuHelp"),checked:i.openTerminalInFeishu,disabled:c||v==="openTerminalInFeishu",onChange:r=>k("openTerminalInFeishu",r)}),(0,n.jsx)(F,{title:t("settings.enableLocalCliOpen"),help:t("settings.enableLocalCliOpenHelp"),checked:i.enableLocalCliOpen,disabled:c||v==="enableLocalCliOpen",onChange:r=>k("enableLocalCliOpen",r)}),(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.localCliOpenModeHelp"),children:t("settings.localCliOpenMode")}),(0,n.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.localCliOpenMode"),disabled:c||!i.enableLocalCliOpen||v==="localCliOpenMode",value:i.localCliOpenMode,label:q(H,i.localCliOpenMode),options:H,onChange:r=>{e.onSave("localCliOpenMode",{localCliOpenMode:r},p=>({...p,localCliOpenMode:r}))}})]})]}),(0,n.jsxs)(W,{title:t("settings.sectionExperimental"),children:[(0,n.jsx)(F,{title:t("settings.chatBotDiscovery"),help:t("settings.chatBotDiscoveryHelp"),checked:i.chatBotDiscovery,disabled:c||v==="chatBotDiscovery",onChange:r=>k("chatBotDiscovery",r)}),(0,n.jsx)(F,{title:t("settings.herdrTraexPlugin"),help:t("settings.herdrTraexPluginHelp"),checked:i.herdrTraexPlugin.enabled,disabled:c||v==="herdrTraexPlugin",onChange:r=>z({enabled:r})}),i.herdrTraexPlugin.enabled?(0,n.jsx)(Ve,{value:i.herdrTraexPlugin,disabled:c||v==="herdrTraexPlugin",onSave:r=>z(r)}):null]}),(0,n.jsx)(W,{title:t("settings.sectionWhiteboard"),children:(0,n.jsx)(F,{title:t("settings.whiteboardEnable"),help:t("settings.whiteboardEnableHelp"),checked:i.whiteboard.enabled,disabled:c||v==="whiteboard",onChange:r=>{e.onSave("whiteboard",{whiteboard:{enabled:r}},p=>({...p,whiteboard:{enabled:r}}))}})}),(0,n.jsx)(W,{title:t("settings.sectionRepoPicker"),children:(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.repoPickerModeHelp"),children:t("settings.repoPickerMode")}),(0,n.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.repoPickerMode"),disabled:c||v==="repoPickerMode",value:i.repoPickerMode,label:q(x,i.repoPickerMode),options:x,onChange:r=>{e.onSave("repoPickerMode",{repoPickerMode:r},p=>({...p,repoPickerMode:r}))}})]})}),(0,n.jsx)(W,{title:t("settings.sectionSchedule"),children:(0,n.jsx)(He,{value:i.scheduleTimeZone,host:i.hostTimeZone,effective:i.effectiveScheduleTimeZone,disabled:c||v==="scheduleTimeZone",onSave:r=>{e.onSave("scheduleTimeZone",{scheduleTimeZone:r},p=>({...p,scheduleTimeZone:r??""}))}})}),(0,n.jsxs)(W,{className:"settings-vc-block",title:t("settings.sectionVcMeetingAgent"),children:[(0,n.jsx)(F,{title:t("settings.vcMeetingAgent"),help:t("settings.vcMeetingAgentHelp"),checked:i.vcMeetingAgent.enabled,disabled:c||v==="vcMeetingAgent",onChange:r=>{e.onSave("vcMeetingAgent",{vcMeetingAgent:{enabled:r}},p=>({...p,vcMeetingAgent:{...p.vcMeetingAgent,enabled:r}}))}}),(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.vcMeetingListenerBotHelp"),children:t("settings.vcMeetingListenerBot")}),(0,n.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcMeetingListenerBot"),disabled:c||v==="vcMeetingAgent",value:i.vcMeetingAgent.listenerBotAppId??"",label:q(M,i.vcMeetingAgent.listenerBotAppId??""),options:M,onChange:r=>{let p=r||null;e.onSave("vcMeetingAgent",{vcMeetingAgent:{listenerBotAppId:p}},P=>({...P,vcMeetingAgent:{...P.vcMeetingAgent,listenerBotAppId:p}}))}})]}),(0,n.jsx)(Fe,{settings:i.vcMeetingAgent}),(0,n.jsx)(Me,{enabled:i.vcMeetingAgent.enabled,canWrite:g,listenerBotAppId:i.vcMeetingAgent.listenerBotAppId,listenerBotOptions:i.vcMeetingAgent.listenerBotOptions}),e.feishuLoginQr?(0,n.jsxs)("div",{className:"settings-feishu-login",children:[(0,n.jsx)("button",{type:"button",className:"settings-feishu-login-close","aria-label":t("settings.feishuLoginClose"),title:t("settings.feishuLoginClose"),onClick:e.onCloseFeishuLoginQr}),(0,n.jsx)("p",{children:t("settings.feishuLoginRequired")}),(0,n.jsx)("img",{src:e.feishuLoginQr,alt:t("settings.feishuLoginQrAlt")})]}):null]})]}),(0,n.jsxs)(Ae,{className:"settings-group-ops",children:[(0,n.jsx)(W,{title:t("settings.sectionMaintenance"),titleExtra:i.localDevInstall?(0,n.jsx)("span",{className:"settings-title-note",children:t("settings.autoUpdateLocalDev")}):i.autoUpdateSupported?null:(0,n.jsx)("span",{className:"settings-title-note",children:t("settings.autoUpdateUnsupportedInstall")}),children:(0,n.jsxs)("div",{className:"settings-maintenance-grid",children:[(0,n.jsxs)("div",{className:"settings-maintenance-update",children:[(0,n.jsx)(F,{title:t("settings.autoUpdate"),help:t("settings.autoUpdateHelp"),checked:C.enabled,disabled:I||v==="autoUpdate",onChange:r=>{let p={enabled:r,time:C.time};e.onSave("autoUpdate",{maintenance:{autoUpdate:p}},P=>({...P,maintenance:{...P.maintenance,autoUpdate:p}}))}}),(0,n.jsx)("div",{className:"maint-time",children:(0,n.jsxs)("label",{children:[(0,n.jsx)("span",{children:t("settings.maintenanceTime")}),(0,n.jsx)("input",{type:"time",value:C.time,disabled:I||v==="autoUpdate",onChange:r=>{let p={enabled:C.enabled,time:r.currentTarget.value||"04:00"};e.onSave("autoUpdate",{maintenance:{autoUpdate:p}},P=>({...P,maintenance:{...P.maintenance,autoUpdate:p}}))}})]})})]}),(0,n.jsx)("div",{className:"settings-maintenance-restart",children:(0,n.jsx)(F,{title:t("settings.autoRestart"),help:t("settings.autoRestartHelp"),checked:i.maintenance.autoRestart?.enabled===!0,disabled:T||v==="autoRestart",onChange:r=>{let p={enabled:r};e.onSave("autoRestart",{maintenance:{autoRestart:p}},P=>({...P,maintenance:{...P.maintenance,autoRestart:p}}))}})})]})}),e.updateBlock]}),(0,n.jsx)("div",{className:"settings-status-row",children:(0,n.jsx)("span",{className:`oncall-status ${e.message?.cls??""}`,"data-settings-status":!0,children:e.message?.text??""})})]})}function Fe(e){let t=w(),i=e.settings.larkCliVersion,g=typeof i=="string"&&e.settings.larkCliMeetsRequirement===!0,m=g?t("settings.larkCliReady",{version:i}):typeof i=="string"?t("settings.larkCliOutdated",{version:i,minimum:e.settings.larkCliMinVersion??"-"}):t("settings.larkCliMissing");return(0,n.jsxs)("div",{className:`settings-lark-cli-status ${g?"is-ready":"is-warning"}`,children:[(0,n.jsx)("span",{"aria-hidden":"true"}),(0,n.jsx)("strong",{children:m}),g?null:(0,n.jsx)("code",{children:"npm i -g @larksuite/cli@latest"})]})}function Ae(e){let t=["settings-group",e.className].filter(Boolean).join(" ");return(0,n.jsx)("section",{className:t,children:(0,n.jsx)("article",{className:"bd-card settings-group-card",children:e.children})})}function W(e){let t=["settings-block",e.className].filter(Boolean).join(" ");return(0,n.jsx)("section",{className:t,children:(0,n.jsxs)("article",{className:"bd-card settings-card",children:[(0,n.jsxs)("div",{className:"settings-block-title-row",children:[(0,n.jsx)("h2",{className:"bd-section-title",children:e.title}),e.titleExtra?(0,n.jsx)("div",{className:"settings-block-title-extra",children:e.titleExtra}):null]}),e.children]})})}function He(e){let t=w(),i=e.value.trim(),g=e.effective||e.value.trim()||e.host,m=(0,f.useMemo)(()=>{let v=i&&!ve.includes(i)?[i,...ve]:ve;return[{value:"",label:t("settings.scheduleTimeZoneHost",{host:e.host})},...v.map(c=>({value:c,label:c}))]},[e.host,t,i]);return(0,n.jsxs)("div",{className:"settings-field-row settings-timezone-row",children:[(0,n.jsx)(D,{help:t("settings.scheduleTimeZoneHelp",{host:e.host,effective:g}),children:t("settings.scheduleTimeZone")}),(0,n.jsx)(E,{className:"settings-field-menu settings-timezone-menu",ariaLabel:t("settings.scheduleTimeZone"),value:i,label:q(m,i),options:m,disabled:e.disabled,onChange:v=>e.onSave(v===""?null:v)})]})}function F(e){return(0,n.jsxs)("label",{className:"toggle-row",children:[(0,n.jsx)("input",{type:"checkbox",checked:e.checked,disabled:e.disabled,onChange:t=>e.onChange(t.currentTarget.checked)}),(0,n.jsx)("span",{className:"switch","aria-hidden":"true"}),(0,n.jsx)("span",{className:"toggle-tx",children:(0,n.jsx)("strong",{children:(0,n.jsx)(D,{className:"settings-toggle-title",help:e.help,children:e.title})})})]})}function Ve(e){let t=w(),[i,g]=(0,f.useState)(e.value.source),[m,v]=(0,f.useState)(e.value.ref);(0,f.useEffect)(()=>{g(e.value.source),v(e.value.ref)},[e.value.source,e.value.ref]);let c=i.trim(),C=m.trim(),I=c!==e.value.source.trim()||C!==e.value.ref.trim(),T=()=>{e.disabled||!I||e.onSave({source:c,ref:C})};return(0,n.jsxs)("div",{className:"settings-subfield",children:[(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.herdrTraexPluginSourceHelp"),children:t("settings.herdrTraexPluginSource")}),(0,n.jsx)("input",{className:"settings-text-input",type:"text",value:i,placeholder:t("settings.herdrTraexPluginSourcePlaceholder"),disabled:e.disabled,onChange:k=>g(k.currentTarget.value),onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),T())}})]}),(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.herdrTraexPluginRefHelp"),children:t("settings.herdrTraexPluginRef")}),(0,n.jsx)("input",{className:"settings-text-input",type:"text",value:m,placeholder:t("settings.herdrTraexPluginRefPlaceholder"),disabled:e.disabled,onChange:k=>v(k.currentTarget.value),onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),T())}})]}),c?null:(0,n.jsx)("p",{className:"hint-warn-inline settings-subfield-hint",children:t("settings.herdrTraexPluginSourceRequired")}),e.value.recommendedSource&&(c!==e.value.recommendedSource||C!==e.value.recommendedRef)?(0,n.jsxs)("p",{className:"settings-subfield-hint",children:[t("settings.herdrTraexPluginRecommended")," ",(0,n.jsxs)("button",{type:"button",className:"settings-inline-link",disabled:e.disabled,onClick:()=>{g(e.value.recommendedSource),v(e.value.recommendedRef)},children:[e.value.recommendedSource,e.value.recommendedRef?` @ ${e.value.recommendedRef}`:""]})]}):null,(0,n.jsx)("div",{className:"actions",children:(0,n.jsx)("button",{type:"button",className:"page-primary-action",disabled:e.disabled||!I,onClick:T,children:t("settings.herdrTraexPluginSave")})})]})}function Ze(e){let t=w(),i;if(!e.canWrite)i=(0,n.jsx)("p",{className:"hint-warn",children:t("update.loginRequired")});else if(e.statusError)i=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"hint-warn",children:[t("update.checkFailed"),": ",e.statusError]}),(0,n.jsx)("div",{className:"update-actions",children:(0,n.jsx)("button",{type:"button","data-up":"check",onClick:e.onCheck,children:t("update.btnCheck")})})]});else if(!e.status)i=(0,n.jsx)(re,{label:t("update.loading"),compact:!0});else{let g=e.status,m=g.localDevInstall||!g.updateSupported||e.busy;i=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"update-version",children:[(0,n.jsxs)("span",{children:[t("update.current"),": ",(0,n.jsxs)("strong",{children:["v",g.current]})]})," ",(0,n.jsx)(We,{status:g})]}),g.node.ok?null:(0,n.jsx)("p",{className:"hint-warn",children:t("update.nodeWarn",{version:g.node.version,required:g.node.required})}),!g.localDevInstall&&!g.updateSupported?(0,n.jsx)("p",{className:"hint-warn",children:t("update.unsupportedInstall")}):null,g.installs.multiple?(0,n.jsx)(je,{entries:g.installs.entries}):null,(0,n.jsxs)("div",{className:"update-actions",children:[(0,n.jsx)("button",{type:"button","data-up":"check",disabled:e.busy,onClick:e.onCheck,children:t("update.btnCheck")}),(0,n.jsx)("button",{type:"button","data-up":"changelog",disabled:e.busy,onClick:e.onToggleChangelog,children:e.changelogOpen?t("update.btnChangelogHide"):t("update.btnChangelog")}),(0,n.jsx)("button",{type:"button",className:"page-primary-action","data-up":"update",disabled:m,onClick:e.onUpdate,children:t("update.btnUpdate")}),(0,n.jsx)("button",{type:"button","data-up":"restart",disabled:e.busy,onClick:e.onRestart,children:t("update.btnRestart")})]}),g.cliUpdates?.length?(0,n.jsx)(Ke,{entries:g.cliUpdates}):null,e.changelogOpen?(0,n.jsx)(qe,{changelog:e.changelog,ok:e.changelogOk,rateLimited:e.changelogRateLimited,releasesUrl:e.releasesUrl}):null,e.message?(0,n.jsx)("p",{className:`oncall-status ${e.message.cls??""}`,children:e.message.text}):null]})}return(0,n.jsx)(W,{className:"settings-update-block",title:t("update.section"),titleExtra:e.status?.localDevInstall?(0,n.jsx)("span",{className:"settings-title-note",children:t("update.localDev")}):e.status&&!e.status.updateSupported?(0,n.jsx)("span",{className:"settings-title-note",children:t("update.unsupportedInstall")}):null,children:i})}function Ke(e){let t=w();return(0,n.jsxs)("div",{className:"cli-runtime-updates",children:[(0,n.jsx)("strong",{children:t("update.runtimeTitle")}),(0,n.jsx)("ul",{children:e.entries.map(i=>(0,n.jsxs)("li",{className:i.updateAvailable?"is-behind":"",children:[(0,n.jsxs)("div",{className:"cli-runtime-update-head",children:[(0,n.jsx)("span",{children:"Codex"}),i.updateAvailable&&i.latest?(0,n.jsx)("span",{className:"update-badge update-badge-new",children:t("update.runtimeAvailable",{current:i.current??"?",latest:i.latest})}):i.latest?(0,n.jsx)("span",{className:"update-badge update-badge-ok",children:t("update.upToDate")}):(0,n.jsx)("span",{className:"hint-warn-inline",children:t("update.checkUnavailable")})]}),(0,n.jsx)("code",{children:i.binPath}),i.updateAvailable?(0,n.jsxs)("small",{children:[t("update.runtimeCommand"),": ",(0,n.jsx)("code",{children:i.updateCommand})]}):null]},`${i.cliId}:${i.binPath}`))}),(0,n.jsx)("p",{className:"settings-help",children:t("update.runtimeHelp")})]})}function We(e){let t=w(),i=e.status;return i.latest?i.behind?(0,n.jsx)("span",{className:"update-badge update-badge-new",children:t("update.newAvailable",{version:`v${i.latest}`})}):(0,n.jsx)("span",{className:"update-badge update-badge-ok",children:t("update.upToDate")}):(0,n.jsx)("span",{className:"hint-warn-inline",children:t("update.checkUnavailable")})}function je(e){let t=w();return(0,n.jsxs)("div",{className:"hint-warn",children:[(0,n.jsx)("p",{children:t("update.multiInstallWarn")}),(0,n.jsx)("ul",{className:"update-install-list",children:e.entries.map(i=>(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{children:i.binPath})," \u2192 ",we(i.kind,t)," ",(0,n.jsx)("small",{children:i.root})]},`${i.binPath}:${i.root}`))})]})}function qe(e){let t=w();if(e.changelog===null)return(0,n.jsx)(re,{label:t("update.changelogLoading"),compact:!0});if(!e.ok){let i=e.rateLimited?t("update.changelogRateLimited"):t("update.changelogFailed");return(0,n.jsxs)("p",{className:"hint-warn-inline",children:[i,e.releasesUrl?(0,n.jsxs)(n.Fragment,{children:[" ",(0,n.jsx)("a",{href:e.releasesUrl,target:"_blank",rel:"noopener",children:t("update.changelogViewOnGitHub")})]}):null]})}return e.changelog.length===0?(0,n.jsx)("p",{className:"empty",children:t("update.changelogEmpty")}):(0,n.jsx)("div",{className:"update-changelog",children:e.changelog.map(i=>{let g=i.name&&i.name!==`v${i.version}`?i.name:"",m=i.publishedAt?new Date(i.publishedAt).toLocaleDateString():"";return(0,n.jsxs)("details",{className:"update-release",open:!0,children:[(0,n.jsxs)("summary",{children:[(0,n.jsxs)("strong",{children:["v",i.version]})," ",g," ",(0,n.jsx)("small",{children:m})," ",(0,n.jsx)("a",{href:i.url,target:"_blank",rel:"noopener",children:"\u2197"})]}),(0,n.jsx)("pre",{className:"update-release-body",children:i.body||""})]},i.version)})})}function st(e){return Pe(e,(0,n.jsx)(_e,{}))}export{He as TimeZoneRow,st as renderSettingsPage};