@xopcai/xopc 0.0.66 → 0.0.67
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/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agents-JiJR38n1.js → agents-CmhOU0fB.js} +2 -2
- package/dist/gateway/static/root/assets/{agents-JiJR38n1.js.map → agents-CmhOU0fB.js.map} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-aBDyr7Im.js → apps-page-CzS9A_6L.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-aBDyr7Im.js.map → apps-page-CzS9A_6L.js.map} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-DXxfgG4N.js → channels-settings-Bn0YSztA.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-DXxfgG4N.js.map → channels-settings-Bn0YSztA.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-dreaming-jobs-3--QJSP5.js → cron-dreaming-jobs-bAYsiHdF.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-dreaming-jobs-3--QJSP5.js.map → cron-dreaming-jobs-bAYsiHdF.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-CCn-JwBy.js → cron-page-CKqDtScu.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-CCn-JwBy.js.map → cron-page-CKqDtScu.js.map} +1 -1
- package/dist/gateway/static/root/assets/{dist-BS-cwfHQ.js → dist-CUMhnSuX.js} +2 -2
- package/dist/gateway/static/root/assets/{dist-BS-cwfHQ.js.map → dist-CUMhnSuX.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-M8JS4Jid.js → extension-debug-page-BDls5xp3.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-M8JS4Jid.js.map → extension-debug-page-BDls5xp3.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C8gjVE_t.js → extension-page-BSfv53OO.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-C8gjVE_t.js.map → extension-page-BSfv53OO.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DeY2M2di.js → extension-settings-page-B0nkVsLi.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-DeY2M2di.js.map → extension-settings-page-B0nkVsLi.js.map} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DWmeyjyR.js → heartbeat-config-api-P5zdbIBw.js} +2 -2
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DWmeyjyR.js.map → heartbeat-config-api-P5zdbIBw.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-Cc57jhuG.js → index-DAglRwh4.js} +5 -5
- package/dist/gateway/static/root/assets/{index-Cc57jhuG.js.map → index-DAglRwh4.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-DHj3Cf9B.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-kIsSDMqb.js → logs-page-CfGDv4k7.js} +2 -2
- package/dist/gateway/static/root/assets/{logs-page-kIsSDMqb.js.map → logs-page-CfGDv4k7.js.map} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-Da9gjMh7.js → sessions-page-DoGE8N-O.js} +2 -2
- package/dist/gateway/static/root/assets/{sessions-page-Da9gjMh7.js.map → sessions-page-DoGE8N-O.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C5VrwDoO.js +3 -0
- package/dist/gateway/static/root/assets/settings-page-C5VrwDoO.js.map +1 -0
- package/dist/gateway/static/root/assets/{skills-page-B_msZcLx.js → skills-page-ADUi69Fa.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-B_msZcLx.js.map → skills-page-ADUi69Fa.js.map} +1 -1
- package/dist/gateway/static/root/assets/{use-image-provider-credentials-Bs8xl2E3.js → use-image-provider-credentials-C4x4dNv2.js} +2 -2
- package/dist/gateway/static/root/assets/{use-image-provider-credentials-Bs8xl2E3.js.map → use-image-provider-credentials-C4x4dNv2.js.map} +1 -1
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/cli/commands/tunnel.js +69 -8
- package/dist/src/cli/commands/tunnel.js.map +1 -1
- package/dist/src/config/schema.d.ts +2 -0
- package/dist/src/config/schema.js +2 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +2 -5
- package/dist/src/gateway/hono/lib/config-payload.js +3 -5
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +12 -10
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/tunnel/acme-client.d.ts +11 -0
- package/dist/src/tunnel/acme-client.js +54 -10
- package/dist/src/tunnel/acme-client.js.map +1 -1
- package/dist/src/tunnel/env.d.ts +14 -3
- package/dist/src/tunnel/env.js +34 -5
- package/dist/src/tunnel/env.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.d.ts +6 -1
- package/dist/src/tunnel/frpc-binary.js +66 -40
- package/dist/src/tunnel/frpc-binary.js.map +1 -1
- package/dist/src/tunnel/frpc-extract.d.ts +10 -0
- package/dist/src/tunnel/frpc-extract.js +129 -0
- package/dist/src/tunnel/frpc-extract.js.map +1 -0
- package/dist/src/tunnel/gateway-lifecycle.d.ts +3 -1
- package/dist/src/tunnel/gateway-lifecycle.js +6 -4
- package/dist/src/tunnel/gateway-lifecycle.js.map +1 -1
- package/dist/src/tunnel/index.d.ts +3 -1
- package/dist/src/tunnel/index.js +2 -2
- package/dist/src/tunnel/tls-server.js +5 -0
- package/dist/src/tunnel/tls-server.js.map +1 -1
- package/dist/src/tunnel/tunnel-config.js +11 -1
- package/dist/src/tunnel/tunnel-config.js.map +1 -1
- package/dist/src/tunnel/tunnel-e2e-config.d.ts +4 -1
- package/dist/src/tunnel/tunnel-e2e-config.js +10 -3
- package/dist/src/tunnel/tunnel-e2e-config.js.map +1 -1
- package/dist/src/tunnel/tunnel-service.d.ts +4 -0
- package/dist/src/tunnel/tunnel-service.js +66 -5
- package/dist/src/tunnel/tunnel-service.js.map +1 -1
- package/dist/src/tunnel/tunnel-types.d.ts +16 -0
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/index-B5gp15_q.css +0 -1
- package/dist/gateway/static/root/assets/settings-page-B0spIRVS.js +0 -3
- package/dist/gateway/static/root/assets/settings-page-B0spIRVS.js.map +0 -1
package/dist/gateway/static/root/assets/{sessions-page-Da9gjMh7.js → sessions-page-DoGE8N-O.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{a as t,n,t as r}from"./vendor-react-vzx_MT5D.js";import{i}from"./vendor-swr-CQnUjdeQ.js";import{Ar as a,At as o,Ct as s,Dt as c,Et as l,Fi as ee,Hn as u,Ht as te,Ii as ne,Ir as re,It as d,Jn as ie,Jr as ae,Kr as oe,Lt as f,Nn as se,On as p,Ot as m,Rt as ce,St as h,Tt as g,Ut as _,Vn as v,Vt as y,Wi as b,Wt as x,Yn as S,at as C,bi as w,dt as T,fi as E,ft as le,jr as D,kt as O,l as k,ot as A,qn as j,qr as M,ri as N,rr as P,s as ue,ut as F,vr as de,wt as fe,xt as pe,zt as I}from"./index-Cc57jhuG.js";var L=e(t(),1),me=n(),R=r();function he(e){let t=new Date(e),n=Math.floor((new Date().getTime()-t.getTime())/(1e3*60*60*24));return n===0?t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}):n===1?`Yesterday`:n<7?t.toLocaleDateString([],{weekday:`short`}):t.toLocaleDateString([],{month:`short`,day:`numeric`})}function ge(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function _e(e){let t=(0,me.c)(105),{session:n,variant:r,labels:i,sessionAgentId:o,sessionAgentAvatar:s,onOpen:c,onAction:l}=e,u;t[0]!==i.unnamedSession||t[1]!==n.name?(u=n.name?.trim()||i.unnamedSession,t[0]=i.unnamedSession,t[1]=n.name,t[2]=u):u=t[2];let te=u,d;t[3]===n.name?d=t[4]:(d=n.name?.trim(),t[3]=n.name,t[4]=d);let ae=!!d,oe=n.status===`archived`,f=n.status===`pinned`,se=r===`list`&&`sm:flex-row sm:items-center sm:gap-4`,p;t[5]===se?p=t[6]:(p=j(`group flex min-w-0 w-full max-w-full cursor-pointer flex-col rounded-xl bg-surface-base text-left transition-colors duration-150 ease-out`,`hover:bg-surface-hover active:scale-[0.99]`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,se),t[5]=se,t[6]=p);let m;t[7]===c?m=t[8]:(m=e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),c())},t[7]=c,t[8]=m);let ce=r===`list`&&`sm:py-3`,h;t[9]===ce?h=t[10]:(h=j(`flex min-w-0 items-start justify-between gap-2 bg-surface-hover/35 px-3 py-2 dark:bg-surface-hover/25`,ce),t[9]=ce,t[10]=h);let g;t[11]===n.sourceChannel?g=t[12]:(g=(0,R.jsx)(`div`,{className:`flex min-w-0 items-center gap-2`,children:(0,R.jsx)(`span`,{className:`truncate text-[11px] font-medium uppercase tracking-wide text-fg-subtle`,children:n.sourceChannel})}),t[11]=n.sourceChannel,t[12]=g);let _;t[13]===f?_=t[14]:(_=f?(0,R.jsx)(a,{className:`size-3.5 text-accent-fg`,strokeWidth:1.75,"aria-hidden":!0}):null,t[13]=f,t[14]=_);let v;t[15]===n.updatedAt?v=t[16]:(v=he(n.updatedAt),t[15]=n.updatedAt,t[16]=v);let y;t[17]===v?y=t[18]:(y=(0,R.jsx)(`span`,{children:v}),t[17]=v,t[18]=y);let b;t[19]!==y||t[20]!==_?(b=(0,R.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 text-xs text-fg-muted`,children:[_,y]}),t[19]=y,t[20]=_,t[21]=b):b=t[21];let x;t[22]!==b||t[23]!==h||t[24]!==g?(x=(0,R.jsxs)(`div`,{className:h,children:[g,b]}),t[22]=b,t[23]=h,t[24]=g,t[25]=x):x=t[25];let S=r===`list`&&`sm:py-3`,w;t[26]===S?w=t[27]:(w=j(`min-w-0 flex-1 px-3 py-2`,S),t[26]=S,t[27]=w);let T=r===`list`&&`sm:items-start`,O;t[28]===T?O=t[29]:(O=j(`flex gap-3`,T),t[28]=T,t[29]=O);let k;t[30]!==s||t[31]!==o?(k=(0,R.jsx)(le,{agentId:o,avatar:s,size:40,className:`size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge`}),t[30]=s,t[31]=o,t[32]=k):k=t[32];let A;t[33]===te?A=t[34]:(A=(0,R.jsx)(`div`,{className:`min-w-0 max-w-full truncate text-sm font-semibold text-fg`,title:te,children:te}),t[33]=te,t[34]=A);let M;t[35]!==n.key||t[36]!==ae?(M=ae?(0,R.jsx)(`div`,{className:`mt-0.5 min-w-0 max-w-full truncate font-mono text-[11px] text-fg-subtle`,title:n.key,children:n.key}):null,t[35]=n.key,t[36]=ae,t[37]=M):M=t[37];let N;t[38]!==A||t[39]!==M?(N=(0,R.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[A,M]}),t[38]=A,t[39]=M,t[40]=N):N=t[40];let ue;t[41]!==O||t[42]!==k||t[43]!==N?(ue=(0,R.jsxs)(`div`,{className:O,children:[k,N]}),t[41]=O,t[42]=k,t[43]=N,t[44]=ue):ue=t[44];let F;t[45]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,R.jsx)(re,{className:`size-3.5`,strokeWidth:1.75,"aria-hidden":!0}),t[45]=F):F=t[45];let de;t[46]===n.messageCount?de=t[47]:(de=(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[F,n.messageCount]}),t[46]=n.messageCount,t[47]=de);let fe;t[48]===Symbol.for(`react.memo_cache_sentinel`)?(fe=(0,R.jsx)(ie,{className:`size-3.5`,strokeWidth:1.75,"aria-hidden":!0}),t[48]=fe):fe=t[48];let pe;t[49]===n.estimatedTokens?pe=t[50]:(pe=ge(n.estimatedTokens),t[49]=n.estimatedTokens,t[50]=pe);let I;t[51]===pe?I=t[52]:(I=(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[fe,pe]}),t[51]=pe,t[52]=I);let L;t[53]!==de||t[54]!==I?(L=(0,R.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-3 text-xs text-fg-muted`,children:[de,I]}),t[53]=de,t[54]=I,t[55]=L):L=t[55];let _e;t[56]===n.tags?_e=t[57]:(_e=n.tags.length>0?(0,R.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1`,children:[n.tags.slice(0,3).map(ye),n.tags.length>3?(0,R.jsxs)(`span`,{className:`text-[11px] text-fg-disabled`,children:[`+`,n.tags.length-3]}):null]}):null,t[56]=n.tags,t[57]=_e);let B;t[58]!==w||t[59]!==ue||t[60]!==L||t[61]!==_e?(B=(0,R.jsxs)(`div`,{className:w,children:[ue,L,_e]}),t[58]=w,t[59]=ue,t[60]=L,t[61]=_e,t[62]=B):B=t[62];let be;t[63]===l?be=t[64]:(be=()=>l(`continue`),t[63]=l,t[64]=be);let xe;t[65]===Symbol.for(`react.memo_cache_sentinel`)?(xe=(0,R.jsx)(re,{className:`size-4`,strokeWidth:1.75}),t[65]=xe):xe=t[65];let V;t[66]!==i.continueChat||t[67]!==be?(V=(0,R.jsx)(`button`,{type:`button`,className:C,title:i.continueChat,"aria-label":i.continueChat,onClick:be,children:xe}),t[66]=i.continueChat,t[67]=be,t[68]=V):V=t[68];let H;t[69]!==oe||t[70]!==i.archive||t[71]!==i.unarchive||t[72]!==l?(H=oe?(0,R.jsx)(`button`,{type:`button`,className:C,title:i.unarchive,"aria-label":i.unarchive,onClick:()=>l(`unarchive`),children:(0,R.jsx)(ne,{className:`size-4`,strokeWidth:1.75})}):(0,R.jsx)(`button`,{type:`button`,className:C,title:i.archive,"aria-label":i.archive,onClick:()=>l(`archive`),children:(0,R.jsx)(ee,{className:`size-4`,strokeWidth:1.75})}),t[69]=oe,t[70]=i.archive,t[71]=i.unarchive,t[72]=l,t[73]=H):H=t[73];let U;t[74]!==f||t[75]!==i.pin||t[76]!==i.unpin||t[77]!==l?(U=f?(0,R.jsx)(`button`,{type:`button`,className:C,title:i.unpin,"aria-label":i.unpin,onClick:()=>l(`unpin`),children:(0,R.jsx)(D,{className:`size-4`,strokeWidth:1.75})}):(0,R.jsx)(`button`,{type:`button`,className:C,title:i.pin,"aria-label":i.pin,onClick:()=>l(`pin`),children:(0,R.jsx)(a,{className:`size-4`,strokeWidth:1.75})}),t[74]=f,t[75]=i.pin,t[76]=i.unpin,t[77]=l,t[78]=U):U=t[78];let W;t[79]===l?W=t[80]:(W=()=>l(`export`),t[79]=l,t[80]=W);let G;t[81]===Symbol.for(`react.memo_cache_sentinel`)?(G=(0,R.jsx)(E,{className:`size-4`,strokeWidth:1.75}),t[81]=G):G=t[81];let K;t[82]!==i.export||t[83]!==W?(K=(0,R.jsx)(`button`,{type:`button`,className:C,title:i.export,"aria-label":i.export,onClick:W,children:G}),t[82]=i.export,t[83]=W,t[84]=K):K=t[84];let q;t[85]===Symbol.for(`react.memo_cache_sentinel`)?(q=j(C,`text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40`),t[85]=q):q=t[85];let J;t[86]===l?J=t[87]:(J=()=>l(`delete`),t[86]=l,t[87]=J);let Y;t[88]===Symbol.for(`react.memo_cache_sentinel`)?(Y=(0,R.jsx)(P,{className:`size-4`,strokeWidth:1.75}),t[88]=Y):Y=t[88];let X;t[89]!==i.delete||t[90]!==J?(X=(0,R.jsx)(`button`,{type:`button`,className:q,title:i.delete,"aria-label":i.delete,onClick:J,children:Y}),t[89]=i.delete,t[90]=J,t[91]=X):X=t[91];let Z;t[92]!==V||t[93]!==H||t[94]!==U||t[95]!==K||t[96]!==X?(Z=(0,R.jsxs)(`div`,{role:`group`,className:`flex flex-wrap items-center gap-0.5 border-t border-edge-subtle/80 bg-surface-hover/25 p-2 dark:border-edge-subtle`,onClick:z,onKeyDown:ve,children:[V,H,U,K,X]}),t[92]=V,t[93]=H,t[94]=U,t[95]=K,t[96]=X,t[97]=Z):Z=t[97];let Q;return t[98]!==c||t[99]!==x||t[100]!==B||t[101]!==p||t[102]!==Z||t[103]!==m?(Q=(0,R.jsxs)(`div`,{role:`button`,tabIndex:0,className:p,onClick:c,onKeyDown:m,children:[x,B,Z]}),t[98]=c,t[99]=x,t[100]=B,t[101]=p,t[102]=Z,t[103]=m,t[104]=Q):Q=t[104],Q}function ve(e){return e.stopPropagation()}function z(e){return e.stopPropagation()}function ye(e){return(0,R.jsx)(`span`,{className:`max-w-full break-words rounded-md bg-surface-hover px-1.5 py-0.5 text-[11px] text-fg-muted`,children:e},e)}function B(e){if(typeof e==`string`)return e.length>2e3?`${e.slice(0,2e3)}…`:e;try{let t=JSON.stringify(e,null,2);return t.length>2e3?`${t.slice(0,2e3)}…`:t}catch{return String(e)}}function be(e){let t=(0,me.c)(60),{open:n,loading:r,session:i,sessionAgentId:a,sessionAgentAvatar:o,labels:s,onClose:c,onArchive:l,onUnarchive:ee,onPin:ne,onUnpin:re,onExport:d,onDelete:ie}=e,ae=i?.status===`archived`,oe=i?.status===`pinned`,f;t[0]===c?f=t[1]:(f=e=>!e&&c(),t[0]=c,t[1]=f);let se;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(se=(0,R.jsx)(y,{className:j(`xopc-dialog-overlay fixed inset-0 bg-scrim`,k)}),t[2]=se):se=t[2];let p;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(p=j(`xopc-drawer-right fixed right-0 top-0 flex size-full max-w-lg flex-col border-l border-edge bg-surface-panel shadow-popover outline-none`,ue,`dark:border-edge`),t[3]=p):p=t[3];let m;t[4]!==i||t[5]!==o||t[6]!==a?(m=i&&a?(0,R.jsx)(le,{agentId:a,avatar:o,size:40,className:`size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge`}):null,t[4]=i,t[5]=o,t[6]=a,t[7]=m):m=t[7];let h;t[8]!==s.unnamedSession||t[9]!==i?.name?(h=i?.name?.trim()||s.unnamedSession,t[8]=s.unnamedSession,t[9]=i?.name,t[10]=h):h=t[10];let g;t[11]===h?g=t[12]:(g=(0,R.jsx)(x,{className:`min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-fg`,children:h}),t[11]=h,t[12]=g);let v;t[13]!==m||t[14]!==g?(v=(0,R.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-3`,children:[m,g]}),t[13]=m,t[14]=g,t[15]=v):v=t[15];let b;t[16]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,R.jsx)(S,{className:`size-5`,strokeWidth:1.75}),t[16]=b):b=t[16];let C;t[17]===s.close?C=t[18]:(C=(0,R.jsx)(ce,{asChild:!0,children:(0,R.jsx)(u,{type:`button`,variant:`ghost`,className:`size-9 shrink-0 p-0`,"aria-label":s.close,children:b})}),t[17]=s.close,t[18]=C);let w;t[19]!==v||t[20]!==C?(w=(0,R.jsxs)(`div`,{className:`flex min-w-0 shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3 dark:border-edge`,children:[v,C]}),t[19]=v,t[20]=C,t[21]=w):w=t[21];let T;t[22]!==s.detailLoading||t[23]!==s.detailMessages||t[24]!==r||t[25]!==i?(T=r?(0,R.jsx)(`p`,{className:`text-sm text-fg-muted`,children:s.detailLoading}):i?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`dl`,{className:`mb-4 grid gap-2 text-xs text-fg-muted`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-fg-disabled`,children:`Key`}),(0,R.jsx)(`dd`,{className:`mt-0.5 break-all font-mono text-fg`,children:i.key})]}),(0,R.jsx)(`div`,{className:`flex flex-wrap gap-4`,children:(0,R.jsxs)(`span`,{children:[i.messageCount,` msgs · `,i.estimatedTokens,` tok`]})})]}),(0,R.jsx)(`h3`,{className:`mb-2 text-xs font-medium uppercase tracking-wide text-fg-subtle`,children:s.detailMessages}),(0,R.jsx)(`ul`,{className:`space-y-3`,children:i.messages.map(xe)})]}):null,t[22]=s.detailLoading,t[23]=s.detailMessages,t[24]=r,t[25]=i,t[26]=T):T=t[26];let E;t[27]===T?E=t[28]:(E=(0,R.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-3`,children:T}),t[27]=T,t[28]=E);let D;t[29]!==s.detailExport||t[30]!==d?(D=(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:d,children:s.detailExport}),t[29]=s.detailExport,t[30]=d,t[31]=D):D=t[31];let O;t[32]!==ae||t[33]!==s.archive||t[34]!==s.unarchive||t[35]!==l||t[36]!==ee?(O=ae?(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:ee,children:s.unarchive}):(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:l,children:s.archive}),t[32]=ae,t[33]=s.archive,t[34]=s.unarchive,t[35]=l,t[36]=ee,t[37]=O):O=t[37];let A;t[38]!==oe||t[39]!==s.pin||t[40]!==s.unpin||t[41]!==ne||t[42]!==re?(A=oe?(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:re,children:s.unpin}):(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:ne,children:s.pin}),t[38]=oe,t[39]=s.pin,t[40]=s.unpin,t[41]=ne,t[42]=re,t[43]=A):A=t[43];let M;t[44]!==s.delete||t[45]!==ie?(M=(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40`,onClick:ie,children:s.delete}),t[44]=s.delete,t[45]=ie,t[46]=M):M=t[46];let N;t[47]!==D||t[48]!==O||t[49]!==A||t[50]!==M?(N=(0,R.jsx)(`div`,{className:`shrink-0 border-t border-edge px-4 py-3 dark:border-edge`,children:(0,R.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[D,O,A,M]})}),t[47]=D,t[48]=O,t[49]=A,t[50]=M,t[51]=N):N=t[51];let P;t[52]!==w||t[53]!==E||t[54]!==N?(P=(0,R.jsxs)(te,{children:[se,(0,R.jsxs)(I,{className:p,"aria-describedby":void 0,children:[w,E,N]})]}),t[52]=w,t[53]=E,t[54]=N,t[55]=P):P=t[55];let F;return t[56]!==n||t[57]!==f||t[58]!==P?(F=(0,R.jsx)(_,{open:n,onOpenChange:f,children:P}),t[56]=n,t[57]=f,t[58]=P,t[59]=F):F=t[59],F}function xe(e){return(0,R.jsxs)(`li`,{className:`rounded-lg border border-edge-subtle bg-surface-hover/50 p-2 dark:border-edge`,children:[(0,R.jsx)(`div`,{className:`mb-1 text-[10px] font-medium uppercase text-fg-subtle`,children:e.role}),(0,R.jsx)(`pre`,{className:`max-h-40 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-fg-muted`,children:B(e.content)})]},`${e.timestamp??``}-${e.role}-${B(e.content).slice(0,24)}`)}var V=20;function H(e,t){return e.replace(/\{\{(\w+)\}\}/g,(e,n)=>String(t[n]??``))}var U=new Set([`all`,`active`,`pinned`,`archived`]),W=new Set([`grid`,`list`]);function G(){let e=v(se(e=>e.language)),t=e.sessions,n=p(e=>e.token),r=!!n,{data:ne,mutate:re}=i(r?[`gateway-chat-agents`,n]:null,o,{revalidateOnFocus:!1}),ie=ne?.defaultId??`main`,ce=ne?.items??[],[S,C]=b(),E=S.get(`q`)??``,le=S.get(`status`),D=S.get(`view`),P=S.get(`channel`)??``,me=U.has(le)?le:`all`,he=W.has(D)?D:`grid`,[ge,ve]=(0,L.useState)(E),[z,ye]=(0,L.useState)(E.trim()),[B,xe]=(0,L.useState)(me),[G,K]=(0,L.useState)(he),[q,J]=(0,L.useState)(P.trim()),[Y,X]=(0,L.useState)([]),[Z,Q]=(0,L.useState)(!1),[Se,Ce]=(0,L.useState)(null),[we,Te]=(0,L.useState)(!1),[Ee,De]=(0,L.useState)(null),[Oe,ke]=(0,L.useState)(!1),[Ae,je]=(0,L.useState)(!1),[$,Me]=(0,L.useState)(null),[Ne,Pe]=(0,L.useState)(!1),[Fe,Ie]=(0,L.useState)(null);(0,L.useEffect)(()=>{let e=setTimeout(()=>ye(ge.trim()),300);return()=>clearTimeout(e)},[ge]);let Le=S.toString(),Re=(0,L.useRef)(Le);if(Re.current!==Le){Re.current=Le;let e=S.get(`q`)??``,t=S.get(`status`),n=S.get(`view`),r=(S.get(`channel`)??``).trim(),i=U.has(t)?t:`all`,a=W.has(n)?n:`grid`,o=e.trim();ve(t=>t===e?t:e),ye(e=>e===o?e:o),xe(e=>e===i?e:i),K(e=>e===a?e:a),J(e=>e===r?e:r)}(0,L.useEffect)(()=>{let e=new URLSearchParams(S),t=z.trim();t?e.set(`q`,t):e.delete(`q`),B===`all`?e.delete(`status`):e.set(`status`,B),G===`grid`?e.delete(`view`):e.set(`view`,G),q?e.set(`channel`,q):e.delete(`channel`),e.toString()!==S.toString()&&C(e,{replace:!0})},[z,S,C,B,G,q]),(0,L.useEffect)(()=>{if(!r)return;let e=!1;return(async()=>{Q(!0),Ce(null);try{let t=await l({limit:V,offset:0,...z?{search:z}:{},...B===`all`?{}:{status:B},...q?{channel:q}:{}});if(e)return;X(t.items),Te(t.hasMore)}catch(n){e||Ce(n instanceof Error?n.message:t.loadError)}finally{e||Q(!1)}})(),()=>{e=!0}},[r,z,B,t.loadError]),(0,L.useEffect)(()=>{r&&g().then(De).catch(()=>{})},[r]),(0,L.useEffect)(()=>{if(!r)return;let e=()=>void re();return window.addEventListener(`config-reload`,e),()=>window.removeEventListener(`config-reload`,e)},[r,re]),(0,L.useEffect)(()=>{if(!r)return;let e=e=>{let t=e.detail;!t?.key||t.name===void 0||(X(e=>e.map(e=>e.key===t.key?{...e,name:t.name}:e)),Me(e=>e&&e.key===t.key?{...e,name:t.name}:e))};return window.addEventListener(`session-updated`,e),()=>{window.removeEventListener(`session-updated`,e)}},[r]);let ze=(0,L.useCallback)(async()=>{if(!(!r||Z||!we)){Q(!0),Ce(null);try{let e=await l({limit:V,offset:Y.length,...z?{search:z}:{},...B===`all`?{}:{status:B},...q?{channel:q}:{}});X(t=>[...t,...e.items]),Te(e.hasMore)}catch(e){Ce(e instanceof Error?e.message:t.loadError)}finally{Q(!1)}}},[r,Z,we,Y.length,z,B,q,t.loadError]),Be=(0,L.useCallback)((e,t)=>{X(n=>n.map(n=>n.key===e?{...n,status:t}:n)),Me(n=>n&&n.key===e?{...n,status:t}:n)},[]),Ve=(0,L.useCallback)(async e=>{ke(!0),je(!0),Me(null);try{Me(await fe(e))}catch{ke(!1)}finally{je(!1)}},[]),He=e=>{Ve(e)},Ue=async(e,t)=>{if(t===`continue`){window.dispatchEvent(new CustomEvent(`navigate-to-chat`,{detail:{sessionKey:e},bubbles:!0}));return}if(t===`delete`){Ie(e),Pe(!0);return}try{switch(t){case`archive`:await pe(e),Be(e,`archived`);break;case`unarchive`:await m(e),Be(e,`active`);break;case`pin`:await c(e),Be(e,`pinned`);break;case`unpin`:await O(e),Be(e,`active`);break;case`export`:{let t=await s(e),n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`session-${e.replace(/[^a-z0-9]/gi,`_`)}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r);break}default:break}g().then(De).catch(()=>{})}catch{}},We=async e=>{try{await h(e),X(t=>t.filter(t=>t.key!==e)),Me(t=>t?.key===e?null:t),$?.key===e&&ke(!1),g().then(De).catch(()=>{})}catch{}},Ge={continueChat:t.continueChat,archive:t.archive,unarchive:t.unarchive,pin:t.pin,unpin:t.unpin,export:t.export,delete:t.delete,unnamedSession:e.chat.newSession},Ke={close:t.close,detailLoading:t.detailLoading,detailMessages:t.detailMessages,detailExport:t.detailExport,archive:t.archive,unarchive:t.unarchive,pin:t.pin,unpin:t.unpin,delete:t.delete,unnamedSession:e.chat.newSession},qe=[{key:`all`,label:t.filterAll,icon:ae},{key:`active`,label:t.filterActive,icon:w},{key:`pinned`,label:t.filterPinned,icon:a},{key:`archived`,label:t.filterArchived,icon:ee}],Je=(()=>{let e=Object.entries(Ee?.byChannel??{}).sort((e,t)=>t[1]-e[1]).slice(0,6).map(([e])=>e);for(let t of[`telegram`,`weixin`,`feishu`])e.includes(t)||e.push(t);return e.slice(0,8)})();return r?(0,R.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden bg-surface-panel`,children:[(0,R.jsxs)(`div`,{className:`mx-auto flex w-full min-w-0 max-w-2xl flex-col gap-4 px-4 py-6 sm:px-6 lg:max-w-app-main lg:px-8`,children:[(0,R.jsxs)(`header`,{className:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[(0,R.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight text-fg`,children:t.title}),(0,R.jsxs)(`div`,{className:`flex w-full min-w-0 items-center gap-2 rounded-xl bg-surface-base px-3 py-2 transition-colors sm:max-w-md dark:bg-surface-hover/40`,children:[(0,R.jsx)(de,{className:`size-4 shrink-0 text-fg-disabled`,strokeWidth:1.75,"aria-hidden":!0}),(0,R.jsx)(`input`,{type:`search`,value:ge,onChange:e=>ve(e.target.value),placeholder:t.searchPlaceholder,className:`min-w-0 flex-1 border-0 bg-transparent text-sm text-fg placeholder:text-fg-disabled focus:outline-none focus:ring-0`})]})]}),(0,R.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:qe.map(({key:e,label:t,icon:n})=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":B===e,onClick:()=>xe(e),className:j(`inline-flex items-center gap-1.5 rounded-xl px-3 py-2 text-sm font-medium`,A.transition,A.focusRingPanel,B===e?`bg-accent-soft text-accent-fg`:`bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35`),children:[(0,R.jsx)(n,{className:`size-4`,strokeWidth:1.75,"aria-hidden":!0}),t]},e))}),(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,R.jsx)(`span`,{className:`text-xs font-medium text-fg-subtle`,children:t.filterChannelLabel}),(0,R.jsx)(`button`,{type:`button`,"aria-pressed":!q,onClick:()=>J(``),className:j(`inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium`,A.transition,A.focusRingPanel,q?`bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35`:`bg-accent-soft text-accent-fg`),children:t.filterChannelAll}),Je.map(e=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":q===e,onClick:()=>J(e),className:j(`inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium`,A.transition,A.focusRingPanel,q===e?`bg-accent-soft text-accent-fg`:`bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35`),children:[e,Ee?.byChannel?.[e]==null?null:(0,R.jsx)(`span`,{className:`ml-2 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] text-fg-subtle`,children:Ee.byChannel[e]})]},e))]}),Ee?(0,R.jsx)(`div`,{className:`grid grid-cols-2 gap-3 sm:grid-cols-4`,children:[[Ee.totalSessions,t.totalSessions],[Ee.activeSessions,t.activeSessions],[Ee.pinnedSessions,t.pinnedSessions],[Ee.archivedSessions,t.archivedSessions]].map(([e,t])=>(0,R.jsxs)(`div`,{className:`rounded-xl bg-surface-base p-3 dark:bg-surface-hover/30`,children:[(0,R.jsx)(`div`,{className:`text-lg font-semibold tabular-nums text-fg`,children:e}),(0,R.jsx)(`div`,{className:`text-xs text-fg-muted`,children:t})]},t))}):null,Se?(0,R.jsx)(`div`,{className:`rounded-lg border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300`,children:Se}):null,(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsx)(`p`,{className:`text-xs text-fg-muted`,children:H(t.sessionCount,{count:Y.length})}),(0,R.jsxs)(`div`,{className:f,role:`group`,"aria-label":t.layoutToggleGroup,children:[(0,R.jsx)(u,{type:`button`,variant:`segmented`,title:t.gridView,"aria-pressed":G===`grid`,onClick:()=>K(`grid`),className:j(d,`size-7 p-0`,G===`grid`&&`bg-surface-panel shadow-sm dark:bg-surface-panel dark:shadow-sm dark:ring-1 dark:ring-edge-strong/40`,G===`grid`&&`text-accent-fg`),children:(0,R.jsx)(M,{className:`size-3.5`,strokeWidth:1.5})}),(0,R.jsx)(u,{type:`button`,variant:`segmented`,title:t.listView,"aria-pressed":G===`list`,onClick:()=>K(`list`),className:j(d,`size-9 p-0`,G===`list`&&`bg-surface-panel shadow-sm dark:bg-surface-panel dark:shadow-sm dark:ring-1 dark:ring-edge-strong/40`,G===`list`&&`text-accent-fg`),children:(0,R.jsx)(oe,{className:`size-3.5`,strokeWidth:1.5})})]})]}),Z&&Y.length===0?(0,R.jsx)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:Array.from({length:6}).map((e,t)=>(0,R.jsx)(`div`,{className:`h-40 animate-pulse rounded-xl bg-surface-hover/60 dark:bg-surface-hover/40`},t))}):Y.length===0?(0,R.jsxs)(`div`,{className:`flex flex-col items-center justify-center rounded-2xl bg-surface-base py-16 text-center dark:bg-surface-hover/25`,children:[(0,R.jsx)(N,{className:`mb-3 size-12 text-fg-disabled`,strokeWidth:1.25,"aria-hidden":!0}),(0,R.jsx)(`p`,{className:`text-base font-semibold text-fg`,children:t.noSessions}),(0,R.jsx)(`p`,{className:`mt-1 max-w-sm text-sm text-fg-muted`,children:t.noSessionsDescription}),(0,R.jsx)(u,{variant:`primary`,className:`mt-6`,onClick:()=>{window.dispatchEvent(new CustomEvent(`navigate-to-chat`,{detail:{sessionKey:``},bubbles:!0}))},children:t.startNewChat})]}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`div`,{className:j(`grid min-w-0 gap-3`,G===`grid`?`sm:grid-cols-2 lg:grid-cols-3`:`grid-cols-1`),children:Y.map(e=>{let t=T(e,ie);return(0,R.jsx)(_e,{session:e,variant:G,labels:Ge,sessionAgentId:t,sessionAgentAvatar:F(t,ce),onOpen:()=>He(e.key),onAction:t=>void Ue(e.key,t)},e.key)})}),we?(0,R.jsx)(`div`,{className:`flex justify-center pt-2`,children:(0,R.jsx)(u,{type:`button`,variant:`secondary`,disabled:Z,onClick:()=>void ze(),children:t.loadMore})}):null]})]}),(0,R.jsx)(be,{open:Oe,loading:Ae,session:$,sessionAgentId:$?T($,ie):void 0,sessionAgentAvatar:$?F(T($,ie),ce):void 0,labels:Ke,onClose:()=>{ke(!1),Me(null)},onArchive:()=>$&&void Ue($.key,`archive`),onUnarchive:()=>$&&void Ue($.key,`unarchive`),onPin:()=>$&&void Ue($.key,`pin`),onUnpin:()=>$&&void Ue($.key,`unpin`),onExport:()=>$&&void Ue($.key,`export`),onDelete:()=>$&&(Ie($.key),Pe(!0))}),(0,R.jsx)(_,{open:Ne,onOpenChange:Pe,children:(0,R.jsxs)(te,{children:[(0,R.jsx)(y,{className:j(`xopc-dialog-overlay fixed inset-0 bg-scrim`,k)}),(0,R.jsxs)(I,{className:j(`xopc-dialog-content fixed left-1/2 top-1/2 w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge`,ue),children:[(0,R.jsx)(x,{className:`text-base font-semibold text-fg`,children:t.deleteSessionTitle}),(0,R.jsx)(`p`,{className:`mt-2 text-sm text-fg-muted`,children:Fe?H(t.deleteSessionMessage,{name:Y.find(e=>e.key===Fe)?.name?.trim()||e.chat.newSession}):``}),(0,R.jsxs)(`div`,{className:`mt-4 flex justify-end gap-2`,children:[(0,R.jsx)(u,{type:`button`,variant:`secondary`,onClick:()=>Pe(!1),children:t.cancel}),(0,R.jsx)(u,{type:`button`,variant:`primary`,className:`bg-red-600 hover:bg-red-700`,onClick:()=>{Fe&&We(Fe),Pe(!1),Ie(null)},children:t.delete})]})]})]})})]}):(0,R.jsx)(`div`,{className:`mx-auto w-full max-w-2xl px-4 py-16 text-center text-sm text-fg-muted sm:px-8 lg:max-w-app-main`,children:t.needToken})}export{G as SessionsPage};
|
|
2
|
-
//# sourceMappingURL=sessions-page-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{a as t,n,t as r}from"./vendor-react-vzx_MT5D.js";import{i}from"./vendor-swr-CQnUjdeQ.js";import{Ar as a,At as o,Ct as s,Dt as c,Et as l,Fi as ee,Hn as u,Ht as te,Ii as ne,Ir as re,It as d,Jn as ie,Jr as ae,Kr as oe,Lt as f,Nn as se,On as p,Ot as m,Rt as ce,St as h,Tt as g,Ut as _,Vn as v,Vt as y,Wi as b,Wt as x,Yn as S,at as C,bi as w,dt as T,fi as E,ft as le,jr as D,kt as O,l as k,ot as A,qn as j,qr as M,ri as N,rr as P,s as ue,ut as F,vr as de,wt as fe,xt as pe,zt as I}from"./index-DAglRwh4.js";var L=e(t(),1),me=n(),R=r();function he(e){let t=new Date(e),n=Math.floor((new Date().getTime()-t.getTime())/(1e3*60*60*24));return n===0?t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}):n===1?`Yesterday`:n<7?t.toLocaleDateString([],{weekday:`short`}):t.toLocaleDateString([],{month:`short`,day:`numeric`})}function ge(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function _e(e){let t=(0,me.c)(105),{session:n,variant:r,labels:i,sessionAgentId:o,sessionAgentAvatar:s,onOpen:c,onAction:l}=e,u;t[0]!==i.unnamedSession||t[1]!==n.name?(u=n.name?.trim()||i.unnamedSession,t[0]=i.unnamedSession,t[1]=n.name,t[2]=u):u=t[2];let te=u,d;t[3]===n.name?d=t[4]:(d=n.name?.trim(),t[3]=n.name,t[4]=d);let ae=!!d,oe=n.status===`archived`,f=n.status===`pinned`,se=r===`list`&&`sm:flex-row sm:items-center sm:gap-4`,p;t[5]===se?p=t[6]:(p=j(`group flex min-w-0 w-full max-w-full cursor-pointer flex-col rounded-xl bg-surface-base text-left transition-colors duration-150 ease-out`,`hover:bg-surface-hover active:scale-[0.99]`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel`,se),t[5]=se,t[6]=p);let m;t[7]===c?m=t[8]:(m=e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),c())},t[7]=c,t[8]=m);let ce=r===`list`&&`sm:py-3`,h;t[9]===ce?h=t[10]:(h=j(`flex min-w-0 items-start justify-between gap-2 bg-surface-hover/35 px-3 py-2 dark:bg-surface-hover/25`,ce),t[9]=ce,t[10]=h);let g;t[11]===n.sourceChannel?g=t[12]:(g=(0,R.jsx)(`div`,{className:`flex min-w-0 items-center gap-2`,children:(0,R.jsx)(`span`,{className:`truncate text-[11px] font-medium uppercase tracking-wide text-fg-subtle`,children:n.sourceChannel})}),t[11]=n.sourceChannel,t[12]=g);let _;t[13]===f?_=t[14]:(_=f?(0,R.jsx)(a,{className:`size-3.5 text-accent-fg`,strokeWidth:1.75,"aria-hidden":!0}):null,t[13]=f,t[14]=_);let v;t[15]===n.updatedAt?v=t[16]:(v=he(n.updatedAt),t[15]=n.updatedAt,t[16]=v);let y;t[17]===v?y=t[18]:(y=(0,R.jsx)(`span`,{children:v}),t[17]=v,t[18]=y);let b;t[19]!==y||t[20]!==_?(b=(0,R.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 text-xs text-fg-muted`,children:[_,y]}),t[19]=y,t[20]=_,t[21]=b):b=t[21];let x;t[22]!==b||t[23]!==h||t[24]!==g?(x=(0,R.jsxs)(`div`,{className:h,children:[g,b]}),t[22]=b,t[23]=h,t[24]=g,t[25]=x):x=t[25];let S=r===`list`&&`sm:py-3`,w;t[26]===S?w=t[27]:(w=j(`min-w-0 flex-1 px-3 py-2`,S),t[26]=S,t[27]=w);let T=r===`list`&&`sm:items-start`,O;t[28]===T?O=t[29]:(O=j(`flex gap-3`,T),t[28]=T,t[29]=O);let k;t[30]!==s||t[31]!==o?(k=(0,R.jsx)(le,{agentId:o,avatar:s,size:40,className:`size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge`}),t[30]=s,t[31]=o,t[32]=k):k=t[32];let A;t[33]===te?A=t[34]:(A=(0,R.jsx)(`div`,{className:`min-w-0 max-w-full truncate text-sm font-semibold text-fg`,title:te,children:te}),t[33]=te,t[34]=A);let M;t[35]!==n.key||t[36]!==ae?(M=ae?(0,R.jsx)(`div`,{className:`mt-0.5 min-w-0 max-w-full truncate font-mono text-[11px] text-fg-subtle`,title:n.key,children:n.key}):null,t[35]=n.key,t[36]=ae,t[37]=M):M=t[37];let N;t[38]!==A||t[39]!==M?(N=(0,R.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[A,M]}),t[38]=A,t[39]=M,t[40]=N):N=t[40];let ue;t[41]!==O||t[42]!==k||t[43]!==N?(ue=(0,R.jsxs)(`div`,{className:O,children:[k,N]}),t[41]=O,t[42]=k,t[43]=N,t[44]=ue):ue=t[44];let F;t[45]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,R.jsx)(re,{className:`size-3.5`,strokeWidth:1.75,"aria-hidden":!0}),t[45]=F):F=t[45];let de;t[46]===n.messageCount?de=t[47]:(de=(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[F,n.messageCount]}),t[46]=n.messageCount,t[47]=de);let fe;t[48]===Symbol.for(`react.memo_cache_sentinel`)?(fe=(0,R.jsx)(ie,{className:`size-3.5`,strokeWidth:1.75,"aria-hidden":!0}),t[48]=fe):fe=t[48];let pe;t[49]===n.estimatedTokens?pe=t[50]:(pe=ge(n.estimatedTokens),t[49]=n.estimatedTokens,t[50]=pe);let I;t[51]===pe?I=t[52]:(I=(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[fe,pe]}),t[51]=pe,t[52]=I);let L;t[53]!==de||t[54]!==I?(L=(0,R.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-3 text-xs text-fg-muted`,children:[de,I]}),t[53]=de,t[54]=I,t[55]=L):L=t[55];let _e;t[56]===n.tags?_e=t[57]:(_e=n.tags.length>0?(0,R.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1`,children:[n.tags.slice(0,3).map(ye),n.tags.length>3?(0,R.jsxs)(`span`,{className:`text-[11px] text-fg-disabled`,children:[`+`,n.tags.length-3]}):null]}):null,t[56]=n.tags,t[57]=_e);let B;t[58]!==w||t[59]!==ue||t[60]!==L||t[61]!==_e?(B=(0,R.jsxs)(`div`,{className:w,children:[ue,L,_e]}),t[58]=w,t[59]=ue,t[60]=L,t[61]=_e,t[62]=B):B=t[62];let be;t[63]===l?be=t[64]:(be=()=>l(`continue`),t[63]=l,t[64]=be);let xe;t[65]===Symbol.for(`react.memo_cache_sentinel`)?(xe=(0,R.jsx)(re,{className:`size-4`,strokeWidth:1.75}),t[65]=xe):xe=t[65];let V;t[66]!==i.continueChat||t[67]!==be?(V=(0,R.jsx)(`button`,{type:`button`,className:C,title:i.continueChat,"aria-label":i.continueChat,onClick:be,children:xe}),t[66]=i.continueChat,t[67]=be,t[68]=V):V=t[68];let H;t[69]!==oe||t[70]!==i.archive||t[71]!==i.unarchive||t[72]!==l?(H=oe?(0,R.jsx)(`button`,{type:`button`,className:C,title:i.unarchive,"aria-label":i.unarchive,onClick:()=>l(`unarchive`),children:(0,R.jsx)(ne,{className:`size-4`,strokeWidth:1.75})}):(0,R.jsx)(`button`,{type:`button`,className:C,title:i.archive,"aria-label":i.archive,onClick:()=>l(`archive`),children:(0,R.jsx)(ee,{className:`size-4`,strokeWidth:1.75})}),t[69]=oe,t[70]=i.archive,t[71]=i.unarchive,t[72]=l,t[73]=H):H=t[73];let U;t[74]!==f||t[75]!==i.pin||t[76]!==i.unpin||t[77]!==l?(U=f?(0,R.jsx)(`button`,{type:`button`,className:C,title:i.unpin,"aria-label":i.unpin,onClick:()=>l(`unpin`),children:(0,R.jsx)(D,{className:`size-4`,strokeWidth:1.75})}):(0,R.jsx)(`button`,{type:`button`,className:C,title:i.pin,"aria-label":i.pin,onClick:()=>l(`pin`),children:(0,R.jsx)(a,{className:`size-4`,strokeWidth:1.75})}),t[74]=f,t[75]=i.pin,t[76]=i.unpin,t[77]=l,t[78]=U):U=t[78];let W;t[79]===l?W=t[80]:(W=()=>l(`export`),t[79]=l,t[80]=W);let G;t[81]===Symbol.for(`react.memo_cache_sentinel`)?(G=(0,R.jsx)(E,{className:`size-4`,strokeWidth:1.75}),t[81]=G):G=t[81];let K;t[82]!==i.export||t[83]!==W?(K=(0,R.jsx)(`button`,{type:`button`,className:C,title:i.export,"aria-label":i.export,onClick:W,children:G}),t[82]=i.export,t[83]=W,t[84]=K):K=t[84];let q;t[85]===Symbol.for(`react.memo_cache_sentinel`)?(q=j(C,`text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40`),t[85]=q):q=t[85];let J;t[86]===l?J=t[87]:(J=()=>l(`delete`),t[86]=l,t[87]=J);let Y;t[88]===Symbol.for(`react.memo_cache_sentinel`)?(Y=(0,R.jsx)(P,{className:`size-4`,strokeWidth:1.75}),t[88]=Y):Y=t[88];let X;t[89]!==i.delete||t[90]!==J?(X=(0,R.jsx)(`button`,{type:`button`,className:q,title:i.delete,"aria-label":i.delete,onClick:J,children:Y}),t[89]=i.delete,t[90]=J,t[91]=X):X=t[91];let Z;t[92]!==V||t[93]!==H||t[94]!==U||t[95]!==K||t[96]!==X?(Z=(0,R.jsxs)(`div`,{role:`group`,className:`flex flex-wrap items-center gap-0.5 border-t border-edge-subtle/80 bg-surface-hover/25 p-2 dark:border-edge-subtle`,onClick:z,onKeyDown:ve,children:[V,H,U,K,X]}),t[92]=V,t[93]=H,t[94]=U,t[95]=K,t[96]=X,t[97]=Z):Z=t[97];let Q;return t[98]!==c||t[99]!==x||t[100]!==B||t[101]!==p||t[102]!==Z||t[103]!==m?(Q=(0,R.jsxs)(`div`,{role:`button`,tabIndex:0,className:p,onClick:c,onKeyDown:m,children:[x,B,Z]}),t[98]=c,t[99]=x,t[100]=B,t[101]=p,t[102]=Z,t[103]=m,t[104]=Q):Q=t[104],Q}function ve(e){return e.stopPropagation()}function z(e){return e.stopPropagation()}function ye(e){return(0,R.jsx)(`span`,{className:`max-w-full break-words rounded-md bg-surface-hover px-1.5 py-0.5 text-[11px] text-fg-muted`,children:e},e)}function B(e){if(typeof e==`string`)return e.length>2e3?`${e.slice(0,2e3)}…`:e;try{let t=JSON.stringify(e,null,2);return t.length>2e3?`${t.slice(0,2e3)}…`:t}catch{return String(e)}}function be(e){let t=(0,me.c)(60),{open:n,loading:r,session:i,sessionAgentId:a,sessionAgentAvatar:o,labels:s,onClose:c,onArchive:l,onUnarchive:ee,onPin:ne,onUnpin:re,onExport:d,onDelete:ie}=e,ae=i?.status===`archived`,oe=i?.status===`pinned`,f;t[0]===c?f=t[1]:(f=e=>!e&&c(),t[0]=c,t[1]=f);let se;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(se=(0,R.jsx)(y,{className:j(`xopc-dialog-overlay fixed inset-0 bg-scrim`,k)}),t[2]=se):se=t[2];let p;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(p=j(`xopc-drawer-right fixed right-0 top-0 flex size-full max-w-lg flex-col border-l border-edge bg-surface-panel shadow-popover outline-none`,ue,`dark:border-edge`),t[3]=p):p=t[3];let m;t[4]!==i||t[5]!==o||t[6]!==a?(m=i&&a?(0,R.jsx)(le,{agentId:a,avatar:o,size:40,className:`size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge`}):null,t[4]=i,t[5]=o,t[6]=a,t[7]=m):m=t[7];let h;t[8]!==s.unnamedSession||t[9]!==i?.name?(h=i?.name?.trim()||s.unnamedSession,t[8]=s.unnamedSession,t[9]=i?.name,t[10]=h):h=t[10];let g;t[11]===h?g=t[12]:(g=(0,R.jsx)(x,{className:`min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-fg`,children:h}),t[11]=h,t[12]=g);let v;t[13]!==m||t[14]!==g?(v=(0,R.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-3`,children:[m,g]}),t[13]=m,t[14]=g,t[15]=v):v=t[15];let b;t[16]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,R.jsx)(S,{className:`size-5`,strokeWidth:1.75}),t[16]=b):b=t[16];let C;t[17]===s.close?C=t[18]:(C=(0,R.jsx)(ce,{asChild:!0,children:(0,R.jsx)(u,{type:`button`,variant:`ghost`,className:`size-9 shrink-0 p-0`,"aria-label":s.close,children:b})}),t[17]=s.close,t[18]=C);let w;t[19]!==v||t[20]!==C?(w=(0,R.jsxs)(`div`,{className:`flex min-w-0 shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3 dark:border-edge`,children:[v,C]}),t[19]=v,t[20]=C,t[21]=w):w=t[21];let T;t[22]!==s.detailLoading||t[23]!==s.detailMessages||t[24]!==r||t[25]!==i?(T=r?(0,R.jsx)(`p`,{className:`text-sm text-fg-muted`,children:s.detailLoading}):i?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`dl`,{className:`mb-4 grid gap-2 text-xs text-fg-muted`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-fg-disabled`,children:`Key`}),(0,R.jsx)(`dd`,{className:`mt-0.5 break-all font-mono text-fg`,children:i.key})]}),(0,R.jsx)(`div`,{className:`flex flex-wrap gap-4`,children:(0,R.jsxs)(`span`,{children:[i.messageCount,` msgs · `,i.estimatedTokens,` tok`]})})]}),(0,R.jsx)(`h3`,{className:`mb-2 text-xs font-medium uppercase tracking-wide text-fg-subtle`,children:s.detailMessages}),(0,R.jsx)(`ul`,{className:`space-y-3`,children:i.messages.map(xe)})]}):null,t[22]=s.detailLoading,t[23]=s.detailMessages,t[24]=r,t[25]=i,t[26]=T):T=t[26];let E;t[27]===T?E=t[28]:(E=(0,R.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-4 py-3`,children:T}),t[27]=T,t[28]=E);let D;t[29]!==s.detailExport||t[30]!==d?(D=(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:d,children:s.detailExport}),t[29]=s.detailExport,t[30]=d,t[31]=D):D=t[31];let O;t[32]!==ae||t[33]!==s.archive||t[34]!==s.unarchive||t[35]!==l||t[36]!==ee?(O=ae?(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:ee,children:s.unarchive}):(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:l,children:s.archive}),t[32]=ae,t[33]=s.archive,t[34]=s.unarchive,t[35]=l,t[36]=ee,t[37]=O):O=t[37];let A;t[38]!==oe||t[39]!==s.pin||t[40]!==s.unpin||t[41]!==ne||t[42]!==re?(A=oe?(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:re,children:s.unpin}):(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm`,onClick:ne,children:s.pin}),t[38]=oe,t[39]=s.pin,t[40]=s.unpin,t[41]=ne,t[42]=re,t[43]=A):A=t[43];let M;t[44]!==s.delete||t[45]!==ie?(M=(0,R.jsx)(u,{type:`button`,variant:`secondary`,className:`text-sm text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40`,onClick:ie,children:s.delete}),t[44]=s.delete,t[45]=ie,t[46]=M):M=t[46];let N;t[47]!==D||t[48]!==O||t[49]!==A||t[50]!==M?(N=(0,R.jsx)(`div`,{className:`shrink-0 border-t border-edge px-4 py-3 dark:border-edge`,children:(0,R.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[D,O,A,M]})}),t[47]=D,t[48]=O,t[49]=A,t[50]=M,t[51]=N):N=t[51];let P;t[52]!==w||t[53]!==E||t[54]!==N?(P=(0,R.jsxs)(te,{children:[se,(0,R.jsxs)(I,{className:p,"aria-describedby":void 0,children:[w,E,N]})]}),t[52]=w,t[53]=E,t[54]=N,t[55]=P):P=t[55];let F;return t[56]!==n||t[57]!==f||t[58]!==P?(F=(0,R.jsx)(_,{open:n,onOpenChange:f,children:P}),t[56]=n,t[57]=f,t[58]=P,t[59]=F):F=t[59],F}function xe(e){return(0,R.jsxs)(`li`,{className:`rounded-lg border border-edge-subtle bg-surface-hover/50 p-2 dark:border-edge`,children:[(0,R.jsx)(`div`,{className:`mb-1 text-[10px] font-medium uppercase text-fg-subtle`,children:e.role}),(0,R.jsx)(`pre`,{className:`max-h-40 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-fg-muted`,children:B(e.content)})]},`${e.timestamp??``}-${e.role}-${B(e.content).slice(0,24)}`)}var V=20;function H(e,t){return e.replace(/\{\{(\w+)\}\}/g,(e,n)=>String(t[n]??``))}var U=new Set([`all`,`active`,`pinned`,`archived`]),W=new Set([`grid`,`list`]);function G(){let e=v(se(e=>e.language)),t=e.sessions,n=p(e=>e.token),r=!!n,{data:ne,mutate:re}=i(r?[`gateway-chat-agents`,n]:null,o,{revalidateOnFocus:!1}),ie=ne?.defaultId??`main`,ce=ne?.items??[],[S,C]=b(),E=S.get(`q`)??``,le=S.get(`status`),D=S.get(`view`),P=S.get(`channel`)??``,me=U.has(le)?le:`all`,he=W.has(D)?D:`grid`,[ge,ve]=(0,L.useState)(E),[z,ye]=(0,L.useState)(E.trim()),[B,xe]=(0,L.useState)(me),[G,K]=(0,L.useState)(he),[q,J]=(0,L.useState)(P.trim()),[Y,X]=(0,L.useState)([]),[Z,Q]=(0,L.useState)(!1),[Se,Ce]=(0,L.useState)(null),[we,Te]=(0,L.useState)(!1),[Ee,De]=(0,L.useState)(null),[Oe,ke]=(0,L.useState)(!1),[Ae,je]=(0,L.useState)(!1),[$,Me]=(0,L.useState)(null),[Ne,Pe]=(0,L.useState)(!1),[Fe,Ie]=(0,L.useState)(null);(0,L.useEffect)(()=>{let e=setTimeout(()=>ye(ge.trim()),300);return()=>clearTimeout(e)},[ge]);let Le=S.toString(),Re=(0,L.useRef)(Le);if(Re.current!==Le){Re.current=Le;let e=S.get(`q`)??``,t=S.get(`status`),n=S.get(`view`),r=(S.get(`channel`)??``).trim(),i=U.has(t)?t:`all`,a=W.has(n)?n:`grid`,o=e.trim();ve(t=>t===e?t:e),ye(e=>e===o?e:o),xe(e=>e===i?e:i),K(e=>e===a?e:a),J(e=>e===r?e:r)}(0,L.useEffect)(()=>{let e=new URLSearchParams(S),t=z.trim();t?e.set(`q`,t):e.delete(`q`),B===`all`?e.delete(`status`):e.set(`status`,B),G===`grid`?e.delete(`view`):e.set(`view`,G),q?e.set(`channel`,q):e.delete(`channel`),e.toString()!==S.toString()&&C(e,{replace:!0})},[z,S,C,B,G,q]),(0,L.useEffect)(()=>{if(!r)return;let e=!1;return(async()=>{Q(!0),Ce(null);try{let t=await l({limit:V,offset:0,...z?{search:z}:{},...B===`all`?{}:{status:B},...q?{channel:q}:{}});if(e)return;X(t.items),Te(t.hasMore)}catch(n){e||Ce(n instanceof Error?n.message:t.loadError)}finally{e||Q(!1)}})(),()=>{e=!0}},[r,z,B,t.loadError]),(0,L.useEffect)(()=>{r&&g().then(De).catch(()=>{})},[r]),(0,L.useEffect)(()=>{if(!r)return;let e=()=>void re();return window.addEventListener(`config-reload`,e),()=>window.removeEventListener(`config-reload`,e)},[r,re]),(0,L.useEffect)(()=>{if(!r)return;let e=e=>{let t=e.detail;!t?.key||t.name===void 0||(X(e=>e.map(e=>e.key===t.key?{...e,name:t.name}:e)),Me(e=>e&&e.key===t.key?{...e,name:t.name}:e))};return window.addEventListener(`session-updated`,e),()=>{window.removeEventListener(`session-updated`,e)}},[r]);let ze=(0,L.useCallback)(async()=>{if(!(!r||Z||!we)){Q(!0),Ce(null);try{let e=await l({limit:V,offset:Y.length,...z?{search:z}:{},...B===`all`?{}:{status:B},...q?{channel:q}:{}});X(t=>[...t,...e.items]),Te(e.hasMore)}catch(e){Ce(e instanceof Error?e.message:t.loadError)}finally{Q(!1)}}},[r,Z,we,Y.length,z,B,q,t.loadError]),Be=(0,L.useCallback)((e,t)=>{X(n=>n.map(n=>n.key===e?{...n,status:t}:n)),Me(n=>n&&n.key===e?{...n,status:t}:n)},[]),Ve=(0,L.useCallback)(async e=>{ke(!0),je(!0),Me(null);try{Me(await fe(e))}catch{ke(!1)}finally{je(!1)}},[]),He=e=>{Ve(e)},Ue=async(e,t)=>{if(t===`continue`){window.dispatchEvent(new CustomEvent(`navigate-to-chat`,{detail:{sessionKey:e},bubbles:!0}));return}if(t===`delete`){Ie(e),Pe(!0);return}try{switch(t){case`archive`:await pe(e),Be(e,`archived`);break;case`unarchive`:await m(e),Be(e,`active`);break;case`pin`:await c(e),Be(e,`pinned`);break;case`unpin`:await O(e),Be(e,`active`);break;case`export`:{let t=await s(e),n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`session-${e.replace(/[^a-z0-9]/gi,`_`)}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r);break}default:break}g().then(De).catch(()=>{})}catch{}},We=async e=>{try{await h(e),X(t=>t.filter(t=>t.key!==e)),Me(t=>t?.key===e?null:t),$?.key===e&&ke(!1),g().then(De).catch(()=>{})}catch{}},Ge={continueChat:t.continueChat,archive:t.archive,unarchive:t.unarchive,pin:t.pin,unpin:t.unpin,export:t.export,delete:t.delete,unnamedSession:e.chat.newSession},Ke={close:t.close,detailLoading:t.detailLoading,detailMessages:t.detailMessages,detailExport:t.detailExport,archive:t.archive,unarchive:t.unarchive,pin:t.pin,unpin:t.unpin,delete:t.delete,unnamedSession:e.chat.newSession},qe=[{key:`all`,label:t.filterAll,icon:ae},{key:`active`,label:t.filterActive,icon:w},{key:`pinned`,label:t.filterPinned,icon:a},{key:`archived`,label:t.filterArchived,icon:ee}],Je=(()=>{let e=Object.entries(Ee?.byChannel??{}).sort((e,t)=>t[1]-e[1]).slice(0,6).map(([e])=>e);for(let t of[`telegram`,`weixin`,`feishu`])e.includes(t)||e.push(t);return e.slice(0,8)})();return r?(0,R.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden bg-surface-panel`,children:[(0,R.jsxs)(`div`,{className:`mx-auto flex w-full min-w-0 max-w-2xl flex-col gap-4 px-4 py-6 sm:px-6 lg:max-w-app-main lg:px-8`,children:[(0,R.jsxs)(`header`,{className:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[(0,R.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight text-fg`,children:t.title}),(0,R.jsxs)(`div`,{className:`flex w-full min-w-0 items-center gap-2 rounded-xl bg-surface-base px-3 py-2 transition-colors sm:max-w-md dark:bg-surface-hover/40`,children:[(0,R.jsx)(de,{className:`size-4 shrink-0 text-fg-disabled`,strokeWidth:1.75,"aria-hidden":!0}),(0,R.jsx)(`input`,{type:`search`,value:ge,onChange:e=>ve(e.target.value),placeholder:t.searchPlaceholder,className:`min-w-0 flex-1 border-0 bg-transparent text-sm text-fg placeholder:text-fg-disabled focus:outline-none focus:ring-0`})]})]}),(0,R.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:qe.map(({key:e,label:t,icon:n})=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":B===e,onClick:()=>xe(e),className:j(`inline-flex items-center gap-1.5 rounded-xl px-3 py-2 text-sm font-medium`,A.transition,A.focusRingPanel,B===e?`bg-accent-soft text-accent-fg`:`bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35`),children:[(0,R.jsx)(n,{className:`size-4`,strokeWidth:1.75,"aria-hidden":!0}),t]},e))}),(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,R.jsx)(`span`,{className:`text-xs font-medium text-fg-subtle`,children:t.filterChannelLabel}),(0,R.jsx)(`button`,{type:`button`,"aria-pressed":!q,onClick:()=>J(``),className:j(`inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium`,A.transition,A.focusRingPanel,q?`bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35`:`bg-accent-soft text-accent-fg`),children:t.filterChannelAll}),Je.map(e=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":q===e,onClick:()=>J(e),className:j(`inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium`,A.transition,A.focusRingPanel,q===e?`bg-accent-soft text-accent-fg`:`bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35`),children:[e,Ee?.byChannel?.[e]==null?null:(0,R.jsx)(`span`,{className:`ml-2 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] text-fg-subtle`,children:Ee.byChannel[e]})]},e))]}),Ee?(0,R.jsx)(`div`,{className:`grid grid-cols-2 gap-3 sm:grid-cols-4`,children:[[Ee.totalSessions,t.totalSessions],[Ee.activeSessions,t.activeSessions],[Ee.pinnedSessions,t.pinnedSessions],[Ee.archivedSessions,t.archivedSessions]].map(([e,t])=>(0,R.jsxs)(`div`,{className:`rounded-xl bg-surface-base p-3 dark:bg-surface-hover/30`,children:[(0,R.jsx)(`div`,{className:`text-lg font-semibold tabular-nums text-fg`,children:e}),(0,R.jsx)(`div`,{className:`text-xs text-fg-muted`,children:t})]},t))}):null,Se?(0,R.jsx)(`div`,{className:`rounded-lg border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300`,children:Se}):null,(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsx)(`p`,{className:`text-xs text-fg-muted`,children:H(t.sessionCount,{count:Y.length})}),(0,R.jsxs)(`div`,{className:f,role:`group`,"aria-label":t.layoutToggleGroup,children:[(0,R.jsx)(u,{type:`button`,variant:`segmented`,title:t.gridView,"aria-pressed":G===`grid`,onClick:()=>K(`grid`),className:j(d,`size-7 p-0`,G===`grid`&&`bg-surface-panel shadow-sm dark:bg-surface-panel dark:shadow-sm dark:ring-1 dark:ring-edge-strong/40`,G===`grid`&&`text-accent-fg`),children:(0,R.jsx)(M,{className:`size-3.5`,strokeWidth:1.5})}),(0,R.jsx)(u,{type:`button`,variant:`segmented`,title:t.listView,"aria-pressed":G===`list`,onClick:()=>K(`list`),className:j(d,`size-9 p-0`,G===`list`&&`bg-surface-panel shadow-sm dark:bg-surface-panel dark:shadow-sm dark:ring-1 dark:ring-edge-strong/40`,G===`list`&&`text-accent-fg`),children:(0,R.jsx)(oe,{className:`size-3.5`,strokeWidth:1.5})})]})]}),Z&&Y.length===0?(0,R.jsx)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:Array.from({length:6}).map((e,t)=>(0,R.jsx)(`div`,{className:`h-40 animate-pulse rounded-xl bg-surface-hover/60 dark:bg-surface-hover/40`},t))}):Y.length===0?(0,R.jsxs)(`div`,{className:`flex flex-col items-center justify-center rounded-2xl bg-surface-base py-16 text-center dark:bg-surface-hover/25`,children:[(0,R.jsx)(N,{className:`mb-3 size-12 text-fg-disabled`,strokeWidth:1.25,"aria-hidden":!0}),(0,R.jsx)(`p`,{className:`text-base font-semibold text-fg`,children:t.noSessions}),(0,R.jsx)(`p`,{className:`mt-1 max-w-sm text-sm text-fg-muted`,children:t.noSessionsDescription}),(0,R.jsx)(u,{variant:`primary`,className:`mt-6`,onClick:()=>{window.dispatchEvent(new CustomEvent(`navigate-to-chat`,{detail:{sessionKey:``},bubbles:!0}))},children:t.startNewChat})]}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`div`,{className:j(`grid min-w-0 gap-3`,G===`grid`?`sm:grid-cols-2 lg:grid-cols-3`:`grid-cols-1`),children:Y.map(e=>{let t=T(e,ie);return(0,R.jsx)(_e,{session:e,variant:G,labels:Ge,sessionAgentId:t,sessionAgentAvatar:F(t,ce),onOpen:()=>He(e.key),onAction:t=>void Ue(e.key,t)},e.key)})}),we?(0,R.jsx)(`div`,{className:`flex justify-center pt-2`,children:(0,R.jsx)(u,{type:`button`,variant:`secondary`,disabled:Z,onClick:()=>void ze(),children:t.loadMore})}):null]})]}),(0,R.jsx)(be,{open:Oe,loading:Ae,session:$,sessionAgentId:$?T($,ie):void 0,sessionAgentAvatar:$?F(T($,ie),ce):void 0,labels:Ke,onClose:()=>{ke(!1),Me(null)},onArchive:()=>$&&void Ue($.key,`archive`),onUnarchive:()=>$&&void Ue($.key,`unarchive`),onPin:()=>$&&void Ue($.key,`pin`),onUnpin:()=>$&&void Ue($.key,`unpin`),onExport:()=>$&&void Ue($.key,`export`),onDelete:()=>$&&(Ie($.key),Pe(!0))}),(0,R.jsx)(_,{open:Ne,onOpenChange:Pe,children:(0,R.jsxs)(te,{children:[(0,R.jsx)(y,{className:j(`xopc-dialog-overlay fixed inset-0 bg-scrim`,k)}),(0,R.jsxs)(I,{className:j(`xopc-dialog-content fixed left-1/2 top-1/2 w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge`,ue),children:[(0,R.jsx)(x,{className:`text-base font-semibold text-fg`,children:t.deleteSessionTitle}),(0,R.jsx)(`p`,{className:`mt-2 text-sm text-fg-muted`,children:Fe?H(t.deleteSessionMessage,{name:Y.find(e=>e.key===Fe)?.name?.trim()||e.chat.newSession}):``}),(0,R.jsxs)(`div`,{className:`mt-4 flex justify-end gap-2`,children:[(0,R.jsx)(u,{type:`button`,variant:`secondary`,onClick:()=>Pe(!1),children:t.cancel}),(0,R.jsx)(u,{type:`button`,variant:`primary`,className:`bg-red-600 hover:bg-red-700`,onClick:()=>{Fe&&We(Fe),Pe(!1),Ie(null)},children:t.delete})]})]})]})})]}):(0,R.jsx)(`div`,{className:`mx-auto w-full max-w-2xl px-4 py-16 text-center text-sm text-fg-muted sm:px-8 lg:max-w-app-main`,children:t.needToken})}export{G as SessionsPage};
|
|
2
|
+
//# sourceMappingURL=sessions-page-DoGE8N-O.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions-page-Da9gjMh7.js","names":["Archive","ArchiveRestore","Download","MessageSquare","Pin","PinOff","Trash2","Zap","SessionMetadata","AgentAvatarDisplay","ghostIconButton","cn","SessionCardAction","formatRelativeDate","dateStr","date","Date","now","diffDays","Math","floor","getTime","toLocaleTimeString","hour","minute","toLocaleDateString","weekday","month","day","formatTokens","tokens","toFixed","String","SessionCard","t0","$","_c","session","variant","labels","sessionAgentId","sessionAgentAvatar","onOpen","onAction","t1","unnamedSession","name","trim","displayName","t2","showKeySubtitle","Boolean","isArchived","status","isPinned","t3","t4","t5","e","key","preventDefault","t6","t7","t8","sourceChannel","t9","t10","updatedAt","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","Symbol","for","t24","messageCount","t25","t26","estimatedTokens","t27","t28","t29","tags","length","slice","map","_temp","t30","t31","t32","t33","continueChat","t34","archive","unarchive","t35","pin","unpin","t36","t37","t38","export","t39","t40","t41","t42","delete","t43","_temp2","_temp3","t44","e_1","stopPropagation","e_0","tag","Dialog","X","Button","SessionDetail","AgentAvatarDisplay","cn","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","previewContent","content","length","slice","s","JSON","stringify","String","SessionDetailDrawer","t0","$","_c","open","loading","session","sessionAgentId","sessionAgentAvatar","labels","onClose","onArchive","onUnarchive","onPin","onUnpin","onExport","onDelete","isArchived","status","isPinned","t1","v","t2","Symbol","for","t3","t4","t5","unnamedSession","name","trim","t6","t7","t8","t9","close","t10","t11","detailLoading","detailMessages","key","messageCount","estimatedTokens","messages","map","_temp","t12","t13","detailExport","t14","archive","unarchive","t15","pin","unpin","t16","delete","t17","t18","undefined","t19","msg","timestamp","role","Dialog","Archive","Circle","FolderOpen","Layers","LayoutGrid","LayoutList","Pin","Search","useCallback","useEffect","useRef","useState","useSearchParams","useSWR","fetchChatAgents","SessionCard","SessionCardAction","agentAvatarFromOptions","resolveSessionAgentId","SessionDetailDrawer","archiveSession","deleteSession","exportSessionJson","getSessionDetail","getSessionStats","listSessions","pinSession","unarchiveSession","unpinSession","SessionDetail","SessionMetadata","SessionStats","Button","segmentedThumbActiveClassName","segmentedThumbBaseClassName","segmentedTrackClassName","messages","cn","interaction","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","useGatewayStore","useLocaleStore","PAGE_LIMIT","interpolate","template","params","Record","replace","_","key","String","StatusFilter","SessionsViewMode","SESSION_STATUS_FILTER_SET","Set","SESSION_VIEW_MODE_SET","SessionsPage","language","s","m","sessions","token","st","hasToken","Boolean","data","chatAgents","mutate","mutateChatAgents","const","revalidateOnFocus","defaultAgentId","defaultId","agentItems","items","searchParams","setSearchParams","initialSearch","get","initialStatus","initialView","initialChannel","initialStatusFilter","has","initialViewMode","searchInput","setSearchInput","debouncedSearch","setDebouncedSearch","trim","statusFilter","setStatusFilter","viewMode","setViewMode","channelFilter","setChannelFilter","setSessions","loading","setLoading","error","setError","hasMore","setHasMore","stats","setStats","detailOpen","setDetailOpen","detailLoading","setDetailLoading","detailSession","setDetailSession","confirmOpen","setConfirmOpen","confirmKey","setConfirmKey","t","setTimeout","clearTimeout","searchParamsKey","toString","trackedSearchParamsKeyRef","current","nextQ","nextStatusRaw","nextViewRaw","nextChannel","nextStatus","nextView","nextDebouncedQ","prev","URLSearchParams","set","delete","next","cancelled","result","limit","offset","search","status","channel","e","Error","message","loadError","then","catch","onConfigReload","window","addEventListener","removeEventListener","handler","Event","detail","CustomEvent","name","undefined","map","row","loadMore","length","updateSessionStatus","openDetail","session","handleCardOpen","handleCardAction","action","dispatchEvent","sessionKey","bubbles","content","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","body","appendChild","click","removeChild","revokeObjectURL","runDelete","filter","cardLabels","continueChat","archive","unarchive","pin","unpin","export","unnamedSession","chat","newSession","detailLabels","close","detailMessages","detailExport","filters","label","icon","filterAll","filterActive","filterPinned","filterArchived","channelChips","entries","Object","byChannel","sort","b","top","slice","id","c","includes","push","needToken","title","target","value","searchPlaceholder","Icon","transition","focusRingPanel","filterChannelLabel","filterChannelAll","chId","totalSessions","activeSessions","pinnedSessions","archivedSessions","sessionCount","count","layoutToggleGroup","gridView","listView","Array","from","i","noSessions","noSessionsDescription","startNewChat","sessionAgentId","deleteSessionTitle","deleteSessionMessage","find","x","cancel"],"sources":["../../../../../web/src/features/sessions/session-card.tsx","../../../../../web/src/features/sessions/session-detail-drawer.tsx","../../../../../web/src/features/sessions/sessions-page.tsx"],"sourcesContent":["import {\n Archive,\n ArchiveRestore,\n Download,\n MessageSquare,\n Pin,\n PinOff,\n Trash2,\n Zap,\n} from 'lucide-react';\n\nimport type { SessionMetadata } from '@/features/sessions/session.types';\nimport { AgentAvatarDisplay } from '@/features/settings/agents/agent-avatar-display';\nimport { ghostIconButton } from '@/lib/interaction';\nimport { cn } from '@/lib/cn';\n\nexport type SessionCardAction =\n | 'continue'\n | 'delete'\n | 'archive'\n | 'unarchive'\n | 'pin'\n | 'unpin'\n | 'export';\n\nfunction formatRelativeDate(dateStr: string): string {\n const date = new Date(dateStr);\n const now = new Date();\n const diffDays = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24));\n if (diffDays === 0) {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return date.toLocaleDateString([], { weekday: 'short' });\n return date.toLocaleDateString([], { month: 'short', day: 'numeric' });\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(1)}k`;\n return String(tokens);\n}\n\nexport function SessionCard({\n session,\n variant,\n labels,\n sessionAgentId,\n sessionAgentAvatar,\n onOpen,\n onAction,\n}: {\n session: SessionMetadata;\n variant: 'grid' | 'list';\n sessionAgentId: string;\n sessionAgentAvatar?: string;\n labels: {\n continueChat: string;\n archive: string;\n unarchive: string;\n pin: string;\n unpin: string;\n export: string;\n delete: string;\n /** Shown when `session.name` is empty (e.g. new chat before auto-title). */\n unnamedSession: string;\n };\n onOpen: () => void;\n onAction: (action: SessionCardAction) => void;\n}) {\n const displayName = session.name?.trim() || labels.unnamedSession;\n const showKeySubtitle = Boolean(session.name?.trim());\n const isArchived = session.status === 'archived';\n const isPinned = session.status === 'pinned';\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n // min-w-0: grid/flex children default to min-width:auto — long unbroken titles (URLs) otherwise expand the track\n 'group flex min-w-0 w-full max-w-full cursor-pointer flex-col rounded-xl bg-surface-base text-left transition-colors duration-150 ease-out',\n 'hover:bg-surface-hover active:scale-[0.99]',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n variant === 'list' && 'sm:flex-row sm:items-center sm:gap-4',\n )}\n onClick={onOpen}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onOpen();\n }\n }}\n >\n <div\n className={cn(\n 'flex min-w-0 items-start justify-between gap-2 bg-surface-hover/35 px-3 py-2 dark:bg-surface-hover/25',\n variant === 'list' && 'sm:py-3',\n )}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-[11px] font-medium uppercase tracking-wide text-fg-subtle\">\n {session.sourceChannel}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5 text-xs text-fg-muted\">\n {isPinned ? <Pin className=\"size-3.5 text-accent-fg\" strokeWidth={1.75} aria-hidden /> : null}\n <span>{formatRelativeDate(session.updatedAt)}</span>\n </div>\n </div>\n\n <div className={cn('min-w-0 flex-1 px-3 py-2', variant === 'list' && 'sm:py-3')}>\n <div className={cn('flex gap-3', variant === 'list' && 'sm:items-start')}>\n <AgentAvatarDisplay\n agentId={sessionAgentId}\n avatar={sessionAgentAvatar}\n size={40}\n className=\"size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"min-w-0 max-w-full truncate text-sm font-semibold text-fg\" title={displayName}>\n {displayName}\n </div>\n {showKeySubtitle ? (\n <div\n className=\"mt-0.5 min-w-0 max-w-full truncate font-mono text-[11px] text-fg-subtle\"\n title={session.key}\n >\n {session.key}\n </div>\n ) : null}\n </div>\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-3 text-xs text-fg-muted\">\n <span className=\"inline-flex items-center gap-1\">\n <MessageSquare className=\"size-3.5\" strokeWidth={1.75} aria-hidden />\n {session.messageCount}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Zap className=\"size-3.5\" strokeWidth={1.75} aria-hidden />\n {formatTokens(session.estimatedTokens)}\n </span>\n </div>\n {session.tags.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {session.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n className=\"max-w-full break-words rounded-md bg-surface-hover px-1.5 py-0.5 text-[11px] text-fg-muted\"\n >\n {tag}\n </span>\n ))}\n {session.tags.length > 3 ? (\n <span className=\"text-[11px] text-fg-disabled\">+{session.tags.length - 3}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <div\n role=\"group\"\n className=\"flex flex-wrap items-center gap-0.5 border-t border-edge-subtle/80 bg-surface-hover/25 p-2 dark:border-edge-subtle\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.continueChat}\n aria-label={labels.continueChat}\n onClick={() => onAction('continue')}\n >\n <MessageSquare className=\"size-4\" strokeWidth={1.75} />\n </button>\n {isArchived ? (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.unarchive}\n aria-label={labels.unarchive}\n onClick={() => onAction('unarchive')}\n >\n <ArchiveRestore className=\"size-4\" strokeWidth={1.75} />\n </button>\n ) : (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.archive}\n aria-label={labels.archive}\n onClick={() => onAction('archive')}\n >\n <Archive className=\"size-4\" strokeWidth={1.75} />\n </button>\n )}\n {isPinned ? (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.unpin}\n aria-label={labels.unpin}\n onClick={() => onAction('unpin')}\n >\n <PinOff className=\"size-4\" strokeWidth={1.75} />\n </button>\n ) : (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.pin}\n aria-label={labels.pin}\n onClick={() => onAction('pin')}\n >\n <Pin className=\"size-4\" strokeWidth={1.75} />\n </button>\n )}\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.export}\n aria-label={labels.export}\n onClick={() => onAction('export')}\n >\n <Download className=\"size-4\" strokeWidth={1.75} />\n </button>\n <button\n type=\"button\"\n className={cn(\n ghostIconButton,\n 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40',\n )}\n title={labels.delete}\n aria-label={labels.delete}\n onClick={() => onAction('delete')}\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} />\n </button>\n </div>\n </div>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { SessionDetail } from '@/features/sessions/session.types';\nimport { AgentAvatarDisplay } from '@/features/settings/agents/agent-avatar-display';\nimport { cn } from '@/lib/cn';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\n\nfunction previewContent(content: string | unknown[]): string {\n if (typeof content === 'string') {\n return content.length > 2000 ? `${content.slice(0, 2000)}…` : content;\n }\n try {\n const s = JSON.stringify(content, null, 2);\n return s.length > 2000 ? `${s.slice(0, 2000)}…` : s;\n } catch {\n return String(content);\n }\n}\n\nexport function SessionDetailDrawer({\n open,\n loading,\n session,\n sessionAgentId,\n sessionAgentAvatar,\n labels,\n onClose,\n onArchive,\n onUnarchive,\n onPin,\n onUnpin,\n onExport,\n onDelete,\n}: {\n open: boolean;\n loading: boolean;\n session: SessionDetail | null;\n sessionAgentId?: string;\n sessionAgentAvatar?: string;\n labels: {\n close: string;\n detailLoading: string;\n detailMessages: string;\n detailExport: string;\n archive: string;\n unarchive: string;\n pin: string;\n unpin: string;\n delete: string;\n unnamedSession: string;\n };\n onClose: () => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onExport: () => void;\n onDelete: () => void;\n}) {\n const isArchived = session?.status === 'archived';\n const isPinned = session?.status === 'pinned';\n\n return (\n <Dialog.Root open={open} onOpenChange={(v) => !v && onClose()}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-drawer-right fixed right-0 top-0 flex size-full max-w-lg flex-col border-l border-edge bg-surface-panel shadow-popover outline-none',\n SETTINGS_SHELL_CONTENT_Z,\n 'dark:border-edge',\n )}\n aria-describedby={undefined}\n >\n <div className=\"flex min-w-0 shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3 dark:border-edge\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n {session && sessionAgentId ? (\n <AgentAvatarDisplay\n agentId={sessionAgentId}\n avatar={sessionAgentAvatar}\n size={40}\n className=\"size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge\"\n />\n ) : null}\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-fg\">\n {session?.name?.trim() || labels.unnamedSession}\n </Dialog.Title>\n </div>\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"size-9 shrink-0 p-0\" aria-label={labels.close}>\n <X className=\"size-5\" strokeWidth={1.75} />\n </Button>\n </Dialog.Close>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto px-4 py-3\">\n {loading ? (\n <p className=\"text-sm text-fg-muted\">{labels.detailLoading}</p>\n ) : session ? (\n <>\n <dl className=\"mb-4 grid gap-2 text-xs text-fg-muted\">\n <div>\n <dt className=\"text-fg-disabled\">Key</dt>\n <dd className=\"mt-0.5 break-all font-mono text-fg\">{session.key}</dd>\n </div>\n <div className=\"flex flex-wrap gap-4\">\n <span>\n {session.messageCount} msgs · {session.estimatedTokens} tok\n </span>\n </div>\n </dl>\n <h3 className=\"mb-2 text-xs font-medium uppercase tracking-wide text-fg-subtle\">\n {labels.detailMessages}\n </h3>\n <ul className=\"space-y-3\">\n {session.messages.map((msg) => (\n <li\n key={`${msg.timestamp ?? ''}-${msg.role}-${previewContent(msg.content).slice(0, 24)}`}\n className=\"rounded-lg border border-edge-subtle bg-surface-hover/50 p-2 dark:border-edge\"\n >\n <div className=\"mb-1 text-[10px] font-medium uppercase text-fg-subtle\">{msg.role}</div>\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-fg-muted\">\n {previewContent(msg.content)}\n </pre>\n </li>\n ))}\n </ul>\n </>\n ) : null}\n </div>\n\n <div className=\"shrink-0 border-t border-edge px-4 py-3 dark:border-edge\">\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onExport}>\n {labels.detailExport}\n </Button>\n {isArchived ? (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onUnarchive}>\n {labels.unarchive}\n </Button>\n ) : (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onArchive}>\n {labels.archive}\n </Button>\n )}\n {isPinned ? (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onUnpin}>\n {labels.unpin}\n </Button>\n ) : (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onPin}>\n {labels.pin}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"text-sm text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40\"\n onClick={onDelete}\n >\n {labels.delete}\n </Button>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport {\n Archive,\n Circle,\n FolderOpen,\n Layers,\n LayoutGrid,\n LayoutList,\n Pin,\n Search,\n} from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport useSWR from 'swr';\n\nimport { fetchChatAgents } from '@/features/chat/chat-agents-api';\nimport { SessionCard, type SessionCardAction } from '@/features/sessions/session-card';\nimport { agentAvatarFromOptions, resolveSessionAgentId } from '@/features/sessions/session-agent-resolve';\nimport { SessionDetailDrawer } from '@/features/sessions/session-detail-drawer';\nimport {\n archiveSession,\n deleteSession,\n exportSessionJson,\n getSessionDetail,\n getSessionStats,\n listSessions,\n pinSession,\n unarchiveSession,\n unpinSession,\n} from '@/features/sessions/session-api';\nimport type { SessionDetail, SessionMetadata, SessionStats } from '@/features/sessions/session.types';\nimport { Button } from '@/components/ui/button';\nimport {\n segmentedThumbActiveClassName,\n segmentedThumbBaseClassName,\n segmentedTrackClassName,\n} from '@/components/ui/segmented-styles';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst PAGE_LIMIT = 20;\n\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => String(params[key] ?? ''));\n}\n\ntype StatusFilter = 'all' | 'active' | 'pinned' | 'archived';\ntype SessionsViewMode = 'grid' | 'list';\n\nconst SESSION_STATUS_FILTER_SET = new Set<StatusFilter>(['all', 'active', 'pinned', 'archived']);\nconst SESSION_VIEW_MODE_SET = new Set<SessionsViewMode>(['grid', 'list']);\n\nexport function SessionsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const s = m.sessions;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const { data: chatAgents, mutate: mutateChatAgents } = useSWR(\n hasToken ? (['gateway-chat-agents', token] as const) : null,\n fetchChatAgents,\n { revalidateOnFocus: false },\n );\n const defaultAgentId = chatAgents?.defaultId ?? 'main';\n const agentItems = chatAgents?.items ?? [];\n const [searchParams, setSearchParams] = useSearchParams();\n\n const initialSearch = searchParams.get('q') ?? '';\n const initialStatus = searchParams.get('status');\n const initialView = searchParams.get('view');\n const initialChannel = searchParams.get('channel') ?? '';\n const initialStatusFilter: StatusFilter = SESSION_STATUS_FILTER_SET.has(initialStatus as StatusFilter)\n ? (initialStatus as StatusFilter)\n : 'all';\n const initialViewMode: SessionsViewMode = SESSION_VIEW_MODE_SET.has(initialView as SessionsViewMode)\n ? (initialView as SessionsViewMode)\n : 'grid';\n\n const [searchInput, setSearchInput] = useState(initialSearch);\n const [debouncedSearch, setDebouncedSearch] = useState(initialSearch.trim());\n const [statusFilter, setStatusFilter] = useState<StatusFilter>(initialStatusFilter);\n const [viewMode, setViewMode] = useState<SessionsViewMode>(initialViewMode);\n const [channelFilter, setChannelFilter] = useState(initialChannel.trim());\n\n const [sessions, setSessions] = useState<SessionMetadata[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [stats, setStats] = useState<SessionStats | null>(null);\n\n const [detailOpen, setDetailOpen] = useState(false);\n const [detailLoading, setDetailLoading] = useState(false);\n const [detailSession, setDetailSession] = useState<SessionDetail | null>(null);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [confirmKey, setConfirmKey] = useState<string | null>(null);\n\n useEffect(() => {\n const t = setTimeout(() => setDebouncedSearch(searchInput.trim()), 300);\n return () => clearTimeout(t);\n }, [searchInput]);\n\n // Sync URL → local state during render so the URL→state→URL effect chain doesn't add a render.\n const searchParamsKey = searchParams.toString();\n const trackedSearchParamsKeyRef = useRef(searchParamsKey);\n if (trackedSearchParamsKeyRef.current !== searchParamsKey) {\n trackedSearchParamsKeyRef.current = searchParamsKey;\n const nextQ = searchParams.get('q') ?? '';\n const nextStatusRaw = searchParams.get('status');\n const nextViewRaw = searchParams.get('view');\n const nextChannel = (searchParams.get('channel') ?? '').trim();\n const nextStatus: StatusFilter = SESSION_STATUS_FILTER_SET.has(nextStatusRaw as StatusFilter)\n ? (nextStatusRaw as StatusFilter)\n : 'all';\n const nextView: SessionsViewMode = SESSION_VIEW_MODE_SET.has(nextViewRaw as SessionsViewMode)\n ? (nextViewRaw as SessionsViewMode)\n : 'grid';\n const nextDebouncedQ = nextQ.trim();\n\n setSearchInput((prev) => (prev === nextQ ? prev : nextQ));\n setDebouncedSearch((prev) => (prev === nextDebouncedQ ? prev : nextDebouncedQ));\n setStatusFilter((prev) => (prev === nextStatus ? prev : nextStatus));\n setViewMode((prev) => (prev === nextView ? prev : nextView));\n setChannelFilter((prev) => (prev === nextChannel ? prev : nextChannel));\n }\n\n useEffect(() => {\n const params = new URLSearchParams(searchParams);\n const nextQ = debouncedSearch.trim();\n if (nextQ) params.set('q', nextQ);\n else params.delete('q');\n if (statusFilter !== 'all') params.set('status', statusFilter);\n else params.delete('status');\n if (viewMode !== 'grid') params.set('view', viewMode);\n else params.delete('view');\n if (channelFilter) params.set('channel', channelFilter);\n else params.delete('channel');\n const next = params.toString();\n if (next !== searchParams.toString()) {\n setSearchParams(params, { replace: true });\n }\n }, [debouncedSearch, searchParams, setSearchParams, statusFilter, viewMode, channelFilter]);\n\n useEffect(() => {\n if (!hasToken) return;\n let cancelled = false;\n (async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await listSessions({\n limit: PAGE_LIMIT,\n offset: 0,\n ...(debouncedSearch ? { search: debouncedSearch } : {}),\n ...(statusFilter !== 'all' ? { status: statusFilter } : {}),\n ...(channelFilter ? { channel: channelFilter } : {}),\n });\n if (cancelled) return;\n setSessions(result.items);\n setHasMore(result.hasMore);\n } catch (e) {\n if (!cancelled) setError(e instanceof Error ? e.message : s.loadError);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [hasToken, debouncedSearch, statusFilter, s.loadError]);\n\n useEffect(() => {\n if (!hasToken) return;\n void getSessionStats()\n .then(setStats)\n .catch(() => {});\n }, [hasToken]);\n\n useEffect(() => {\n if (!hasToken) return;\n const onConfigReload = () => void mutateChatAgents();\n window.addEventListener('config-reload', onConfigReload);\n return () => window.removeEventListener('config-reload', onConfigReload);\n }, [hasToken, mutateChatAgents]);\n\n useEffect(() => {\n if (!hasToken) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<{ key?: string; name?: string }>).detail;\n if (!detail?.key || detail.name === undefined) return;\n setSessions((prev) =>\n prev.map((row) => (row.key === detail.key ? { ...row, name: detail.name } : row)),\n );\n setDetailSession((prev) =>\n prev && prev.key === detail.key ? { ...prev, name: detail.name } : prev,\n );\n };\n window.addEventListener('session-updated', handler);\n return () => {\n window.removeEventListener('session-updated', handler);\n };\n }, [hasToken]);\n\n const loadMore = useCallback(async () => {\n if (!hasToken || loading || !hasMore) return;\n setLoading(true);\n setError(null);\n try {\n const result = await listSessions({\n limit: PAGE_LIMIT,\n offset: sessions.length,\n ...(debouncedSearch ? { search: debouncedSearch } : {}),\n ...(statusFilter !== 'all' ? { status: statusFilter } : {}),\n ...(channelFilter ? { channel: channelFilter } : {}),\n });\n setSessions((prev) => [...prev, ...result.items]);\n setHasMore(result.hasMore);\n } catch (e) {\n setError(e instanceof Error ? e.message : s.loadError);\n } finally {\n setLoading(false);\n }\n }, [\n hasToken,\n loading,\n hasMore,\n sessions.length,\n debouncedSearch,\n statusFilter,\n channelFilter,\n s.loadError,\n ]);\n\n const updateSessionStatus = useCallback((key: string, status: SessionMetadata['status']) => {\n setSessions((prev) => prev.map((row) => (row.key === key ? { ...row, status } : row)));\n setDetailSession((prev) => (prev && prev.key === key ? { ...prev, status } : prev));\n }, []);\n\n const openDetail = useCallback(async (key: string) => {\n setDetailOpen(true);\n setDetailLoading(true);\n setDetailSession(null);\n try {\n const session = await getSessionDetail(key);\n setDetailSession(session);\n } catch {\n setDetailOpen(false);\n } finally {\n setDetailLoading(false);\n }\n }, []);\n\n const handleCardOpen = (key: string) => {\n void openDetail(key);\n };\n\n const handleCardAction = async (key: string, action: SessionCardAction) => {\n if (action === 'continue') {\n window.dispatchEvent(\n new CustomEvent('navigate-to-chat', { detail: { sessionKey: key }, bubbles: true }),\n );\n return;\n }\n if (action === 'delete') {\n setConfirmKey(key);\n setConfirmOpen(true);\n return;\n }\n try {\n switch (action) {\n case 'archive':\n await archiveSession(key);\n updateSessionStatus(key, 'archived');\n break;\n case 'unarchive':\n await unarchiveSession(key);\n updateSessionStatus(key, 'active');\n break;\n case 'pin':\n await pinSession(key);\n updateSessionStatus(key, 'pinned');\n break;\n case 'unpin':\n await unpinSession(key);\n updateSessionStatus(key, 'active');\n break;\n case 'export': {\n const content = await exportSessionJson(key);\n const blob = new Blob([content], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `session-${key.replace(/[^a-z0-9]/gi, '_')}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n break;\n }\n default:\n break;\n }\n void getSessionStats().then(setStats).catch(() => {});\n } catch {\n /* toast optional */\n }\n };\n\n const runDelete = async (key: string) => {\n try {\n await deleteSession(key);\n setSessions((prev) => prev.filter((row) => row.key !== key));\n setDetailSession((prev) => (prev?.key === key ? null : prev));\n if (detailSession?.key === key) setDetailOpen(false);\n void getSessionStats().then(setStats).catch(() => {});\n } catch {\n /* ignore */\n }\n };\n\n const cardLabels = {\n continueChat: s.continueChat,\n archive: s.archive,\n unarchive: s.unarchive,\n pin: s.pin,\n unpin: s.unpin,\n export: s.export,\n delete: s.delete,\n unnamedSession: m.chat.newSession,\n };\n\n const detailLabels = {\n close: s.close,\n detailLoading: s.detailLoading,\n detailMessages: s.detailMessages,\n detailExport: s.detailExport,\n archive: s.archive,\n unarchive: s.unarchive,\n pin: s.pin,\n unpin: s.unpin,\n delete: s.delete,\n unnamedSession: m.chat.newSession,\n };\n\n const filters: { key: StatusFilter; label: string; icon: typeof Layers }[] = [\n { key: 'all', label: s.filterAll, icon: Layers },\n { key: 'active', label: s.filterActive, icon: Circle },\n { key: 'pinned', label: s.filterPinned, icon: Pin },\n { key: 'archived', label: s.filterArchived, icon: Archive },\n ];\n\n const channelChips = (() => {\n const entries = Object.entries(stats?.byChannel ?? {}).sort((a, b) => b[1] - a[1]);\n const top = entries.slice(0, 6).map(([id]) => id);\n // Keep a few common channels visible even if no stats yet.\n for (const c of ['telegram', 'weixin', 'feishu']) {\n if (!top.includes(c)) top.push(c);\n }\n return top.slice(0, 8);\n })();\n\n if (!hasToken) {\n return (\n <div className=\"mx-auto w-full max-w-2xl px-4 py-16 text-center text-sm text-fg-muted sm:px-8 lg:max-w-app-main\">\n {s.needToken}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden bg-surface-panel\">\n <div className=\"mx-auto flex w-full min-w-0 max-w-2xl flex-col gap-4 px-4 py-6 sm:px-6 lg:max-w-app-main lg:px-8\">\n <header className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{s.title}</h1>\n <div className=\"flex w-full min-w-0 items-center gap-2 rounded-xl bg-surface-base px-3 py-2 transition-colors sm:max-w-md dark:bg-surface-hover/40\">\n <Search className=\"size-4 shrink-0 text-fg-disabled\" strokeWidth={1.75} aria-hidden />\n <input\n type=\"search\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder={s.searchPlaceholder}\n className=\"min-w-0 flex-1 border-0 bg-transparent text-sm text-fg placeholder:text-fg-disabled focus:outline-none focus:ring-0\"\n />\n </div>\n </header>\n\n <div className=\"flex flex-wrap gap-2\">\n {filters.map(({ key, label, icon: Icon }) => (\n <button\n key={key}\n type=\"button\"\n aria-pressed={statusFilter === key}\n onClick={() => setStatusFilter(key)}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-xl px-3 py-2 text-sm font-medium',\n interaction.transition,\n /* Filter chips (selection): no press scale. */\n interaction.focusRingPanel,\n statusFilter === key\n ? 'bg-accent-soft text-accent-fg'\n : 'bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35',\n )}\n >\n <Icon className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs font-medium text-fg-subtle\">{s.filterChannelLabel}</span>\n <button\n type=\"button\"\n aria-pressed={!channelFilter}\n onClick={() => setChannelFilter('')}\n className={cn(\n 'inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium',\n interaction.transition,\n interaction.focusRingPanel,\n !channelFilter\n ? 'bg-accent-soft text-accent-fg'\n : 'bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35',\n )}\n >\n {s.filterChannelAll}\n </button>\n {channelChips.map((chId) => (\n <button\n key={chId}\n type=\"button\"\n aria-pressed={channelFilter === chId}\n onClick={() => setChannelFilter(chId)}\n className={cn(\n 'inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium',\n interaction.transition,\n interaction.focusRingPanel,\n channelFilter === chId\n ? 'bg-accent-soft text-accent-fg'\n : 'bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35',\n )}\n >\n {chId}\n {stats?.byChannel?.[chId] != null ? (\n <span className=\"ml-2 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] text-fg-subtle\">\n {stats.byChannel[chId]}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n\n {stats ? (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n {[\n [stats.totalSessions, s.totalSessions],\n [stats.activeSessions, s.activeSessions],\n [stats.pinnedSessions, s.pinnedSessions],\n [stats.archivedSessions, s.archivedSessions],\n ].map(([value, label]) => (\n <div\n key={label}\n className=\"rounded-xl bg-surface-base p-3 dark:bg-surface-hover/30\"\n >\n <div className=\"text-lg font-semibold tabular-nums text-fg\">{value}</div>\n <div className=\"text-xs text-fg-muted\">{label}</div>\n </div>\n ))}\n </div>\n ) : null}\n\n {error ? (\n <div className=\"rounded-lg border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\">\n {error}\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs text-fg-muted\">{interpolate(s.sessionCount, { count: sessions.length })}</p>\n <div className={segmentedTrackClassName} role=\"group\" aria-label={s.layoutToggleGroup}>\n <Button\n type=\"button\"\n variant=\"segmented\"\n title={s.gridView}\n aria-pressed={viewMode === 'grid'}\n onClick={() => setViewMode('grid')}\n className={cn(\n segmentedThumbBaseClassName,\n 'size-7 p-0',\n viewMode === 'grid' && segmentedThumbActiveClassName,\n viewMode === 'grid' && 'text-accent-fg',\n )}\n >\n <LayoutGrid className=\"size-3.5\" strokeWidth={1.5} />\n </Button>\n <Button\n type=\"button\"\n variant=\"segmented\"\n title={s.listView}\n aria-pressed={viewMode === 'list'}\n onClick={() => setViewMode('list')}\n className={cn(\n segmentedThumbBaseClassName,\n 'size-9 p-0',\n viewMode === 'list' && segmentedThumbActiveClassName,\n viewMode === 'list' && 'text-accent-fg',\n )}\n >\n <LayoutList className=\"size-3.5\" strokeWidth={1.5} />\n </Button>\n </div>\n </div>\n\n {loading && sessions.length === 0 ? (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"h-40 animate-pulse rounded-xl bg-surface-hover/60 dark:bg-surface-hover/40\"\n />\n ))}\n </div>\n ) : sessions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-2xl bg-surface-base py-16 text-center dark:bg-surface-hover/25\">\n <FolderOpen className=\"mb-3 size-12 text-fg-disabled\" strokeWidth={1.25} aria-hidden />\n <p className=\"text-base font-semibold text-fg\">{s.noSessions}</p>\n <p className=\"mt-1 max-w-sm text-sm text-fg-muted\">{s.noSessionsDescription}</p>\n <Button\n variant=\"primary\"\n className=\"mt-6\"\n onClick={() => {\n window.dispatchEvent(new CustomEvent('navigate-to-chat', { detail: { sessionKey: '' }, bubbles: true }));\n }}\n >\n {s.startNewChat}\n </Button>\n </div>\n ) : (\n <>\n <div\n className={cn(\n 'grid min-w-0 gap-3',\n viewMode === 'grid' ? 'sm:grid-cols-2 lg:grid-cols-3' : 'grid-cols-1',\n )}\n >\n {sessions.map((session) => {\n const sessionAgentId = resolveSessionAgentId(session, defaultAgentId);\n return (\n <SessionCard\n key={session.key}\n session={session}\n variant={viewMode}\n labels={cardLabels}\n sessionAgentId={sessionAgentId}\n sessionAgentAvatar={agentAvatarFromOptions(sessionAgentId, agentItems)}\n onOpen={() => handleCardOpen(session.key)}\n onAction={(action) => void handleCardAction(session.key, action)}\n />\n );\n })}\n </div>\n {hasMore ? (\n <div className=\"flex justify-center pt-2\">\n <Button type=\"button\" variant=\"secondary\" disabled={loading} onClick={() => void loadMore()}>\n {s.loadMore}\n </Button>\n </div>\n ) : null}\n </>\n )}\n </div>\n\n <SessionDetailDrawer\n open={detailOpen}\n loading={detailLoading}\n session={detailSession}\n sessionAgentId={\n detailSession ? resolveSessionAgentId(detailSession, defaultAgentId) : undefined\n }\n sessionAgentAvatar={\n detailSession\n ? agentAvatarFromOptions(\n resolveSessionAgentId(detailSession, defaultAgentId),\n agentItems,\n )\n : undefined\n }\n labels={detailLabels}\n onClose={() => {\n setDetailOpen(false);\n setDetailSession(null);\n }}\n onArchive={() => detailSession && void handleCardAction(detailSession.key, 'archive')}\n onUnarchive={() => detailSession && void handleCardAction(detailSession.key, 'unarchive')}\n onPin={() => detailSession && void handleCardAction(detailSession.key, 'pin')}\n onUnpin={() => detailSession && void handleCardAction(detailSession.key, 'unpin')}\n onExport={() => detailSession && void handleCardAction(detailSession.key, 'export')}\n onDelete={() => detailSession && (setConfirmKey(detailSession.key), setConfirmOpen(true))}\n />\n\n <Dialog.Root open={confirmOpen} onOpenChange={setConfirmOpen}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n SETTINGS_SHELL_CONTENT_Z,\n )}\n >\n <Dialog.Title className=\"text-base font-semibold text-fg\">{s.deleteSessionTitle}</Dialog.Title>\n <p className=\"mt-2 text-sm text-fg-muted\">\n {confirmKey\n ? interpolate(s.deleteSessionMessage, {\n name:\n sessions.find((x) => x.key === confirmKey)?.name?.trim() || m.chat.newSession,\n })\n : ''}\n </p>\n <div className=\"mt-4 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={() => setConfirmOpen(false)}>\n {s.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"bg-red-600 hover:bg-red-700\"\n onClick={() => {\n if (confirmKey) void runDelete(confirmKey);\n setConfirmOpen(false);\n setConfirmKey(null);\n }}\n >\n {s.delete}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sessions-page-DoGE8N-O.js","names":["Archive","ArchiveRestore","Download","MessageSquare","Pin","PinOff","Trash2","Zap","SessionMetadata","AgentAvatarDisplay","ghostIconButton","cn","SessionCardAction","formatRelativeDate","dateStr","date","Date","now","diffDays","Math","floor","getTime","toLocaleTimeString","hour","minute","toLocaleDateString","weekday","month","day","formatTokens","tokens","toFixed","String","SessionCard","t0","$","_c","session","variant","labels","sessionAgentId","sessionAgentAvatar","onOpen","onAction","t1","unnamedSession","name","trim","displayName","t2","showKeySubtitle","Boolean","isArchived","status","isPinned","t3","t4","t5","e","key","preventDefault","t6","t7","t8","sourceChannel","t9","t10","updatedAt","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","Symbol","for","t24","messageCount","t25","t26","estimatedTokens","t27","t28","t29","tags","length","slice","map","_temp","t30","t31","t32","t33","continueChat","t34","archive","unarchive","t35","pin","unpin","t36","t37","t38","export","t39","t40","t41","t42","delete","t43","_temp2","_temp3","t44","e_1","stopPropagation","e_0","tag","Dialog","X","Button","SessionDetail","AgentAvatarDisplay","cn","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","previewContent","content","length","slice","s","JSON","stringify","String","SessionDetailDrawer","t0","$","_c","open","loading","session","sessionAgentId","sessionAgentAvatar","labels","onClose","onArchive","onUnarchive","onPin","onUnpin","onExport","onDelete","isArchived","status","isPinned","t1","v","t2","Symbol","for","t3","t4","t5","unnamedSession","name","trim","t6","t7","t8","t9","close","t10","t11","detailLoading","detailMessages","key","messageCount","estimatedTokens","messages","map","_temp","t12","t13","detailExport","t14","archive","unarchive","t15","pin","unpin","t16","delete","t17","t18","undefined","t19","msg","timestamp","role","Dialog","Archive","Circle","FolderOpen","Layers","LayoutGrid","LayoutList","Pin","Search","useCallback","useEffect","useRef","useState","useSearchParams","useSWR","fetchChatAgents","SessionCard","SessionCardAction","agentAvatarFromOptions","resolveSessionAgentId","SessionDetailDrawer","archiveSession","deleteSession","exportSessionJson","getSessionDetail","getSessionStats","listSessions","pinSession","unarchiveSession","unpinSession","SessionDetail","SessionMetadata","SessionStats","Button","segmentedThumbActiveClassName","segmentedThumbBaseClassName","segmentedTrackClassName","messages","cn","interaction","SETTINGS_SHELL_CONTENT_Z","SETTINGS_SHELL_OVERLAY_Z","useGatewayStore","useLocaleStore","PAGE_LIMIT","interpolate","template","params","Record","replace","_","key","String","StatusFilter","SessionsViewMode","SESSION_STATUS_FILTER_SET","Set","SESSION_VIEW_MODE_SET","SessionsPage","language","s","m","sessions","token","st","hasToken","Boolean","data","chatAgents","mutate","mutateChatAgents","const","revalidateOnFocus","defaultAgentId","defaultId","agentItems","items","searchParams","setSearchParams","initialSearch","get","initialStatus","initialView","initialChannel","initialStatusFilter","has","initialViewMode","searchInput","setSearchInput","debouncedSearch","setDebouncedSearch","trim","statusFilter","setStatusFilter","viewMode","setViewMode","channelFilter","setChannelFilter","setSessions","loading","setLoading","error","setError","hasMore","setHasMore","stats","setStats","detailOpen","setDetailOpen","detailLoading","setDetailLoading","detailSession","setDetailSession","confirmOpen","setConfirmOpen","confirmKey","setConfirmKey","t","setTimeout","clearTimeout","searchParamsKey","toString","trackedSearchParamsKeyRef","current","nextQ","nextStatusRaw","nextViewRaw","nextChannel","nextStatus","nextView","nextDebouncedQ","prev","URLSearchParams","set","delete","next","cancelled","result","limit","offset","search","status","channel","e","Error","message","loadError","then","catch","onConfigReload","window","addEventListener","removeEventListener","handler","Event","detail","CustomEvent","name","undefined","map","row","loadMore","length","updateSessionStatus","openDetail","session","handleCardOpen","handleCardAction","action","dispatchEvent","sessionKey","bubbles","content","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","body","appendChild","click","removeChild","revokeObjectURL","runDelete","filter","cardLabels","continueChat","archive","unarchive","pin","unpin","export","unnamedSession","chat","newSession","detailLabels","close","detailMessages","detailExport","filters","label","icon","filterAll","filterActive","filterPinned","filterArchived","channelChips","entries","Object","byChannel","sort","b","top","slice","id","c","includes","push","needToken","title","target","value","searchPlaceholder","Icon","transition","focusRingPanel","filterChannelLabel","filterChannelAll","chId","totalSessions","activeSessions","pinnedSessions","archivedSessions","sessionCount","count","layoutToggleGroup","gridView","listView","Array","from","i","noSessions","noSessionsDescription","startNewChat","sessionAgentId","deleteSessionTitle","deleteSessionMessage","find","x","cancel"],"sources":["../../../../../web/src/features/sessions/session-card.tsx","../../../../../web/src/features/sessions/session-detail-drawer.tsx","../../../../../web/src/features/sessions/sessions-page.tsx"],"sourcesContent":["import {\n Archive,\n ArchiveRestore,\n Download,\n MessageSquare,\n Pin,\n PinOff,\n Trash2,\n Zap,\n} from 'lucide-react';\n\nimport type { SessionMetadata } from '@/features/sessions/session.types';\nimport { AgentAvatarDisplay } from '@/features/settings/agents/agent-avatar-display';\nimport { ghostIconButton } from '@/lib/interaction';\nimport { cn } from '@/lib/cn';\n\nexport type SessionCardAction =\n | 'continue'\n | 'delete'\n | 'archive'\n | 'unarchive'\n | 'pin'\n | 'unpin'\n | 'export';\n\nfunction formatRelativeDate(dateStr: string): string {\n const date = new Date(dateStr);\n const now = new Date();\n const diffDays = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24));\n if (diffDays === 0) {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return date.toLocaleDateString([], { weekday: 'short' });\n return date.toLocaleDateString([], { month: 'short', day: 'numeric' });\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(1)}k`;\n return String(tokens);\n}\n\nexport function SessionCard({\n session,\n variant,\n labels,\n sessionAgentId,\n sessionAgentAvatar,\n onOpen,\n onAction,\n}: {\n session: SessionMetadata;\n variant: 'grid' | 'list';\n sessionAgentId: string;\n sessionAgentAvatar?: string;\n labels: {\n continueChat: string;\n archive: string;\n unarchive: string;\n pin: string;\n unpin: string;\n export: string;\n delete: string;\n /** Shown when `session.name` is empty (e.g. new chat before auto-title). */\n unnamedSession: string;\n };\n onOpen: () => void;\n onAction: (action: SessionCardAction) => void;\n}) {\n const displayName = session.name?.trim() || labels.unnamedSession;\n const showKeySubtitle = Boolean(session.name?.trim());\n const isArchived = session.status === 'archived';\n const isPinned = session.status === 'pinned';\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n // min-w-0: grid/flex children default to min-width:auto — long unbroken titles (URLs) otherwise expand the track\n 'group flex min-w-0 w-full max-w-full cursor-pointer flex-col rounded-xl bg-surface-base text-left transition-colors duration-150 ease-out',\n 'hover:bg-surface-hover active:scale-[0.99]',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n variant === 'list' && 'sm:flex-row sm:items-center sm:gap-4',\n )}\n onClick={onOpen}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onOpen();\n }\n }}\n >\n <div\n className={cn(\n 'flex min-w-0 items-start justify-between gap-2 bg-surface-hover/35 px-3 py-2 dark:bg-surface-hover/25',\n variant === 'list' && 'sm:py-3',\n )}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-[11px] font-medium uppercase tracking-wide text-fg-subtle\">\n {session.sourceChannel}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5 text-xs text-fg-muted\">\n {isPinned ? <Pin className=\"size-3.5 text-accent-fg\" strokeWidth={1.75} aria-hidden /> : null}\n <span>{formatRelativeDate(session.updatedAt)}</span>\n </div>\n </div>\n\n <div className={cn('min-w-0 flex-1 px-3 py-2', variant === 'list' && 'sm:py-3')}>\n <div className={cn('flex gap-3', variant === 'list' && 'sm:items-start')}>\n <AgentAvatarDisplay\n agentId={sessionAgentId}\n avatar={sessionAgentAvatar}\n size={40}\n className=\"size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"min-w-0 max-w-full truncate text-sm font-semibold text-fg\" title={displayName}>\n {displayName}\n </div>\n {showKeySubtitle ? (\n <div\n className=\"mt-0.5 min-w-0 max-w-full truncate font-mono text-[11px] text-fg-subtle\"\n title={session.key}\n >\n {session.key}\n </div>\n ) : null}\n </div>\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-3 text-xs text-fg-muted\">\n <span className=\"inline-flex items-center gap-1\">\n <MessageSquare className=\"size-3.5\" strokeWidth={1.75} aria-hidden />\n {session.messageCount}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Zap className=\"size-3.5\" strokeWidth={1.75} aria-hidden />\n {formatTokens(session.estimatedTokens)}\n </span>\n </div>\n {session.tags.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {session.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n className=\"max-w-full break-words rounded-md bg-surface-hover px-1.5 py-0.5 text-[11px] text-fg-muted\"\n >\n {tag}\n </span>\n ))}\n {session.tags.length > 3 ? (\n <span className=\"text-[11px] text-fg-disabled\">+{session.tags.length - 3}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <div\n role=\"group\"\n className=\"flex flex-wrap items-center gap-0.5 border-t border-edge-subtle/80 bg-surface-hover/25 p-2 dark:border-edge-subtle\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.continueChat}\n aria-label={labels.continueChat}\n onClick={() => onAction('continue')}\n >\n <MessageSquare className=\"size-4\" strokeWidth={1.75} />\n </button>\n {isArchived ? (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.unarchive}\n aria-label={labels.unarchive}\n onClick={() => onAction('unarchive')}\n >\n <ArchiveRestore className=\"size-4\" strokeWidth={1.75} />\n </button>\n ) : (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.archive}\n aria-label={labels.archive}\n onClick={() => onAction('archive')}\n >\n <Archive className=\"size-4\" strokeWidth={1.75} />\n </button>\n )}\n {isPinned ? (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.unpin}\n aria-label={labels.unpin}\n onClick={() => onAction('unpin')}\n >\n <PinOff className=\"size-4\" strokeWidth={1.75} />\n </button>\n ) : (\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.pin}\n aria-label={labels.pin}\n onClick={() => onAction('pin')}\n >\n <Pin className=\"size-4\" strokeWidth={1.75} />\n </button>\n )}\n <button\n type=\"button\"\n className={ghostIconButton}\n title={labels.export}\n aria-label={labels.export}\n onClick={() => onAction('export')}\n >\n <Download className=\"size-4\" strokeWidth={1.75} />\n </button>\n <button\n type=\"button\"\n className={cn(\n ghostIconButton,\n 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40',\n )}\n title={labels.delete}\n aria-label={labels.delete}\n onClick={() => onAction('delete')}\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} />\n </button>\n </div>\n </div>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { SessionDetail } from '@/features/sessions/session.types';\nimport { AgentAvatarDisplay } from '@/features/settings/agents/agent-avatar-display';\nimport { cn } from '@/lib/cn';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\n\nfunction previewContent(content: string | unknown[]): string {\n if (typeof content === 'string') {\n return content.length > 2000 ? `${content.slice(0, 2000)}…` : content;\n }\n try {\n const s = JSON.stringify(content, null, 2);\n return s.length > 2000 ? `${s.slice(0, 2000)}…` : s;\n } catch {\n return String(content);\n }\n}\n\nexport function SessionDetailDrawer({\n open,\n loading,\n session,\n sessionAgentId,\n sessionAgentAvatar,\n labels,\n onClose,\n onArchive,\n onUnarchive,\n onPin,\n onUnpin,\n onExport,\n onDelete,\n}: {\n open: boolean;\n loading: boolean;\n session: SessionDetail | null;\n sessionAgentId?: string;\n sessionAgentAvatar?: string;\n labels: {\n close: string;\n detailLoading: string;\n detailMessages: string;\n detailExport: string;\n archive: string;\n unarchive: string;\n pin: string;\n unpin: string;\n delete: string;\n unnamedSession: string;\n };\n onClose: () => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onExport: () => void;\n onDelete: () => void;\n}) {\n const isArchived = session?.status === 'archived';\n const isPinned = session?.status === 'pinned';\n\n return (\n <Dialog.Root open={open} onOpenChange={(v) => !v && onClose()}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-drawer-right fixed right-0 top-0 flex size-full max-w-lg flex-col border-l border-edge bg-surface-panel shadow-popover outline-none',\n SETTINGS_SHELL_CONTENT_Z,\n 'dark:border-edge',\n )}\n aria-describedby={undefined}\n >\n <div className=\"flex min-w-0 shrink-0 items-center justify-between gap-2 border-b border-edge px-4 py-3 dark:border-edge\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n {session && sessionAgentId ? (\n <AgentAvatarDisplay\n agentId={sessionAgentId}\n avatar={sessionAgentAvatar}\n size={40}\n className=\"size-10 shrink-0 ring-1 ring-edge/60 dark:ring-edge\"\n />\n ) : null}\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-base font-semibold tracking-tight text-fg\">\n {session?.name?.trim() || labels.unnamedSession}\n </Dialog.Title>\n </div>\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"size-9 shrink-0 p-0\" aria-label={labels.close}>\n <X className=\"size-5\" strokeWidth={1.75} />\n </Button>\n </Dialog.Close>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto px-4 py-3\">\n {loading ? (\n <p className=\"text-sm text-fg-muted\">{labels.detailLoading}</p>\n ) : session ? (\n <>\n <dl className=\"mb-4 grid gap-2 text-xs text-fg-muted\">\n <div>\n <dt className=\"text-fg-disabled\">Key</dt>\n <dd className=\"mt-0.5 break-all font-mono text-fg\">{session.key}</dd>\n </div>\n <div className=\"flex flex-wrap gap-4\">\n <span>\n {session.messageCount} msgs · {session.estimatedTokens} tok\n </span>\n </div>\n </dl>\n <h3 className=\"mb-2 text-xs font-medium uppercase tracking-wide text-fg-subtle\">\n {labels.detailMessages}\n </h3>\n <ul className=\"space-y-3\">\n {session.messages.map((msg) => (\n <li\n key={`${msg.timestamp ?? ''}-${msg.role}-${previewContent(msg.content).slice(0, 24)}`}\n className=\"rounded-lg border border-edge-subtle bg-surface-hover/50 p-2 dark:border-edge\"\n >\n <div className=\"mb-1 text-[10px] font-medium uppercase text-fg-subtle\">{msg.role}</div>\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-fg-muted\">\n {previewContent(msg.content)}\n </pre>\n </li>\n ))}\n </ul>\n </>\n ) : null}\n </div>\n\n <div className=\"shrink-0 border-t border-edge px-4 py-3 dark:border-edge\">\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onExport}>\n {labels.detailExport}\n </Button>\n {isArchived ? (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onUnarchive}>\n {labels.unarchive}\n </Button>\n ) : (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onArchive}>\n {labels.archive}\n </Button>\n )}\n {isPinned ? (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onUnpin}>\n {labels.unpin}\n </Button>\n ) : (\n <Button type=\"button\" variant=\"secondary\" className=\"text-sm\" onClick={onPin}>\n {labels.pin}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"text-sm text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40\"\n onClick={onDelete}\n >\n {labels.delete}\n </Button>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport {\n Archive,\n Circle,\n FolderOpen,\n Layers,\n LayoutGrid,\n LayoutList,\n Pin,\n Search,\n} from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport useSWR from 'swr';\n\nimport { fetchChatAgents } from '@/features/chat/chat-agents-api';\nimport { SessionCard, type SessionCardAction } from '@/features/sessions/session-card';\nimport { agentAvatarFromOptions, resolveSessionAgentId } from '@/features/sessions/session-agent-resolve';\nimport { SessionDetailDrawer } from '@/features/sessions/session-detail-drawer';\nimport {\n archiveSession,\n deleteSession,\n exportSessionJson,\n getSessionDetail,\n getSessionStats,\n listSessions,\n pinSession,\n unarchiveSession,\n unpinSession,\n} from '@/features/sessions/session-api';\nimport type { SessionDetail, SessionMetadata, SessionStats } from '@/features/sessions/session.types';\nimport { Button } from '@/components/ui/button';\nimport {\n segmentedThumbActiveClassName,\n segmentedThumbBaseClassName,\n segmentedTrackClassName,\n} from '@/components/ui/segmented-styles';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nconst PAGE_LIMIT = 20;\n\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => String(params[key] ?? ''));\n}\n\ntype StatusFilter = 'all' | 'active' | 'pinned' | 'archived';\ntype SessionsViewMode = 'grid' | 'list';\n\nconst SESSION_STATUS_FILTER_SET = new Set<StatusFilter>(['all', 'active', 'pinned', 'archived']);\nconst SESSION_VIEW_MODE_SET = new Set<SessionsViewMode>(['grid', 'list']);\n\nexport function SessionsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const s = m.sessions;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const { data: chatAgents, mutate: mutateChatAgents } = useSWR(\n hasToken ? (['gateway-chat-agents', token] as const) : null,\n fetchChatAgents,\n { revalidateOnFocus: false },\n );\n const defaultAgentId = chatAgents?.defaultId ?? 'main';\n const agentItems = chatAgents?.items ?? [];\n const [searchParams, setSearchParams] = useSearchParams();\n\n const initialSearch = searchParams.get('q') ?? '';\n const initialStatus = searchParams.get('status');\n const initialView = searchParams.get('view');\n const initialChannel = searchParams.get('channel') ?? '';\n const initialStatusFilter: StatusFilter = SESSION_STATUS_FILTER_SET.has(initialStatus as StatusFilter)\n ? (initialStatus as StatusFilter)\n : 'all';\n const initialViewMode: SessionsViewMode = SESSION_VIEW_MODE_SET.has(initialView as SessionsViewMode)\n ? (initialView as SessionsViewMode)\n : 'grid';\n\n const [searchInput, setSearchInput] = useState(initialSearch);\n const [debouncedSearch, setDebouncedSearch] = useState(initialSearch.trim());\n const [statusFilter, setStatusFilter] = useState<StatusFilter>(initialStatusFilter);\n const [viewMode, setViewMode] = useState<SessionsViewMode>(initialViewMode);\n const [channelFilter, setChannelFilter] = useState(initialChannel.trim());\n\n const [sessions, setSessions] = useState<SessionMetadata[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [stats, setStats] = useState<SessionStats | null>(null);\n\n const [detailOpen, setDetailOpen] = useState(false);\n const [detailLoading, setDetailLoading] = useState(false);\n const [detailSession, setDetailSession] = useState<SessionDetail | null>(null);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [confirmKey, setConfirmKey] = useState<string | null>(null);\n\n useEffect(() => {\n const t = setTimeout(() => setDebouncedSearch(searchInput.trim()), 300);\n return () => clearTimeout(t);\n }, [searchInput]);\n\n // Sync URL → local state during render so the URL→state→URL effect chain doesn't add a render.\n const searchParamsKey = searchParams.toString();\n const trackedSearchParamsKeyRef = useRef(searchParamsKey);\n if (trackedSearchParamsKeyRef.current !== searchParamsKey) {\n trackedSearchParamsKeyRef.current = searchParamsKey;\n const nextQ = searchParams.get('q') ?? '';\n const nextStatusRaw = searchParams.get('status');\n const nextViewRaw = searchParams.get('view');\n const nextChannel = (searchParams.get('channel') ?? '').trim();\n const nextStatus: StatusFilter = SESSION_STATUS_FILTER_SET.has(nextStatusRaw as StatusFilter)\n ? (nextStatusRaw as StatusFilter)\n : 'all';\n const nextView: SessionsViewMode = SESSION_VIEW_MODE_SET.has(nextViewRaw as SessionsViewMode)\n ? (nextViewRaw as SessionsViewMode)\n : 'grid';\n const nextDebouncedQ = nextQ.trim();\n\n setSearchInput((prev) => (prev === nextQ ? prev : nextQ));\n setDebouncedSearch((prev) => (prev === nextDebouncedQ ? prev : nextDebouncedQ));\n setStatusFilter((prev) => (prev === nextStatus ? prev : nextStatus));\n setViewMode((prev) => (prev === nextView ? prev : nextView));\n setChannelFilter((prev) => (prev === nextChannel ? prev : nextChannel));\n }\n\n useEffect(() => {\n const params = new URLSearchParams(searchParams);\n const nextQ = debouncedSearch.trim();\n if (nextQ) params.set('q', nextQ);\n else params.delete('q');\n if (statusFilter !== 'all') params.set('status', statusFilter);\n else params.delete('status');\n if (viewMode !== 'grid') params.set('view', viewMode);\n else params.delete('view');\n if (channelFilter) params.set('channel', channelFilter);\n else params.delete('channel');\n const next = params.toString();\n if (next !== searchParams.toString()) {\n setSearchParams(params, { replace: true });\n }\n }, [debouncedSearch, searchParams, setSearchParams, statusFilter, viewMode, channelFilter]);\n\n useEffect(() => {\n if (!hasToken) return;\n let cancelled = false;\n (async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await listSessions({\n limit: PAGE_LIMIT,\n offset: 0,\n ...(debouncedSearch ? { search: debouncedSearch } : {}),\n ...(statusFilter !== 'all' ? { status: statusFilter } : {}),\n ...(channelFilter ? { channel: channelFilter } : {}),\n });\n if (cancelled) return;\n setSessions(result.items);\n setHasMore(result.hasMore);\n } catch (e) {\n if (!cancelled) setError(e instanceof Error ? e.message : s.loadError);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [hasToken, debouncedSearch, statusFilter, s.loadError]);\n\n useEffect(() => {\n if (!hasToken) return;\n void getSessionStats()\n .then(setStats)\n .catch(() => {});\n }, [hasToken]);\n\n useEffect(() => {\n if (!hasToken) return;\n const onConfigReload = () => void mutateChatAgents();\n window.addEventListener('config-reload', onConfigReload);\n return () => window.removeEventListener('config-reload', onConfigReload);\n }, [hasToken, mutateChatAgents]);\n\n useEffect(() => {\n if (!hasToken) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<{ key?: string; name?: string }>).detail;\n if (!detail?.key || detail.name === undefined) return;\n setSessions((prev) =>\n prev.map((row) => (row.key === detail.key ? { ...row, name: detail.name } : row)),\n );\n setDetailSession((prev) =>\n prev && prev.key === detail.key ? { ...prev, name: detail.name } : prev,\n );\n };\n window.addEventListener('session-updated', handler);\n return () => {\n window.removeEventListener('session-updated', handler);\n };\n }, [hasToken]);\n\n const loadMore = useCallback(async () => {\n if (!hasToken || loading || !hasMore) return;\n setLoading(true);\n setError(null);\n try {\n const result = await listSessions({\n limit: PAGE_LIMIT,\n offset: sessions.length,\n ...(debouncedSearch ? { search: debouncedSearch } : {}),\n ...(statusFilter !== 'all' ? { status: statusFilter } : {}),\n ...(channelFilter ? { channel: channelFilter } : {}),\n });\n setSessions((prev) => [...prev, ...result.items]);\n setHasMore(result.hasMore);\n } catch (e) {\n setError(e instanceof Error ? e.message : s.loadError);\n } finally {\n setLoading(false);\n }\n }, [\n hasToken,\n loading,\n hasMore,\n sessions.length,\n debouncedSearch,\n statusFilter,\n channelFilter,\n s.loadError,\n ]);\n\n const updateSessionStatus = useCallback((key: string, status: SessionMetadata['status']) => {\n setSessions((prev) => prev.map((row) => (row.key === key ? { ...row, status } : row)));\n setDetailSession((prev) => (prev && prev.key === key ? { ...prev, status } : prev));\n }, []);\n\n const openDetail = useCallback(async (key: string) => {\n setDetailOpen(true);\n setDetailLoading(true);\n setDetailSession(null);\n try {\n const session = await getSessionDetail(key);\n setDetailSession(session);\n } catch {\n setDetailOpen(false);\n } finally {\n setDetailLoading(false);\n }\n }, []);\n\n const handleCardOpen = (key: string) => {\n void openDetail(key);\n };\n\n const handleCardAction = async (key: string, action: SessionCardAction) => {\n if (action === 'continue') {\n window.dispatchEvent(\n new CustomEvent('navigate-to-chat', { detail: { sessionKey: key }, bubbles: true }),\n );\n return;\n }\n if (action === 'delete') {\n setConfirmKey(key);\n setConfirmOpen(true);\n return;\n }\n try {\n switch (action) {\n case 'archive':\n await archiveSession(key);\n updateSessionStatus(key, 'archived');\n break;\n case 'unarchive':\n await unarchiveSession(key);\n updateSessionStatus(key, 'active');\n break;\n case 'pin':\n await pinSession(key);\n updateSessionStatus(key, 'pinned');\n break;\n case 'unpin':\n await unpinSession(key);\n updateSessionStatus(key, 'active');\n break;\n case 'export': {\n const content = await exportSessionJson(key);\n const blob = new Blob([content], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `session-${key.replace(/[^a-z0-9]/gi, '_')}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n break;\n }\n default:\n break;\n }\n void getSessionStats().then(setStats).catch(() => {});\n } catch {\n /* toast optional */\n }\n };\n\n const runDelete = async (key: string) => {\n try {\n await deleteSession(key);\n setSessions((prev) => prev.filter((row) => row.key !== key));\n setDetailSession((prev) => (prev?.key === key ? null : prev));\n if (detailSession?.key === key) setDetailOpen(false);\n void getSessionStats().then(setStats).catch(() => {});\n } catch {\n /* ignore */\n }\n };\n\n const cardLabels = {\n continueChat: s.continueChat,\n archive: s.archive,\n unarchive: s.unarchive,\n pin: s.pin,\n unpin: s.unpin,\n export: s.export,\n delete: s.delete,\n unnamedSession: m.chat.newSession,\n };\n\n const detailLabels = {\n close: s.close,\n detailLoading: s.detailLoading,\n detailMessages: s.detailMessages,\n detailExport: s.detailExport,\n archive: s.archive,\n unarchive: s.unarchive,\n pin: s.pin,\n unpin: s.unpin,\n delete: s.delete,\n unnamedSession: m.chat.newSession,\n };\n\n const filters: { key: StatusFilter; label: string; icon: typeof Layers }[] = [\n { key: 'all', label: s.filterAll, icon: Layers },\n { key: 'active', label: s.filterActive, icon: Circle },\n { key: 'pinned', label: s.filterPinned, icon: Pin },\n { key: 'archived', label: s.filterArchived, icon: Archive },\n ];\n\n const channelChips = (() => {\n const entries = Object.entries(stats?.byChannel ?? {}).sort((a, b) => b[1] - a[1]);\n const top = entries.slice(0, 6).map(([id]) => id);\n // Keep a few common channels visible even if no stats yet.\n for (const c of ['telegram', 'weixin', 'feishu']) {\n if (!top.includes(c)) top.push(c);\n }\n return top.slice(0, 8);\n })();\n\n if (!hasToken) {\n return (\n <div className=\"mx-auto w-full max-w-2xl px-4 py-16 text-center text-sm text-fg-muted sm:px-8 lg:max-w-app-main\">\n {s.needToken}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden bg-surface-panel\">\n <div className=\"mx-auto flex w-full min-w-0 max-w-2xl flex-col gap-4 px-4 py-6 sm:px-6 lg:max-w-app-main lg:px-8\">\n <header className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{s.title}</h1>\n <div className=\"flex w-full min-w-0 items-center gap-2 rounded-xl bg-surface-base px-3 py-2 transition-colors sm:max-w-md dark:bg-surface-hover/40\">\n <Search className=\"size-4 shrink-0 text-fg-disabled\" strokeWidth={1.75} aria-hidden />\n <input\n type=\"search\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder={s.searchPlaceholder}\n className=\"min-w-0 flex-1 border-0 bg-transparent text-sm text-fg placeholder:text-fg-disabled focus:outline-none focus:ring-0\"\n />\n </div>\n </header>\n\n <div className=\"flex flex-wrap gap-2\">\n {filters.map(({ key, label, icon: Icon }) => (\n <button\n key={key}\n type=\"button\"\n aria-pressed={statusFilter === key}\n onClick={() => setStatusFilter(key)}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-xl px-3 py-2 text-sm font-medium',\n interaction.transition,\n /* Filter chips (selection): no press scale. */\n interaction.focusRingPanel,\n statusFilter === key\n ? 'bg-accent-soft text-accent-fg'\n : 'bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35',\n )}\n >\n <Icon className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs font-medium text-fg-subtle\">{s.filterChannelLabel}</span>\n <button\n type=\"button\"\n aria-pressed={!channelFilter}\n onClick={() => setChannelFilter('')}\n className={cn(\n 'inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium',\n interaction.transition,\n interaction.focusRingPanel,\n !channelFilter\n ? 'bg-accent-soft text-accent-fg'\n : 'bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35',\n )}\n >\n {s.filterChannelAll}\n </button>\n {channelChips.map((chId) => (\n <button\n key={chId}\n type=\"button\"\n aria-pressed={channelFilter === chId}\n onClick={() => setChannelFilter(chId)}\n className={cn(\n 'inline-flex items-center rounded-xl px-3 py-2 text-sm font-medium',\n interaction.transition,\n interaction.focusRingPanel,\n channelFilter === chId\n ? 'bg-accent-soft text-accent-fg'\n : 'bg-surface-base text-fg-muted hover:bg-surface-hover hover:text-fg dark:bg-surface-hover/35',\n )}\n >\n {chId}\n {stats?.byChannel?.[chId] != null ? (\n <span className=\"ml-2 rounded-full bg-surface-hover px-2 py-0.5 text-[11px] text-fg-subtle\">\n {stats.byChannel[chId]}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n\n {stats ? (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n {[\n [stats.totalSessions, s.totalSessions],\n [stats.activeSessions, s.activeSessions],\n [stats.pinnedSessions, s.pinnedSessions],\n [stats.archivedSessions, s.archivedSessions],\n ].map(([value, label]) => (\n <div\n key={label}\n className=\"rounded-xl bg-surface-base p-3 dark:bg-surface-hover/30\"\n >\n <div className=\"text-lg font-semibold tabular-nums text-fg\">{value}</div>\n <div className=\"text-xs text-fg-muted\">{label}</div>\n </div>\n ))}\n </div>\n ) : null}\n\n {error ? (\n <div className=\"rounded-lg border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\">\n {error}\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs text-fg-muted\">{interpolate(s.sessionCount, { count: sessions.length })}</p>\n <div className={segmentedTrackClassName} role=\"group\" aria-label={s.layoutToggleGroup}>\n <Button\n type=\"button\"\n variant=\"segmented\"\n title={s.gridView}\n aria-pressed={viewMode === 'grid'}\n onClick={() => setViewMode('grid')}\n className={cn(\n segmentedThumbBaseClassName,\n 'size-7 p-0',\n viewMode === 'grid' && segmentedThumbActiveClassName,\n viewMode === 'grid' && 'text-accent-fg',\n )}\n >\n <LayoutGrid className=\"size-3.5\" strokeWidth={1.5} />\n </Button>\n <Button\n type=\"button\"\n variant=\"segmented\"\n title={s.listView}\n aria-pressed={viewMode === 'list'}\n onClick={() => setViewMode('list')}\n className={cn(\n segmentedThumbBaseClassName,\n 'size-9 p-0',\n viewMode === 'list' && segmentedThumbActiveClassName,\n viewMode === 'list' && 'text-accent-fg',\n )}\n >\n <LayoutList className=\"size-3.5\" strokeWidth={1.5} />\n </Button>\n </div>\n </div>\n\n {loading && sessions.length === 0 ? (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"h-40 animate-pulse rounded-xl bg-surface-hover/60 dark:bg-surface-hover/40\"\n />\n ))}\n </div>\n ) : sessions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-2xl bg-surface-base py-16 text-center dark:bg-surface-hover/25\">\n <FolderOpen className=\"mb-3 size-12 text-fg-disabled\" strokeWidth={1.25} aria-hidden />\n <p className=\"text-base font-semibold text-fg\">{s.noSessions}</p>\n <p className=\"mt-1 max-w-sm text-sm text-fg-muted\">{s.noSessionsDescription}</p>\n <Button\n variant=\"primary\"\n className=\"mt-6\"\n onClick={() => {\n window.dispatchEvent(new CustomEvent('navigate-to-chat', { detail: { sessionKey: '' }, bubbles: true }));\n }}\n >\n {s.startNewChat}\n </Button>\n </div>\n ) : (\n <>\n <div\n className={cn(\n 'grid min-w-0 gap-3',\n viewMode === 'grid' ? 'sm:grid-cols-2 lg:grid-cols-3' : 'grid-cols-1',\n )}\n >\n {sessions.map((session) => {\n const sessionAgentId = resolveSessionAgentId(session, defaultAgentId);\n return (\n <SessionCard\n key={session.key}\n session={session}\n variant={viewMode}\n labels={cardLabels}\n sessionAgentId={sessionAgentId}\n sessionAgentAvatar={agentAvatarFromOptions(sessionAgentId, agentItems)}\n onOpen={() => handleCardOpen(session.key)}\n onAction={(action) => void handleCardAction(session.key, action)}\n />\n );\n })}\n </div>\n {hasMore ? (\n <div className=\"flex justify-center pt-2\">\n <Button type=\"button\" variant=\"secondary\" disabled={loading} onClick={() => void loadMore()}>\n {s.loadMore}\n </Button>\n </div>\n ) : null}\n </>\n )}\n </div>\n\n <SessionDetailDrawer\n open={detailOpen}\n loading={detailLoading}\n session={detailSession}\n sessionAgentId={\n detailSession ? resolveSessionAgentId(detailSession, defaultAgentId) : undefined\n }\n sessionAgentAvatar={\n detailSession\n ? agentAvatarFromOptions(\n resolveSessionAgentId(detailSession, defaultAgentId),\n agentItems,\n )\n : undefined\n }\n labels={detailLabels}\n onClose={() => {\n setDetailOpen(false);\n setDetailSession(null);\n }}\n onArchive={() => detailSession && void handleCardAction(detailSession.key, 'archive')}\n onUnarchive={() => detailSession && void handleCardAction(detailSession.key, 'unarchive')}\n onPin={() => detailSession && void handleCardAction(detailSession.key, 'pin')}\n onUnpin={() => detailSession && void handleCardAction(detailSession.key, 'unpin')}\n onExport={() => detailSession && void handleCardAction(detailSession.key, 'export')}\n onDelete={() => detailSession && (setConfirmKey(detailSession.key), setConfirmOpen(true))}\n />\n\n <Dialog.Root open={confirmOpen} onOpenChange={setConfirmOpen}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n SETTINGS_SHELL_CONTENT_Z,\n )}\n >\n <Dialog.Title className=\"text-base font-semibold text-fg\">{s.deleteSessionTitle}</Dialog.Title>\n <p className=\"mt-2 text-sm text-fg-muted\">\n {confirmKey\n ? interpolate(s.deleteSessionMessage, {\n name:\n sessions.find((x) => x.key === confirmKey)?.name?.trim() || m.chat.newSession,\n })\n : ''}\n </p>\n <div className=\"mt-4 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={() => setConfirmOpen(false)}>\n {s.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"bg-red-600 hover:bg-red-700\"\n onClick={() => {\n if (confirmKey) void runDelete(confirmKey);\n setConfirmOpen(false);\n setConfirmKey(null);\n }}\n >\n {s.delete}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </div>\n );\n}\n"],"mappings":"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"}
|