botmux 3.18.6 → 3.18.7
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.
- package/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/riff-backend.d.ts +158 -0
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +330 -7
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/sandbox.d.ts +42 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +95 -5
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +2 -1
- package/dist/adapters/cli/codex-app.js.map +1 -1
- package/dist/adapters/cli/dsh.d.ts.map +1 -1
- package/dist/adapters/cli/dsh.js +2 -1
- package/dist/adapters/cli/dsh.js.map +1 -1
- package/dist/adapters/cli/mir.d.ts.map +1 -1
- package/dist/adapters/cli/mir.js +2 -1
- package/dist/adapters/cli/mir.js.map +1 -1
- package/dist/adapters/cli/mira.d.ts.map +1 -1
- package/dist/adapters/cli/mira.js +2 -1
- package/dist/adapters/cli/mira.js.map +1 -1
- package/dist/adapters/hook-command.d.ts +3 -5
- package/dist/adapters/hook-command.d.ts.map +1 -1
- package/dist/adapters/hook-command.js +59 -13
- package/dist/adapters/hook-command.js.map +1 -1
- package/dist/autostart.d.ts +76 -0
- package/dist/autostart.d.ts.map +1 -1
- package/dist/autostart.js +105 -28
- package/dist/autostart.js.map +1 -1
- package/dist/bot-registry.d.ts +12 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +43 -3
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/dashboard-command.d.ts +142 -0
- package/dist/cli/dashboard-command.d.ts.map +1 -1
- package/dist/cli/dashboard-command.js +160 -0
- package/dist/cli/dashboard-command.js.map +1 -1
- package/dist/cli/dashboard-endpoint.d.ts +66 -0
- package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
- package/dist/cli/dashboard-endpoint.js +144 -30
- package/dist/cli/dashboard-endpoint.js.map +1 -1
- package/dist/cli/send-dispatch.d.ts +2 -0
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +8 -2
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +270 -38
- package/dist/cli.js.map +1 -1
- package/dist/core/binary-self-update.d.ts +7 -0
- package/dist/core/binary-self-update.d.ts.map +1 -1
- package/dist/core/binary-self-update.js +17 -0
- package/dist/core/binary-self-update.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +52 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts +9 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +5 -0
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/self-spawn.d.ts +46 -1
- package/dist/core/self-spawn.d.ts.map +1 -1
- package/dist/core/self-spawn.js +57 -0
- package/dist/core/self-spawn.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +81 -5
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +93 -0
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/autostart-api.d.ts.map +1 -1
- package/dist/dashboard/autostart-api.js +16 -3
- package/dist/dashboard/autostart-api.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +2 -1
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +22 -6
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +1 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +3 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +28 -0
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/trigger-api.d.ts.map +1 -1
- package/dist/dashboard/trigger-api.js +33 -21
- package/dist/dashboard/trigger-api.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +12 -2
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +2 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts +40 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +52 -2
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +2 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +272 -30
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{agent-workbench-dock-page-XHJUYFGN.js → agent-workbench-dock-page-6LC422N6.js} +1 -1
- package/dist/dashboard-web/chunks/{agent-workbench-page-FLKTLIRM.js → agent-workbench-page-RSAWY7O2.js} +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-XMGLZZ2E.js → bot-defaults-page-67RAWCSQ.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-TLG45URB.js → chunk-IA5KMD5O.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-BU3Q6XC6.js → chunk-K232GT3M.js} +2 -2
- package/dist/dashboard-web/chunks/chunk-MMLTCXHP.js +10 -0
- package/dist/dashboard-web/chunks/{chunk-ECFC7UG2.js → chunk-R3LJUCEO.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-Z67OSM5P.js → chunk-YJA3KY3J.js} +1 -1
- package/dist/dashboard-web/chunks/{connectors-page-WDM4CEAU.js → connectors-page-DJCTHSFB.js} +1 -1
- package/dist/dashboard-web/chunks/{feedback-page-GMJ4FLJ4.js → feedback-page-O7SZRKNM.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-L4ZJNWVR.js → groups-page-7PONUYHE.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-7LUJU2CX.js → insights-page-J6DAAJ6D.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-7LZUJQPF.js → monitor-room-F3QNEW7N.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-AUSXMPYO.js → monitoring-page-JHDD2VS2.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-6ZU6MAZN.js → office-page-MMTN4IKD.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-QBC5CIYH.js → overview-page-IQ2UJAJP.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-QO3YCA7D.js → roles-page-FNI4MGX6.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-YNGSKDQW.js → schedules-page-6PUU63KS.js} +1 -1
- package/dist/dashboard-web/chunks/{sessions-page-BWR4UB6X.js → sessions-page-O4N72EXT.js} +4 -4
- package/dist/dashboard-web/chunks/{settings-page-2IRIS3FP.js → settings-page-G7B3STUF.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-5RZPM6HJ.js → skills-page-CEWKQOIG.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-KERG6LKC.js → team-federation-page-NUP4VK4H.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-766CBD7H.js → v3-page-M4XF6D5Z.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-2M6XZD5C.js → whiteboards-page-L755NZX6.js} +1 -1
- package/dist/dashboard-web/style.css +13 -0
- package/dist/dashboard.js +3 -0
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +3 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +10 -3
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +19 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +19 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/api-gate.d.ts +53 -0
- package/dist/im/lark/api-gate.d.ts.map +1 -0
- package/dist/im/lark/api-gate.js +322 -0
- package/dist/im/lark/api-gate.js.map +1 -0
- package/dist/im/lark/audio-transcribe.d.ts +23 -0
- package/dist/im/lark/audio-transcribe.d.ts.map +1 -0
- package/dist/im/lark/audio-transcribe.js +126 -0
- package/dist/im/lark/audio-transcribe.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +6 -0
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +53 -1
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +10 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +68 -1
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +247 -224
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +34 -3
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts +16 -0
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +31 -0
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/services/budget-tracker.d.ts +61 -0
- package/dist/services/budget-tracker.d.ts.map +1 -0
- package/dist/services/budget-tracker.js +306 -0
- package/dist/services/budget-tracker.js.map +1 -0
- package/dist/services/connector-store.d.ts +16 -0
- package/dist/services/connector-store.d.ts.map +1 -1
- package/dist/services/connector-store.js.map +1 -1
- package/dist/services/failed-turn-retry.d.ts +43 -0
- package/dist/services/failed-turn-retry.d.ts.map +1 -0
- package/dist/services/failed-turn-retry.js +50 -0
- package/dist/services/failed-turn-retry.js.map +1 -0
- package/dist/services/model-pricing.d.ts +80 -0
- package/dist/services/model-pricing.d.ts.map +1 -0
- package/dist/services/model-pricing.js +182 -0
- package/dist/services/model-pricing.js.map +1 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +13 -3
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/trigger-types.d.ts +10 -0
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/usage-ledger.d.ts +10 -0
- package/dist/services/usage-ledger.d.ts.map +1 -1
- package/dist/services/usage-ledger.js +36 -0
- package/dist/services/usage-ledger.js.map +1 -1
- package/dist/services/voice/asr.d.ts +17 -0
- package/dist/services/voice/asr.d.ts.map +1 -0
- package/dist/services/voice/asr.js +64 -0
- package/dist/services/voice/asr.js.map +1 -0
- package/dist/services/voice/index.d.ts +17 -2
- package/dist/services/voice/index.d.ts.map +1 -1
- package/dist/services/voice/index.js +43 -0
- package/dist/services/voice/index.js.map +1 -1
- package/dist/services/voice/types.d.ts +15 -0
- package/dist/services/voice/types.d.ts.map +1 -1
- package/dist/services/webhook-idempotency.d.ts +134 -0
- package/dist/services/webhook-idempotency.d.ts.map +1 -0
- package/dist/services/webhook-idempotency.js +265 -0
- package/dist/services/webhook-idempotency.js.map +1 -0
- package/dist/setup/app-name.d.ts +1 -0
- package/dist/setup/app-name.d.ts.map +1 -1
- package/dist/setup/app-name.js +7 -0
- package/dist/setup/app-name.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +28 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +73 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/open-platform-automation.d.ts +26 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +90 -1
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/open-platform-outcome.d.ts.map +1 -1
- package/dist/setup/open-platform-outcome.js +8 -2
- package/dist/setup/open-platform-outcome.js.map +1 -1
- package/dist/types.d.ts +20 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/usage-limit-tracker.d.ts +29 -9
- package/dist/utils/usage-limit-tracker.d.ts.map +1 -1
- package/dist/utils/usage-limit-tracker.js +122 -14
- package/dist/utils/usage-limit-tracker.js.map +1 -1
- package/dist/worker.js +27 -6
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +56 -56
- package/dist/workflows/events/payloads.d.ts +2 -2
- package/dist/workflows/events/schema.d.ts +430 -430
- package/dist/workflows/migration/v2-run-archive-schema.d.ts +2 -2
- package/dist/workflows/v3/run-envelope.d.ts +56 -56
- package/package.json +9 -8
- package/scripts/postinstall-bin.mjs +25 -0
- package/dist/dashboard-web/chunks/chunk-NJCJR3U2.js +0 -10
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as zt,c as Xt,h as Wt}from"./chunk-XJ7BGPJH.js";import{a as Jt}from"./chunk-75LEPNN3.js";import{c as Xe}from"./chunk-2PVRDXEL.js";import{a as Jn,c as Gt}from"./chunk-SZOB6VK2.js";import{a as Dt}from"./chunk-OWUXOKFE.js";import{a as zn,b as _t,c as nn,d as Ft,e as Ut}from"./chunk-6RLYYCVH.js";import{a as yn}from"./chunk-ZJVTGU5X.js";import{a as B}from"./chunk-OXSVWLER.js";import{a as jt}from"./chunk-KTQ7B6ZR.js";import{a as wn,b as Kt}from"./chunk-CEUCNZFJ.js";import{c as Je,g as $t,q as Ht}from"./chunk-NYY66DNC.js";import{b as Gn,d as Ot}from"./chunk-R3LJUCEO.js";import{a as $e}from"./chunk-QITAMHW6.js";import{C as ze,E as bn,G as Pt,I as ge,J as _e,K as pe,M as hn,d as St,e as _n,g as It,j as Tt,k as Nt,l as xt,m as Fn,n as Rt,o as Un,p as Et,q as Mt,r as jn,s as Lt,t as At,w as He,x as o,y as en,z as Ke}from"./chunk-K232GT3M.js";import{a as Ct,c as Bt}from"./chunk-ARROO6TE.js";import{c as De,d as vt,e as kn}from"./chunk-3YZFAHNK.js";var c=De(vt(),1),cn=De(Ct(),1);var Xn=[24,72,168],eo=new Set(Xn);function Wn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!eo.has(t)?null:t}function no(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function to(e,t=Date.now()){return t-e*60*60*1e3}function so(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let a=no(e.lastMessageAt);return a!==null&&a<to(t,s)}function Vt(e,t,s=Date.now()){return e.filter(a=>so(a,t,s))}var qt={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",25:"reasonix",26:"opencode2",27:"dsh",28:"mojo",29:"ebsd"},da=new Set(Object.values(qt)),oo={"claude-code":"Claude",aiden:"Aiden",coco:"CoCo",codex:"Codex",cursor:"Cursor",gemini:"Gemini",genius:"Genius",opencode:"OpenCode",opencode2:"OpenCode 2",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",ebsd:"ebsd",relay:"Relay",mir:"Mir CLI",kimi:"Kimi",grok:"Grok Build","kiro-cli":"Kiro",riff:"Riff",reasonix:"Reasonix",dsh:"DeepSeek Harness","dsh-tui":"DeepSeek Harness TUI",mojo:"Mojo"},Yt=Object.values(qt).map(e=>({id:e,label:oo[e]??e}));function vn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Vn(e){let t=vn(e);return t===null?"-":t.toLocaleString("en-US")}function Zt(e,t){let s=String(e??"").replace(/\s+/g," ").trim();return s?s.length>t?`${s.slice(0,t-1)}\u2026`:s:""}function Qt(e,t){let s=String(e??"").replace(/\r\n?/g,`
|
|
2
2
|
`).replace(/[^\S\n]+\n/g,`
|
|
3
3
|
`).replace(/\n{3,}/g,`
|
|
4
4
|
|
|
5
|
-
`).replace(/^\n+/,"").replace(/\s+$/,"");return s?s.length>t?`${s.slice(0,t-1)}\u2026`:s:""}function Cn(e){let t=Qt(e.previewUserFullText??e.previewUserText??"",4e3),s=e.previewBotState==="replied"?Qt(e.previewBotFullText??e.previewBotText??"",4e3):"";return{userText:Zt(t,120),userFullText:t,botText:Zt(s,220),botFullText:s}}var ts={open:!1,suppressFocusOpen:!1};function ss(e,t){switch(t){case"open":return{open:!0,suppressFocusOpen:!1};case"close":return{open:!1,suppressFocusOpen:!1};case"toggle":return{open:!e.open,suppressFocusOpen:!1};case"focus":return e.suppressFocusOpen?{open:e.open,suppressFocusOpen:!1}:{open:!0,suppressFocusOpen:!1};case"escape-refocus":return{open:!1,suppressFocusOpen:!0};default:return e}}var se=[...Yt.map(e=>e.id),"unknown"],qn=[{id:"needs-you",labelKey:"sessions.board.needsYou",hintKey:"sessions.board.needsYouHint"},{id:"working",labelKey:"sessions.board.working",hintKey:"sessions.board.workingHint"},{id:"todo",labelKey:"sessions.board.todo",hintKey:"sessions.board.todoHint"},{id:"idle",labelKey:"sessions.board.idle",hintKey:"sessions.board.idleHint"}];function Sn(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var os=["starting","working","idle","dormant","analyzing","stalled","active","limited","closed"];function tn(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function as(e){let t=0,s=0,a=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&a++);return{logical:t,resident:s,dormant:a}}function Yn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function es(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function ao(e){let t=o("sessions.directChat"),s=String(e?.chatDisplayName??"").trim()||String(e?.chatId??"").trim()||o("sessions.chatUnknown"),a=ge(e);return`${t} \xB7 ${s} - ${a}`}function Fe(e){let t=String(e?.chatId??"").trim();if(e?.chatType==="p2p")return ao(e);let s=_e(e),a=e?.chatType==="p2p"?(()=>{let r=String(e?.botName??"").trim();return r?` \xB7 ${r}`:""})():"";return s?`${es(e)} \xB7 ${s}${a}`:t?`${es(e)} \xB7 ${t}${a}`:o("sessions.chatUnknown")}function Zn(e,t=_e){return!!String(e?.chatId??"").trim()&&!t(e)}function ns(e,t){let s=String(t??"").trim();return!!s&&String(e??"").includes(s)}function is(e,t,s){if(e===void 0)return t;let a=ns(e,s),r=ns(t,s);return a!==r?a?t:e:t<e?t:e}function Qn(e){let t=Fe(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function rs(e){return`${JSON.stringify(e)} ${Fe(e)} ${Qn(e)}`.toLowerCase()}function fe(e){return typeof e=="string"?e.trim():""}function ls(e){let t=fe(e?.chatId),s=fe(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function et(e){let t=fe(e?.chatId),s=fe(e?.rootMessageId),a=ls(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(fe(e?.sessionId)||"unknown")}`}function io(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=fe(a?.title);if(r)return r}return t}function In(e){let t=new Map;for(let a of e){let r=et(a),l=t.get(r);l?l.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let l=[...r].sort((R,U)=>Number(U.lastMessageAt??0)-Number(R.lastMessageAt??0)),p=l[0]??{},d=ls(p),g=fe(p.chatId),v=d==="thread"?fe(p.rootMessageId):"",b=new Set(l.map(R=>fe(R.larkAppId)||fe(R.botName)).filter(Boolean)),h=Math.max(1,b.size),L=l.filter(R=>R.status!=="closed").length,P=l.filter(R=>R.lastInputFromBot===!0).length,D=l.reduce((R,U)=>Math.max(R,Number(U.lastMessageAt??0)),0),T=v||g||fe(p.sessionId)||a;s.push({key:a,kind:d,chatId:g,...v?{rootMessageId:v}:{},title:io(l,T),rows:l,botCount:h,activeCount:L,closedCount:l.length-L,inferredBotInputCount:P,latestActivityAt:D,multiBot:b.size>1,inferredBotTriggered:P>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var sn=
|
|
6
|
-
`)}function xn(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo&&!jt(e.cliId)}async function us(){try{let e=await fetch("/api/groups");if(!e.ok)return[];let t=await e.json();return(Array.isArray(t?.bots)?t.bots:[]).filter(a=>a&&typeof a.larkAppId=="string").map(a=>({larkAppId:a.larkAppId,botName:typeof a.botName=="string"&&a.botName?a.botName:a.larkAppId}))}catch{return[]}}var rn=new Jt({html:!1,linkify:!0,breaks:!0});rn.validateLink=e=>/^(https?:|mailto:)/i.test(e.trim());var ms=rn.renderer.rules.link_open;rn.renderer.rules.link_open=(e,t,s,a,r)=>(e[t].attrSet("target","_blank"),e[t].attrSet("rel","noopener noreferrer nofollow"),ms?ms(e,t,s,a,r):r.renderToken(e,t,s));rn.renderer.rules.image=(e,t)=>{let s=e[t],a=s.children?.reduce((d,g)=>d+(g.content??""),"")??"",r=en(a.trim()||"image"),l=s.attrGet("src")??"";return/^(https?:|mailto:)/i.test(l.trim())?`<span class="session-card-exchange-img">\u{1F5BC} <a href="${en(l)}" target="_blank" rel="noopener noreferrer nofollow">${r}</a></span>`:`<span class="session-card-exchange-img">\u{1F5BC} ${r}</span>`};function tt(e){let t=String(e??"");if(!t.trim())return"";try{return rn.render(t).trim()||`<p>${en(t)}</p>`}catch{return`<p>${en(t)}</p>`}}function st(e,t){let s=Math.max(0,Math.min(t,e.length)),r=e.slice(0,s).match(/(?:^|\s)@([^\s@]*)$/u);if(!r)return null;let l=r[1]??"";return{start:s-l.length-1,end:s,query:l}}function gs(e,t,s){let a=`@${s} `,r=e[t.end]===" "?t.end+1:t.end;return{text:e.slice(0,t.start)+a+e.slice(r),caret:t.start+a.length}}function ps(e,t){let s=t.trim().toLocaleLowerCase();return s?e.filter(a=>a.botName.toLocaleLowerCase().includes(s)||a.larkAppId.toLocaleLowerCase().includes(s)):[...e]}function fs(e,t,s,a){if(a.length===0)return{text:e,caret:Math.max(0,Math.min(t,e.length))};let r=Math.max(0,Math.min(t,e.length)),l=Math.max(r,Math.min(s,e.length)),p=e.slice(0,r),d=e.slice(l),g=p&&!/\s$/u.test(p)?" ":"",v=d&&!/^\s/u.test(d)?" ":"",b=`${g}${a.join(" ")}${v}`;return{text:p+b+d,caret:p.length+b.length}}function lo(e,t){let s=e.indexOf(t);if(s<0)return e;let a=e.slice(0,s),r=e.slice(s+t.length);return/\s$/u.test(a)&&/^\s/u.test(r)&&(r=r.slice(1)),a+r}function bs(e,t,s,a){let r=lo(e,t),l=s.map((p,d)=>a(d));return s.forEach((p,d)=>{let g=r.indexOf(p);g<0||p===l[d]||(r=r.slice(0,g)+l[d]+r.slice(g+p.length))}),{text:r,markers:l}}var A=De(vt(),1),Ns=De(Ct(),1);var hs=["backlog","todo","in_progress","in_review","done"];function ys(e){return typeof e=="string"&&hs.includes(e)?e:null}function ks(e){if(e.status==="closed")return"done";let t=ys(e.kanbanColumn);return t||(e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"||e.status==="stalled"?"in_review":e.status==="starting"||e.status==="working"||e.status==="analyzing"||e.status==="active"?"in_progress":"todo")}var co=1e15;function We(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 co-t}function ot(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var S=De(kn(),1),ws=[{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"}],at=50;function vs(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function uo(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function mo(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"):e.status==="stalled"?o("sessions.board.signalStalled"):""}function go(e){switch(e){case"backlog":return"kanban-col-dot-idle";case"todo":return"kanban-col-dot-todo";case"in_progress":return"kanban-col-dot-work";case"in_review":return"kanban-col-dot-need";case"done":return"kanban-col-dot-done";default:return"kanban-col-dot-idle"}}function ln(e){return{__html:e}}function Rn(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function po(e){return pe(e.title)||e.sessionId}function xs(e){let t=[],s=new Map;for(let l of e){let p=String(l.chatId??l.sessionId),d=s.get(p);d||(d={chatId:p,rows:[]},s.set(p,d),t.push(d)),d.rows.push(l)}let a=[];return{clusters:t.map(l=>(a.push(...l.rows),l.rows.length<2?{type:"card",row:l.rows[0]}:{type:"cluster",chatId:l.chatId,rows:l.rows})),flat:a}}function Cs(e){let t=new Map(ws.map(a=>[a.id,[]]));for(let a of e)t.get(ks(a)).push(a);return{columns:ws.map(a=>{let r=(t.get(a.id)??[]).sort((g,v)=>We(g)-We(v)),l=0;a.id==="done"&&r.length>at&&(l=r.length-at,r=r.slice(0,at));let{clusters:p,flat:d}=xs(r);return t.set(a.id,d),{id:a.id,labelKey:a.labelKey,rows:r,clusters:p,hiddenCount:l}}),groups:t}}function fo(e){let t=new Map;for(let s of e){if(s.status==="closed")continue;let a=String(s.larkAppId||s.botName||"unknown"),r=t.get(a);r||(r={name:ge(s),larkAppId:s.larkAppId,rows:[]},t.set(a,r)),r.rows.push(s)}return[...t.values()].sort((s,a)=>s.name.localeCompare(a.name)).map(s=>{let a=s.rows.sort((l,p)=>Number(p.lastMessageAt??0)-Number(l.lastMessageAt??0)),{clusters:r}=xs(a);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:a,clusters:r}})}function it(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function bo(e){if(e.groupBy==="bot"){let a=e.rows.filter(r=>!Rn(r));return{mode:"bot",columns:fo(a),groups:new Map,rowById:it(a),team:null,scope:null}}if(e.groupBy==="team"){if(!e.teamsLoaded)return{mode:"loading",groups:new Map,rowById:new Map,team:null,scope:null};let a=e.teams.find(h=>h.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(a??void 0),l=a?e.rows.filter(h=>r.has(String(h.chatId))):[],p=(e.teamBoardKey===a?.key?e.teamBoardData?.board:null)??{},d=(e.teamBoardKey===a?.key?e.teamBoardData?.remoteRows:null)??[],g=[...l,...d].map(h=>{let L=p[String(h.sessionId)];return L?{...h,kanbanColumn:L.column,kanbanPosition:L.position}:h}),{columns:v,groups:b}=Cs(g);return{mode:"flow",columns:v,groups:b,rowById:it(g),team:a,scope:{chats:r.size,sessions:g.length}}}let{columns:t,groups:s}=Cs(e.rows);return{mode:"flow",columns:t,groups:s,rowById:it(e.rows),team:null,scope:null}}function ho(e){let t=new Map;return e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col;a&&s.scrollTop&&t.set(a,s.scrollTop)}),t}function yo(e,t){t?.size&&e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col,r=a?t.get(a):void 0;r&&(s.scrollTop=r)})}function Ss(e,t){for(let s of e.querySelectorAll(".kanban-card:not(.dragging)")){if(s.closest(".kanban-cluster.dragging"))continue;let a=s.getBoundingClientRect();if(t<a.top+a.height/2)return s}return null}function ko(e){let[t,s]=(0,A.useState)(!1),[a,r]=(0,A.useState)(null),l=(0,A.useRef)(null),p=(0,A.useRef)(null),d=(0,A.useCallback)(()=>{let g=l.current;if(!g)return;let v=g.getBoundingClientRect(),b=190,h=8,L=e.items.length*34+10,P=Math.min(Math.max(v.right-b,h),window.innerWidth-b-h),D=window.innerHeight-v.bottom-h,T=v.top-h,R=D>=L||D>T?"bottom":"top",U=R==="bottom"?v.bottom+6:v.top-L-6;r({top:Math.max(h,U),left:P,placement:R})},[e.items.length]);return(0,A.useEffect)(()=>{if(!t)return;let g=window.requestAnimationFrame(d),v=()=>d();return window.addEventListener("resize",v),window.addEventListener("scroll",v,!0),()=>{window.cancelAnimationFrame(g),window.removeEventListener("resize",v),window.removeEventListener("scroll",v,!0)}},[t,d]),(0,A.useEffect)(()=>{if(!t)return;let g=b=>{let h=b.target;h instanceof Node&&(l.current?.contains(h)||p.current?.contains(h))||s(!1)},v=b=>{b.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",v),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",v)}},[t]),(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("button",{ref:l,type:"button",className:`kanban-card-more${t?" is-open":""}`,"data-action":"more","data-menu-items":e.items.map(g=>g.key).join(","),"aria-label":o("sessions.cardMenu"),"aria-haspopup":"menu","aria-expanded":t,onClick:g=>{g.stopPropagation(),s(v=>!v)},children:(0,S.jsxs)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:[(0,S.jsx)("circle",{cx:"8",cy:"3.2",r:"1.3",fill:"currentColor"}),(0,S.jsx)("circle",{cx:"8",cy:"8",r:"1.3",fill:"currentColor"}),(0,S.jsx)("circle",{cx:"8",cy:"12.8",r:"1.3",fill:"currentColor"})]})}),t&&typeof document<"u"?(0,Ns.createPortal)((0,S.jsx)("div",{ref:p,className:`card-menu-pop card-menu-${a?.placement??"bottom"}`,role:"menu","aria-label":o("sessions.cardMenu"),style:{top:`${a?.top??-1e4}px`,left:`${a?.left??-1e4}px`,visibility:a?"visible":"hidden"},onClick:g=>g.stopPropagation(),onPointerDown:g=>g.stopPropagation(),children:e.items.map(g=>g.href?(0,S.jsxs)("a",{role:"menuitem",className:`card-menu-item${g.danger?" danger":""}`,href:g.href,target:"_blank",rel:"noopener",onClick:()=>s(!1),children:[g.icon?(0,S.jsx)("span",{className:"card-menu-icon",dangerouslySetInnerHTML:ln(g.icon)}):null,(0,S.jsx)("span",{className:"card-menu-label",children:g.label})]},g.key):(0,S.jsxs)("button",{type:"button",role:"menuitem",disabled:g.disabled,className:`card-menu-item${g.danger?" danger":""}`,onClick:v=>{s(!1),g.onSelect?.(v.currentTarget)},children:[g.icon?(0,S.jsx)("span",{className:"card-menu-icon",dangerouslySetInnerHTML:ln(g.icon)}):null,(0,S.jsx)("span",{className:"card-menu-label",children:g.label})]},g.key))}),document.body):null]})}function wo(e){let t=pe(e.row.title)||"",[s,a]=(0,A.useState)(t),r=(0,A.useRef)(null),l=(0,A.useRef)(!1);(0,A.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let p=(0,A.useCallback)(d=>{if(l.current)return;l.current=!0;let g=s.trim();d&&g&&g!==t&&e.onCommit(e.row,g),e.onCancel()},[t,e,s]);return(0,S.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:d=>a(d.currentTarget.value),onClick:d=>d.stopPropagation(),onBlur:()=>p(!0),onKeyDown:d=>{d.stopPropagation(),d.key==="Enter"?(d.preventDefault(),p(!0)):d.key==="Escape"&&(d.preventDefault(),p(!1))}})}function Is(e){let{callbacks:t,row:s}=e,a=po(s),r=ge(s),l=_e(s),p=uo(s.workingDir),d=mo(s),v=an(s)??(s.status==="closed"?"closed":"idle"),b=Cn(s),h=b.botText||b.userText,L=[r,l].filter(Boolean).join(" \xB7 "),P=String(s.status??"unknown"),D=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",T=e.editingId===s.sessionId,R=t.selectedSessionIds.has(String(s.sessionId)),U=["kanban-card",R?"selected":"",D?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),H=[];return D||(H.push({key:"details",label:o("sessions.details"),icon:t.icons.details,onSelect:()=>t.onDetails(s)}),H.push({key:"history",label:o("sessions.history.title"),icon:t.icons.history,onSelect:()=>t.onHistory(s)}),s.webPort&&t.onOpenWritableTerminal&&H.push({key:"write-link",label:o("sessions.openWritableTerminal"),icon:t.icons.key,onSelect:O=>t.onOpenWritableTerminal?.(s,O)}),s.feishuChatLink&&H.push({key:"feishu",label:o("sessions.kanban.openFeishu"),icon:t.icons.feishu,href:s.feishuChatLink}),t.canRestartSession(s)&&H.push({key:"restart",label:o("sessions.restart"),icon:t.icons.restart,onSelect:O=>t.onRestart(s,O)}),H.push({key:"lock",label:t.lockActionLabel(s),icon:s.locked?t.icons.unlock:t.icons.lock,onSelect:O=>t.onToggleLock(s,O)}),s.status!=="closed"&&t.onClose&&H.push({key:"close",label:o("sessions.close"),icon:t.icons.close,danger:!0,onSelect:O=>t.onClose?.(s,O)})),(0,S.jsxs)("article",{className:U,"data-id":s.sessionId,"data-signal":v,tabIndex:0,role:"button","aria-pressed":R,draggable:!0,onClick:O=>e.onCardClick(s,O),onKeyDown:O=>e.onCardKeyDown(s,O),onDragStart:O=>e.onDragStartCard(s,O),children:[(0,S.jsxs)("div",{className:"kanban-card-head",children:[(0,S.jsx)("span",{className:`badge cli-${vs(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,S.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,S.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,D?(0,S.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:D}),children:D}):null,d?(0,S.jsx)("span",{className:"session-signal",title:d,children:d}):null,H.length?(0,S.jsx)(ko,{items:H}):null]}),(0,S.jsx)("div",{className:"kanban-card-title-row",children:T?(0,S.jsx)(wo,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,S.jsx)("p",{className:"kanban-card-title",title:String(s.title??a),onDoubleClick:O=>{O.stopPropagation(),e.cancelOpen(),D||e.onBeginEdit(s)},children:String(a).slice(0,140)})}),L?(0,S.jsx)("p",{className:"kanban-card-meta",title:p!=="-"?`${L} \xB7 ${p}`:L,children:L}):null,h?(0,S.jsx)("p",{className:"kanban-card-preview",title:h,children:h}):null,(0,S.jsxs)("div",{className:"kanban-card-foot",children:[(0,S.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:Ke(s.lastMessageAt)}),(0,S.jsx)("span",{className:"kanban-card-dot","data-status":vs(P),title:t.sessionStatusText(P)})]}),!D&&s.webPort&&t.onOpenTerminal?(0,S.jsxs)("button",{type:"button",className:"kanban-card-term","data-action":"terminal",onClick:O=>{O.stopPropagation(),t.onOpenTerminal?.(s)},children:[(0,S.jsx)("span",{dangerouslySetInnerHTML:ln(t.icons.terminal)}),o("sessions.terminal")]}):null]})]})}function Ts(e){let t=e.item;if(t.type==="card")return(0,S.jsx)(Is,{...e.cardProps,row:t.row});let s=_e(t.rows[0])??t.chatId,a=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,S.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${a?" dragging":""}`,"data-chat":t.chatId,children:[(0,S.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,S.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:ln(bn({chatId:t.chatId,name:s,size:"sm"}))}),(0,S.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,S.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,S.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,S.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,S.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,S.jsx)(Is,{...e.cardProps,row:r},r.sessionId)):null]})}function Rs(e){let[t,s]=(0,A.useState)(e),[a,r]=(0,A.useState)(null),[l,p]=(0,A.useState)(null),[d,g]=(0,A.useState)(null),[v,b]=(0,A.useState)(null),[h,L]=(0,A.useState)(()=>new Set),P=(0,A.useRef)(null),D=(0,A.useRef)(null),T=(0,A.useRef)(null),R=(0,A.useRef)(new Map),U=(0,A.useRef)(new Map),H=(0,A.useRef)(l),O=!!a||!!l,x=(0,A.useCallback)(()=>{T.current!==null&&(clearTimeout(T.current),T.current=null)},[]),K=(0,A.useCallback)(I=>{D.current=ho(e.host),s(I)},[e.host]);(0,A.useEffect)(()=>{if(O){P.current=e;return}K(e)},[K,O,e]),(0,A.useEffect)(()=>{if(O||!P.current)return;let I=P.current;P.current=null,K(I)},[K,O]),(0,A.useLayoutEffect)(()=>{yo(e.host,D.current),D.current=null},[t,e.host]),(0,A.useEffect)(()=>{H.current=l},[l]),(0,A.useEffect)(()=>()=>x(),[x]);let _=(0,A.useMemo)(()=>bo(t),[t]);(0,A.useLayoutEffect)(()=>{R.current=_.groups,U.current=_.rowById},[_]),(0,A.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,A.useEffect)(()=>{t.groupBy==="team"&&_.mode==="flow"&&_.team&&t.onNeedTeamBoard(_.team)},[t,_]),(0,A.useEffect)(()=>{t.onTeamScope(_.mode==="flow"?_.scope:null)},[t,_]);let ne=(0,A.useCallback)(()=>{p(null),g(null),b(null)},[]),q=(0,A.useCallback)(I=>{L(E=>{let F=new Set(E);return F.has(I)?F.delete(I):F.add(I),F})},[]),j=(0,A.useCallback)(I=>{x(),!Rn(I)&&r(I.sessionId)},[x]),Ce=(0,A.useCallback)((I,E)=>{Rn(I)||E.target.closest("a, button, input, label")||(x(),T.current=setTimeout(()=>{T.current=null,t.onToggleSelect(I)},220))},[x,t]),Se=(0,A.useCallback)((I,E)=>{E.key!=="Enter"&&E.key!==" "||E.target!==E.currentTarget||Rn(I)||(E.preventDefault(),t.onToggleSelect(I))},[t]),be=(0,A.useCallback)((I,E)=>{t.groupBy!=="bot"&&(x(),p({kind:"card",id:String(I.sessionId)}),E.dataTransfer&&(E.dataTransfer.effectAllowed="move",E.dataTransfer.setData("text/plain",String(I.sessionId))))},[x,t.groupBy]),Ie=(0,A.useCallback)((I,E,F)=>{t.groupBy!=="bot"&&(x(),p({kind:"cluster",chatId:I,col:E}),F.dataTransfer&&(F.dataTransfer.effectAllowed="move",F.dataTransfer.setData("text/plain",`cluster:${I}`)))},[x,t.groupBy]),Me=(0,A.useCallback)((I,E)=>{!H.current||t.groupBy==="bot"||(E.preventDefault(),E.dataTransfer&&(E.dataTransfer.dropEffect="move"),g(I),b(Ss(E.currentTarget,E.clientY)?.dataset.id??null))},[t.groupBy]),Y=(0,A.useCallback)((I,E)=>{let F=H.current;if(!F||t.groupBy==="bot")return;E.preventDefault();let Te=Ss(E.currentTarget,E.clientY);ne();let he=R.current,V=I;if(F.kind==="cluster"){let te=(he.get(F.col)??[]).filter(ee=>String(ee.chatId)===F.chatId).filter(ee=>!(ee.status==="closed"&&V!=="done"));if(!te.length)return;let Ue=new Set(te.map(ee=>ee.sessionId)),oe=(he.get(V)??[]).filter(ee=>!Ue.has(ee.sessionId)),ue=Te?oe.findIndex(ee=>ee.sessionId===Te.dataset.id):oe.length;ue<0&&(ue=oe.length);let me=ue>0?oe[ue-1]:null,Ve=ue<oe.length?oe[ue]:null,qe=ot(me?We(me):null,Ve?We(Ve):null);t.onMoveRows(te.map((ee,we)=>({row:ee,column:V,position:qe+we*.001})));return}let Ne=U.current.get(F.id);if(!Ne||Ne.status==="closed"&&V!=="done")return;let W=(he.get(V)??[]).filter(te=>te.sessionId!==F.id),Q=Te?W.findIndex(te=>te.sessionId===Te.dataset.id):W.length;Q<0&&(Q=W.length);let ye=Q>0?W[Q-1]:null,re=Q<W.length?W[Q]:null,ke=ot(ye?We(ye):null,re?We(re):null);t.onMoveRows([{row:Ne,column:V,position:ke}])},[ne,t]),Le={dragId:l?.kind==="card"?l.id:null,dropBeforeId:v,editingId:a,groupBy:t.groupBy,callbacks:t,cancelOpen:x,onBeginEdit:j,onCardClick:Ce,onCardKeyDown:Se,onDragStartCard:be,onEditDone:()=>r(null)};return _.mode==="loading"?(0,S.jsx)(Je,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):_.mode==="bot"?_.columns.length?(0,S.jsx)(S.Fragment,{children:_.columns.map(I=>(0,S.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":I.key,children:[(0,S.jsxs)("header",{children:[(0,S.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:ln(Ge({name:I.name,larkAppId:I.larkAppId,size:"sm"}))}),(0,S.jsx)("h2",{children:I.name}),(0,S.jsx)("span",{className:"kanban-col-count",children:I.rows.length})]}),(0,S.jsx)("div",{className:"kanban-col-list",onDragOver:E=>Me(I.key,E),onDragEnd:ne,children:I.clusters.map(E=>(0,S.jsx)(Ts,{item:E,dragCluster:l?.kind==="cluster"?l:null,cardProps:Le,expanded:E.type==="cluster"&&h.has(`bot:${I.key}:${E.chatId}`),onToggleExpanded:()=>{E.type==="cluster"&&q(`bot:${I.key}:${E.chatId}`)},onDragStartCluster:Ie},E.type==="card"?E.row.sessionId:E.chatId))})]},I.key))}):(0,S.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,S.jsx)(S.Fragment,{children:_.columns.map(I=>(0,S.jsxs)("section",{className:`kanban-column kanban-${I.id}${d===I.id?" drag-over":""}`,"data-col":I.id,onDragOver:E=>Me(I.id,E),onDrop:E=>Y(I.id,E),onDragEnd:ne,children:[(0,S.jsxs)("header",{children:[(0,S.jsx)("span",{className:`kanban-col-dot ${go(I.id)}`,"aria-hidden":"true"}),(0,S.jsx)("h2",{children:o(I.labelKey)}),(0,S.jsx)("span",{className:"kanban-col-count",children:I.rows.length+I.hiddenCount})]}),(0,S.jsxs)("div",{className:"kanban-col-list",children:[I.rows.length?I.clusters.map(E=>(0,S.jsx)(Ts,{item:E,columnId:I.id,dragCluster:l?.kind==="cluster"?l:null,cardProps:Le,expanded:E.type==="cluster"&&h.has(`${I.id}:${E.chatId}`),onToggleExpanded:()=>{E.type==="cluster"&&q(`${I.id}:${E.chatId}`)},onDragStartCluster:Ie},E.type==="card"?E.row.sessionId:E.chatId)):(0,S.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),I.hiddenCount?(0,S.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:I.hiddenCount})}):null]})]},I.id))})}var n=De(kn(),1),vo=new Set(["image/png","image/jpeg","image/gif","image/webp"]),Es=8,Co=10*1024*1024,So=25*1024*1024;function Io(e){return new Promise((t,s)=>{let a=new FileReader;a.onload=()=>typeof a.result=="string"?t(a.result):s(new Error("bad_image_data")),a.onerror=()=>s(a.error??new Error("image_read_failed")),a.readAsDataURL(e)})}function To(e){return e===168?"7d":`${e}H`}var No=Xn.map(e=>({value:String(e),label:To(e)}));function de(e){return{__html:e}}function ae(){return typeof window>"u"?void 0:window.localStorage}function En(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${Sn(t)}`,children:tn(t)})}function lt(e){let t=e.row?.openTodos,[s,a]=(0,c.useState)(null),[r,l]=(0,c.useState)(!1),[p,d]=(0,c.useState)(!1),g=(0,c.useRef)(null),v=(0,c.useRef)(null);if((0,c.useEffect)(()=>{if(!r)return;let x=_=>{let ne=_.target;v.current?.contains(ne)||g.current?.contains(ne)||(l(!1),a(null))},K=_=>{_.key==="Escape"&&(l(!1),a(null))};return document.addEventListener("mousedown",x,!0),document.addEventListener("keydown",K,!0),()=>{document.removeEventListener("mousedown",x,!0),document.removeEventListener("keydown",K,!0)}},[r]),!t||typeof t.remaining!="number"||t.remaining<=0)return null;let b=Number(t.total??0),h=Number(t.done??0),L=o("sessions.board.todoBadge",{done:h,total:b}),P=o("sessions.board.todoBadgeTitle",{remaining:t.remaining,total:b,done:h}),D=Array.isArray(t.items)?t.items:[],T=x=>x==="completed"?"\u2713":x==="in_progress"?"\u25B6":"\u25CB",R=x=>{let K=x.getBoundingClientRect();a({x:K.left,y:K.bottom+6})},U=()=>{let x=_=>_==="completed"?"[x]":_==="in_progress"?"[>]":"[ ]",K=D.map((_,ne)=>`${x(_.status)} ${_.text||`#${ne+1}`}`);return`${P}
|
|
5
|
+
`).replace(/^\n+/,"").replace(/\s+$/,"");return s?s.length>t?`${s.slice(0,t-1)}\u2026`:s:""}function Cn(e){let t=Qt(e.previewUserFullText??e.previewUserText??"",4e3),s=e.previewBotState==="replied"?Qt(e.previewBotFullText??e.previewBotText??"",4e3):"";return{userText:Zt(t,120),userFullText:t,botText:Zt(s,220),botFullText:s}}var ts={open:!1,suppressFocusOpen:!1};function ss(e,t){switch(t){case"open":return{open:!0,suppressFocusOpen:!1};case"close":return{open:!1,suppressFocusOpen:!1};case"toggle":return{open:!e.open,suppressFocusOpen:!1};case"focus":return e.suppressFocusOpen?{open:e.open,suppressFocusOpen:!1}:{open:!0,suppressFocusOpen:!1};case"escape-refocus":return{open:!1,suppressFocusOpen:!0};default:return e}}var se=[...Yt.map(e=>e.id),"unknown"],qn=[{id:"needs-you",labelKey:"sessions.board.needsYou",hintKey:"sessions.board.needsYouHint"},{id:"working",labelKey:"sessions.board.working",hintKey:"sessions.board.workingHint"},{id:"todo",labelKey:"sessions.board.todo",hintKey:"sessions.board.todoHint"},{id:"idle",labelKey:"sessions.board.idle",hintKey:"sessions.board.idleHint"}];function Sn(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var os=["starting","working","idle","dormant","analyzing","stalled","active","limited","closed"];function tn(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function as(e){let t=0,s=0,a=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&a++);return{logical:t,resident:s,dormant:a}}function Yn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function es(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function ao(e){let t=o("sessions.directChat"),s=String(e?.chatDisplayName??"").trim()||String(e?.chatId??"").trim()||o("sessions.chatUnknown"),a=ge(e);return`${t} \xB7 ${s} - ${a}`}function Fe(e){let t=String(e?.chatId??"").trim();if(e?.chatType==="p2p")return ao(e);let s=_e(e),a=e?.chatType==="p2p"?(()=>{let r=String(e?.botName??"").trim();return r?` \xB7 ${r}`:""})():"";return s?`${es(e)} \xB7 ${s}${a}`:t?`${es(e)} \xB7 ${t}${a}`:o("sessions.chatUnknown")}function Zn(e,t=_e){return!!String(e?.chatId??"").trim()&&!t(e)}function ns(e,t){let s=String(t??"").trim();return!!s&&String(e??"").includes(s)}function is(e,t,s){if(e===void 0)return t;let a=ns(e,s),r=ns(t,s);return a!==r?a?t:e:t<e?t:e}function Qn(e){let t=Fe(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function rs(e){return`${JSON.stringify(e)} ${Fe(e)} ${Qn(e)}`.toLowerCase()}function fe(e){return typeof e=="string"?e.trim():""}function ls(e){let t=fe(e?.chatId),s=fe(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function et(e){let t=fe(e?.chatId),s=fe(e?.rootMessageId),a=ls(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(fe(e?.sessionId)||"unknown")}`}function io(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=fe(a?.title);if(r)return r}return t}function In(e){let t=new Map;for(let a of e){let r=et(a),l=t.get(r);l?l.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let l=[...r].sort((R,U)=>Number(U.lastMessageAt??0)-Number(R.lastMessageAt??0)),p=l[0]??{},d=ls(p),g=fe(p.chatId),v=d==="thread"?fe(p.rootMessageId):"",b=new Set(l.map(R=>fe(R.larkAppId)||fe(R.botName)).filter(Boolean)),h=Math.max(1,b.size),L=l.filter(R=>R.status!=="closed").length,P=l.filter(R=>R.lastInputFromBot===!0).length,D=l.reduce((R,U)=>Math.max(R,Number(U.lastMessageAt??0)),0),T=v||g||fe(p.sessionId)||a;s.push({key:a,kind:d,chatId:g,...v?{rootMessageId:v}:{},title:io(l,T),rows:l,botCount:h,activeCount:L,closedCount:l.length-L,inferredBotInputCount:P,latestActivityAt:D,multiBot:b.size>1,inferredBotTriggered:P>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var sn=zt;function on(e=He){return e.authed?!0:(e.publicReadOnly,!1)}var J={pin:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 14.3s4.2-3.9 4.2-7.3A4.2 4.2 0 0 0 8 2.9a4.2 4.2 0 0 0-4.2 4.1C3.8 10.4 8 14.3 8 14.3z"/><circle cx="8" cy="6.9" r="1.5"/></svg>',openChat:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.8h3.8v3.8"/><path d="M13.2 2.8 7.3 8.7"/><path d="M11.5 9.3v2.9a1.2 1.2 0 0 1-1.2 1.2H3.8a1.2 1.2 0 0 1-1.2-1.2V5.7a1.2 1.2 0 0 1 1.2-1.2h2.9"/></svg>',details:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.6" width="11.2" height="10.8" rx="2"/><path d="M5.2 5.4h5.6"/><path d="M5.2 8h5.6"/><path d="M5.2 10.6h3.2"/></svg>',terminal:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="1.8" y="2.2" width="12.4" height="10.5" rx="2"/><path d="M1.8 5h12.4"/><circle cx="4" cy="3.6" r=".45" fill="currentColor" stroke="none"/><path d="m4.2 7.3 1.8 1.6-1.8 1.6"/><path d="M8 10.6h3.4"/></svg>',key:'<svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="6" cy="6.1" r="3"/><path d="M8.1 8.2 13 13.1"/><path d="M11.3 11.4 12.6 10.1"/><path d="M12.7 12.8 13.7 11.8"/></svg>',lock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.4a2.9 2.9 0 0 1 5.8 0V7"/><path d="M8 9.5v1.4"/></svg>',unlock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.3a2.9 2.9 0 0 1 5.1-1.9"/><path d="M8 9.5v1.4"/></svg>',close:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4.2 4.2 11.8 11.8"/><path d="M11.8 4.2 4.2 11.8"/></svg>',edit:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10.7 3.3 12.7 5.3 6.3 11.7 3.7 12.3 4.3 9.7 10.7 3.3z"/></svg>',history:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 7.8a4.8 4.8 0 1 0 1.4-3.4"/><path d="M3.2 3.1v3.2h3.2"/><path d="M8 5.4v3l2.1 1.2"/></svg>',restart:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M12.7 6.5A4.8 4.8 0 1 0 13 9"/><path d="M12.7 3.3v3.2H9.5"/></svg>',feishu:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 5.2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v3.3a2 2 0 0 1-2 2H7.1L4.3 13v-2.5H5"/><path d="M9.1 3.2h3.7v3.7"/><path d="M12.8 3.2 8.5 7.5"/></svg>',copy:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="5.5" y="5.5" width="7.5" height="7.5" rx="1.4"/><path d="M10.5 5.5V4.1a1.4 1.4 0 0 0-1.4-1.4H4.1a1.4 1.4 0 0 0-1.4 1.4v5a1.4 1.4 0 0 0 1.4 1.4h1.4"/></svg>'};function Tn(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function Nn(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let a=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await a.json().catch(()=>({}));if(!a.ok||r?.ok===!1||!r?.url){s?.close(),a.status!==401&&B(`${o("sessions.writeLinkFail")}: ${r?.error??a.status}`,{kind:"error"});return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(a){s?.close(),B(`${o("sessions.writeLinkFail")}: ${a}`,{kind:"error"})}finally{t&&(t.disabled=!1)}}async function cs(e,t){t&&(t.disabled=!0);try{let s=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/spawn-command`),a=await s.json().catch(()=>({}));if(!s.ok||a?.ok===!1||!a?.command){s.status!==401&&B(`${o("sessions.copyCommandFail")}: ${a?.error??s.status}`,{kind:"error"});return}if(await yn(a.command,o("sessions.copyCommand"))&&t){let r=t.textContent;t.textContent=o("sessions.copyCommandDone"),setTimeout(()=>{r!==null&&(t.textContent=r)},1500)}}catch(s){B(`${o("sessions.copyCommandFail")}: ${s}`,{kind:"error"})}finally{t&&(t.disabled=!1)}}function nt(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,a=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${a||r||"unknown"}`}function an(e){return e.status==="closed"?null:e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"||e.status==="stalled"?"needs-you":e.status==="starting"||e.status==="working"||e.status==="analyzing"||e.status==="active"?"working":ro(e)?"todo":"idle"}function ro(e){let t=e?.openTodos;return!!t&&typeof t.remaining=="number"&&t.remaining>0}function ds(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),a=He.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${a}${tn(t)}`,`${o("sessions.restartConfirmCli")}${a}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
|
|
6
|
+
`)}function xn(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo&&!jt(e.cliId)}async function us(){try{let e=await fetch("/api/groups");if(!e.ok)return[];let t=await e.json();return(Array.isArray(t?.bots)?t.bots:[]).filter(a=>a&&typeof a.larkAppId=="string").map(a=>({larkAppId:a.larkAppId,botName:typeof a.botName=="string"&&a.botName?a.botName:a.larkAppId}))}catch{return[]}}var rn=new Jt({html:!1,linkify:!0,breaks:!0});rn.validateLink=e=>/^(https?:|mailto:)/i.test(e.trim());var ms=rn.renderer.rules.link_open;rn.renderer.rules.link_open=(e,t,s,a,r)=>(e[t].attrSet("target","_blank"),e[t].attrSet("rel","noopener noreferrer nofollow"),ms?ms(e,t,s,a,r):r.renderToken(e,t,s));rn.renderer.rules.image=(e,t)=>{let s=e[t],a=s.children?.reduce((d,g)=>d+(g.content??""),"")??"",r=en(a.trim()||"image"),l=s.attrGet("src")??"";return/^(https?:|mailto:)/i.test(l.trim())?`<span class="session-card-exchange-img">\u{1F5BC} <a href="${en(l)}" target="_blank" rel="noopener noreferrer nofollow">${r}</a></span>`:`<span class="session-card-exchange-img">\u{1F5BC} ${r}</span>`};function tt(e){let t=String(e??"");if(!t.trim())return"";try{return rn.render(t).trim()||`<p>${en(t)}</p>`}catch{return`<p>${en(t)}</p>`}}function st(e,t){let s=Math.max(0,Math.min(t,e.length)),r=e.slice(0,s).match(/(?:^|\s)@([^\s@]*)$/u);if(!r)return null;let l=r[1]??"";return{start:s-l.length-1,end:s,query:l}}function gs(e,t,s){let a=`@${s} `,r=e[t.end]===" "?t.end+1:t.end;return{text:e.slice(0,t.start)+a+e.slice(r),caret:t.start+a.length}}function ps(e,t){let s=t.trim().toLocaleLowerCase();return s?e.filter(a=>a.botName.toLocaleLowerCase().includes(s)||a.larkAppId.toLocaleLowerCase().includes(s)):[...e]}function fs(e,t,s,a){if(a.length===0)return{text:e,caret:Math.max(0,Math.min(t,e.length))};let r=Math.max(0,Math.min(t,e.length)),l=Math.max(r,Math.min(s,e.length)),p=e.slice(0,r),d=e.slice(l),g=p&&!/\s$/u.test(p)?" ":"",v=d&&!/^\s/u.test(d)?" ":"",b=`${g}${a.join(" ")}${v}`;return{text:p+b+d,caret:p.length+b.length}}function lo(e,t){let s=e.indexOf(t);if(s<0)return e;let a=e.slice(0,s),r=e.slice(s+t.length);return/\s$/u.test(a)&&/^\s/u.test(r)&&(r=r.slice(1)),a+r}function bs(e,t,s,a){let r=lo(e,t),l=s.map((p,d)=>a(d));return s.forEach((p,d)=>{let g=r.indexOf(p);g<0||p===l[d]||(r=r.slice(0,g)+l[d]+r.slice(g+p.length))}),{text:r,markers:l}}var A=De(vt(),1),Ns=De(Ct(),1);var hs=["backlog","todo","in_progress","in_review","done"];function ys(e){return typeof e=="string"&&hs.includes(e)?e:null}function ks(e){if(e.status==="closed")return"done";let t=ys(e.kanbanColumn);return t||(e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"||e.status==="stalled"?"in_review":e.status==="starting"||e.status==="working"||e.status==="analyzing"||e.status==="active"?"in_progress":"todo")}var co=1e15;function We(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 co-t}function ot(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var S=De(kn(),1),ws=[{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"}],at=50;function vs(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function uo(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function mo(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"):e.status==="stalled"?o("sessions.board.signalStalled"):""}function go(e){switch(e){case"backlog":return"kanban-col-dot-idle";case"todo":return"kanban-col-dot-todo";case"in_progress":return"kanban-col-dot-work";case"in_review":return"kanban-col-dot-need";case"done":return"kanban-col-dot-done";default:return"kanban-col-dot-idle"}}function ln(e){return{__html:e}}function Rn(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function po(e){return pe(e.title)||e.sessionId}function xs(e){let t=[],s=new Map;for(let l of e){let p=String(l.chatId??l.sessionId),d=s.get(p);d||(d={chatId:p,rows:[]},s.set(p,d),t.push(d)),d.rows.push(l)}let a=[];return{clusters:t.map(l=>(a.push(...l.rows),l.rows.length<2?{type:"card",row:l.rows[0]}:{type:"cluster",chatId:l.chatId,rows:l.rows})),flat:a}}function Cs(e){let t=new Map(ws.map(a=>[a.id,[]]));for(let a of e)t.get(ks(a)).push(a);return{columns:ws.map(a=>{let r=(t.get(a.id)??[]).sort((g,v)=>We(g)-We(v)),l=0;a.id==="done"&&r.length>at&&(l=r.length-at,r=r.slice(0,at));let{clusters:p,flat:d}=xs(r);return t.set(a.id,d),{id:a.id,labelKey:a.labelKey,rows:r,clusters:p,hiddenCount:l}}),groups:t}}function fo(e){let t=new Map;for(let s of e){if(s.status==="closed")continue;let a=String(s.larkAppId||s.botName||"unknown"),r=t.get(a);r||(r={name:ge(s),larkAppId:s.larkAppId,rows:[]},t.set(a,r)),r.rows.push(s)}return[...t.values()].sort((s,a)=>s.name.localeCompare(a.name)).map(s=>{let a=s.rows.sort((l,p)=>Number(p.lastMessageAt??0)-Number(l.lastMessageAt??0)),{clusters:r}=xs(a);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:a,clusters:r}})}function it(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function bo(e){if(e.groupBy==="bot"){let a=e.rows.filter(r=>!Rn(r));return{mode:"bot",columns:fo(a),groups:new Map,rowById:it(a),team:null,scope:null}}if(e.groupBy==="team"){if(!e.teamsLoaded)return{mode:"loading",groups:new Map,rowById:new Map,team:null,scope:null};let a=e.teams.find(h=>h.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(a??void 0),l=a?e.rows.filter(h=>r.has(String(h.chatId))):[],p=(e.teamBoardKey===a?.key?e.teamBoardData?.board:null)??{},d=(e.teamBoardKey===a?.key?e.teamBoardData?.remoteRows:null)??[],g=[...l,...d].map(h=>{let L=p[String(h.sessionId)];return L?{...h,kanbanColumn:L.column,kanbanPosition:L.position}:h}),{columns:v,groups:b}=Cs(g);return{mode:"flow",columns:v,groups:b,rowById:it(g),team:a,scope:{chats:r.size,sessions:g.length}}}let{columns:t,groups:s}=Cs(e.rows);return{mode:"flow",columns:t,groups:s,rowById:it(e.rows),team:null,scope:null}}function ho(e){let t=new Map;return e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col;a&&s.scrollTop&&t.set(a,s.scrollTop)}),t}function yo(e,t){t?.size&&e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col,r=a?t.get(a):void 0;r&&(s.scrollTop=r)})}function Ss(e,t){for(let s of e.querySelectorAll(".kanban-card:not(.dragging)")){if(s.closest(".kanban-cluster.dragging"))continue;let a=s.getBoundingClientRect();if(t<a.top+a.height/2)return s}return null}function ko(e){let[t,s]=(0,A.useState)(!1),[a,r]=(0,A.useState)(null),l=(0,A.useRef)(null),p=(0,A.useRef)(null),d=(0,A.useCallback)(()=>{let g=l.current;if(!g)return;let v=g.getBoundingClientRect(),b=190,h=8,L=e.items.length*34+10,P=Math.min(Math.max(v.right-b,h),window.innerWidth-b-h),D=window.innerHeight-v.bottom-h,T=v.top-h,R=D>=L||D>T?"bottom":"top",U=R==="bottom"?v.bottom+6:v.top-L-6;r({top:Math.max(h,U),left:P,placement:R})},[e.items.length]);return(0,A.useEffect)(()=>{if(!t)return;let g=window.requestAnimationFrame(d),v=()=>d();return window.addEventListener("resize",v),window.addEventListener("scroll",v,!0),()=>{window.cancelAnimationFrame(g),window.removeEventListener("resize",v),window.removeEventListener("scroll",v,!0)}},[t,d]),(0,A.useEffect)(()=>{if(!t)return;let g=b=>{let h=b.target;h instanceof Node&&(l.current?.contains(h)||p.current?.contains(h))||s(!1)},v=b=>{b.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",v),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",v)}},[t]),(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("button",{ref:l,type:"button",className:`kanban-card-more${t?" is-open":""}`,"data-action":"more","data-menu-items":e.items.map(g=>g.key).join(","),"aria-label":o("sessions.cardMenu"),"aria-haspopup":"menu","aria-expanded":t,onClick:g=>{g.stopPropagation(),s(v=>!v)},children:(0,S.jsxs)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:[(0,S.jsx)("circle",{cx:"8",cy:"3.2",r:"1.3",fill:"currentColor"}),(0,S.jsx)("circle",{cx:"8",cy:"8",r:"1.3",fill:"currentColor"}),(0,S.jsx)("circle",{cx:"8",cy:"12.8",r:"1.3",fill:"currentColor"})]})}),t&&typeof document<"u"?(0,Ns.createPortal)((0,S.jsx)("div",{ref:p,className:`card-menu-pop card-menu-${a?.placement??"bottom"}`,role:"menu","aria-label":o("sessions.cardMenu"),style:{top:`${a?.top??-1e4}px`,left:`${a?.left??-1e4}px`,visibility:a?"visible":"hidden"},onClick:g=>g.stopPropagation(),onPointerDown:g=>g.stopPropagation(),children:e.items.map(g=>g.href?(0,S.jsxs)("a",{role:"menuitem",className:`card-menu-item${g.danger?" danger":""}`,href:g.href,target:"_blank",rel:"noopener",onClick:()=>s(!1),children:[g.icon?(0,S.jsx)("span",{className:"card-menu-icon",dangerouslySetInnerHTML:ln(g.icon)}):null,(0,S.jsx)("span",{className:"card-menu-label",children:g.label})]},g.key):(0,S.jsxs)("button",{type:"button",role:"menuitem",disabled:g.disabled,className:`card-menu-item${g.danger?" danger":""}`,onClick:v=>{s(!1),g.onSelect?.(v.currentTarget)},children:[g.icon?(0,S.jsx)("span",{className:"card-menu-icon",dangerouslySetInnerHTML:ln(g.icon)}):null,(0,S.jsx)("span",{className:"card-menu-label",children:g.label})]},g.key))}),document.body):null]})}function wo(e){let t=pe(e.row.title)||"",[s,a]=(0,A.useState)(t),r=(0,A.useRef)(null),l=(0,A.useRef)(!1);(0,A.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let p=(0,A.useCallback)(d=>{if(l.current)return;l.current=!0;let g=s.trim();d&&g&&g!==t&&e.onCommit(e.row,g),e.onCancel()},[t,e,s]);return(0,S.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:d=>a(d.currentTarget.value),onClick:d=>d.stopPropagation(),onBlur:()=>p(!0),onKeyDown:d=>{d.stopPropagation(),d.key==="Enter"?(d.preventDefault(),p(!0)):d.key==="Escape"&&(d.preventDefault(),p(!1))}})}function Is(e){let{callbacks:t,row:s}=e,a=po(s),r=ge(s),l=_e(s),p=uo(s.workingDir),d=mo(s),v=an(s)??(s.status==="closed"?"closed":"idle"),b=Cn(s),h=b.botText||b.userText,L=[r,l].filter(Boolean).join(" \xB7 "),P=String(s.status??"unknown"),D=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",T=e.editingId===s.sessionId,R=t.selectedSessionIds.has(String(s.sessionId)),U=["kanban-card",R?"selected":"",D?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),H=[];return D||(H.push({key:"details",label:o("sessions.details"),icon:t.icons.details,onSelect:()=>t.onDetails(s)}),H.push({key:"history",label:o("sessions.history.title"),icon:t.icons.history,onSelect:()=>t.onHistory(s)}),s.webPort&&t.onOpenWritableTerminal&&H.push({key:"write-link",label:o("sessions.openWritableTerminal"),icon:t.icons.key,onSelect:O=>t.onOpenWritableTerminal?.(s,O)}),s.feishuChatLink&&H.push({key:"feishu",label:o("sessions.kanban.openFeishu"),icon:t.icons.feishu,href:s.feishuChatLink}),t.canRestartSession(s)&&H.push({key:"restart",label:o("sessions.restart"),icon:t.icons.restart,onSelect:O=>t.onRestart(s,O)}),H.push({key:"lock",label:t.lockActionLabel(s),icon:s.locked?t.icons.unlock:t.icons.lock,onSelect:O=>t.onToggleLock(s,O)}),s.status!=="closed"&&t.onClose&&H.push({key:"close",label:o("sessions.close"),icon:t.icons.close,danger:!0,onSelect:O=>t.onClose?.(s,O)})),(0,S.jsxs)("article",{className:U,"data-id":s.sessionId,"data-signal":v,tabIndex:0,role:"button","aria-pressed":R,draggable:!0,onClick:O=>e.onCardClick(s,O),onKeyDown:O=>e.onCardKeyDown(s,O),onDragStart:O=>e.onDragStartCard(s,O),children:[(0,S.jsxs)("div",{className:"kanban-card-head",children:[(0,S.jsx)("span",{className:`badge cli-${vs(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,S.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,S.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,D?(0,S.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:D}),children:D}):null,d?(0,S.jsx)("span",{className:"session-signal",title:d,children:d}):null,H.length?(0,S.jsx)(ko,{items:H}):null]}),(0,S.jsx)("div",{className:"kanban-card-title-row",children:T?(0,S.jsx)(wo,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,S.jsx)("p",{className:"kanban-card-title",title:String(s.title??a),onDoubleClick:O=>{O.stopPropagation(),e.cancelOpen(),D||e.onBeginEdit(s)},children:String(a).slice(0,140)})}),L?(0,S.jsx)("p",{className:"kanban-card-meta",title:p!=="-"?`${L} \xB7 ${p}`:L,children:L}):null,h?(0,S.jsx)("p",{className:"kanban-card-preview",title:h,children:h}):null,(0,S.jsxs)("div",{className:"kanban-card-foot",children:[(0,S.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:Ke(s.lastMessageAt)}),(0,S.jsx)("span",{className:"kanban-card-dot","data-status":vs(P),title:t.sessionStatusText(P)})]}),!D&&s.webPort&&t.onOpenTerminal?(0,S.jsxs)("button",{type:"button",className:"kanban-card-term","data-action":"terminal",onClick:O=>{O.stopPropagation(),t.onOpenTerminal?.(s)},children:[(0,S.jsx)("span",{dangerouslySetInnerHTML:ln(t.icons.terminal)}),o("sessions.terminal")]}):null]})]})}function Ts(e){let t=e.item;if(t.type==="card")return(0,S.jsx)(Is,{...e.cardProps,row:t.row});let s=_e(t.rows[0])??t.chatId,a=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,S.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${a?" dragging":""}`,"data-chat":t.chatId,children:[(0,S.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,S.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:ln(bn({chatId:t.chatId,name:s,size:"sm"}))}),(0,S.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,S.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,S.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,S.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,S.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,S.jsx)(Is,{...e.cardProps,row:r},r.sessionId)):null]})}function Rs(e){let[t,s]=(0,A.useState)(e),[a,r]=(0,A.useState)(null),[l,p]=(0,A.useState)(null),[d,g]=(0,A.useState)(null),[v,b]=(0,A.useState)(null),[h,L]=(0,A.useState)(()=>new Set),P=(0,A.useRef)(null),D=(0,A.useRef)(null),T=(0,A.useRef)(null),R=(0,A.useRef)(new Map),U=(0,A.useRef)(new Map),H=(0,A.useRef)(l),O=!!a||!!l,x=(0,A.useCallback)(()=>{T.current!==null&&(clearTimeout(T.current),T.current=null)},[]),K=(0,A.useCallback)(I=>{D.current=ho(e.host),s(I)},[e.host]);(0,A.useEffect)(()=>{if(O){P.current=e;return}K(e)},[K,O,e]),(0,A.useEffect)(()=>{if(O||!P.current)return;let I=P.current;P.current=null,K(I)},[K,O]),(0,A.useLayoutEffect)(()=>{yo(e.host,D.current),D.current=null},[t,e.host]),(0,A.useEffect)(()=>{H.current=l},[l]),(0,A.useEffect)(()=>()=>x(),[x]);let _=(0,A.useMemo)(()=>bo(t),[t]);(0,A.useLayoutEffect)(()=>{R.current=_.groups,U.current=_.rowById},[_]),(0,A.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,A.useEffect)(()=>{t.groupBy==="team"&&_.mode==="flow"&&_.team&&t.onNeedTeamBoard(_.team)},[t,_]),(0,A.useEffect)(()=>{t.onTeamScope(_.mode==="flow"?_.scope:null)},[t,_]);let ne=(0,A.useCallback)(()=>{p(null),g(null),b(null)},[]),q=(0,A.useCallback)(I=>{L(E=>{let F=new Set(E);return F.has(I)?F.delete(I):F.add(I),F})},[]),j=(0,A.useCallback)(I=>{x(),!Rn(I)&&r(I.sessionId)},[x]),Ce=(0,A.useCallback)((I,E)=>{Rn(I)||E.target.closest("a, button, input, label")||(x(),T.current=setTimeout(()=>{T.current=null,t.onToggleSelect(I)},220))},[x,t]),Se=(0,A.useCallback)((I,E)=>{E.key!=="Enter"&&E.key!==" "||E.target!==E.currentTarget||Rn(I)||(E.preventDefault(),t.onToggleSelect(I))},[t]),be=(0,A.useCallback)((I,E)=>{t.groupBy!=="bot"&&(x(),p({kind:"card",id:String(I.sessionId)}),E.dataTransfer&&(E.dataTransfer.effectAllowed="move",E.dataTransfer.setData("text/plain",String(I.sessionId))))},[x,t.groupBy]),Ie=(0,A.useCallback)((I,E,F)=>{t.groupBy!=="bot"&&(x(),p({kind:"cluster",chatId:I,col:E}),F.dataTransfer&&(F.dataTransfer.effectAllowed="move",F.dataTransfer.setData("text/plain",`cluster:${I}`)))},[x,t.groupBy]),Me=(0,A.useCallback)((I,E)=>{!H.current||t.groupBy==="bot"||(E.preventDefault(),E.dataTransfer&&(E.dataTransfer.dropEffect="move"),g(I),b(Ss(E.currentTarget,E.clientY)?.dataset.id??null))},[t.groupBy]),Y=(0,A.useCallback)((I,E)=>{let F=H.current;if(!F||t.groupBy==="bot")return;E.preventDefault();let Te=Ss(E.currentTarget,E.clientY);ne();let he=R.current,V=I;if(F.kind==="cluster"){let te=(he.get(F.col)??[]).filter(ee=>String(ee.chatId)===F.chatId).filter(ee=>!(ee.status==="closed"&&V!=="done"));if(!te.length)return;let Ue=new Set(te.map(ee=>ee.sessionId)),oe=(he.get(V)??[]).filter(ee=>!Ue.has(ee.sessionId)),ue=Te?oe.findIndex(ee=>ee.sessionId===Te.dataset.id):oe.length;ue<0&&(ue=oe.length);let me=ue>0?oe[ue-1]:null,Ve=ue<oe.length?oe[ue]:null,qe=ot(me?We(me):null,Ve?We(Ve):null);t.onMoveRows(te.map((ee,we)=>({row:ee,column:V,position:qe+we*.001})));return}let Ne=U.current.get(F.id);if(!Ne||Ne.status==="closed"&&V!=="done")return;let W=(he.get(V)??[]).filter(te=>te.sessionId!==F.id),Q=Te?W.findIndex(te=>te.sessionId===Te.dataset.id):W.length;Q<0&&(Q=W.length);let ye=Q>0?W[Q-1]:null,re=Q<W.length?W[Q]:null,ke=ot(ye?We(ye):null,re?We(re):null);t.onMoveRows([{row:Ne,column:V,position:ke}])},[ne,t]),Le={dragId:l?.kind==="card"?l.id:null,dropBeforeId:v,editingId:a,groupBy:t.groupBy,callbacks:t,cancelOpen:x,onBeginEdit:j,onCardClick:Ce,onCardKeyDown:Se,onDragStartCard:be,onEditDone:()=>r(null)};return _.mode==="loading"?(0,S.jsx)(Je,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):_.mode==="bot"?_.columns.length?(0,S.jsx)(S.Fragment,{children:_.columns.map(I=>(0,S.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":I.key,children:[(0,S.jsxs)("header",{children:[(0,S.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:ln(ze({name:I.name,larkAppId:I.larkAppId,size:"sm"}))}),(0,S.jsx)("h2",{children:I.name}),(0,S.jsx)("span",{className:"kanban-col-count",children:I.rows.length})]}),(0,S.jsx)("div",{className:"kanban-col-list",onDragOver:E=>Me(I.key,E),onDragEnd:ne,children:I.clusters.map(E=>(0,S.jsx)(Ts,{item:E,dragCluster:l?.kind==="cluster"?l:null,cardProps:Le,expanded:E.type==="cluster"&&h.has(`bot:${I.key}:${E.chatId}`),onToggleExpanded:()=>{E.type==="cluster"&&q(`bot:${I.key}:${E.chatId}`)},onDragStartCluster:Ie},E.type==="card"?E.row.sessionId:E.chatId))})]},I.key))}):(0,S.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,S.jsx)(S.Fragment,{children:_.columns.map(I=>(0,S.jsxs)("section",{className:`kanban-column kanban-${I.id}${d===I.id?" drag-over":""}`,"data-col":I.id,onDragOver:E=>Me(I.id,E),onDrop:E=>Y(I.id,E),onDragEnd:ne,children:[(0,S.jsxs)("header",{children:[(0,S.jsx)("span",{className:`kanban-col-dot ${go(I.id)}`,"aria-hidden":"true"}),(0,S.jsx)("h2",{children:o(I.labelKey)}),(0,S.jsx)("span",{className:"kanban-col-count",children:I.rows.length+I.hiddenCount})]}),(0,S.jsxs)("div",{className:"kanban-col-list",children:[I.rows.length?I.clusters.map(E=>(0,S.jsx)(Ts,{item:E,columnId:I.id,dragCluster:l?.kind==="cluster"?l:null,cardProps:Le,expanded:E.type==="cluster"&&h.has(`${I.id}:${E.chatId}`),onToggleExpanded:()=>{E.type==="cluster"&&q(`${I.id}:${E.chatId}`)},onDragStartCluster:Ie},E.type==="card"?E.row.sessionId:E.chatId)):(0,S.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),I.hiddenCount?(0,S.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:I.hiddenCount})}):null]})]},I.id))})}var n=De(kn(),1),vo=new Set(["image/png","image/jpeg","image/gif","image/webp"]),Es=8,Co=10*1024*1024,So=25*1024*1024;function Io(e){return new Promise((t,s)=>{let a=new FileReader;a.onload=()=>typeof a.result=="string"?t(a.result):s(new Error("bad_image_data")),a.onerror=()=>s(a.error??new Error("image_read_failed")),a.readAsDataURL(e)})}function To(e){return e===168?"7d":`${e}H`}var No=Xn.map(e=>({value:String(e),label:To(e)}));function de(e){return{__html:e}}function ae(){return typeof window>"u"?void 0:window.localStorage}function En(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${Sn(t)}`,children:tn(t)})}function lt(e){let t=e.row?.openTodos,[s,a]=(0,c.useState)(null),[r,l]=(0,c.useState)(!1),[p,d]=(0,c.useState)(!1),g=(0,c.useRef)(null),v=(0,c.useRef)(null);if((0,c.useEffect)(()=>{if(!r)return;let x=_=>{let ne=_.target;v.current?.contains(ne)||g.current?.contains(ne)||(l(!1),a(null))},K=_=>{_.key==="Escape"&&(l(!1),a(null))};return document.addEventListener("mousedown",x,!0),document.addEventListener("keydown",K,!0),()=>{document.removeEventListener("mousedown",x,!0),document.removeEventListener("keydown",K,!0)}},[r]),!t||typeof t.remaining!="number"||t.remaining<=0)return null;let b=Number(t.total??0),h=Number(t.done??0),L=o("sessions.board.todoBadge",{done:h,total:b}),P=o("sessions.board.todoBadgeTitle",{remaining:t.remaining,total:b,done:h}),D=Array.isArray(t.items)?t.items:[],T=x=>x==="completed"?"\u2713":x==="in_progress"?"\u25B6":"\u25CB",R=x=>{let K=x.getBoundingClientRect();a({x:K.left,y:K.bottom+6})},U=()=>{let x=_=>_==="completed"?"[x]":_==="in_progress"?"[>]":"[ ]",K=D.map((_,ne)=>`${x(_.status)} ${_.text||`#${ne+1}`}`);return`${P}
|
|
7
7
|
${K.join(`
|
|
8
|
-
`)}`},H=async()=>{let x=U();try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(x);else{let K=document.createElement("textarea");K.value=x,K.style.position="fixed",K.style.opacity="0",document.body.appendChild(K),K.select(),document.execCommand("copy"),document.body.removeChild(K)}d(!0),window.setTimeout(()=>d(!1),1500)}catch{}},O=r||s;return(0,n.jsxs)("span",{ref:g,className:`session-todo-badge${t.hasInProgress?" active":""}${r?" pinned":""}`,tabIndex:0,onMouseEnter:x=>{r||R(x.currentTarget)},onFocus:x=>{r||R(x.currentTarget)},onMouseLeave:()=>{r||a(null)},onBlur:()=>{r||a(null)},onClick:x=>{x.stopPropagation(),r?(l(!1),a(null)):(R(x.currentTarget),l(!0))},children:[t.hasInProgress?(0,n.jsx)("span",{className:"session-todo-dot","aria-hidden":"true"}):null,L,O&&D.length?(0,cn.createPortal)((0,n.jsxs)("div",{ref:v,className:`session-todo-pop${r?" pinned":""}`,role:r?"dialog":"tooltip",style:{left:`${s?.x??0}px`,top:`${s?.y??0}px`},onMouseDown:x=>x.stopPropagation(),children:[(0,n.jsxs)("div",{className:"session-todo-pop-head",children:[(0,n.jsx)("span",{className:"session-todo-pop-title",children:P}),r?(0,n.jsx)("button",{type:"button",className:"session-todo-pop-copy",onClick:x=>{x.stopPropagation(),H()},children:p?o("sessions.board.todoCopied"):o("sessions.board.todoCopy")}):(0,n.jsx)("span",{className:"session-todo-pop-hint",children:o("sessions.board.todoClickHint")})]}),(0,n.jsx)("div",{className:"session-todo-pop-list",children:D.map((x,K)=>(0,n.jsxs)("div",{className:`session-todo-pop-item st-${Sn(x.status)}`,children:[(0,n.jsx)("span",{className:"session-todo-pop-glyph","aria-hidden":"true",children:T(x.status)}),(0,n.jsx)("span",{className:"session-todo-pop-text",children:x.text||`#${K+1}`})]},K))})]}),document.body):null]})}function ct(e){return e.row.locked?(0,n.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null}function ve(e){let t=e.className??`card-act${e.kind?` ${e.kind}`:""}`;return(0,n.jsx)("button",{type:"button",id:e.id,className:t,"data-action":e.action,"data-tip":e.label,"aria-label":e.label,disabled:e.disabled,onClick:s=>{s.stopPropagation(),e.onClick(s.currentTarget)},dangerouslySetInnerHTML:de(e.icon)})}function xo(e){if(!e.url||!Xe())return null;let t=on();return(0,n.jsxs)("span",{className:"term-pill",children:[(0,n.jsx)("a",{className:"term-btn term-open",href:e.url,target:"_blank",rel:"noopener","data-action":"terminal","data-tip":o("sessions.openReadonlyTerminal"),"aria-label":o("sessions.openReadonlyTerminal"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:de(J.terminal)}),t?(0,n.jsx)("button",{type:"button",className:"term-btn term-write","data-action":"write-link","data-tip":o("sessions.openWritableTerminal"),"aria-label":o("sessions.openWritableTerminal"),onClick:s=>{s.stopPropagation(),Nn(e.row,s.currentTarget)},dangerouslySetInnerHTML:de(J.key)}):null]})}function Ro(e){let t=e.row;return t.scope!=="chat"||!t.feishuChatLink?null:(0,n.jsx)("a",{className:e.className??"card-act",href:t.feishuChatLink,target:"_blank",rel:"noopener","data-tip":o("sessions.openChat"),"aria-label":o("sessions.openChat"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:de(J.feishu)})}function Eo(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 Ms(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?vn(e.tokenUsage?.in)??-1:t==="tokenOut"?vn(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?Fe(e).toLowerCase():t==="cliId"?dn(e).toLowerCase():String(e[t]??"").toLowerCase()}function dn(e){return String(e.runtimeDisplayName??e.cliId??"unknown")}function Ls(e,t,s,a){let r=Ms(e,s),l=Ms(t,s),p=0;return typeof r=="number"&&typeof l=="number"?p=r-l:typeof r=="boolean"&&typeof l=="boolean"?p=Number(r)-Number(l):p=String(r).localeCompare(String(l)),p===0&&(p=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),a==="asc"?p:-p}function Mo(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"):e.status==="stalled"?o("sessions.board.signalStalled"):""}function Lo(e,t,s){let a=s==="needs-you"?hn(e):Number(e.lastMessageAt??0),r=s==="needs-you"?hn(t):Number(t.lastMessageAt??0);return a!==r?s==="needs-you"?a-r:r-a:String(e.title??e.sessionId).localeCompare(String(t.title??t.sessionId))}function Ao(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 Po(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 Mn(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 rt(e){let[t,s]=(0,c.useState)(!1);return(0,n.jsx)("button",{type:"button","data-copy":e.value,onClick:()=>{yn(e.value,o("sessions.copy")).then(a=>{a&&(s(!0),window.setTimeout(()=>s(!1),800))})},children:t?o("sessions.copied"):o("sessions.copy")})}function Bo(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let l=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(l)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:a||t>0,onClick:async()=>{r(!0);let l=await e.locateSession(e.row);r(!1),l&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):a?o("sessions.locating"):o("sessions.locate")})}function Oo(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let l=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(l)},[t]),(0,n.jsx)(ve,{action:"locate",icon:J.pin,label:t>0?o("sessions.cooldown",{seconds:t}):o("sessions.locate"),disabled:a||t>0,onClick:async()=>{r(!0);let l=await e.onLocate(e.row);r(!1),l&&s(30)}})}function Qa(e){let t=se.filter(d=>e.selected.has(d)).length,s=(0,c.useRef)(null),[a,r]=(0,c.useState)("");(0,c.useEffect)(()=>{let d=()=>{s.current?.open&&(s.current.open=!1)},g=b=>{let h=s.current;h?.open&&!h.contains(b.target)&&d()},v=b=>{b.key==="Escape"&&d()};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",v),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",v)}},[]);let l=a.trim().toLowerCase(),p=l?se.filter(d=>d.toLowerCase().includes(l)):se;return(0,n.jsxs)("details",{className:"filter-cli",ref:s,children:[(0,n.jsxs)("summary",{children:[o("sessions.cli")," \xB7 ",(0,n.jsx)("b",{id:"cli-filter-count",className:t===se.length?void 0:"cli-filter-active",children:t===se.length?o("common.all"):`${t}/${se.length}`})]}),(0,n.jsxs)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:[(0,n.jsxs)("div",{className:"filter-cli-head",children:[(0,n.jsx)("input",{type:"search",className:"filter-cli-search",placeholder:o("sessions.cliSearch"),value:a,autoFocus:!0,onChange:d=>r(d.currentTarget.value),onClick:d=>d.stopPropagation()}),(0,n.jsxs)("div",{className:"filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{for(let d of se)e.selected.has(d)||e.onToggle(d,!0)},children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>{for(let d of se)e.selected.has(d)&&e.onToggle(d,!1)},children:o("sessions.cliClear")})]})]}),(0,n.jsx)("div",{className:"filter-cli-options",children:p.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):p.map(d=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:d,checked:e.selected.has(d),onChange:g=>e.onToggle(d,g.currentTarget.checked)}),(0,n.jsx)("span",{children:d})]},d))})]})]})}function Do(e){let t=[{key:"lastMessageAt",label:o("sessions.sort.lastMessageAt")},{key:"spawnedAt",label:o("sessions.sort.spawnedAt")},{key:"title",label:o("sessions.sort.title")},{key:"status",label:o("sessions.sort.status")}],s=t.find(a=>a.key===e.sortKey)??t[0];return(0,n.jsxs)("details",{className:"sessions-sort-menu sect-sort-menu",children:[(0,n.jsx)("summary",{"aria-label":o("sessions.sort"),children:(0,n.jsxs)("span",{className:"sect-sort-value",children:[o("sessions.sort"),": ",s.label," ",e.sortDir==="asc"?"\u2191":"\u2193"]})}),(0,n.jsx)("div",{className:"sect-sort-pop",role:"menu",children:t.map(a=>(0,n.jsxs)("button",{type:"button",role:"menuitem","aria-current":a.key===e.sortKey?"true":void 0,onClick:()=>e.onSort(a.key),children:[a.label,a.key===e.sortKey?e.sortDir==="asc"?" \u2191":" \u2193":null]},a.key))})]})}function $o(e){let t=(0,c.useRef)(null);Mn(t,e.open);let[s,a]=(0,c.useState)(""),r=[{value:"",label:o("sessions.anyStatus")},...os.map(b=>({value:b,label:tn(b)}))],l=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],p=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],d=s.trim().toLowerCase(),g=d?se.filter(b=>b.toLowerCase().includes(d)):se,v=()=>{Un(ae(),!1),e.setFilters(()=>({q:e.filters.q,status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:!1,active:!0,cli:new Set(se)}))};return(0,n.jsxs)("dialog",{ref:t,className:"sessions-filter-drawer",onClose:e.onClose,onClick:b=>{b.target===b.currentTarget&&e.onClose()},children:[(0,n.jsxs)("header",{children:[(0,n.jsx)("h3",{children:o("sessions.filters.title")}),(0,n.jsx)(ve,{className:"card-act drawer-close-btn",icon:J.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("div",{className:"sessions-filter-drawer-body",children:[(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.status")}),(0,n.jsx)("select",{value:e.filters.status,onChange:b=>e.setFilters(h=>({...h,status:b.currentTarget.value})),children:r.map(b=>(0,n.jsx)("option",{value:b.value,children:b.label},b.value||"any"))})]}),(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.adopt")}),(0,n.jsx)("select",{value:e.filters.adopt,onChange:b=>e.setFilters(h=>({...h,adopt:b.currentTarget.value})),children:l.map(b=>(0,n.jsx)("option",{value:b.value,children:b.label},b.value||"any"))})]}),(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.location")}),(0,n.jsx)("select",{value:e.filters.chat,onChange:b=>e.setFilters(h=>({...h,chat:b.currentTarget.value})),children:p.map(b=>(0,n.jsx)("option",{value:b.value,children:b.label},b.value||"any"))})]}),(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.cli")}),(0,n.jsxs)("div",{className:"sessions-filter-cli",children:[(0,n.jsx)("input",{type:"search",className:"sessions-filter-cli-search",placeholder:o("sessions.cliSearch"),value:s,onChange:b=>a(b.currentTarget.value)}),(0,n.jsxs)("div",{className:"sessions-filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>e.setFilters(b=>({...b,cli:new Set(se)})),children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>e.setFilters(b=>({...b,cli:new Set})),children:o("sessions.cliClear")})]}),(0,n.jsx)("div",{className:"sessions-filter-cli-list",children:g.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):g.map(b=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:b,checked:e.filters.cli.has(b),onChange:h=>{let L=h.currentTarget.checked;e.setFilters(P=>{let D=new Set(P.cli);return L?D.add(b):D.delete(b),{...P,cli:D}})}}),(0,n.jsx)("span",{children:b})]},b))})]})]}),(0,n.jsxs)("div",{className:"sessions-filter-toggles",children:[(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"multiBotTopics",checked:e.filters.multiBotTopics,onChange:b=>{let h=b.currentTarget.checked;e.setFilters(L=>({...L,multiBotTopics:h}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.multiBotTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"botTriggeredTopics",checked:e.filters.botTriggeredTopics,onChange:b=>{let h=b.currentTarget.checked;e.setFilters(L=>({...L,botTriggeredTopics:h}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.botTriggeredTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"showUnknownChats",checked:e.filters.showUnknownChats,onChange:b=>{let h=b.currentTarget.checked;Un(ae(),h),e.setFilters(L=>({...L,showUnknownChats:h}))}}),(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:b=>{let h=b.currentTarget.checked;e.setFilters(L=>({...L,active:h}))}}),(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.jsxs)("footer",{children:[(0,n.jsx)("button",{type:"button",className:"sessions-filter-clear",onClick:v,children:o("sessions.filters.clear")}),(0,n.jsx)("button",{type:"button",className:"primary sessions-filter-done",onClick:e.onClose,children:o("sessions.filters.done")})]})]})}function Ho(e){let[t,s]=(0,c.useState)(!1),a=[{value:"stalled",label:o("sessions.view.need")},{value:"working",label:o("sessions.view.work")},{value:"",label:o("sessions.view.all")}],r=[e.filters.status!=="",e.filters.adopt!=="",e.filters.chat!=="",e.filters.cli.size<se.length,e.filters.multiBotTopics,e.filters.botTriggeredTopics,e.filters.showUnknownChats,!e.filters.active].filter(Boolean).length;return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters sessions-toolbar",onSubmit:l=>l.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:l=>{let p=l.currentTarget.value;e.setFilters(d=>({...d,q:p}))}}),(0,n.jsx)("div",{className:"segmented sessions-quick-view",role:"group","aria-label":o("sessions.status"),children:a.map(l=>(0,n.jsx)("button",{type:"button","data-quick":l.value,className:e.filters.status===l.value?"active":void 0,"aria-pressed":e.filters.status===l.value,onClick:()=>e.setFilters(p=>({...p,status:l.value})),children:l.label},l.label))}),(0,n.jsxs)("button",{type:"button",className:`sessions-filter-btn${r>0?" has-active":""}`,"aria-haspopup":"dialog","aria-expanded":t,onClick:()=>s(!0),children:[o("sessions.filters.title"),r>0?(0,n.jsx)("span",{className:"sessions-filter-count",children:r}):null]}),(0,n.jsx)(Do,{sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort}),(0,n.jsx)(_o,{...e.idleCleanup}),(0,n.jsx)($o,{open:t,chatOptions:e.chatOptions,filters:e.filters,setFilters:e.setFilters,onClose:()=>s(!1)})]})}function Ko(e){let t=!!e.closeProgress||!!e.lockProgress,s=e.lockProgress?.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.lockSelected"),a=e.lockProgress&&!e.lockProgress.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.unlockSelected"),r=Xe();return(0,n.jsxs)("div",{id:"bulk-bar",className:"bulk-bar",hidden:e.selectedCount===0,children:[(0,n.jsx)("span",{id:"bulk-count",children:o("sessions.selectedCount",{count:e.selectedCount})}),r?(0,n.jsx)("button",{type:"button",id:"bulk-monitor-room",disabled:t||e.selectedCount===0,onClick:e.onAddToMonitorRoom,children:e.monitorRoomText??o("sessions.addToMonitorRoom")}):null,(0,n.jsx)("button",{type:"button",id:"bulk-lock",disabled:t||e.lockDisabled,onClick:()=>e.onLock(!0),children:s}),(0,n.jsx)("button",{type:"button",id:"bulk-unlock",disabled:t||e.unlockDisabled,onClick:()=>e.onLock(!1),children:a}),(0,n.jsx)("button",{type:"button",id:"bulk-close",className:"contrast",disabled:t,onClick:e.onClose,children:e.closeProgress?`${e.closeProgress.done}/${e.closeProgress.total}`:o("sessions.closeSelected")}),(0,n.jsx)("button",{type:"button",id:"bulk-clear",disabled:t,onClick:e.onClear,children:o("sessions.clearSelection")})]})}function _o(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(e.hours),[l,p]=(0,c.useState)(),d=(0,c.useRef)(null),g=(0,c.useRef)(null),v=(0,c.useRef)(null),b=e.countForHours(a);return(0,c.useEffect)(()=>{t?r(e.hours):p(void 0)},[t,e.hours]),(0,c.useLayoutEffect)(()=>{if(!t)return;let h=()=>{let P=g.current,D=v.current;if(!P||!D)return;let T=12,R=window.innerWidth,U=window.innerHeight,H=Math.max(0,Math.min(292,R-T*2)),O=P.getBoundingClientRect(),x=D.offsetHeight,K=Math.max(T,R-H-T),_=O.left+O.width/2-H/2,ne=Math.min(Math.max(_,T),K),q=O.bottom+8,j=O.top-x-8,Ce=q+x<=U-T||j<T?Math.min(Math.max(q,T),Math.max(T,U-x-T)):Math.max(T,j);p({left:ne,top:Ce,width:H})},L=window.requestAnimationFrame(h);return window.addEventListener("resize",h),window.addEventListener("scroll",h,!0),()=>{window.cancelAnimationFrame(L),window.removeEventListener("resize",h),window.removeEventListener("scroll",h,!0)}},[t,e.busy,e.status]),(0,c.useEffect)(()=>{if(!t)return;let h=P=>{let D=P.target;D instanceof Node&&d.current?.contains(D)||D instanceof Node&&v.current?.contains(D)||s(!1)},L=P=>{P.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",h,!0),document.addEventListener("keydown",L),()=>{document.removeEventListener("pointerdown",h,!0),document.removeEventListener("keydown",L)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${b===0?" is-empty":""}${t?" is-open":""}`,ref:d,children:[(0,n.jsxs)("button",{ref:g,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(h=>!h),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,cn.createPortal)((0,n.jsxs)("div",{ref:v,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:l??{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:b})]})]}),(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:No.map(h=>{let L=Wn(h.value),P=L===a;return(0,n.jsx)("button",{type:"button",className:P?"active":void 0,"aria-pressed":P?"true":"false",disabled:e.busy,onClick:()=>r(L),children:h.label},h.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||b===0,onClick:()=>{e.onRun(a).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function Fo(e){let t=(0,c.useRef)(null);(0,c.useLayoutEffect)(()=>{t.current&&(t.current.indeterminate=e.selectAllIndeterminate)},[e.selectAllIndeterminate]);let s=[{id:"botName",label:o("sessions.bot")},{id:"cliId",label:o("sessions.cli")},{id:"status",label:o("sessions.status")},{id:"chat",label:o("sessions.location")},{id:"tokenIn",label:o("sessions.tokenIn")},{id:"tokenOut",label:o("sessions.tokenOut")},{id:"title",label:o("sessions.titleCol")},{id:"workingDir",label:o("sessions.workingDir")},{id:"spawnedAt",label:o("sessions.created")},{id:"lastMessageAt",label:o("sessions.last")},{id:"adopt",label:o("sessions.adopt")}],a=s.filter(d=>!e.hiddenColumns.has(d.id)),r=2+a.length,l={select:o("sessions.selectSession"),botName:o("sessions.bot"),cliId:o("sessions.cli"),status:o("sessions.status"),chat:o("sessions.location"),tokenIn:o("sessions.tokenIn"),tokenOut:o("sessions.tokenOut"),title:o("sessions.titleCol"),workingDir:o("sessions.workingDir"),spawnedAt:o("sessions.created"),lastMessageAt:o("sessions.last"),adopt:o("sessions.adopt"),actions:o("sessions.actions")};function p(d,g){switch(g){case"botName":return(0,n.jsx)("td",{"data-label":l.botName,children:ge(d)});case"cliId":return(0,n.jsx)("td",{"data-label":l.cliId,children:(0,n.jsx)("span",{className:`badge cli-${Sn(d.cliId)}`,title:d.runtimeId&&d.runtimeId!==d.cliId?`${d.cliId} / ${d.runtimeId}`:void 0,children:dn(d)})});case"status":return(0,n.jsxs)("td",{"data-label":l.status,children:[(0,n.jsx)(En,{status:d.status}),(0,n.jsx)(lt,{row:d}),(0,n.jsx)(ct,{row:d})]});case"chat":return(0,n.jsx)("td",{className:"session-location-cell","data-label":l.chat,title:Qn(d),children:Fe(d)});case"tokenIn":return(0,n.jsx)("td",{className:"token-cell","data-label":l.tokenIn,children:Vn(d.tokenUsage?.in)});case"tokenOut":return(0,n.jsx)("td",{className:"token-cell","data-label":l.tokenOut,children:Vn(d.tokenUsage?.out)});case"title":return(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":l.title,title:String(d.title??""),children:pe(d.title??"").slice(0,48)});case"workingDir":return(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":l.workingDir,title:d.workingDir??"",children:String(d.workingDir??"").slice(-34)});case"spawnedAt":return(0,n.jsx)("td",{"data-label":l.spawnedAt,children:Ke(d.spawnedAt)});case"lastMessageAt":return(0,n.jsx)("td",{"data-label":l.lastMessageAt,children:Ke(d.lastMessageAt)});case"adopt":return(0,n.jsx)("td",{"data-label":l.adopt,children:d.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null});default:return null}}return(0,n.jsxs)("table",{id:"sessions-table",hidden:e.hidden,children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:(0,n.jsx)("input",{ref:t,type:"checkbox",id:"select-all",title:o("sessions.activeOnly"),checked:e.selectAllChecked,disabled:e.selectAllDisabled,onChange:d=>e.onSelectAll(d.currentTarget.checked)})}),a.map(d=>(0,n.jsx)(Eo,{sort:d.id,label:d.label,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},d.id)),(0,n.jsx)("th",{className:"session-table-columns-th",children:(0,n.jsxs)("details",{className:"session-table-columns-menu",children:[(0,n.jsxs)("summary",{title:o("sessions.columns"),children:[(0,n.jsx)("span",{className:"session-table-columns-icon","aria-hidden":"true",children:(0,n.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,n.jsx)("path",{d:"M2 4h12M2 8h12M2 12h12"})})}),o("sessions.columns")]}),(0,n.jsxs)("div",{className:"session-table-columns-dropdown",role:"menu",children:[(0,n.jsxs)("div",{className:"session-table-columns-header",children:[(0,n.jsx)("span",{children:o("sessions.columnsMenu")}),(0,n.jsx)("button",{type:"button",className:"session-table-columns-reset",onClick:e.onResetColumns,children:o("sessions.columnsReset")})]}),s.map(d=>(0,n.jsxs)("label",{className:"session-table-columns-item",children:[(0,n.jsx)("input",{type:"checkbox",checked:!e.hiddenColumns.has(d.id),onChange:()=>e.onToggleColumn(d.id)}),d.label]},d.id))]})]})})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(d=>{let g=d.status==="closed",v=String(d.sessionId);return(0,n.jsxs)("tr",{"data-id":v,onClick:()=>e.onOpen(d),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":l.select,onClick:b=>b.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(v),disabled:g,onChange:b=>e.onSelect(v,b.currentTarget.checked)})}),a.map(b=>(0,n.jsx)(c.Fragment,{children:p(d,b.id)},b.id)),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":l.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},v)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:r,className:"empty",children:o("sessions.empty")})})})]})}function Uo(e){let{exchange:t}=e,s=(0,c.useRef)(null),a=(0,c.useRef)(null),r=(0,c.useRef)(null),[l,p]=(0,c.useReducer)(ss,ts),d=l.open,[g,v]=(0,c.useState)(null),b=`session-exchange-tooltip-${(0,c.useId)().replace(/[^a-zA-Z0-9_-]/g,"-")}`,h=(0,c.useCallback)(()=>{r.current!==null&&(window.clearTimeout(r.current),r.current=null)},[]),L=(0,c.useCallback)(()=>{h(),p("open")},[h]),P=(0,c.useCallback)(()=>{h(),p("close"),v(null)},[h]),D=(0,c.useCallback)(()=>{h(),r.current=window.setTimeout(P,120)},[h,P]),T=(0,c.useCallback)(()=>{let R=s.current,U=a.current;if(!R||!U)return;let H=R.getBoundingClientRect(),O=U.getBoundingClientRect(),x=12,K=9,_=H.top-x-K,ne=window.innerHeight-H.bottom-x-K,q=_>=O.height||_>ne?"top":"bottom",j=H.left+H.width/2-O.width/2,Ce=Math.min(Math.max(j,x),Math.max(x,window.innerWidth-O.width-x)),Se=q==="top"?H.top-O.height-K:H.bottom+K,be=Math.min(Math.max(Se,x),Math.max(x,window.innerHeight-O.height-x));v({left:Ce,placement:q,top:be})},[]);return(0,c.useLayoutEffect)(()=>{if(d)return T(),window.addEventListener("resize",T),window.addEventListener("scroll",T,!0),()=>{window.removeEventListener("resize",T),window.removeEventListener("scroll",T,!0)}},[t.botFullText,t.userFullText,d,T]),(0,c.useEffect)(()=>()=>h(),[h]),(0,c.useEffect)(()=>{if(!d)return;let R=H=>{let O=H.target;O instanceof Node&&(s.current?.contains(O)||a.current?.contains(O)||P())},U=H=>{H.key==="Escape"&&P()};return document.addEventListener("pointerdown",R),document.addEventListener("keydown",U),()=>{document.removeEventListener("pointerdown",R),document.removeEventListener("keydown",U)}},[P,d]),!t.userText&&!t.botText?null:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"session-card-exchange-wrap",children:(0,n.jsxs)("div",{ref:s,className:"session-card-exchange",role:"button",tabIndex:0,"aria-label":o("sessions.preview.showFull"),"aria-haspopup":"dialog","aria-controls":d?b:void 0,"aria-expanded":d,onClick:R=>{R.stopPropagation(),d?P():L()},onFocus:()=>{h(),p("focus")},onBlur:D,onPointerEnter:R=>{R.pointerType!=="touch"&&L()},onPointerLeave:R=>{R.pointerType!=="touch"&&D()},onKeyDown:R=>{R.key==="Escape"?P():(R.key==="Enter"||R.key===" ")&&(R.preventDefault(),d?P():L())},children:[t.userText?(0,n.jsxs)("div",{className:"session-card-exchange-line",children:[(0,n.jsx)("span",{children:o("sessions.history.user")}),(0,n.jsx)("p",{children:t.userText})]}):null,t.botText?(0,n.jsxs)("div",{className:"session-card-exchange-line bot",children:[(0,n.jsx)("span",{children:o("sessions.history.bot")}),(0,n.jsx)("p",{children:t.botText})]}):null]})}),d&&typeof document<"u"?(0,cn.createPortal)((0,n.jsx)("div",{ref:a,id:b,className:"session-card-exchange-tooltip",role:"dialog","aria-label":o("sessions.preview.latestExchange"),"data-placement":g?.placement??"top",style:{left:g?.left??-1e4,top:g?.top??-1e4,visibility:g?"visible":"hidden"},onPointerEnter:h,onPointerLeave:R=>{R.pointerType!=="touch"&&D()},onFocusCapture:h,onBlur:R=>{let U=R.relatedTarget;U&&(a.current?.contains(U)||s.current?.contains(U))||D()},onKeyDown:R=>{R.key==="Escape"&&(R.stopPropagation(),h(),p("escape-refocus"),v(null),s.current?.focus())},children:(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-scroll",children:[t.userFullText?(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-line",children:[(0,n.jsx)("span",{children:o("sessions.history.user")}),(0,n.jsx)("div",{className:"session-card-exchange-md",dangerouslySetInnerHTML:de(tt(t.userFullText))})]}):null,t.botFullText?(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-line bot",children:[(0,n.jsx)("span",{children:o("sessions.history.bot")}),(0,n.jsx)("div",{className:"session-card-exchange-md",dangerouslySetInnerHTML:de(tt(t.botFullText))})]}):null]})}),document.body):null]})}function As(e){let t=e.row,s=pe(t.title)||t.sessionId,a=ge(t),r=_e(t),l=sn(t),p=Mo(t),d=Yn(t.workingDir),g=Cn(t),v=an(t)??(t.status==="closed"?"closed":"idle"),b=h=>{h.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,"data-signal":v,"aria-pressed":e.selected,onClick:b,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(Ge({name:a,larkAppId:t.larkAppId,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-card-title",children:[(0,n.jsx)("strong",{title:String(t.title??s),children:String(s).slice(0,72)}),(0,n.jsxs)("span",{children:[a," \xB7 ",r??dn(t)]})]}),(0,n.jsxs)("span",{className:"session-card-status-group",children:[(0,n.jsx)(En,{status:t.status}),(0,n.jsx)(lt,{row:t}),(0,n.jsx)(ct,{row:t})]})]}),d!=="-"||t.adopt||p?(0,n.jsxs)("div",{className:"session-card-meta",children:[d!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:d}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,p?(0,n.jsx)("span",{className:"session-signal",title:p,children:p}):null]}):null,(0,n.jsx)(Uo,{exchange:g}),(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${Ke(hn(t))}`:`${o("sessions.last")}: ${Ke(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(Ro,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(Oo,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(ve,{action:"details",icon:J.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),xn(t)?(0,n.jsx)(ve,{action:"restart",icon:J.restart,label:o("sessions.restart"),onClick:h=>e.onRestart(t,h)}):null,(0,n.jsx)(xo,{row:t,url:l}),t.status!=="closed"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(ve,{action:"lock",icon:t.locked?J.unlock:J.lock,label:Tn(t),kind:t.locked?"locked":"",onClick:h=>e.onLock(t,!t.locked,h)}),(0,n.jsx)(ve,{action:"close",icon:J.close,label:o("sessions.close"),kind:"danger",onClick:h=>e.onClose(t,h)})]}):null]})]})}function jo(e){(0,c.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(qn.map(a=>[a.id,[]]));for(let a of e.rows){let r=an(a);r&&t.get(r).push(a)}let s=e.order.map(a=>qn.find(r=>r.id===a)).filter(a=>!!a);return(0,n.jsx)("div",{id:"sessions-board",className:`sessions-board${e.animated||e.hidden?"":" board-enter"}`,hidden:e.hidden,children:s.map((a,r)=>{let l=(t.get(a.id)??[]).sort((p,d)=>Lo(p,d,a.id));return(0,n.jsxs)("section",{className:`session-board-column session-board-${a.id}${e.dragColId===a.id?" dragging":""}${e.dragOverCol===a.id?" drag-over":""}`,"data-col":a.id,onDragOver:p=>{e.dragColId&&(p.preventDefault(),p.dataTransfer&&(p.dataTransfer.dropEffect="move"),e.dragColId!==a.id&&e.onDragOverCol(a.id))},onDrop:p=>{e.dragColId&&(p.preventDefault(),e.onMoveColumnTo(e.dragColId,a.id),e.onDragCol(null),e.onDragOverCol(null))},children:[(0,n.jsxs)("header",{draggable:!0,title:o("sessions.board.dragHint"),onDragStart:p=>{e.onDragCol(a.id),p.dataTransfer&&(p.dataTransfer.effectAllowed="move",p.dataTransfer.setData("text/plain",a.id))},onDragEnd:()=>{e.onDragCol(null),e.onDragOverCol(null)},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{children:o(a.labelKey)}),(0,n.jsx)("p",{children:o(a.hintKey)})]}),(0,n.jsxs)("span",{className:"session-board-head-right",children:[(0,n.jsxs)("span",{className:"session-board-move",children:[(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"-1","aria-label":o("sessions.board.moveLeft"),disabled:r===0,onClick:()=>e.onMoveColumn(a.id,-1),children:"\u2039"}),(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"1","aria-label":o("sessions.board.moveRight"),disabled:r===s.length-1,onClick:()=>e.onMoveColumn(a.id,1),children:"\u203A"})]}),(0,n.jsx)("span",{className:"session-board-count",children:l.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:l.length?l.map(p=>(0,n.jsx)(As,{row:p,selected:e.selected.has(p.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},p.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},a.id)})})}function zo(e){let t=pe(e.title).trim();return t||(e.kind==="thread"?o("sessions.topic.untitled"):e.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession"))}function Go(e){let t=(0,c.useMemo)(()=>In(e.rows),[e.rows]),s=(0,c.useMemo)(()=>new Map(In(e.relationRows??e.rows).map(a=>[a.key,a])),[e.relationRows,e.rows]);return(0,n.jsx)("div",{id:"sessions-topics",className:"sessions-topic-view",hidden:e.hidden,children:t.length?t.map(a=>{let r=s.get(a.key)??a,l=a.rows[0],p=Fe(l),d=zo(r),g=r.rootMessageId||r.chatId;return(0,n.jsxs)("section",{className:`session-topic-group${r.multiBot?" multi-bot":""}${r.inferredBotTriggered?" inferred-bot-trigger":""}`,"data-topic-key":a.key,children:[(0,n.jsxs)("header",{children:[(0,n.jsx)("span",{className:"session-topic-avatar",dangerouslySetInnerHTML:de(bn({chatId:a.chatId,name:p,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-topic-heading",children:[(0,n.jsx)("span",{className:"session-topic-location",children:p}),(0,n.jsx)("h2",{title:r.title,children:d}),(0,n.jsx)("code",{title:g,children:r.kind==="thread"?g:r.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession")})]}),(0,n.jsxs)("div",{className:"session-topic-summary","aria-label":o("sessions.topic.summary"),children:[r.multiBot?(0,n.jsx)("span",{className:"topic-chip collaboration",children:o("sessions.topic.collaboration")}):null,(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.sessions",{count:r.rows.length})}),(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.bots",{count:r.botCount})}),(0,n.jsx)("span",{className:"topic-chip active",children:o("sessions.topic.active",{count:r.activeCount})}),r.closedCount?(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.closed",{count:r.closedCount})}):null,r.inferredBotInputCount?(0,n.jsx)("span",{className:"topic-chip inferred",title:o("sessions.topic.inferredHint"),children:o("sessions.topic.botInputs",{count:r.inferredBotInputCount})}):null,(0,n.jsxs)("span",{className:"session-topic-updated",children:[o("sessions.last"),": ",Ke(r.latestActivityAt)]})]})]}),(0,n.jsx)("div",{className:"session-topic-members",children:a.rows.map(v=>(0,n.jsx)(As,{row:v,selected:e.selected.has(v.sessionId),onToggleSelect:b=>{b.status!=="closed"?e.onToggleSelect(b):e.onOpen(b)},onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},v.sessionId))})]},a.key)}):(0,n.jsx)("div",{className:"sessions-topic-empty",children:o("sessions.topic.empty")})})}function Jo(e){let t=e.message,s=t.senderType==="user",a=t.senderType==="app"||t.senderType==="bot",r=s?t.senderName||(e.ownerOpenId&&t.senderId===e.ownerOpenId?o("sessions.history.owner"):o("sessions.history.user")):t.senderName||String(t.senderId??"").slice(0,16)||o(a?"sessions.history.bot":"sessions.history.system"),l=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:de(Ge({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:Ao(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:l})]})]})}function Xo(e){let t=(0,c.useRef)(null);Mn(t,!!e.state);let s=e.state?$e.sessions.get(e.state.sessionId):null,a=(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 l=a.current;l&&(l.scrollTop=l.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:l=>{l.target===l.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(Ge({name:ge(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(pe(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)(ve,{id:"history-close",icon:J.close,label:o("sessions.dismiss"),onClick:e.onClose})})]}),(0,n.jsxs)("div",{className:"history-body",ref:a,children:[e.state.loading?(0,n.jsx)(Je,{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((l,p,d)=>(0,n.jsx)(Jo,{message:l,ownerOpenId:e.state?.ownerOpenId,groupStart:p===0||nt(d[p-1])!==nt(l)},l.messageId??p))}):null]})]}):null})}function Wo(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(""),l=(0,c.useRef)(null),p=pe(e.row.title)||e.row.sessionId;(0,c.useLayoutEffect)(()=>{if(!t||!l.current)return;let g=l.current;g.focus(),g.select(),(()=>{let b=getComputedStyle(g),h=document.createElement("span");h.style.cssText="position:absolute;visibility:hidden;white-space:pre",h.style.fontSize=b.fontSize,h.style.fontFamily=b.fontFamily,h.style.fontWeight=b.fontWeight,h.style.letterSpacing=b.letterSpacing,h.textContent=g.value||" ",document.body.appendChild(h);let L=Math.round(window.innerWidth*.6);g.style.width=`${Math.min(Math.max(h.offsetWidth+22,80),L)}px`,h.remove()})()},[t,a]);let d=g=>{let v=a.trim();s(!1),g&&v&&v!==p&&e.onRename(e.row,v)};return t?(0,n.jsx)("input",{ref:l,type:"text",className:"term-modal-name-input",maxLength:200,value:a,onChange:g=>r(g.currentTarget.value),onBlur:()=>d(!0),onKeyDown:g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),d(!0)):g.key==="Escape"&&(g.preventDefault(),d(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??p),children:String(p).slice(0,60)}),(0,n.jsx)(ve,{id:"term-modal-edit",icon:J.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(pe(e.row.title)||""),s(!0)}})]})}function Vo(e){let t=(0,c.useRef)(null);Mn(t,!!e.state);let s=e.state?$e.sessions.get(e.state.sessionId):null,a=s?sn(s):null,r=e.state?.url??a??"",l=s?dn(s):"",p=s?Yn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:d=>{d.target===d.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:de(Ge({name:ge(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)(Wo,{row:s,onRename:e.onRename}),(0,n.jsx)(En,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:ge(s)}),(0,n.jsx)("span",{children:l}),p!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:p}):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:de(J.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:de(J.terminal)}),(0,n.jsx)(ve,{id:"term-modal-close",icon:J.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)(Je,{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 qo(e){let t=e.report;if(!t||t.status!=="ok"){let g=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",g]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let a=[t.meta?.asOf?o("sessions.insightAsOf",{asOf:String(t.meta.asOf)}):null,t.meta?.partial?o("sessions.insightPartial"):null].filter(Boolean),r=Array.isArray(t.suggestions)?t.suggestions:[],l=Array.isArray(t.spans)?t.spans:[],p=g=>g==="bad"||g==="warn"?"!":"i",d=g=>g==="error"?"!":g==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[a.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:a.join(" \xB7 ")}):null,(0,n.jsx)("p",{children:o("sessions.insightMetrics",{total:String(s.totalSpans??0),failed:String(s.failedSpans??0),slow:String(s.slowSpans??0),rw:s.readWriteRatio===null||s.readWriteRatio===void 0?"-":String(s.readWriteRatio),compactions:String(s.compactions??0)})}),r.length?(0,n.jsxs)("details",{open:!0,children:[(0,n.jsx)("summary",{children:o("sessions.insightSuggestions")}),(0,n.jsx)("ul",{style:{paddingLeft:18,margin:"6px 0"},children:r.map((g,v)=>(0,n.jsxs)("li",{children:[p(String(g.severity??""))," ",(0,n.jsx)("b",{children:String(g.title??"")})," - ",String(g.action??""),Array.isArray(g.evidence)&&g.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:g.evidence.join("; ")})]}):null]},v))})]}):null,l.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",l.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??l.length),total:String(t.meta.spansTotal??l.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:[...l].sort((g,v)=>(g.relStartMs??0)-(v.relStartMs??0)).map((g,v)=>{let b=[g.inputSummary,g.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:g.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:d(String(g.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(g.tool??"")})}),(0,n.jsx)("td",{children:String(g.phase??"")}),(0,n.jsx)("td",{children:Po(g.durationMs)}),(0,n.jsxs)("td",{children:["#",String(g.turnIndex??0)]}),(0,n.jsx)("td",{children:b})]},v)})})})})]}):null]})}function Yo(e){let[t,s]=(0,c.useState)(null);if((0,c.useEffect)(()=>s(null),[e.row.sessionId]),!He.authed)return null;let a=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),l=await r.json().catch(()=>({}));!l.ok||!l.report?s({loading:!1,error:String(l.error??r.status)}):s({loading:!1,report:l.report})}catch(r){s({loading:!1,error:String(r)})}};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"insight-btn",type:"button",disabled:t?.loading,onClick:()=>{a()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(Je,{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)(qo,{report:t.report}):null]})]})}function Zo(e){let t=(0,c.useRef)(null);Mn(t,!!e.row);let s=e.row,a=s?sn(s):null,r=!!s&&s.status==="closed",l=!!s&&!r&&!!a;return(0,n.jsx)("dialog",{id:"drawer",ref:t,onClose:e.onClose,onClick:p=>{p.target===p.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:pe(s.title)||s.sessionId}),(0,n.jsx)(ve,{id:"drawer-close",className:"card-act drawer-close-btn",icon:J.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(En,{status:s.status}),(0,n.jsx)(lt,{row:s}),(0,n.jsx)(ct,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(rt,{value:s.sessionId})]})]}),(0,n.jsxs)("div",{className:"drawer-body",children:[(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",ge(s)," \xB7 ",(0,n.jsxs)("b",{children:[o("sessions.cli"),":"]})," ",dn(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.location"),":"]})," ",Fe(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(rt,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(rt,{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.jsx)(Yo,{row:s})]}),(0,n.jsxs)("footer",{className:"drawer-foot",children:[(0,n.jsx)("div",{className:"drawer-foot-actions",children:r?(0,n.jsx)("button",{id:"resume-btn",type:"button",className:"primary drawer-btn-primary",onClick:async p=>{await e.resumeSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.resume")}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"takeover-btn",type:"button",className:"primary drawer-btn-primary",disabled:!l,title:l?void 0:o("sessions.openReadonlyTerminal"),onClick:p=>e.onTakeover(s,p.currentTarget),children:o("sessions.takeoverTerminal")}),xn(s)?(0,n.jsx)("button",{id:"restart-btn",type:"button",className:"drawer-btn-secondary",onClick:async p=>{await e.restartSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.restart")}):null,(0,n.jsx)("button",{id:"close-btn",type:"button",className:"drawer-btn-danger",onClick:async p=>{await e.closeSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.close")})]})}),(0,n.jsxs)("details",{className:"drawer-more",children:[(0,n.jsx)("summary",{"aria-label":o("sessions.more"),children:o("sessions.more")}),(0,n.jsxs)("div",{className:"drawer-more-pop",role:"menu",children:[(0,n.jsx)("button",{id:"history-drawer-btn",type:"button",role:"menuitem",onClick:()=>e.openHistory(s),children:o("sessions.history.title")}),on()&&!r?(0,n.jsx)("button",{id:"copy-cmd-btn",type:"button",role:"menuitem","data-tip":o("sessions.copyCommandHint"),onClick:p=>{cs(s,p.currentTarget)},children:o("sessions.copyCommand")}):null,(0,n.jsx)("button",{id:"lock-btn",type:"button",role:"menuitem",onClick:p=>{e.setSessionLocked(s,!s.locked,p.currentTarget)},children:Tn(s)}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)("span",{className:"drawer-more-item",children:(0,n.jsx)(Bo,{row:s,locateSession:e.locateSession})}):(0,n.jsx)("a",{className:"drawer-more-item drawer-more-link",href:s.feishuChatLink,target:"_blank",rel:"noopener",role:"menuitem",children:o("sessions.openChat")}),s.queued&&!r?(0,n.jsx)("button",{id:"start-btn",type:"button",role:"menuitem",onClick:async p=>{await e.startSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.create.start")}):null]})]})]})]}):null})}function Qo(e){let t=e.state;(0,c.useEffect)(()=>{let f=e.dialog;return()=>{f.open&&f.close()}},[e.dialog]),(0,c.useEffect)(()=>{let f=e.dialog;if(t){if(!f.open)try{f.showModal()}catch{}}else f.open&&f.close()},[e.dialog,t]),(0,c.useEffect)(()=>{let f=e.dialog,N=()=>e.onClose(),M=$=>{$.target===f&&e.onClose()};return f.addEventListener("close",N),f.addEventListener("click",M),()=>{f.removeEventListener("close",N),f.removeEventListener("click",M)}},[e]);let[s,a]=(0,c.useState)(""),[r,l]=(0,c.useState)([]),[p,d]=(0,c.useState)(new Set),[g,v]=(0,c.useState)("lead"),[b,h]=(0,c.useState)(""),[L,P]=(0,c.useState)("in_progress"),[D,T]=(0,c.useState)(""),[R,U]=(0,c.useState)(""),[H,O]=(0,c.useState)(!1),[x,K]=(0,c.useState)(!1),[_,ne]=(0,c.useState)(()=>Et(ae())),[q,j]=(0,c.useState)(null),[Ce,Se]=(0,c.useState)([]),[be,Ie]=(0,c.useState)(""),[Me,Y]=(0,c.useState)(""),[Le,I]=(0,c.useState)(""),[E,F]=(0,c.useState)(""),[Te,he]=(0,c.useState)(!1),[V,Ne]=(0,c.useState)(!1),[W,Q]=(0,c.useState)(""),[ye,re]=(0,c.useState)(""),[ke,te]=(0,c.useState)(null),[Ue,oe]=(0,c.useState)(0),ue=(0,c.useRef)(null),me=(0,c.useRef)(1);(0,c.useEffect)(()=>{t&&(a(""),l([]),d(new Set),v("lead"),h(""),P("in_progress"),T(""),U(""),O(!1),K(!1),j(null),Y(""),I(""),F(""),Q(""),re(""),te(null),oe(0),me.current=1)},[t]),(0,c.useEffect)(()=>{if(!W)return;let f=!0,N=window.setInterval(()=>{fetch("/api/feed-groups").then(async M=>{let $=await M.json().catch(()=>({}));!M.ok||!$.ok||!f||(Se(Array.isArray($.groups)?$.groups:[]),Ie(typeof $.larkAppId=="string"?$.larkAppId:""),F(""),Q(""),re(""))}).catch(()=>{})},1e3);return()=>{f=!1,window.clearInterval(N)}},[W]),(0,c.useEffect)(()=>{if(!t||t.loading||t.success)return;let f=!0;return he(!0),fetch("/api/feed-groups").then(async N=>{let M=await N.json().catch(()=>({}));if(!N.ok||!M.ok)throw new Error(M.message??M.error??`HTTP ${N.status}`);f&&(Se(Array.isArray(M.groups)?M.groups:[]),Ie(typeof M.larkAppId=="string"?M.larkAppId:""),F(""))}).catch(N=>{f&&F(N instanceof Error?N.message:String(N))}).finally(()=>{f&&he(!1)}),()=>{f=!1}},[t]);let Ve=async()=>{let f=be?`?larkAppId=${encodeURIComponent(be)}`:"",N=await fetch(`/api/feed-groups/auth-url${f}`),M=await N.json().catch(()=>({}));if(!N.ok||!M.authUrl){B(M.error??`HTTP ${N.status}`,{kind:"error"});return}Q(String(M.authUrl)),re("")},qe=async f=>{Ne(!0);try{let N=await fetch("/api/feed-groups/oauth-callback",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({callbackUrl:f.trim()})}),M=await N.json().catch(()=>({}));if(!N.ok||!M.ok)throw new Error(M.message??M.error??`HTTP ${N.status}`);let $=await fetch("/api/feed-groups"),X=await $.json().catch(()=>({}));if(!$.ok||!X.ok)throw new Error(X.message??X.error??`HTTP ${$.status}`);Se(Array.isArray(X.groups)?X.groups:[]),Ie(typeof X.larkAppId=="string"?X.larkAppId:""),F(""),Q(""),re("")}catch(N){B(N instanceof Error?N.message:String(N),{kind:"error"})}finally{Ne(!1)}};if(!t)return null;if(t.success){let f=t.success,N=typeof f.shareLink=="string"&&f.shareLink?f.shareLink:"",M=Array.isArray(f.failed)?f.failed.length:0,$=Array.isArray(f.spawned)?f.spawned.length:0,X=f.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:[X,"\uFF08",$,"\uFF09"]}),M>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(M)})}):null,N?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:N,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)(Je,{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 ee=t.bots,we=[...p],Ye=we,Ln=f=>ee.find(N=>N.larkAppId===f)?.botName??f,xe=ke?ps(ee,ke.query).slice(0,8):[],je=f=>{if(!ke)return;let N=gs(s,ke,f.botName);a(N.text),te(null),oe(0),d(M=>new Set(M).add(f.larkAppId)),h(M=>M||f.larkAppId),requestAnimationFrame(()=>{let M=ue.current;M&&(M.focus(),M.setSelectionRange(N.caret,N.caret))})},un=f=>{if(!(!ke||xe.length===0)){if(f.key==="ArrowDown"||f.key==="ArrowUp"){f.preventDefault();let N=f.key==="ArrowDown"?1:-1;oe(M=>(M+N+xe.length)%xe.length);return}if(f.key==="Enter"||f.key==="Tab"){f.preventDefault(),je(xe[Math.min(Ue,xe.length-1)]);return}f.key==="Escape"&&(f.preventDefault(),te(null))}},Ae=async f=>{let N=[...f.clipboardData.files].filter(le=>le.type.startsWith("image/"));if(N.length===0)return;f.preventDefault();let M=f.currentTarget.selectionStart??s.length,$=f.currentTarget.selectionEnd??M,X=N.filter(le=>vo.has(le.type.toLowerCase()));if(X.length!==N.length){B(o("sessions.create.imageUnsupported"),{kind:"warning"});return}if(r.length+X.length>Es){B(o("sessions.create.imageCountLimit",{n:String(Es)}),{kind:"warning"});return}if(X.some(le=>le.size>Co)){B(o("sessions.create.imageSizeLimit"),{kind:"warning"});return}if(r.reduce((le,Re)=>le+Re.size,0)+X.reduce((le,Re)=>le+Re.size,0)>So){B(o("sessions.create.imageTotalLimit"),{kind:"warning"});return}try{let le=me.current,Re=await Promise.all(X.map(async(ie,ze)=>{let Ee=await Io(ie),Ze=Ee.indexOf(",");if(Ze<0)throw new Error("bad_image_data");let ce=le+ze;return{id:`${Date.now()}-${ze}-${Math.random().toString(36).slice(2)}`,ordinal:ce,marker:`[${o("sessions.create.imageMarker",{n:String(ce)})}]`,name:ie.name||`pasted-image-${r.length+ze+1}`,mimeType:ie.type.toLowerCase(),size:ie.size,dataBase64:Ee.slice(Ze+1),previewUrl:Ee}}));me.current+=Re.length;let Be=fs(s,M,$,Re.map(ie=>ie.marker));a(Be.text),l(ie=>[...ie,...Re]),te(null),requestAnimationFrame(()=>{let ie=ue.current;ie&&(ie.focus(),ie.setSelectionRange(Be.caret,Be.caret))})}catch{B(o("sessions.create.imageReadFailed"),{kind:"error"})}},An=async f=>{f.preventDefault();let N=s.trim();if(!N){B(o("sessions.create.errContent"),{kind:"warning"});return}if(we.length===0){B(o("sessions.create.errNoBot"),{kind:"warning"});return}let M=b||we[0]||"";if(g==="lead"&&(!M||!we.includes(M))){B(o("sessions.create.errLead"),{kind:"warning"});return}K(!0),j(null);try{let $=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:N,larkAppIds:we,mode:g,column:L,leadLarkAppId:g==="lead"?M:void 0,name:D.trim()||void 0,bindWorkingDir:R.trim()||void 0,feedGroupId:Me||void 0,newFeedGroupName:Le.trim()||void 0,feedGroupAppId:Me||Le.trim()?be:void 0,images:r.map(Pe=>({name:Pe.name,mimeType:Pe.mimeType,dataBase64:Pe.dataBase64}))})}),X=await $.json().catch(()=>null);$.ok&&X?.ok?_?(j(X),a(""),l([]),me.current=1,T("")):e.onSuccess(X):$.status!==401&&B(`${o("sessions.create.failed")}: ${X?.error??$.status}`,{kind:"error"})}catch($){B(`${o("sessions.create.failed")}: ${$}`,{kind:"error"})}finally{K(!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:An,children:[(0,n.jsxs)("fieldset",{className:"cs-content",children:[(0,n.jsx)("legend",{children:o("sessions.create.content")}),(0,n.jsxs)("div",{className:"cs-composer",children:[(0,n.jsx)("textarea",{ref:ue,name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),"aria-describedby":"cs-content-help",required:!0,value:s,onChange:f=>{let N=f.currentTarget,M=N.value;a(M),te(st(M,N.selectionStart??M.length)),oe(0)},onClick:f=>te(st(s,f.currentTarget.selectionStart??s.length)),onKeyDown:un,onPaste:f=>{Ae(f)},onBlur:()=>setTimeout(()=>te(null),0)}),ke?(0,n.jsx)("div",{className:"cs-mention-menu",role:"listbox","aria-label":o("sessions.create.mentionBots"),children:xe.length?xe.map((f,N)=>(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":N===Ue,className:N===Ue?"active":void 0,onMouseDown:M=>M.preventDefault(),onClick:()=>je(f),children:[(0,n.jsxs)("strong",{children:["@",f.botName]}),(0,n.jsx)("small",{children:f.larkAppId})]},f.larkAppId)):(0,n.jsx)("p",{children:o("sessions.create.noBotMatch")})}):null]}),(0,n.jsx)("small",{id:"cs-content-help",children:o("sessions.create.contentHelp")}),r.length?(0,n.jsx)("div",{className:"cs-image-list","aria-label":o("sessions.create.pastedImages"),children:r.map(f=>(0,n.jsxs)("figure",{className:"cs-image-item",children:[(0,n.jsx)("img",{src:f.previewUrl,alt:f.name}),(0,n.jsxs)("figcaption",{title:`${f.marker} ${f.name}`,children:[(0,n.jsx)("strong",{children:f.marker}),(0,n.jsx)("span",{children:f.name})]}),(0,n.jsx)("button",{type:"button",className:"cs-image-remove","aria-label":o("sessions.create.removeImage",{name:`${f.marker} ${f.name}`}),title:o("sessions.create.removeImage",{name:`${f.marker} ${f.name}`}),onClick:()=>{let N=r.filter($=>$.id!==f.id),M=bs(s,f.marker,N.map($=>$.marker),$=>`[${o("sessions.create.imageMarker",{n:String($+1)})}]`);a(M.text),l(N.map(($,X)=>({...$,ordinal:X+1,marker:M.markers[X]}))),me.current=N.length+1},children:(0,n.jsx)("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{d:"M7 7l10 10M17 7 7 17"})})})]},f.id))}):null]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),(0,n.jsx)(Ut,{bots:ee,selected:p,onToggle:(f,N)=>{d(M=>{let $=new Set(M);return N?$.add(f):$.delete(f),$.has(b)||h($.values().next().value??""),$})},searchPlaceholder:o("botPicker.searchPlaceholder"),noMatchLabel:o("botPicker.noMatch"),emptyLabel:o("sessions.create.noBots"),selectedCountLabel:f=>o("botPicker.selectedCount",{n:String(f)})})]}),(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:()=>v("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:g==="all",onChange:()=>v("all")})," ",o("sessions.create.modeAll")]}),(0,n.jsx)("small",{children:o("sessions.create.modeHelp")})]}),W?(0,n.jsx)("div",{className:"feed-group-auth-overlay",children:(0,n.jsxs)("section",{className:"feed-group-auth-card",role:"dialog","aria-modal":"true","aria-labelledby":"session-feed-group-auth-title",children:[(0,n.jsx)("h3",{id:"session-feed-group-auth-title",children:"\u6388\u6743\u98DE\u4E66\u6807\u7B7E"}),(0,n.jsxs)("p",{children:["\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\uFF0C\u5728\u98DE\u4E66\u9875\u9762\u786E\u8BA4\u6388\u6743\u3002\u5982\u679C BotMux \u4E0E\u6D4F\u89C8\u5668\u5728\u540C\u4E00\u53F0\u7535\u8111\uFF0C\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\u6388\u6743\u3002\u5982\u679C BotMux \u8FD0\u884C\u5728\u8FDC\u7A0B\u865A\u62DF\u673A\u4E0A\uFF0C\u6D4F\u89C8\u5668\u4F1A\u56E0\u65E0\u6CD5\u8BBF\u95EE\u672C\u673A\u5730\u5740 ",(0,n.jsx)("code",{children:"127.0.0.1:9768"})," \u800C\u663E\u793A\u201C\u65E0\u6CD5\u8BBF\u95EE\u201D\uFF1B\u6B64\u65F6\u8BF7\u590D\u5236\u5730\u5740\u680F\u4E2D\u7684\u5B8C\u6574\u94FE\u63A5\u5E76\u7C98\u8D34\u5230\u4E0B\u65B9\u3002"]}),(0,n.jsx)("button",{type:"button",className:"primary feed-group-auth-open",onClick:()=>window.open(W,"_blank","noopener"),children:"\u8DF3\u8F6C\u98DE\u4E66\u6388\u6743"}),(0,n.jsxs)("label",{children:[(0,n.jsx)("span",{children:"\u8BF7\u628A\u70B9\u51FB\u6388\u6743\u540E\u7684\u5B8C\u6574\u94FE\u63A5\u7C98\u8D34\u5728\u8FD9\u91CC"}),(0,n.jsx)("input",{type:"url",value:ye,placeholder:"http://127.0.0.1:9768/callback?code=\u2026&state=\u2026",onChange:f=>re(f.currentTarget.value)})]}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{Q(""),re("")},children:"\u53D6\u6D88"}),(0,n.jsx)("button",{type:"button",className:"primary",disabled:!ye.trim()||V,onClick:()=>{qe(ye)},children:V?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u5B8C\u6210\u6388\u6743"})]})]})}):null,(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:Ye.length===0,value:Ye.includes(b)?b:"",onChange:f=>h(f.currentTarget.value),children:Ye.length?Ye.map(f=>(0,n.jsx)("option",{value:f,children:Ln(f)},f)):(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:()=>P("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:()=>P("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${H?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":H,"aria-controls":"cs-advanced-fields",onClick:()=>O(f=>!f),children:o("sessions.create.optionalConfig")})}),H?(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:D,onChange:f=>T(f.currentTarget.value)})]}),(0,n.jsxs)("fieldset",{className:"cs-feed-group",children:[(0,n.jsx)("legend",{children:"\u98DE\u4E66\u6807\u7B7E\uFF08\u53EF\u9009\uFF09"}),(0,n.jsx)(Ft,{groups:Ce,selectedId:Me,newName:Le,disabled:Te||!!E,onChange:(f,N)=>{Y(f),I(N)}}),(0,n.jsx)("small",{children:"\u5C55\u5F00\u540E\u53EF\u5728\u7B2C\u4E00\u884C\u8F93\u5165\u65B0\u6807\u7B7E\u540D\u79F0\uFF0C\u6216\u9009\u62E9\u4E0B\u65B9\u5DF2\u6709\u6807\u7B7E\u3002"}),Te?(0,n.jsx)("small",{children:"\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6807\u7B7E\u2026"}):null,E?(0,n.jsxs)("div",{className:"cs-warn",children:[(0,n.jsx)("small",{children:E})," ",(0,n.jsx)("button",{type:"button",disabled:V,onClick:()=>{Ve()},children:V?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u7ACB\u5373\u6388\u6743"}),(0,n.jsx)("small",{children:" \u6388\u6743\u540E\u4F1A\u5F39\u7A97\u63D0\u793A\u4F60\u7C98\u8D34\u56DE\u8C03\u5730\u5740\u3002"})]}):null]}),(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:R,onChange:f=>U(f.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),q?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[q.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(q.failed)&&q.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(q.failed.length)})}`:""]}),typeof q.shareLink=="string"&&q.shareLink?(0,n.jsx)("a",{href:q.shareLink,target:"_blank",rel:"noopener",children:o("sessions.create.openChat")}):null]}):null,(0,n.jsxs)("div",{className:"actions cs-actions",children:[(0,n.jsxs)("label",{className:"cs-keep-open",title:o("sessions.create.keepOpenHelp"),children:[(0,n.jsx)("input",{type:"checkbox",name:"keepOpen",checked:_,onChange:f=>{let N=f.currentTarget.checked;ne(N),Mt(ae(),N)}}),(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:x||ee.length===0,children:x?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function ea(){return(0,n.jsx)("div",{className:"sessions-skeleton","aria-busy":"true","aria-label":o("sessions.loadingSessions"),children:[0,1,2,3].map(e=>(0,n.jsxs)("div",{className:"sessions-skeleton-col",children:[(0,n.jsx)("div",{className:"skel skel-head"}),(0,n.jsx)("div",{className:"skel skel-card"}),(0,n.jsx)("div",{className:"skel skel-card skel-card-short"}),(0,n.jsx)("div",{className:"skel skel-card"})]},e))})}function na(){Ot();let e=zn(i=>[...i.sessions.values()]),t=zn(i=>i.bootstrapped),[s,a]=(0,c.useState)(0),r=(0,c.useCallback)(()=>a(i=>i+1),[]),[l,p]=(0,c.useState)({q:"",status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:Nt(ae()),active:!0,cli:new Set(se)}),[d,g]=(0,c.useState)(new Set),[v,b]=(0,c.useState)("lastMessageAt"),[h,L]=(0,c.useState)("desc"),[P,D]=(0,c.useState)(()=>new Set(St(ae()))),[T,R]=(0,c.useState)(()=>Tt(ae())),[U,H]=(0,c.useState)(()=>xt(ae())),[O,x]=(0,c.useState)(!1),[K,_]=(0,c.useState)(null),[ne,q]=(0,c.useState)(null),[j,Ce]=(0,c.useState)(()=>Lt(ae())),Se=`${T}:${T==="kanban"?j:"-"}`,be=(0,c.useRef)(!0),[Ie,Me]=(0,c.useState)(0),[Y,Le]=(0,c.useState)([]),[I,E]=(0,c.useState)(null),[F,Te]=(0,c.useState)(!1),he=(0,c.useRef)(!1),[V,Ne]=(0,c.useState)(()=>{try{return window.localStorage.getItem(jn)??""}catch{return""}}),[W,Q]=(0,c.useState)({data:null,key:"",fetchedAt:0}),ye=(0,c.useRef)(!1),re=(0,c.useRef)(new Set),[ke,te]=(0,c.useState)(""),[Ue,oe]=(0,c.useState)(null),[ue,me]=(0,c.useState)(null),[Ve,qe]=(0,c.useState)(null),[ee,we]=(0,c.useState)(!1),[Ye,Ln]=(0,c.useState)(24),[xe,je]=(0,c.useState)(""),[un,Ae]=(0,c.useState)(null),[An,f]=(0,c.useState)(null),[N,M]=(0,c.useState)(null),[$,X]=(0,c.useState)(null),[Pe,le]=(0,c.useState)(null),[Re,Be]=(0,c.useState)(null),[ie,ze]=(0,c.useState)(!1),Ee=(0,c.useRef)(0);(0,c.useLayoutEffect)(()=>{if(be.current){be.current=!1;return}Me(i=>i+1)},[Se]),(0,c.useEffect)(()=>{le(document.getElementById("create-session-modal"))},[]),(0,c.useEffect)(()=>{Pt().then(r)},[r]);let Ze=(0,c.useMemo)(()=>{let i=new Map;for(let u of e){let m=String(u.chatId??"").trim();if(!m||!l.showUnknownChats&&Zn(u))continue;let y=Fe(u);i.set(m,is(i.get(m),y,m))}return[...i.entries()].sort((u,m)=>u[1].localeCompare(m[1])).map(([u,m])=>({value:u,label:m}))},[l.showUnknownChats,s,e]);(0,c.useEffect)(()=>{l.chat&&(Ze.some(i=>i.value===l.chat)||p(i=>({...i,chat:""})))},[Ze,l.chat]);let ce=(0,c.useMemo)(()=>{let i=l.q.toLowerCase(),u=[...l.cli],m=u.length>0&&u.length<se.length,y=T==="kanban",w=l.multiBotTopics||l.botTriggeredTopics?new Set(In(e).filter(k=>!l.multiBotTopics||k.multiBot).filter(k=>!l.botTriggeredTopics||k.inferredBotTriggered).map(k=>k.key)):null,C=e.filter(k=>!m||u.includes(k.cliId??"unknown")).filter(k=>l.showUnknownChats||!Zn(k)).filter(k=>!l.status||k.status===l.status).filter(k=>!l.adopt||l.adopt==="yes"==!!k.adopt).filter(k=>!l.chat||String(k.chatId??"")===l.chat).filter(k=>!l.active||y||k.status!=="closed").filter(k=>!i||rs(k).includes(i));return w?C.filter(k=>w.has(et(k))).sort((k,z)=>Ls(k,z,v,h)):C.sort((k,z)=>Ls(k,z,v,h))},[l,s,h,v,e,T]),Pn=(0,c.useMemo)(()=>as(e),[e]),Oe=(0,c.useMemo)(()=>new Map(e.map(i=>[i.sessionId,i])),[e,s]),dt=(0,c.useMemo)(()=>ce.filter(i=>i.status!=="closed"),[ce]),Qe=(T==="table"||T==="topics"?ce:dt).filter(i=>i.status!=="closed"),ut=[...d].map(i=>Oe.get(i)).filter(i=>!!i&&i.status!=="closed"),mt=Qe.length>0&&Qe.every(i=>d.has(i.sessionId)),Ps=Qe.some(i=>d.has(i.sessionId))&&!mt;(0,c.useEffect)(()=>{g(i=>{let u=!1,m=new Set;for(let y of i){let w=Oe.get(y);w&&w.status!=="closed"?m.add(y):u=!0}return u?m:i})},[Oe]);let Bn=(0,c.useCallback)(i=>{let u=new Set;if(!i)return u;for(let m of i.groupChats)u.add(m);if(I)for(let[m,y]of I){if(u.has(m))continue;let w=!1;for(let C of i.botIds)if(y.botIds.has(C)){w=!0;break}if(w){for(let C of y.observedNames)if(i.botNames.has(C)){u.add(m);break}}}return u},[I]),gt=(0,c.useMemo)(()=>{if(T==="kanban"&&j==="team"){let i=Y.find(m=>m.key===V)??Y[0],u=Bn(i);return ce.filter(m=>u.has(String(m.chatId)))}return ce},[j,V,Y,ce,Bn,T]),On=(0,c.useCallback)(i=>Vt(gt,i),[gt]),Dn=(0,c.useCallback)(async()=>{if(!(he.current||F)){he.current=!0;try{let[i,u,m]=await Promise.all([fetch("/api/team/hosted").then(C=>C.json()).catch(()=>null),fetch("/api/team/remote-roster").then(C=>C.json()).catch(()=>null),fetch("/api/groups").then(C=>C.json()).catch(()=>null)]);Array.isArray(m?.chats)&&E(new Map(m.chats.map(C=>[String(C.chatId),{botIds:new Set((C.memberBots??[]).filter(k=>k.inChat).map(k=>String(k.larkAppId))),observedNames:new Set((C.observedBotNames??[]).map(k=>String(k)))}])));let y=C=>({ids:new Set(C.map(k=>String(k.larkAppId))),names:new Set(C.map(k=>String(k.name??"")).filter(Boolean))}),w=[];for(let C of i?.teams??[]){let{ids:k,names:z}=y(C.bots??[]);w.push({key:`local:${C.teamId}`,label:C.isDefault?o("team.myHostedTeam"):String(C.name??C.teamId),botIds:k,botNames:z,groupChats:new Set((C.groupChatIds??[]).map(G=>String(G)))})}for(let C of u?.memberships??[]){let{ids:k,names:z}=y(C.roster?.bots??[]);w.push({key:`${C.hubUrl}::${C.teamId}`,label:String(C.teamName??C.teamId??C.hubUrl),botIds:k,botNames:z,groupChats:new Set})}Le(w),Ne(C=>w.length&&!w.some(k=>k.key===C)?w[0].key:C)}finally{Te(!0),he.current=!1}}},[F]),pt=(0,c.useCallback)(async(i,u,m,y,w)=>{try{let k=i.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(i.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:u,column:m,position:y})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:i,sessionId:u,column:m,position:y})}),z=await k.json().catch(()=>({}));(!k.ok||z?.ok===!1)&&(Q(G=>{if(!G.data||G.key!==i)return G;let Z={...G.data.board};return w?Z[u]=w:delete Z[u],{...G,data:{...G.data,board:Z}}}),k.status!==401&&B(`${o("sessions.kanban.moveFail")}: ${z?.error??k.status}`,{kind:"error"}))}catch(C){Q(k=>{if(!k.data||k.key!==i)return k;let z={...k.data.board};return w?z[u]=w:delete z[u],{...k,data:{...k.data,board:z}}}),B(`${o("sessions.kanban.moveFail")}: ${C}`,{kind:"error"})}},[]),Bs=(0,c.useCallback)(async i=>{let u=W.key===i.key&&Date.now()-W.fetchedAt<3e4;if(!(ye.current||u)){ye.current=!0;try{let y=i.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(i.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(i.key)}`,w=await fetch(y),C=await w.json().catch(()=>({}));if(!w.ok||C?.ok===!1)return;let k=typeof C.deploymentId=="string"?C.deploymentId:null,z=[];for(let G of Array.isArray(C.reports)?C.reports:[])if(!(k&&G.deploymentId===k))for(let Z of Array.isArray(G.sessions)?G.sessions:[])z.push({...Z,remoteDeployment:G.deploymentName||G.deploymentId});Q({key:i.key,fetchedAt:Date.now(),data:{board:C.board&&typeof C.board=="object"?C.board:{},remoteRows:z}})}finally{ye.current=!1}}},[W.fetchedAt,W.key]);(0,c.useEffect)(()=>{T==="kanban"&&j==="team"&&!F&&Dn()},[j,F,Dn,T]),(0,c.useEffect)(()=>{let i=window.setInterval(()=>{T==="kanban"&&j==="team"&&(Q(u=>({...u,fetchedAt:0})),r())},3e4);return()=>window.clearInterval(i)},[j,r,T]);let ft=(0,c.useCallback)(async(i,u,m,y)=>{try{let w=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:u,position:m})}),C=await w.json().catch(()=>({}));(!w.ok||C?.ok===!1)&&(i.kanbanColumn=y.column,i.kanbanPosition=y.position,r(),w.status!==401&&B(`${o("sessions.kanban.moveFail")}: ${C?.error??w.status}`,{kind:"error"}))}catch(w){i.kanbanColumn=y.column,i.kanbanPosition=y.position,r(),B(`${o("sessions.kanban.moveFail")}: ${w}`,{kind:"error"})}},[r]),Os=(0,c.useCallback)(i=>{let u=!1;for(let m of i){let y=String(m.row.sessionId);if(!y||m.row.status==="closed"&&m.column!=="done")continue;if(j==="team"){let k=Y.find(Z=>Z.key===V)??Y[0];if(!k)continue;let G=(W.key===k.key&&W.data?W.data.board:{})[y];Q(Z=>{let wt=Z.key===k.key&&Z.data?Z.data:{board:{},remoteRows:Z.data?.remoteRows??[]},Qs={...wt.board,[y]:{column:m.column,position:m.position}};return{...Z,key:k.key,data:{...wt,board:Qs}}}),pt(k.key,y,m.column,m.position,G),u=!0;continue}let w=$e.sessions.get(y);if(!w)continue;let C={column:w.kanbanColumn,position:w.kanbanPosition};w.kanbanColumn=m.column,w.kanbanPosition=m.position,ft(w,m.column,m.position,C),u=!0}u&&r()},[j,V,Y,W,ft,pt,r]),bt=(0,c.useCallback)(async(i,u)=>{let m=i.title;i.title=u,r();try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:u})}),w=await y.json().catch(()=>({}));(!y.ok||w?.ok===!1)&&(i.title=m,r(),y.status!==401&&B(`${o("sessions.kanban.renameFail")}: ${w?.error??y.status}`,{kind:"error"}))}catch(y){i.title=m,r(),B(`${o("sessions.kanban.renameFail")}: ${y}`,{kind:"error"})}},[r]),$n=(0,c.useCallback)(async i=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/locate`,{method:"POST",headers:Dt()}),m=await u.json();return m.ok?!0:(B(`Locate failed: ${m.error??u.status}`,{kind:"error"}),!1)}catch(u){return B(`Locate error: ${u}`,{kind:"error"}),!1}},[]),mn=(0,c.useCallback)(async(i,u)=>{if(!await wn({title:"\u5173\u95ED\u4F1A\u8BDD",message:o("sessions.closeConfirm"),danger:!0}))return!1;u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/close`,{method:"POST"}),y=await m.json().catch(()=>({}));if(!m.ok||y?.ok===!1)return m.status!==401&&B(`Close failed: ${y?.error??m.status}`,{kind:"error"}),!1;let w=Gn(y);return w&&B(_t(w)?`\u26A0\uFE0F Closed locally, but a credentialed host subtree could NOT be proven terminated: ${nn(w)}. The remote session WAS cancelled \u2014 inspect the local host process.`:`\u26A0\uFE0F Closed locally, but the remote session was NOT cancelled: ${nn(w)} \u2014 manual cleanup required.`,{kind:"warning"}),g(C=>{let k=new Set(C);return k.delete(i.sessionId),k}),r(),!0}catch(m){return B(`Close error: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[r]),gn=(0,c.useCallback)(async(i,u,m)=>{let y=!!i.locked;if(y===u)return!0;i.locked=u,r(),m&&(m.disabled=!0);try{let w=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:u})}),C=await w.json().catch(()=>({}));return!w.ok||C?.ok===!1?(i.locked=y,r(),w.status!==401&&B(`${o("sessions.lockFailed")}: ${C?.error??w.status}`,{kind:"error"}),!1):(i.locked=!!C.locked,r(),!0)}catch(w){return i.locked=y,r(),B(`${o("sessions.lockFailed")}: ${w}`,{kind:"error"}),!1}finally{m&&(m.disabled=!1)}},[r]),pn=(0,c.useCallback)(async(i,u)=>{if(re.current.has(i.sessionId)||!await wn({title:"\u91CD\u542F\u4F1A\u8BDD",message:ds(i),danger:!0}))return!1;u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/restart`,{method:"POST"}),y=await m.json().catch(()=>({}));return!m.ok||y?.ok===!1?(m.status!==401&&B(`${o("sessions.restartFailed")}: ${y?.message??y?.error??m.status}`,{kind:"error"}),!1):(re.current.add(i.sessionId),window.setTimeout(()=>re.current.delete(i.sessionId),5e3),!0)}catch(m){return B(`${o("sessions.restartFailed")}: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[]),Ds=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/resume`,{method:"POST"}),y=await m.json().catch(()=>({}));return!m.ok||y.ok===!1?(B(`${o("sessions.resumeFailed")}: ${y?.error??m.status}`,{kind:"error"}),!1):!0}catch(m){return B(`${o("sessions.resumeFailed")}: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[]),$s=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/start`,{method:"POST"}),y=await m.json().catch(()=>({}));return!m.ok||y.ok===!1?(m.status!==401&&B(`${o("sessions.create.startFailed")}: ${y?.error??m.status}`,{kind:"error"}),!1):!0}catch(m){return B(`${o("sessions.create.startFailed")}: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[]),fn=(0,c.useCallback)(i=>{f({sessionId:i.sessionId,loading:!0,messages:[]}),(async()=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/history?limit=80`),m=await u.json().catch(()=>({}));if(!u.ok||m?.ok===!1){let w=String(m?.error??u.status),C=w==="not_found_yet"||w==="not_found";f(k=>k?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:w,stale:C}:k);return}let y=Array.isArray(m.messages)?m.messages:[];f(w=>w?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:y,ownerOpenId:m.ownerOpenId}:w)}catch(u){f(m=>m?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:String(u)}:m)}})()},[]),Hn=(0,c.useCallback)(i=>{if(!Xe())return;let u=sn(i);if(!u){Ae(i.sessionId);return}M({sessionId:i.sessionId,url:u,loading:!1})},[]),Hs=(0,c.useCallback)((i,u)=>{Nn(i,u)},[]),Ks=(0,c.useCallback)((i,u)=>{if(on()&&i.status!=="closed"){Nn(i,u);return}Hn(i)},[Hn]),_s=(0,c.useCallback)(async()=>{let i=[...d];if(i.length===0||!await wn({title:"\u5173\u95ED\u4F1A\u8BDD",message:o("sessions.closeBulkConfirm",{count:i.length}),danger:!0}))return;oe({done:0,total:i.length});let u=0,m=0,y=[],w=[...i];async function C(){for(;w.length;){let k=w.shift();try{let z=await fetch(`/api/sessions/${encodeURIComponent(k)}/close`,{method:"POST"}),G=await z.json().catch(()=>({}));if(!z.ok||G?.ok===!1)m+=1;else{let Z=Gn(G);Z&&y.push(nn(Z))}}catch{m+=1}finally{u+=1,oe({done:u,total:i.length})}}}await Promise.all(Array.from({length:Math.min(6,i.length)},()=>C())),oe(null),g(new Set),r(),m>0&&B(`Failed: ${m}/${i.length}`,{kind:"error"}),y.length>0&&B(`\u26A0\uFE0F ${y.length}/${i.length} closed locally but left a residual requiring manual cleanup: ${y.join(", ")}`,{kind:"warning"})},[r,d]),Fs=(0,c.useCallback)(async i=>{let u=[...d].map(k=>Oe.get(k)).filter(k=>!!k&&k.status!=="closed"&&!!k.locked!==i);if(u.length===0)return;me({locked:i,done:0,total:u.length});let m=0,y=0,w=[...u];async function C(){for(;w.length;){let k=w.shift(),z=!!k.locked;try{let G=await fetch(`/api/sessions/${encodeURIComponent(k.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:i})}),Z=await G.json().catch(()=>({}));!G.ok||Z?.ok===!1?(y+=1,k.locked=z):k.locked=!!Z.locked}catch{y+=1,k.locked=z}finally{m+=1,me({locked:i,done:m,total:u.length})}}}await Promise.all(Array.from({length:Math.min(6,u.length)},()=>C())),me(null),r(),y>0&&B(`${o("sessions.lockFailed")}: ${y}/${u.length}`,{kind:"error"})},[r,Oe,d]),Us=(0,c.useCallback)(()=>{let i=[...d].filter(m=>!!Oe.get(m));if(i.length===0)return;let u=Xt(i);qe(o("sessions.monitorRoomAdded",{added:u.added,total:u.total})),window.setTimeout(()=>qe(null),1800)},[Oe,d]),js=(0,c.useCallback)(async i=>{let u=Wn(i);if(!u)return;let m=On(u);if(m.length!==0){Ln(u),we(!0),je(o("sessions.idleCleanupRunning"));try{let y=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:u,sessionIds:m.map(k=>k.sessionId)})}),w=await y.json().catch(()=>({}));if(!y.ok){y.status!==401&&B(`${o("sessions.idleCleanupFailed")}: ${w?.error??y.status}`,{kind:"error"}),je("");return}g(k=>{let z=new Set(k);for(let G of w?.results??[])G?.ok&&G?.sessionId&&z.delete(String(G.sessionId));return z}),je(o("sessions.idleCleanupDone",{closed:Number(w?.closed??0),failed:Number(w?.failed??0)}));let C=(w?.results??[]).filter(k=>k?.ok&&k?.residual).map(k=>nn(k.residual));C.length>0&&B(`\u26A0\uFE0F ${C.length} session(s) closed locally but left a residual requiring manual cleanup: ${C.join(", ")}`,{kind:"warning"}),r()}catch(y){B(`${o("sessions.idleCleanupFailed")}: ${y}`,{kind:"error"}),je("")}finally{we(!1)}}},[On,r]),zs=i=>{let u=It(i)??"board";u!==T&&(R(u),Rt(ae(),u))},ht=(0,c.useCallback)(i=>{v===i?L(u=>u==="asc"?"desc":"asc"):(b(i),L(i==="spawnedAt"||i==="lastMessageAt"?"desc":"asc"))},[v]),Gs=(i,u)=>{H(m=>{let y=m.indexOf(i),w=y+u;if(y<0||w<0||w>=m.length)return m;let C=[...m];return C.splice(y,1),C.splice(w,0,i),Fn(ae(),C),C})},Js=(i,u)=>{i!==u&&H(m=>{let y=m.indexOf(i),w=m.indexOf(u);if(y<0||w<0)return m;let C=[...m];return C.splice(y,1),C.splice(w,0,i),Fn(ae(),C),C})},Xs=(0,c.useMemo)(()=>({rows:ce,groupBy:j,teams:Y,teamsLoaded:F,teamKey:V,teamBoardData:W.data,teamBoardKey:W.key}),[j,V,Y,F,ce,W.data,W.key]),Ws=un?Oe.get(un)??null:null,Kn=(0,c.useMemo)(()=>F?Y.length?Y.map(i=>({value:i.key,label:i.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[Y,F]),Vs=!F||Y.length===0,yt=Y.some(i=>i.key===V)?V:Kn[0]?.value??"",qs=Kn.find(i=>i.value===yt)?.label??o("sessions.kanban.groupTeam"),Ys=(0,c.useCallback)(()=>{Ee.current+=1,ze(!1),Be(null)},[]),kt=(0,c.useCallback)(async()=>{let i=Ee.current+1;Ee.current=i,Be({bots:[],loading:!0}),ze(!0);try{let u=await us();if(Ee.current!==i)return;Be({bots:u})}finally{Ee.current===i&&ze(!1)}},[]),Zs=(0,c.useCallback)(async()=>{let i=await Kt({title:o("sessions.debugTerminal"),message:o("sessions.debugTerminalPrompt")});if(i===null)return;let u=i.trim(),m=window.open("about:blank","_blank");m&&(m.opener=null);try{let y=await fetch("/api/debug-terminal",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u?{workingDir:u}:{})}),w=await y.json().catch(()=>({}));if(!y.ok||w?.ok===!1||!w?.url){m?.close(),y.status!==401&&B(`${o("sessions.debugTerminalFail")}: ${w?.error??y.status}`,{kind:"error"});return}m?m.location.href=w.url:window.open(w.url,"_blank","noopener")}catch(y){m?.close(),B(`${o("sessions.debugTerminalFail")}: ${y}`,{kind:"error"})}},[]);return(0,c.useEffect)(()=>{let i=()=>{zt()&&He.authed&&kt()};return i(),window.addEventListener(Jn,i),()=>window.removeEventListener(Jn,i)},[]),(0,n.jsxs)("section",{className:"page sessions-page",children:[(0,n.jsxs)("div",{className:"page-heading",children:[(0,n.jsxs)("div",{className:"sessions-heading-main",children:[(0,n.jsx)("p",{className:"eyebrow",children:o("nav.sessions")}),(0,n.jsx)("h1",{children:o("sessions.title")}),(0,n.jsxs)("div",{className:"sessions-view-controls",children:[(0,n.jsx)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":o("sessions.viewMode"),children:[["kanban",o("sessions.viewKanban")],["board",o("sessions.viewBoard")],["topics",o("sessions.viewTopics")],["table",o("sessions.viewTable")]].map(([i,u])=>(0,n.jsx)("button",{type:"button","data-view":i,className:T===i?"active":void 0,"aria-pressed":T===i,onClick:()=>zs(i),children:u},i))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${T==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":T!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([i,u])=>(0,n.jsx)("button",{type:"button","data-groupby":i,className:j===i?"active":void 0,"aria-pressed":j===i,onClick:()=>{Ce(i),At(ae(),i)},children:u},i))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(T==="kanban"&&j==="team"&&F),children:ke}),(0,n.jsx)(Ht,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(T==="kanban"&&j==="team"),disabled:Vs,label:qs,value:yt,options:Kn,onChange:i=>{if(Y.some(u=>u.key===i)){Ne(i);try{window.localStorage.setItem(jn,i)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[Xe()?(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=Wt()},children:o("sessions.monitorRoom")}):null,He.authed?(0,n.jsx)("button",{type:"button",className:"debug-terminal-btn",title:o("sessions.debugTerminalHint"),onClick:()=>{Zs()},children:o("sessions.debugTerminal")}):null,He.authed?(0,n.jsx)($t,{className:"page-primary-action create-session-btn",disabled:ie,onClick:()=>{kt()},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:Pn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:Pn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:Pn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(Ho,{chatOptions:Ze,filters:l,setFilters:p,sortKey:v,sortDir:h,onSort:ht,idleCleanup:{busy:ee,hours:Ye,status:xe,countForHours:i=>On(i).length,onRun:js}}),(0,n.jsx)(Ko,{selectedCount:d.size,lockDisabled:!ut.some(i=>!i.locked),unlockDisabled:!ut.some(i=>!!i.locked),closeProgress:Ue,lockProgress:ue,monitorRoomText:Ve,onClear:()=>g(new Set),onClose:()=>{_s()},onAddToMonitorRoom:Us,onLock:i=>{Fs(i)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${Ie>0?" sessions-view-stage-enter":""}`,"data-view":T,"data-kanban-group":j,children:[t?null:(0,n.jsx)(ea,{}),(0,n.jsx)(Fo,{rows:ce,selected:d,hidden:T!=="table"||!t,sortKey:v,sortDir:h,selectAllChecked:mt,selectAllIndeterminate:Ps,selectAllDisabled:Qe.length===0,hiddenColumns:P,onToggleColumn:i=>{let u=!P.has(i),m=new Set(P);u?m.add(i):m.delete(i),_n(ae(),Array.from(m)),D(m),u&&i===v&&(b("lastMessageAt"),L("desc"))},onResetColumns:()=>{D(new Set),_n(ae(),[])},onOpen:i=>Ae(i.sessionId),onSelect:(i,u)=>g(m=>{let y=new Set(m);return u?y.add(i):y.delete(i),y}),onSelectAll:i=>g(u=>{let m=new Set(u);for(let y of Qe)i?m.add(y.sessionId):m.delete(y.sessionId);return m}),onSort:ht}),(0,n.jsx)(jo,{rows:dt,selected:d,hidden:T!=="board"||!t,order:U,animated:O,dragColId:K,dragOverCol:ne,onAnimated:()=>x(!0),onMoveColumn:Gs,onMoveColumnTo:Js,onDragCol:_,onDragOverCol:q,onToggleSelect:i=>g(u=>{let m=new Set(u);return m.has(i.sessionId)?m.delete(i.sessionId):m.add(i.sessionId),m}),onOpen:i=>Ae(i.sessionId),onHistory:fn,onLocate:i=>$n(i),onRestart:(i,u)=>{pn(i,u)},onLock:(i,u,m)=>{gn(i,u,m)},onClose:(i,u)=>{mn(i,u)}}),(0,n.jsx)(Go,{rows:ce,relationRows:e,selected:d,hidden:T!=="topics"||!t,onToggleSelect:i=>g(u=>{let m=new Set(u);return m.has(i.sessionId)?m.delete(i.sessionId):m.add(i.sessionId),m}),onOpen:i=>Ae(i.sessionId),onHistory:fn,onLocate:i=>$n(i),onRestart:(i,u)=>{pn(i,u)},onLock:(i,u,m)=>{gn(i,u,m)},onClose:(i,u)=>{mn(i,u)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:X,className:`sessions-kanban${j==="bot"?" kanban-mode-bot":""}`,hidden:T!=="kanban"||!t,children:T==="kanban"?(0,n.jsx)(Rs,{host:$,...Xs,canRestartSession:xn,getTeamChatIds:Bn,icons:{details:J.details,feishu:J.feishu,history:J.history,key:J.key,lock:J.lock,restart:J.restart,close:J.close,terminal:J.terminal,unlock:J.unlock},lockActionLabel:Tn,sessionStatusText:tn,onClose:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&mn(m,u)},onDetails:i=>Ae(String(i.sessionId)),onHistory:fn,onMoveRows:Os,onNeedTeamBoard:i=>{Bs(i)},onNeedTeams:()=>{Dn()},onOpenTerminal:Xe()?Hn:void 0,onOpenWritableTerminal:Xe()&&on()?Hs:void 0,onRename:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&bt(m,u)},onRestart:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&pn(m,u)},onTeamScope:i=>te(i?o("sessions.kanban.teamScope",{chats:i.chats,sessions:i.sessions}):""),onToggleLock:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&gn(m,!m.locked,u)},onToggleSelect:i=>g(u=>{let m=String(i.sessionId),y=new Set(u);return y.has(m)?y.delete(m):y.add(m),y}),selectedSessionIds:d}):null})]},Ie),(0,n.jsx)(Zo,{row:Ws,onClose:()=>Ae(null),locateSession:$n,openHistory:fn,resumeSession:Ds,restartSession:pn,closeSession:mn,setSessionLocked:gn,startSession:$s,onTakeover:Ks}),(0,n.jsx)(Vo,{state:N,onClose:()=>M(null),onRename:bt}),(0,n.jsx)(Xo,{state:An,onClose:()=>f(null)}),Pe?(0,cn.createPortal)((0,n.jsx)(Qo,{dialog:Pe,state:Re,onClose:Ys,onSuccess:i=>Be(u=>u&&{...u,success:i})}),Pe):null]})}function ei(e){return Bt(e,(0,n.jsx)(na,{}))}export{Qa as CliFilterGroup,Go as TopicGroupsView,ei as renderSessionsPage};
|
|
8
|
+
`)}`},H=async()=>{let x=U();try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(x);else{let K=document.createElement("textarea");K.value=x,K.style.position="fixed",K.style.opacity="0",document.body.appendChild(K),K.select(),document.execCommand("copy"),document.body.removeChild(K)}d(!0),window.setTimeout(()=>d(!1),1500)}catch{}},O=r||s;return(0,n.jsxs)("span",{ref:g,className:`session-todo-badge${t.hasInProgress?" active":""}${r?" pinned":""}`,tabIndex:0,onMouseEnter:x=>{r||R(x.currentTarget)},onFocus:x=>{r||R(x.currentTarget)},onMouseLeave:()=>{r||a(null)},onBlur:()=>{r||a(null)},onClick:x=>{x.stopPropagation(),r?(l(!1),a(null)):(R(x.currentTarget),l(!0))},children:[t.hasInProgress?(0,n.jsx)("span",{className:"session-todo-dot","aria-hidden":"true"}):null,L,O&&D.length?(0,cn.createPortal)((0,n.jsxs)("div",{ref:v,className:`session-todo-pop${r?" pinned":""}`,role:r?"dialog":"tooltip",style:{left:`${s?.x??0}px`,top:`${s?.y??0}px`},onMouseDown:x=>x.stopPropagation(),children:[(0,n.jsxs)("div",{className:"session-todo-pop-head",children:[(0,n.jsx)("span",{className:"session-todo-pop-title",children:P}),r?(0,n.jsx)("button",{type:"button",className:"session-todo-pop-copy",onClick:x=>{x.stopPropagation(),H()},children:p?o("sessions.board.todoCopied"):o("sessions.board.todoCopy")}):(0,n.jsx)("span",{className:"session-todo-pop-hint",children:o("sessions.board.todoClickHint")})]}),(0,n.jsx)("div",{className:"session-todo-pop-list",children:D.map((x,K)=>(0,n.jsxs)("div",{className:`session-todo-pop-item st-${Sn(x.status)}`,children:[(0,n.jsx)("span",{className:"session-todo-pop-glyph","aria-hidden":"true",children:T(x.status)}),(0,n.jsx)("span",{className:"session-todo-pop-text",children:x.text||`#${K+1}`})]},K))})]}),document.body):null]})}function ct(e){return e.row.locked?(0,n.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null}function ve(e){let t=e.className??`card-act${e.kind?` ${e.kind}`:""}`;return(0,n.jsx)("button",{type:"button",id:e.id,className:t,"data-action":e.action,"data-tip":e.label,"aria-label":e.label,disabled:e.disabled,onClick:s=>{s.stopPropagation(),e.onClick(s.currentTarget)},dangerouslySetInnerHTML:de(e.icon)})}function xo(e){if(!e.url||!Xe())return null;let t=on();return(0,n.jsxs)("span",{className:"term-pill",children:[(0,n.jsx)("a",{className:"term-btn term-open",href:e.url,target:"_blank",rel:"noopener","data-action":"terminal","data-tip":o("sessions.openReadonlyTerminal"),"aria-label":o("sessions.openReadonlyTerminal"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:de(J.terminal)}),t?(0,n.jsx)("button",{type:"button",className:"term-btn term-write","data-action":"write-link","data-tip":o("sessions.openWritableTerminal"),"aria-label":o("sessions.openWritableTerminal"),onClick:s=>{s.stopPropagation(),Nn(e.row,s.currentTarget)},dangerouslySetInnerHTML:de(J.key)}):null]})}function Ro(e){let t=e.row;return t.scope!=="chat"||!t.feishuChatLink?null:(0,n.jsx)("a",{className:e.className??"card-act",href:t.feishuChatLink,target:"_blank",rel:"noopener","data-tip":o("sessions.openChat"),"aria-label":o("sessions.openChat"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:de(J.feishu)})}function Eo(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 Ms(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?vn(e.tokenUsage?.in)??-1:t==="tokenOut"?vn(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?Fe(e).toLowerCase():t==="cliId"?dn(e).toLowerCase():String(e[t]??"").toLowerCase()}function dn(e){return String(e.runtimeDisplayName??e.cliId??"unknown")}function Ls(e,t,s,a){let r=Ms(e,s),l=Ms(t,s),p=0;return typeof r=="number"&&typeof l=="number"?p=r-l:typeof r=="boolean"&&typeof l=="boolean"?p=Number(r)-Number(l):p=String(r).localeCompare(String(l)),p===0&&(p=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),a==="asc"?p:-p}function Mo(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"):e.status==="stalled"?o("sessions.board.signalStalled"):""}function Lo(e,t,s){let a=s==="needs-you"?hn(e):Number(e.lastMessageAt??0),r=s==="needs-you"?hn(t):Number(t.lastMessageAt??0);return a!==r?s==="needs-you"?a-r:r-a:String(e.title??e.sessionId).localeCompare(String(t.title??t.sessionId))}function Ao(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 Po(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 Mn(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 rt(e){let[t,s]=(0,c.useState)(!1);return(0,n.jsx)("button",{type:"button","data-copy":e.value,onClick:()=>{yn(e.value,o("sessions.copy")).then(a=>{a&&(s(!0),window.setTimeout(()=>s(!1),800))})},children:t?o("sessions.copied"):o("sessions.copy")})}function Bo(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let l=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(l)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:a||t>0,onClick:async()=>{r(!0);let l=await e.locateSession(e.row);r(!1),l&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):a?o("sessions.locating"):o("sessions.locate")})}function Oo(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let l=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(l)},[t]),(0,n.jsx)(ve,{action:"locate",icon:J.pin,label:t>0?o("sessions.cooldown",{seconds:t}):o("sessions.locate"),disabled:a||t>0,onClick:async()=>{r(!0);let l=await e.onLocate(e.row);r(!1),l&&s(30)}})}function Qa(e){let t=se.filter(d=>e.selected.has(d)).length,s=(0,c.useRef)(null),[a,r]=(0,c.useState)("");(0,c.useEffect)(()=>{let d=()=>{s.current?.open&&(s.current.open=!1)},g=b=>{let h=s.current;h?.open&&!h.contains(b.target)&&d()},v=b=>{b.key==="Escape"&&d()};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",v),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",v)}},[]);let l=a.trim().toLowerCase(),p=l?se.filter(d=>d.toLowerCase().includes(l)):se;return(0,n.jsxs)("details",{className:"filter-cli",ref:s,children:[(0,n.jsxs)("summary",{children:[o("sessions.cli")," \xB7 ",(0,n.jsx)("b",{id:"cli-filter-count",className:t===se.length?void 0:"cli-filter-active",children:t===se.length?o("common.all"):`${t}/${se.length}`})]}),(0,n.jsxs)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:[(0,n.jsxs)("div",{className:"filter-cli-head",children:[(0,n.jsx)("input",{type:"search",className:"filter-cli-search",placeholder:o("sessions.cliSearch"),value:a,autoFocus:!0,onChange:d=>r(d.currentTarget.value),onClick:d=>d.stopPropagation()}),(0,n.jsxs)("div",{className:"filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{for(let d of se)e.selected.has(d)||e.onToggle(d,!0)},children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>{for(let d of se)e.selected.has(d)&&e.onToggle(d,!1)},children:o("sessions.cliClear")})]})]}),(0,n.jsx)("div",{className:"filter-cli-options",children:p.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):p.map(d=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:d,checked:e.selected.has(d),onChange:g=>e.onToggle(d,g.currentTarget.checked)}),(0,n.jsx)("span",{children:d})]},d))})]})]})}function Do(e){let t=[{key:"lastMessageAt",label:o("sessions.sort.lastMessageAt")},{key:"spawnedAt",label:o("sessions.sort.spawnedAt")},{key:"title",label:o("sessions.sort.title")},{key:"status",label:o("sessions.sort.status")}],s=t.find(a=>a.key===e.sortKey)??t[0];return(0,n.jsxs)("details",{className:"sessions-sort-menu sect-sort-menu",children:[(0,n.jsx)("summary",{"aria-label":o("sessions.sort"),children:(0,n.jsxs)("span",{className:"sect-sort-value",children:[o("sessions.sort"),": ",s.label," ",e.sortDir==="asc"?"\u2191":"\u2193"]})}),(0,n.jsx)("div",{className:"sect-sort-pop",role:"menu",children:t.map(a=>(0,n.jsxs)("button",{type:"button",role:"menuitem","aria-current":a.key===e.sortKey?"true":void 0,onClick:()=>e.onSort(a.key),children:[a.label,a.key===e.sortKey?e.sortDir==="asc"?" \u2191":" \u2193":null]},a.key))})]})}function $o(e){let t=(0,c.useRef)(null);Mn(t,e.open);let[s,a]=(0,c.useState)(""),r=[{value:"",label:o("sessions.anyStatus")},...os.map(b=>({value:b,label:tn(b)}))],l=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],p=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],d=s.trim().toLowerCase(),g=d?se.filter(b=>b.toLowerCase().includes(d)):se,v=()=>{Un(ae(),!1),e.setFilters(()=>({q:e.filters.q,status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:!1,active:!0,cli:new Set(se)}))};return(0,n.jsxs)("dialog",{ref:t,className:"sessions-filter-drawer",onClose:e.onClose,onClick:b=>{b.target===b.currentTarget&&e.onClose()},children:[(0,n.jsxs)("header",{children:[(0,n.jsx)("h3",{children:o("sessions.filters.title")}),(0,n.jsx)(ve,{className:"card-act drawer-close-btn",icon:J.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("div",{className:"sessions-filter-drawer-body",children:[(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.status")}),(0,n.jsx)("select",{value:e.filters.status,onChange:b=>e.setFilters(h=>({...h,status:b.currentTarget.value})),children:r.map(b=>(0,n.jsx)("option",{value:b.value,children:b.label},b.value||"any"))})]}),(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.adopt")}),(0,n.jsx)("select",{value:e.filters.adopt,onChange:b=>e.setFilters(h=>({...h,adopt:b.currentTarget.value})),children:l.map(b=>(0,n.jsx)("option",{value:b.value,children:b.label},b.value||"any"))})]}),(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.location")}),(0,n.jsx)("select",{value:e.filters.chat,onChange:b=>e.setFilters(h=>({...h,chat:b.currentTarget.value})),children:p.map(b=>(0,n.jsx)("option",{value:b.value,children:b.label},b.value||"any"))})]}),(0,n.jsxs)("div",{className:"sessions-filter-field",children:[(0,n.jsx)("span",{className:"sessions-filter-label",children:o("sessions.cli")}),(0,n.jsxs)("div",{className:"sessions-filter-cli",children:[(0,n.jsx)("input",{type:"search",className:"sessions-filter-cli-search",placeholder:o("sessions.cliSearch"),value:s,onChange:b=>a(b.currentTarget.value)}),(0,n.jsxs)("div",{className:"sessions-filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>e.setFilters(b=>({...b,cli:new Set(se)})),children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>e.setFilters(b=>({...b,cli:new Set})),children:o("sessions.cliClear")})]}),(0,n.jsx)("div",{className:"sessions-filter-cli-list",children:g.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):g.map(b=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:b,checked:e.filters.cli.has(b),onChange:h=>{let L=h.currentTarget.checked;e.setFilters(P=>{let D=new Set(P.cli);return L?D.add(b):D.delete(b),{...P,cli:D}})}}),(0,n.jsx)("span",{children:b})]},b))})]})]}),(0,n.jsxs)("div",{className:"sessions-filter-toggles",children:[(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"multiBotTopics",checked:e.filters.multiBotTopics,onChange:b=>{let h=b.currentTarget.checked;e.setFilters(L=>({...L,multiBotTopics:h}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.multiBotTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"botTriggeredTopics",checked:e.filters.botTriggeredTopics,onChange:b=>{let h=b.currentTarget.checked;e.setFilters(L=>({...L,botTriggeredTopics:h}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.botTriggeredTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"showUnknownChats",checked:e.filters.showUnknownChats,onChange:b=>{let h=b.currentTarget.checked;Un(ae(),h),e.setFilters(L=>({...L,showUnknownChats:h}))}}),(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:b=>{let h=b.currentTarget.checked;e.setFilters(L=>({...L,active:h}))}}),(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.jsxs)("footer",{children:[(0,n.jsx)("button",{type:"button",className:"sessions-filter-clear",onClick:v,children:o("sessions.filters.clear")}),(0,n.jsx)("button",{type:"button",className:"primary sessions-filter-done",onClick:e.onClose,children:o("sessions.filters.done")})]})]})}function Ho(e){let[t,s]=(0,c.useState)(!1),a=[{value:"stalled",label:o("sessions.view.need")},{value:"working",label:o("sessions.view.work")},{value:"",label:o("sessions.view.all")}],r=[e.filters.status!=="",e.filters.adopt!=="",e.filters.chat!=="",e.filters.cli.size<se.length,e.filters.multiBotTopics,e.filters.botTriggeredTopics,e.filters.showUnknownChats,!e.filters.active].filter(Boolean).length;return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters sessions-toolbar",onSubmit:l=>l.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:l=>{let p=l.currentTarget.value;e.setFilters(d=>({...d,q:p}))}}),(0,n.jsx)("div",{className:"segmented sessions-quick-view",role:"group","aria-label":o("sessions.status"),children:a.map(l=>(0,n.jsx)("button",{type:"button","data-quick":l.value,className:e.filters.status===l.value?"active":void 0,"aria-pressed":e.filters.status===l.value,onClick:()=>e.setFilters(p=>({...p,status:l.value})),children:l.label},l.label))}),(0,n.jsxs)("button",{type:"button",className:`sessions-filter-btn${r>0?" has-active":""}`,"aria-haspopup":"dialog","aria-expanded":t,onClick:()=>s(!0),children:[o("sessions.filters.title"),r>0?(0,n.jsx)("span",{className:"sessions-filter-count",children:r}):null]}),(0,n.jsx)(Do,{sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort}),(0,n.jsx)(_o,{...e.idleCleanup}),(0,n.jsx)($o,{open:t,chatOptions:e.chatOptions,filters:e.filters,setFilters:e.setFilters,onClose:()=>s(!1)})]})}function Ko(e){let t=!!e.closeProgress||!!e.lockProgress,s=e.lockProgress?.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.lockSelected"),a=e.lockProgress&&!e.lockProgress.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.unlockSelected"),r=Xe();return(0,n.jsxs)("div",{id:"bulk-bar",className:"bulk-bar",hidden:e.selectedCount===0,children:[(0,n.jsx)("span",{id:"bulk-count",children:o("sessions.selectedCount",{count:e.selectedCount})}),r?(0,n.jsx)("button",{type:"button",id:"bulk-monitor-room",disabled:t||e.selectedCount===0,onClick:e.onAddToMonitorRoom,children:e.monitorRoomText??o("sessions.addToMonitorRoom")}):null,(0,n.jsx)("button",{type:"button",id:"bulk-lock",disabled:t||e.lockDisabled,onClick:()=>e.onLock(!0),children:s}),(0,n.jsx)("button",{type:"button",id:"bulk-unlock",disabled:t||e.unlockDisabled,onClick:()=>e.onLock(!1),children:a}),(0,n.jsx)("button",{type:"button",id:"bulk-close",className:"contrast",disabled:t,onClick:e.onClose,children:e.closeProgress?`${e.closeProgress.done}/${e.closeProgress.total}`:o("sessions.closeSelected")}),(0,n.jsx)("button",{type:"button",id:"bulk-clear",disabled:t,onClick:e.onClear,children:o("sessions.clearSelection")})]})}function _o(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(e.hours),[l,p]=(0,c.useState)(),d=(0,c.useRef)(null),g=(0,c.useRef)(null),v=(0,c.useRef)(null),b=e.countForHours(a);return(0,c.useEffect)(()=>{t?r(e.hours):p(void 0)},[t,e.hours]),(0,c.useLayoutEffect)(()=>{if(!t)return;let h=()=>{let P=g.current,D=v.current;if(!P||!D)return;let T=12,R=window.innerWidth,U=window.innerHeight,H=Math.max(0,Math.min(292,R-T*2)),O=P.getBoundingClientRect(),x=D.offsetHeight,K=Math.max(T,R-H-T),_=O.left+O.width/2-H/2,ne=Math.min(Math.max(_,T),K),q=O.bottom+8,j=O.top-x-8,Ce=q+x<=U-T||j<T?Math.min(Math.max(q,T),Math.max(T,U-x-T)):Math.max(T,j);p({left:ne,top:Ce,width:H})},L=window.requestAnimationFrame(h);return window.addEventListener("resize",h),window.addEventListener("scroll",h,!0),()=>{window.cancelAnimationFrame(L),window.removeEventListener("resize",h),window.removeEventListener("scroll",h,!0)}},[t,e.busy,e.status]),(0,c.useEffect)(()=>{if(!t)return;let h=P=>{let D=P.target;D instanceof Node&&d.current?.contains(D)||D instanceof Node&&v.current?.contains(D)||s(!1)},L=P=>{P.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",h,!0),document.addEventListener("keydown",L),()=>{document.removeEventListener("pointerdown",h,!0),document.removeEventListener("keydown",L)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${b===0?" is-empty":""}${t?" is-open":""}`,ref:d,children:[(0,n.jsxs)("button",{ref:g,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(h=>!h),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,cn.createPortal)((0,n.jsxs)("div",{ref:v,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:l??{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:b})]})]}),(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:No.map(h=>{let L=Wn(h.value),P=L===a;return(0,n.jsx)("button",{type:"button",className:P?"active":void 0,"aria-pressed":P?"true":"false",disabled:e.busy,onClick:()=>r(L),children:h.label},h.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||b===0,onClick:()=>{e.onRun(a).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function Fo(e){let t=(0,c.useRef)(null);(0,c.useLayoutEffect)(()=>{t.current&&(t.current.indeterminate=e.selectAllIndeterminate)},[e.selectAllIndeterminate]);let s=[{id:"botName",label:o("sessions.bot")},{id:"cliId",label:o("sessions.cli")},{id:"status",label:o("sessions.status")},{id:"chat",label:o("sessions.location")},{id:"tokenIn",label:o("sessions.tokenIn")},{id:"tokenOut",label:o("sessions.tokenOut")},{id:"title",label:o("sessions.titleCol")},{id:"workingDir",label:o("sessions.workingDir")},{id:"spawnedAt",label:o("sessions.created")},{id:"lastMessageAt",label:o("sessions.last")},{id:"adopt",label:o("sessions.adopt")}],a=s.filter(d=>!e.hiddenColumns.has(d.id)),r=2+a.length,l={select:o("sessions.selectSession"),botName:o("sessions.bot"),cliId:o("sessions.cli"),status:o("sessions.status"),chat:o("sessions.location"),tokenIn:o("sessions.tokenIn"),tokenOut:o("sessions.tokenOut"),title:o("sessions.titleCol"),workingDir:o("sessions.workingDir"),spawnedAt:o("sessions.created"),lastMessageAt:o("sessions.last"),adopt:o("sessions.adopt"),actions:o("sessions.actions")};function p(d,g){switch(g){case"botName":return(0,n.jsx)("td",{"data-label":l.botName,children:ge(d)});case"cliId":return(0,n.jsx)("td",{"data-label":l.cliId,children:(0,n.jsx)("span",{className:`badge cli-${Sn(d.cliId)}`,title:d.runtimeId&&d.runtimeId!==d.cliId?`${d.cliId} / ${d.runtimeId}`:void 0,children:dn(d)})});case"status":return(0,n.jsxs)("td",{"data-label":l.status,children:[(0,n.jsx)(En,{status:d.status}),(0,n.jsx)(lt,{row:d}),(0,n.jsx)(ct,{row:d})]});case"chat":return(0,n.jsx)("td",{className:"session-location-cell","data-label":l.chat,title:Qn(d),children:Fe(d)});case"tokenIn":return(0,n.jsx)("td",{className:"token-cell","data-label":l.tokenIn,children:Vn(d.tokenUsage?.in)});case"tokenOut":return(0,n.jsx)("td",{className:"token-cell","data-label":l.tokenOut,children:Vn(d.tokenUsage?.out)});case"title":return(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":l.title,title:String(d.title??""),children:pe(d.title??"").slice(0,48)});case"workingDir":return(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":l.workingDir,title:d.workingDir??"",children:String(d.workingDir??"").slice(-34)});case"spawnedAt":return(0,n.jsx)("td",{"data-label":l.spawnedAt,children:Ke(d.spawnedAt)});case"lastMessageAt":return(0,n.jsx)("td",{"data-label":l.lastMessageAt,children:Ke(d.lastMessageAt)});case"adopt":return(0,n.jsx)("td",{"data-label":l.adopt,children:d.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null});default:return null}}return(0,n.jsxs)("table",{id:"sessions-table",hidden:e.hidden,children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:(0,n.jsx)("input",{ref:t,type:"checkbox",id:"select-all",title:o("sessions.activeOnly"),checked:e.selectAllChecked,disabled:e.selectAllDisabled,onChange:d=>e.onSelectAll(d.currentTarget.checked)})}),a.map(d=>(0,n.jsx)(Eo,{sort:d.id,label:d.label,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},d.id)),(0,n.jsx)("th",{className:"session-table-columns-th",children:(0,n.jsxs)("details",{className:"session-table-columns-menu",children:[(0,n.jsxs)("summary",{title:o("sessions.columns"),children:[(0,n.jsx)("span",{className:"session-table-columns-icon","aria-hidden":"true",children:(0,n.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,n.jsx)("path",{d:"M2 4h12M2 8h12M2 12h12"})})}),o("sessions.columns")]}),(0,n.jsxs)("div",{className:"session-table-columns-dropdown",role:"menu",children:[(0,n.jsxs)("div",{className:"session-table-columns-header",children:[(0,n.jsx)("span",{children:o("sessions.columnsMenu")}),(0,n.jsx)("button",{type:"button",className:"session-table-columns-reset",onClick:e.onResetColumns,children:o("sessions.columnsReset")})]}),s.map(d=>(0,n.jsxs)("label",{className:"session-table-columns-item",children:[(0,n.jsx)("input",{type:"checkbox",checked:!e.hiddenColumns.has(d.id),onChange:()=>e.onToggleColumn(d.id)}),d.label]},d.id))]})]})})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(d=>{let g=d.status==="closed",v=String(d.sessionId);return(0,n.jsxs)("tr",{"data-id":v,onClick:()=>e.onOpen(d),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":l.select,onClick:b=>b.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(v),disabled:g,onChange:b=>e.onSelect(v,b.currentTarget.checked)})}),a.map(b=>(0,n.jsx)(c.Fragment,{children:p(d,b.id)},b.id)),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":l.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},v)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:r,className:"empty",children:o("sessions.empty")})})})]})}function Uo(e){let{exchange:t}=e,s=(0,c.useRef)(null),a=(0,c.useRef)(null),r=(0,c.useRef)(null),[l,p]=(0,c.useReducer)(ss,ts),d=l.open,[g,v]=(0,c.useState)(null),b=`session-exchange-tooltip-${(0,c.useId)().replace(/[^a-zA-Z0-9_-]/g,"-")}`,h=(0,c.useCallback)(()=>{r.current!==null&&(window.clearTimeout(r.current),r.current=null)},[]),L=(0,c.useCallback)(()=>{h(),p("open")},[h]),P=(0,c.useCallback)(()=>{h(),p("close"),v(null)},[h]),D=(0,c.useCallback)(()=>{h(),r.current=window.setTimeout(P,120)},[h,P]),T=(0,c.useCallback)(()=>{let R=s.current,U=a.current;if(!R||!U)return;let H=R.getBoundingClientRect(),O=U.getBoundingClientRect(),x=12,K=9,_=H.top-x-K,ne=window.innerHeight-H.bottom-x-K,q=_>=O.height||_>ne?"top":"bottom",j=H.left+H.width/2-O.width/2,Ce=Math.min(Math.max(j,x),Math.max(x,window.innerWidth-O.width-x)),Se=q==="top"?H.top-O.height-K:H.bottom+K,be=Math.min(Math.max(Se,x),Math.max(x,window.innerHeight-O.height-x));v({left:Ce,placement:q,top:be})},[]);return(0,c.useLayoutEffect)(()=>{if(d)return T(),window.addEventListener("resize",T),window.addEventListener("scroll",T,!0),()=>{window.removeEventListener("resize",T),window.removeEventListener("scroll",T,!0)}},[t.botFullText,t.userFullText,d,T]),(0,c.useEffect)(()=>()=>h(),[h]),(0,c.useEffect)(()=>{if(!d)return;let R=H=>{let O=H.target;O instanceof Node&&(s.current?.contains(O)||a.current?.contains(O)||P())},U=H=>{H.key==="Escape"&&P()};return document.addEventListener("pointerdown",R),document.addEventListener("keydown",U),()=>{document.removeEventListener("pointerdown",R),document.removeEventListener("keydown",U)}},[P,d]),!t.userText&&!t.botText?null:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"session-card-exchange-wrap",children:(0,n.jsxs)("div",{ref:s,className:"session-card-exchange",role:"button",tabIndex:0,"aria-label":o("sessions.preview.showFull"),"aria-haspopup":"dialog","aria-controls":d?b:void 0,"aria-expanded":d,onClick:R=>{R.stopPropagation(),d?P():L()},onFocus:()=>{h(),p("focus")},onBlur:D,onPointerEnter:R=>{R.pointerType!=="touch"&&L()},onPointerLeave:R=>{R.pointerType!=="touch"&&D()},onKeyDown:R=>{R.key==="Escape"?P():(R.key==="Enter"||R.key===" ")&&(R.preventDefault(),d?P():L())},children:[t.userText?(0,n.jsxs)("div",{className:"session-card-exchange-line",children:[(0,n.jsx)("span",{children:o("sessions.history.user")}),(0,n.jsx)("p",{children:t.userText})]}):null,t.botText?(0,n.jsxs)("div",{className:"session-card-exchange-line bot",children:[(0,n.jsx)("span",{children:o("sessions.history.bot")}),(0,n.jsx)("p",{children:t.botText})]}):null]})}),d&&typeof document<"u"?(0,cn.createPortal)((0,n.jsx)("div",{ref:a,id:b,className:"session-card-exchange-tooltip",role:"dialog","aria-label":o("sessions.preview.latestExchange"),"data-placement":g?.placement??"top",style:{left:g?.left??-1e4,top:g?.top??-1e4,visibility:g?"visible":"hidden"},onPointerEnter:h,onPointerLeave:R=>{R.pointerType!=="touch"&&D()},onFocusCapture:h,onBlur:R=>{let U=R.relatedTarget;U&&(a.current?.contains(U)||s.current?.contains(U))||D()},onKeyDown:R=>{R.key==="Escape"&&(R.stopPropagation(),h(),p("escape-refocus"),v(null),s.current?.focus())},children:(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-scroll",children:[t.userFullText?(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-line",children:[(0,n.jsx)("span",{children:o("sessions.history.user")}),(0,n.jsx)("div",{className:"session-card-exchange-md",dangerouslySetInnerHTML:de(tt(t.userFullText))})]}):null,t.botFullText?(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-line bot",children:[(0,n.jsx)("span",{children:o("sessions.history.bot")}),(0,n.jsx)("div",{className:"session-card-exchange-md",dangerouslySetInnerHTML:de(tt(t.botFullText))})]}):null]})}),document.body):null]})}function As(e){let t=e.row,s=pe(t.title)||t.sessionId,a=ge(t),r=_e(t),l=sn(t),p=Mo(t),d=Yn(t.workingDir),g=Cn(t),v=an(t)??(t.status==="closed"?"closed":"idle"),b=h=>{h.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,"data-signal":v,"aria-pressed":e.selected,onClick:b,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(ze({name:a,larkAppId:t.larkAppId,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-card-title",children:[(0,n.jsx)("strong",{title:String(t.title??s),children:String(s).slice(0,72)}),(0,n.jsxs)("span",{children:[a," \xB7 ",r??dn(t)]})]}),(0,n.jsxs)("span",{className:"session-card-status-group",children:[(0,n.jsx)(En,{status:t.status}),(0,n.jsx)(lt,{row:t}),(0,n.jsx)(ct,{row:t})]})]}),d!=="-"||t.adopt||p?(0,n.jsxs)("div",{className:"session-card-meta",children:[d!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:d}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,p?(0,n.jsx)("span",{className:"session-signal",title:p,children:p}):null]}):null,(0,n.jsx)(Uo,{exchange:g}),(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${Ke(hn(t))}`:`${o("sessions.last")}: ${Ke(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(Ro,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(Oo,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(ve,{action:"details",icon:J.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),xn(t)?(0,n.jsx)(ve,{action:"restart",icon:J.restart,label:o("sessions.restart"),onClick:h=>e.onRestart(t,h)}):null,(0,n.jsx)(xo,{row:t,url:l}),t.status!=="closed"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(ve,{action:"lock",icon:t.locked?J.unlock:J.lock,label:Tn(t),kind:t.locked?"locked":"",onClick:h=>e.onLock(t,!t.locked,h)}),(0,n.jsx)(ve,{action:"close",icon:J.close,label:o("sessions.close"),kind:"danger",onClick:h=>e.onClose(t,h)})]}):null]})]})}function jo(e){(0,c.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(qn.map(a=>[a.id,[]]));for(let a of e.rows){let r=an(a);r&&t.get(r).push(a)}let s=e.order.map(a=>qn.find(r=>r.id===a)).filter(a=>!!a);return(0,n.jsx)("div",{id:"sessions-board",className:`sessions-board${e.animated||e.hidden?"":" board-enter"}`,hidden:e.hidden,children:s.map((a,r)=>{let l=(t.get(a.id)??[]).sort((p,d)=>Lo(p,d,a.id));return(0,n.jsxs)("section",{className:`session-board-column session-board-${a.id}${e.dragColId===a.id?" dragging":""}${e.dragOverCol===a.id?" drag-over":""}`,"data-col":a.id,onDragOver:p=>{e.dragColId&&(p.preventDefault(),p.dataTransfer&&(p.dataTransfer.dropEffect="move"),e.dragColId!==a.id&&e.onDragOverCol(a.id))},onDrop:p=>{e.dragColId&&(p.preventDefault(),e.onMoveColumnTo(e.dragColId,a.id),e.onDragCol(null),e.onDragOverCol(null))},children:[(0,n.jsxs)("header",{draggable:!0,title:o("sessions.board.dragHint"),onDragStart:p=>{e.onDragCol(a.id),p.dataTransfer&&(p.dataTransfer.effectAllowed="move",p.dataTransfer.setData("text/plain",a.id))},onDragEnd:()=>{e.onDragCol(null),e.onDragOverCol(null)},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{children:o(a.labelKey)}),(0,n.jsx)("p",{children:o(a.hintKey)})]}),(0,n.jsxs)("span",{className:"session-board-head-right",children:[(0,n.jsxs)("span",{className:"session-board-move",children:[(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"-1","aria-label":o("sessions.board.moveLeft"),disabled:r===0,onClick:()=>e.onMoveColumn(a.id,-1),children:"\u2039"}),(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"1","aria-label":o("sessions.board.moveRight"),disabled:r===s.length-1,onClick:()=>e.onMoveColumn(a.id,1),children:"\u203A"})]}),(0,n.jsx)("span",{className:"session-board-count",children:l.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:l.length?l.map(p=>(0,n.jsx)(As,{row:p,selected:e.selected.has(p.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},p.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},a.id)})})}function Go(e){let t=pe(e.title).trim();return t||(e.kind==="thread"?o("sessions.topic.untitled"):e.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession"))}function zo(e){let t=(0,c.useMemo)(()=>In(e.rows),[e.rows]),s=(0,c.useMemo)(()=>new Map(In(e.relationRows??e.rows).map(a=>[a.key,a])),[e.relationRows,e.rows]);return(0,n.jsx)("div",{id:"sessions-topics",className:"sessions-topic-view",hidden:e.hidden,children:t.length?t.map(a=>{let r=s.get(a.key)??a,l=a.rows[0],p=Fe(l),d=Go(r),g=r.rootMessageId||r.chatId;return(0,n.jsxs)("section",{className:`session-topic-group${r.multiBot?" multi-bot":""}${r.inferredBotTriggered?" inferred-bot-trigger":""}`,"data-topic-key":a.key,children:[(0,n.jsxs)("header",{children:[(0,n.jsx)("span",{className:"session-topic-avatar",dangerouslySetInnerHTML:de(bn({chatId:a.chatId,name:p,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-topic-heading",children:[(0,n.jsx)("span",{className:"session-topic-location",children:p}),(0,n.jsx)("h2",{title:r.title,children:d}),(0,n.jsx)("code",{title:g,children:r.kind==="thread"?g:r.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession")})]}),(0,n.jsxs)("div",{className:"session-topic-summary","aria-label":o("sessions.topic.summary"),children:[r.multiBot?(0,n.jsx)("span",{className:"topic-chip collaboration",children:o("sessions.topic.collaboration")}):null,(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.sessions",{count:r.rows.length})}),(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.bots",{count:r.botCount})}),(0,n.jsx)("span",{className:"topic-chip active",children:o("sessions.topic.active",{count:r.activeCount})}),r.closedCount?(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.closed",{count:r.closedCount})}):null,r.inferredBotInputCount?(0,n.jsx)("span",{className:"topic-chip inferred",title:o("sessions.topic.inferredHint"),children:o("sessions.topic.botInputs",{count:r.inferredBotInputCount})}):null,(0,n.jsxs)("span",{className:"session-topic-updated",children:[o("sessions.last"),": ",Ke(r.latestActivityAt)]})]})]}),(0,n.jsx)("div",{className:"session-topic-members",children:a.rows.map(v=>(0,n.jsx)(As,{row:v,selected:e.selected.has(v.sessionId),onToggleSelect:b=>{b.status!=="closed"?e.onToggleSelect(b):e.onOpen(b)},onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},v.sessionId))})]},a.key)}):(0,n.jsx)("div",{className:"sessions-topic-empty",children:o("sessions.topic.empty")})})}function Jo(e){let t=e.message,s=t.senderType==="user",a=t.senderType==="app"||t.senderType==="bot",r=s?t.senderName||(e.ownerOpenId&&t.senderId===e.ownerOpenId?o("sessions.history.owner"):o("sessions.history.user")):t.senderName||String(t.senderId??"").slice(0,16)||o(a?"sessions.history.bot":"sessions.history.system"),l=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:de(ze({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:Ao(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:l})]})]})}function Xo(e){let t=(0,c.useRef)(null);Mn(t,!!e.state);let s=e.state?$e.sessions.get(e.state.sessionId):null,a=(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 l=a.current;l&&(l.scrollTop=l.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:l=>{l.target===l.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(ze({name:ge(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(pe(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)(ve,{id:"history-close",icon:J.close,label:o("sessions.dismiss"),onClick:e.onClose})})]}),(0,n.jsxs)("div",{className:"history-body",ref:a,children:[e.state.loading?(0,n.jsx)(Je,{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((l,p,d)=>(0,n.jsx)(Jo,{message:l,ownerOpenId:e.state?.ownerOpenId,groupStart:p===0||nt(d[p-1])!==nt(l)},l.messageId??p))}):null]})]}):null})}function Wo(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(""),l=(0,c.useRef)(null),p=pe(e.row.title)||e.row.sessionId;(0,c.useLayoutEffect)(()=>{if(!t||!l.current)return;let g=l.current;g.focus(),g.select(),(()=>{let b=getComputedStyle(g),h=document.createElement("span");h.style.cssText="position:absolute;visibility:hidden;white-space:pre",h.style.fontSize=b.fontSize,h.style.fontFamily=b.fontFamily,h.style.fontWeight=b.fontWeight,h.style.letterSpacing=b.letterSpacing,h.textContent=g.value||" ",document.body.appendChild(h);let L=Math.round(window.innerWidth*.6);g.style.width=`${Math.min(Math.max(h.offsetWidth+22,80),L)}px`,h.remove()})()},[t,a]);let d=g=>{let v=a.trim();s(!1),g&&v&&v!==p&&e.onRename(e.row,v)};return t?(0,n.jsx)("input",{ref:l,type:"text",className:"term-modal-name-input",maxLength:200,value:a,onChange:g=>r(g.currentTarget.value),onBlur:()=>d(!0),onKeyDown:g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),d(!0)):g.key==="Escape"&&(g.preventDefault(),d(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??p),children:String(p).slice(0,60)}),(0,n.jsx)(ve,{id:"term-modal-edit",icon:J.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(pe(e.row.title)||""),s(!0)}})]})}function Vo(e){let t=(0,c.useRef)(null);Mn(t,!!e.state);let s=e.state?$e.sessions.get(e.state.sessionId):null,a=s?sn(s):null,r=e.state?.url??a??"",l=s?dn(s):"",p=s?Yn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:d=>{d.target===d.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:de(ze({name:ge(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)(Wo,{row:s,onRename:e.onRename}),(0,n.jsx)(En,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:ge(s)}),(0,n.jsx)("span",{children:l}),p!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:p}):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:de(J.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:de(J.terminal)}),(0,n.jsx)(ve,{id:"term-modal-close",icon:J.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)(Je,{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 qo(e){let t=e.report;if(!t||t.status!=="ok"){let g=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",g]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let a=[t.meta?.asOf?o("sessions.insightAsOf",{asOf:String(t.meta.asOf)}):null,t.meta?.partial?o("sessions.insightPartial"):null].filter(Boolean),r=Array.isArray(t.suggestions)?t.suggestions:[],l=Array.isArray(t.spans)?t.spans:[],p=g=>g==="bad"||g==="warn"?"!":"i",d=g=>g==="error"?"!":g==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[a.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:a.join(" \xB7 ")}):null,(0,n.jsx)("p",{children:o("sessions.insightMetrics",{total:String(s.totalSpans??0),failed:String(s.failedSpans??0),slow:String(s.slowSpans??0),rw:s.readWriteRatio===null||s.readWriteRatio===void 0?"-":String(s.readWriteRatio),compactions:String(s.compactions??0)})}),r.length?(0,n.jsxs)("details",{open:!0,children:[(0,n.jsx)("summary",{children:o("sessions.insightSuggestions")}),(0,n.jsx)("ul",{style:{paddingLeft:18,margin:"6px 0"},children:r.map((g,v)=>(0,n.jsxs)("li",{children:[p(String(g.severity??""))," ",(0,n.jsx)("b",{children:String(g.title??"")})," - ",String(g.action??""),Array.isArray(g.evidence)&&g.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:g.evidence.join("; ")})]}):null]},v))})]}):null,l.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",l.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??l.length),total:String(t.meta.spansTotal??l.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:[...l].sort((g,v)=>(g.relStartMs??0)-(v.relStartMs??0)).map((g,v)=>{let b=[g.inputSummary,g.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:g.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:d(String(g.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(g.tool??"")})}),(0,n.jsx)("td",{children:String(g.phase??"")}),(0,n.jsx)("td",{children:Po(g.durationMs)}),(0,n.jsxs)("td",{children:["#",String(g.turnIndex??0)]}),(0,n.jsx)("td",{children:b})]},v)})})})})]}):null]})}function Yo(e){let[t,s]=(0,c.useState)(null);if((0,c.useEffect)(()=>s(null),[e.row.sessionId]),!He.authed)return null;let a=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),l=await r.json().catch(()=>({}));!l.ok||!l.report?s({loading:!1,error:String(l.error??r.status)}):s({loading:!1,report:l.report})}catch(r){s({loading:!1,error:String(r)})}};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"insight-btn",type:"button",disabled:t?.loading,onClick:()=>{a()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(Je,{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)(qo,{report:t.report}):null]})]})}function Zo(e){let t=(0,c.useRef)(null);Mn(t,!!e.row);let s=e.row,a=s?sn(s):null,r=!!s&&s.status==="closed",l=!!s&&!r&&!!a;return(0,n.jsx)("dialog",{id:"drawer",ref:t,onClose:e.onClose,onClick:p=>{p.target===p.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:pe(s.title)||s.sessionId}),(0,n.jsx)(ve,{id:"drawer-close",className:"card-act drawer-close-btn",icon:J.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(En,{status:s.status}),(0,n.jsx)(lt,{row:s}),(0,n.jsx)(ct,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(rt,{value:s.sessionId})]})]}),(0,n.jsxs)("div",{className:"drawer-body",children:[(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",ge(s)," \xB7 ",(0,n.jsxs)("b",{children:[o("sessions.cli"),":"]})," ",dn(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.location"),":"]})," ",Fe(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(rt,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(rt,{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.jsx)(Yo,{row:s})]}),(0,n.jsxs)("footer",{className:"drawer-foot",children:[(0,n.jsx)("div",{className:"drawer-foot-actions",children:r?(0,n.jsx)("button",{id:"resume-btn",type:"button",className:"primary drawer-btn-primary",onClick:async p=>{await e.resumeSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.resume")}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"takeover-btn",type:"button",className:"primary drawer-btn-primary",disabled:!l,title:l?void 0:o("sessions.openReadonlyTerminal"),onClick:p=>e.onTakeover(s,p.currentTarget),children:o("sessions.takeoverTerminal")}),xn(s)?(0,n.jsx)("button",{id:"restart-btn",type:"button",className:"drawer-btn-secondary",onClick:async p=>{await e.restartSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.restart")}):null,(0,n.jsx)("button",{id:"close-btn",type:"button",className:"drawer-btn-danger",onClick:async p=>{await e.closeSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.close")})]})}),(0,n.jsxs)("details",{className:"drawer-more",children:[(0,n.jsx)("summary",{"aria-label":o("sessions.more"),children:o("sessions.more")}),(0,n.jsxs)("div",{className:"drawer-more-pop",role:"menu",children:[(0,n.jsx)("button",{id:"history-drawer-btn",type:"button",role:"menuitem",onClick:()=>e.openHistory(s),children:o("sessions.history.title")}),on()&&!r?(0,n.jsx)("button",{id:"copy-cmd-btn",type:"button",role:"menuitem","data-tip":o("sessions.copyCommandHint"),onClick:p=>{cs(s,p.currentTarget)},children:o("sessions.copyCommand")}):null,(0,n.jsx)("button",{id:"lock-btn",type:"button",role:"menuitem",onClick:p=>{e.setSessionLocked(s,!s.locked,p.currentTarget)},children:Tn(s)}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)("span",{className:"drawer-more-item",children:(0,n.jsx)(Bo,{row:s,locateSession:e.locateSession})}):(0,n.jsx)("a",{className:"drawer-more-item drawer-more-link",href:s.feishuChatLink,target:"_blank",rel:"noopener",role:"menuitem",children:o("sessions.openChat")}),s.queued&&!r?(0,n.jsx)("button",{id:"start-btn",type:"button",role:"menuitem",onClick:async p=>{await e.startSession(s,p.currentTarget)&&e.onClose()},children:o("sessions.create.start")}):null]})]})]})]}):null})}function Qo(e){let t=e.state;(0,c.useEffect)(()=>{let f=e.dialog;return()=>{f.open&&f.close()}},[e.dialog]),(0,c.useEffect)(()=>{let f=e.dialog;if(t){if(!f.open)try{f.showModal()}catch{}}else f.open&&f.close()},[e.dialog,t]),(0,c.useEffect)(()=>{let f=e.dialog,N=()=>e.onClose(),M=$=>{$.target===f&&e.onClose()};return f.addEventListener("close",N),f.addEventListener("click",M),()=>{f.removeEventListener("close",N),f.removeEventListener("click",M)}},[e]);let[s,a]=(0,c.useState)(""),[r,l]=(0,c.useState)([]),[p,d]=(0,c.useState)(new Set),[g,v]=(0,c.useState)("lead"),[b,h]=(0,c.useState)(""),[L,P]=(0,c.useState)("in_progress"),[D,T]=(0,c.useState)(""),[R,U]=(0,c.useState)(""),[H,O]=(0,c.useState)(!1),[x,K]=(0,c.useState)(!1),[_,ne]=(0,c.useState)(()=>Et(ae())),[q,j]=(0,c.useState)(null),[Ce,Se]=(0,c.useState)([]),[be,Ie]=(0,c.useState)(""),[Me,Y]=(0,c.useState)(""),[Le,I]=(0,c.useState)(""),[E,F]=(0,c.useState)(""),[Te,he]=(0,c.useState)(!1),[V,Ne]=(0,c.useState)(!1),[W,Q]=(0,c.useState)(""),[ye,re]=(0,c.useState)(""),[ke,te]=(0,c.useState)(null),[Ue,oe]=(0,c.useState)(0),ue=(0,c.useRef)(null),me=(0,c.useRef)(1);(0,c.useEffect)(()=>{t&&(a(""),l([]),d(new Set),v("lead"),h(""),P("in_progress"),T(""),U(""),O(!1),K(!1),j(null),Y(""),I(""),F(""),Q(""),re(""),te(null),oe(0),me.current=1)},[t]),(0,c.useEffect)(()=>{if(!W)return;let f=!0,N=window.setInterval(()=>{fetch("/api/feed-groups").then(async M=>{let $=await M.json().catch(()=>({}));!M.ok||!$.ok||!f||(Se(Array.isArray($.groups)?$.groups:[]),Ie(typeof $.larkAppId=="string"?$.larkAppId:""),F(""),Q(""),re(""))}).catch(()=>{})},1e3);return()=>{f=!1,window.clearInterval(N)}},[W]),(0,c.useEffect)(()=>{if(!t||t.loading||t.success)return;let f=!0;return he(!0),fetch("/api/feed-groups").then(async N=>{let M=await N.json().catch(()=>({}));if(!N.ok||!M.ok)throw new Error(M.message??M.error??`HTTP ${N.status}`);f&&(Se(Array.isArray(M.groups)?M.groups:[]),Ie(typeof M.larkAppId=="string"?M.larkAppId:""),F(""))}).catch(N=>{f&&F(N instanceof Error?N.message:String(N))}).finally(()=>{f&&he(!1)}),()=>{f=!1}},[t]);let Ve=async()=>{let f=be?`?larkAppId=${encodeURIComponent(be)}`:"",N=await fetch(`/api/feed-groups/auth-url${f}`),M=await N.json().catch(()=>({}));if(!N.ok||!M.authUrl){B(M.error??`HTTP ${N.status}`,{kind:"error"});return}Q(String(M.authUrl)),re("")},qe=async f=>{Ne(!0);try{let N=await fetch("/api/feed-groups/oauth-callback",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({callbackUrl:f.trim()})}),M=await N.json().catch(()=>({}));if(!N.ok||!M.ok)throw new Error(M.message??M.error??`HTTP ${N.status}`);let $=await fetch("/api/feed-groups"),X=await $.json().catch(()=>({}));if(!$.ok||!X.ok)throw new Error(X.message??X.error??`HTTP ${$.status}`);Se(Array.isArray(X.groups)?X.groups:[]),Ie(typeof X.larkAppId=="string"?X.larkAppId:""),F(""),Q(""),re("")}catch(N){B(N instanceof Error?N.message:String(N),{kind:"error"})}finally{Ne(!1)}};if(!t)return null;if(t.success){let f=t.success,N=typeof f.shareLink=="string"&&f.shareLink?f.shareLink:"",M=Array.isArray(f.failed)?f.failed.length:0,$=Array.isArray(f.spawned)?f.spawned.length:0,X=f.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:[X,"\uFF08",$,"\uFF09"]}),M>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(M)})}):null,N?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:N,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)(Je,{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 ee=t.bots,we=[...p],Ye=we,Ln=f=>ee.find(N=>N.larkAppId===f)?.botName??f,xe=ke?ps(ee,ke.query).slice(0,8):[],je=f=>{if(!ke)return;let N=gs(s,ke,f.botName);a(N.text),te(null),oe(0),d(M=>new Set(M).add(f.larkAppId)),h(M=>M||f.larkAppId),requestAnimationFrame(()=>{let M=ue.current;M&&(M.focus(),M.setSelectionRange(N.caret,N.caret))})},un=f=>{if(!(!ke||xe.length===0)){if(f.key==="ArrowDown"||f.key==="ArrowUp"){f.preventDefault();let N=f.key==="ArrowDown"?1:-1;oe(M=>(M+N+xe.length)%xe.length);return}if(f.key==="Enter"||f.key==="Tab"){f.preventDefault(),je(xe[Math.min(Ue,xe.length-1)]);return}f.key==="Escape"&&(f.preventDefault(),te(null))}},Ae=async f=>{let N=[...f.clipboardData.files].filter(le=>le.type.startsWith("image/"));if(N.length===0)return;f.preventDefault();let M=f.currentTarget.selectionStart??s.length,$=f.currentTarget.selectionEnd??M,X=N.filter(le=>vo.has(le.type.toLowerCase()));if(X.length!==N.length){B(o("sessions.create.imageUnsupported"),{kind:"warning"});return}if(r.length+X.length>Es){B(o("sessions.create.imageCountLimit",{n:String(Es)}),{kind:"warning"});return}if(X.some(le=>le.size>Co)){B(o("sessions.create.imageSizeLimit"),{kind:"warning"});return}if(r.reduce((le,Re)=>le+Re.size,0)+X.reduce((le,Re)=>le+Re.size,0)>So){B(o("sessions.create.imageTotalLimit"),{kind:"warning"});return}try{let le=me.current,Re=await Promise.all(X.map(async(ie,Ge)=>{let Ee=await Io(ie),Ze=Ee.indexOf(",");if(Ze<0)throw new Error("bad_image_data");let ce=le+Ge;return{id:`${Date.now()}-${Ge}-${Math.random().toString(36).slice(2)}`,ordinal:ce,marker:`[${o("sessions.create.imageMarker",{n:String(ce)})}]`,name:ie.name||`pasted-image-${r.length+Ge+1}`,mimeType:ie.type.toLowerCase(),size:ie.size,dataBase64:Ee.slice(Ze+1),previewUrl:Ee}}));me.current+=Re.length;let Be=fs(s,M,$,Re.map(ie=>ie.marker));a(Be.text),l(ie=>[...ie,...Re]),te(null),requestAnimationFrame(()=>{let ie=ue.current;ie&&(ie.focus(),ie.setSelectionRange(Be.caret,Be.caret))})}catch{B(o("sessions.create.imageReadFailed"),{kind:"error"})}},An=async f=>{f.preventDefault();let N=s.trim();if(!N){B(o("sessions.create.errContent"),{kind:"warning"});return}if(we.length===0){B(o("sessions.create.errNoBot"),{kind:"warning"});return}let M=b||we[0]||"";if(g==="lead"&&(!M||!we.includes(M))){B(o("sessions.create.errLead"),{kind:"warning"});return}K(!0),j(null);try{let $=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:N,larkAppIds:we,mode:g,column:L,leadLarkAppId:g==="lead"?M:void 0,name:D.trim()||void 0,bindWorkingDir:R.trim()||void 0,feedGroupId:Me||void 0,newFeedGroupName:Le.trim()||void 0,feedGroupAppId:Me||Le.trim()?be:void 0,images:r.map(Pe=>({name:Pe.name,mimeType:Pe.mimeType,dataBase64:Pe.dataBase64}))})}),X=await $.json().catch(()=>null);$.ok&&X?.ok?_?(j(X),a(""),l([]),me.current=1,T("")):e.onSuccess(X):$.status!==401&&B(`${o("sessions.create.failed")}: ${X?.error??$.status}`,{kind:"error"})}catch($){B(`${o("sessions.create.failed")}: ${$}`,{kind:"error"})}finally{K(!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:An,children:[(0,n.jsxs)("fieldset",{className:"cs-content",children:[(0,n.jsx)("legend",{children:o("sessions.create.content")}),(0,n.jsxs)("div",{className:"cs-composer",children:[(0,n.jsx)("textarea",{ref:ue,name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),"aria-describedby":"cs-content-help",required:!0,value:s,onChange:f=>{let N=f.currentTarget,M=N.value;a(M),te(st(M,N.selectionStart??M.length)),oe(0)},onClick:f=>te(st(s,f.currentTarget.selectionStart??s.length)),onKeyDown:un,onPaste:f=>{Ae(f)},onBlur:()=>setTimeout(()=>te(null),0)}),ke?(0,n.jsx)("div",{className:"cs-mention-menu",role:"listbox","aria-label":o("sessions.create.mentionBots"),children:xe.length?xe.map((f,N)=>(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":N===Ue,className:N===Ue?"active":void 0,onMouseDown:M=>M.preventDefault(),onClick:()=>je(f),children:[(0,n.jsxs)("strong",{children:["@",f.botName]}),(0,n.jsx)("small",{children:f.larkAppId})]},f.larkAppId)):(0,n.jsx)("p",{children:o("sessions.create.noBotMatch")})}):null]}),(0,n.jsx)("small",{id:"cs-content-help",children:o("sessions.create.contentHelp")}),r.length?(0,n.jsx)("div",{className:"cs-image-list","aria-label":o("sessions.create.pastedImages"),children:r.map(f=>(0,n.jsxs)("figure",{className:"cs-image-item",children:[(0,n.jsx)("img",{src:f.previewUrl,alt:f.name}),(0,n.jsxs)("figcaption",{title:`${f.marker} ${f.name}`,children:[(0,n.jsx)("strong",{children:f.marker}),(0,n.jsx)("span",{children:f.name})]}),(0,n.jsx)("button",{type:"button",className:"cs-image-remove","aria-label":o("sessions.create.removeImage",{name:`${f.marker} ${f.name}`}),title:o("sessions.create.removeImage",{name:`${f.marker} ${f.name}`}),onClick:()=>{let N=r.filter($=>$.id!==f.id),M=bs(s,f.marker,N.map($=>$.marker),$=>`[${o("sessions.create.imageMarker",{n:String($+1)})}]`);a(M.text),l(N.map(($,X)=>({...$,ordinal:X+1,marker:M.markers[X]}))),me.current=N.length+1},children:(0,n.jsx)("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{d:"M7 7l10 10M17 7 7 17"})})})]},f.id))}):null]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),(0,n.jsx)(Ut,{bots:ee,selected:p,onToggle:(f,N)=>{d(M=>{let $=new Set(M);return N?$.add(f):$.delete(f),$.has(b)||h($.values().next().value??""),$})},searchPlaceholder:o("botPicker.searchPlaceholder"),noMatchLabel:o("botPicker.noMatch"),emptyLabel:o("sessions.create.noBots"),selectedCountLabel:f=>o("botPicker.selectedCount",{n:String(f)})})]}),(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:()=>v("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:g==="all",onChange:()=>v("all")})," ",o("sessions.create.modeAll")]}),(0,n.jsx)("small",{children:o("sessions.create.modeHelp")})]}),W?(0,n.jsx)("div",{className:"feed-group-auth-overlay",children:(0,n.jsxs)("section",{className:"feed-group-auth-card",role:"dialog","aria-modal":"true","aria-labelledby":"session-feed-group-auth-title",children:[(0,n.jsx)("h3",{id:"session-feed-group-auth-title",children:"\u6388\u6743\u98DE\u4E66\u6807\u7B7E"}),(0,n.jsxs)("p",{children:["\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\uFF0C\u5728\u98DE\u4E66\u9875\u9762\u786E\u8BA4\u6388\u6743\u3002\u5982\u679C BotMux \u4E0E\u6D4F\u89C8\u5668\u5728\u540C\u4E00\u53F0\u7535\u8111\uFF0C\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\u6388\u6743\u3002\u5982\u679C BotMux \u8FD0\u884C\u5728\u8FDC\u7A0B\u865A\u62DF\u673A\u4E0A\uFF0C\u6D4F\u89C8\u5668\u4F1A\u56E0\u65E0\u6CD5\u8BBF\u95EE\u672C\u673A\u5730\u5740 ",(0,n.jsx)("code",{children:"127.0.0.1:9768"})," \u800C\u663E\u793A\u201C\u65E0\u6CD5\u8BBF\u95EE\u201D\uFF1B\u6B64\u65F6\u8BF7\u590D\u5236\u5730\u5740\u680F\u4E2D\u7684\u5B8C\u6574\u94FE\u63A5\u5E76\u7C98\u8D34\u5230\u4E0B\u65B9\u3002"]}),(0,n.jsx)("button",{type:"button",className:"primary feed-group-auth-open",onClick:()=>window.open(W,"_blank","noopener"),children:"\u8DF3\u8F6C\u98DE\u4E66\u6388\u6743"}),(0,n.jsxs)("label",{children:[(0,n.jsx)("span",{children:"\u8BF7\u628A\u70B9\u51FB\u6388\u6743\u540E\u7684\u5B8C\u6574\u94FE\u63A5\u7C98\u8D34\u5728\u8FD9\u91CC"}),(0,n.jsx)("input",{type:"url",value:ye,placeholder:"http://127.0.0.1:9768/callback?code=\u2026&state=\u2026",onChange:f=>re(f.currentTarget.value)})]}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{Q(""),re("")},children:"\u53D6\u6D88"}),(0,n.jsx)("button",{type:"button",className:"primary",disabled:!ye.trim()||V,onClick:()=>{qe(ye)},children:V?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u5B8C\u6210\u6388\u6743"})]})]})}):null,(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:Ye.length===0,value:Ye.includes(b)?b:"",onChange:f=>h(f.currentTarget.value),children:Ye.length?Ye.map(f=>(0,n.jsx)("option",{value:f,children:Ln(f)},f)):(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:()=>P("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:()=>P("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${H?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":H,"aria-controls":"cs-advanced-fields",onClick:()=>O(f=>!f),children:o("sessions.create.optionalConfig")})}),H?(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:D,onChange:f=>T(f.currentTarget.value)})]}),(0,n.jsxs)("fieldset",{className:"cs-feed-group",children:[(0,n.jsx)("legend",{children:"\u98DE\u4E66\u6807\u7B7E\uFF08\u53EF\u9009\uFF09"}),(0,n.jsx)(Ft,{groups:Ce,selectedId:Me,newName:Le,disabled:Te||!!E,onChange:(f,N)=>{Y(f),I(N)}}),(0,n.jsx)("small",{children:"\u5C55\u5F00\u540E\u53EF\u5728\u7B2C\u4E00\u884C\u8F93\u5165\u65B0\u6807\u7B7E\u540D\u79F0\uFF0C\u6216\u9009\u62E9\u4E0B\u65B9\u5DF2\u6709\u6807\u7B7E\u3002"}),Te?(0,n.jsx)("small",{children:"\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6807\u7B7E\u2026"}):null,E?(0,n.jsxs)("div",{className:"cs-warn",children:[(0,n.jsx)("small",{children:E})," ",(0,n.jsx)("button",{type:"button",disabled:V,onClick:()=>{Ve()},children:V?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u7ACB\u5373\u6388\u6743"}),(0,n.jsx)("small",{children:" \u6388\u6743\u540E\u4F1A\u5F39\u7A97\u63D0\u793A\u4F60\u7C98\u8D34\u56DE\u8C03\u5730\u5740\u3002"})]}):null]}),(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:R,onChange:f=>U(f.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),q?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[q.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(q.failed)&&q.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(q.failed.length)})}`:""]}),typeof q.shareLink=="string"&&q.shareLink?(0,n.jsx)("a",{href:q.shareLink,target:"_blank",rel:"noopener",children:o("sessions.create.openChat")}):null]}):null,(0,n.jsxs)("div",{className:"actions cs-actions",children:[(0,n.jsxs)("label",{className:"cs-keep-open",title:o("sessions.create.keepOpenHelp"),children:[(0,n.jsx)("input",{type:"checkbox",name:"keepOpen",checked:_,onChange:f=>{let N=f.currentTarget.checked;ne(N),Mt(ae(),N)}}),(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:x||ee.length===0,children:x?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function ea(){return(0,n.jsx)("div",{className:"sessions-skeleton","aria-busy":"true","aria-label":o("sessions.loadingSessions"),children:[0,1,2,3].map(e=>(0,n.jsxs)("div",{className:"sessions-skeleton-col",children:[(0,n.jsx)("div",{className:"skel skel-head"}),(0,n.jsx)("div",{className:"skel skel-card"}),(0,n.jsx)("div",{className:"skel skel-card skel-card-short"}),(0,n.jsx)("div",{className:"skel skel-card"})]},e))})}function na(){Ot();let e=Gn(i=>[...i.sessions.values()]),t=Gn(i=>i.bootstrapped),[s,a]=(0,c.useState)(0),r=(0,c.useCallback)(()=>a(i=>i+1),[]),[l,p]=(0,c.useState)({q:"",status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:Nt(ae()),active:!0,cli:new Set(se)}),[d,g]=(0,c.useState)(new Set),[v,b]=(0,c.useState)("lastMessageAt"),[h,L]=(0,c.useState)("desc"),[P,D]=(0,c.useState)(()=>new Set(St(ae()))),[T,R]=(0,c.useState)(()=>Tt(ae())),[U,H]=(0,c.useState)(()=>xt(ae())),[O,x]=(0,c.useState)(!1),[K,_]=(0,c.useState)(null),[ne,q]=(0,c.useState)(null),[j,Ce]=(0,c.useState)(()=>Lt(ae())),Se=`${T}:${T==="kanban"?j:"-"}`,be=(0,c.useRef)(!0),[Ie,Me]=(0,c.useState)(0),[Y,Le]=(0,c.useState)([]),[I,E]=(0,c.useState)(null),[F,Te]=(0,c.useState)(!1),he=(0,c.useRef)(!1),[V,Ne]=(0,c.useState)(()=>{try{return window.localStorage.getItem(jn)??""}catch{return""}}),[W,Q]=(0,c.useState)({data:null,key:"",fetchedAt:0}),ye=(0,c.useRef)(!1),re=(0,c.useRef)(new Set),[ke,te]=(0,c.useState)(""),[Ue,oe]=(0,c.useState)(null),[ue,me]=(0,c.useState)(null),[Ve,qe]=(0,c.useState)(null),[ee,we]=(0,c.useState)(!1),[Ye,Ln]=(0,c.useState)(24),[xe,je]=(0,c.useState)(""),[un,Ae]=(0,c.useState)(null),[An,f]=(0,c.useState)(null),[N,M]=(0,c.useState)(null),[$,X]=(0,c.useState)(null),[Pe,le]=(0,c.useState)(null),[Re,Be]=(0,c.useState)(null),[ie,Ge]=(0,c.useState)(!1),Ee=(0,c.useRef)(0);(0,c.useLayoutEffect)(()=>{if(be.current){be.current=!1;return}Me(i=>i+1)},[Se]),(0,c.useEffect)(()=>{le(document.getElementById("create-session-modal"))},[]),(0,c.useEffect)(()=>{Pt().then(r)},[r]);let Ze=(0,c.useMemo)(()=>{let i=new Map;for(let u of e){let m=String(u.chatId??"").trim();if(!m||!l.showUnknownChats&&Zn(u))continue;let y=Fe(u);i.set(m,is(i.get(m),y,m))}return[...i.entries()].sort((u,m)=>u[1].localeCompare(m[1])).map(([u,m])=>({value:u,label:m}))},[l.showUnknownChats,s,e]);(0,c.useEffect)(()=>{l.chat&&(Ze.some(i=>i.value===l.chat)||p(i=>({...i,chat:""})))},[Ze,l.chat]);let ce=(0,c.useMemo)(()=>{let i=l.q.toLowerCase(),u=[...l.cli],m=u.length>0&&u.length<se.length,y=T==="kanban",w=l.multiBotTopics||l.botTriggeredTopics?new Set(In(e).filter(k=>!l.multiBotTopics||k.multiBot).filter(k=>!l.botTriggeredTopics||k.inferredBotTriggered).map(k=>k.key)):null,C=e.filter(k=>!m||u.includes(k.cliId??"unknown")).filter(k=>l.showUnknownChats||!Zn(k)).filter(k=>!l.status||k.status===l.status).filter(k=>!l.adopt||l.adopt==="yes"==!!k.adopt).filter(k=>!l.chat||String(k.chatId??"")===l.chat).filter(k=>!l.active||y||k.status!=="closed").filter(k=>!i||rs(k).includes(i));return w?C.filter(k=>w.has(et(k))).sort((k,G)=>Ls(k,G,v,h)):C.sort((k,G)=>Ls(k,G,v,h))},[l,s,h,v,e,T]),Pn=(0,c.useMemo)(()=>as(e),[e]),Oe=(0,c.useMemo)(()=>new Map(e.map(i=>[i.sessionId,i])),[e,s]),dt=(0,c.useMemo)(()=>ce.filter(i=>i.status!=="closed"),[ce]),Qe=(T==="table"||T==="topics"?ce:dt).filter(i=>i.status!=="closed"),ut=[...d].map(i=>Oe.get(i)).filter(i=>!!i&&i.status!=="closed"),mt=Qe.length>0&&Qe.every(i=>d.has(i.sessionId)),Ps=Qe.some(i=>d.has(i.sessionId))&&!mt;(0,c.useEffect)(()=>{g(i=>{let u=!1,m=new Set;for(let y of i){let w=Oe.get(y);w&&w.status!=="closed"?m.add(y):u=!0}return u?m:i})},[Oe]);let Bn=(0,c.useCallback)(i=>{let u=new Set;if(!i)return u;for(let m of i.groupChats)u.add(m);if(I)for(let[m,y]of I){if(u.has(m))continue;let w=!1;for(let C of i.botIds)if(y.botIds.has(C)){w=!0;break}if(w){for(let C of y.observedNames)if(i.botNames.has(C)){u.add(m);break}}}return u},[I]),gt=(0,c.useMemo)(()=>{if(T==="kanban"&&j==="team"){let i=Y.find(m=>m.key===V)??Y[0],u=Bn(i);return ce.filter(m=>u.has(String(m.chatId)))}return ce},[j,V,Y,ce,Bn,T]),On=(0,c.useCallback)(i=>Vt(gt,i),[gt]),Dn=(0,c.useCallback)(async()=>{if(!(he.current||F)){he.current=!0;try{let[i,u,m]=await Promise.all([fetch("/api/team/hosted").then(C=>C.json()).catch(()=>null),fetch("/api/team/remote-roster").then(C=>C.json()).catch(()=>null),fetch("/api/groups").then(C=>C.json()).catch(()=>null)]);Array.isArray(m?.chats)&&E(new Map(m.chats.map(C=>[String(C.chatId),{botIds:new Set((C.memberBots??[]).filter(k=>k.inChat).map(k=>String(k.larkAppId))),observedNames:new Set((C.observedBotNames??[]).map(k=>String(k)))}])));let y=C=>({ids:new Set(C.map(k=>String(k.larkAppId))),names:new Set(C.map(k=>String(k.name??"")).filter(Boolean))}),w=[];for(let C of i?.teams??[]){let{ids:k,names:G}=y(C.bots??[]);w.push({key:`local:${C.teamId}`,label:C.isDefault?o("team.myHostedTeam"):String(C.name??C.teamId),botIds:k,botNames:G,groupChats:new Set((C.groupChatIds??[]).map(z=>String(z)))})}for(let C of u?.memberships??[]){let{ids:k,names:G}=y(C.roster?.bots??[]);w.push({key:`${C.hubUrl}::${C.teamId}`,label:String(C.teamName??C.teamId??C.hubUrl),botIds:k,botNames:G,groupChats:new Set})}Le(w),Ne(C=>w.length&&!w.some(k=>k.key===C)?w[0].key:C)}finally{Te(!0),he.current=!1}}},[F]),pt=(0,c.useCallback)(async(i,u,m,y,w)=>{try{let k=i.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(i.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:u,column:m,position:y})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:i,sessionId:u,column:m,position:y})}),G=await k.json().catch(()=>({}));(!k.ok||G?.ok===!1)&&(Q(z=>{if(!z.data||z.key!==i)return z;let Z={...z.data.board};return w?Z[u]=w:delete Z[u],{...z,data:{...z.data,board:Z}}}),k.status!==401&&B(`${o("sessions.kanban.moveFail")}: ${G?.error??k.status}`,{kind:"error"}))}catch(C){Q(k=>{if(!k.data||k.key!==i)return k;let G={...k.data.board};return w?G[u]=w:delete G[u],{...k,data:{...k.data,board:G}}}),B(`${o("sessions.kanban.moveFail")}: ${C}`,{kind:"error"})}},[]),Bs=(0,c.useCallback)(async i=>{let u=W.key===i.key&&Date.now()-W.fetchedAt<3e4;if(!(ye.current||u)){ye.current=!0;try{let y=i.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(i.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(i.key)}`,w=await fetch(y),C=await w.json().catch(()=>({}));if(!w.ok||C?.ok===!1)return;let k=typeof C.deploymentId=="string"?C.deploymentId:null,G=[];for(let z of Array.isArray(C.reports)?C.reports:[])if(!(k&&z.deploymentId===k))for(let Z of Array.isArray(z.sessions)?z.sessions:[])G.push({...Z,remoteDeployment:z.deploymentName||z.deploymentId});Q({key:i.key,fetchedAt:Date.now(),data:{board:C.board&&typeof C.board=="object"?C.board:{},remoteRows:G}})}finally{ye.current=!1}}},[W.fetchedAt,W.key]);(0,c.useEffect)(()=>{T==="kanban"&&j==="team"&&!F&&Dn()},[j,F,Dn,T]),(0,c.useEffect)(()=>{let i=window.setInterval(()=>{T==="kanban"&&j==="team"&&(Q(u=>({...u,fetchedAt:0})),r())},3e4);return()=>window.clearInterval(i)},[j,r,T]);let ft=(0,c.useCallback)(async(i,u,m,y)=>{try{let w=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:u,position:m})}),C=await w.json().catch(()=>({}));(!w.ok||C?.ok===!1)&&(i.kanbanColumn=y.column,i.kanbanPosition=y.position,r(),w.status!==401&&B(`${o("sessions.kanban.moveFail")}: ${C?.error??w.status}`,{kind:"error"}))}catch(w){i.kanbanColumn=y.column,i.kanbanPosition=y.position,r(),B(`${o("sessions.kanban.moveFail")}: ${w}`,{kind:"error"})}},[r]),Os=(0,c.useCallback)(i=>{let u=!1;for(let m of i){let y=String(m.row.sessionId);if(!y||m.row.status==="closed"&&m.column!=="done")continue;if(j==="team"){let k=Y.find(Z=>Z.key===V)??Y[0];if(!k)continue;let z=(W.key===k.key&&W.data?W.data.board:{})[y];Q(Z=>{let wt=Z.key===k.key&&Z.data?Z.data:{board:{},remoteRows:Z.data?.remoteRows??[]},Qs={...wt.board,[y]:{column:m.column,position:m.position}};return{...Z,key:k.key,data:{...wt,board:Qs}}}),pt(k.key,y,m.column,m.position,z),u=!0;continue}let w=$e.sessions.get(y);if(!w)continue;let C={column:w.kanbanColumn,position:w.kanbanPosition};w.kanbanColumn=m.column,w.kanbanPosition=m.position,ft(w,m.column,m.position,C),u=!0}u&&r()},[j,V,Y,W,ft,pt,r]),bt=(0,c.useCallback)(async(i,u)=>{let m=i.title;i.title=u,r();try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:u})}),w=await y.json().catch(()=>({}));(!y.ok||w?.ok===!1)&&(i.title=m,r(),y.status!==401&&B(`${o("sessions.kanban.renameFail")}: ${w?.error??y.status}`,{kind:"error"}))}catch(y){i.title=m,r(),B(`${o("sessions.kanban.renameFail")}: ${y}`,{kind:"error"})}},[r]),$n=(0,c.useCallback)(async i=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/locate`,{method:"POST",headers:Dt()}),m=await u.json();return m.ok?!0:(B(`Locate failed: ${m.error??u.status}`,{kind:"error"}),!1)}catch(u){return B(`Locate error: ${u}`,{kind:"error"}),!1}},[]),mn=(0,c.useCallback)(async(i,u)=>{if(!await wn({title:"\u5173\u95ED\u4F1A\u8BDD",message:o("sessions.closeConfirm"),danger:!0}))return!1;u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/close`,{method:"POST"}),y=await m.json().catch(()=>({}));if(!m.ok||y?.ok===!1)return m.status!==401&&B(`Close failed: ${y?.error??m.status}`,{kind:"error"}),!1;let w=zn(y);return w&&B(_t(w)?`\u26A0\uFE0F Closed locally, but a credentialed host subtree could NOT be proven terminated: ${nn(w)}. The remote session WAS cancelled \u2014 inspect the local host process.`:`\u26A0\uFE0F Closed locally, but the remote session was NOT cancelled: ${nn(w)} \u2014 manual cleanup required.`,{kind:"warning"}),g(C=>{let k=new Set(C);return k.delete(i.sessionId),k}),r(),!0}catch(m){return B(`Close error: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[r]),gn=(0,c.useCallback)(async(i,u,m)=>{let y=!!i.locked;if(y===u)return!0;i.locked=u,r(),m&&(m.disabled=!0);try{let w=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:u})}),C=await w.json().catch(()=>({}));return!w.ok||C?.ok===!1?(i.locked=y,r(),w.status!==401&&B(`${o("sessions.lockFailed")}: ${C?.error??w.status}`,{kind:"error"}),!1):(i.locked=!!C.locked,r(),!0)}catch(w){return i.locked=y,r(),B(`${o("sessions.lockFailed")}: ${w}`,{kind:"error"}),!1}finally{m&&(m.disabled=!1)}},[r]),pn=(0,c.useCallback)(async(i,u)=>{if(re.current.has(i.sessionId)||!await wn({title:"\u91CD\u542F\u4F1A\u8BDD",message:ds(i),danger:!0}))return!1;u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/restart`,{method:"POST"}),y=await m.json().catch(()=>({}));return!m.ok||y?.ok===!1?(m.status!==401&&B(`${o("sessions.restartFailed")}: ${y?.message??y?.error??m.status}`,{kind:"error"}),!1):(re.current.add(i.sessionId),window.setTimeout(()=>re.current.delete(i.sessionId),5e3),!0)}catch(m){return B(`${o("sessions.restartFailed")}: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[]),Ds=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/resume`,{method:"POST"}),y=await m.json().catch(()=>({}));return!m.ok||y.ok===!1?(B(`${o("sessions.resumeFailed")}: ${y?.error??m.status}`,{kind:"error"}),!1):!0}catch(m){return B(`${o("sessions.resumeFailed")}: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[]),$s=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let m=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/start`,{method:"POST"}),y=await m.json().catch(()=>({}));return!m.ok||y.ok===!1?(m.status!==401&&B(`${o("sessions.create.startFailed")}: ${y?.error??m.status}`,{kind:"error"}),!1):!0}catch(m){return B(`${o("sessions.create.startFailed")}: ${m}`,{kind:"error"}),!1}finally{u&&(u.disabled=!1)}},[]),fn=(0,c.useCallback)(i=>{f({sessionId:i.sessionId,loading:!0,messages:[]}),(async()=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/history?limit=80`),m=await u.json().catch(()=>({}));if(!u.ok||m?.ok===!1){let w=String(m?.error??u.status),C=w==="not_found_yet"||w==="not_found";f(k=>k?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:w,stale:C}:k);return}let y=Array.isArray(m.messages)?m.messages:[];f(w=>w?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:y,ownerOpenId:m.ownerOpenId}:w)}catch(u){f(m=>m?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:String(u)}:m)}})()},[]),Hn=(0,c.useCallback)(i=>{if(!Xe())return;let u=sn(i);if(!u){Ae(i.sessionId);return}M({sessionId:i.sessionId,url:u,loading:!1})},[]),Hs=(0,c.useCallback)((i,u)=>{Nn(i,u)},[]),Ks=(0,c.useCallback)((i,u)=>{if(on()&&i.status!=="closed"){Nn(i,u);return}Hn(i)},[Hn]),_s=(0,c.useCallback)(async()=>{let i=[...d];if(i.length===0||!await wn({title:"\u5173\u95ED\u4F1A\u8BDD",message:o("sessions.closeBulkConfirm",{count:i.length}),danger:!0}))return;oe({done:0,total:i.length});let u=0,m=0,y=[],w=[...i];async function C(){for(;w.length;){let k=w.shift();try{let G=await fetch(`/api/sessions/${encodeURIComponent(k)}/close`,{method:"POST"}),z=await G.json().catch(()=>({}));if(!G.ok||z?.ok===!1)m+=1;else{let Z=zn(z);Z&&y.push(nn(Z))}}catch{m+=1}finally{u+=1,oe({done:u,total:i.length})}}}await Promise.all(Array.from({length:Math.min(6,i.length)},()=>C())),oe(null),g(new Set),r(),m>0&&B(`Failed: ${m}/${i.length}`,{kind:"error"}),y.length>0&&B(`\u26A0\uFE0F ${y.length}/${i.length} closed locally but left a residual requiring manual cleanup: ${y.join(", ")}`,{kind:"warning"})},[r,d]),Fs=(0,c.useCallback)(async i=>{let u=[...d].map(k=>Oe.get(k)).filter(k=>!!k&&k.status!=="closed"&&!!k.locked!==i);if(u.length===0)return;me({locked:i,done:0,total:u.length});let m=0,y=0,w=[...u];async function C(){for(;w.length;){let k=w.shift(),G=!!k.locked;try{let z=await fetch(`/api/sessions/${encodeURIComponent(k.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:i})}),Z=await z.json().catch(()=>({}));!z.ok||Z?.ok===!1?(y+=1,k.locked=G):k.locked=!!Z.locked}catch{y+=1,k.locked=G}finally{m+=1,me({locked:i,done:m,total:u.length})}}}await Promise.all(Array.from({length:Math.min(6,u.length)},()=>C())),me(null),r(),y>0&&B(`${o("sessions.lockFailed")}: ${y}/${u.length}`,{kind:"error"})},[r,Oe,d]),Us=(0,c.useCallback)(()=>{let i=[...d].filter(m=>!!Oe.get(m));if(i.length===0)return;let u=Xt(i);qe(o("sessions.monitorRoomAdded",{added:u.added,total:u.total})),window.setTimeout(()=>qe(null),1800)},[Oe,d]),js=(0,c.useCallback)(async i=>{let u=Wn(i);if(!u)return;let m=On(u);if(m.length!==0){Ln(u),we(!0),je(o("sessions.idleCleanupRunning"));try{let y=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:u,sessionIds:m.map(k=>k.sessionId)})}),w=await y.json().catch(()=>({}));if(!y.ok){y.status!==401&&B(`${o("sessions.idleCleanupFailed")}: ${w?.error??y.status}`,{kind:"error"}),je("");return}g(k=>{let G=new Set(k);for(let z of w?.results??[])z?.ok&&z?.sessionId&&G.delete(String(z.sessionId));return G}),je(o("sessions.idleCleanupDone",{closed:Number(w?.closed??0),failed:Number(w?.failed??0)}));let C=(w?.results??[]).filter(k=>k?.ok&&k?.residual).map(k=>nn(k.residual));C.length>0&&B(`\u26A0\uFE0F ${C.length} session(s) closed locally but left a residual requiring manual cleanup: ${C.join(", ")}`,{kind:"warning"}),r()}catch(y){B(`${o("sessions.idleCleanupFailed")}: ${y}`,{kind:"error"}),je("")}finally{we(!1)}}},[On,r]),Gs=i=>{let u=It(i)??"board";u!==T&&(R(u),Rt(ae(),u))},ht=(0,c.useCallback)(i=>{v===i?L(u=>u==="asc"?"desc":"asc"):(b(i),L(i==="spawnedAt"||i==="lastMessageAt"?"desc":"asc"))},[v]),zs=(i,u)=>{H(m=>{let y=m.indexOf(i),w=y+u;if(y<0||w<0||w>=m.length)return m;let C=[...m];return C.splice(y,1),C.splice(w,0,i),Fn(ae(),C),C})},Js=(i,u)=>{i!==u&&H(m=>{let y=m.indexOf(i),w=m.indexOf(u);if(y<0||w<0)return m;let C=[...m];return C.splice(y,1),C.splice(w,0,i),Fn(ae(),C),C})},Xs=(0,c.useMemo)(()=>({rows:ce,groupBy:j,teams:Y,teamsLoaded:F,teamKey:V,teamBoardData:W.data,teamBoardKey:W.key}),[j,V,Y,F,ce,W.data,W.key]),Ws=un?Oe.get(un)??null:null,Kn=(0,c.useMemo)(()=>F?Y.length?Y.map(i=>({value:i.key,label:i.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[Y,F]),Vs=!F||Y.length===0,yt=Y.some(i=>i.key===V)?V:Kn[0]?.value??"",qs=Kn.find(i=>i.value===yt)?.label??o("sessions.kanban.groupTeam"),Ys=(0,c.useCallback)(()=>{Ee.current+=1,Ge(!1),Be(null)},[]),kt=(0,c.useCallback)(async()=>{let i=Ee.current+1;Ee.current=i,Be({bots:[],loading:!0}),Ge(!0);try{let u=await us();if(Ee.current!==i)return;Be({bots:u})}finally{Ee.current===i&&Ge(!1)}},[]),Zs=(0,c.useCallback)(async()=>{let i=await Kt({title:o("sessions.debugTerminal"),message:o("sessions.debugTerminalPrompt")});if(i===null)return;let u=i.trim(),m=window.open("about:blank","_blank");m&&(m.opener=null);try{let y=await fetch("/api/debug-terminal",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u?{workingDir:u}:{})}),w=await y.json().catch(()=>({}));if(!y.ok||w?.ok===!1||!w?.url){m?.close(),y.status!==401&&B(`${o("sessions.debugTerminalFail")}: ${w?.error??y.status}`,{kind:"error"});return}m?m.location.href=w.url:window.open(w.url,"_blank","noopener")}catch(y){m?.close(),B(`${o("sessions.debugTerminalFail")}: ${y}`,{kind:"error"})}},[]);return(0,c.useEffect)(()=>{let i=()=>{Gt()&&He.authed&&kt()};return i(),window.addEventListener(Jn,i),()=>window.removeEventListener(Jn,i)},[]),(0,n.jsxs)("section",{className:"page sessions-page",children:[(0,n.jsxs)("div",{className:"page-heading",children:[(0,n.jsxs)("div",{className:"sessions-heading-main",children:[(0,n.jsx)("p",{className:"eyebrow",children:o("nav.sessions")}),(0,n.jsx)("h1",{children:o("sessions.title")}),(0,n.jsxs)("div",{className:"sessions-view-controls",children:[(0,n.jsx)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":o("sessions.viewMode"),children:[["kanban",o("sessions.viewKanban")],["board",o("sessions.viewBoard")],["topics",o("sessions.viewTopics")],["table",o("sessions.viewTable")]].map(([i,u])=>(0,n.jsx)("button",{type:"button","data-view":i,className:T===i?"active":void 0,"aria-pressed":T===i,onClick:()=>Gs(i),children:u},i))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${T==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":T!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([i,u])=>(0,n.jsx)("button",{type:"button","data-groupby":i,className:j===i?"active":void 0,"aria-pressed":j===i,onClick:()=>{Ce(i),At(ae(),i)},children:u},i))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(T==="kanban"&&j==="team"&&F),children:ke}),(0,n.jsx)(Ht,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(T==="kanban"&&j==="team"),disabled:Vs,label:qs,value:yt,options:Kn,onChange:i=>{if(Y.some(u=>u.key===i)){Ne(i);try{window.localStorage.setItem(jn,i)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[Xe()?(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=Wt()},children:o("sessions.monitorRoom")}):null,He.authed?(0,n.jsx)("button",{type:"button",className:"debug-terminal-btn",title:o("sessions.debugTerminalHint"),onClick:()=>{Zs()},children:o("sessions.debugTerminal")}):null,He.authed?(0,n.jsx)($t,{className:"page-primary-action create-session-btn",disabled:ie,onClick:()=>{kt()},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:Pn.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:Pn.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:Pn.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(Ho,{chatOptions:Ze,filters:l,setFilters:p,sortKey:v,sortDir:h,onSort:ht,idleCleanup:{busy:ee,hours:Ye,status:xe,countForHours:i=>On(i).length,onRun:js}}),(0,n.jsx)(Ko,{selectedCount:d.size,lockDisabled:!ut.some(i=>!i.locked),unlockDisabled:!ut.some(i=>!!i.locked),closeProgress:Ue,lockProgress:ue,monitorRoomText:Ve,onClear:()=>g(new Set),onClose:()=>{_s()},onAddToMonitorRoom:Us,onLock:i=>{Fs(i)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${Ie>0?" sessions-view-stage-enter":""}`,"data-view":T,"data-kanban-group":j,children:[t?null:(0,n.jsx)(ea,{}),(0,n.jsx)(Fo,{rows:ce,selected:d,hidden:T!=="table"||!t,sortKey:v,sortDir:h,selectAllChecked:mt,selectAllIndeterminate:Ps,selectAllDisabled:Qe.length===0,hiddenColumns:P,onToggleColumn:i=>{let u=!P.has(i),m=new Set(P);u?m.add(i):m.delete(i),_n(ae(),Array.from(m)),D(m),u&&i===v&&(b("lastMessageAt"),L("desc"))},onResetColumns:()=>{D(new Set),_n(ae(),[])},onOpen:i=>Ae(i.sessionId),onSelect:(i,u)=>g(m=>{let y=new Set(m);return u?y.add(i):y.delete(i),y}),onSelectAll:i=>g(u=>{let m=new Set(u);for(let y of Qe)i?m.add(y.sessionId):m.delete(y.sessionId);return m}),onSort:ht}),(0,n.jsx)(jo,{rows:dt,selected:d,hidden:T!=="board"||!t,order:U,animated:O,dragColId:K,dragOverCol:ne,onAnimated:()=>x(!0),onMoveColumn:zs,onMoveColumnTo:Js,onDragCol:_,onDragOverCol:q,onToggleSelect:i=>g(u=>{let m=new Set(u);return m.has(i.sessionId)?m.delete(i.sessionId):m.add(i.sessionId),m}),onOpen:i=>Ae(i.sessionId),onHistory:fn,onLocate:i=>$n(i),onRestart:(i,u)=>{pn(i,u)},onLock:(i,u,m)=>{gn(i,u,m)},onClose:(i,u)=>{mn(i,u)}}),(0,n.jsx)(zo,{rows:ce,relationRows:e,selected:d,hidden:T!=="topics"||!t,onToggleSelect:i=>g(u=>{let m=new Set(u);return m.has(i.sessionId)?m.delete(i.sessionId):m.add(i.sessionId),m}),onOpen:i=>Ae(i.sessionId),onHistory:fn,onLocate:i=>$n(i),onRestart:(i,u)=>{pn(i,u)},onLock:(i,u,m)=>{gn(i,u,m)},onClose:(i,u)=>{mn(i,u)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:X,className:`sessions-kanban${j==="bot"?" kanban-mode-bot":""}`,hidden:T!=="kanban"||!t,children:T==="kanban"?(0,n.jsx)(Rs,{host:$,...Xs,canRestartSession:xn,getTeamChatIds:Bn,icons:{details:J.details,feishu:J.feishu,history:J.history,key:J.key,lock:J.lock,restart:J.restart,close:J.close,terminal:J.terminal,unlock:J.unlock},lockActionLabel:Tn,sessionStatusText:tn,onClose:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&mn(m,u)},onDetails:i=>Ae(String(i.sessionId)),onHistory:fn,onMoveRows:Os,onNeedTeamBoard:i=>{Bs(i)},onNeedTeams:()=>{Dn()},onOpenTerminal:Xe()?Hn:void 0,onOpenWritableTerminal:Xe()&&on()?Hs:void 0,onRename:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&bt(m,u)},onRestart:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&pn(m,u)},onTeamScope:i=>te(i?o("sessions.kanban.teamScope",{chats:i.chats,sessions:i.sessions}):""),onToggleLock:(i,u)=>{let m=$e.sessions.get(String(i.sessionId));m&&gn(m,!m.locked,u)},onToggleSelect:i=>g(u=>{let m=String(i.sessionId),y=new Set(u);return y.has(m)?y.delete(m):y.add(m),y}),selectedSessionIds:d}):null})]},Ie),(0,n.jsx)(Zo,{row:Ws,onClose:()=>Ae(null),locateSession:$n,openHistory:fn,resumeSession:Ds,restartSession:pn,closeSession:mn,setSessionLocked:gn,startSession:$s,onTakeover:Ks}),(0,n.jsx)(Vo,{state:N,onClose:()=>M(null),onRename:bt}),(0,n.jsx)(Xo,{state:An,onClose:()=>f(null)}),Pe?(0,cn.createPortal)((0,n.jsx)(Qo,{dialog:Pe,state:Re,onClose:Ys,onSuccess:i=>Be(u=>u&&{...u,success:i})}),Pe):null]})}function ei(e){return Bt(e,(0,n.jsx)(na,{}))}export{Qa as CliFilterGroup,zo as TopicGroupsView,ei as renderSessionsPage};
|