botmux 3.12.1 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.runtime-build-id +1 -1
- package/dist/bot-registry.d.ts +7 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +46 -13
- package/dist/bot-registry.js.map +1 -1
- package/dist/core/config-dir.d.ts +167 -0
- package/dist/core/config-dir.d.ts.map +1 -0
- package/dist/core/config-dir.js +152 -0
- package/dist/core/config-dir.js.map +1 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +48 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/per-bot-env.d.ts.map +1 -1
- package/dist/core/per-bot-env.js +9 -0
- package/dist/core/per-bot-env.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +19 -2
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +44 -3
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +499 -63
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +26 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +64 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +301 -10
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +13 -6
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +8 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +16 -11
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/web/bot-multi-select.d.ts +33 -0
- package/dist/dashboard/web/bot-multi-select.d.ts.map +1 -0
- package/dist/dashboard/web/bot-multi-select.js +34 -0
- package/dist/dashboard/web/bot-multi-select.js.map +1 -0
- package/dist/dashboard/web/groups-page.d.ts +13 -0
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +25 -7
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +8 -4
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +15 -23
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +13 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +25 -0
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-HL655CNR.js → bot-defaults-page-NQJFJ45Z.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-BFUTTYVK.js → chunk-5QJB24I2.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-ELL53D62.js → chunk-6JTZJRQJ.js} +2 -2
- package/dist/dashboard-web/chunks/{chunk-5ZL7NLR5.js → chunk-CU4SUKK3.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-5PAYQ3KT.js → chunk-KEEYQ3WF.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-WLIVBPJC.js +1 -0
- package/dist/dashboard-web/chunks/{connectors-page-3QQACF23.js → connectors-page-HADHZXXZ.js} +1 -1
- package/dist/dashboard-web/chunks/groups-page-5TYF46RS.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-ZZ3JEJ6L.js → insights-page-EVGGJI5L.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-ROJ5GZ4N.js → monitor-room-HRGR2ENP.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-IATV7KJF.js → monitoring-page-LBU7TTTW.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-TYO5OIIT.js → office-page-DF6RRBMN.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-VJUULZF2.js → overview-page-ZB6QH2EX.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-7RJJKZGK.js → roles-page-ZBZGHIIF.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-JTEJ5IXW.js → schedules-page-NQVQC3QY.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-DXBCDWCS.js +8 -0
- package/dist/dashboard-web/chunks/{settings-page-7CTTFBRS.js → settings-page-E7NN4NVQ.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-57NZECJ3.js → skills-page-2QAVB2SA.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-6YYIMJG3.js → team-federation-page-VGWL53AE.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-ZGKBSBK3.js → v3-page-AY35LKCX.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-AACJF6DB.js → whiteboards-page-BNWUU4KG.js} +1 -1
- package/dist/dashboard-web/style.css +61 -53
- package/dist/features/codex-notifier/internal-turn.d.ts +1 -2
- package/dist/features/codex-notifier/internal-turn.d.ts.map +1 -1
- package/dist/features/codex-notifier/internal-turn.js +1 -13
- package/dist/features/codex-notifier/internal-turn.js.map +1 -1
- package/dist/i18n/en.js +2 -2
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.js +2 -2
- package/dist/i18n/zh.js.map +1 -1
- package/dist/platform/secure-host-file.d.ts +63 -0
- package/dist/platform/secure-host-file.d.ts.map +1 -1
- package/dist/platform/secure-host-file.js +90 -25
- package/dist/platform/secure-host-file.js.map +1 -1
- package/dist/services/async-trigger-store.d.ts +24 -4
- package/dist/services/async-trigger-store.d.ts.map +1 -1
- package/dist/services/async-trigger-store.js +81 -19
- package/dist/services/async-trigger-store.js.map +1 -1
- package/dist/services/codex-session-meta.d.ts +4 -0
- package/dist/services/codex-session-meta.d.ts.map +1 -0
- package/dist/services/codex-session-meta.js +15 -0
- package/dist/services/codex-session-meta.js.map +1 -0
- package/dist/services/idempotency-store.d.ts +18 -3
- package/dist/services/idempotency-store.d.ts.map +1 -1
- package/dist/services/idempotency-store.js +30 -12
- package/dist/services/idempotency-store.js.map +1 -1
- package/dist/services/traex-transcript.d.ts +7 -5
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +139 -33
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/services/trigger-types.d.ts +14 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +35 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +18 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/worker.js +35 -2
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-6ALR252E.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-SDZMJ7UV.js +0 -8
- package/dist/dashboard-web/chunks/sessions-page-KD7HDT3U.js +0 -8
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as g,d as m}from"./chunk-5THX4DI2.js";import{c as u}from"./chunk-7SZRL6FY.js";var r=u(g(),1),t=u(m(),1);function b(e){let a=(0,r.useRef)(null),l=(0,r.useRef)(null),f=e.groups.find(n=>n.groupId===e.selectedId)?.name,c=e.newName.trim()?`\u65B0\u5EFA\u6807\u7B7E\uFF1A${e.newName.trim()}`:f||"\u4E0D\u9009\u62E9\u6807\u7B7E";(0,r.useEffect)(()=>{let n=i=>{let o=a.current;o?.open&&(i.target instanceof Node&&o.contains(i.target)||(o.open=!1))},d=i=>{i.key==="Escape"&&a.current?.open&&(a.current.open=!1)};return document.addEventListener("pointerdown",n,!0),document.addEventListener("keydown",d),()=>{document.removeEventListener("pointerdown",n,!0),document.removeEventListener("keydown",d)}},[]),(0,r.useEffect)(()=>{e.disabled&&a.current?.open&&(a.current.open=!1)},[e.disabled]);let s=(n,d)=>{e.onChange(n,d),a.current?.removeAttribute("open"),queueMicrotask(()=>l.current?.focus())};return(0,t.jsxs)("details",{ref:a,className:`feed-group-picker${e.disabled?" is-disabled":""}`,children:[(0,t.jsx)("summary",{ref:l,"aria-label":`\u98DE\u4E66\u6807\u7B7E\uFF0C\u5F53\u524D\uFF1A${c}`,"aria-disabled":e.disabled||void 0,tabIndex:e.disabled?-1:void 0,onClick:n=>{e.disabled&&n.preventDefault()},children:(0,t.jsx)("span",{children:c})}),(0,t.jsxs)("div",{className:"feed-group-picker-pop",children:[(0,t.jsxs)("label",{className:"feed-group-picker-new",children:[(0,t.jsx)("span",{children:"\u65B0\u5EFA\u6807\u7B7E"}),(0,t.jsx)("input",{type:"text",maxLength:60,value:e.newName,placeholder:"\u8F93\u5165\u65B0\u6807\u7B7E\u540D\u79F0",onChange:n=>e.onChange("",n.currentTarget.value.trimStart()),onKeyDown:n=>{n.key==="Enter"&&n.preventDefault()}})]}),(0,t.jsx)("button",{type:"button","aria-current":!e.selectedId&&!e.newName.trim()?"true":void 0,onClick:()=>s("",""),children:"\u4E0D\u9009\u62E9\u6807\u7B7E"}),e.groups.map(n=>(0,t.jsx)("button",{type:"button","aria-current":e.selectedId===n.groupId&&!e.newName.trim()?"true":void 0,onClick:()=>s(n.groupId,""),children:n.name},n.groupId))]})]})}export{b as a};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{a as ve,b as be,c as ye,d as ke}from"./chunk-R3FXBFQH.js";import{a as he}from"./chunk-6ALR252E.js";import{a as me}from"./chunk-ZJVTGU5X.js";import{c as fe}from"./chunk-5PAYQ3KT.js";import{c as X,g as Y,h as le,m as ce,n as ue,o as de,p as pe,q as ge}from"./chunk-5CJMHTT4.js";import{A as ne,c as J,d as z,u as V,x as ae}from"./chunk-ELL53D62.js";import{a as se}from"./chunk-SYC6D5XU.js";import{a as Me,d as ie}from"./chunk-5THX4DI2.js";import{c as Z}from"./chunk-7SZRL6FY.js";var i=Z(Me(),1);var Oe=/^[A-Za-z0-9._-]{1,64}$/,Ie=6,we=30;function Q(o,t){return ye(o,t)}function Ce(o,t,r=we){let n=Number.isFinite(r)?Math.max(1,Math.floor(r)):we,a=o.length,c=Math.max(1,Math.ceil(a/n)),s=Number.isFinite(t)?Math.floor(t):1,u=Math.min(c,Math.max(1,s)),b=(u-1)*n,G=Math.min(a,b+n);return{rows:o.slice(b,G),page:u,totalPages:c,from:a===0?0:b+1,to:G,total:a}}async function Pe(o,t,r){if(o.length===0)return[];let n=new Array(o.length),a=0,c=Math.min(Math.max(1,t),o.length);return await Promise.all(Array.from({length:c},async()=>{for(;a<o.length;){let s=a++;n[s]=await r(o[s])}})),n}function ee(o){return Oe.test(o)&&o!=="."&&o!==".."}function te(o){let t=String(o??"").trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64);return ee(t)?t:"profile"}async function K(){let t=await(await fetch("/api/role-profiles")).json().catch(()=>({}));return Array.isArray(t.profiles)?t.profiles:[]}async function Se(o){let t=await K(),r=await Pe(t,Ie,async s=>{try{let b=await(await fetch(`/api/role-profiles/${encodeURIComponent(s.profileId)}`)).json().catch(()=>({}));return[s.profileId,Array.isArray(b.entries)?b.entries:[]]}catch{return[s.profileId,[]]}}),n=new Set,a=[];for(let s of o.chats??[])for(let u of s.memberBots??[]){if(!u?.inChat||!u?.hasRole||!u?.larkAppId)continue;let b=Q(u.larkAppId,s.chatId);n.has(b)||(n.add(b),a.push({chatId:s.chatId,larkAppId:u.larkAppId}))}let c=await ke(a);return{profiles:t,entriesById:new Map(r),groupRoleContentByBot:c,loaded:!0}}async function Ne(o){let t=(o.memberBots??[]).filter(r=>r?.inChat&&r?.larkAppId);return Pe(t,Ie,async r=>{try{let a=await(await fetch(`/api/roles/${encodeURIComponent(r.larkAppId)}/${encodeURIComponent(o.chatId)}`)).json().catch(()=>({})),c=a?.hasEffectiveRole??a?.hasRole,s="effectiveContent"in a?a.effectiveContent:a.content,u=c?String(s??"").trim():"",b=a?.effectiveSource==="chat"||a?.effectiveSource==="team"?a.effectiveSource:null;return{larkAppId:r.larkAppId,botName:r.botName,content:u,status:u?b??"chat":"empty"}}catch{return{larkAppId:r.larkAppId,botName:r.botName,content:"",status:"error"}}})}function Ge(o,t){return o.filter(r=>!t||!t.has(r.larkAppId))}function Re(o,t){let r=t.q.trim().toLowerCase();return o.filter(n=>!r||(n.name??"").toLowerCase().includes(r)||n.chatId.toLowerCase().includes(r)||(n.ownerId??"").toLowerCase().includes(r)).filter(n=>!t.missingOnly||(n.memberBots??[]).some(a=>!a.inChat))}function Ae(o,t){if(t.size===0)return!0;let r=o?.memberBots??[];for(let n of t)if(!r.some(a=>a.larkAppId===n&&a.inChat))return!1;return!0}function xe(o){let t=Array.isArray(o)?o:[],r=t.filter(n=>!!n?.ok).length;return{rows:t,okCount:r,failed:t.length-r}}function Be(o,t,r){let n=String(o??"").trim();if(!n)return null;if(r)return{kind:"warn",text:V("groups.roleProfileBootstrapFailed",{name:n,reason:String(r)})};let a=typeof t=="string"&&t.trim()?t.trim():"";return a?{kind:"ok",text:V("groups.roleProfileBootstrapSent",{name:n,messageId:a})}:{kind:"ok",text:V("groups.roleProfileBootstrapDone",{name:n})}}function Te(o,t,r,n,a){let c=new Set(n);a&&c.add(a);let s={chatId:t,name:r,ownerId:a??null,memberBots:o.bots.map(u=>({larkAppId:u.larkAppId,botName:u.botName,inChat:c.has(u.larkAppId),oncallChat:null}))};return{bots:o.bots,chats:[s,...o.chats.filter(u=>u.chatId!==t)]}}var e=Z(ie(),1);function Ee(){return{profiles:[],entriesById:new Map,groupRoleContentByBot:new Map,loaded:!1}}function De(o){let t={};for(let r of ae(o).split(";")){if(!r)continue;let n=r.indexOf(":");n<=0||(t[r.slice(0,n)]=r.slice(n+1))}return t}function Fe(o){let t=o.chat,r=t.avatar??ne(t.chatId),[n,a]=(0,i.useState)(!1);(0,i.useEffect)(()=>{a(!1)},[r]);let c=t.name??t.chatId,s=!!r&&!n;return(0,e.jsx)("span",{className:`orb-avatar orb-square orb-avatar-sm${s?" orb-has-img":""}`,style:De(c),"aria-hidden":"true",children:s?(0,e.jsx)("img",{className:"orb-img",src:r,alt:"",decoding:"async",referrerPolicy:"no-referrer",onError:()=>a(!0)}):null})}function oe(o){return(0,e.jsxs)("p",{className:"hint-warn",children:[(0,e.jsx)("strong",{children:o.title}),(0,e.jsx)("br",{}),(0,e.jsx)("small",{children:String(o.reason??"unknown")})]})}function $e(o){return(0,e.jsx)(e.Fragment,{children:Ge(o.bots,o.excludeIds).map(t=>(0,e.jsxs)("label",{className:"checkbox-row",children:[(0,e.jsx)("input",{type:"checkbox",name:"bot",value:t.larkAppId}),(0,e.jsxs)("span",{className:"checkbox-row-main",children:[(0,e.jsx)("strong",{children:t.botName??t.larkAppId}),(0,e.jsxs)("small",{children:["(",t.larkAppId,")"]})]})]},t.larkAppId))})}function Ue(o){let t=o.summary;return t.rows.length?(0,e.jsxs)("div",{className:t.failed?"hint-warn":"hint-ok",children:[(0,e.jsxs)("strong",{children:["\u6DFB\u52A0\u7ED3\u679C\uFF1A\u6210\u529F ",t.okCount,"/",t.rows.length,t.failed?`\uFF0C\u5931\u8D25 ${t.failed}`:""]}),(0,e.jsx)("ul",{children:t.rows.map((r,n)=>{let a=String(r?.id??"?");return(0,e.jsxs)("li",{children:[(0,e.jsx)("code",{children:a}),": ",r?.ok?"OK":`failed (${String(r?.error??"unknown")})`]},`${a}-${n}`)})})]}):(0,e.jsx)("p",{className:"hint-warn",children:"\u6CA1\u6709\u8FD4\u56DE\u6DFB\u52A0\u7ED3\u679C\u3002"})}function je(o){let{chat:t,context:r,tr:n}=o;if(!r.profiles.length||!r.loaded)return null;let a=new Map;for(let b of t.memberBots??[])b?.inChat&&a.set(b.larkAppId,r.groupRoleContentByBot.get(Q(b.larkAppId,t.chatId))??null);if(!ve(a))return null;let s=be(t.memberBots??[],r.profiles,r.entriesById,a)[0];if(!s)return(0,e.jsx)("div",{className:"g-profile-status muted",children:n("groups.profileStatusUnmatched")});let u=s.kind==="full"?"groups.profileStatusFullChat":"groups.profileStatusPartial";return(0,e.jsx)("div",{className:`g-profile-status ${s.kind}`,children:n(u,{name:s.profileId,matched:s.matched,total:s.total,chat:s.chatMatched})})}function He(o){return o?o.error?"error":o.inChat?"in":"out":"unknown"}function _e(o,t){switch(o){case"in":return t("groups.botStatusIn");case"out":return t("groups.botStatusOut");case"error":return t("groups.botStatusError");default:return t("groups.botStatusUnknown")}}function We(o){let t=new Map((o.chat.memberBots??[]).map(r=>[r.larkAppId,r]));return(0,e.jsx)("div",{className:"groups-bot-strip","aria-label":o.tr("groups.botCoverage"),children:o.bots.map(r=>{let n=t.get(r.larkAppId),a=He(n),c=_e(a,o.tr),s=r.botName??r.larkAppId;return(0,e.jsxs)("span",{className:`groups-bot-pill groups-bot-${a}`,title:`${s}: ${c}${n?.error?` (${String(n.error)})`:""}`,children:[(0,e.jsx)("i",{"aria-hidden":"true"}),(0,e.jsx)("span",{className:"groups-bot-name",children:s}),(0,e.jsx)("span",{className:"groups-bot-state",children:c})]},r.larkAppId)})})}var Je=(0,i.memo)(function(t){let{chat:r,tr:n}=t,c=(r.memberBots??[]).filter(s=>s.inChat).length;return(0,e.jsxs)(ue,{kind:"group",className:"groups-list-row","data-chat":r.chatId,children:[(0,e.jsx)(Fe,{chat:r}),(0,e.jsxs)(de,{children:[(0,e.jsxs)("div",{className:"groups-row-head",children:[(0,e.jsx)("b",{children:r.name??r.chatId}),(0,e.jsxs)("span",{className:"groups-row-meta",children:[(0,e.jsx)("span",{className:"groups-row-tag",children:(0,e.jsx)("code",{children:r.chatId})}),r.ownerId?(0,e.jsxs)("span",{className:"groups-row-tag groups-row-owner-tag",children:[(0,e.jsx)("span",{children:n("groups.owner")}),(0,e.jsx)("code",{children:r.ownerId})]}):null]})]}),(0,e.jsx)(je,{chat:r,context:t.roleContext,tr:n})]}),(0,e.jsx)("span",{className:"groups-row-count",children:n("groups.memberSummary",{count:c,total:t.bots.length})}),(0,e.jsxs)("div",{className:"groups-row-lower",children:[(0,e.jsx)(We,{chat:r,bots:t.bots,tr:n}),(0,e.jsxs)(pe,{children:[(0,e.jsx)(Y,{className:"add-bots",onClick:()=>t.onAddBots(r),children:n("groups.addBots")}),(0,e.jsx)("button",{className:"save-profile",type:"button",onClick:()=>t.onSaveProfile(r),children:n("groups.saveAsProfile")}),(0,e.jsx)("button",{className:"manage-chat",type:"button",onClick:()=>t.onManage(r),children:n("groups.manage")})]})]})]})});function qe(o){let{tr:t}=o,[r,n]=(0,i.useState)(!1),[a,c]=(0,i.useState)(null),[s,u]=(0,i.useState)(null),[b,G]=(0,i.useState)(!1),[p,y]=(0,i.useState)(""),[C,f]=(0,i.useState)([]),[I,v]=(0,i.useState)(""),[P,T]=(0,i.useState)(""),[O,x]=(0,i.useState)(""),[M,j]=(0,i.useState)(!0),[E,H]=(0,i.useState)(""),[A,$]=(0,i.useState)(!1),[D,_]=(0,i.useState)(""),[F,S]=(0,i.useState)("");(0,i.useEffect)(()=>{let h=!0;return fetch("/api/feed-groups").then(async g=>{let w=await g.json().catch(()=>({}));if(!g.ok||!w.ok)throw new Error(w.message??w.error??`HTTP ${g.status}`);h&&(f(Array.isArray(w.groups)?w.groups:[]),v(typeof w.larkAppId=="string"?w.larkAppId:""))}).catch(g=>{h&&H(g instanceof Error?g.message:String(g))}).finally(()=>{h&&j(!1)}),()=>{h=!1}},[]),(0,i.useEffect)(()=>{if(!D)return;let h=!0,g=window.setInterval(()=>{fetch("/api/feed-groups").then(async w=>{let R=await w.json().catch(()=>({}));!w.ok||!R.ok||!h||(f(Array.isArray(R.groups)?R.groups:[]),v(typeof R.larkAppId=="string"?R.larkAppId:""),H(""),_(""),S(""))}).catch(()=>{})},1e3);return()=>{h=!1,window.clearInterval(g)}},[D]);async function d(){let h=I?`?larkAppId=${encodeURIComponent(I)}`:"",g=await fetch(`/api/feed-groups/auth-url${h}`),w=await g.json().catch(()=>({}));if(!g.ok||!w.authUrl){c({title:"\u65E0\u6CD5\u53D1\u8D77\u6807\u7B7E\u6388\u6743",reason:w.error??`HTTP ${g.status}`});return}_(String(w.authUrl)),S("")}async function L(h){$(!0);try{let g=await fetch("/api/feed-groups/oauth-callback",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({callbackUrl:h.trim()})}),w=await g.json().catch(()=>({}));if(!g.ok||!w.ok)throw new Error(w.message??w.error??`HTTP ${g.status}`);let R=await fetch("/api/feed-groups"),l=await R.json().catch(()=>({}));if(!R.ok||!l.ok)throw new Error(l.message??l.error??`HTTP ${R.status}`);f(Array.isArray(l.groups)?l.groups:[]),v(typeof l.larkAppId=="string"?l.larkAppId:""),H(""),_(""),S("")}catch(g){c({title:"\u6807\u7B7E\u6388\u6743\u5931\u8D25",reason:g instanceof Error?g.message:String(g)})}finally{$(!1)}}async function U(h){h.preventDefault();let g=new FormData(h.currentTarget),w=String(g.get("name")??"").trim(),R=String(g.get("bindWorkingDir")??"").trim(),l=String(g.get("roleProfileId")??"").trim(),m=g.getAll("bot");if(m.length===0){c({title:"\u8BF7\u9009\u62E9 bot",reason:"\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A bot \u540E\u518D\u521B\u5EFA\u7FA4\u804A\u3002"});return}n(!0),c(null);try{let k=await fetch("/api/groups/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:w||void 0,larkAppIds:m,bindWorkingDir:R||void 0,roleProfileId:l||void 0,feedGroupId:P||void 0,newFeedGroupName:O||void 0,feedGroupAppId:P||O?I:void 0})}),N=await k.json().catch(()=>({ok:!1,error:`HTTP ${k.status}`}));N.ok&&N.chatId?(u(N),o.onCreated(N,m,w)):(c({title:"\u521B\u5EFA\u5931\u8D25",reason:N.error??`HTTP ${k.status}`}),n(!1))}catch(k){c({title:"\u7F51\u7EDC\u9519\u8BEF",reason:k}),n(!1)}}if(s){let h=String(s.chatId),g=typeof s.shareLink=="string"&&s.shareLink?s.shareLink:`https://applink.feishu.cn/client/chat/open?openChatId=${encodeURIComponent(h)}`,w=s.invalidBotIds??[],R=s.invalidUserIds??[],l=Array.isArray(s.oncallBindings)?s.oncallBindings:[],m=l.filter(B=>B?.ok).length,k=l.filter(B=>!B?.ok),N=Be(typeof s.roleProfileId=="string"?s.roleProfileId:"",s.roleProfileBootstrapMessageId,s.roleProfileBootstrapError);return(0,e.jsxs)("article",{className:"g-create-dialog g-create-success",children:[(0,e.jsx)("header",{children:(0,e.jsx)("h3",{children:t("groups.successTitle")})}),(0,e.jsxs)("p",{children:[(0,e.jsx)("b",{children:"chatId:"})," ",(0,e.jsx)("code",{children:h})," ",(0,e.jsx)("button",{type:"button","data-copy":h,onClick:()=>{me(h,t("sessions.copy")).then(B=>{B&&(G(!0),o.setTimer(()=>G(!1),800))})},children:t(b?"sessions.copied":"sessions.copy")})]}),(0,e.jsxs)("p",{children:[(0,e.jsx)("b",{children:"\u521B\u5EFA\u8005:"})," ",(0,e.jsx)("code",{children:String(s.creator??"?")})]}),s.feedGroupId?(0,e.jsxs)("p",{className:"hint-ok",children:["\u5DF2\u52A0\u5165\u98DE\u4E66\u6807\u7B7E",s.feedGroupName?`\u300C${String(s.feedGroupName)}\u300D`:"","\u3002"]}):null,s.feedGroupError?(0,e.jsxs)("p",{className:"hint-warn",children:["\u7FA4\u804A\u5DF2\u521B\u5EFA\uFF0C\u4F46\u6807\u7B7E\u8BBE\u7F6E\u5931\u8D25\uFF1A",String(s.feedGroupError)]}):null,(0,e.jsx)(ze,{resp:s}),l.length>0?k.length===0?(0,e.jsxs)("p",{className:"hint-ok",children:["\u5DF2\u7ED1\u5B9A\u76EE\u5F55\uFF1A",(0,e.jsx)("code",{children:String(s.bindResolvedPath??"")}),"\uFF08",m,"/",l.length," bots\uFF09"]}):(0,e.jsxs)("p",{className:"hint-warn",children:["\u76EE\u5F55\u7ED1\u5B9A\u90E8\u5206\u5931\u8D25\uFF1A\u6210\u529F ",m,"/",l.length,"\u3002",k.map((B,W)=>(0,e.jsxs)("span",{children:[(0,e.jsx)("br",{}),(0,e.jsx)("code",{children:String(B?.larkAppId??"?")}),": ",String(B?.error??"unknown")]},`${B?.larkAppId??"?"}-${W}`))]}):null,N?(0,e.jsx)("p",{className:N.kind==="ok"?"hint-ok":"hint-warn",children:N.text}):null,w.length||R.length?(0,e.jsxs)("ul",{children:[w.length?(0,e.jsxs)("li",{children:["\u65E0\u6548 bot id: ",(0,e.jsx)("code",{children:w.join(", ")})]}):null,R.length?(0,e.jsxs)("li",{children:["\u65E0\u6548\u7528\u6237 open_id: ",(0,e.jsx)("code",{children:R.join(", ")})]}):null]}):null,(0,e.jsxs)("div",{className:"actions",children:[(0,e.jsx)("button",{type:"button",id:"g-create-close",onClick:o.onClose,children:t("sessions.dismiss")}),(0,e.jsx)("a",{className:"btn-link primary",href:g,target:"_blank",rel:"noopener",children:t("groups.openGroup")})]})]})}return(0,e.jsxs)("article",{className:"g-create-dialog",children:[(0,e.jsxs)("header",{className:"g-create-head",children:[(0,e.jsx)("h3",{children:t("groups.createTitle")}),(0,e.jsx)("p",{children:t("groups.createHelp")})]}),(0,e.jsxs)("form",{id:"g-createform",className:"g-create-form",onSubmit:h=>{U(h)},children:[(0,e.jsxs)("fieldset",{className:"g-modal-field g-create-bots",children:[(0,e.jsx)("legend",{children:t("groups.botPicker")}),(0,e.jsx)("div",{className:"g-bot-picker",children:(0,e.jsx)($e,{bots:o.bots})})]}),(0,e.jsxs)("div",{className:"g-create-fields",children:[(0,e.jsxs)("fieldset",{className:"g-modal-field",children:[(0,e.jsx)("legend",{children:t("groups.name")}),(0,e.jsx)("input",{type:"text",name:"name",placeholder:t("groups.namePlaceholder"),maxLength:60})]}),(0,e.jsxs)("fieldset",{className:"g-modal-field",children:[(0,e.jsx)("legend",{children:t("groups.bindDir")}),(0,e.jsx)("input",{type:"text",name:"bindWorkingDir",placeholder:"e.g. ~/projects/botmux"}),(0,e.jsx)("small",{children:t("groups.bindDirHelp")})]}),(0,e.jsxs)("fieldset",{className:"g-modal-field g-profile-field",children:[(0,e.jsx)("legend",{children:t("groups.roleProfile")}),(0,e.jsx)("input",{type:"hidden",name:"roleProfileId",value:p}),(0,e.jsx)(ge,{className:"g-profile-menu",ariaLabel:t("groups.roleProfile"),label:p||t("groups.roleProfileNone"),value:p,options:[{value:"",label:t("groups.roleProfileNone")},...o.roleProfiles.map(h=>({value:h.profileId,label:h.profileId}))],onChange:y}),(0,e.jsx)("small",{children:t("groups.roleProfileHelp")})]}),(0,e.jsxs)("fieldset",{className:"g-modal-field g-feed-group-field",children:[(0,e.jsx)("legend",{children:"\u98DE\u4E66\u6807\u7B7E\uFF08\u53EF\u9009\uFF09"}),(0,e.jsx)("input",{type:"hidden",name:"feedGroupId",value:P}),(0,e.jsx)(he,{groups:C,selectedId:P,newName:O,disabled:M||!!E,onChange:(h,g)=>{T(h),x(g)}}),(0,e.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"}),M?(0,e.jsx)("small",{children:"\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6807\u7B7E\u2026"}):null,E?(0,e.jsxs)("div",{className:"hint-warn-inline",children:[(0,e.jsx)("small",{children:E})," ",(0,e.jsx)("button",{type:"button",disabled:A,onClick:()=>{d()},children:A?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u7ACB\u5373\u6388\u6743"}),(0,e.jsx)("small",{children:" \u6388\u6743\u540E\u4F1A\u5F39\u7A97\u63D0\u793A\u4F60\u7C98\u8D34\u56DE\u8C03\u5730\u5740\u3002"})]}):null,!M&&!E&&C.length===0?(0,e.jsx)("small",{children:"\u5F53\u524D\u6CA1\u6709\u6807\u7B7E\uFF0C\u53EF\u76F4\u63A5\u521B\u5EFA\u4E00\u4E2A\u3002"}):null]})]}),D?(0,e.jsx)("div",{className:"feed-group-auth-overlay",children:(0,e.jsxs)("section",{className:"feed-group-auth-card",role:"dialog","aria-modal":"true","aria-labelledby":"feed-group-auth-title",children:[(0,e.jsx)("h3",{id:"feed-group-auth-title",children:"\u6388\u6743\u98DE\u4E66\u6807\u7B7E"}),(0,e.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,e.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,e.jsx)("button",{type:"button",className:"primary feed-group-auth-open",onClick:()=>window.open(D,"_blank","noopener"),children:"\u8DF3\u8F6C\u98DE\u4E66\u6388\u6743"}),(0,e.jsxs)("label",{children:[(0,e.jsx)("span",{children:"\u8BF7\u628A\u70B9\u51FB\u6388\u6743\u540E\u7684\u5B8C\u6574\u94FE\u63A5\u7C98\u8D34\u5728\u8FD9\u91CC"}),(0,e.jsx)("input",{type:"url",value:F,placeholder:"http://127.0.0.1:9768/callback?code=\u2026&state=\u2026",onChange:h=>S(h.currentTarget.value)})]}),(0,e.jsxs)("div",{className:"actions",children:[(0,e.jsx)("button",{type:"button",onClick:()=>{_(""),S("")},children:"\u53D6\u6D88"}),(0,e.jsx)("button",{type:"button",className:"primary",disabled:!F.trim()||A,onClick:()=>{L(F)},children:A?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u5B8C\u6210\u6388\u6743"})]})]})}):null,(0,e.jsx)("div",{className:"g-create-status","data-create-status":!0,"aria-live":"polite",children:a?(0,e.jsx)(oe,{...a}):null}),(0,e.jsxs)("div",{className:"actions g-create-actions",children:[(0,e.jsx)("button",{type:"button",id:"g-create-cancel",onClick:o.onClose,children:t("groups.cancel")}),(0,e.jsx)("button",{type:"submit",className:"primary",disabled:r,children:r?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("i",{className:"button-spinner","aria-hidden":"true"}),t("groups.createSubmitting")]}):t("groups.createSubmit")})]})]})]})}function ze(o){let t=o.resp,r=t.autoInvitedOpenId,n=!!t.autoInviteRejected,a=t.ownerTransferredTo,c=t.transferError,s=t.notifyMessageId,u=t.notifyError;return r?(0,e.jsxs)("p",{className:"hint-ok",children:["\u5DF2\u81EA\u52A8\u9080\u8BF7\u4F60\uFF08",(0,e.jsx)("code",{children:r}),"\uFF09\u4F5C\u4E3A\u6210\u5458\u3002",a?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("br",{}),(0,e.jsx)("small",{children:"\u7FA4\u4E3B\u5DF2\u4ECE\u673A\u5668\u4EBA\u8F6C\u8BA9\u7ED9\u4F60\u3002"})]}):null,c?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("br",{}),(0,e.jsxs)("small",{className:"hint-warn-inline",children:["\u26A0 \u81EA\u52A8\u8F6C\u8BA9\u7FA4\u4E3B\u5931\u8D25\uFF08",c,"\uFF09\uFF0C\u4F60\u73B0\u5728\u662F\u6210\u5458\u4F46\u7FA4\u4E3B\u4ECD\u662F\u673A\u5668\u4EBA\u3002"]})]}):null,s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("br",{}),(0,e.jsxs)("small",{children:["\u673A\u5668\u4EBA\u5DF2\u5728\u7FA4\u91CC @ \u4E86\u4F60\uFF08\u6D88\u606F id ",(0,e.jsx)("code",{children:s}),"\uFF09\uFF0C\u770B\u98DE\u4E66\u901A\u77E5\u5C31\u80FD\u8FDB\u7FA4\u3002"]})]}):null,u?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("br",{}),(0,e.jsxs)("small",{className:"hint-warn-inline",children:["\u26A0 \u81EA\u52A8 @ \u901A\u77E5\u5931\u8D25\uFF08",u,"\uFF09\uFF0C\u65B0\u7FA4\u53EF\u80FD\u4E0D\u4F1A\u4E3B\u52A8\u51FA\u73B0\u5728\u4F60\u4FA7\u8FB9\u680F\uFF0C\u5EFA\u8BAE\u4ECE\u4E0B\u9762\u6309\u94AE\u8DF3\u8FDB\u53BB\u3002"]})]}):null]}):n?(0,e.jsxs)("p",{className:"hint-warn",children:["\u98DE\u4E66\u62D2\u7EDD\u4E86\u81EA\u52A8\u9080\u8BF7\uFF08\u4F60\u7684 open_id \u5728\u521B\u5EFA\u8005 bot \u7684 scope \u4E0B\u4E0D\u53EF\u7528\uFF09\u3002",(0,e.jsx)("strong",{children:"\u4F60\u76EE\u524D\u4E0D\u662F\u65B0\u7FA4\u6210\u5458"}),"\uFF0C\u9700\u8981\u8BA9\u7FA4\u91CC\u7684\u67D0\u4E2A\u673A\u5668\u4EBA\u624B\u52A8\u628A\u4F60\u52A0\u8FDB\u6765\u3002"]}):(0,e.jsxs)("p",{className:"hint-warn",children:["\u6CA1\u5728 dashboard \u7F13\u5B58\u91CC\u627E\u5230 ownerOpenId\uFF0C",(0,e.jsx)("strong",{children:"\u6CA1\u6709\u81EA\u52A8\u9080\u8BF7\u4F60"}),"\u3002\u70B9\u5F00\u4E0B\u9762\u94FE\u63A5\u524D\uFF0C\u5148\u8BA9\u7FA4\u91CC\u4EFB\u4E00\u673A\u5668\u4EBA\u624B\u52A8\u628A\u4F60\u52A0\u8FDB\u53BB\u3002"]})}function Ve(o){let{chat:t,tr:r}=o,[n,a]=(0,i.useState)(!1),[c,s]=(0,i.useState)(null),[u,b]=(0,i.useState)(null),G=(0,i.useMemo)(()=>new Set((t.memberBots??[]).filter(y=>y.inChat).map(y=>y.larkAppId)),[t]);async function p(y){y.preventDefault();let f=new FormData(y.currentTarget).getAll("bot");if(f.length===0){s({title:"\u8BF7\u9009\u62E9 bot",reason:"\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A bot \u540E\u518D\u6DFB\u52A0\u3002"}),b(null);return}a(!0),s(null),b(null);try{let v=await(await fetch(`/api/groups/${encodeURIComponent(t.chatId)}/add-bots`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({larkAppIds:f})})).json();if(v.error==="no_proxy_bot")s({title:"\u65E0\u6CD5\u6DFB\u52A0 bot",reason:"\u5F53\u524D\u7FA4\u91CC\u6CA1\u6709\u53EF\u4EE3\u7406\u64CD\u4F5C\u7684 bot\u3002\u8BF7\u5148\u5728\u98DE\u4E66\u91CC\u624B\u52A8\u62C9\u5165\u4E00\u4E2A bot\uFF0C\u7136\u540E\u91CD\u8BD5\u3002"});else if(v.result){let P=xe(v.result);try{await o.onReloadGroups({force:!0}),b({result:P})}catch(T){b({result:P,refreshError:`\u6DFB\u52A0\u7ED3\u679C\u5DF2\u8FD4\u56DE\uFF0C\u4F46\u5237\u65B0\u7FA4\u7EC4\u5217\u8868\u5931\u8D25\uFF1A${T}`})}}else s({title:"\u54CD\u5E94\u5F02\u5E38",reason:JSON.stringify(v)})}catch(I){s({title:"\u7F51\u7EDC\u9519\u8BEF",reason:I})}finally{a(!1)}}return(0,e.jsxs)("article",{className:"g-add-bots-dialog",children:[(0,e.jsx)("header",{children:(0,e.jsxs)("h3",{children:[r("groups.addBots")," \xB7 ",t.name??t.chatId]})}),(0,e.jsx)("p",{children:r("groups.createHelp")}),(0,e.jsxs)("form",{id:"g-addform",onSubmit:y=>{p(y)},children:[(0,e.jsx)($e,{bots:o.bots,excludeIds:G}),(0,e.jsxs)("div",{"data-add-status":!0,"aria-live":"polite",children:[c?(0,e.jsx)(oe,{...c}):null,u?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(Ue,{summary:u.result}),u.refreshError?(0,e.jsx)(oe,{title:"\u5237\u65B0\u5931\u8D25",reason:u.refreshError}):null]}):null]}),(0,e.jsxs)("div",{className:"actions",children:[(0,e.jsx)("button",{type:"button",id:"g-cancel",onClick:o.onClose,children:r("groups.cancel")}),(0,e.jsx)("button",{type:"submit",className:"primary",disabled:n,children:n?"Adding...":r("groups.addBots")})]})]})]})}function Ke(o){let{tr:t}=o,[r,n]=(0,i.useState)([]),[a,c]=(0,i.useState)([]),[s,u]=(0,i.useState)(!0),[b,G]=(0,i.useState)(null),p=(0,i.useMemo)(()=>[...a].sort((d,L)=>d.profileId.localeCompare(L.profileId)),[a]),y=p.length>0,C=r.filter(d=>d.status==="empty").length,f=r.filter(d=>d.status==="error").length,I=!s&&!b&&r.length>0&&f===0,[v,P]=(0,i.useState)("new"),[T,O]=(0,i.useState)(o.suggestedProfileId),[x,M]=(0,i.useState)(""),[j,E]=(0,i.useState)(!1),[H,A]=(0,i.useState)(null),$=v==="overwrite"?x:T.trim(),D=t(v==="overwrite"?"groups.saveProfileOverwriteSubmit":"groups.saveProfileSubmit"),_=b||(s?t("groups.saveProfilePreparing"):f?t("groups.saveProfileFailedLoadSummary",{count:f}):r.length?C?t("groups.saveProfileEntrySummaryWithEmpty",{count:r.length,emptyCount:C}):t("groups.saveProfileEntrySummary",{count:r.length}):t("groups.saveProfileNoRoles"));(0,i.useEffect)(()=>{let d=!0;return u(!0),G(null),A(null),(async()=>{try{let[L,U]=await Promise.all([Ne(o.chat),K().catch(()=>[])]);if(!d)return;let h=[...U].sort((g,w)=>g.profileId.localeCompare(w.profileId));n(L),c(U),M(g=>h.some(w=>w.profileId===g)?g:h[0]?.profileId??"")}catch(L){if(!d)return;n([]),c([]),M(""),G(L instanceof Error?L.message:String(L))}finally{d&&u(!1)}})(),()=>{d=!1}},[o.chat]);async function F(d){if(d.preventDefault(),!!I){if(!ee($)){A({text:t("groups.saveProfileInvalid"),className:"error"});return}E(!0),A({text:t("groups.saveProfileSaving")});try{let U=(await Promise.all(r.map(async h=>(await fetch(`/api/role-profiles/${encodeURIComponent($)}/${encodeURIComponent(h.larkAppId)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:h.content,allowEmpty:!0})})).ok))).filter(Boolean).length;if(U!==r.length){A({text:t("groups.saveProfileFailed",{saved:U,total:r.length}),className:"error"}),E(!1);return}A({text:t("groups.saveProfileDone",{name:$,count:U}),className:"ok"}),await o.onRefreshRoleContext(),o.setTimer(o.onClose,700)}catch(L){A({text:String(L),className:"error"}),E(!1)}}}function S(d){d==="overwrite"&&!y||(P(d),A(null))}return(0,e.jsxs)("article",{className:"g-save-profile-dialog",children:[(0,e.jsxs)("header",{children:[(0,e.jsx)("h3",{children:t("groups.saveProfileTitle")}),(0,e.jsx)("p",{children:t("groups.saveProfileIntro",{name:o.chat.name??o.chat.chatId,count:s?"-":r.length})})]}),(0,e.jsxs)("form",{id:"g-save-profile-form",onSubmit:d=>{F(d)},children:[(0,e.jsxs)("section",{className:"g-save-profile-panel",children:[(0,e.jsxs)("div",{className:"g-save-profile-section-head",children:[(0,e.jsx)("span",{children:t("groups.saveProfileScope")}),(0,e.jsx)("small",{children:t("groups.saveProfileScopeHelp")})]}),(0,e.jsxs)("div",{className:"g-save-profile-stats",children:[(0,e.jsxs)("span",{children:[t("groups.saveProfileBotCount")," ",(0,e.jsx)("strong",{children:s?"-":r.length})]}),f?(0,e.jsxs)("span",{className:"warn",children:[t("groups.saveProfileLoadFailed")," ",(0,e.jsx)("strong",{children:f})]}):null]}),(0,e.jsx)("div",{className:"g-save-profile-entry-list",children:s?(0,e.jsx)("div",{className:"g-save-profile-loading",children:(0,e.jsx)(X,{label:t("common.loading")})}):b?(0,e.jsx)("div",{className:"g-save-profile-empty",children:b}):r.length?r.map(d=>(0,e.jsxs)("div",{className:`g-save-profile-entry ${d.status==="error"?"error":""}`,children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("strong",{children:d.botName??d.larkAppId}),(0,e.jsx)("code",{children:d.larkAppId})]}),(0,e.jsx)("span",{className:`g-save-profile-entry-status ${d.status==="error"?"error":"ok"}`,children:t(d.status==="error"?"groups.saveProfileStatus.error":"groups.saveProfileStatus.entry")})]},d.larkAppId)):(0,e.jsx)("div",{className:"g-save-profile-empty",children:t("groups.saveProfileNoRoles")})})]}),(0,e.jsxs)("div",{className:"form-row",children:[(0,e.jsx)("span",{children:t("groups.saveProfileMode")}),(0,e.jsxs)("div",{className:"g-save-profile-switch",role:"tablist","aria-label":t("groups.saveProfileMode"),children:[(0,e.jsx)("button",{type:"button",className:v==="new"?"active":"","data-save-profile-mode":"new","aria-pressed":v==="new",onClick:()=>S("new"),children:t("groups.saveProfileNew")}),(0,e.jsx)("button",{type:"button",className:v==="overwrite"?"active":"","data-save-profile-mode":"overwrite","aria-pressed":v==="overwrite",disabled:!y,onClick:()=>S("overwrite"),children:t("groups.saveProfileOverwrite")})]})]}),(0,e.jsxs)("label",{className:"form-row","data-profile-mode-row":"new",hidden:v!=="new",children:[(0,e.jsx)("span",{children:t("groups.saveProfileIdLabel")}),(0,e.jsx)("input",{type:"text",name:"profileId",value:T,maxLength:64,autoComplete:"off",onChange:d=>{O(d.currentTarget.value),A(null)}}),(0,e.jsx)("small",{children:t("groups.saveProfileInvalid")})]}),(0,e.jsxs)("div",{className:"form-row","data-profile-mode-row":"overwrite",hidden:v!=="overwrite",children:[(0,e.jsx)("span",{children:t("groups.saveProfileExistingLabel")}),y?(0,e.jsx)("div",{className:"g-save-profile-picker",children:p.map(d=>(0,e.jsxs)("button",{type:"button",className:`g-save-profile-pick ${d.profileId===x?"selected":""}`,"data-profile-id":d.profileId,"aria-pressed":d.profileId===x,onClick:()=>{M(d.profileId),P("overwrite"),A(null)},children:[(0,e.jsx)("span",{children:d.profileId}),(0,e.jsx)("small",{children:t("groups.saveProfileExistingMeta",{count:d.entryCount??0})})]},d.profileId))}):(0,e.jsx)("div",{className:"g-save-profile-summary warn",children:t("groups.saveProfileExistingEmpty")}),(0,e.jsx)("small",{children:t("groups.saveProfileOverwriteHelp")})]}),(0,e.jsxs)("div",{className:"g-save-profile-target",children:[(0,e.jsx)("span",{children:t("groups.saveProfileTarget")}),(0,e.jsx)("code",{"data-save-profile-target":!0,children:$||"-"}),(0,e.jsx)("small",{"data-save-profile-target-mode":!0,children:t(v==="overwrite"?"groups.saveProfileTargetOverwrite":"groups.saveProfileTargetNew")})]}),(0,e.jsx)("div",{className:`g-save-profile-summary ${I?"":"warn"}`,children:_}),(0,e.jsx)("div",{className:`g-save-profile-status ${H?.className??""}`,"data-save-profile-status":!0,children:H?.text??""}),(0,e.jsxs)("div",{className:"actions",children:[(0,e.jsx)("button",{type:"button",id:"g-save-profile-cancel",onClick:o.onClose,children:t("groups.cancel")}),(0,e.jsx)("button",{type:"submit",className:"primary",disabled:!I||j||v==="overwrite"&&!x,children:j?t("groups.saveProfileSaving"):D})]})]})]})}function Ze(o){let{member:t,tr:r}=o,n=(0,i.useRef)(null),[a,c]=(0,i.useState)(!!t.oncallChat),[s,u]=(0,i.useState)(t.oncallChat?.workingDir??""),[b,G]=(0,i.useState)(!1),[p,y]=(0,i.useState)(null);async function C(){y(null);let f=s.trim();if(a&&!f){y({text:r("groups.needWorkingDir"),className:"hint-warn-inline"});return}G(!0);try{let I=`/api/groups/${encodeURIComponent(o.chat.chatId)}/oncall/${encodeURIComponent(t.larkAppId)}`,v=a?await fetch(I,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({workingDir:f})}):await fetch(I,{method:"DELETE"}),P=await v.json().catch(()=>({}));if(v.ok&&P.ok){y({text:a?`\u2713 \u5DF2\u7ED1\u5B9A \u2192 ${P.resolvedPath??f}`:"\u2713 \u5DF2\u89E3\u7ED1",className:"hint-ok"});try{await o.onSaved()}catch{}}else y({text:`\u2717 ${P.error??v.status}`,className:"hint-warn-inline"})}catch(I){y({text:`\u2717 ${I?.message??I}`,className:"hint-warn-inline"})}finally{G(!1)}}return(0,e.jsxs)("div",{className:"oncall-row","data-bot":t.larkAppId,children:[(0,e.jsxs)("label",{className:"checkbox-row",children:[(0,e.jsx)("input",{type:"checkbox","data-action":"toggle",checked:a,onChange:f=>{c(f.currentTarget.checked),f.currentTarget.checked&&window.setTimeout(()=>n.current?.focus(),0)}}),(0,e.jsx)("strong",{children:t.botName??t.larkAppId}),(0,e.jsxs)("small",{children:["(",t.larkAppId,")"]})]}),(0,e.jsxs)("div",{className:"oncall-row-body",children:[(0,e.jsx)("input",{ref:n,type:"text","data-input":"workingDir",placeholder:"e.g. /root/iserver/botmux",value:s,disabled:!a,onChange:f=>u(f.currentTarget.value)}),(0,e.jsx)("button",{type:"button","data-action":"save",disabled:b,onClick:()=>{C()},children:r("groups.save")}),(0,e.jsx)("span",{className:`oncall-status ${p?.className??""}`,"data-status":!0,children:p?.text??""})]})]})}function Xe(o){let{chat:t,tr:r}=o,n=(t.memberBots??[]).filter(p=>p.inChat),a=typeof t.ownerId=="string"?t.ownerId:"",[c,s]=(0,i.useState)(()=>new Set);function u(p,y){s(C=>{let f=new Set(C);return y?f.add(p):f.delete(p),f})}async function b(){let p=[...c];if(p.length===0){alert("\u81F3\u5C11\u9009\u4E00\u4E2A\u673A\u5668\u4EBA");return}if(confirm(`\u786E\u5B9A\u8BA9 ${p.length} \u4E2A\u673A\u5668\u4EBA\u9000\u51FA\u7FA4\u804A\uFF1F\u8BE5 bot \u5728\u6B64\u7FA4\u7684\u4F1A\u8BDD\u4F1A\u4E00\u5E76\u5173\u95ED\u3002`))try{let C=await(await fetch(`/api/groups/${encodeURIComponent(t.chatId)}/leave`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({larkAppIds:p})})).json(),f=(C.result??[]).map(I=>{if(!I.ok)return`${I.larkAppId}: \u5931\u8D25 (${I.error??"unknown"})`;let v=I.closedSessions??[],P=v.filter(x=>!x.ok).length,T=v.length-P,O=v.length===0?"":P===0?`\uFF08\u5173\u95ED ${T} \u4E2A\u4F1A\u8BDD\uFF09`:`\uFF08\u5173\u95ED ${T} \u4E2A\uFF0C${P} \u4E2A\u5931\u8D25\uFF09`;return`${I.larkAppId}: OK${O}`}).join(`
|
|
2
|
-
`);alert(f||`Unexpected: ${JSON.stringify(C)}`),await o.onReloadGroups({force:!0})}catch(y){alert("Network error: "+y)}finally{o.onClose()}}async function G(){if(n.length===0||!confirm(`\u786E\u5B9A\u89E3\u6563\u7FA4\u804A\u300C${t.name??t.chatId}\u300D\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\uFF0C\u672C\u7FA4\u6240\u6709\u673A\u5668\u4EBA\u4F1A\u8BDD\u4E5F\u4F1A\u4E00\u5E76\u5173\u95ED\u3002`))return;let p=[...n].sort((C,f)=>(f.larkAppId===a?1:0)-(C.larkAppId===a?1:0)),y=[];for(let C of p)try{let f=await fetch(`/api/groups/${encodeURIComponent(t.chatId)}/disband`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({larkAppId:C.larkAppId})}),I=await f.json();if(I.ok){let v=I.closedSessions??[],P=v.filter(x=>!x.ok).length,T=v.length-P,O=v.length===0?"":P===0?`
|
|
3
|
-
\u5173\u95ED\u4E86 ${T} \u4E2A\u4F1A\u8BDD\u3002`:`
|
|
4
|
-
\u5173\u95ED\u4E86 ${T} \u4E2A\u4F1A\u8BDD\uFF0C${P} \u4E2A\u4F1A\u8BDD\u5173\u95ED\u5931\u8D25\u3002`;alert(`\u5DF2\u89E3\u6563\uFF08\u7531 ${C.botName??C.larkAppId} \u6267\u884C\uFF09${O}`),await o.onReloadGroups({force:!0}),o.onClose();return}y.push(`${C.botName??C.larkAppId}: ${I.error??f.status}`)}catch(f){y.push(`${C.botName??C.larkAppId}: ${f}`)}alert(`\u6240\u6709\u5728\u7FA4\u673A\u5668\u4EBA\u5747\u65E0\u6CD5\u89E3\u6563\uFF1A
|
|
5
|
-
${y.join(`
|
|
6
|
-
`)}
|
|
7
|
-
|
|
8
|
-
\u5EFA\u8BAE\u6539\u7528\u300C\u9000\u51FA\u7FA4\u804A\u300D\u3002`)}return(0,e.jsxs)("article",{className:"g-manage-dialog",children:[(0,e.jsx)("header",{children:(0,e.jsx)("h3",{children:r("groups.manageTitle",{name:t.name??t.chatId})})}),(0,e.jsxs)("div",{className:"g-manage-meta",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("b",{children:"chatId"}),(0,e.jsx)("code",{children:t.chatId})]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("b",{children:r("groups.owner")}),(0,e.jsx)("code",{children:t.ownerId??r("common.unknown")})]})]}),(0,e.jsxs)("fieldset",{children:[(0,e.jsx)("legend",{children:r("groups.oncall")}),(0,e.jsx)("p",{children:(0,e.jsx)("small",{children:r("groups.oncallHelp")})}),n.length===0?(0,e.jsx)("p",{className:"empty",children:"\u6CA1\u6709\u673A\u5668\u4EBA\u5728\u7FA4\u91CC"}):n.map(p=>(0,e.jsx)(Ze,{chat:t,member:p,tr:r,onSaved:async()=>{await o.onReloadGroups({force:!0})}},p.larkAppId))]}),(0,e.jsxs)("fieldset",{children:[(0,e.jsx)("legend",{children:r("groups.leaveTitle")}),n.length===0?(0,e.jsx)("p",{className:"empty",children:"\u6CA1\u6709\u673A\u5668\u4EBA\u5728\u7FA4\u91CC"}):(0,e.jsx)("div",{className:"g-leave-picker",children:n.map(p=>(0,e.jsxs)("label",{className:"checkbox-row",children:[(0,e.jsx)("input",{type:"checkbox",name:"leave-bot",value:p.larkAppId,checked:c.has(p.larkAppId),onChange:y=>u(p.larkAppId,y.currentTarget.checked)}),(0,e.jsxs)("span",{className:"checkbox-row-main",children:[(0,e.jsx)("strong",{children:p.botName??p.larkAppId}),p.larkAppId===a?(0,e.jsx)("small",{children:"\xB7 \u7FA4\u4E3B"}):null]})]},p.larkAppId))})]}),(0,e.jsx)("p",{className:"g-manage-danger-hint",children:r("groups.dangerHint")}),(0,e.jsxs)("div",{className:"actions",children:[(0,e.jsx)("button",{type:"button",onClick:o.onClose,children:r("sessions.dismiss")}),(0,e.jsx)("button",{id:"g-leave-btn",type:"button",disabled:n.length===0,onClick:()=>{b()},children:r("groups.leaveSelected")}),(0,e.jsx)("button",{id:"g-disband-btn",type:"button",className:"contrast",disabled:n.length===0,onClick:()=>{G()},children:r("groups.disband")})]})]})}function Ye(o){let t=(0,i.useRef)(null);(0,i.useEffect)(()=>{let a=t.current;if(!a)return;let c=()=>o.onClose();return a.addEventListener("close",c),()=>a.removeEventListener("close",c)},[o.onClose]),(0,i.useEffect)(()=>{let a=t.current;a&&(o.dialog&&!a.open&&a.showModal(),!o.dialog&&a.open&&a.close())},[o.dialog]);let r=null;o.dialog?.type==="create"?r=(0,e.jsx)(qe,{bots:o.snapshot.bots,roleProfiles:o.dialog.roleProfiles,tr:o.tr,onClose:o.onClose,onCreated:o.onCreated,setTimer:o.setTimer}):o.dialog?.type==="add-bots"?r=(0,e.jsx)(Ve,{chat:o.dialog.chat,bots:o.snapshot.bots,tr:o.tr,onClose:o.onClose,onReloadGroups:o.onReloadGroups}):o.dialog?.type==="save-profile"?r=(0,e.jsx)(Ke,{chat:o.dialog.chat,suggestedProfileId:o.dialog.suggestedProfileId,tr:o.tr,onClose:o.onClose,onRefreshRoleContext:o.onRefreshRoleContext,setTimer:o.setTimer}):o.dialog?.type==="manage"&&(r=(0,e.jsx)(Xe,{chat:o.dialog.chat,tr:o.tr,onClose:o.onClose,onReloadGroups:o.onReloadGroups}));let n=o.dialog?.type==="create"?"groups-create-modal":void 0;return(0,e.jsx)("dialog",{id:"g-drawer",className:n,ref:t,onMouseDown:a=>{a.target===a.currentTarget&&a.currentTarget.close()},children:r})}function Qe(){let o=fe(),t=(0,i.useRef)(!1),r=(0,i.useRef)(J),n=(0,i.useRef)(new Set),a=(0,i.useRef)(new Map),c=(0,i.useRef)(0),[s,u]=(0,i.useState)(J),[b,G]=(0,i.useState)(()=>Ee()),[p,y]=(0,i.useState)({q:"",missingOnly:!1}),[C,f]=(0,i.useState)(!0),[I,v]=(0,i.useState)(null),[P,T]=(0,i.useState)(!1),[O,x]=(0,i.useState)(null),[M,j]=(0,i.useState)(1),E=(0,i.useCallback)(l=>{u(m=>{let k=typeof l=="function"?l(m):l;return r.current=k,k})},[]),H=(0,i.useCallback)((l,m)=>{let k=window.setTimeout(()=>{n.current.delete(k),t.current&&l()},m);return n.current.add(k),k},[]),A=(0,i.useCallback)(l=>new Promise(m=>{let k=window.setTimeout(()=>{n.current.delete(k),a.current.delete(k),m()},l);n.current.add(k),a.current.set(k,m)}),[]),$=(0,i.useCallback)(async l=>{let m=++c.current;try{let k=await Se(l??r.current);t.current&&m===c.current&&G(k)}catch{t.current&&m===c.current&&G({...Ee(),loaded:!0})}},[]),D=(0,i.useCallback)(async l=>{let m=await z({force:l?.force});return t.current&&(E(m),v(null),$(m)),m},[$,E]),_=(0,i.useCallback)(async(l,m)=>{let k=[600,1200,1200,1200,1200,1200];for(let N of k){if(await A(N),!t.current)return;let B;try{B=await z({force:!0})}catch{continue}if(!t.current)return;let W=(B.chats??[]).find(q=>q.chatId===l);if(W&&Ae(W,m)){E(B),$(B);return}}},[A,$,E]);(0,i.useEffect)(()=>(t.current=!0,(async()=>{f(!0);try{await D()}catch(l){t.current&&(E(J),v(l instanceof Error?l.message:String(l)),$(J))}finally{t.current&&f(!1)}})(),()=>{t.current=!1,c.current+=1;for(let l of n.current)window.clearTimeout(l);n.current.clear();for(let l of a.current.values())l();a.current.clear()}),[D]);let F=(0,i.useMemo)(()=>Re(s.chats,p),[s.chats,p]),S=(0,i.useMemo)(()=>Ce(F,M),[F,M]);(0,i.useEffect)(()=>{M!==S.page&&j(S.page)},[M,S.page]);async function d(){T(!0);try{await D({force:!0})}catch(l){v(l instanceof Error?l.message:String(l))}finally{t.current&&T(!1)}}async function L(){if(r.current.bots.length===0){alert(o("groups.noBotsOnline"));return}let l=[];try{l=await K()}catch{}t.current&&x({type:"create",roleProfiles:l})}function U(l,m,k){let N=String(l.chatId),B=Array.isArray(l.invalidBotIds)?l.invalidBotIds:[],W=m.filter(Le=>!B.includes(Le)),q=new Set(W);typeof l.creator=="string"&&l.creator&&q.add(l.creator);let re=Te(r.current,N,k||N,W,l.creator);E(re),$(re),_(N,q).catch(()=>{})}let h=(0,i.useCallback)(l=>{let m=new Set((l.memberBots??[]).filter(N=>N.inChat).map(N=>N.larkAppId));if(!r.current.bots.filter(N=>!m.has(N.larkAppId)).length){alert("All configured bots are already in this chat.");return}x({type:"add-bots",chat:l})},[]),g=(0,i.useCallback)(l=>{let m=te(l.name??""),k=m==="profile"?te(l.chatId):m;x({type:"save-profile",chat:l,suggestedProfileId:k})},[]),w=(0,i.useCallback)(l=>{x({type:"manage",chat:l})},[]);function R(l){let m=document.getElementById("g-body");m&&(m.scrollTop=0),j(l)}return(0,e.jsxs)("section",{className:"page groups-page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:o("nav.groups")}),(0,e.jsx)("h1",{children:o("groups.title")})]}),(0,e.jsx)("div",{className:"page-heading-actions",children:(0,e.jsx)(Y,{id:"g-create",className:"page-primary-action",onClick:()=>{L()},children:o("groups.create")})})]}),(0,e.jsxs)("form",{id:"g-filters",className:"filters dashboard-toolbar groups-toolbar",onSubmit:l=>l.preventDefault(),children:[(0,e.jsx)("input",{type:"search",name:"q",placeholder:o("groups.search"),value:p.q,onChange:l=>{let m=l.currentTarget.value;j(1),y(k=>({...k,q:m}))}}),(0,e.jsxs)("label",{className:"filter-toggle",children:[(0,e.jsx)("input",{type:"checkbox",name:"missing",checked:p.missingOnly,onChange:l=>{let m=l.currentTarget.checked;j(1),y(k=>({...k,missingOnly:m}))}}),(0,e.jsx)("span",{className:"filter-toggle-label",children:o("groups.missingOnly")}),(0,e.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,e.jsx)("span",{className:"groups-toolbar-spacer","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"groups-toolbar-count",children:[o("groups.matrixTitle")," ",C?"-/-":`${F.length}/${s.chats.length}`]}),(0,e.jsx)(le,{id:"g-refresh",label:o("groups.refresh"),busy:P,disabled:P,onClick:()=>{d()}})]}),I?(0,e.jsxs)("p",{className:"hint-warn",children:["\u52A0\u8F7D\u7FA4\u7EC4\u5931\u8D25\uFF1A",I]}):null,(0,e.jsx)("section",{className:"overview-block groups-matrix-section",children:C?(0,e.jsx)("div",{id:"g-loading",children:(0,e.jsx)(X,{label:o("common.loading")})}):(0,e.jsxs)("div",{className:"groups-list-wrap",id:"g-table-wrap",children:[F.length===0?(0,e.jsx)("div",{className:"empty groups-list-empty",id:"g-body",children:o("groups.empty")}):(0,e.jsx)(ce,{id:"g-body",className:"groups-list",children:S.rows.map(l=>(0,e.jsx)(Je,{chat:l,bots:s.bots,roleContext:b,tr:o,onAddBots:h,onSaveProfile:g,onManage:w},l.chatId))}),F.length>0&&S.totalPages>1?(0,e.jsxs)("nav",{className:"groups-pagination","aria-label":o("groups.paginationLabel"),children:[(0,e.jsx)("span",{className:"groups-pagination-status","aria-live":"polite",children:o("groups.pageStatus",{page:S.page,pages:S.totalPages,from:S.from,to:S.to,total:S.total})}),(0,e.jsxs)("div",{className:"groups-pagination-actions",children:[(0,e.jsx)("button",{type:"button",disabled:S.page<=1,onClick:()=>R(S.page-1),children:o("groups.prevPage")}),(0,e.jsx)("button",{type:"button",disabled:S.page>=S.totalPages,onClick:()=>R(S.page+1),children:o("groups.nextPage")})]})]}):null]})}),(0,e.jsx)(Ye,{dialog:O,snapshot:s,tr:o,onClose:()=>x(null),onCreated:U,onReloadGroups:D,onRefreshRoleContext:()=>$(),setTimer:H})]})}function pt(o){return se(o,(0,e.jsx)(Qe,{}))}export{pt as renderGroupsPage};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{a as Pt}from"./chunk-FDZ7WOBW.js";import{a as Lt,c as Bt,h as Ot}from"./chunk-XJ7BGPJH.js";import{a as Hn,c as At,f as Xe}from"./chunk-AGCPF6MT.js";import{a as Mt}from"./chunk-6ALR252E.js";import{a as hn}from"./chunk-ZJVTGU5X.js";import{a as Rt,c as Et}from"./chunk-5PAYQ3KT.js";import{c as We,g as xt,q as en}from"./chunk-5CJMHTT4.js";import{B as pn,D as Tt,F as fe,G as Ke,H as ye,J as fn,a as Ge,f as pt,g as On,h as ft,i as bt,j as ht,k as yt,l as Dn,m as kt,n as wt,o as vt,p as Ct,q as $n,r as St,s as It,t as $e,u as o,v as Je,w as He,z as _e}from"./chunk-ELL53D62.js";import{a as Nt}from"./chunk-SYC6D5XU.js";import{a as gt,b as Us,d as bn}from"./chunk-5THX4DI2.js";import{c as ze}from"./chunk-7SZRL6FY.js";var c=ze(gt(),1),on=ze(Us(),1);var _n=[24,72,168],js=new Set(_n);function Kn(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!js.has(t)?null:t}function zs(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Gs(e,t=Date.now()){return t-e*60*60*1e3}function Js(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let a=zs(e.lastMessageAt);return a!==null&&a<Gs(t,s)}function Dt(e,t,s=Date.now()){return e.filter(a=>Js(a,t,s))}var $t={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"},Wo=new Set(Object.values($t)),Ws={"claude-code":"Claude",aiden:"Aiden",coco:"CoCo",codex:"Codex",cursor:"Cursor",gemini:"Gemini",genius:"Genius",opencode:"OpenCode",antigravity:"Antigravity",mtr:"MTR",hermes:"Hermes","codex-app":"Codex App",mira:"Mira",seed:"Seed",traex:"TRAE",pi:"Pi",copilot:"Copilot","oh-my-pi":"Oh My Pi",relay:"Relay",mir:"Mir CLI",kimi:"Kimi",grok:"Grok Build","kiro-cli":"Kiro",riff:"Riff",reasonix:"Reasonix"},Ht=Object.values($t).map(e=>({id:e,label:Ws[e]??e}));function yn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Fn(e){let t=yn(e);return t===null?"-":t.toLocaleString("en-US")}function _t(e,t){let s=String(e??"").replace(/\s+/g," ").trim();return s?s.length>t?`${s.slice(0,t-1)}\u2026`:s:""}function Kt(e,t){let s=String(e??"").replace(/\r\n?/g,`
|
|
2
|
-
`).replace(/[^\S\n]+\n/g,`
|
|
3
|
-
`).replace(/\n{3,}/g,`
|
|
4
|
-
|
|
5
|
-
`).replace(/^\n+/,"").replace(/\s+$/,"");return s?s.length>t?`${s.slice(0,t-1)}\u2026`:s:""}function Ut(e){let t=Kt(e.previewUserFullText??e.previewUserText??"",4e3),s=e.previewBotState==="replied"?Kt(e.previewBotFullText??e.previewBotText??"",4e3):"";return{userText:_t(t,120),userFullText:t,botText:_t(s,220),botFullText:s}}var jt={open:!1,suppressFocusOpen:!1};function zt(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 we=[...Ht.map(e=>e.id),"unknown"],Un=[{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 kn(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var Gt=["starting","working","idle","dormant","analyzing","stalled","active","limited","closed"];function nn(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function Jt(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 jn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function Ft(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Xs(e){let t=o("sessions.directChat"),s=String(e?.chatDisplayName??"").trim()||String(e?.chatId??"").trim()||o("sessions.chatUnknown"),a=fe(e);return`${t} \xB7 ${s} - ${a}`}function Fe(e){let t=String(e?.chatId??"").trim();if(e?.chatType==="p2p")return Xs(e);let s=Ke(e),a=e?.chatType==="p2p"?(()=>{let r=String(e?.botName??"").trim();return r?` \xB7 ${r}`:""})():"";return s?`${Ft(e)} \xB7 ${s}${a}`:t?`${Ft(e)} \xB7 ${t}${a}`:o("sessions.chatUnknown")}function zn(e,t=Ke){return!!String(e?.chatId??"").trim()&&!t(e)}function Gn(e){let t=Fe(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function Wt(e){return`${JSON.stringify(e)} ${Fe(e)} ${Gn(e)}`.toLowerCase()}function ke(e){return typeof e=="string"?e.trim():""}function Xt(e){let t=ke(e?.chatId),s=ke(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function Jn(e){let t=ke(e?.chatId),s=ke(e?.rootMessageId),a=Xt(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(ke(e?.sessionId)||"unknown")}`}function Vs(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=ke(a?.title);if(r)return r}return t}function wn(e){let t=new Map;for(let a of e){let r=Jn(a),m=t.get(r);m?m.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let m=[...r].sort((A,K)=>Number(K.lastMessageAt??0)-Number(A.lastMessageAt??0)),f=m[0]??{},l=Xt(f),g=ke(f.chatId),v=l==="thread"?ke(f.rootMessageId):"",w=new Set(m.map(A=>ke(A.larkAppId)||ke(A.botName)).filter(Boolean)),C=Math.max(1,w.size),O=m.filter(A=>A.status!=="closed").length,P=m.filter(A=>A.lastInputFromBot===!0).length,E=m.reduce((A,K)=>Math.max(A,Number(K.lastMessageAt??0)),0),M=v||g||ke(f.sessionId)||a;s.push({key:a,kind:l,chatId:g,...v?{rootMessageId:v}:{},title:Vs(m,M),rows:m,botCount:C,activeCount:O,closedCount:m.length-O,inferredBotInputCount:P,latestActivityAt:E,multiBot:w.size>1,inferredBotTriggered:P>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var tn=Lt;function vn(e=$e){return e.authed?!0:(e.publicReadOnly,!1)}var z={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 Cn(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function Wn(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let a=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await a.json().catch(()=>({}));if(!a.ok||r?.ok===!1||!r?.url){s?.close(),a.status!==401&&alert(`${o("sessions.writeLinkFail")}: ${r?.error??a.status}`);return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(a){s?.close(),alert(`${o("sessions.writeLinkFail")}: ${a}`)}finally{t&&(t.disabled=!1)}}async function Vt(e,t){t&&(t.disabled=!0);try{let s=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/spawn-command`),a=await s.json().catch(()=>({}));if(!s.ok||a?.ok===!1||!a?.command){s.status!==401&&alert(`${o("sessions.copyCommandFail")}: ${a?.error??s.status}`);return}if(await hn(a.command,o("sessions.copyCommand"))&&t){let r=t.textContent;t.textContent=o("sessions.copyCommandDone"),setTimeout(()=>{r!==null&&(t.textContent=r)},1500)}}catch(s){alert(`${o("sessions.copyCommandFail")}: ${s}`)}finally{t&&(t.disabled=!1)}}function Xn(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,a=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${a||r||"unknown"}`}function qt(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":qs(e)?"todo":"idle"}function qs(e){let t=e?.openTodos;return!!t&&typeof t.remaining=="number"&&t.remaining>0}function Yt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),a=$e.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${a}${nn(t)}`,`${o("sessions.restartConfirmCli")}${a}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
|
|
6
|
-
`)}function Sn(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo&&e.cliId!=="riff"}async function Zt(){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 sn=new Pt({html:!1,linkify:!0,breaks:!0});sn.validateLink=e=>/^(https?:|mailto:)/i.test(e.trim());var Qt=sn.renderer.rules.link_open;sn.renderer.rules.link_open=(e,t,s,a,r)=>(e[t].attrSet("target","_blank"),e[t].attrSet("rel","noopener noreferrer nofollow"),Qt?Qt(e,t,s,a,r):r.renderToken(e,t,s));sn.renderer.rules.image=(e,t)=>{let s=e[t],a=s.children?.reduce((l,g)=>l+(g.content??""),"")??"",r=Je(a.trim()||"image"),m=s.attrGet("src")??"";return/^(https?:|mailto:)/i.test(m.trim())?`<span class="session-card-exchange-img">\u{1F5BC} <a href="${Je(m)}" target="_blank" rel="noopener noreferrer nofollow">${r}</a></span>`:`<span class="session-card-exchange-img">\u{1F5BC} ${r}</span>`};function Vn(e){let t=String(e??"");if(!t.trim())return"";try{return sn.render(t).trim()||`<p>${Je(t)}</p>`}catch{return`<p>${Je(t)}</p>`}}function qn(e,t){let s=Math.max(0,Math.min(t,e.length)),r=e.slice(0,s).match(/(?:^|\s)@([^\s@]*)$/u);if(!r)return null;let m=r[1]??"";return{start:s-m.length-1,end:s,query:m}}function es(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 ns(e,t){let s=t.trim().toLocaleLowerCase();return s?e.filter(a=>a.botName.toLocaleLowerCase().includes(s)||a.larkAppId.toLocaleLowerCase().includes(s)):[...e]}function ts(e,t,s,a){if(a.length===0)return{text:e,caret:Math.max(0,Math.min(t,e.length))};let r=Math.max(0,Math.min(t,e.length)),m=Math.max(r,Math.min(s,e.length)),f=e.slice(0,r),l=e.slice(m),g=f&&!/\s$/u.test(f)?" ":"",v=l&&!/^\s/u.test(l)?" ":"",w=`${g}${a.join(" ")}${v}`;return{text:f+w+l,caret:f.length+w.length}}function Ys(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 ss(e,t,s,a){let r=Ys(e,t),m=s.map((f,l)=>a(l));return s.forEach((f,l)=>{let g=r.indexOf(f);g<0||f===m[l]||(r=r.slice(0,g)+m[l]+r.slice(g+f.length))}),{text:r,markers:m}}var L=ze(gt(),1);var os=["backlog","todo","in_progress","in_review","done"];function as(e){return typeof e=="string"&&os.includes(e)?e:null}function is(e){if(e.status==="closed")return"done";let t=as(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 Zs=1e15;function Ve(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 Zs-t}function Yn(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var I=ze(bn(),1),rs=[{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"}],Zn=50;function ls(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function Qs(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function eo(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 no(e){let t=(s="")=>`<svg viewBox="0 0 14 14" aria-hidden="true"><circle cx="7" cy="7" r="5.4" fill="none" stroke="currentColor" stroke-width="1.6"${s}/>`;switch(e){case"backlog":return`${t(' stroke-dasharray="1.6 2.1"')}</svg>`;case"in_progress":return`${t()}<path d="M7,7 L7,3.6 A3.4,3.4 0 0 1 7,10.4 Z" fill="currentColor"/></svg>`;case"in_review":return`${t()}<path d="M7,7 L7,3.6 A3.4,3.4 0 1 1 3.6,7 Z" fill="currentColor"/></svg>`;case"done":return'<svg viewBox="0 0 14 14" aria-hidden="true"><circle cx="7" cy="7" r="6.2" fill="currentColor"/><path d="M4.4 7.2 6.2 9 9.7 5.4" fill="none" stroke="var(--surface)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>';default:return`${t()}</svg>`}}function Ze(e){return{__html:e}}function In(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function to(e){return ye(e.title)||e.sessionId}function gs(e){let t=[],s=new Map;for(let m of e){let f=String(m.chatId??m.sessionId),l=s.get(f);l||(l={chatId:f,rows:[]},s.set(f,l),t.push(l)),l.rows.push(m)}let a=[];return{clusters:t.map(m=>(a.push(...m.rows),m.rows.length<2?{type:"card",row:m.rows[0]}:{type:"cluster",chatId:m.chatId,rows:m.rows})),flat:a}}function cs(e){let t=new Map(rs.map(a=>[a.id,[]]));for(let a of e)t.get(is(a)).push(a);return{columns:rs.map(a=>{let r=(t.get(a.id)??[]).sort((g,v)=>Ve(g)-Ve(v)),m=0;a.id==="done"&&r.length>Zn&&(m=r.length-Zn,r=r.slice(0,Zn));let{clusters:f,flat:l}=gs(r);return t.set(a.id,l),{id:a.id,labelKey:a.labelKey,rows:r,clusters:f,hiddenCount:m}}),groups:t}}function so(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:fe(s),larkAppId:s.larkAppId,rows:[]},t.set(a,r)),r.rows.push(s)}return[...t.values()].sort((s,a)=>s.name.localeCompare(a.name)).map(s=>{let a=s.rows.sort((m,f)=>Number(f.lastMessageAt??0)-Number(m.lastMessageAt??0)),{clusters:r}=gs(a);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:a,clusters:r}})}function Qn(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function oo(e){if(e.groupBy==="bot"){let a=e.rows.filter(r=>!In(r));return{mode:"bot",columns:so(a),groups:new Map,rowById:Qn(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(C=>C.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(a??void 0),m=a?e.rows.filter(C=>r.has(String(C.chatId))):[],f=(e.teamBoardKey===a?.key?e.teamBoardData?.board:null)??{},l=(e.teamBoardKey===a?.key?e.teamBoardData?.remoteRows:null)??[],g=[...m,...l].map(C=>{let O=f[String(C.sessionId)];return O?{...C,kanbanColumn:O.column,kanbanPosition:O.position}:C}),{columns:v,groups:w}=cs(g);return{mode:"flow",columns:v,groups:w,rowById:Qn(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:Qn(e.rows),team:null,scope:null}}function ao(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 io(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 ds(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 Ye(e){return(0,I.jsx)("button",{type:"button",className:`card-act kanban-card-act${e.className?` ${e.className}`:""}`,"data-action":e.action,"data-tip":e.label,"aria-label":e.label,onClick:t=>{t.stopPropagation(),e.onClick(t.currentTarget)},dangerouslySetInnerHTML:Ze(e.icon)})}function ro(e){let t=ye(e.row.title)||"",[s,a]=(0,L.useState)(t),r=(0,L.useRef)(null),m=(0,L.useRef)(!1);(0,L.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let f=(0,L.useCallback)(l=>{if(m.current)return;m.current=!0;let g=s.trim();l&&g&&g!==t&&e.onCommit(e.row,g),e.onCancel()},[t,e,s]);return(0,I.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:l=>a(l.currentTarget.value),onClick:l=>l.stopPropagation(),onBlur:()=>f(!0),onKeyDown:l=>{l.stopPropagation(),l.key==="Enter"?(l.preventDefault(),f(!0)):l.key==="Escape"&&(l.preventDefault(),f(!1))}})}function us(e){let{callbacks:t,row:s}=e,a=to(s),r=fe(s),m=Ke(s),f=Qs(s.workingDir),l=eo(s),g=[m,f!=="-"?f:null].filter(Boolean).join(" \xB7 "),v=String(s.status??"unknown"),w=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",C=e.editingId===s.sessionId,O=t.selectedSessionIds.has(String(s.sessionId)),P=["kanban-card",O?"selected":"",w?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),E=w?null:(0,I.jsxs)("span",{className:"kanban-card-actions-rail",children:[(0,I.jsx)(Ye,{action:"history",icon:t.icons.history,label:o("sessions.history.title"),onClick:()=>t.onHistory(s)}),s.webPort&&t.onOpenTerminal?(0,I.jsx)(Ye,{action:"terminal",icon:t.icons.terminal,label:o("sessions.openReadonlyTerminal"),onClick:()=>t.onOpenTerminal?.(s)}):null,s.webPort&&t.onOpenWritableTerminal?(0,I.jsx)(Ye,{action:"write-link",icon:t.icons.key,label:o("sessions.openWritableTerminal"),onClick:M=>t.onOpenWritableTerminal?.(s,M)}):null,s.feishuChatLink?(0,I.jsx)("a",{className:"card-act kanban-card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener","data-tip":o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),onClick:M=>M.stopPropagation(),dangerouslySetInnerHTML:Ze(t.icons.feishu)}):null,(0,I.jsx)(Ye,{action:"lock",className:s.locked?"locked":"",icon:s.locked?t.icons.unlock:t.icons.lock,label:t.lockActionLabel(s),onClick:M=>t.onToggleLock(s,M)}),(0,I.jsx)(Ye,{action:"details",icon:t.icons.details,label:o("sessions.details"),onClick:()=>t.onDetails(s)}),t.canRestartSession(s)?(0,I.jsx)(Ye,{action:"restart",icon:t.icons.restart,label:o("sessions.restart"),onClick:M=>t.onRestart(s,M)}):null]});return(0,I.jsxs)("article",{className:P,"data-id":s.sessionId,tabIndex:0,role:"button","aria-pressed":O,draggable:!0,onClick:M=>e.onCardClick(s,M),onKeyDown:M=>e.onCardKeyDown(s,M),onDragStart:M=>e.onDragStartCard(s,M),children:[(0,I.jsxs)("div",{className:"kanban-card-top",children:[(0,I.jsx)("span",{className:`badge cli-${ls(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,I.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,I.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,w?(0,I.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:w}),children:w}):null,E]}),(0,I.jsx)("div",{className:"kanban-card-title-row",children:C?(0,I.jsx)(ro,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,I.jsx)("p",{className:"kanban-card-title",title:String(s.title??a),onDoubleClick:M=>{M.stopPropagation(),e.cancelOpen(),w||e.onBeginEdit(s)},children:String(a).slice(0,140)})}),g||l?(0,I.jsxs)("div",{className:"kanban-card-meta-row",children:[g?(0,I.jsx)("p",{className:"kanban-card-desc",title:g,children:g}):(0,I.jsx)("span",{className:"kanban-card-desc kanban-card-desc-empty","aria-hidden":"true"}),l?(0,I.jsx)("span",{className:"session-signal",title:l,children:l}):null]}):null,(0,I.jsxs)("div",{className:"kanban-card-foot",children:[(0,I.jsx)("span",{className:"kanban-card-owner",dangerouslySetInnerHTML:Ze(`${_e({name:r,larkAppId:s.larkAppId,size:"sm"})}<span>${Je(r)}</span>`)}),(0,I.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:He(s.lastMessageAt)}),(0,I.jsx)("span",{className:"kanban-card-dot","data-status":ls(v),title:t.sessionStatusText(v)})]})]})]})}function ms(e){let t=e.item;if(t.type==="card")return(0,I.jsx)(us,{...e.cardProps,row:t.row});let s=Ke(t.rows[0])??t.chatId,a=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,I.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${a?" dragging":""}`,"data-chat":t.chatId,children:[(0,I.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,I.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:Ze(pn({chatId:t.chatId,name:s,size:"sm"}))}),(0,I.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,I.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,I.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,I.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,I.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,I.jsx)(us,{...e.cardProps,row:r},r.sessionId)):null]})}function ps(e){let[t,s]=(0,L.useState)(e),[a,r]=(0,L.useState)(null),[m,f]=(0,L.useState)(null),[l,g]=(0,L.useState)(null),[v,w]=(0,L.useState)(null),[C,O]=(0,L.useState)(()=>new Set),P=(0,L.useRef)(null),E=(0,L.useRef)(null),M=(0,L.useRef)(null),A=(0,L.useRef)(new Map),K=(0,L.useRef)(new Map),U=(0,L.useRef)(m),j=!!a||!!m,x=(0,L.useCallback)(()=>{M.current!==null&&(clearTimeout(M.current),M.current=null)},[]),D=(0,L.useCallback)(N=>{E.current=ao(e.host),s(N)},[e.host]);(0,L.useEffect)(()=>{if(j){P.current=e;return}D(e)},[D,j,e]),(0,L.useEffect)(()=>{if(j||!P.current)return;let N=P.current;P.current=null,D(N)},[D,j]),(0,L.useLayoutEffect)(()=>{io(e.host,E.current),E.current=null},[t,e.host]),(0,L.useEffect)(()=>{U.current=m},[m]),(0,L.useEffect)(()=>()=>x(),[x]);let $=(0,L.useMemo)(()=>oo(t),[t]);(0,L.useLayoutEffect)(()=>{A.current=$.groups,K.current=$.rowById},[$]),(0,L.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,L.useEffect)(()=>{t.groupBy==="team"&&$.mode==="flow"&&$.team&&t.onNeedTeamBoard($.team)},[t,$]),(0,L.useEffect)(()=>{t.onTeamScope($.mode==="flow"?$.scope:null)},[t,$]);let V=(0,L.useCallback)(()=>{f(null),g(null),w(null)},[]),_=(0,L.useCallback)(N=>{O(S=>{let J=new Set(S);return J.has(N)?J.delete(N):J.add(N),J})},[]),ve=(0,L.useCallback)(N=>{x(),!In(N)&&r(N.sessionId)},[x]),Q=(0,L.useCallback)((N,S)=>{In(N)||S.target.closest("a, button, input, label")||(x(),M.current=setTimeout(()=>{M.current=null,t.onToggleSelect(N)},220))},[x,t]),Ce=(0,L.useCallback)((N,S)=>{S.key!=="Enter"&&S.key!==" "||S.target!==S.currentTarget||In(N)||(S.preventDefault(),t.onToggleSelect(N))},[t]),Le=(0,L.useCallback)((N,S)=>{t.groupBy!=="bot"&&(x(),f({kind:"card",id:String(N.sessionId)}),S.dataTransfer&&(S.dataTransfer.effectAllowed="move",S.dataTransfer.setData("text/plain",String(N.sessionId))))},[x,t.groupBy]),Pe=(0,L.useCallback)((N,S,J)=>{t.groupBy!=="bot"&&(x(),f({kind:"cluster",chatId:N,col:S}),J.dataTransfer&&(J.dataTransfer.effectAllowed="move",J.dataTransfer.setData("text/plain",`cluster:${N}`)))},[x,t.groupBy]),G=(0,L.useCallback)((N,S)=>{!U.current||t.groupBy==="bot"||(S.preventDefault(),S.dataTransfer&&(S.dataTransfer.dropEffect="move"),g(N),w(ds(S.currentTarget,S.clientY)?.dataset.id??null))},[t.groupBy]),Ue=(0,L.useCallback)((N,S)=>{let J=U.current;if(!J||t.groupBy==="bot")return;S.preventDefault();let ue=ds(S.currentTarget,S.clientY);V();let q=A.current,me=N;if(J.kind==="cluster"){let ee=(q.get(J.col)??[]).filter(te=>String(te.chatId)===J.chatId).filter(te=>!(te.status==="closed"&&me!=="done"));if(!ee.length)return;let ge=new Set(ee.map(te=>te.sessionId)),ne=(q.get(me)??[]).filter(te=>!ge.has(te.sessionId)),ae=ue?ne.findIndex(te=>te.sessionId===ue.dataset.id):ne.length;ae<0&&(ae=ne.length);let Ne=ae>0?ne[ae-1]:null,xe=ae<ne.length?ne[ae]:null,Re=Yn(Ne?Ve(Ne):null,xe?Ve(xe):null);t.onMoveRows(ee.map((te,Qe)=>({row:te,column:me,position:Re+Qe*.001})));return}let W=K.current.get(J.id);if(!W||W.status==="closed"&&me!=="done")return;let Y=(q.get(me)??[]).filter(ee=>ee.sessionId!==J.id),le=ue?Y.findIndex(ee=>ee.sessionId===ue.dataset.id):Y.length;le<0&&(le=Y.length);let be=le>0?Y[le-1]:null,Ie=le<Y.length?Y[le]:null,je=Yn(be?Ve(be):null,Ie?Ve(Ie):null);t.onMoveRows([{row:W,column:me,position:je}])},[V,t]),Se={dragId:m?.kind==="card"?m.id:null,dropBeforeId:v,editingId:a,groupBy:t.groupBy,callbacks:t,cancelOpen:x,onBeginEdit:ve,onCardClick:Q,onCardKeyDown:Ce,onDragStartCard:Le,onEditDone:()=>r(null)};return $.mode==="loading"?(0,I.jsx)(We,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):$.mode==="bot"?$.columns.length?(0,I.jsx)(I.Fragment,{children:$.columns.map(N=>(0,I.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":N.key,children:[(0,I.jsxs)("header",{children:[(0,I.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:Ze(_e({name:N.name,larkAppId:N.larkAppId,size:"sm"}))}),(0,I.jsx)("h2",{children:N.name}),(0,I.jsx)("span",{className:"kanban-col-count",children:N.rows.length})]}),(0,I.jsx)("div",{className:"kanban-col-list",onDragOver:S=>G(N.key,S),onDragEnd:V,children:N.clusters.map(S=>(0,I.jsx)(ms,{item:S,dragCluster:m?.kind==="cluster"?m:null,cardProps:Se,expanded:S.type==="cluster"&&C.has(`bot:${N.key}:${S.chatId}`),onToggleExpanded:()=>{S.type==="cluster"&&_(`bot:${N.key}:${S.chatId}`)},onDragStartCluster:Pe},S.type==="card"?S.row.sessionId:S.chatId))})]},N.key))}):(0,I.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,I.jsx)(I.Fragment,{children:$.columns.map(N=>(0,I.jsxs)("section",{className:`kanban-column kanban-${N.id}${l===N.id?" drag-over":""}`,"data-col":N.id,onDragOver:S=>G(N.id,S),onDrop:S=>Ue(N.id,S),onDragEnd:V,children:[(0,I.jsxs)("header",{children:[(0,I.jsx)("span",{className:"kanban-col-icon",dangerouslySetInnerHTML:Ze(no(N.id))}),(0,I.jsx)("h2",{children:o(N.labelKey)}),(0,I.jsx)("span",{className:"kanban-col-count",children:N.rows.length+N.hiddenCount})]}),(0,I.jsxs)("div",{className:"kanban-col-list",children:[N.rows.length?N.clusters.map(S=>(0,I.jsx)(ms,{item:S,columnId:N.id,dragCluster:m?.kind==="cluster"?m:null,cardProps:Se,expanded:S.type==="cluster"&&C.has(`${N.id}:${S.chatId}`),onToggleExpanded:()=>{S.type==="cluster"&&_(`${N.id}:${S.chatId}`)},onDragStartCluster:Pe},S.type==="card"?S.row.sessionId:S.chatId)):(0,I.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),N.hiddenCount?(0,I.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:N.hiddenCount})}):null]})]},N.id))})}var n=ze(bn(),1),lo=new Set(["image/png","image/jpeg","image/gif","image/webp"]),fs=8,co=10*1024*1024,uo=25*1024*1024;function mo(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 go(e){return e===168?"7d":`${e}H`}var po=_n.map(e=>({value:String(e),label:go(e)}));function de(e){return{__html:e}}function re(){return typeof window>"u"?void 0:window.localStorage}function Tn(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${kn(t)}`,children:nn(t)})}function nt(e){let t=e.row?.openTodos,[s,a]=(0,c.useState)(null),[r,m]=(0,c.useState)(!1),[f,l]=(0,c.useState)(!1),g=(0,c.useRef)(null),v=(0,c.useRef)(null);if((0,c.useEffect)(()=>{if(!r)return;let x=$=>{let V=$.target;v.current?.contains(V)||g.current?.contains(V)||(m(!1),a(null))},D=$=>{$.key==="Escape"&&(m(!1),a(null))};return document.addEventListener("mousedown",x,!0),document.addEventListener("keydown",D,!0),()=>{document.removeEventListener("mousedown",x,!0),document.removeEventListener("keydown",D,!0)}},[r]),!t||typeof t.remaining!="number"||t.remaining<=0)return null;let w=Number(t.total??0),C=Number(t.done??0),O=o("sessions.board.todoBadge",{done:C,total:w}),P=o("sessions.board.todoBadgeTitle",{remaining:t.remaining,total:w,done:C}),E=Array.isArray(t.items)?t.items:[],M=x=>x==="completed"?"\u2713":x==="in_progress"?"\u25B6":"\u25CB",A=x=>{let D=x.getBoundingClientRect();a({x:D.left,y:D.bottom+6})},K=()=>{let x=$=>$==="completed"?"[x]":$==="in_progress"?"[>]":"[ ]",D=E.map(($,V)=>`${x($.status)} ${$.text||`#${V+1}`}`);return`${P}
|
|
7
|
-
${D.join(`
|
|
8
|
-
`)}`},U=async()=>{let x=K();try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(x);else{let D=document.createElement("textarea");D.value=x,D.style.position="fixed",D.style.opacity="0",document.body.appendChild(D),D.select(),document.execCommand("copy"),document.body.removeChild(D)}l(!0),window.setTimeout(()=>l(!1),1500)}catch{}},j=r||s;return(0,n.jsxs)("span",{ref:g,className:`session-todo-badge${t.hasInProgress?" active":""}${r?" pinned":""}`,tabIndex:0,onMouseEnter:x=>{r||A(x.currentTarget)},onFocus:x=>{r||A(x.currentTarget)},onMouseLeave:()=>{r||a(null)},onBlur:()=>{r||a(null)},onClick:x=>{x.stopPropagation(),r?(m(!1),a(null)):(A(x.currentTarget),m(!0))},children:[t.hasInProgress?(0,n.jsx)("span",{className:"session-todo-dot","aria-hidden":"true"}):null,O,j&&E.length?(0,on.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(),U()},children:f?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:E.map((x,D)=>(0,n.jsxs)("div",{className:`session-todo-pop-item st-${kn(x.status)}`,children:[(0,n.jsx)("span",{className:"session-todo-pop-glyph","aria-hidden":"true",children:M(x.status)}),(0,n.jsx)("span",{className:"session-todo-pop-text",children:x.text||`#${D+1}`})]},D))})]}),document.body):null]})}function tt(e){return e.row.locked?(0,n.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null}function Ae(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 ys(e){if(!e.url||!Xe())return null;let t=vn();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(z.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(),Wn(e.row,s.currentTarget)},dangerouslySetInnerHTML:de(z.key)}):null]})}function ks(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(z.feishu)})}function fo(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 bs(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?yn(e.tokenUsage?.in)??-1:t==="tokenOut"?yn(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?Fe(e).toLowerCase():t==="cliId"?an(e).toLowerCase():String(e[t]??"").toLowerCase()}function an(e){return String(e.runtimeDisplayName??e.cliId??"unknown")}function hs(e,t,s,a){let r=bs(e,s),m=bs(t,s),f=0;return typeof r=="number"&&typeof m=="number"?f=r-m:typeof r=="boolean"&&typeof m=="boolean"?f=Number(r)-Number(m):f=String(r).localeCompare(String(m)),f===0&&(f=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),a==="asc"?f:-f}function bo(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 ho(e,t,s){let a=s==="needs-you"?fn(e):Number(e.lastMessageAt??0),r=s==="needs-you"?fn(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 yo(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 ko(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 st(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 et(e){let[t,s]=(0,c.useState)(!1);return(0,n.jsx)("button",{type:"button","data-copy":e.value,onClick:()=>{hn(e.value,o("sessions.copy")).then(a=>{a&&(s(!0),window.setTimeout(()=>s(!1),800))})},children:t?o("sessions.copied"):o("sessions.copy")})}function wo(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:a||t>0,onClick:async()=>{r(!0);let m=await e.locateSession(e.row);r(!1),m&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):a?o("sessions.locating"):o("sessions.locate")})}function vo(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[t]),(0,n.jsx)(Ae,{action:"locate",icon:z.pin,label:t>0?o("sessions.cooldown",{seconds:t}):o("sessions.locate"),disabled:a||t>0,onClick:async()=>{r(!0);let m=await e.onLocate(e.row);r(!1),m&&s(30)}})}function Co(e){let t=we.filter(l=>e.selected.has(l)).length,s=(0,c.useRef)(null),[a,r]=(0,c.useState)("");(0,c.useEffect)(()=>{let l=()=>{s.current?.open&&(s.current.open=!1)},g=w=>{let C=s.current;C?.open&&!C.contains(w.target)&&l()},v=w=>{w.key==="Escape"&&l()};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",v),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",v)}},[]);let m=a.trim().toLowerCase(),f=m?we.filter(l=>l.toLowerCase().includes(m)):we;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===we.length?void 0:"cli-filter-active",children:t===we.length?o("common.all"):`${t}/${we.length}`})]}),(0,n.jsxs)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:[(0,n.jsxs)("div",{className:"filter-cli-head",children:[(0,n.jsx)("input",{type:"search",className:"filter-cli-search",placeholder:o("sessions.cliSearch"),value:a,autoFocus:!0,onChange:l=>r(l.currentTarget.value),onClick:l=>l.stopPropagation()}),(0,n.jsxs)("div",{className:"filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of we)e.selected.has(l)||e.onToggle(l,!0)},children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of we)e.selected.has(l)&&e.onToggle(l,!1)},children:o("sessions.cliClear")})]})]}),(0,n.jsx)("div",{className:"filter-cli-options",children:f.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):f.map(l=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:l,checked:e.selected.has(l),onChange:g=>e.onToggle(l,g.currentTarget.checked)}),(0,n.jsx)("span",{children:l})]},l))})]})]})}function So(e){let t=[{value:"",label:o("sessions.anyStatus")},...Gt.map(l=>({value:l,label:nn(l)}))],s=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],a=t.find(l=>l.value===e.filters.status)?.label??o("sessions.anyStatus"),r=s.find(l=>l.value===e.filters.adopt)?.label??o("sessions.adoptAny"),m=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],f=m.find(l=>l.value===e.filters.chat)?.label??o("sessions.chatAny");return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters",onSubmit:l=>l.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:l=>{let g=l.currentTarget.value;e.setFilters(v=>({...v,q:g}))}}),(0,n.jsx)(en,{label:a,value:e.filters.status,options:t,onChange:l=>e.setFilters(g=>({...g,status:l}))}),(0,n.jsx)(en,{label:r,value:e.filters.adopt,options:s,onChange:l=>e.setFilters(g=>({...g,adopt:l}))}),(0,n.jsx)(en,{ariaLabel:o("sessions.location"),className:"filter-chat-menu",label:f,value:e.filters.chat,options:m,searchable:!0,searchPlaceholder:o("sessions.chatSearch"),searchEmptyLabel:o("sessions.chatNoMatch"),onChange:l=>e.setFilters(g=>({...g,chat:l}))}),(0,n.jsx)(Co,{selected:e.filters.cli,onToggle:(l,g)=>{e.setFilters(v=>{let w=new Set(v.cli);return g?w.add(l):w.delete(l),{...v,cli:w}})}}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"multiBotTopics",checked:e.filters.multiBotTopics,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(v=>({...v,multiBotTopics:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.multiBotTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"botTriggeredTopics",checked:e.filters.botTriggeredTopics,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(v=>({...v,botTriggeredTopics:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.botTriggeredTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"showUnknownChats",checked:e.filters.showUnknownChats,onChange:l=>{let g=l.currentTarget.checked;wt(re(),g),e.setFilters(v=>({...v,showUnknownChats:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.showUnknownChats")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"active",checked:e.filters.active,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(v=>({...v,active:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.activeOnly")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsx)(To,{...e.idleCleanup})]})}function Io(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 To(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(e.hours),[m,f]=(0,c.useState)(),l=(0,c.useRef)(null),g=(0,c.useRef)(null),v=(0,c.useRef)(null),w=e.countForHours(a);return(0,c.useEffect)(()=>{t?r(e.hours):f(void 0)},[t,e.hours]),(0,c.useLayoutEffect)(()=>{if(!t)return;let C=()=>{let P=g.current,E=v.current;if(!P||!E)return;let M=12,A=window.innerWidth,K=window.innerHeight,U=Math.max(0,Math.min(292,A-M*2)),j=P.getBoundingClientRect(),x=E.offsetHeight,D=Math.max(M,A-U-M),$=j.left+j.width/2-U/2,V=Math.min(Math.max($,M),D),_=j.bottom+8,ve=j.top-x-8,Q=_+x<=K-M||ve<M?Math.min(Math.max(_,M),Math.max(M,K-x-M)):Math.max(M,ve);f({left:V,top:Q,width:U})},O=window.requestAnimationFrame(C);return window.addEventListener("resize",C),window.addEventListener("scroll",C,!0),()=>{window.cancelAnimationFrame(O),window.removeEventListener("resize",C),window.removeEventListener("scroll",C,!0)}},[t,e.busy,e.status]),(0,c.useEffect)(()=>{if(!t)return;let C=P=>{let E=P.target;E instanceof Node&&l.current?.contains(E)||E instanceof Node&&v.current?.contains(E)||s(!1)},O=P=>{P.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",C,!0),document.addEventListener("keydown",O),()=>{document.removeEventListener("pointerdown",C,!0),document.removeEventListener("keydown",O)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${w===0?" is-empty":""}${t?" is-open":""}`,ref:l,children:[(0,n.jsxs)("button",{ref:g,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(C=>!C),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,on.createPortal)((0,n.jsxs)("div",{ref:v,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:m??{visibility:"hidden"},children:[(0,n.jsxs)("div",{className:"idle-cleanup-pop-head",children:[(0,n.jsx)("span",{className:"idle-cleanup-pop-title",children:o("sessions.idleCleanupRun")}),(0,n.jsxs)("span",{id:"idle-cleanup-count",className:"idle-cleanup-count",children:[(0,n.jsx)("span",{className:"idle-cleanup-dot","aria-hidden":"true"}),o("sessions.idleCleanupCount",{count:w})]})]}),(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:po.map(C=>{let O=Kn(C.value),P=O===a;return(0,n.jsx)("button",{type:"button",className:P?"active":void 0,"aria-pressed":P?"true":"false",disabled:e.busy,onClick:()=>r(O),children:C.label},C.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||w===0,onClick:()=>{e.onRun(a).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function No(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(l=>!e.hiddenColumns.has(l.id)),r=2+a.length,m={select:o("sessions.selectSession"),botName:o("sessions.bot"),cliId:o("sessions.cli"),status:o("sessions.status"),chat:o("sessions.location"),tokenIn:o("sessions.tokenIn"),tokenOut:o("sessions.tokenOut"),title:o("sessions.titleCol"),workingDir:o("sessions.workingDir"),spawnedAt:o("sessions.created"),lastMessageAt:o("sessions.last"),adopt:o("sessions.adopt"),actions:o("sessions.actions")};function f(l,g){switch(g){case"botName":return(0,n.jsx)("td",{"data-label":m.botName,children:fe(l)});case"cliId":return(0,n.jsx)("td",{"data-label":m.cliId,children:(0,n.jsx)("span",{className:`badge cli-${kn(l.cliId)}`,title:l.runtimeId&&l.runtimeId!==l.cliId?`${l.cliId} / ${l.runtimeId}`:void 0,children:an(l)})});case"status":return(0,n.jsxs)("td",{"data-label":m.status,children:[(0,n.jsx)(Tn,{status:l.status}),(0,n.jsx)(nt,{row:l}),(0,n.jsx)(tt,{row:l})]});case"chat":return(0,n.jsx)("td",{className:"session-location-cell","data-label":m.chat,title:Gn(l),children:Fe(l)});case"tokenIn":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenIn,children:Fn(l.tokenUsage?.in)});case"tokenOut":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenOut,children:Fn(l.tokenUsage?.out)});case"title":return(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":m.title,title:String(l.title??""),children:ye(l.title??"").slice(0,48)});case"workingDir":return(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":m.workingDir,title:l.workingDir??"",children:String(l.workingDir??"").slice(-34)});case"spawnedAt":return(0,n.jsx)("td",{"data-label":m.spawnedAt,children:He(l.spawnedAt)});case"lastMessageAt":return(0,n.jsx)("td",{"data-label":m.lastMessageAt,children:He(l.lastMessageAt)});case"adopt":return(0,n.jsx)("td",{"data-label":m.adopt,children:l.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null});default:return null}}return(0,n.jsxs)("table",{id:"sessions-table",hidden:e.hidden,children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:(0,n.jsx)("input",{ref:t,type:"checkbox",id:"select-all",title:o("sessions.activeOnly"),checked:e.selectAllChecked,disabled:e.selectAllDisabled,onChange:l=>e.onSelectAll(l.currentTarget.checked)})}),a.map(l=>(0,n.jsx)(fo,{sort:l.id,label:l.label,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},l.id)),(0,n.jsx)("th",{className:"session-table-columns-th",children:(0,n.jsxs)("details",{className:"session-table-columns-menu",children:[(0,n.jsxs)("summary",{title:o("sessions.columns"),children:[(0,n.jsx)("span",{className:"session-table-columns-icon","aria-hidden":"true",children:(0,n.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,n.jsx)("path",{d:"M2 4h12M2 8h12M2 12h12"})})}),o("sessions.columns")]}),(0,n.jsxs)("div",{className:"session-table-columns-dropdown",role:"menu",children:[(0,n.jsxs)("div",{className:"session-table-columns-header",children:[(0,n.jsx)("span",{children:o("sessions.columnsMenu")}),(0,n.jsx)("button",{type:"button",className:"session-table-columns-reset",onClick:e.onResetColumns,children:o("sessions.columnsReset")})]}),s.map(l=>(0,n.jsxs)("label",{className:"session-table-columns-item",children:[(0,n.jsx)("input",{type:"checkbox",checked:!e.hiddenColumns.has(l.id),onChange:()=>e.onToggleColumn(l.id)}),l.label]},l.id))]})]})})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(l=>{let g=l.status==="closed",v=String(l.sessionId);return(0,n.jsxs)("tr",{"data-id":v,onClick:()=>e.onOpen(l),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":m.select,onClick:w=>w.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(v),disabled:g,onChange:w=>e.onSelect(v,w.currentTarget.checked)})}),a.map(w=>(0,n.jsx)(c.Fragment,{children:f(l,w.id)},w.id)),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":m.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},v)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:r,className:"empty",children:o("sessions.empty")})})})]})}function xo(e){let{exchange:t}=e,s=(0,c.useRef)(null),a=(0,c.useRef)(null),r=(0,c.useRef)(null),[m,f]=(0,c.useReducer)(zt,jt),l=m.open,[g,v]=(0,c.useState)(null),w=`session-exchange-tooltip-${(0,c.useId)().replace(/[^a-zA-Z0-9_-]/g,"-")}`,C=(0,c.useCallback)(()=>{r.current!==null&&(window.clearTimeout(r.current),r.current=null)},[]),O=(0,c.useCallback)(()=>{C(),f("open")},[C]),P=(0,c.useCallback)(()=>{C(),f("close"),v(null)},[C]),E=(0,c.useCallback)(()=>{C(),r.current=window.setTimeout(P,120)},[C,P]),M=(0,c.useCallback)(()=>{let A=s.current,K=a.current;if(!A||!K)return;let U=A.getBoundingClientRect(),j=K.getBoundingClientRect(),x=12,D=9,$=U.top-x-D,V=window.innerHeight-U.bottom-x-D,_=$>=j.height||$>V?"top":"bottom",ve=U.left+U.width/2-j.width/2,Q=Math.min(Math.max(ve,x),Math.max(x,window.innerWidth-j.width-x)),Ce=_==="top"?U.top-j.height-D:U.bottom+D,Le=Math.min(Math.max(Ce,x),Math.max(x,window.innerHeight-j.height-x));v({left:Q,placement:_,top:Le})},[]);return(0,c.useLayoutEffect)(()=>{if(l)return M(),window.addEventListener("resize",M),window.addEventListener("scroll",M,!0),()=>{window.removeEventListener("resize",M),window.removeEventListener("scroll",M,!0)}},[t.botFullText,t.userFullText,l,M]),(0,c.useEffect)(()=>()=>C(),[C]),(0,c.useEffect)(()=>{if(!l)return;let A=U=>{let j=U.target;j instanceof Node&&(s.current?.contains(j)||a.current?.contains(j)||P())},K=U=>{U.key==="Escape"&&P()};return document.addEventListener("pointerdown",A),document.addEventListener("keydown",K),()=>{document.removeEventListener("pointerdown",A),document.removeEventListener("keydown",K)}},[P,l]),!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":l?w:void 0,"aria-expanded":l,onClick:A=>{A.stopPropagation(),l?P():O()},onFocus:()=>{C(),f("focus")},onBlur:E,onPointerEnter:A=>{A.pointerType!=="touch"&&O()},onPointerLeave:A=>{A.pointerType!=="touch"&&E()},onKeyDown:A=>{A.key==="Escape"?P():(A.key==="Enter"||A.key===" ")&&(A.preventDefault(),l?P():O())},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]})}),l&&typeof document<"u"?(0,on.createPortal)((0,n.jsx)("div",{ref:a,id:w,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:C,onPointerLeave:A=>{A.pointerType!=="touch"&&E()},onFocusCapture:C,onBlur:A=>{let K=A.relatedTarget;K&&(a.current?.contains(K)||s.current?.contains(K))||E()},onKeyDown:A=>{A.key==="Escape"&&(A.stopPropagation(),C(),f("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(Vn(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(Vn(t.botFullText))})]}):null]})}),document.body):null]})}function ws(e){let t=e.row,s=ye(t.title)||t.sessionId,a=fe(t),r=Ke(t),m=tn(t),f=bo(t),l=jn(t.workingDir),g=Ut(t),v=w=>{w.target.closest("a, button, input, label")||e.onToggleSelect(t)};return(0,n.jsxs)("article",{className:`session-card${e.selected?" selected":""}${t.locked?" locked":""}`,"data-id":t.sessionId,"aria-pressed":e.selected,onClick:v,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(_e({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??an(t)]})]}),(0,n.jsxs)("span",{className:"session-card-status-group",children:[(0,n.jsx)(Tn,{status:t.status}),(0,n.jsx)(nt,{row:t}),(0,n.jsx)(tt,{row:t})]})]}),l!=="-"||t.adopt||f?(0,n.jsxs)("div",{className:"session-card-meta",children:[l!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:l}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,f?(0,n.jsx)("span",{className:"session-signal",title:f,children:f}):null]}):null,(0,n.jsx)(xo,{exchange:g}),(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${He(fn(t))}`:`${o("sessions.last")}: ${He(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(ks,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(vo,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(Ae,{action:"details",icon:z.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),Sn(t)?(0,n.jsx)(Ae,{action:"restart",icon:z.restart,label:o("sessions.restart"),onClick:w=>e.onRestart(t,w)}):null,(0,n.jsx)(ys,{row:t,url:m}),t.status!=="closed"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(Ae,{action:"lock",icon:t.locked?z.unlock:z.lock,label:Cn(t),kind:t.locked?"locked":"",onClick:w=>e.onLock(t,!t.locked,w)}),(0,n.jsx)(Ae,{action:"close",icon:z.close,label:o("sessions.close"),kind:"danger",onClick:w=>e.onClose(t,w)})]}):null]})]})}function Ro(e){(0,c.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(Un.map(a=>[a.id,[]]));for(let a of e.rows){let r=qt(a);r&&t.get(r).push(a)}let s=e.order.map(a=>Un.find(r=>r.id===a)).filter(a=>!!a);return(0,n.jsx)("div",{id:"sessions-board",className:`sessions-board${e.animated||e.hidden?"":" board-enter"}`,hidden:e.hidden,children:s.map((a,r)=>{let m=(t.get(a.id)??[]).sort((f,l)=>ho(f,l,a.id));return(0,n.jsxs)("section",{className:`session-board-column session-board-${a.id}${e.dragColId===a.id?" dragging":""}${e.dragOverCol===a.id?" drag-over":""}`,"data-col":a.id,onDragOver:f=>{e.dragColId&&(f.preventDefault(),f.dataTransfer&&(f.dataTransfer.dropEffect="move"),e.dragColId!==a.id&&e.onDragOverCol(a.id))},onDrop:f=>{e.dragColId&&(f.preventDefault(),e.onMoveColumnTo(e.dragColId,a.id),e.onDragCol(null),e.onDragOverCol(null))},children:[(0,n.jsxs)("header",{draggable:!0,title:o("sessions.board.dragHint"),onDragStart:f=>{e.onDragCol(a.id),f.dataTransfer&&(f.dataTransfer.effectAllowed="move",f.dataTransfer.setData("text/plain",a.id))},onDragEnd:()=>{e.onDragCol(null),e.onDragOverCol(null)},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{children:o(a.labelKey)}),(0,n.jsx)("p",{children:o(a.hintKey)})]}),(0,n.jsxs)("span",{className:"session-board-head-right",children:[(0,n.jsxs)("span",{className:"session-board-move",children:[(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"-1","aria-label":o("sessions.board.moveLeft"),disabled:r===0,onClick:()=>e.onMoveColumn(a.id,-1),children:"\u2039"}),(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"1","aria-label":o("sessions.board.moveRight"),disabled:r===s.length-1,onClick:()=>e.onMoveColumn(a.id,1),children:"\u203A"})]}),(0,n.jsx)("span",{className:"session-board-count",children:m.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:m.length?m.map(f=>(0,n.jsx)(ws,{row:f,selected:e.selected.has(f.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},f.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},a.id)})})}function Eo(e){let t=ye(e.title).trim();return t||(e.kind==="thread"?o("sessions.topic.untitled"):e.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession"))}function Mo(e){let t=(0,c.useMemo)(()=>wn(e.rows),[e.rows]),s=(0,c.useMemo)(()=>new Map(wn(e.relationRows??e.rows).map(a=>[a.key,a])),[e.relationRows,e.rows]);return(0,n.jsx)("div",{id:"sessions-topics",className:"sessions-topic-view",hidden:e.hidden,children:t.length?t.map(a=>{let r=s.get(a.key)??a,m=a.rows[0],f=Fe(m),l=Eo(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(pn({chatId:a.chatId,name:f,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-topic-heading",children:[(0,n.jsx)("span",{className:"session-topic-location",children:f}),(0,n.jsx)("h2",{title:r.title,children:l}),(0,n.jsx)("code",{title:g,children:r.kind==="thread"?g:r.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession")})]}),(0,n.jsxs)("div",{className:"session-topic-summary","aria-label":o("sessions.topic.summary"),children:[r.multiBot?(0,n.jsx)("span",{className:"topic-chip collaboration",children:o("sessions.topic.collaboration")}):null,(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.sessions",{count:r.rows.length})}),(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.bots",{count:r.botCount})}),(0,n.jsx)("span",{className:"topic-chip active",children:o("sessions.topic.active",{count:r.activeCount})}),r.closedCount?(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.closed",{count:r.closedCount})}):null,r.inferredBotInputCount?(0,n.jsx)("span",{className:"topic-chip inferred",title:o("sessions.topic.inferredHint"),children:o("sessions.topic.botInputs",{count:r.inferredBotInputCount})}):null,(0,n.jsxs)("span",{className:"session-topic-updated",children:[o("sessions.last"),": ",He(r.latestActivityAt)]})]})]}),(0,n.jsx)("div",{className:"session-topic-members",children:a.rows.map(v=>(0,n.jsx)(ws,{row:v,selected:e.selected.has(v.sessionId),onToggleSelect:w=>{w.status!=="closed"?e.onToggleSelect(w):e.onOpen(w)},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 Ao(e){let t=e.message,s=t.senderType==="user",a=t.senderType==="app"||t.senderType==="bot",r=s?t.senderName||(e.ownerOpenId&&t.senderId===e.ownerOpenId?o("sessions.history.owner"):o("sessions.history.user")):t.senderName||String(t.senderId??"").slice(0,16)||o(a?"sessions.history.bot":"sessions.history.system"),m=String(t.content??"").trim()||`[${t.msgType??"message"}]`;return(0,n.jsxs)("div",{className:`history-msg${e.groupStart?" group-start":" continuation"}`,children:[e.groupStart?s?t.senderAvatar?(0,n.jsx)("img",{className:"history-avatar-img",src:String(t.senderAvatar),alt:"",decoding:"async",referrerPolicy:"no-referrer"}):(0,n.jsx)("span",{className:"history-avatar-user","aria-hidden":"true",children:String(r).slice(0,1)}):(0,n.jsx)("span",{className:"history-avatar-bot",dangerouslySetInnerHTML:de(_e({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:yo(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:m})]})]})}function Lo(e){let t=(0,c.useRef)(null);st(t,!!e.state);let s=e.state?Ge.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 m=a.current;m&&(m.scrollTop=m.scrollHeight)},[r,e.state?.sessionId,e.state?.messages.length]),(0,n.jsx)("dialog",{id:"history-modal",className:"history-modal",ref:t,onClose:e.onClose,onClick:m=>{m.target===m.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(_e({name:fe(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(ye(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)(Ae,{id:"history-close",icon:z.close,label:o("sessions.dismiss"),onClick:e.onClose})})]}),(0,n.jsxs)("div",{className:"history-body",ref:a,children:[e.state.loading?(0,n.jsx)(We,{label:o("sessions.history.loading"),className:"term-modal-loading",compact:!0}):null,!e.state.loading&&e.state.error?(0,n.jsxs)("div",{className:"history-error",children:[o("sessions.history.fail"),": ",e.state.error,e.state.stale?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("span",{children:o("sessions.history.staleHint")})]}):null]}):null,!e.state.loading&&!e.state.error&&e.state.messages.length===0?(0,n.jsx)("div",{className:"history-error",children:o("sessions.history.empty")}):null,!e.state.loading&&!e.state.error&&e.state.messages.length>0?(0,n.jsx)("div",{className:"history-list",children:e.state.messages.map((m,f,l)=>(0,n.jsx)(Ao,{message:m,ownerOpenId:e.state?.ownerOpenId,groupStart:f===0||Xn(l[f-1])!==Xn(m)},m.messageId??f))}):null]})]}):null})}function Po(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(""),m=(0,c.useRef)(null),f=ye(e.row.title)||e.row.sessionId;(0,c.useLayoutEffect)(()=>{if(!t||!m.current)return;let g=m.current;g.focus(),g.select(),(()=>{let w=getComputedStyle(g),C=document.createElement("span");C.style.cssText="position:absolute;visibility:hidden;white-space:pre",C.style.fontSize=w.fontSize,C.style.fontFamily=w.fontFamily,C.style.fontWeight=w.fontWeight,C.style.letterSpacing=w.letterSpacing,C.textContent=g.value||" ",document.body.appendChild(C);let O=Math.round(window.innerWidth*.6);g.style.width=`${Math.min(Math.max(C.offsetWidth+22,80),O)}px`,C.remove()})()},[t,a]);let l=g=>{let v=a.trim();s(!1),g&&v&&v!==f&&e.onRename(e.row,v)};return t?(0,n.jsx)("input",{ref:m,type:"text",className:"term-modal-name-input",maxLength:200,value:a,onChange:g=>r(g.currentTarget.value),onBlur:()=>l(!0),onKeyDown:g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),l(!0)):g.key==="Escape"&&(g.preventDefault(),l(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??f),children:String(f).slice(0,60)}),(0,n.jsx)(Ae,{id:"term-modal-edit",icon:z.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(ye(e.row.title)||""),s(!0)}})]})}function Bo(e){let t=(0,c.useRef)(null);st(t,!!e.state);let s=e.state?Ge.sessions.get(e.state.sessionId):null,a=s?tn(s):null,r=e.state?.url??a??"",m=s?an(s):"",f=s?jn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:l=>{l.target===l.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(_e({name:fe(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)(Po,{row:s,onRename:e.onRename}),(0,n.jsx)(Tn,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:fe(s)}),(0,n.jsx)("span",{children:m}),f!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:f}):null]})]})]}),(0,n.jsxs)("span",{className:"term-modal-actions",children:[s.feishuChatLink?(0,n.jsx)("a",{className:"card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),dangerouslySetInnerHTML:de(z.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(z.terminal)}),(0,n.jsx)(Ae,{id:"term-modal-close",icon:z.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)(We,{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 Oo(e){let t=e.report;if(!t||t.status!=="ok"){let g=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",g]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let a=[t.meta?.asOf?o("sessions.insightAsOf",{asOf:String(t.meta.asOf)}):null,t.meta?.partial?o("sessions.insightPartial"):null].filter(Boolean),r=Array.isArray(t.suggestions)?t.suggestions:[],m=Array.isArray(t.spans)?t.spans:[],f=g=>g==="bad"||g==="warn"?"!":"i",l=g=>g==="error"?"!":g==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[a.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:a.join(" \xB7 ")}):null,(0,n.jsx)("p",{children:o("sessions.insightMetrics",{total:String(s.totalSpans??0),failed:String(s.failedSpans??0),slow:String(s.slowSpans??0),rw:s.readWriteRatio===null||s.readWriteRatio===void 0?"-":String(s.readWriteRatio),compactions:String(s.compactions??0)})}),r.length?(0,n.jsxs)("details",{open:!0,children:[(0,n.jsx)("summary",{children:o("sessions.insightSuggestions")}),(0,n.jsx)("ul",{style:{paddingLeft:18,margin:"6px 0"},children:r.map((g,v)=>(0,n.jsxs)("li",{children:[f(String(g.severity??""))," ",(0,n.jsx)("b",{children:String(g.title??"")})," - ",String(g.action??""),Array.isArray(g.evidence)&&g.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:g.evidence.join("; ")})]}):null]},v))})]}):null,m.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",m.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??m.length),total:String(t.meta.spansTotal??m.length)})}):null,(0,n.jsx)("div",{style:{maxHeight:320,overflow:"auto"},children:(0,n.jsx)("table",{style:{width:"100%",fontSize:12},children:(0,n.jsx)("tbody",{children:[...m].sort((g,v)=>(g.relStartMs??0)-(v.relStartMs??0)).map((g,v)=>{let w=[g.inputSummary,g.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:g.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:l(String(g.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(g.tool??"")})}),(0,n.jsx)("td",{children:String(g.phase??"")}),(0,n.jsx)("td",{children:ko(g.durationMs)}),(0,n.jsxs)("td",{children:["#",String(g.turnIndex??0)]}),(0,n.jsx)("td",{children:w})]},v)})})})})]}):null]})}function Do(e){let[t,s]=(0,c.useState)(null);if((0,c.useEffect)(()=>s(null),[e.row.sessionId]),!$e.authed)return null;let a=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),m=await r.json().catch(()=>({}));!m.ok||!m.report?s({loading:!1,error:String(m.error??r.status)}):s({loading:!1,report:m.report})}catch(r){s({loading:!1,error:String(r)})}};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"insight-btn",type:"button",disabled:t?.loading,onClick:()=>{a()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(We,{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)(Oo,{report:t.report}):null]})]})}function $o(e){let t=(0,c.useRef)(null);st(t,!!e.row);let s=e.row,a=s?tn(s):null;return(0,n.jsx)("dialog",{id:"drawer",ref:t,onClose:e.onClose,onClick:r=>{r.target===r.currentTarget&&e.onClose()},children:s?(0,n.jsxs)("article",{children:[(0,n.jsxs)("header",{children:[(0,n.jsxs)("div",{className:"drawer-title-row",children:[(0,n.jsx)("h3",{children:ye(s.title)||s.sessionId}),(0,n.jsx)(Ae,{id:"drawer-close",className:"card-act drawer-close-btn",icon:z.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(Tn,{status:s.status}),(0,n.jsx)(nt,{row:s}),(0,n.jsx)(tt,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(et,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",fe(s)," \xB7 ",(0,n.jsxs)("b",{children:[o("sessions.cli"),":"]})," ",an(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)(et,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(et,{value:s.rootMessageId??""})]}),s.threadId?(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"threadId:"})," ",(0,n.jsx)("code",{children:s.threadId})]}):null,(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.workingDir"),":"]})," ",s.workingDir??"-"]}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)(ks,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(wo,{row:s,locateSession:e.locateSession}):null,(0,n.jsx)("button",{id:"history-drawer-btn",type:"button",onClick:()=>e.openHistory(s),children:o("sessions.history.title")}),(0,n.jsx)(ys,{row:s,url:a}),vn()&&s.status!=="closed"?(0,n.jsx)("button",{id:"copy-cmd-btn",type:"button","data-tip":o("sessions.copyCommandHint"),onClick:r=>{Vt(s,r.currentTarget)},children:o("sessions.copyCommand")}):null,Sn(s)?(0,n.jsx)("button",{id:"restart-btn",type:"button",onClick:async r=>{await e.restartSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.restart")}):null,(0,n.jsx)("button",{id:"lock-btn",type:"button",onClick:r=>{e.setSessionLocked(s,!s.locked,r.currentTarget)},children:Cn(s)}),s.queued&&s.status!=="closed"?(0,n.jsx)("button",{id:"start-btn",type:"button",className:"primary",onClick:async r=>{await e.startSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.create.start")}):null,s.status==="closed"?(0,n.jsx)("button",{id:"resume-btn",type:"button",className:"primary",onClick:async r=>{await e.resumeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.resume")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"close-btn",type:"button",className:"contrast",onClick:async r=>{await e.closeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.close")}):null,(0,n.jsx)(Do,{row:s})]})]}):null})}function Ho(e){let t=e.state;(0,c.useEffect)(()=>{let p=e.dialog;return()=>{p.open&&p.close()}},[e.dialog]),(0,c.useEffect)(()=>{let p=e.dialog;if(t){if(!p.open)try{p.showModal()}catch{}}else p.open&&p.close()},[e.dialog,t]),(0,c.useEffect)(()=>{let p=e.dialog,T=()=>e.onClose(),R=B=>{B.target===p&&e.onClose()};return p.addEventListener("close",T),p.addEventListener("click",R),()=>{p.removeEventListener("close",T),p.removeEventListener("click",R)}},[e]);let[s,a]=(0,c.useState)(""),[r,m]=(0,c.useState)([]),[f,l]=(0,c.useState)(new Set),[g,v]=(0,c.useState)("lead"),[w,C]=(0,c.useState)(""),[O,P]=(0,c.useState)("in_progress"),[E,M]=(0,c.useState)(""),[A,K]=(0,c.useState)(""),[U,j]=(0,c.useState)(!1),[x,D]=(0,c.useState)(!1),[$,V]=(0,c.useState)(""),[_,ve]=(0,c.useState)(()=>vt(re())),[Q,Ce]=(0,c.useState)(null),[Le,Pe]=(0,c.useState)([]),[G,Ue]=(0,c.useState)(""),[Se,N]=(0,c.useState)(""),[S,J]=(0,c.useState)(""),[ue,q]=(0,c.useState)(""),[me,W]=(0,c.useState)(!1),[Y,le]=(0,c.useState)(!1),[be,Ie]=(0,c.useState)(""),[je,ee]=(0,c.useState)(""),[ge,ne]=(0,c.useState)(null),[ae,Ne]=(0,c.useState)(0),xe=(0,c.useRef)(null),Re=(0,c.useRef)(1);(0,c.useEffect)(()=>{t&&(a(""),m([]),l(new Set),v("lead"),C(""),P("in_progress"),M(""),K(""),j(!1),D(!1),V(""),Ce(null),N(""),J(""),q(""),Ie(""),ee(""),ne(null),Ne(0),Re.current=1)},[t]),(0,c.useEffect)(()=>{if(!be)return;let p=!0,T=window.setInterval(()=>{fetch("/api/feed-groups").then(async R=>{let B=await R.json().catch(()=>({}));!R.ok||!B.ok||!p||(Pe(Array.isArray(B.groups)?B.groups:[]),Ue(typeof B.larkAppId=="string"?B.larkAppId:""),q(""),Ie(""),ee(""))}).catch(()=>{})},1e3);return()=>{p=!1,window.clearInterval(T)}},[be]),(0,c.useEffect)(()=>{if(!t||t.loading||t.success)return;let p=!0;return W(!0),fetch("/api/feed-groups").then(async T=>{let R=await T.json().catch(()=>({}));if(!T.ok||!R.ok)throw new Error(R.message??R.error??`HTTP ${T.status}`);p&&(Pe(Array.isArray(R.groups)?R.groups:[]),Ue(typeof R.larkAppId=="string"?R.larkAppId:""),q(""))}).catch(T=>{p&&q(T instanceof Error?T.message:String(T))}).finally(()=>{p&&W(!1)}),()=>{p=!1}},[t]);let te=async()=>{let p=G?`?larkAppId=${encodeURIComponent(G)}`:"",T=await fetch(`/api/feed-groups/auth-url${p}`),R=await T.json().catch(()=>({}));if(!T.ok||!R.authUrl){alert(R.error??`HTTP ${T.status}`);return}Ie(String(R.authUrl)),ee("")},Qe=async p=>{le(!0);try{let T=await fetch("/api/feed-groups/oauth-callback",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({callbackUrl:p.trim()})}),R=await T.json().catch(()=>({}));if(!T.ok||!R.ok)throw new Error(R.message??R.error??`HTTP ${T.status}`);let B=await fetch("/api/feed-groups"),H=await B.json().catch(()=>({}));if(!B.ok||!H.ok)throw new Error(H.message??H.error??`HTTP ${B.status}`);Pe(Array.isArray(H.groups)?H.groups:[]),Ue(typeof H.larkAppId=="string"?H.larkAppId:""),q(""),Ie(""),ee("")}catch(T){alert(T instanceof Error?T.message:String(T))}finally{le(!1)}};if(!t)return null;if(t.success){let p=t.success,T=typeof p.shareLink=="string"&&p.shareLink?p.shareLink:"",R=Array.isArray(p.failed)?p.failed.length:0,B=Array.isArray(p.spawned)?p.spawned.length:0,H=p.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress");return(0,n.jsxs)("article",{className:"cs-card",children:[(0,n.jsx)("header",{className:"cs-header",children:(0,n.jsx)("h3",{children:o("sessions.create.doneTitle")})}),(0,n.jsxs)("p",{children:[H,"\uFF08",B,"\uFF09"]}),R>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(R)})}):null,T?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:T,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)(We,{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 Be=t.bots,Ee=[...f],Me=Ee,rn=p=>Be.find(T=>T.larkAppId===p)?.botName??p,Te=$.trim().toLowerCase(),ln=Te?Be.filter(p=>p.botName.toLowerCase().includes(Te)||p.larkAppId.toLowerCase().includes(Te)):Be,ce=ge?ns(Be,ge.query).slice(0,8):[],cn=p=>{if(!ge)return;let T=es(s,ge,p.botName);a(T.text),ne(null),Ne(0),l(R=>new Set(R).add(p.larkAppId)),C(R=>R||p.larkAppId),requestAnimationFrame(()=>{let R=xe.current;R&&(R.focus(),R.setSelectionRange(T.caret,T.caret))})},dn=p=>{if(!(!ge||ce.length===0)){if(p.key==="ArrowDown"||p.key==="ArrowUp"){p.preventDefault();let T=p.key==="ArrowDown"?1:-1;Ne(R=>(R+T+ce.length)%ce.length);return}if(p.key==="Enter"||p.key==="Tab"){p.preventDefault(),cn(ce[Math.min(ae,ce.length-1)]);return}p.key==="Escape"&&(p.preventDefault(),ne(null))}},Nn=async p=>{let T=[...p.clipboardData.files].filter(Z=>Z.type.startsWith("image/"));if(T.length===0)return;p.preventDefault();let R=p.currentTarget.selectionStart??s.length,B=p.currentTarget.selectionEnd??R,H=T.filter(Z=>lo.has(Z.type.toLowerCase()));if(H.length!==T.length){alert(o("sessions.create.imageUnsupported"));return}if(r.length+H.length>fs){alert(o("sessions.create.imageCountLimit",{n:String(fs)}));return}if(H.some(Z=>Z.size>co)){alert(o("sessions.create.imageSizeLimit"));return}if(r.reduce((Z,he)=>Z+he.size,0)+H.reduce((Z,he)=>Z+he.size,0)>uo){alert(o("sessions.create.imageTotalLimit"));return}try{let Z=Re.current,he=await Promise.all(H.map(async(se,pe)=>{let qe=await mo(se),Rn=qe.indexOf(",");if(Rn<0)throw new Error("bad_image_data");let De=Z+pe;return{id:`${Date.now()}-${pe}-${Math.random().toString(36).slice(2)}`,ordinal:De,marker:`[${o("sessions.create.imageMarker",{n:String(De)})}]`,name:se.name||`pasted-image-${r.length+pe+1}`,mimeType:se.type.toLowerCase(),size:se.size,dataBase64:qe.slice(Rn+1),previewUrl:qe}}));Re.current+=he.length;let ie=ts(s,R,B,he.map(se=>se.marker));a(ie.text),m(se=>[...se,...he]),ne(null),requestAnimationFrame(()=>{let se=xe.current;se&&(se.focus(),se.setSelectionRange(ie.caret,ie.caret))})}catch{alert(o("sessions.create.imageReadFailed"))}},xn=async p=>{p.preventDefault();let T=s.trim();if(!T){alert(o("sessions.create.errContent"));return}if(Ee.length===0){alert(o("sessions.create.errNoBot"));return}let R=w||Ee[0]||"";if(g==="lead"&&(!R||!Ee.includes(R))){alert(o("sessions.create.errLead"));return}D(!0),Ce(null);try{let B=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:T,larkAppIds:Ee,mode:g,column:O,leadLarkAppId:g==="lead"?R:void 0,name:E.trim()||void 0,bindWorkingDir:A.trim()||void 0,feedGroupId:Se||void 0,newFeedGroupName:S.trim()||void 0,feedGroupAppId:Se||S.trim()?G:void 0,images:r.map(Oe=>({name:Oe.name,mimeType:Oe.mimeType,dataBase64:Oe.dataBase64}))})}),H=await B.json().catch(()=>null);B.ok&&H?.ok?_?(Ce(H),a(""),m([]),Re.current=1,M("")):e.onSuccess(H):B.status!==401&&alert(`${o("sessions.create.failed")}: ${H?.error??B.status}`)}catch(B){alert(`${o("sessions.create.failed")}: ${B}`)}finally{D(!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:xn,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:xe,name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),"aria-describedby":"cs-content-help",required:!0,value:s,onChange:p=>{let T=p.currentTarget,R=T.value;a(R),ne(qn(R,T.selectionStart??R.length)),Ne(0)},onClick:p=>ne(qn(s,p.currentTarget.selectionStart??s.length)),onKeyDown:dn,onPaste:p=>{Nn(p)},onBlur:()=>setTimeout(()=>ne(null),0)}),ge?(0,n.jsx)("div",{className:"cs-mention-menu",role:"listbox","aria-label":o("sessions.create.mentionBots"),children:ce.length?ce.map((p,T)=>(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":T===ae,className:T===ae?"active":void 0,onMouseDown:R=>R.preventDefault(),onClick:()=>cn(p),children:[(0,n.jsxs)("strong",{children:["@",p.botName]}),(0,n.jsx)("small",{children:p.larkAppId})]},p.larkAppId)):(0,n.jsx)("p",{children:o("sessions.create.noBotMatch")})}):null]}),(0,n.jsx)("small",{id:"cs-content-help",children:o("sessions.create.contentHelp")}),r.length?(0,n.jsx)("div",{className:"cs-image-list","aria-label":o("sessions.create.pastedImages"),children:r.map(p=>(0,n.jsxs)("figure",{className:"cs-image-item",children:[(0,n.jsx)("img",{src:p.previewUrl,alt:p.name}),(0,n.jsxs)("figcaption",{title:`${p.marker} ${p.name}`,children:[(0,n.jsx)("strong",{children:p.marker}),(0,n.jsx)("span",{children:p.name})]}),(0,n.jsx)("button",{type:"button",className:"cs-image-remove","aria-label":o("sessions.create.removeImage",{name:`${p.marker} ${p.name}`}),title:o("sessions.create.removeImage",{name:`${p.marker} ${p.name}`}),onClick:()=>{let T=r.filter(B=>B.id!==p.id),R=ss(s,p.marker,T.map(B=>B.marker),B=>`[${o("sessions.create.imageMarker",{n:String(B+1)})}]`);a(R.text),m(T.map((B,H)=>({...B,ordinal:H+1,marker:R.markers[H]}))),Re.current=T.length+1},children:(0,n.jsx)("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{d:"M7 7l10 10M17 7 7 17"})})})]},p.id))}):null]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),Be.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("input",{className:"cs-bot-search",type:"search",name:"botSearch",placeholder:o("sessions.create.botSearchPlaceholder"),"aria-label":o("sessions.create.botSearchPlaceholder"),value:$,onChange:p=>V(p.currentTarget.value)}),ln.length?(0,n.jsx)("div",{className:"cs-bot-list",children:ln.map(p=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:p.larkAppId,checked:f.has(p.larkAppId),onChange:T=>{let R=T.currentTarget.checked;l(B=>{let H=new Set(B);return R?H.add(p.larkAppId):H.delete(p.larkAppId),H.has(w)||C(H.values().next().value??""),H})}})," ",(0,n.jsx)("span",{children:p.botName})]},p.larkAppId))}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBotMatch")}),Ee.length?(0,n.jsx)("small",{children:o("sessions.create.selectedCount",{n:String(Ee.length)})}):null]}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBots")})]}),(0,n.jsxs)("fieldset",{className:"cs-mode",children:[(0,n.jsx)("legend",{children:o("sessions.create.mode")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"lead",checked:g==="lead",onChange:()=>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")})]}),be?(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(be,"_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:je,placeholder:"http://127.0.0.1:9768/callback?code=\u2026&state=\u2026",onChange:p=>ee(p.currentTarget.value)})]}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{Ie(""),ee("")},children:"\u53D6\u6D88"}),(0,n.jsx)("button",{type:"button",className:"primary",disabled:!je.trim()||Y,onClick:()=>{Qe(je)},children:Y?"\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:Me.length===0,value:Me.includes(w)?w:"",onChange:p=>C(p.currentTarget.value),children:Me.length?Me.map(p=>(0,n.jsx)("option",{value:p,children:rn(p)},p)):(0,n.jsx)("option",{value:"",disabled:!0,children:o("sessions.create.leadPickFirst")})}),(0,n.jsx)("small",{children:o("sessions.create.leadHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-column",children:[(0,n.jsx)("legend",{children:o("sessions.create.column")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"in_progress",checked:O==="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:O==="backlog",onChange:()=>P("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${U?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":U,"aria-controls":"cs-advanced-fields",onClick:()=>j(p=>!p),children:o("sessions.create.optionalConfig")})}),U?(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:E,onChange:p=>M(p.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)(Mt,{groups:Le,selectedId:Se,newName:S,disabled:me||!!ue,onChange:(p,T)=>{N(p),J(T)}}),(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"}),me?(0,n.jsx)("small",{children:"\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6807\u7B7E\u2026"}):null,ue?(0,n.jsxs)("div",{className:"cs-warn",children:[(0,n.jsx)("small",{children:ue})," ",(0,n.jsx)("button",{type:"button",disabled:Y,onClick:()=>{te()},children:Y?"\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:A,onChange:p=>K(p.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),Q?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[Q.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(Q.failed)&&Q.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(Q.failed.length)})}`:""]}),typeof Q.shareLink=="string"&&Q.shareLink?(0,n.jsx)("a",{href:Q.shareLink,target:"_blank",rel:"noopener",children:o("sessions.create.openChat")}):null]}):null,(0,n.jsxs)("div",{className:"actions cs-actions",children:[(0,n.jsxs)("label",{className:"cs-keep-open",title:o("sessions.create.keepOpenHelp"),children:[(0,n.jsx)("input",{type:"checkbox",name:"keepOpen",checked:_,onChange:p=>{let T=p.currentTarget.checked;ve(T),Ct(re(),T)}}),(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||Be.length===0,children:x?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function _o(){Et();let e=Rt(i=>[...i.sessions.values()]),[t,s]=(0,c.useState)(0),a=(0,c.useCallback)(()=>s(i=>i+1),[]),[r,m]=(0,c.useState)({q:"",status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:ht(re()),active:!0,cli:new Set(we)}),[f,l]=(0,c.useState)(new Set),[g,v]=(0,c.useState)("lastMessageAt"),[w,C]=(0,c.useState)("desc"),[O,P]=(0,c.useState)(()=>new Set(pt(re()))),[E,M]=(0,c.useState)(()=>bt(re())),[A,K]=(0,c.useState)(()=>yt(re())),[U,j]=(0,c.useState)(!1),[x,D]=(0,c.useState)(null),[$,V]=(0,c.useState)(null),[_,ve]=(0,c.useState)(()=>St(re())),Q=`${E}:${E==="kanban"?_:"-"}`,Ce=(0,c.useRef)(!0),[Le,Pe]=(0,c.useState)(0),[G,Ue]=(0,c.useState)([]),[Se,N]=(0,c.useState)(null),[S,J]=(0,c.useState)(!1),ue=(0,c.useRef)(!1),[q,me]=(0,c.useState)(()=>{try{return window.localStorage.getItem($n)??""}catch{return""}}),[W,Y]=(0,c.useState)({data:null,key:"",fetchedAt:0}),le=(0,c.useRef)(!1),be=(0,c.useRef)(new Set),[Ie,je]=(0,c.useState)(""),[ee,ge]=(0,c.useState)(null),[ne,ae]=(0,c.useState)(null),[Ne,xe]=(0,c.useState)(null),[Re,te]=(0,c.useState)(!1),[Qe,Be]=(0,c.useState)(24),[Ee,Me]=(0,c.useState)(""),[rn,Te]=(0,c.useState)(null),[ln,ce]=(0,c.useState)(null),[cn,dn]=(0,c.useState)(null),[Nn,xn]=(0,c.useState)(null),[p,T]=(0,c.useState)(null),[R,B]=(0,c.useState)(null),[H,Oe]=(0,c.useState)(!1),Z=(0,c.useRef)(0);(0,c.useLayoutEffect)(()=>{if(Ce.current){Ce.current=!1;return}Pe(i=>i+1)},[Q]),(0,c.useEffect)(()=>{T(document.getElementById("create-session-modal"))},[]),(0,c.useEffect)(()=>{Tt().then(a)},[a]);let he=(0,c.useMemo)(()=>{let i=new Map;for(let u of e){let d=String(u.chatId??"").trim();if(!d||!r.showUnknownChats&&zn(u))continue;let b=Fe(u),y=i.get(d);(!y||b<y)&&i.set(d,b)}return[...i.entries()].sort((u,d)=>u[1].localeCompare(d[1])).map(([u,d])=>({value:u,label:d}))},[r.showUnknownChats,t,e]);(0,c.useEffect)(()=>{r.chat&&(he.some(i=>i.value===r.chat)||m(i=>({...i,chat:""})))},[he,r.chat]);let ie=(0,c.useMemo)(()=>{let i=r.q.toLowerCase(),u=[...r.cli],d=u.length>0&&u.length<we.length,b=E==="kanban",y=r.multiBotTopics||r.botTriggeredTopics?new Set(wn(e).filter(h=>!r.multiBotTopics||h.multiBot).filter(h=>!r.botTriggeredTopics||h.inferredBotTriggered).map(h=>h.key)):null,k=e.filter(h=>!d||u.includes(h.cliId??"unknown")).filter(h=>r.showUnknownChats||!zn(h)).filter(h=>!r.status||h.status===r.status).filter(h=>!r.adopt||r.adopt==="yes"==!!h.adopt).filter(h=>!r.chat||String(h.chatId??"")===r.chat).filter(h=>!r.active||b||h.status!=="closed").filter(h=>!i||Wt(h).includes(i));return y?k.filter(h=>y.has(Jn(h))).sort((h,F)=>hs(h,F,g,w)):k.sort((h,F)=>hs(h,F,g,w))},[r,t,w,g,e,E]),se=(0,c.useMemo)(()=>Jt(e),[e]),pe=(0,c.useMemo)(()=>new Map(e.map(i=>[i.sessionId,i])),[e,t]),qe=(0,c.useMemo)(()=>ie.filter(i=>i.status!=="closed"),[ie]),De=(E==="table"||E==="topics"?ie:qe).filter(i=>i.status!=="closed"),ot=[...f].map(i=>pe.get(i)).filter(i=>!!i&&i.status!=="closed"),at=De.length>0&&De.every(i=>f.has(i.sessionId)),vs=De.some(i=>f.has(i.sessionId))&&!at;(0,c.useEffect)(()=>{l(i=>{let u=!1,d=new Set;for(let b of i){let y=pe.get(b);y&&y.status!=="closed"?d.add(b):u=!0}return u?d:i})},[pe]);let En=(0,c.useCallback)(i=>{let u=new Set;if(!i)return u;for(let d of i.groupChats)u.add(d);if(Se)for(let[d,b]of Se){if(u.has(d))continue;let y=!1;for(let k of i.botIds)if(b.botIds.has(k)){y=!0;break}if(y){for(let k of b.observedNames)if(i.botNames.has(k)){u.add(d);break}}}return u},[Se]),it=(0,c.useMemo)(()=>{if(E==="kanban"&&_==="team"){let i=G.find(d=>d.key===q)??G[0],u=En(i);return ie.filter(d=>u.has(String(d.chatId)))}return ie},[_,q,G,ie,En,E]),Mn=(0,c.useCallback)(i=>Dt(it,i),[it]),An=(0,c.useCallback)(async()=>{if(!(ue.current||S)){ue.current=!0;try{let[i,u,d]=await Promise.all([fetch("/api/team/hosted").then(k=>k.json()).catch(()=>null),fetch("/api/team/remote-roster").then(k=>k.json()).catch(()=>null),fetch("/api/groups").then(k=>k.json()).catch(()=>null)]);Array.isArray(d?.chats)&&N(new Map(d.chats.map(k=>[String(k.chatId),{botIds:new Set((k.memberBots??[]).filter(h=>h.inChat).map(h=>String(h.larkAppId))),observedNames:new Set((k.observedBotNames??[]).map(h=>String(h)))}])));let b=k=>({ids:new Set(k.map(h=>String(h.larkAppId))),names:new Set(k.map(h=>String(h.name??"")).filter(Boolean))}),y=[];for(let k of i?.teams??[]){let{ids:h,names:F}=b(k.bots??[]);y.push({key:`local:${k.teamId}`,label:k.isDefault?o("team.myHostedTeam"):String(k.name??k.teamId),botIds:h,botNames:F,groupChats:new Set((k.groupChatIds??[]).map(X=>String(X)))})}for(let k of u?.memberships??[]){let{ids:h,names:F}=b(k.roster?.bots??[]);y.push({key:`${k.hubUrl}::${k.teamId}`,label:String(k.teamName??k.teamId??k.hubUrl),botIds:h,botNames:F,groupChats:new Set})}Ue(y),me(k=>y.length&&!y.some(h=>h.key===k)?y[0].key:k)}finally{J(!0),ue.current=!1}}},[S]),rt=(0,c.useCallback)(async(i,u,d,b,y)=>{try{let h=i.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(i.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:u,column:d,position:b})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:i,sessionId:u,column:d,position:b})}),F=await h.json().catch(()=>({}));(!h.ok||F?.ok===!1)&&(Y(X=>{if(!X.data||X.key!==i)return X;let oe={...X.data.board};return y?oe[u]=y:delete oe[u],{...X,data:{...X.data,board:oe}}}),h.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${F?.error??h.status}`))}catch(k){Y(h=>{if(!h.data||h.key!==i)return h;let F={...h.data.board};return y?F[u]=y:delete F[u],{...h,data:{...h.data,board:F}}}),alert(`${o("sessions.kanban.moveFail")}: ${k}`)}},[]),Cs=(0,c.useCallback)(async i=>{let u=W.key===i.key&&Date.now()-W.fetchedAt<3e4;if(!(le.current||u)){le.current=!0;try{let b=i.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(i.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(i.key)}`,y=await fetch(b),k=await y.json().catch(()=>({}));if(!y.ok||k?.ok===!1)return;let h=typeof k.deploymentId=="string"?k.deploymentId:null,F=[];for(let X of Array.isArray(k.reports)?k.reports:[])if(!(h&&X.deploymentId===h))for(let oe of Array.isArray(X.sessions)?X.sessions:[])F.push({...oe,remoteDeployment:X.deploymentName||X.deploymentId});Y({key:i.key,fetchedAt:Date.now(),data:{board:k.board&&typeof k.board=="object"?k.board:{},remoteRows:F}})}finally{le.current=!1}}},[W.fetchedAt,W.key]);(0,c.useEffect)(()=>{E==="kanban"&&_==="team"&&!S&&An()},[_,S,An,E]),(0,c.useEffect)(()=>{let i=window.setInterval(()=>{E==="kanban"&&_==="team"&&(Y(u=>({...u,fetchedAt:0})),a())},3e4);return()=>window.clearInterval(i)},[_,a,E]);let lt=(0,c.useCallback)(async(i,u,d,b)=>{try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:u,position:d})}),k=await y.json().catch(()=>({}));(!y.ok||k?.ok===!1)&&(i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),y.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${k?.error??y.status}`))}catch(y){i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),alert(`${o("sessions.kanban.moveFail")}: ${y}`)}},[a]),Ss=(0,c.useCallback)(i=>{let u=!1;for(let d of i){let b=String(d.row.sessionId);if(!b||d.row.status==="closed"&&d.column!=="done")continue;if(_==="team"){let h=G.find(oe=>oe.key===q)??G[0];if(!h)continue;let X=(W.key===h.key&&W.data?W.data.board:{})[b];Y(oe=>{let mt=oe.key===h.key&&oe.data?oe.data:{board:{},remoteRows:oe.data?.remoteRows??[]},Fs={...mt.board,[b]:{column:d.column,position:d.position}};return{...oe,key:h.key,data:{...mt,board:Fs}}}),rt(h.key,b,d.column,d.position,X),u=!0;continue}let y=Ge.sessions.get(b);if(!y)continue;let k={column:y.kanbanColumn,position:y.kanbanPosition};y.kanbanColumn=d.column,y.kanbanPosition=d.position,lt(y,d.column,d.position,k),u=!0}u&&a()},[_,q,G,W,lt,rt,a]),ct=(0,c.useCallback)(async(i,u)=>{let d=i.title;i.title=u,a();try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:u})}),y=await b.json().catch(()=>({}));(!b.ok||y?.ok===!1)&&(i.title=d,a(),b.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${y?.error??b.status}`))}catch(b){i.title=d,a(),alert(`${o("sessions.kanban.renameFail")}: ${b}`)}},[a]),Ln=(0,c.useCallback)(async i=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/locate`,{method:"POST"}),d=await u.json();return d.ok?!0:(alert(`Locate failed: ${d.error??u.status}`),!1)}catch(u){return alert(`Locate error: ${u}`),!1}},[]),Pn=(0,c.useCallback)(async(i,u)=>{if(!confirm(o("sessions.closeConfirm")))return!1;u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/close`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`Close failed: ${b?.error??d.status}`),!1):(l(y=>{let k=new Set(y);return k.delete(i.sessionId),k}),a(),!0)}catch(d){return alert(`Close error: ${d}`),!1}finally{u&&(u.disabled=!1)}},[a]),un=(0,c.useCallback)(async(i,u,d)=>{let b=!!i.locked;if(b===u)return!0;i.locked=u,a(),d&&(d.disabled=!0);try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:u})}),k=await y.json().catch(()=>({}));return!y.ok||k?.ok===!1?(i.locked=b,a(),y.status!==401&&alert(`${o("sessions.lockFailed")}: ${k?.error??y.status}`),!1):(i.locked=!!k.locked,a(),!0)}catch(y){return i.locked=b,a(),alert(`${o("sessions.lockFailed")}: ${y}`),!1}finally{d&&(d.disabled=!1)}},[a]),mn=(0,c.useCallback)(async(i,u)=>{if(be.current.has(i.sessionId)||!confirm(Yt(i)))return!1;u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/restart`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`${o("sessions.restartFailed")}: ${b?.message??b?.error??d.status}`),!1):(be.current.add(i.sessionId),window.setTimeout(()=>be.current.delete(i.sessionId),5e3),!0)}catch(d){return alert(`${o("sessions.restartFailed")}: ${d}`),!1}finally{u&&(u.disabled=!1)}},[]),Is=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/resume`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(alert(`${o("sessions.resumeFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.resumeFailed")}: ${d}`),!1}finally{u&&(u.disabled=!1)}},[]),Ts=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/start`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(d.status!==401&&alert(`${o("sessions.create.startFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.create.startFailed")}: ${d}`),!1}finally{u&&(u.disabled=!1)}},[]),gn=(0,c.useCallback)(i=>{ce({sessionId:i.sessionId,loading:!0,messages:[]}),(async()=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/history?limit=80`),d=await u.json().catch(()=>({}));if(!u.ok||d?.ok===!1){let y=String(d?.error??u.status),k=y==="not_found_yet"||y==="not_found";ce(h=>h?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:y,stale:k}:h);return}let b=Array.isArray(d.messages)?d.messages:[];ce(y=>y?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:b,ownerOpenId:d.ownerOpenId}:y)}catch(u){ce(d=>d?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:String(u)}:d)}})()},[]),Ns=(0,c.useCallback)(i=>{if(!Xe())return;let u=tn(i);if(!u){Te(i.sessionId);return}dn({sessionId:i.sessionId,url:u,loading:!1})},[]),xs=(0,c.useCallback)((i,u)=>{Wn(i,u)},[]),Rs=(0,c.useCallback)(async()=>{let i=[...f];if(i.length===0||!confirm(o("sessions.closeBulkConfirm",{count:i.length})))return;ge({done:0,total:i.length});let u=0,d=0,b=[...i];async function y(){for(;b.length;){let k=b.shift();try{let h=await fetch(`/api/sessions/${encodeURIComponent(k)}/close`,{method:"POST"}),F=await h.json().catch(()=>({}));(!h.ok||F?.ok===!1)&&(d+=1)}catch{d+=1}finally{u+=1,ge({done:u,total:i.length})}}}await Promise.all(Array.from({length:Math.min(6,i.length)},()=>y())),ge(null),l(new Set),a(),d>0&&alert(`Failed: ${d}/${i.length}`)},[a,f]),Es=(0,c.useCallback)(async i=>{let u=[...f].map(h=>pe.get(h)).filter(h=>!!h&&h.status!=="closed"&&!!h.locked!==i);if(u.length===0)return;ae({locked:i,done:0,total:u.length});let d=0,b=0,y=[...u];async function k(){for(;y.length;){let h=y.shift(),F=!!h.locked;try{let X=await fetch(`/api/sessions/${encodeURIComponent(h.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:i})}),oe=await X.json().catch(()=>({}));!X.ok||oe?.ok===!1?(b+=1,h.locked=F):h.locked=!!oe.locked}catch{b+=1,h.locked=F}finally{d+=1,ae({locked:i,done:d,total:u.length})}}}await Promise.all(Array.from({length:Math.min(6,u.length)},()=>k())),ae(null),a(),b>0&&alert(`${o("sessions.lockFailed")}: ${b}/${u.length}`)},[a,pe,f]),Ms=(0,c.useCallback)(()=>{let i=[...f].filter(d=>!!pe.get(d));if(i.length===0)return;let u=Bt(i);xe(o("sessions.monitorRoomAdded",{added:u.added,total:u.total})),window.setTimeout(()=>xe(null),1800)},[pe,f]),As=(0,c.useCallback)(async i=>{let u=Kn(i);if(!u)return;let d=Mn(u);if(d.length!==0){Be(u),te(!0),Me(o("sessions.idleCleanupRunning"));try{let b=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:u,sessionIds:d.map(k=>k.sessionId)})}),y=await b.json().catch(()=>({}));if(!b.ok){b.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${y?.error??b.status}`),Me("");return}l(k=>{let h=new Set(k);for(let F of y?.results??[])F?.ok&&F?.sessionId&&h.delete(String(F.sessionId));return h}),Me(o("sessions.idleCleanupDone",{closed:Number(y?.closed??0),failed:Number(y?.failed??0)})),a()}catch(b){alert(`${o("sessions.idleCleanupFailed")}: ${b}`),Me("")}finally{te(!1)}}},[Mn,a]),Ls=i=>{let u=ft(i)??"board";u!==E&&(M(u),kt(re(),u))},Ps=(i,u)=>{K(d=>{let b=d.indexOf(i),y=b+u;if(b<0||y<0||y>=d.length)return d;let k=[...d];return k.splice(b,1),k.splice(y,0,i),Dn(re(),k),k})},Bs=(i,u)=>{i!==u&&K(d=>{let b=d.indexOf(i),y=d.indexOf(u);if(b<0||y<0)return d;let k=[...d];return k.splice(b,1),k.splice(y,0,i),Dn(re(),k),k})},Os=(0,c.useMemo)(()=>({rows:ie,groupBy:_,teams:G,teamsLoaded:S,teamKey:q,teamBoardData:W.data,teamBoardKey:W.key}),[_,q,G,S,ie,W.data,W.key]),Ds=rn?pe.get(rn)??null:null,Bn=(0,c.useMemo)(()=>S?G.length?G.map(i=>({value:i.key,label:i.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[G,S]),$s=!S||G.length===0,dt=G.some(i=>i.key===q)?q:Bn[0]?.value??"",Hs=Bn.find(i=>i.value===dt)?.label??o("sessions.kanban.groupTeam"),_s=(0,c.useCallback)(()=>{Z.current+=1,Oe(!1),B(null)},[]),ut=(0,c.useCallback)(async()=>{let i=Z.current+1;Z.current=i,B({bots:[],loading:!0}),Oe(!0);try{let u=await Zt();if(Z.current!==i)return;B({bots:u})}finally{Z.current===i&&Oe(!1)}},[]),Ks=(0,c.useCallback)(async()=>{let i=window.prompt(o("sessions.debugTerminalPrompt"),"");if(i===null)return;let u=i.trim(),d=window.open("about:blank","_blank");d&&(d.opener=null);try{let b=await fetch("/api/debug-terminal",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u?{workingDir:u}:{})}),y=await b.json().catch(()=>({}));if(!b.ok||y?.ok===!1||!y?.url){d?.close(),b.status!==401&&alert(`${o("sessions.debugTerminalFail")}: ${y?.error??b.status}`);return}d?d.location.href=y.url:window.open(y.url,"_blank","noopener")}catch(b){d?.close(),alert(`${o("sessions.debugTerminalFail")}: ${b}`)}},[]);return(0,c.useEffect)(()=>{let i=()=>{At()&&$e.authed&&ut()};return i(),window.addEventListener(Hn,i),()=>window.removeEventListener(Hn,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:E===i?"active":void 0,"aria-pressed":E===i,onClick:()=>Ls(i),children:u},i))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${E==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":E!=="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:_===i?"active":void 0,"aria-pressed":_===i,onClick:()=>{ve(i),It(re(),i)},children:u},i))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(E==="kanban"&&_==="team"&&S),children:Ie}),(0,n.jsx)(en,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(E==="kanban"&&_==="team"),disabled:$s,label:Hs,value:dt,options:Bn,onChange:i=>{if(G.some(u=>u.key===i)){me(i);try{window.localStorage.setItem($n,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=Ot()},children:o("sessions.monitorRoom")}):null,$e.authed?(0,n.jsx)("button",{type:"button",className:"debug-terminal-btn",title:o("sessions.debugTerminalHint"),onClick:()=>{Ks()},children:o("sessions.debugTerminal")}):null,$e.authed?(0,n.jsx)(xt,{className:"page-primary-action create-session-btn",disabled:H,onClick:()=>{ut()},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:se.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:se.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:se.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(So,{chatOptions:he,filters:r,setFilters:m,idleCleanup:{busy:Re,hours:Qe,status:Ee,countForHours:i=>Mn(i).length,onRun:As}}),(0,n.jsx)(Io,{selectedCount:f.size,lockDisabled:!ot.some(i=>!i.locked),unlockDisabled:!ot.some(i=>!!i.locked),closeProgress:ee,lockProgress:ne,monitorRoomText:Ne,onClear:()=>l(new Set),onClose:()=>{Rs()},onAddToMonitorRoom:Ms,onLock:i=>{Es(i)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${Le>0?" sessions-view-stage-enter":""}`,"data-view":E,"data-kanban-group":_,children:[(0,n.jsx)(No,{rows:ie,selected:f,hidden:E!=="table",sortKey:g,sortDir:w,selectAllChecked:at,selectAllIndeterminate:vs,selectAllDisabled:De.length===0,hiddenColumns:O,onToggleColumn:i=>{let u=!O.has(i),d=new Set(O);u?d.add(i):d.delete(i),On(re(),Array.from(d)),P(d),u&&i===g&&(v("lastMessageAt"),C("desc"))},onResetColumns:()=>{P(new Set),On(re(),[])},onOpen:i=>Te(i.sessionId),onSelect:(i,u)=>l(d=>{let b=new Set(d);return u?b.add(i):b.delete(i),b}),onSelectAll:i=>l(u=>{let d=new Set(u);for(let b of De)i?d.add(b.sessionId):d.delete(b.sessionId);return d}),onSort:i=>{g===i?C(w==="asc"?"desc":"asc"):(v(i),C(i==="spawnedAt"||i==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(Ro,{rows:qe,selected:f,hidden:E!=="board",order:A,animated:U,dragColId:x,dragOverCol:$,onAnimated:()=>j(!0),onMoveColumn:Ps,onMoveColumnTo:Bs,onDragCol:D,onDragOverCol:V,onToggleSelect:i=>l(u=>{let d=new Set(u);return d.has(i.sessionId)?d.delete(i.sessionId):d.add(i.sessionId),d}),onOpen:i=>Te(i.sessionId),onHistory:gn,onLocate:i=>Ln(i),onRestart:(i,u)=>{mn(i,u)},onLock:(i,u,d)=>{un(i,u,d)},onClose:(i,u)=>{Pn(i,u)}}),(0,n.jsx)(Mo,{rows:ie,relationRows:e,selected:f,hidden:E!=="topics",onToggleSelect:i=>l(u=>{let d=new Set(u);return d.has(i.sessionId)?d.delete(i.sessionId):d.add(i.sessionId),d}),onOpen:i=>Te(i.sessionId),onHistory:gn,onLocate:i=>Ln(i),onRestart:(i,u)=>{mn(i,u)},onLock:(i,u,d)=>{un(i,u,d)},onClose:(i,u)=>{Pn(i,u)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:xn,className:`sessions-kanban${_==="bot"?" kanban-mode-bot":""}`,hidden:E!=="kanban",children:E==="kanban"?(0,n.jsx)(ps,{host:Nn,...Os,canRestartSession:Sn,getTeamChatIds:En,icons:{details:z.details,feishu:z.feishu,history:z.history,key:z.key,lock:z.lock,restart:z.restart,terminal:z.terminal,unlock:z.unlock},lockActionLabel:Cn,sessionStatusText:nn,onDetails:i=>Te(String(i.sessionId)),onHistory:gn,onMoveRows:Ss,onNeedTeamBoard:i=>{Cs(i)},onNeedTeams:()=>{An()},onOpenTerminal:Xe()?Ns:void 0,onOpenWritableTerminal:Xe()&&vn()?xs:void 0,onRename:(i,u)=>{let d=Ge.sessions.get(String(i.sessionId));d&&ct(d,u)},onRestart:(i,u)=>{let d=Ge.sessions.get(String(i.sessionId));d&&mn(d,u)},onTeamScope:i=>je(i?o("sessions.kanban.teamScope",{chats:i.chats,sessions:i.sessions}):""),onToggleLock:(i,u)=>{let d=Ge.sessions.get(String(i.sessionId));d&&un(d,!d.locked,u)},onToggleSelect:i=>l(u=>{let d=String(i.sessionId),b=new Set(u);return b.has(d)?b.delete(d):b.add(d),b}),selectedSessionIds:f}):null})]},Le),(0,n.jsx)($o,{row:Ds,onClose:()=>Te(null),locateSession:Ln,openHistory:gn,resumeSession:Is,restartSession:mn,closeSession:Pn,setSessionLocked:un,startSession:Ts}),(0,n.jsx)(Bo,{state:cn,onClose:()=>dn(null),onRename:ct}),(0,n.jsx)(Lo,{state:ln,onClose:()=>ce(null)}),p?(0,on.createPortal)((0,n.jsx)(Ho,{dialog:p,state:R,onClose:_s,onSuccess:i=>B(u=>u&&{...u,success:i})}),p):null]})}function Ra(e){return Nt(e,(0,n.jsx)(_o,{}))}export{Co as CliFilterGroup,Mo as TopicGroupsView,Ra as renderSessionsPage};
|