pikiloom 0.4.1 → 0.4.2

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.
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionPanel-DA0t_SsO.js","assets/react-vendor-C7Sl8SE7.js","assets/index-DVC2D6tL.js","assets/router-DHISdpPk.js","assets/index-reSbuley.css","assets/Modal-3xOmKJdN.js","assets/Select-qO4y37hl.js","assets/DirBrowser-B37wiVrC.js","assets/markdown-DxQYQFeH.js","assets/ExtensionsTab-ChIV3Wmk.js"])))=>i.map(i=>d[i]);
2
- import{c as L,a as J,u as je,A as rs,s as sn,S as he,B as Xe,g as Yt,w as os,b as is,E as Vt,C as rn,d as as,e as ls,n as cs,f as yn,h as It,i as Ee,D as Wt,j as ds,k as Nn,_ as Sn,T as us,l as hs}from"./index-DVC2D6tL.js";import{j as e,r,a as on}from"./react-vendor-C7Sl8SE7.js";import{I as xs}from"./Select-qO4y37hl.js";import{M as _t,a as Pt}from"./Modal-3xOmKJdN.js";import{D as ps}from"./DirBrowser-B37wiVrC.js";import{n as fs,r as gs,M as an}from"./markdown-DxQYQFeH.js";import{WorkspaceExtensionsBody as ms}from"./ExtensionsTab-ChIV3Wmk.js";function bs({open:t,className:n}){return e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:L("shrink-0 text-fg-5/40 transition-transform duration-200",t&&"rotate-180",n),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})}function Ze({open:t,onToggle:n,dot:s,label:a,preview:l,badge:d,collapsedContent:x,children:c,className:m}){return e.jsxs("div",{className:L("rounded-md border border-edge bg-panel overflow-hidden","shadow-[0_2px_8px_rgba(0,0,0,0.06)]",m),children:[e.jsxs("button",{onClick:n,className:"w-full flex items-center gap-2.5 px-3.5 py-2.5 text-left hover:bg-panel-h/40 transition-colors",children:[s&&e.jsx("span",{className:L("h-[7px] w-[7px] shrink-0 rounded-full",s.color,s.pulse&&"animate-pulse")}),e.jsx("span",{className:"text-[10.5px] font-semibold uppercase tracking-[0.14em] text-fg-5",children:a}),e.jsx("span",{className:"flex-1 min-w-0 overflow-hidden",children:l}),d,e.jsx(bs,{open:t})]}),!t&&x,t&&c&&e.jsx("div",{className:"border-t border-edge",children:c})]})}const vs=5e3,js=15e3,At=8,Rt=30,ws=1,Je=new Map,ve=new Map,Gt=new Set,Cn=[];let Lt=0;function qt(t){return typeof t=="number"&&Number.isFinite(t)}function Oe(t,n,s,a){for(t.delete(n),t.set(n,s);t.size>a;){const l=t.keys().next().value;if(!l)break;t.delete(l)}}function En(t,n){const s=t.get(n);return!s?.value||s.expiresAt<=Date.now()?null:(Oe(t,n,s,t===ve?Rt:At),s.value)}function Ln(t){return{workdir:t.workdir,agent:t.agent,sessionId:t.sessionId,rich:t.rich??!0,lastNTurns:qt(t.lastNTurns)?t.lastNTurns:void 0,turnOffset:qt(t.turnOffset)?t.turnOffset:void 0,turnLimit:qt(t.turnLimit)?t.turnLimit:void 0}}function ln(t){const n=Ln(t);return[n.workdir,n.agent,n.sessionId,n.rich?"rich":"plain",n.lastNTurns??"",n.turnOffset??"",n.turnLimit??""].join("::")}function Mn(){for(;Lt<ws;){const t=Cn.shift();if(!t)return;Lt+=1,t().finally(()=>{Lt=Math.max(0,Lt-1),Mn()})}}async function ks(t,n={}){const s=t;if(!n.force){const d=En(Je,s);if(d)return d}const a=Je.get(s);if(a?.promise)return a.promise;const l=J.getWorkspaceSessions(t,n.request).then(d=>(Oe(Je,s,{value:d,expiresAt:d.ok?Date.now()+vs:0},At),d)).finally(()=>{const d=Je.get(s);d?.promise&&Oe(Je,s,{value:d.value,expiresAt:d.expiresAt},At)});return Oe(Je,s,{value:a?.value,expiresAt:a?.expiresAt??0,promise:l},At),l}function ys(t,n={}){const s=ln(t),a=ve.get(s);return a?.value?.ok&&(n.allowStale||a.expiresAt>Date.now())?a.value:null}async function Ns(t,n={}){const s=Ln(t),a=ln(s);if(!n.force){const x=En(ve,a);if(x?.ok)return x}const l=ve.get(a);if(l?.promise)return l.promise;const d=J.getSessionMessages(s.workdir,s.agent,s.sessionId,{rich:s.rich,lastNTurns:s.lastNTurns,turnOffset:s.turnOffset,turnLimit:s.turnLimit},n.request).then(x=>(Oe(ve,a,{value:x,expiresAt:x.ok?Date.now()+js:0},Rt),x)).finally(()=>{const x=ve.get(a);x?.promise&&Oe(ve,a,{value:x.value,expiresAt:x.expiresAt},Rt)});return Oe(ve,a,{value:l?.value,expiresAt:l?.expiresAt??0,promise:d},Rt),d}function Ss(t){const n=ln(t);ys(t)||Gt.has(n)||ve.get(n)?.promise||(Gt.add(n),Cn.push(async()=>{try{await Ns(t)}catch{}finally{Gt.delete(n)}}),Mn())}const mt=new Map,Zt=new Set;let De=null,Le=0,gn=!1,Ye=null,gt=500;const Cs=8e3;function Es(t){const n=mt.get(t.type);if(n)for(const s of n)s(t)}function Ls(){const t=window.location;return`${t.protocol==="https:"?"wss:":"ws:"}//${t.host}/ws`}function cn(){if(De)return;Tn();const t=new WebSocket(Ls());t.onopen=()=>{const n=gn;if(gn=!0,gt=500,n)for(const s of Zt)s()},t.onmessage=n=>{try{const s=JSON.parse(n.data);if(s.type==="pong")return;Es(s)}catch{}},t.onclose=()=>{De=null,Le>0&&Ts()},t.onerror=()=>{},De=t}function Ms(){Tn(),De&&(De.close(),De=null)}function Tn(){Ye&&(clearTimeout(Ye),Ye=null)}function Ts(){Ye||(Ye=setTimeout(()=>{Ye=null,Le>0&&cn()},gt),gt=Math.min(gt*2,Cs))}function Is(t,n){let s=mt.get(t);s||(s=new Set,mt.set(t,s)),s.add(n),Le++,Le===1&&cn()}function As(t,n){const s=mt.get(t);s&&(s.delete(n),s.size===0&&mt.delete(t)),Le=Math.max(0,Le-1),Le===0&&Ms()}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&Le>0&&!De&&(gt=500,cn())});function mn(t,n){const s=r.useRef(n);s.current=n,r.useEffect(()=>{if(!t)return;const a=l=>s.current(l);return Is(t,a),()=>As(t,a)},[t])}function Rs(t){const n=r.useRef(t);n.current=t,r.useEffect(()=>{const s=()=>n.current();return Zt.add(s),()=>{Zt.delete(s)}},[])}function Qr(t){const n=t.richMessages?.length?t.richMessages:t.messages?.map(x=>({role:x.role,text:x.text,blocks:[{type:"text",content:x.text}]}))||[],s=Ps(n),a=Math.max(t.window?.totalTurns??t.totalTurns??s.length,s.length),l=t.window?.endTurn??a,d=t.window?.startTurn??Math.max(0,l-s.length);return{turns:s,startTurn:d,endTurn:l,totalTurns:a,hasOlder:t.window?.hasOlder??d>0}}function Jr(t,n){const s=Math.max(0,t.startTurn-n.startTurn);return{turns:[...n.turns.slice(0,s),...t.turns],startTurn:n.startTurn,endTurn:t.endTurn,totalTurns:Math.max(t.totalTurns,n.totalTurns),hasOlder:n.hasOlder}}function Xr(t,n){if(n.startTurn<=t.startTurn)return n;const s=Math.max(0,n.startTurn-t.startTurn);return{turns:[...t.turns.slice(0,s),...n.turns],startTurn:t.startTurn,endTurn:n.endTurn,totalTurns:n.totalTurns,hasOlder:t.startTurn>0}}function _s(t,n){const s=[t.text,n.text].filter(Boolean);return{role:t.role,text:s.join(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionPanel-Db_qKFIc.js","assets/react-vendor-C7Sl8SE7.js","assets/index-DM13aQM5.js","assets/router-DHISdpPk.js","assets/index-reSbuley.css","assets/Modal-B4TzrtPG.js","assets/Select-BWsxUMM3.js","assets/DirBrowser-B8xym2Lr.js","assets/markdown-DxQYQFeH.js","assets/ExtensionsTab-Bio_t15D.js"])))=>i.map(i=>d[i]);
2
+ import{c as L,a as J,u as je,A as rs,s as sn,S as he,B as Xe,g as Yt,w as os,b as is,E as Vt,C as rn,d as as,e as ls,n as cs,f as yn,h as It,i as Ee,D as Wt,j as ds,k as Nn,_ as Sn,T as us,l as hs}from"./index-DM13aQM5.js";import{j as e,r,a as on}from"./react-vendor-C7Sl8SE7.js";import{I as xs}from"./Select-BWsxUMM3.js";import{M as _t,a as Pt}from"./Modal-B4TzrtPG.js";import{D as ps}from"./DirBrowser-B8xym2Lr.js";import{n as fs,r as gs,M as an}from"./markdown-DxQYQFeH.js";import{WorkspaceExtensionsBody as ms}from"./ExtensionsTab-Bio_t15D.js";function bs({open:t,className:n}){return e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:L("shrink-0 text-fg-5/40 transition-transform duration-200",t&&"rotate-180",n),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})}function Ze({open:t,onToggle:n,dot:s,label:a,preview:l,badge:d,collapsedContent:x,children:c,className:m}){return e.jsxs("div",{className:L("rounded-md border border-edge bg-panel overflow-hidden","shadow-[0_2px_8px_rgba(0,0,0,0.06)]",m),children:[e.jsxs("button",{onClick:n,className:"w-full flex items-center gap-2.5 px-3.5 py-2.5 text-left hover:bg-panel-h/40 transition-colors",children:[s&&e.jsx("span",{className:L("h-[7px] w-[7px] shrink-0 rounded-full",s.color,s.pulse&&"animate-pulse")}),e.jsx("span",{className:"text-[10.5px] font-semibold uppercase tracking-[0.14em] text-fg-5",children:a}),e.jsx("span",{className:"flex-1 min-w-0 overflow-hidden",children:l}),d,e.jsx(bs,{open:t})]}),!t&&x,t&&c&&e.jsx("div",{className:"border-t border-edge",children:c})]})}const vs=5e3,js=15e3,At=8,Rt=30,ws=1,Je=new Map,ve=new Map,Gt=new Set,Cn=[];let Lt=0;function qt(t){return typeof t=="number"&&Number.isFinite(t)}function Oe(t,n,s,a){for(t.delete(n),t.set(n,s);t.size>a;){const l=t.keys().next().value;if(!l)break;t.delete(l)}}function En(t,n){const s=t.get(n);return!s?.value||s.expiresAt<=Date.now()?null:(Oe(t,n,s,t===ve?Rt:At),s.value)}function Ln(t){return{workdir:t.workdir,agent:t.agent,sessionId:t.sessionId,rich:t.rich??!0,lastNTurns:qt(t.lastNTurns)?t.lastNTurns:void 0,turnOffset:qt(t.turnOffset)?t.turnOffset:void 0,turnLimit:qt(t.turnLimit)?t.turnLimit:void 0}}function ln(t){const n=Ln(t);return[n.workdir,n.agent,n.sessionId,n.rich?"rich":"plain",n.lastNTurns??"",n.turnOffset??"",n.turnLimit??""].join("::")}function Mn(){for(;Lt<ws;){const t=Cn.shift();if(!t)return;Lt+=1,t().finally(()=>{Lt=Math.max(0,Lt-1),Mn()})}}async function ks(t,n={}){const s=t;if(!n.force){const d=En(Je,s);if(d)return d}const a=Je.get(s);if(a?.promise)return a.promise;const l=J.getWorkspaceSessions(t,n.request).then(d=>(Oe(Je,s,{value:d,expiresAt:d.ok?Date.now()+vs:0},At),d)).finally(()=>{const d=Je.get(s);d?.promise&&Oe(Je,s,{value:d.value,expiresAt:d.expiresAt},At)});return Oe(Je,s,{value:a?.value,expiresAt:a?.expiresAt??0,promise:l},At),l}function ys(t,n={}){const s=ln(t),a=ve.get(s);return a?.value?.ok&&(n.allowStale||a.expiresAt>Date.now())?a.value:null}async function Ns(t,n={}){const s=Ln(t),a=ln(s);if(!n.force){const x=En(ve,a);if(x?.ok)return x}const l=ve.get(a);if(l?.promise)return l.promise;const d=J.getSessionMessages(s.workdir,s.agent,s.sessionId,{rich:s.rich,lastNTurns:s.lastNTurns,turnOffset:s.turnOffset,turnLimit:s.turnLimit},n.request).then(x=>(Oe(ve,a,{value:x,expiresAt:x.ok?Date.now()+js:0},Rt),x)).finally(()=>{const x=ve.get(a);x?.promise&&Oe(ve,a,{value:x.value,expiresAt:x.expiresAt},Rt)});return Oe(ve,a,{value:l?.value,expiresAt:l?.expiresAt??0,promise:d},Rt),d}function Ss(t){const n=ln(t);ys(t)||Gt.has(n)||ve.get(n)?.promise||(Gt.add(n),Cn.push(async()=>{try{await Ns(t)}catch{}finally{Gt.delete(n)}}),Mn())}const mt=new Map,Zt=new Set;let De=null,Le=0,gn=!1,Ye=null,gt=500;const Cs=8e3;function Es(t){const n=mt.get(t.type);if(n)for(const s of n)s(t)}function Ls(){const t=window.location;return`${t.protocol==="https:"?"wss:":"ws:"}//${t.host}/ws`}function cn(){if(De)return;Tn();const t=new WebSocket(Ls());t.onopen=()=>{const n=gn;if(gn=!0,gt=500,n)for(const s of Zt)s()},t.onmessage=n=>{try{const s=JSON.parse(n.data);if(s.type==="pong")return;Es(s)}catch{}},t.onclose=()=>{De=null,Le>0&&Ts()},t.onerror=()=>{},De=t}function Ms(){Tn(),De&&(De.close(),De=null)}function Tn(){Ye&&(clearTimeout(Ye),Ye=null)}function Ts(){Ye||(Ye=setTimeout(()=>{Ye=null,Le>0&&cn()},gt),gt=Math.min(gt*2,Cs))}function Is(t,n){let s=mt.get(t);s||(s=new Set,mt.set(t,s)),s.add(n),Le++,Le===1&&cn()}function As(t,n){const s=mt.get(t);s&&(s.delete(n),s.size===0&&mt.delete(t)),Le=Math.max(0,Le-1),Le===0&&Ms()}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&Le>0&&!De&&(gt=500,cn())});function mn(t,n){const s=r.useRef(n);s.current=n,r.useEffect(()=>{if(!t)return;const a=l=>s.current(l);return Is(t,a),()=>As(t,a)},[t])}function Rs(t){const n=r.useRef(t);n.current=t,r.useEffect(()=>{const s=()=>n.current();return Zt.add(s),()=>{Zt.delete(s)}},[])}function Qr(t){const n=t.richMessages?.length?t.richMessages:t.messages?.map(x=>({role:x.role,text:x.text,blocks:[{type:"text",content:x.text}]}))||[],s=Ps(n),a=Math.max(t.window?.totalTurns??t.totalTurns??s.length,s.length),l=t.window?.endTurn??a,d=t.window?.startTurn??Math.max(0,l-s.length);return{turns:s,startTurn:d,endTurn:l,totalTurns:a,hasOlder:t.window?.hasOlder??d>0}}function Jr(t,n){const s=Math.max(0,t.startTurn-n.startTurn);return{turns:[...n.turns.slice(0,s),...t.turns],startTurn:n.startTurn,endTurn:t.endTurn,totalTurns:Math.max(t.totalTurns,n.totalTurns),hasOlder:n.hasOlder}}function Xr(t,n){if(n.startTurn<=t.startTurn)return n;const s=Math.max(0,n.startTurn-t.startTurn);return{turns:[...t.turns.slice(0,s),...n.turns],startTurn:t.startTurn,endTurn:n.endTurn,totalTurns:n.totalTurns,hasOlder:t.startTurn>0}}function _s(t,n){const s=[t.text,n.text].filter(Boolean);return{role:t.role,text:s.join(`
3
3
 
4
4
  `),blocks:[...t.blocks,...n.blocks],usage:n.usage??t.usage??null}}function Ps(t){const n=[];let s={user:null,assistant:null};for(const a of t)if(a.role==="user"){if(s.assistant&&In(a.text))continue;(s.user||s.assistant)&&(n.push(s),s={user:null,assistant:null}),s.user=a}else s.assistant?s.assistant=_s(s.assistant,a):s.assistant=a;return(s.user||s.assistant)&&n.push(s),n}const Ws=new Set(["task-notification","system-reminder","persisted-output","local-command-stdout","local-command-caveat","local-command-stderr","ide_opened_file","ide_diagnostics","ide_selection","event","analysis","case_id","tool-use-id","output-file"]),Bs=["continued from a previous","summary below covers","earlier portion of the conversation","Summary:","Key Technical Concepts"];function In(t){const s=t.trim().match(/^<([a-z][a-z0-9_-]*)\b/i);return s&&Ws.has(s[1].toLowerCase())?!0:Bs.some(a=>t.includes(a))}function An(t,n){const s=t.split(`
5
5
  `).filter(a=>a.trim());return s.length<=n?s.join(`
@@ -19,5 +19,5 @@ import{c as L,a as J,u as je,A as rs,s as sn,S as he,B as Xe,g as Yt,w as os,b a
19
19
  `),[d,x]=r.useState(null);return!l.trim()&&a.length===0?null:e.jsxs(e.Fragment,{children:[l.trim()&&e.jsx("div",{className:"session-md text-[13.5px] leading-[1.75] text-fg-2",children:e.jsx(an,{remarkPlugins:dn,components:un,children:l})}),a.length>0&&e.jsx("div",{className:"flex flex-wrap gap-3 mt-2",children:a.map((c,m)=>e.jsx(dr,{block:c,onLightbox:x,t:n},m))}),d&&e.jsx($n,{src:d,onClose:()=>x(null)})]})}const eo=r.memo(function({turn:n,turnIndex:s,agent:a,meta:l,model:d,effort:x,providerName:c,t:m,onResend:v,onEdit:g,onFork:j}){const E=n.user&&In(n.user.text),k=j&&typeof s=="number"?()=>j(s):void 0,N=!!n.assistant&&rr(n.assistant);return e.jsxs("div",{className:"session-turn",children:[n.user&&!E&&e.jsx(On,{text:n.user.text,blocks:n.user.blocks,t:m,onResend:v,onEdit:g,onFork:k}),E&&n.user&&!n.assistant&&e.jsx("div",{className:"mb-4 px-4 py-3 rounded-lg bg-[rgba(255,255,255,0.02)] border border-edge/20 text-[12.5px] leading-[1.7] text-fg-4",children:e.jsx(an,{remarkPlugins:dn,components:un,children:n.user.text})}),N&&e.jsxs(e.Fragment,{children:[e.jsx(fr,{agent:a,meta:l,model:d,effort:x,providerName:c,previewMeta:n.assistant.usage??null}),e.jsx("div",{className:"mb-6",children:e.jsx(sr,{message:n.assistant,t:m})})]})]})});function $n({src:t,onClose:n}){return r.useEffect(()=>{const s=a=>{a.key==="Escape"&&n()};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[n]),on.createPortal(e.jsx("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/80 backdrop-blur-sm cursor-zoom-out",onClick:n,children:e.jsx("img",{src:t,className:"max-w-[90vw] max-h-[90vh] object-contain rounded-lg shadow-2xl",onClick:s=>s.stopPropagation()})}),document.body)}const hr=1500,xr=16,jn=8;function pr(t){const n=t.split(`
20
20
  `);return n.length<=jn?t:n.slice(0,jn).join(`
21
21
  `)}function On({text:t,blocks:n,t:s,onResend:a,onEdit:l,onFork:d}){const[x,c]=r.useState(!1),[m,v]=r.useState(!1),[g,j]=r.useState(null),E=t?t.split(`
22
- `).length:0,k=!!t&&(t.length>hr||E>xr),[N,M]=r.useState(!1),A=t?k&&!N?pr(t):t:"",B=!!(a||l||d),O=n?.filter(I=>I.type==="image")||[],H=()=>{navigator.clipboard.writeText(t).then(()=>{v(!0),setTimeout(()=>v(!1),1500)}).catch(()=>{})},_=s("hub.expand").replace("{chars}",t?t.length.toLocaleString():"0").replace("{lines}",String(E));return e.jsxs("div",{className:"flex flex-col items-end mb-5 group/bubble",onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),children:[e.jsxs("div",{className:"max-w-[72%] rounded-md border border-fg-6 bg-panel px-4 py-3 text-[13.5px] leading-[1.72] text-fg shadow-sm",children:[t&&e.jsxs("div",{className:"whitespace-pre-wrap break-words",children:[A,k&&!N&&e.jsx("span",{className:"text-fg-5/60",children:"…"})]}),k&&e.jsx("button",{type:"button",onClick:()=>M(I=>!I),className:"mt-2 text-[11.5px] text-fg-4 hover:text-fg-2 underline decoration-fg-5/40 underline-offset-2 transition-colors",children:N?s("hub.collapse"):_}),O.length>0&&e.jsx("div",{className:L("flex flex-wrap gap-2",t&&"mt-2"),children:O.map((I,D)=>e.jsx("img",{src:I.content,className:"max-w-[280px] max-h-[200px] rounded border border-fg-6/50 object-cover cursor-zoom-in hover:opacity-90 transition-opacity",onClick:()=>j(I.content)},D))})]}),g&&e.jsx($n,{src:g,onClose:()=>j(null)}),B&&e.jsxs("div",{className:L("flex items-center gap-1 mt-1.5 mr-1 transition-all duration-200",x?"opacity-100 translate-y-0":"opacity-0 -translate-y-1 pointer-events-none"),children:[e.jsx(Mt,{label:s(m?"hub.copied":"hub.copy"),onClick:H,children:m?e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"#34d399",strokeWidth:"2",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}):e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2"}),e.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})}),a&&e.jsx(Mt,{label:s("hub.rerun"),onClick:()=>a(t),children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})}),l&&e.jsx(Mt,{label:s("hub.edit"),onClick:()=>l(t),children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),e.jsx("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})]})}),d&&e.jsx(Mt,{label:s("hub.fork"),onClick:d,children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("circle",{cx:"6",cy:"6",r:"2"}),e.jsx("circle",{cx:"18",cy:"6",r:"2"}),e.jsx("circle",{cx:"12",cy:"20",r:"2"}),e.jsx("path",{d:"M6 8v3a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3V8"}),e.jsx("path",{d:"M12 14v4"})]})})]})]})}function Mt({label:t,onClick:n,children:s}){return e.jsx("button",{onClick:n,title:t,className:"flex items-center justify-center w-7 h-7 rounded border border-fg-6 bg-panel text-fg-4 shadow-sm hover:text-fg-2 hover:border-edge-h hover:bg-panel-h transition-colors",children:s})}function fr({agent:t,meta:n,model:s,effort:a,providerName:l,previewMeta:d,liveStartedAt:x}){const c=d?.contextPercent??null,m=d?.contextUsedTokens??0,v=d?.turnOutputTokens??0,g=c!=null||m>0||v>0,j=x!=null&&x>0,E=d?.providerName??l??null;return e.jsxs("div",{className:"flex items-center gap-1.5 mt-1 mb-3",children:[e.jsx(Xe,{brand:t,size:13}),e.jsx("span",{style:{color:n.color},className:"text-[12px] font-semibold opacity-70",children:n.label}),(s||a)&&e.jsxs("span",{className:"text-[10px] font-mono text-fg-5/50",children:[s||"",s&&a?" · ":"",a||""]}),E&&e.jsxs("span",{className:"text-[10px] font-mono text-fg-5/70 px-1.5 py-px rounded bg-fg-5/8",title:`This turn is routed through ${E} (BYOK), not the agent CLI's native auth.`,children:["via ",E]}),(g||j)&&e.jsxs("span",{className:"ml-auto inline-flex items-center gap-1 text-[10px] font-mono text-fg-5/55",title:vr(d),children:[c!=null&&e.jsx(jr,{pct:c}),e.jsx("span",{children:c!=null?`${c.toFixed(1)}%`:""}),m>0&&e.jsxs("span",{className:"text-fg-5/40",children:["· ",br(m)]}),v>0&&e.jsxs("span",{className:"text-fg-5/40",children:["· ↑",Dn(v)]}),j&&e.jsx(gr,{startedAt:x,leadingDot:g})]})]})}function gr({startedAt:t,leadingDot:n}){const[,s]=r.useState(0);r.useEffect(()=>{const l=setInterval(()=>s(d=>d+1),1e3);return()=>clearInterval(l)},[]);const a=Math.max(0,Date.now()-t);return e.jsxs("span",{className:"text-fg-5/55 tabular-nums",title:"Elapsed time of the running turn",children:[n?"· ":"",mr(a)]})}function mr(t){const n=Math.floor(t/1e3);if(n<60)return`${n}s`;const s=Math.floor(n/60),a=n%60;return s<60?`${s}m${a.toString().padStart(2,"0")}s`:`${Math.floor(s/60)}h${(s%60).toString().padStart(2,"0")}m`}function br(t){return`${Dn(t)} tok`}function Dn(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}function vr(t){if(!t)return"";const n=[];return t.contextPercent!=null&&n.push(`Context: ${t.contextPercent.toFixed(1)}%`),t.inputTokens!=null&&n.push(`Input: ${t.inputTokens.toLocaleString()}`),t.turnOutputTokens!=null?n.push(`Output (turn): ${t.turnOutputTokens.toLocaleString()}`):t.outputTokens!=null&&n.push(`Output: ${t.outputTokens.toLocaleString()}`),t.cachedInputTokens!=null&&n.push(`Cached: ${t.cachedInputTokens.toLocaleString()}`),n.join(" · ")}function jr({pct:t}){const n=t>=85?"bg-rose-400/70":t>=60?"bg-amber-400/70":"bg-emerald-400/70";return e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${n}`})}function wn(t,n,s){return t==="zh-CN"?n:s}function wr({open:t,onClose:n,workdir:s}){const a=je(d=>d.locale),l=s.split("/").pop()||s;return e.jsxs(_t,{open:t,onClose:n,wide:!0,children:[e.jsx(Pt,{title:wn(a,`${l} — 项目扩展`,`${l} — Project Extensions`),description:wn(a,"仅对当前工作区生效。直接操作项目目录中的 .mcp.json 与 .pikiloom/skills/。","Project-scoped only. Operates directly on .mcp.json and .pikiloom/skills/ in the workspace directory."),onClose:n}),t?e.jsx(ms,{workdir:s}):null]})}let kn=Sn(()=>import("./SessionPanel-DA0t_SsO.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]));function tn(){return kn??=Sn(()=>import("./SessionPanel-DA0t_SsO.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),kn}const kr=r.lazy(async()=>({default:(await tn()).SessionPanel})),Xt=5,yr=240,Nr=120,Sr=12,Cr=900*1e3,F=(t,n)=>`${t}:${n}`;function Er(t){const n=new Map;for(const c of t)n.set(F(c.agent||"",c.sessionId),c);const s=new Map,a=new Set;for(const c of t){const m=c.migratedFrom;if(!m||m.kind!=="fork"||!m.sessionId)continue;const v=F(m.agent||c.agent||"",m.sessionId);n.has(v)&&(a.add(F(c.agent||"",c.sessionId)),s.has(v)||s.set(v,[]),s.get(v).push(c))}const l=[],d=new Set,x=(c,m)=>{const v=F(c.agent||"",c.sessionId);if(d.has(v))return;d.add(v),l.push(Object.assign({},c,{__forkDepth:m}));const g=s.get(v);if(g)for(const j of g)x(j,m+1)};for(const c of t){const m=F(c.agent||"",c.sessionId);a.has(m)||x(c,0)}for(const c of t)x(c,0);return l}let Lr=0;function Tt(){return`mk-${Date.now().toString(36)}-${(++Lr).toString(36)}`}function Mr(t){return t==="vscode"||t==="cursor"||t==="windsurf"||t==="finder"||t==="default"}function Tr(t,n){const s=String(t||"").toLowerCase();return s.includes("cursor")?"cursor":s.includes("windsurf")?"windsurf":s.includes("code")||n==="darwin"?"vscode":"default"}function Fn(t){switch(t){case"cursor":return"hub.openTargetCursor";case"windsurf":return"hub.openTargetWindsurf";case"finder":return"hub.openTargetFinder";case"default":return"hub.openTargetDefault";default:return"hub.openTargetVsCode"}}const Ir=r.memo(function({active:n=!0}){const s=je(o=>o.locale),a=je(o=>o.state?.runtimeWorkdir??null),l=r.useMemo(()=>as(s),[s]),[d,x]=r.useState([]),[c,m]=r.useState({}),[v,g]=r.useState({}),[j,E]=r.useState(!0),[k,N]=r.useState(()=>{try{const u=sessionStorage.getItem("pikiloom-layout-mode");if(u==="1"||u==="2"||u==="3"||u==="6")return Number(u)}catch{}const o=window.innerWidth;return o>=1920?3:o>=1280?2:1}),[M,A]=r.useState(()=>{try{const o=sessionStorage.getItem("pikiloom-open-sessions");if(o){const u=JSON.parse(o);if(Array.isArray(u))return u.map(h=>({...h,mountKey:h.mountKey||Tt()}))}}catch{}return[]}),[B,O]=r.useState(()=>{try{const o=sessionStorage.getItem("pikiloom-active-slot");if(o!=null){const u=Number(o);if(Number.isFinite(u)&&u>=0)return u}}catch{}return 0}),H=r.useCallback(o=>{N(o);try{sessionStorage.setItem("pikiloom-layout-mode",String(o))}catch{}},[]),_=r.useCallback(o=>{A(u=>{const h=typeof o=="function"?o(u):o;try{const f=h.map(({pendingPrompt:w,pendingImageUrls:y,...C})=>C);sessionStorage.setItem("pikiloom-open-sessions",JSON.stringify(f))}catch{}return h})},[]),I=r.useCallback(o=>{O(u=>{const h=typeof o=="function"?o(u):o;try{sessionStorage.setItem("pikiloom-active-slot",String(h))}catch{}return h})},[]);r.useEffect(()=>{_(o=>o.length>k?o.slice(0,k):o),I(o=>o>=k?k-1:o)},[k]);const[D,K]=r.useState(!1),ae=r.useRef(k);ae.current=k;const Z=r.useRef(B);Z.current=B;const T=r.useRef(-1),V=M[B]??null,Me=r.useCallback(o=>{if(!o){_([]),I(0);return}const u=o.mountKey?o:{...o,mountKey:Tt()};_(h=>{const f=h.findIndex(y=>y.agent===u.agent&&y.sessionId===u.sessionId);if(f>=0)return I(f),h;if(h.length<ae.current){const y=[...h,u];return I(y.length-1),y}const w=[...h];return w[Z.current]=u,w})},[]),[ce,we]=r.useState(!1),[$,Fe]=r.useState(null),[Te,tt]=r.useState(""),[ke,bt]=r.useState("all"),[de,vt]=r.useState({}),ee=r.useDeferredValue(Te),te=r.useRef(!1),Ue=r.useRef({}),Ie=r.useRef(c);Ie.current=c;const ze=r.useRef(de);ze.current=de;const nt=r.useRef(new Set),ne=r.useRef({});r.useEffect(()=>()=>{for(const o of Object.values(ne.current))clearTimeout(o)},[]);const le=r.useCallback(async()=>{try{const o=await J.getWorkspaces(),u=o.ok?o.workspaces:[];u.length&&x(h=>h.length===u.length&&h.every((f,w)=>f.path===u[w].path&&f.name===u[w].name)?h:u),te.current=!0}catch{te.current=!0}finally{E(!1)}},[]);r.useEffect(()=>{le()},[le]);const P=r.useCallback(async(o,u={})=>{if(!Ue.current[o]){Ue.current[o]=!0,u.background||g(h=>({...h,[o]:!0}));try{const h=await ks(o,{force:u.force});r.startTransition(()=>{m(f=>{const w=h.sessions||[],y=f[o]||[],C=new Set(w.map(z=>F(z.agent||"",z.sessionId))),U=y.filter(z=>{if(z.runState!=="running")return!1;const ie=F(z.agent||"",z.sessionId);if(C.has(ie))return!1;const dt=ze.current[ie];return!(dt?.resolvedKey&&dt.resolvedKey!==ie)});return{...f,[o]:U.length?[...U,...w]:w}})})}catch{u.background||r.startTransition(()=>{m(h=>({...h,[o]:[]}))})}finally{Ue.current[o]=!1,u.background||g(h=>({...h,[o]:!1}))}}},[]),ye=r.useRef(a);r.useEffect(()=>{a!==ye.current&&(ye.current=a,!(!a||!te.current)&&le().then(()=>{P(a,{force:!0})}))},[a,le,P]);const X=r.useCallback((o,u)=>{const h=o.agent||"";!h||!o.sessionId||(tn(),Ss({workdir:u,agent:h,sessionId:o.sessionId,rich:!0,turnOffset:0,turnLimit:Sr}))},[]),Ae=r.useCallback((o,u,h=Nr)=>{const f=`${u}:${F(o.agent||"",o.sessionId)}`,w=ne.current[f];w&&clearTimeout(w),ne.current[f]=setTimeout(()=>{delete ne.current[f],X(o,u)},h)},[X]),Re=r.useCallback((o,u)=>{const h=`${u}:${F(o.agent||"",o.sessionId)}`,f=ne.current[h];f&&(clearTimeout(f),delete ne.current[h])},[]);r.useEffect(()=>{n&&tn()},[n]),r.useEffect(()=>{if(!n)return;const o=[];return d.forEach((u,h)=>{if(c[u.path]||v[u.path])return;const f=setTimeout(()=>{P(u.path)},h*90);o.push(f)}),()=>{for(const u of o)clearTimeout(u)}},[n,P,v,c,d]);const jt=r.useRef(new Map);mn(n&&te.current&&d.length>0?"sessions-changed":null,r.useCallback(o=>{if(typeof document<"u"&&document.visibilityState==="hidden")return;const u=o.key,h=u?d.filter(y=>(Ie.current[y.path]||[]).some(C=>F(C.agent||"",C.sessionId)===u)):d,f=h.length?h:d,w=jt.current;for(const y of f)w.has(y.path)&&clearTimeout(w.get(y.path)),w.set(y.path,setTimeout(()=>{w.delete(y.path),P(y.path,{background:!0,force:!0})},300))},[d,P]));const W=r.useCallback(o=>{const u=o.agent||"";return!u||!o.sessionId?o:ls(o,de[F(u,o.sessionId)]||null)},[de]);mn("stream-update",r.useCallback(o=>{const u=o.key;u&&vt(h=>{const f={},w=Date.now()-Cr;for(const[C,U]of Object.entries(h))U.updatedAt>=w&&(f[C]=U);const y=cs(u,o.snapshot??null);if(!y){const C=f[u];return C&&C.phase!=="done"&&(f[u]={...C,phase:"done",updatedAt:Date.now()}),f}return f[u]=y,y.resolvedKey!==u&&(f[y.resolvedKey]={...y,key:y.resolvedKey}),f})},[])),Rs(r.useCallback(()=>{if(!(!n||!te.current||d.length===0))for(const o of d)P(o.path,{background:!0,force:!0})},[n,d,P])),r.useEffect(()=>{if(!n||!te.current||d.length===0)return;const o=()=>{if(!(typeof document<"u"&&document.visibilityState==="hidden"))for(const h of d)P(h.path,{background:!0,force:!0})};if(o(),typeof document>"u"||typeof window>"u")return;const u=()=>{document.visibilityState==="visible"&&o()};return document.addEventListener("visibilitychange",u),window.addEventListener("focus",u),()=>{document.removeEventListener("visibilitychange",u),window.removeEventListener("focus",u)}},[n,P,d]),r.useEffect(()=>{if(!n)return;const o=[];return d.forEach((u,h)=>{const f=(c[u.path]||[])[0];if(!f)return;const w=`${u.path}:${F(f.agent||"",f.sessionId)}`;if(nt.current.has(w))return;const y=setTimeout(()=>{nt.current.add(w),X(f,u.path)},yr+h*120);o.push(y)}),()=>{for(const u of o)clearTimeout(u)}},[n,c,X,d]);const se=r.useCallback(async o=>{try{(await J.addWorkspace(o)).ok&&(we(!1),await le(),P(o))}catch{}},[le,P]),[xe,Ne]=r.useState(null),[re,_e]=r.useState(!1),[st,wt]=r.useState(null),He=r.useCallback(o=>{Ne(o)},[]),rt=r.useCallback(async()=>{const o=xe;if(o){_e(!0);try{await J.removeWorkspace(o),x(u=>u.filter(h=>h.path!==o)),m(u=>{const h={...u};return delete h[o],h}),_(u=>u.filter(h=>h.workdir!==o)),I(0),Ne(null)}catch{}finally{_e(!1)}}},[xe]),ot=r.useCallback(o=>{P(o,{force:!0})},[P]),[Se,G]=r.useState(null),[pe,Ce]=r.useState(!1),[oe,Pe]=r.useState(!1),We=je(o=>o.toast),[ue,it]=r.useState(null),at=r.useCallback((o,u,h)=>{it({anchor:{right:o.right,bottom:o.bottom},target:{workdir:h,agent:u.agent||"",sessionId:u.sessionId,title:yn(u).slice(0,120)||u.sessionId.slice(0,16)}})},[]);r.useEffect(()=>{if(!ue)return;const o=()=>it(null),u=h=>{h.key==="Escape"&&o()};return window.addEventListener("mousedown",o),window.addEventListener("scroll",o,!0),window.addEventListener("resize",o),window.addEventListener("keydown",u),()=>{window.removeEventListener("mousedown",o),window.removeEventListener("scroll",o,!0),window.removeEventListener("resize",o),window.removeEventListener("keydown",u)}},[ue]);const Bt=r.useCallback(o=>{Ce(!1),G(o),it(null)},[]),kt=r.useCallback(async()=>{const o=Se;if(o){Pe(!0);try{const u=await J.deleteSession(o.workdir,o.agent,o.sessionId,pe);if(!u.ok){const h=u.error?.includes("still running")?l("session.deleteRunningError"):u.error||l("session.deleteFailed");We(h,!1);return}m(h=>{const f=h[o.workdir];if(!f)return h;const w=f.filter(y=>!(y.agent===o.agent&&y.sessionId===o.sessionId));return w.length===f.length?h:{...h,[o.workdir]:w}}),_(h=>h.filter(f=>!(f.workdir===o.workdir&&f.agent===o.agent&&f.sessionId===o.sessionId))),G(null)}catch(u){We(u?.message||l("session.deleteFailed"),!1)}finally{Pe(!1)}}},[Se,pe,l,We]),$t=r.useCallback(o=>{_(u=>{let h=!1;const f=u.map(w=>w.mountKey===o&&(w.pendingPrompt!=null||w.pendingImageUrls)?(h=!0,{...w,pendingPrompt:null,pendingImageUrls:void 0}):w);return h?f:u})},[_]),lt=r.useCallback((o,u,h)=>{X({agent:o.agent,sessionId:o.sessionId,runState:"running"},o.workdir),m(y=>{const C=y[o.workdir]||[];if(C.some(ie=>ie.sessionId===o.sessionId&&ie.agent===o.agent))return y;const z={sessionId:o.sessionId,agent:o.agent,runState:"running",lastQuestion:u,createdAt:new Date().toISOString(),runUpdatedAt:new Date().toISOString()};return{...y,[o.workdir]:[z,...C]}});const f=T.current,w={...o,mountKey:Tt(),pendingPrompt:u||null,pendingImageUrls:h&&h.length?h:void 0};r.startTransition(()=>{Fe(null),_(y=>{if(f>=y.length)return[...y,w];const C=[...y];return C[f]=w,C}),I(f>=0?f:0)}),P(o.workdir,{background:!0,force:!0})},[P,X,_,I]),Be=r.useCallback((o,u)=>{X(o,u),Fe(null),r.startTransition(()=>{Me({agent:o.agent||"",sessionId:o.sessionId,workdir:u})})},[X]),Ke=r.useCallback((o,u)=>{X({agent:o.agent,sessionId:o.sessionId,runState:"running"},o.workdir),r.startTransition(()=>{u!=null?(_(h=>{if(u>=h.length)return h;const f=[...h];return f[u]={...h[u],agent:o.agent,sessionId:o.sessionId,workdir:o.workdir},f}),I(u)):Me({...o,mountKey:Tt()})}),P(o.workdir,{background:!0,force:!0})},[P,X]),Ve=r.useCallback(o=>{let u=o;if(ke==="running"?u=u.filter(h=>It(h)==="running"):ke==="review"&&(u=u.filter(h=>It(h)==="incomplete")),ee.trim()){const h=ee.toLowerCase();u=u.filter(f=>(f.lastMessageText||"").toLowerCase().includes(h)||(f.lastQuestion||"").toLowerCase().includes(h)||(f.lastAnswer||"").toLowerCase().includes(h)||(f.title||"").toLowerCase().includes(h)||(f.agent||"").toLowerCase().includes(h))}return u},[ee,ke]),fe=r.useMemo(()=>{const o={};for(const u of d){const h=(c[u.path]||[]).map(W),f=new Map;for(const y of h){const C=F(y.agent||"",y.sessionId),U=de[C],z=U?.resolvedKey&&U.resolvedKey!==C?U.resolvedKey:C,ie=f.get(z);if(!ie){f.set(z,y);continue}F(ie.agent||"",ie.sessionId)!==z&&C===z&&f.set(z,y)}const w=Ve([...f.values()]);o[u.path]=Er(w)}return o},[d,c,de,Ve,W]),yt=r.useCallback(o=>{const u=(c[o.workdir]||[]).find(h=>h.sessionId===o.sessionId&&h.agent===o.agent)??{sessionId:o.sessionId,agent:o.agent,runState:"running"};return W(u)},[W,c]),ct=r.useMemo(()=>new Set(M.map(o=>F(o.agent,o.sessionId))),[M]),Nt=V?F(V.agent,V.sessionId):null,St=r.useCallback(o=>{_(u=>{const h=u.filter((f,w)=>w!==o);return h.length===0?I(0):Z.current>=h.length&&I(h.length-1),h})},[]);return e.jsxs("div",{className:"h-full overflow-hidden p-4 flex gap-3 mx-auto",children:[e.jsxs("div",{className:"panel-isolated w-[252px] shrink-0 flex flex-col overflow-hidden rounded-xl border border-edge bg-panel backdrop-blur-sm",style:{boxShadow:"var(--th-card-shadow)"},children:[e.jsxs("div",{className:"px-3 pt-3 pb-2 space-y-2",children:[e.jsxs("div",{className:"relative group",children:[e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-fg-5/40 group-focus-within:text-fg-4 transition-colors",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]}),e.jsx("input",{value:Te,onChange:o=>tt(o.target.value),placeholder:l("hub.search"),className:"w-full rounded-lg border border-edge/40 bg-inset/50 pl-8 pr-7 py-1.5 text-[12px] text-fg outline-none placeholder:text-fg-5/30 focus:border-primary/30 focus:bg-inset focus:shadow-[0_0_0_3px_rgba(99,102,241,0.06)] transition-all duration-200"}),Te&&e.jsx("button",{onClick:()=>tt(""),className:"absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded text-fg-5/30 hover:text-fg-4 transition-colors",children:e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsx("div",{className:"flex items-center rounded-lg bg-inset/30 border border-edge/20 p-0.5",children:["all","running","review"].map(o=>e.jsx("button",{onClick:()=>bt(o),className:L("flex-1 px-2 py-[5px] rounded-md text-[11px] font-medium transition-all duration-200",ke===o?"bg-panel-h text-fg-2 shadow-[0_1px_2px_rgba(0,0,0,0.1),inset_0_1px_0_rgba(255,255,255,0.04)]":"text-fg-5/60 hover:text-fg-4"),children:l(`hub.filter${o[0].toUpperCase()+o.slice(1)}`)},o))})]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:j?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(he,{className:"h-4 w-4 text-fg-5"})}):d.length===0&&!ce?e.jsx("div",{className:"py-12 text-center text-[13px] text-fg-5",children:l("hub.noWorkspaces")}):d.map(o=>e.jsx(Pr,{workspace:o,sessions:fe[o.path]||[],loading:!!v[o.path]||!(o.path in c),isActive:o.path===a,selectedKey:Nt,openSessionKeys:ct,onSelectSession:Be,onNewSession:Fe,onRefresh:ot,onRemove:He,onExtensions:wt,onWarmSession:Ae,onCancelWarmSession:Re,onSessionMenuOpen:at,t:l},o.path))}),e.jsxs("div",{className:"shrink-0 border-t border-edge/20 px-3 py-2 space-y-1.5",children:[e.jsx("div",{className:"flex items-center rounded-md bg-inset/30 border border-edge/20 p-0.5",children:[1,2,3,6].map(o=>e.jsx("button",{onClick:()=>H(o),className:L("flex-1 flex items-center justify-center p-1.5 rounded transition-all",k===o?"bg-panel-h text-fg-2 shadow-[0_1px_2px_rgba(0,0,0,0.1)]":"text-fg-5/40 hover:text-fg-4"),title:l(`hub.layout${o}`),children:o===1?e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:e.jsx("rect",{x:"2",y:"2",width:"12",height:"12",rx:"1.5"})}):o===2?e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("rect",{x:"1",y:"2",width:"6",height:"12",rx:"1.5"}),e.jsx("rect",{x:"9",y:"2",width:"6",height:"12",rx:"1.5"})]}):o===3?e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("rect",{x:"0.5",y:"2",width:"4",height:"12",rx:"1"}),e.jsx("rect",{x:"6",y:"2",width:"4",height:"12",rx:"1"}),e.jsx("rect",{x:"11.5",y:"2",width:"4",height:"12",rx:"1"})]}):e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.2",children:[e.jsx("rect",{x:"0.5",y:"1",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"6",y:"1",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"11.5",y:"1",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"0.5",y:"9.5",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"6",y:"9.5",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"11.5",y:"9.5",width:"4",height:"5.5",rx:"0.8"})]})},o))}),e.jsxs(Ee,{variant:"ghost",size:"sm",onClick:()=>we(o=>!o),className:"w-full",children:[e.jsxs("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),l("hub.addWorkspace")]})]})]}),e.jsx("div",{className:"flex-1 min-w-0 flex flex-col overflow-hidden gap-0",children:e.jsx("div",{className:"flex-1 min-h-0 grid gap-3",style:{gridTemplateColumns:`repeat(${k===6?3:k}, 1fr)`,gridTemplateRows:k===6?"repeat(2, 1fr)":"1fr"},children:(()=>{const o=$?M.length<k?M.length:B:-1;return T.current=o,Array.from({length:k},(u,h)=>{if($&&h===o)return e.jsx("div",{className:"min-w-0 overflow-hidden rounded-xl border border-edge bg-panel flex flex-col",style:{boxShadow:"var(--th-card-shadow)"},children:e.jsx(Rr,{workdir:$,workspaceName:d.find(C=>C.path===$)?.name||$.split("/").pop()||"",onSessionCreated:lt,onClose:()=>Fe(null),t:l},$)},`new-${$}`);const f=M[h]??null;if(!f)return e.jsx("div",{className:"min-w-0 overflow-hidden rounded-xl border border-dashed border-edge/40 bg-panel/30 flex items-center justify-center",children:e.jsxs("div",{className:"text-center px-4",children:[e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",className:"mx-auto text-fg-5/20 mb-2",children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),e.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"16"}),e.jsx("line",{x1:"8",y1:"12",x2:"16",y2:"12"})]}),e.jsx("div",{className:"text-[12px] text-fg-5/40",children:l("hub.emptySlot")})]})},`empty-${h}`);const w=yt(f),y=h===B;return e.jsxs("div",{className:L("min-w-0 overflow-hidden rounded-xl border bg-panel flex flex-col transition-[border-color,box-shadow] duration-200",y?"border-primary/40 ring-[3px] ring-primary/[0.06]":"border-edge hover:border-edge-h"),style:{boxShadow:y?"var(--th-card-shadow), 0 0 0 1px rgba(14,165,233,0.08)":"var(--th-card-shadow)"},onClick:()=>I(h),children:[e.jsxs("div",{className:L("shrink-0 flex items-center gap-2 px-2.5 h-8 border-b border-edge/30",y?"bg-primary/[0.03]":"bg-panel/60"),children:[(()=>{const C=It(w);return e.jsx(Wt,{variant:C==="running"?"ok":C==="waiting"?"info":C==="incomplete"?"warn":"idle",pulse:C==="running"||C==="waiting"})})(),e.jsxs("div",{className:"flex-1 min-w-0 flex items-center gap-0",children:[e.jsx("span",{className:"shrink-0 text-[10px] font-medium text-fg-5",children:f.workdir.split("/").pop()||f.workdir}),e.jsx("span",{className:"shrink-0 text-fg-6 text-[10px] mx-1",children:"/"}),e.jsx("span",{className:"min-w-0 truncate text-[11px] font-medium text-fg-3",children:w.title||w.lastQuestion?.slice(0,60)||f.sessionId.slice(0,12)})]}),e.jsxs("div",{className:"shrink-0 flex items-center gap-2.5 pl-4 text-[9px] text-fg-5/50 tabular-nums",children:[e.jsx("span",{title:l("hub.created"),children:ds(w.createdAt)}),w.runUpdatedAt&&e.jsx("span",{title:l("hub.updated"),children:Nn(w.runUpdatedAt)}),!!w.numTurns&&e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"opacity-60",children:e.jsx("path",{d:"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"})}),w.numTurns]}),e.jsx("button",{"data-filetree-toggle":!0,onClick:C=>{C.stopPropagation(),K(U=>!U)},className:L("p-0.5 rounded transition-colors",D?"text-fg-3 bg-panel-h":"text-fg-5/40 hover:text-fg-3 hover:bg-panel-h"),title:l("hub.files"),children:e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:e.jsx("path",{d:"M2 6a2 2 0 012-2h5l2 2h9a2 2 0 012 2v10a2 2 0 01-2 2H4a2 2 0 01-2-2V6z"})})}),e.jsx("button",{onClick:C=>{C.stopPropagation(),St(h)},className:"p-0.5 rounded text-fg-5/40 hover:text-fg-2 hover:bg-panel-h transition-colors",title:l("hub.closePanel"),children:e.jsxs("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(r.Suspense,{fallback:e.jsx("div",{className:"h-full"}),children:e.jsx(kr,{session:w,workdir:f.workdir,active:n&&y,onSessionChange:C=>Ke(C,h),initialPendingPrompt:f.pendingPrompt??null,initialPendingImageUrls:f.pendingImageUrls,onPendingPromptConsumed:()=>$t(f.mountKey)},f.mountKey)})})]},f.mountKey||F(f.agent,f.sessionId))})})()})}),D&&V&&e.jsx(Br,{workdir:V.workdir,onClose:()=>K(!1),t:l}),e.jsx(Ar,{open:ce,initialPath:a||void 0,onAdd:se,onClose:()=>we(!1),t:l}),e.jsxs(_t,{open:!!xe,onClose:()=>!re&&Ne(null),children:[e.jsx(Pt,{title:l("hub.removeWorkspace"),onClose:()=>!re&&Ne(null)}),e.jsx("div",{className:"text-[13px] text-fg-3 leading-relaxed",children:l("modal.confirmRemoveWorkspace")}),e.jsx("div",{className:"mt-1 text-[12px] text-fg-5",children:l("modal.confirmRemoveWorkspaceHint")}),xe&&e.jsx("div",{className:"mt-3 rounded-md bg-inset/50 border border-edge/30 px-3 py-2 font-mono text-[11px] text-fg-4 break-all",children:xe}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(Ee,{variant:"ghost",onClick:()=>Ne(null),disabled:re,children:l("modal.cancel")}),e.jsx(Ee,{variant:"primary",onClick:rt,disabled:re,className:"!bg-red-500/90 !border-red-500/50 hover:!bg-red-500 !text-white",children:l(re?"modal.removing":"modal.remove")})]})]}),ue&&(()=>{const u=Math.max(8,Math.min(ue.anchor.right-160,window.innerWidth-160-8)),h=Math.min(ue.anchor.bottom+4,window.innerHeight-60);return e.jsx("div",{className:"fixed z-[60] min-w-[160px] rounded-md border border-edge bg-panel/95 backdrop-blur-md py-1",style:{left:u,top:h,boxShadow:"0 8px 24px rgba(0,0,0,0.20), 0 2px 6px rgba(0,0,0,0.10)"},onMouseDown:f=>f.stopPropagation(),role:"menu",children:e.jsxs("button",{type:"button",role:"menuitem",onClick:()=>Bt(ue.target),className:"w-full flex items-center gap-2 px-3 py-1.5 text-left text-[12px] text-fg-2 hover:bg-panel-h/60 hover:text-red-400 transition-colors",children:[e.jsxs("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6"}),e.jsx("path",{d:"M10 11v6"}),e.jsx("path",{d:"M14 11v6"}),e.jsx("path",{d:"M9 6V4a2 2 0 012-2h2a2 2 0 012 2v2"})]}),l("session.delete")]})})})(),e.jsxs(_t,{open:!!Se,onClose:()=>!oe&&G(null),children:[e.jsx(Pt,{title:l("session.deleteTitle"),onClose:()=>!oe&&G(null)}),e.jsx("div",{className:"text-[13px] text-fg-3 leading-relaxed",children:l("session.deleteHint")}),Se&&e.jsxs("div",{className:"mt-3 rounded-md bg-inset/50 border border-edge/30 px-3 py-2 text-[11px] text-fg-4 break-all",children:[e.jsx("span",{className:"font-mono text-fg-5",children:Se.agent}),e.jsx("span",{className:"mx-1.5 text-fg-5/50",children:"·"}),e.jsx("span",{children:Se.title})]}),e.jsxs("div",{className:"mt-4 space-y-2",children:[e.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"delete-session-scope",checked:!pe,onChange:()=>Ce(!1),disabled:oe,className:"mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[12px] text-fg-2",children:l("session.deletePikiloomOnly")}),e.jsx("div",{className:"text-[11px] text-fg-5 leading-snug mt-0.5",children:l("session.deletePikiloomOnlyHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"delete-session-scope",checked:pe,onChange:()=>Ce(!0),disabled:oe,className:"mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[12px] text-fg-2",children:l("session.deletePurgeNative")}),e.jsx("div",{className:"text-[11px] text-fg-5 leading-snug mt-0.5",children:l("session.deletePurgeNativeHint")})]})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(Ee,{variant:"ghost",onClick:()=>G(null),disabled:oe,children:l("modal.cancel")}),e.jsx(Ee,{variant:"primary",onClick:kt,disabled:oe,className:"!bg-red-500/90 !border-red-500/50 hover:!bg-red-500 !text-white",children:l(oe?"session.deleting":"modal.remove")})]})]}),e.jsx(wr,{open:!!st,onClose:()=>wt(null),workdir:st||""})]})});function Ar({open:t,initialPath:n,onAdd:s,onClose:a,t:l}){const[d,x]=r.useState(""),c=r.useCallback(m=>x(m),[]);return r.useEffect(()=>{t&&x("")},[t]),e.jsxs(_t,{open:t,onClose:a,children:[e.jsx(Pt,{title:l("hub.addWorkspace"),onClose:a}),e.jsx(ps,{initialPath:n,maxHeight:360,minHeight:200,onSelect:c,t:l}),e.jsxs("div",{className:"flex gap-2 mt-4",children:[e.jsx(Ee,{disabled:!d,onClick:()=>d&&s(d),className:"flex-1",children:l("hub.add")}),e.jsx(Ee,{variant:"secondary",onClick:a,className:"flex-1",children:l("hub.cancel")})]})]})}function Rr({workdir:t,workspaceName:n,onSessionCreated:s,onClose:a,t:l}){const[d,x]=r.useState(null),[c,m]=r.useState([]),v=r.useRef(null),g=r.useRef([]),j=r.useMemo(()=>({sessionId:"",agent:"",runState:"completed"}),[]),E=r.useCallback(()=>{},[]),k=r.useCallback((A,B)=>{x(A||null),v.current=A||null;const O=B||[];m(O),g.current=O},[]),N=r.useCallback(A=>{const B=g.current;g.current=[],s(A,v.current||void 0,B.length?B:void 0)},[s]),M=!!d||c.length>0;return e.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[e.jsxs("div",{className:"shrink-0 flex items-center gap-2 px-4 h-10 border-b border-edge/50 bg-panel/40 backdrop-blur-md z-10",children:[e.jsx("span",{className:"flex-1 min-w-0 text-[13px] font-medium text-fg truncate",children:l("hub.newSession")}),e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-fg-5/60 shrink-0",children:[e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"opacity-60",children:e.jsx("path",{d:"M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"})}),e.jsx("span",{className:"max-w-[80px] truncate",children:n})]}),e.jsx(Wt,{variant:M?"ok":"idle",pulse:M}),!M&&e.jsx("button",{onClick:a,className:"p-1 rounded text-fg-5 hover:text-fg-2 transition-colors",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:M?e.jsxs("div",{className:"max-w-[900px] mx-auto px-6 py-6 space-y-0",children:[e.jsx(On,{text:d||"",blocks:c.map(A=>({type:"image",content:A})),t:l}),e.jsx("div",{className:"mt-3 mb-4 animate-in",children:e.jsx(en,{className:"text-fg-5"})})]}):e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx("div",{className:"text-center space-y-1.5",children:e.jsx("div",{className:"text-[13px] text-fg-5",children:l("hub.newSessionHint")})})})}),e.jsx(Gs,{session:j,workdir:t,onStreamQueued:E,onSendStart:k,onSessionChange:N,t:l,streamPhase:null})]})}function _r({git:t}){if(!t)return null;const n=[t.detached?`detached HEAD${t.shortSha?` @ ${t.shortSha}`:""}`:`branch ${t.branch??"?"}`,t.upstream?`upstream ${t.upstream}`:t.detached?"":"no upstream",t.ahead||t.behind?`↑${t.ahead} ahead · ↓${t.behind} behind`:"",t.changed>0?`${t.changed} changed (${t.staged} staged · ${t.unstaged} unstaged · ${t.untracked} untracked)`:"clean"].filter(Boolean).join(`
22
+ `).length:0,k=!!t&&(t.length>hr||E>xr),[N,M]=r.useState(!1),A=t?k&&!N?pr(t):t:"",B=!!(a||l||d),O=n?.filter(I=>I.type==="image")||[],H=()=>{navigator.clipboard.writeText(t).then(()=>{v(!0),setTimeout(()=>v(!1),1500)}).catch(()=>{})},_=s("hub.expand").replace("{chars}",t?t.length.toLocaleString():"0").replace("{lines}",String(E));return e.jsxs("div",{className:"flex flex-col items-end mb-5 group/bubble",onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),children:[e.jsxs("div",{className:"max-w-[72%] rounded-md border border-fg-6 bg-panel px-4 py-3 text-[13.5px] leading-[1.72] text-fg shadow-sm",children:[t&&e.jsxs("div",{className:"whitespace-pre-wrap break-words",children:[A,k&&!N&&e.jsx("span",{className:"text-fg-5/60",children:"…"})]}),k&&e.jsx("button",{type:"button",onClick:()=>M(I=>!I),className:"mt-2 text-[11.5px] text-fg-4 hover:text-fg-2 underline decoration-fg-5/40 underline-offset-2 transition-colors",children:N?s("hub.collapse"):_}),O.length>0&&e.jsx("div",{className:L("flex flex-wrap gap-2",t&&"mt-2"),children:O.map((I,D)=>e.jsx("img",{src:I.content,className:"max-w-[280px] max-h-[200px] rounded border border-fg-6/50 object-cover cursor-zoom-in hover:opacity-90 transition-opacity",onClick:()=>j(I.content)},D))})]}),g&&e.jsx($n,{src:g,onClose:()=>j(null)}),B&&e.jsxs("div",{className:L("flex items-center gap-1 mt-1.5 mr-1 transition-all duration-200",x?"opacity-100 translate-y-0":"opacity-0 -translate-y-1 pointer-events-none"),children:[e.jsx(Mt,{label:s(m?"hub.copied":"hub.copy"),onClick:H,children:m?e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"#34d399",strokeWidth:"2",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}):e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2"}),e.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})}),a&&e.jsx(Mt,{label:s("hub.rerun"),onClick:()=>a(t),children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})}),l&&e.jsx(Mt,{label:s("hub.edit"),onClick:()=>l(t),children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),e.jsx("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})]})}),d&&e.jsx(Mt,{label:s("hub.fork"),onClick:d,children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("circle",{cx:"6",cy:"6",r:"2"}),e.jsx("circle",{cx:"18",cy:"6",r:"2"}),e.jsx("circle",{cx:"12",cy:"20",r:"2"}),e.jsx("path",{d:"M6 8v3a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3V8"}),e.jsx("path",{d:"M12 14v4"})]})})]})]})}function Mt({label:t,onClick:n,children:s}){return e.jsx("button",{onClick:n,title:t,className:"flex items-center justify-center w-7 h-7 rounded border border-fg-6 bg-panel text-fg-4 shadow-sm hover:text-fg-2 hover:border-edge-h hover:bg-panel-h transition-colors",children:s})}function fr({agent:t,meta:n,model:s,effort:a,providerName:l,previewMeta:d,liveStartedAt:x}){const c=d?.contextPercent??null,m=d?.contextUsedTokens??0,v=d?.turnOutputTokens??0,g=c!=null||m>0||v>0,j=x!=null&&x>0,E=d?.providerName??l??null;return e.jsxs("div",{className:"flex items-center gap-1.5 mt-1 mb-3",children:[e.jsx(Xe,{brand:t,size:13}),e.jsx("span",{style:{color:n.color},className:"text-[12px] font-semibold opacity-70",children:n.label}),(s||a)&&e.jsxs("span",{className:"text-[10px] font-mono text-fg-5/50",children:[s||"",s&&a?" · ":"",a||""]}),E&&e.jsxs("span",{className:"text-[10px] font-mono text-fg-5/70 px-1.5 py-px rounded bg-fg-5/8",title:`This turn is routed through ${E} (BYOK), not the agent CLI's native auth.`,children:["via ",E]}),(g||j)&&e.jsxs("span",{className:"ml-auto inline-flex items-center gap-1 text-[10px] font-mono text-fg-5/55",title:vr(d),children:[c!=null&&e.jsx(jr,{pct:c}),e.jsx("span",{children:c!=null?`${c.toFixed(1)}%`:""}),m>0&&e.jsxs("span",{className:"text-fg-5/40",children:["· ",br(m)]}),v>0&&e.jsxs("span",{className:"text-fg-5/40",children:["· ↑",Dn(v)]}),j&&e.jsx(gr,{startedAt:x,leadingDot:g})]})]})}function gr({startedAt:t,leadingDot:n}){const[,s]=r.useState(0);r.useEffect(()=>{const l=setInterval(()=>s(d=>d+1),1e3);return()=>clearInterval(l)},[]);const a=Math.max(0,Date.now()-t);return e.jsxs("span",{className:"text-fg-5/55 tabular-nums",title:"Elapsed time of the running turn",children:[n?"· ":"",mr(a)]})}function mr(t){const n=Math.floor(t/1e3);if(n<60)return`${n}s`;const s=Math.floor(n/60),a=n%60;return s<60?`${s}m${a.toString().padStart(2,"0")}s`:`${Math.floor(s/60)}h${(s%60).toString().padStart(2,"0")}m`}function br(t){return`${Dn(t)} tok`}function Dn(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}function vr(t){if(!t)return"";const n=[];return t.contextPercent!=null&&n.push(`Context: ${t.contextPercent.toFixed(1)}%`),t.inputTokens!=null&&n.push(`Input: ${t.inputTokens.toLocaleString()}`),t.turnOutputTokens!=null?n.push(`Output (turn): ${t.turnOutputTokens.toLocaleString()}`):t.outputTokens!=null&&n.push(`Output: ${t.outputTokens.toLocaleString()}`),t.cachedInputTokens!=null&&n.push(`Cached: ${t.cachedInputTokens.toLocaleString()}`),n.join(" · ")}function jr({pct:t}){const n=t>=85?"bg-rose-400/70":t>=60?"bg-amber-400/70":"bg-emerald-400/70";return e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${n}`})}function wn(t,n,s){return t==="zh-CN"?n:s}function wr({open:t,onClose:n,workdir:s}){const a=je(d=>d.locale),l=s.split("/").pop()||s;return e.jsxs(_t,{open:t,onClose:n,wide:!0,children:[e.jsx(Pt,{title:wn(a,`${l} — 项目扩展`,`${l} — Project Extensions`),description:wn(a,"仅对当前工作区生效。直接操作项目目录中的 .mcp.json 与 .pikiloom/skills/。","Project-scoped only. Operates directly on .mcp.json and .pikiloom/skills/ in the workspace directory."),onClose:n}),t?e.jsx(ms,{workdir:s}):null]})}let kn=Sn(()=>import("./SessionPanel-Db_qKFIc.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]));function tn(){return kn??=Sn(()=>import("./SessionPanel-Db_qKFIc.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),kn}const kr=r.lazy(async()=>({default:(await tn()).SessionPanel})),Xt=5,yr=240,Nr=120,Sr=12,Cr=900*1e3,F=(t,n)=>`${t}:${n}`;function Er(t){const n=new Map;for(const c of t)n.set(F(c.agent||"",c.sessionId),c);const s=new Map,a=new Set;for(const c of t){const m=c.migratedFrom;if(!m||m.kind!=="fork"||!m.sessionId)continue;const v=F(m.agent||c.agent||"",m.sessionId);n.has(v)&&(a.add(F(c.agent||"",c.sessionId)),s.has(v)||s.set(v,[]),s.get(v).push(c))}const l=[],d=new Set,x=(c,m)=>{const v=F(c.agent||"",c.sessionId);if(d.has(v))return;d.add(v),l.push(Object.assign({},c,{__forkDepth:m}));const g=s.get(v);if(g)for(const j of g)x(j,m+1)};for(const c of t){const m=F(c.agent||"",c.sessionId);a.has(m)||x(c,0)}for(const c of t)x(c,0);return l}let Lr=0;function Tt(){return`mk-${Date.now().toString(36)}-${(++Lr).toString(36)}`}function Mr(t){return t==="vscode"||t==="cursor"||t==="windsurf"||t==="finder"||t==="default"}function Tr(t,n){const s=String(t||"").toLowerCase();return s.includes("cursor")?"cursor":s.includes("windsurf")?"windsurf":s.includes("code")||n==="darwin"?"vscode":"default"}function Fn(t){switch(t){case"cursor":return"hub.openTargetCursor";case"windsurf":return"hub.openTargetWindsurf";case"finder":return"hub.openTargetFinder";case"default":return"hub.openTargetDefault";default:return"hub.openTargetVsCode"}}const Ir=r.memo(function({active:n=!0}){const s=je(o=>o.locale),a=je(o=>o.state?.runtimeWorkdir??null),l=r.useMemo(()=>as(s),[s]),[d,x]=r.useState([]),[c,m]=r.useState({}),[v,g]=r.useState({}),[j,E]=r.useState(!0),[k,N]=r.useState(()=>{try{const u=sessionStorage.getItem("pikiloom-layout-mode");if(u==="1"||u==="2"||u==="3"||u==="6")return Number(u)}catch{}const o=window.innerWidth;return o>=1920?3:o>=1280?2:1}),[M,A]=r.useState(()=>{try{const o=sessionStorage.getItem("pikiloom-open-sessions");if(o){const u=JSON.parse(o);if(Array.isArray(u))return u.map(h=>({...h,mountKey:h.mountKey||Tt()}))}}catch{}return[]}),[B,O]=r.useState(()=>{try{const o=sessionStorage.getItem("pikiloom-active-slot");if(o!=null){const u=Number(o);if(Number.isFinite(u)&&u>=0)return u}}catch{}return 0}),H=r.useCallback(o=>{N(o);try{sessionStorage.setItem("pikiloom-layout-mode",String(o))}catch{}},[]),_=r.useCallback(o=>{A(u=>{const h=typeof o=="function"?o(u):o;try{const f=h.map(({pendingPrompt:w,pendingImageUrls:y,...C})=>C);sessionStorage.setItem("pikiloom-open-sessions",JSON.stringify(f))}catch{}return h})},[]),I=r.useCallback(o=>{O(u=>{const h=typeof o=="function"?o(u):o;try{sessionStorage.setItem("pikiloom-active-slot",String(h))}catch{}return h})},[]);r.useEffect(()=>{_(o=>o.length>k?o.slice(0,k):o),I(o=>o>=k?k-1:o)},[k]);const[D,K]=r.useState(!1),ae=r.useRef(k);ae.current=k;const Z=r.useRef(B);Z.current=B;const T=r.useRef(-1),V=M[B]??null,Me=r.useCallback(o=>{if(!o){_([]),I(0);return}const u=o.mountKey?o:{...o,mountKey:Tt()};_(h=>{const f=h.findIndex(y=>y.agent===u.agent&&y.sessionId===u.sessionId);if(f>=0)return I(f),h;if(h.length<ae.current){const y=[...h,u];return I(y.length-1),y}const w=[...h];return w[Z.current]=u,w})},[]),[ce,we]=r.useState(!1),[$,Fe]=r.useState(null),[Te,tt]=r.useState(""),[ke,bt]=r.useState("all"),[de,vt]=r.useState({}),ee=r.useDeferredValue(Te),te=r.useRef(!1),Ue=r.useRef({}),Ie=r.useRef(c);Ie.current=c;const ze=r.useRef(de);ze.current=de;const nt=r.useRef(new Set),ne=r.useRef({});r.useEffect(()=>()=>{for(const o of Object.values(ne.current))clearTimeout(o)},[]);const le=r.useCallback(async()=>{try{const o=await J.getWorkspaces(),u=o.ok?o.workspaces:[];u.length&&x(h=>h.length===u.length&&h.every((f,w)=>f.path===u[w].path&&f.name===u[w].name)?h:u),te.current=!0}catch{te.current=!0}finally{E(!1)}},[]);r.useEffect(()=>{le()},[le]);const P=r.useCallback(async(o,u={})=>{if(!Ue.current[o]){Ue.current[o]=!0,u.background||g(h=>({...h,[o]:!0}));try{const h=await ks(o,{force:u.force});r.startTransition(()=>{m(f=>{const w=h.sessions||[],y=f[o]||[],C=new Set(w.map(z=>F(z.agent||"",z.sessionId))),U=y.filter(z=>{if(z.runState!=="running")return!1;const ie=F(z.agent||"",z.sessionId);if(C.has(ie))return!1;const dt=ze.current[ie];return!(dt?.resolvedKey&&dt.resolvedKey!==ie)});return{...f,[o]:U.length?[...U,...w]:w}})})}catch{u.background||r.startTransition(()=>{m(h=>({...h,[o]:[]}))})}finally{Ue.current[o]=!1,u.background||g(h=>({...h,[o]:!1}))}}},[]),ye=r.useRef(a);r.useEffect(()=>{a!==ye.current&&(ye.current=a,!(!a||!te.current)&&le().then(()=>{P(a,{force:!0})}))},[a,le,P]);const X=r.useCallback((o,u)=>{const h=o.agent||"";!h||!o.sessionId||(tn(),Ss({workdir:u,agent:h,sessionId:o.sessionId,rich:!0,turnOffset:0,turnLimit:Sr}))},[]),Ae=r.useCallback((o,u,h=Nr)=>{const f=`${u}:${F(o.agent||"",o.sessionId)}`,w=ne.current[f];w&&clearTimeout(w),ne.current[f]=setTimeout(()=>{delete ne.current[f],X(o,u)},h)},[X]),Re=r.useCallback((o,u)=>{const h=`${u}:${F(o.agent||"",o.sessionId)}`,f=ne.current[h];f&&(clearTimeout(f),delete ne.current[h])},[]);r.useEffect(()=>{n&&tn()},[n]),r.useEffect(()=>{if(!n)return;const o=[];return d.forEach((u,h)=>{if(c[u.path]||v[u.path])return;const f=setTimeout(()=>{P(u.path)},h*90);o.push(f)}),()=>{for(const u of o)clearTimeout(u)}},[n,P,v,c,d]);const jt=r.useRef(new Map);mn(n&&te.current&&d.length>0?"sessions-changed":null,r.useCallback(o=>{if(typeof document<"u"&&document.visibilityState==="hidden")return;const u=o.key,h=u?d.filter(y=>(Ie.current[y.path]||[]).some(C=>F(C.agent||"",C.sessionId)===u)):d,f=h.length?h:d,w=jt.current;for(const y of f)w.has(y.path)&&clearTimeout(w.get(y.path)),w.set(y.path,setTimeout(()=>{w.delete(y.path),P(y.path,{background:!0,force:!0})},300))},[d,P]));const W=r.useCallback(o=>{const u=o.agent||"";return!u||!o.sessionId?o:ls(o,de[F(u,o.sessionId)]||null)},[de]);mn("stream-update",r.useCallback(o=>{const u=o.key;u&&vt(h=>{const f={},w=Date.now()-Cr;for(const[C,U]of Object.entries(h))U.updatedAt>=w&&(f[C]=U);const y=cs(u,o.snapshot??null);if(!y){const C=f[u];return C&&C.phase!=="done"&&(f[u]={...C,phase:"done",updatedAt:Date.now()}),f}return f[u]=y,y.resolvedKey!==u&&(f[y.resolvedKey]={...y,key:y.resolvedKey}),f})},[])),Rs(r.useCallback(()=>{if(!(!n||!te.current||d.length===0))for(const o of d)P(o.path,{background:!0,force:!0})},[n,d,P])),r.useEffect(()=>{if(!n||!te.current||d.length===0)return;const o=()=>{if(!(typeof document<"u"&&document.visibilityState==="hidden"))for(const h of d)P(h.path,{background:!0,force:!0})};if(o(),typeof document>"u"||typeof window>"u")return;const u=()=>{document.visibilityState==="visible"&&o()};return document.addEventListener("visibilitychange",u),window.addEventListener("focus",u),()=>{document.removeEventListener("visibilitychange",u),window.removeEventListener("focus",u)}},[n,P,d]),r.useEffect(()=>{if(!n)return;const o=[];return d.forEach((u,h)=>{const f=(c[u.path]||[])[0];if(!f)return;const w=`${u.path}:${F(f.agent||"",f.sessionId)}`;if(nt.current.has(w))return;const y=setTimeout(()=>{nt.current.add(w),X(f,u.path)},yr+h*120);o.push(y)}),()=>{for(const u of o)clearTimeout(u)}},[n,c,X,d]);const se=r.useCallback(async o=>{try{(await J.addWorkspace(o)).ok&&(we(!1),await le(),P(o))}catch{}},[le,P]),[xe,Ne]=r.useState(null),[re,_e]=r.useState(!1),[st,wt]=r.useState(null),He=r.useCallback(o=>{Ne(o)},[]),rt=r.useCallback(async()=>{const o=xe;if(o){_e(!0);try{await J.removeWorkspace(o),x(u=>u.filter(h=>h.path!==o)),m(u=>{const h={...u};return delete h[o],h}),_(u=>u.filter(h=>h.workdir!==o)),I(0),Ne(null)}catch{}finally{_e(!1)}}},[xe]),ot=r.useCallback(o=>{P(o,{force:!0})},[P]),[Se,G]=r.useState(null),[pe,Ce]=r.useState(!1),[oe,Pe]=r.useState(!1),We=je(o=>o.toast),[ue,it]=r.useState(null),at=r.useCallback((o,u,h)=>{it({anchor:{right:o.right,bottom:o.bottom},target:{workdir:h,agent:u.agent||"",sessionId:u.sessionId,title:yn(u).slice(0,120)||u.sessionId.slice(0,16)}})},[]);r.useEffect(()=>{if(!ue)return;const o=()=>it(null),u=h=>{h.key==="Escape"&&o()};return window.addEventListener("mousedown",o),window.addEventListener("scroll",o,!0),window.addEventListener("resize",o),window.addEventListener("keydown",u),()=>{window.removeEventListener("mousedown",o),window.removeEventListener("scroll",o,!0),window.removeEventListener("resize",o),window.removeEventListener("keydown",u)}},[ue]);const Bt=r.useCallback(o=>{Ce(!1),G(o),it(null)},[]),kt=r.useCallback(async()=>{const o=Se;if(o){Pe(!0);try{const u=await J.deleteSession(o.workdir,o.agent,o.sessionId,pe);if(!u.ok){const h=u.error?.includes("still running")?l("session.deleteRunningError"):u.error||l("session.deleteFailed");We(h,!1);return}m(h=>{const f=h[o.workdir];if(!f)return h;const w=f.filter(y=>!(y.agent===o.agent&&y.sessionId===o.sessionId));return w.length===f.length?h:{...h,[o.workdir]:w}}),_(h=>h.filter(f=>!(f.workdir===o.workdir&&f.agent===o.agent&&f.sessionId===o.sessionId))),G(null)}catch(u){We(u?.message||l("session.deleteFailed"),!1)}finally{Pe(!1)}}},[Se,pe,l,We]),$t=r.useCallback(o=>{_(u=>{let h=!1;const f=u.map(w=>w.mountKey===o&&(w.pendingPrompt!=null||w.pendingImageUrls)?(h=!0,{...w,pendingPrompt:null,pendingImageUrls:void 0}):w);return h?f:u})},[_]),lt=r.useCallback((o,u,h)=>{X({agent:o.agent,sessionId:o.sessionId,runState:"running"},o.workdir),m(y=>{const C=y[o.workdir]||[];if(C.some(ie=>ie.sessionId===o.sessionId&&ie.agent===o.agent))return y;const z={sessionId:o.sessionId,agent:o.agent,runState:"running",lastQuestion:u,createdAt:new Date().toISOString(),runUpdatedAt:new Date().toISOString()};return{...y,[o.workdir]:[z,...C]}});const f=T.current,w={...o,mountKey:Tt(),pendingPrompt:u||null,pendingImageUrls:h&&h.length?h:void 0};r.startTransition(()=>{Fe(null),_(y=>{if(f>=y.length)return[...y,w];const C=[...y];return C[f]=w,C}),I(f>=0?f:0)}),P(o.workdir,{background:!0,force:!0})},[P,X,_,I]),Be=r.useCallback((o,u)=>{X(o,u),Fe(null),r.startTransition(()=>{Me({agent:o.agent||"",sessionId:o.sessionId,workdir:u})})},[X]),Ke=r.useCallback((o,u)=>{X({agent:o.agent,sessionId:o.sessionId,runState:"running"},o.workdir),r.startTransition(()=>{u!=null?(_(h=>{if(u>=h.length)return h;const f=[...h];return f[u]={...h[u],agent:o.agent,sessionId:o.sessionId,workdir:o.workdir},f}),I(u)):Me({...o,mountKey:Tt()})}),P(o.workdir,{background:!0,force:!0})},[P,X]),Ve=r.useCallback(o=>{let u=o;if(ke==="running"?u=u.filter(h=>It(h)==="running"):ke==="review"&&(u=u.filter(h=>It(h)==="incomplete")),ee.trim()){const h=ee.toLowerCase();u=u.filter(f=>(f.lastMessageText||"").toLowerCase().includes(h)||(f.lastQuestion||"").toLowerCase().includes(h)||(f.lastAnswer||"").toLowerCase().includes(h)||(f.title||"").toLowerCase().includes(h)||(f.agent||"").toLowerCase().includes(h))}return u},[ee,ke]),fe=r.useMemo(()=>{const o={};for(const u of d){const h=(c[u.path]||[]).map(W),f=new Map;for(const y of h){const C=F(y.agent||"",y.sessionId),U=de[C],z=U?.resolvedKey&&U.resolvedKey!==C?U.resolvedKey:C,ie=f.get(z);if(!ie){f.set(z,y);continue}F(ie.agent||"",ie.sessionId)!==z&&C===z&&f.set(z,y)}const w=Ve([...f.values()]);o[u.path]=Er(w)}return o},[d,c,de,Ve,W]),yt=r.useCallback(o=>{const u=(c[o.workdir]||[]).find(h=>h.sessionId===o.sessionId&&h.agent===o.agent)??{sessionId:o.sessionId,agent:o.agent,runState:"running"};return W(u)},[W,c]),ct=r.useMemo(()=>new Set(M.map(o=>F(o.agent,o.sessionId))),[M]),Nt=V?F(V.agent,V.sessionId):null,St=r.useCallback(o=>{_(u=>{const h=u.filter((f,w)=>w!==o);return h.length===0?I(0):Z.current>=h.length&&I(h.length-1),h})},[]);return e.jsxs("div",{className:"h-full overflow-hidden p-4 flex gap-3 mx-auto",children:[e.jsxs("div",{className:"panel-isolated w-[252px] shrink-0 flex flex-col overflow-hidden rounded-xl border border-edge bg-panel backdrop-blur-sm",style:{boxShadow:"var(--th-card-shadow)"},children:[e.jsxs("div",{className:"px-3 pt-3 pb-2 space-y-2",children:[e.jsxs("div",{className:"relative group",children:[e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-fg-5/40 group-focus-within:text-fg-4 transition-colors",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]}),e.jsx("input",{value:Te,onChange:o=>tt(o.target.value),placeholder:l("hub.search"),className:"w-full rounded-lg border border-edge/40 bg-inset/50 pl-8 pr-7 py-1.5 text-[12px] text-fg outline-none placeholder:text-fg-5/30 focus:border-primary/30 focus:bg-inset focus:shadow-[0_0_0_3px_rgba(99,102,241,0.06)] transition-all duration-200"}),Te&&e.jsx("button",{onClick:()=>tt(""),className:"absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded text-fg-5/30 hover:text-fg-4 transition-colors",children:e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsx("div",{className:"flex items-center rounded-lg bg-inset/30 border border-edge/20 p-0.5",children:["all","running","review"].map(o=>e.jsx("button",{onClick:()=>bt(o),className:L("flex-1 px-2 py-[5px] rounded-md text-[11px] font-medium transition-all duration-200",ke===o?"bg-panel-h text-fg-2 shadow-[0_1px_2px_rgba(0,0,0,0.1),inset_0_1px_0_rgba(255,255,255,0.04)]":"text-fg-5/60 hover:text-fg-4"),children:l(`hub.filter${o[0].toUpperCase()+o.slice(1)}`)},o))})]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:j?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(he,{className:"h-4 w-4 text-fg-5"})}):d.length===0&&!ce?e.jsx("div",{className:"py-12 text-center text-[13px] text-fg-5",children:l("hub.noWorkspaces")}):d.map(o=>e.jsx(Pr,{workspace:o,sessions:fe[o.path]||[],loading:!!v[o.path]||!(o.path in c),isActive:o.path===a,selectedKey:Nt,openSessionKeys:ct,onSelectSession:Be,onNewSession:Fe,onRefresh:ot,onRemove:He,onExtensions:wt,onWarmSession:Ae,onCancelWarmSession:Re,onSessionMenuOpen:at,t:l},o.path))}),e.jsxs("div",{className:"shrink-0 border-t border-edge/20 px-3 py-2 space-y-1.5",children:[e.jsx("div",{className:"flex items-center rounded-md bg-inset/30 border border-edge/20 p-0.5",children:[1,2,3,6].map(o=>e.jsx("button",{onClick:()=>H(o),className:L("flex-1 flex items-center justify-center p-1.5 rounded transition-all",k===o?"bg-panel-h text-fg-2 shadow-[0_1px_2px_rgba(0,0,0,0.1)]":"text-fg-5/40 hover:text-fg-4"),title:l(`hub.layout${o}`),children:o===1?e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:e.jsx("rect",{x:"2",y:"2",width:"12",height:"12",rx:"1.5"})}):o===2?e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("rect",{x:"1",y:"2",width:"6",height:"12",rx:"1.5"}),e.jsx("rect",{x:"9",y:"2",width:"6",height:"12",rx:"1.5"})]}):o===3?e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("rect",{x:"0.5",y:"2",width:"4",height:"12",rx:"1"}),e.jsx("rect",{x:"6",y:"2",width:"4",height:"12",rx:"1"}),e.jsx("rect",{x:"11.5",y:"2",width:"4",height:"12",rx:"1"})]}):e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.2",children:[e.jsx("rect",{x:"0.5",y:"1",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"6",y:"1",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"11.5",y:"1",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"0.5",y:"9.5",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"6",y:"9.5",width:"4",height:"5.5",rx:"0.8"}),e.jsx("rect",{x:"11.5",y:"9.5",width:"4",height:"5.5",rx:"0.8"})]})},o))}),e.jsxs(Ee,{variant:"ghost",size:"sm",onClick:()=>we(o=>!o),className:"w-full",children:[e.jsxs("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),l("hub.addWorkspace")]})]})]}),e.jsx("div",{className:"flex-1 min-w-0 flex flex-col overflow-hidden gap-0",children:e.jsx("div",{className:"flex-1 min-h-0 grid gap-3",style:{gridTemplateColumns:`repeat(${k===6?3:k}, 1fr)`,gridTemplateRows:k===6?"repeat(2, 1fr)":"1fr"},children:(()=>{const o=$?M.length<k?M.length:B:-1;return T.current=o,Array.from({length:k},(u,h)=>{if($&&h===o)return e.jsx("div",{className:"min-w-0 overflow-hidden rounded-xl border border-edge bg-panel flex flex-col",style:{boxShadow:"var(--th-card-shadow)"},children:e.jsx(Rr,{workdir:$,workspaceName:d.find(C=>C.path===$)?.name||$.split("/").pop()||"",onSessionCreated:lt,onClose:()=>Fe(null),t:l},$)},`new-${$}`);const f=M[h]??null;if(!f)return e.jsx("div",{className:"min-w-0 overflow-hidden rounded-xl border border-dashed border-edge/40 bg-panel/30 flex items-center justify-center",children:e.jsxs("div",{className:"text-center px-4",children:[e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",className:"mx-auto text-fg-5/20 mb-2",children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),e.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"16"}),e.jsx("line",{x1:"8",y1:"12",x2:"16",y2:"12"})]}),e.jsx("div",{className:"text-[12px] text-fg-5/40",children:l("hub.emptySlot")})]})},`empty-${h}`);const w=yt(f),y=h===B;return e.jsxs("div",{className:L("min-w-0 overflow-hidden rounded-xl border bg-panel flex flex-col transition-[border-color,box-shadow] duration-200",y?"border-primary/40 ring-[3px] ring-primary/[0.06]":"border-edge hover:border-edge-h"),style:{boxShadow:y?"var(--th-card-shadow), 0 0 0 1px rgba(14,165,233,0.08)":"var(--th-card-shadow)"},onClick:()=>I(h),children:[e.jsxs("div",{className:L("shrink-0 flex items-center gap-2 px-2.5 h-8 border-b border-edge/30",y?"bg-primary/[0.03]":"bg-panel/60"),children:[(()=>{const C=It(w);return e.jsx(Wt,{variant:C==="running"?"ok":C==="waiting"?"info":C==="incomplete"?"warn":"idle",pulse:C==="running"||C==="waiting"})})(),e.jsxs("div",{className:"flex-1 min-w-0 flex items-center gap-0",children:[e.jsx("span",{className:"shrink-0 text-[10px] font-medium text-fg-5",children:f.workdir.split("/").pop()||f.workdir}),e.jsx("span",{className:"shrink-0 text-fg-6 text-[10px] mx-1",children:"/"}),e.jsx("span",{className:"min-w-0 truncate text-[11px] font-medium text-fg-3",children:w.title||w.lastQuestion?.slice(0,60)||f.sessionId.slice(0,12)})]}),e.jsxs("div",{className:"shrink-0 flex items-center gap-2.5 pl-4 text-[9px] text-fg-5/50 tabular-nums",children:[e.jsx("span",{title:l("hub.created"),children:ds(w.createdAt)}),w.runUpdatedAt&&e.jsx("span",{title:l("hub.updated"),children:Nn(w.runUpdatedAt)}),!!w.numTurns&&e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"opacity-60",children:e.jsx("path",{d:"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"})}),w.numTurns]}),e.jsx("button",{"data-filetree-toggle":!0,onClick:C=>{C.stopPropagation(),K(U=>!U)},className:L("p-0.5 rounded transition-colors",D?"text-fg-3 bg-panel-h":"text-fg-5/40 hover:text-fg-3 hover:bg-panel-h"),title:l("hub.files"),children:e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:e.jsx("path",{d:"M2 6a2 2 0 012-2h5l2 2h9a2 2 0 012 2v10a2 2 0 01-2 2H4a2 2 0 01-2-2V6z"})})}),e.jsx("button",{onClick:C=>{C.stopPropagation(),St(h)},className:"p-0.5 rounded text-fg-5/40 hover:text-fg-2 hover:bg-panel-h transition-colors",title:l("hub.closePanel"),children:e.jsxs("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(r.Suspense,{fallback:e.jsx("div",{className:"h-full"}),children:e.jsx(kr,{session:w,workdir:f.workdir,active:n&&y,onSessionChange:C=>Ke(C,h),initialPendingPrompt:f.pendingPrompt??null,initialPendingImageUrls:f.pendingImageUrls,onPendingPromptConsumed:()=>$t(f.mountKey)},f.mountKey)})})]},f.mountKey||F(f.agent,f.sessionId))})})()})}),D&&V&&e.jsx(Br,{workdir:V.workdir,onClose:()=>K(!1),t:l}),e.jsx(Ar,{open:ce,initialPath:a||void 0,onAdd:se,onClose:()=>we(!1),t:l}),e.jsxs(_t,{open:!!xe,onClose:()=>!re&&Ne(null),children:[e.jsx(Pt,{title:l("hub.removeWorkspace"),onClose:()=>!re&&Ne(null)}),e.jsx("div",{className:"text-[13px] text-fg-3 leading-relaxed",children:l("modal.confirmRemoveWorkspace")}),e.jsx("div",{className:"mt-1 text-[12px] text-fg-5",children:l("modal.confirmRemoveWorkspaceHint")}),xe&&e.jsx("div",{className:"mt-3 rounded-md bg-inset/50 border border-edge/30 px-3 py-2 font-mono text-[11px] text-fg-4 break-all",children:xe}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(Ee,{variant:"ghost",onClick:()=>Ne(null),disabled:re,children:l("modal.cancel")}),e.jsx(Ee,{variant:"primary",onClick:rt,disabled:re,className:"!bg-red-500/90 !border-red-500/50 hover:!bg-red-500 !text-white",children:l(re?"modal.removing":"modal.remove")})]})]}),ue&&(()=>{const u=Math.max(8,Math.min(ue.anchor.right-160,window.innerWidth-160-8)),h=Math.min(ue.anchor.bottom+4,window.innerHeight-60);return e.jsx("div",{className:"fixed z-[60] min-w-[160px] rounded-md border border-edge bg-panel/95 backdrop-blur-md py-1",style:{left:u,top:h,boxShadow:"0 8px 24px rgba(0,0,0,0.20), 0 2px 6px rgba(0,0,0,0.10)"},onMouseDown:f=>f.stopPropagation(),role:"menu",children:e.jsxs("button",{type:"button",role:"menuitem",onClick:()=>Bt(ue.target),className:"w-full flex items-center gap-2 px-3 py-1.5 text-left text-[12px] text-fg-2 hover:bg-panel-h/60 hover:text-red-400 transition-colors",children:[e.jsxs("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("polyline",{points:"3 6 5 6 21 6"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6"}),e.jsx("path",{d:"M10 11v6"}),e.jsx("path",{d:"M14 11v6"}),e.jsx("path",{d:"M9 6V4a2 2 0 012-2h2a2 2 0 012 2v2"})]}),l("session.delete")]})})})(),e.jsxs(_t,{open:!!Se,onClose:()=>!oe&&G(null),children:[e.jsx(Pt,{title:l("session.deleteTitle"),onClose:()=>!oe&&G(null)}),e.jsx("div",{className:"text-[13px] text-fg-3 leading-relaxed",children:l("session.deleteHint")}),Se&&e.jsxs("div",{className:"mt-3 rounded-md bg-inset/50 border border-edge/30 px-3 py-2 text-[11px] text-fg-4 break-all",children:[e.jsx("span",{className:"font-mono text-fg-5",children:Se.agent}),e.jsx("span",{className:"mx-1.5 text-fg-5/50",children:"·"}),e.jsx("span",{children:Se.title})]}),e.jsxs("div",{className:"mt-4 space-y-2",children:[e.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"delete-session-scope",checked:!pe,onChange:()=>Ce(!1),disabled:oe,className:"mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[12px] text-fg-2",children:l("session.deletePikiloomOnly")}),e.jsx("div",{className:"text-[11px] text-fg-5 leading-snug mt-0.5",children:l("session.deletePikiloomOnlyHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"delete-session-scope",checked:pe,onChange:()=>Ce(!0),disabled:oe,className:"mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[12px] text-fg-2",children:l("session.deletePurgeNative")}),e.jsx("div",{className:"text-[11px] text-fg-5 leading-snug mt-0.5",children:l("session.deletePurgeNativeHint")})]})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(Ee,{variant:"ghost",onClick:()=>G(null),disabled:oe,children:l("modal.cancel")}),e.jsx(Ee,{variant:"primary",onClick:kt,disabled:oe,className:"!bg-red-500/90 !border-red-500/50 hover:!bg-red-500 !text-white",children:l(oe?"session.deleting":"modal.remove")})]})]}),e.jsx(wr,{open:!!st,onClose:()=>wt(null),workdir:st||""})]})});function Ar({open:t,initialPath:n,onAdd:s,onClose:a,t:l}){const[d,x]=r.useState(""),c=r.useCallback(m=>x(m),[]);return r.useEffect(()=>{t&&x("")},[t]),e.jsxs(_t,{open:t,onClose:a,children:[e.jsx(Pt,{title:l("hub.addWorkspace"),onClose:a}),e.jsx(ps,{initialPath:n,maxHeight:360,minHeight:200,onSelect:c,t:l}),e.jsxs("div",{className:"flex gap-2 mt-4",children:[e.jsx(Ee,{disabled:!d,onClick:()=>d&&s(d),className:"flex-1",children:l("hub.add")}),e.jsx(Ee,{variant:"secondary",onClick:a,className:"flex-1",children:l("hub.cancel")})]})]})}function Rr({workdir:t,workspaceName:n,onSessionCreated:s,onClose:a,t:l}){const[d,x]=r.useState(null),[c,m]=r.useState([]),v=r.useRef(null),g=r.useRef([]),j=r.useMemo(()=>({sessionId:"",agent:"",runState:"completed"}),[]),E=r.useCallback(()=>{},[]),k=r.useCallback((A,B)=>{x(A||null),v.current=A||null;const O=B||[];m(O),g.current=O},[]),N=r.useCallback(A=>{const B=g.current;g.current=[],s(A,v.current||void 0,B.length?B:void 0)},[s]),M=!!d||c.length>0;return e.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[e.jsxs("div",{className:"shrink-0 flex items-center gap-2 px-4 h-10 border-b border-edge/50 bg-panel/40 backdrop-blur-md z-10",children:[e.jsx("span",{className:"flex-1 min-w-0 text-[13px] font-medium text-fg truncate",children:l("hub.newSession")}),e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-fg-5/60 shrink-0",children:[e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"opacity-60",children:e.jsx("path",{d:"M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"})}),e.jsx("span",{className:"max-w-[80px] truncate",children:n})]}),e.jsx(Wt,{variant:M?"ok":"idle",pulse:M}),!M&&e.jsx("button",{onClick:a,className:"p-1 rounded text-fg-5 hover:text-fg-2 transition-colors",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:M?e.jsxs("div",{className:"max-w-[900px] mx-auto px-6 py-6 space-y-0",children:[e.jsx(On,{text:d||"",blocks:c.map(A=>({type:"image",content:A})),t:l}),e.jsx("div",{className:"mt-3 mb-4 animate-in",children:e.jsx(en,{className:"text-fg-5"})})]}):e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx("div",{className:"text-center space-y-1.5",children:e.jsx("div",{className:"text-[13px] text-fg-5",children:l("hub.newSessionHint")})})})}),e.jsx(Gs,{session:j,workdir:t,onStreamQueued:E,onSendStart:k,onSessionChange:N,t:l,streamPhase:null})]})}function _r({git:t}){if(!t)return null;const n=[t.detached?`detached HEAD${t.shortSha?` @ ${t.shortSha}`:""}`:`branch ${t.branch??"?"}`,t.upstream?`upstream ${t.upstream}`:t.detached?"":"no upstream",t.ahead||t.behind?`↑${t.ahead} ahead · ↓${t.behind} behind`:"",t.changed>0?`${t.changed} changed (${t.staged} staged · ${t.unstaged} unstaged · ${t.untracked} untracked)`:"clean"].filter(Boolean).join(`
23
23
  `);return e.jsx(us,{content:n,className:L("shrink-0 items-center",t.changed>0?"text-amber-400/80":t.ahead||t.behind?"text-sky-400/70":"text-fg-5/50"),onClick:s=>s.stopPropagation(),children:e.jsxs("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"6",cy:"6",r:"2.5"}),e.jsx("circle",{cx:"6",cy:"18",r:"2.5"}),e.jsx("circle",{cx:"18",cy:"8",r:"2.5"}),e.jsx("path",{d:"M6 8.5v7"}),e.jsx("path",{d:"M18 10.5c0 4.5-6 3-6 7.5"})]})})}const Pr=r.memo(function({workspace:n,sessions:s,loading:a,isActive:l,selectedKey:d,openSessionKeys:x,onSelectSession:c,onNewSession:m,onRefresh:v,onRemove:g,onExtensions:j,onWarmSession:E,onCancelWarmSession:k,onSessionMenuOpen:N,t:M}){const[A,B]=r.useState(!0),[O,H]=r.useState(Xt);r.useEffect(()=>{H(Xt)},[s.length]);const _=s.slice(0,O),I=s.length-O,D=n.path,[K,ae]=r.useState(null),Z=r.useCallback(()=>{J.getWorkspaceGit(D).then(T=>ae(T.git)).catch(()=>ae(null))},[D]);return r.useEffect(()=>{Z()},[Z]),e.jsxs("div",{className:"border-b border-edge/30",children:[e.jsxs("div",{className:"flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-panel-h/50 transition-colors",onClick:()=>B(T=>!T),children:[e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:L("shrink-0 text-fg-5 transition-transform duration-150",A&&"rotate-90"),children:e.jsx("polyline",{points:"9 6 15 12 9 18"})}),e.jsxs("div",{className:"flex-1 min-w-0 flex items-center gap-1.5",children:[e.jsx("span",{className:L("min-w-0 truncate text-[12px] font-semibold",l?"text-primary":"text-fg-3"),children:n.name}),e.jsx(_r,{git:K})]}),l&&e.jsx(Wt,{variant:"ok"}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx("button",{onClick:T=>{T.stopPropagation(),m(D)},className:"p-1 rounded text-fg-5 hover:text-primary hover:bg-panel-h/60 transition-colors",title:M("hub.newSession"),children:e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}),e.jsx("button",{onClick:T=>{T.stopPropagation(),j(D)},className:"p-1 rounded text-fg-5 hover:text-primary hover:bg-panel-h/60 transition-colors",title:M("hub.extensions"),children:e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M12 22v-5"}),e.jsx("path",{d:"M9 8V2"}),e.jsx("path",{d:"M15 8V2"}),e.jsx("path",{d:"M18 8v5a6 6 0 0 1-12 0V8z"})]})}),e.jsx("button",{onClick:T=>{T.stopPropagation(),v(D),Z()},className:"p-1 rounded text-fg-5 hover:text-fg-2 hover:bg-panel-h/60 transition-colors",children:e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})}),!l&&e.jsx("button",{onClick:T=>{T.stopPropagation(),g(D)},className:"p-1 rounded text-fg-5 hover:text-red-400 hover:bg-panel-h/60 transition-colors",children:e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),A&&e.jsx("div",{className:"pb-1",children:a?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(he,{className:"h-3 w-3 text-fg-5"})}):s.length===0?e.jsx("div",{className:"py-3 text-center text-[11px] text-fg-5",children:M("sessions.noSessions")}):e.jsxs(e.Fragment,{children:[_.map(T=>{const V=F(T.agent||"",T.sessionId),Me=T.__forkDepth||0;return e.jsx(Wr,{session:T,isSelected:d===V,isOpen:x?.has(V)??!1,forkDepth:Me,onClick:()=>c(T,D),onWarm:()=>E(T,D),onCancelWarm:()=>k(T,D),onShowMenu:ce=>N(ce,T,D),menuLabel:M("session.openActions")},V)}),I>0&&e.jsxs("button",{onClick:()=>H(T=>T+Xt),className:"flex items-center gap-1.5 w-full px-3 py-1.5 text-[11px] text-fg-5 hover:text-fg-3 hover:bg-panel-h/50 transition-colors",children:[e.jsxs("span",{children:["+ ",M("hub.nMore").replace("{n}",String(I))]}),e.jsx("svg",{width:"8",height:"8",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]})]})})]})}),Wr=r.memo(function({session:n,isSelected:s,isOpen:a,forkDepth:l=0,onClick:d,onWarm:x,onCancelWarm:c,onShowMenu:m,menuLabel:v}){const g=Yt(n.agent||""),j=It(n),E=yn(n).slice(0,500)||n.sessionId.slice(0,16),k=hs(n,E).slice(0,500),N=n.model?sn(n.model):null,M=l>0?Math.min(l,3)*14:0,A=a?10:12,B=r.useRef(null);return e.jsxs("div",{className:"relative group",children:[e.jsxs("button",{onClick:d,onMouseEnter:x,onFocus:x,onMouseLeave:c,onBlur:c,className:L("w-full pr-3 py-2 text-left transition-all duration-100",s?"bg-selected hover:bg-selected-h":a?"bg-panel-h/30 hover:bg-panel-h/50":"hover:bg-panel-h/50"),style:{paddingLeft:A+M,...a?{borderLeft:`2px solid ${s?g.color:`${g.color}30`}`}:{}},children:[e.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] text-fg-5",children:[l>0&&e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"text-fg-5/60 shrink-0","aria-label":"Fork",children:[e.jsx("circle",{cx:"6",cy:"6",r:"2"}),e.jsx("circle",{cx:"18",cy:"6",r:"2"}),e.jsx("circle",{cx:"12",cy:"20",r:"2"}),e.jsx("path",{d:"M6 8v3a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3V8"}),e.jsx("path",{d:"M12 14v4"})]}),e.jsx(Xe,{brand:n.agent||"",size:10}),e.jsx("span",{className:"font-medium shrink-0",style:{color:g.color},children:g.shortLabel}),N&&e.jsx("span",{className:"truncate max-w-[72px] font-mono text-fg-5/40 text-[9px]",children:N}),e.jsxs("div",{className:"ml-auto flex items-center gap-1.5 shrink-0 transition-opacity group-hover:opacity-0 group-focus-within:opacity-0",children:[!!n.numTurns&&e.jsxs("span",{className:"flex items-center gap-0.5 text-fg-5/50 tabular-nums",children:[e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"opacity-50",children:e.jsx("path",{d:"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"})}),n.numTurns]}),e.jsx("span",{className:"tabular-nums",children:Nn(n.runUpdatedAt||n.createdAt)})]})]}),e.jsxs("div",{className:"mt-1 flex items-center gap-1.5",children:[e.jsx(Wt,{variant:j==="running"?"ok":j==="waiting"?"info":j==="incomplete"?"warn":"idle",pulse:j==="running"||j==="waiting"}),e.jsx("span",{className:"truncate text-[12px] leading-snug text-fg-2",children:E})]}),k&&e.jsx("div",{className:"mt-0.5 pl-[11px]",children:e.jsx("span",{className:"block truncate text-[10px] leading-snug text-fg-5",children:k})})]}),e.jsx("button",{ref:B,type:"button","aria-label":v,"aria-haspopup":"menu",onMouseDown:O=>{O.stopPropagation()},onClick:O=>{O.stopPropagation(),O.preventDefault(),B.current&&m(B.current.getBoundingClientRect())},className:"absolute top-1.5 right-1.5 p-1 rounded text-fg-5 opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:bg-panel-h hover:text-fg-2 transition-opacity",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:[e.jsx("circle",{cx:"12",cy:"5",r:"1.5"}),e.jsx("circle",{cx:"12",cy:"12",r:"1.5"}),e.jsx("circle",{cx:"12",cy:"19",r:"1.5"})]})})]})}),Br=r.memo(function({workdir:n,onClose:s,t:a}){const l=je(g=>g.state?.hostApp??null),d=je(g=>g.state?.platform??null),x=je(g=>g.toast),[c,m]=r.useState(()=>Tr(l,d)),v=r.useCallback(async g=>{try{const j=await J.openInEditor(g,c);if(!j.ok)throw new Error(j.error||`Failed to open ${g}`)}catch(j){x(j?.message||String(j),!1)}},[c,x]);return e.jsxs("div",{className:"fixed z-50 w-[280px] max-h-[calc(100vh-100px)] flex flex-col rounded-xl border border-edge bg-panel/95 backdrop-blur-md overflow-hidden",style:{boxShadow:"0 8px 32px rgba(0,0,0,0.18), 0 2px 8px rgba(0,0,0,0.12)",right:16,top:80},children:[e.jsxs("div",{className:"shrink-0 flex items-center gap-1.5 px-2.5 py-1.5 border-b border-edge/30",children:[e.jsx("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:"shrink-0 text-fg-5",children:e.jsx("path",{d:"M2 6a2 2 0 012-2h5l2 2h9a2 2 0 012 2v10a2 2 0 01-2 2H4a2 2 0 01-2-2V6z"})}),e.jsx("span",{className:"flex-1 text-[10px] font-semibold text-fg-4 uppercase tracking-wider",children:a("hub.files")}),e.jsx("button",{onClick:s,className:"p-0.5 rounded text-fg-5/40 hover:text-fg-2 transition-colors",title:a("hub.closePanel"),children:e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsxs("div",{className:"shrink-0 px-2.5 py-1.5 border-b border-edge/20 flex items-center gap-2",children:[e.jsx(xs,{value:c,options:(d==="darwin"?["vscode","finder"]:["vscode"]).map(g=>({value:g,label:a(Fn(g))})),onChange:g=>{Mr(g)&&m(g)},renderIcon:g=>e.jsx(Un,{target:g,size:14})}),e.jsx(Ee,{size:"sm",variant:"ghost",onClick:()=>v(n),className:"flex-1 min-w-0 text-[11px]",children:a("hub.openProject")})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-1 py-1.5",children:e.jsx($r,{basePath:n,openTarget:c,onOpenPath:v,t:a})})]})});function Un({target:t,size:n=16}){return t==="default"?e.jsxs("svg",{width:n,height:n,viewBox:"0 0 16 16",className:"shrink-0 text-fg-4",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 3H4a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2"}),e.jsx("path",{d:"M9 2h5v5"}),e.jsx("path",{d:"M14 2L7 9"})]}):e.jsx(Xe,{brand:t,size:n})}function $r({basePath:t,includeHidden:n=!1,openTarget:s,onOpenPath:a,t:l}){const[d,x]=r.useState([]),[c,m]=r.useState(!0);r.useEffect(()=>{let g=!1;return m(!0),J.lsDir(t,!0,n).then(j=>{!g&&j.ok&&x(j.dirs.slice(0,50).map(E=>({entry:E,expanded:!1,children:null,loading:!1})))}).catch(()=>{}).finally(()=>{g||m(!1)}),()=>{g=!0}},[t,n]);const v=r.useCallback(g=>{const j=E=>E.map(k=>k.entry.path===g?k.expanded?{...k,expanded:!1}:k.children===null?(J.lsDir(g,!0,n).then(N=>{N.ok&&x(M=>nn(M,g,{children:N.dirs.slice(0,50).map(A=>({entry:A,expanded:!1,children:null,loading:!1})),loading:!1}))}).catch(()=>{x(N=>nn(N,g,{children:[],loading:!1}))}),{...k,loading:!0,expanded:!0}):{...k,expanded:!0}:k.children?{...k,children:j(k.children)}:k);x(E=>j(E))},[n]);return c?e.jsx("div",{className:"flex justify-center py-3",children:e.jsx(he,{className:"h-3 w-3 text-fg-5"})}):d.length===0?e.jsx("div",{className:"py-3 text-center text-[11px] text-fg-5",children:"—"}):e.jsx("div",{className:"space-y-px",children:e.jsx(zn,{nodes:d,depth:0,onToggle:v,openTarget:s,onOpenPath:a,t:l})})}function zn({nodes:t,depth:n,onToggle:s,openTarget:a,onOpenPath:l,t:d}){return e.jsx(e.Fragment,{children:t.map(x=>e.jsx(Or,{node:x,depth:n,onToggle:s,openTarget:a,onOpenPath:l,t:d},x.entry.path))})}function Or({node:t,depth:n,onToggle:s,openTarget:a,onOpenPath:l,t:d}){const{entry:x,expanded:c,children:m,loading:v}=t,g=n*14,[j,E]=r.useState(!1),k=d(Fn(a)),N=d("hub.openWithTarget").replace("{target}",k);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{onClick:x.isDir?()=>s(x.path):void 0,onMouseEnter:()=>E(!0),onMouseLeave:()=>E(!1),className:L("flex items-center gap-1.5 py-1 rounded text-[11px] text-fg-3 transition-colors",x.isDir?"hover:bg-panel-h/50 cursor-pointer":"hover:bg-panel-h/50 cursor-default"),style:{paddingLeft:8+g,paddingRight:8},children:[x.isDir?v?e.jsx(he,{className:"h-2 w-2 text-fg-5 shrink-0"}):e.jsx("svg",{width:"8",height:"8",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:L("shrink-0 text-fg-5/40 transition-transform duration-150",c&&"rotate-90"),children:e.jsx("polyline",{points:"9 6 15 12 9 18"})}):e.jsx("span",{className:"w-2 shrink-0"}),x.isDir?e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",className:"shrink-0 text-blue-400/70",children:e.jsx("path",{d:"M2 6a2 2 0 012-2h5l2 2h9a2 2 0 012 2v10a2 2 0 01-2 2H4a2 2 0 01-2-2V6z",fill:"currentColor",opacity:"0.25",stroke:"currentColor",strokeWidth:"1.5"})}):e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",className:"shrink-0 text-fg-5",children:[e.jsx("path",{d:"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),e.jsx("span",{className:"truncate flex-1",children:x.name}),j&&e.jsxs("div",{className:"flex items-center gap-0.5 shrink-0",children:[e.jsx("button",{onClick:M=>{M.stopPropagation(),l(x.path)},className:"inline-flex items-center gap-1 rounded px-1 py-0.5 text-fg-5 hover:text-blue-400 transition-colors",title:N,children:e.jsx(Un,{target:a,subtle:!0})}),!x.isDir&&e.jsx(Dr,{filePath:x.path,t:d})]})]}),x.isDir&&c&&m&&m.length>0&&e.jsx(zn,{nodes:m,depth:n+1,onToggle:s,openTarget:a,onOpenPath:l,t:d})]})}function Dr({filePath:t,t:n}){const[s,a]=r.useState(!1);return e.jsx("button",{onClick:l=>{l.stopPropagation(),navigator.clipboard.writeText(t).then(()=>{a(!0),setTimeout(()=>a(!1),1500)}).catch(()=>{})},className:L("p-0.5 rounded transition-colors",s?"text-ok":"text-fg-5 hover:text-fg-3"),title:n("hub.copied"),children:s?e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}):e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2"}),e.jsx("path",{d:"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"})]})})}function nn(t,n,s){return t.map(a=>a.entry.path===n?{...a,...s}:a.children?{...a,children:nn(a.children,n,s)}:a)}const to=Object.freeze(Object.defineProperty({__proto__:null,SessionWorkspace:Ir},Symbol.toStringTag,{value:"Module"}));export{Gs as I,Zr as L,tr as R,eo as T,On as U,Jr as a,Pn as b,Rs as c,en as d,Yr as e,fr as f,to as i,Ns as l,Xr as m,Qr as n,ys as p,mn as u};
@@ -1 +1 @@
1
- import{j as s}from"./react-vendor-C7Sl8SE7.js";import{J as t,i as n,S as a}from"./index-DVC2D6tL.js";function o({primary:e,secondary:l,tertiary:i}){return s.jsxs("div",{className:"flex flex-col gap-2 pt-1 sm:flex-row sm:flex-wrap sm:items-center sm:justify-between",children:[s.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e&&s.jsxs(n,{tone:"primary",onClick:e.onClick,disabled:e.disabled,children:[e.loading&&s.jsx(a,{}),e.label]}),l&&s.jsx(n,{tone:"secondary",onClick:l.onClick,disabled:l.disabled,children:l.label})]}),i&&s.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:i})]})}function c({children:e,className:l}){return s.jsx(t,{padding:"md",elevation:"flat",className:l,children:e})}export{o as A,c as S};
1
+ import{j as s}from"./react-vendor-C7Sl8SE7.js";import{J as t,i as n,S as a}from"./index-DM13aQM5.js";function o({primary:e,secondary:l,tertiary:i}){return s.jsxs("div",{className:"flex flex-col gap-2 pt-1 sm:flex-row sm:flex-wrap sm:items-center sm:justify-between",children:[s.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e&&s.jsxs(n,{tone:"primary",onClick:e.onClick,disabled:e.disabled,children:[e.loading&&s.jsx(a,{}),e.label]}),l&&s.jsx(n,{tone:"secondary",onClick:l.onClick,disabled:l.disabled,children:l.label})]}),i&&s.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:i})]})}function c({children:e,className:l}){return s.jsx(t,{padding:"md",elevation:"flat",className:l,children:e})}export{o as A,c as S};
@@ -6,7 +6,7 @@
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg">
7
7
  <title>Pikiloom</title>
8
8
  <link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500&display=swap" rel="stylesheet">
9
- <script type="module" crossorigin src="/assets/index-DVC2D6tL.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-DM13aQM5.js"></script>
10
10
  <link rel="modulepreload" crossorigin href="/assets/react-vendor-C7Sl8SE7.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/router-DHISdpPk.js">
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-reSbuley.css">
@@ -105,12 +105,29 @@ function ensureDirSymlink(linkPath, targetDir) {
105
105
  const desiredReal = realPathOrNull(targetDir);
106
106
  if (currentTarget === desiredTarget || (currentReal && desiredReal && currentReal === desiredReal))
107
107
  return;
108
+ // Symlink points elsewhere — including dangling legacy targets like the
109
+ // pre-rename `../.pikiclaw/skills`. `rmSync(recursive,force)` silently
110
+ // no-ops on a dangling symlink (it follows the link, sees the target is
111
+ // gone, treats it as already deleted) and leaves the link in place, which
112
+ // then trips EEXIST below. `unlinkSync` removes the link itself reliably.
113
+ fs.unlinkSync(linkPath);
114
+ }
115
+ else {
116
+ fs.rmSync(linkPath, { recursive: true, force: true });
108
117
  }
109
- fs.rmSync(linkPath, { recursive: true, force: true });
110
118
  }
111
119
  catch { }
112
120
  fs.mkdirSync(path.dirname(linkPath), { recursive: true });
113
- fs.symlinkSync(desiredTarget, linkPath, process.platform === 'win32' ? 'junction' : 'dir');
121
+ try {
122
+ fs.symlinkSync(desiredTarget, linkPath, process.platform === 'win32' ? 'junction' : 'dir');
123
+ }
124
+ catch (err) {
125
+ // Tolerate a concurrent creator (the prod self-bootstrap and `npm run dev`
126
+ // can both initialize the same workdir) — if the link now resolves to the
127
+ // intended target, the race is benign; otherwise surface the real error.
128
+ if (err?.code !== 'EEXIST' || fs.readlinkSync(linkPath) !== desiredTarget)
129
+ throw err;
130
+ }
114
131
  }
115
132
  function copyMergedTree(sourceRoot, targetRoot, opts = {}) {
116
133
  for (const relPath of listRelativeFiles(sourceRoot)) {
@@ -241,9 +258,8 @@ function discoverSkillsFromDir(dir, scope, seen) {
241
258
  export function listSkills(workdir) {
242
259
  const seen = new Set();
243
260
  const { canonicalRoot, legacyRoots } = resolveProjectSkillRoots(workdir);
244
- // Project skills take precedence. Also scan pre-rename `.pikiloop/skills` and
245
- // `.pikiclaw/skills` so repos that committed project skills before the rename
246
- // keep working.
261
+ // Project skills take precedence. Also scan the pre-rename `.pikiclaw/skills`
262
+ // dir so repos that committed project skills before the rename keep working.
247
263
  const projectSkills = [
248
264
  ...discoverSkillsFromDir(canonicalRoot, 'project', seen),
249
265
  ...legacyRoots.flatMap(root => discoverSkillsFromDir(root, 'project', seen)),
@@ -33,9 +33,9 @@ const PLIST_LABEL = 'ai.pikiloom.gateway';
33
33
  const PLIST_DIR = path.join(os.homedir(), 'Library', 'LaunchAgents');
34
34
  const PLIST_PATH = path.join(PLIST_DIR, `${PLIST_LABEL}.plist`);
35
35
  const PIKILOOM_HOME = path.join(os.homedir(), STATE_DIR_NAME);
36
- // Pre-rename LaunchAgents (pikiloop, pikiclaw) — removed on (re)install so an
37
- // upgraded machine never runs two daemons. Delete a couple releases post-rename.
38
- const LEGACY_PLIST_LABELS = ['ai.pikiloop.gateway', 'ai.pikiclaw.gateway'];
36
+ // Pre-rename LaunchAgent (pikiclaw) — removed on (re)install so an upgraded
37
+ // machine never runs two daemons. Delete a couple releases post-rename.
38
+ const LEGACY_PLIST_LABELS = ['ai.pikiclaw.gateway'];
39
39
  const PROMPT_DELAY_MS = 3000;
40
40
  export const FROM_LAUNCHD_ENV = 'PIKILOOM_FROM_LAUNCHD';
41
41
  /**
@@ -168,9 +168,9 @@ async function bootstrapLaunchAgent(log) {
168
168
  }
169
169
  }
170
170
  /**
171
- * Remove pre-rename LaunchAgents (`ai.pikiloop.gateway`, `ai.pikiclaw.gateway`)
172
- * if present, so an upgraded install never runs two daemons. Best-effort; safe
173
- * when nothing is loaded. Delete a couple releases post-rename.
171
+ * Remove the pre-rename LaunchAgent (`ai.pikiclaw.gateway`) if present, so an
172
+ * upgraded install never runs two daemons. Best-effort; safe when nothing is
173
+ * loaded. Delete a couple releases post-rename.
174
174
  */
175
175
  async function cleanupLegacyAutostart(log) {
176
176
  const uid = process.getuid?.() ?? 0;
@@ -56,14 +56,13 @@ export const STATE_DIR_NAME = '.pikiloom';
56
56
  /** Env var prefix for all pikiloom-specific variables. */
57
57
  export const ENV_PREFIX = 'PIKILOOM_';
58
58
  /**
59
- * Pre-rename identifiers, newest-first. The project shipped briefly as `pikiloop`
60
- * and before that `pikiclaw`; both are kept ONLY for the one-time state-dir
59
+ * Pre-rename identifier (`pikiclaw`). Kept ONLY for the one-time state-dir
61
60
  * migration, the env-var fallback (see core/legacy-compat.ts) and project-skill
62
- * discovery, so installs created under either old name are never orphaned. Safe
63
- * to drop a couple of releases after the rename has propagated.
61
+ * discovery, so the real pikiclaw install base is never orphaned. Kept as lists
62
+ * so a future rename only appends one entry. Drop a couple releases later.
64
63
  */
65
- export const LEGACY_STATE_DIR_NAMES = ['.pikiloop', '.pikiclaw'];
66
- export const LEGACY_ENV_PREFIXES = ['PIKILOOP_', 'PIKICLAW_'];
64
+ export const LEGACY_STATE_DIR_NAMES = ['.pikiclaw'];
65
+ export const LEGACY_ENV_PREFIXES = ['PIKICLAW_'];
67
66
  /**
68
67
  * Stable relative path for the managed Chrome profile under the home directory.
69
68
  * Keep this outside config-specific directories so `npm run dev` and the main
@@ -1,11 +1,10 @@
1
1
  /**
2
2
  * One-time backward-compat shims for the project rename.
3
3
  *
4
- * The orchestrator shipped as `pikiclaw`, briefly as `pikiloop`, and is now
5
- * `pikiloom`. Both run once at process startup — BEFORE any config is read or
6
- * any lock / PID file is taken — so installs created under either old name keep
7
- * their settings, credentials, managed browser profile and skills with zero
8
- * user action.
4
+ * The orchestrator shipped as `pikiclaw` and is now `pikiloom`. Both run once at
5
+ * process startup — BEFORE any config is read or any lock / PID file is taken —
6
+ * so existing `pikiclaw` installs keep their settings, credentials, managed
7
+ * browser profile and skills with zero user action.
9
8
  *
10
9
  * Remove this file (and the LEGACY_* constants) a couple of releases after the
11
10
  * rename has propagated.
@@ -15,11 +14,10 @@ import os from 'node:os';
15
14
  import path from 'node:path';
16
15
  import { STATE_DIR_NAME, LEGACY_STATE_DIR_NAMES, ENV_PREFIX, LEGACY_ENV_PREFIXES, } from './constants.js';
17
16
  /**
18
- * Mirror every legacy-prefixed env var (`PIKILOOP_*`, `PIKICLAW_*`) onto the
19
- * matching `PIKILOOM_*` name when the new name is unset. Covers user-set vars
20
- * (shell profiles, docker-compose, systemd units) AND internal ones a still-old
21
- * parent process may have set across an upgrade boundary. Legacy prefixes are
22
- * applied newest-first, so the most recent name wins when both are present.
17
+ * Mirror every legacy-prefixed env var (`PIKICLAW_*`) onto the matching
18
+ * `PIKILOOM_*` name when the new name is unset. Covers user-set vars (shell
19
+ * profiles, docker-compose, systemd units) AND internal ones a still-old parent
20
+ * process may have set across an upgrade boundary.
23
21
  */
24
22
  export function hydrateLegacyEnv() {
25
23
  for (const legacy of LEGACY_ENV_PREFIXES) {
@@ -35,8 +33,7 @@ export function hydrateLegacyEnv() {
35
33
  }
36
34
  }
37
35
  /**
38
- * Migrate the first existing legacy state dir (`~/.pikiloop`, then
39
- * `~/.pikiclaw`) → `~/.pikiloom`, exactly once.
36
+ * Migrate the legacy state dir (`~/.pikiclaw`) → `~/.pikiloom`, exactly once.
40
37
  *
41
38
  * No-op when the new dir already exists (migrated or fresh install) or no legacy
42
39
  * dir is present (brand-new user). A same-volume rename is atomic; on a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pikiloom",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "Put the world's smartest AI agents in your pocket. Command local Claude & Gemini via IM. | 让最好用的 IM 变成你电脑上的顶级 Agent 控制台",
5
5
  "type": "module",
6
6
  "bin": {