pikiloom 0.4.42 → 0.4.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/dashboard/dist/assets/{AgentTab-B9z4W2mh.js → AgentTab-B8V2eV_D.js} +1 -1
  2. package/dashboard/dist/assets/{ConnectionModal-2bL7sFKk.js → ConnectionModal-BOVwXLJB.js} +1 -1
  3. package/dashboard/dist/assets/{DirBrowser-CA4k8E_A.js → DirBrowser-DbeAWYiL.js} +1 -1
  4. package/dashboard/dist/assets/{ExtensionsTab-CRjTmFRl.js → ExtensionsTab-BMS3PW9N.js} +1 -1
  5. package/dashboard/dist/assets/{IMAccessTab-DDb7rsHe.js → IMAccessTab-B1sRgJk3.js} +1 -1
  6. package/dashboard/dist/assets/{Modal-DDiBG4kb.js → Modal-DCwGz46r.js} +1 -1
  7. package/dashboard/dist/assets/{Modals-CsUQjpxn.js → Modals-Bh_0en5P.js} +1 -1
  8. package/dashboard/dist/assets/{Select-CG_7h_Tz.js → Select-DC6zguGC.js} +1 -1
  9. package/dashboard/dist/assets/{SessionPanel-B5964GUj.js → SessionPanel-DNlLd-PL.js} +1 -1
  10. package/dashboard/dist/assets/{SystemTab-D7r1PsC9.js → SystemTab-uFqZinIZ.js} +1 -1
  11. package/dashboard/dist/assets/{index-BbplxgnQ.js → index-CL5H13Cl.js} +2 -2
  12. package/dashboard/dist/assets/index-DooLxbPX.js +23 -0
  13. package/dashboard/dist/assets/{shared-Bv8WvQSo.js → shared-Byy2BNLq.js} +1 -1
  14. package/dashboard/dist/index.html +1 -1
  15. package/dist/agent/accounts.js +2 -2
  16. package/dist/agent/drivers/claude.js +84 -38
  17. package/dist/agent/drivers/codex.js +30 -2
  18. package/dist/agent/kernel-bridge.js +18 -2
  19. package/dist/dashboard/routes/accounts.js +7 -0
  20. package/dist/dashboard/routes/agents.js +1 -1
  21. package/package.json +1 -1
  22. package/packages/kernel/dist/drivers/claude.d.ts +3 -1
  23. package/packages/kernel/dist/drivers/claude.js +126 -9
  24. package/packages/kernel/dist/drivers/codex.js +15 -3
  25. package/dashboard/dist/assets/index-CULTTvtY.js +0 -23
@@ -0,0 +1,23 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionPanel-DNlLd-PL.js","assets/react-vendor-C7Sl8SE7.js","assets/index-CL5H13Cl.js","assets/router-DHISdpPk.js","assets/index-DwmXPtDd.css","assets/Modal-DCwGz46r.js","assets/Select-DC6zguGC.js","assets/DirBrowser-DbeAWYiL.js","assets/markdown-DxQYQFeH.js","assets/ExtensionsTab-BMS3PW9N.js"])))=>i.map(i=>d[i]);
2
+ import{c as L,a as re,u as ie,i as Ft,f as At,A as js,s as Ut,S as fe,B as ct,g as dn,w as ws,b as ks,C as fn,d as ys,r as Ln,e as In,h as Ns,n as Ss,j as Cs,k as Pn,l as $t,m as We,D as Gt,o as Ls,p as Wn,_ as Bn,T as Is,q as Ts}from"./index-CL5H13Cl.js";import{j as e,r as o,a as gn}from"./react-vendor-C7Sl8SE7.js";import{I as Es}from"./Select-DC6zguGC.js";import{M as zt,a as Kt}from"./Modal-DCwGz46r.js";import{D as Ms}from"./DirBrowser-DbeAWYiL.js";import{n as As,r as _s,M as mn}from"./markdown-DxQYQFeH.js";import{WorkspaceExtensionsBody as Rs}from"./ExtensionsTab-BMS3PW9N.js";function Ps({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 dt({open:t,onToggle:n,dot:s,label:l,preview:r,badge:c,collapsedContent:p,children:d,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:l}),e.jsx("span",{className:"flex-1 min-w-0 overflow-hidden",children:r}),c,e.jsx(Ps,{open:t})]}),!t&&p,t&&d&&e.jsx("div",{className:"border-t border-edge",children:d})]})}const Ws=5e3,Bs=15e3,Ot=8,Dt=30,$s=1,at=new Map,Ce=new Map,on=new Set,$n=[];let _t=0;function ln(t){return typeof t=="number"&&Number.isFinite(t)}function qe(t,n,s,l){for(t.delete(n),t.set(n,s);t.size>l;){const r=t.keys().next().value;if(!r)break;t.delete(r)}}function On(t,n){const s=t.get(n);return!s?.value||s.expiresAt<=Date.now()?null:(qe(t,n,s,t===Ce?Dt:Ot),s.value)}function Dn(t){return{workdir:t.workdir,agent:t.agent,sessionId:t.sessionId,rich:t.rich??!0,lastNTurns:ln(t.lastNTurns)?t.lastNTurns:void 0,turnOffset:ln(t.turnOffset)?t.turnOffset:void 0,turnLimit:ln(t.turnLimit)?t.turnLimit:void 0}}function bn(t){const n=Dn(t);return[n.workdir,n.agent,n.sessionId,n.rich?"rich":"plain",n.lastNTurns??"",n.turnOffset??"",n.turnLimit??""].join("::")}function Fn(){for(;_t<$s;){const t=$n.shift();if(!t)return;_t+=1,t().finally(()=>{_t=Math.max(0,_t-1),Fn()})}}async function Os(t,n={}){const s=t;if(!n.force){const c=On(at,s);if(c)return c}const l=at.get(s);if(l?.promise)return l.promise;const r=re.getWorkspaceSessions(t,n.request).then(c=>(qe(at,s,{value:c,expiresAt:c.ok?Date.now()+Ws:0},Ot),c)).finally(()=>{const c=at.get(s);c?.promise&&qe(at,s,{value:c.value,expiresAt:c.expiresAt},Ot)});return qe(at,s,{value:l?.value,expiresAt:l?.expiresAt??0,promise:r},Ot),r}function Ds(t,n={}){const s=bn(t),l=Ce.get(s);return l?.value?.ok&&(n.allowStale||l.expiresAt>Date.now())?l.value:null}async function Fs(t,n={}){const s=Dn(t),l=bn(s);if(!n.force){const p=On(Ce,l);if(p?.ok)return p}const r=Ce.get(l);if(r?.promise)return r.promise;const c=re.getSessionMessages(s.workdir,s.agent,s.sessionId,{rich:s.rich,lastNTurns:s.lastNTurns,turnOffset:s.turnOffset,turnLimit:s.turnLimit},n.request).then(p=>(qe(Ce,l,{value:p,expiresAt:p.ok?Date.now()+Bs:0},Dt),p)).finally(()=>{const p=Ce.get(l);p?.promise&&qe(Ce,l,{value:p.value,expiresAt:p.expiresAt},Dt)});return qe(Ce,l,{value:r?.value,expiresAt:r?.expiresAt??0,promise:c},Dt),c}function Us(t){const n=bn(t);Ds(t)||on.has(n)||Ce.get(n)?.promise||(on.add(n),$n.push(async()=>{try{await Fs(t)}catch{}finally{on.delete(n)}}),Fn())}function ko(t){const n=t.streaming||t.liveStreamPhase==="streaming",s=t.queuedTaskCount>0||t.pendingQueuedCount>0||t.streamPhase==="queued";return n||s}function yo(t){const{pendingTaskId:n,streamTaskId:s,queuedTaskIds:l}=t;return!n||n===s?!1:!!l&&l.includes(n)}function zs(t){const{queuedTaskIds:n,streamPhase:s,streamTaskId:l,localTaskId:r}=t,c=[];n&&n.length&&c.push(...n),s==="queued"&&l&&!c.includes(l)&&c.unshift(l),r&&!c.includes(r)&&(s==="queued"||!s)&&c.push(r);const p=s==="streaming"?l??null:null;return p?c.filter(d=>d!==p):c}function No(t,n){return t==null||n==null?!0:t===n}function Ht(t){return(t||"").replace(/\s+/g," ").trim()}function Ks(t,n){return Ht(t)===Ht(n)}function So(t,n){if(Ks(t,n))return!0;const s=Ht(t),l=Ht(n);if(!s||!l||s.length>=l.length||!/(?:\.\.\.|…)$/.test(s))return!1;const r=s.replace(/(?:\s*(?:\.\.\.|…))+$/,"").trim(),c=r.length-4;return c<32?!1:l.startsWith(r.slice(0,c))}function Co(t){const n=t.richMessages?.length?t.richMessages:t.messages?.map(p=>({role:p.role,text:p.text,blocks:[{type:"text",content:p.text}]}))||[],s=Vs(n),l=Math.max(t.window?.totalTurns??t.totalTurns??s.length,s.length),r=t.window?.endTurn??l,c=t.window?.startTurn??Math.max(0,r-s.length);return{turns:s,startTurn:c,endTurn:r,totalTurns:l,hasOlder:t.window?.hasOlder??c>0}}function Lo(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 Io(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 Hs(t,n){const s=[t.text,n.text].filter(Boolean);return{role:t.role,text:s.join(`
3
+
4
+ `),blocks:[...t.blocks,...n.blocks],usage:n.usage??t.usage??null}}function Vs(t){const n=[];let s={user:null,assistant:null};for(const l of t)if(l.role==="user"){if(s.assistant&&Un(l.text))continue;(s.user||s.assistant)&&(n.push(s),s={user:null,assistant:null}),s.user=l}else s.assistant?s.assistant=Hs(s.assistant,l):s.assistant=l;return(s.user||s.assistant)&&n.push(s),n}const Gs=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"]),qs=["continued from a previous","summary below covers","earlier portion of the conversation","Summary:","Key Technical Concepts"];function Un(t){const s=t.trim().match(/^<([a-z][a-z0-9_-]*)\b/i);return s&&Gs.has(s[1].toLowerCase())?!0:qs.some(l=>t.includes(l))}function vn(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}function zn(t){return`${vn(t)} tok`}function Kn(t){return t>=85?"bg-rose-400/70":t>=60?"bg-amber-400/70":"bg-emerald-400/70"}function Qs(t){const n=Math.floor(t/1e3);if(n<60)return`${n}s`;const s=Math.floor(n/60),l=n%60;return s<60?`${s}m${l.toString().padStart(2,"0")}s`:`${Math.floor(s/60)}h${(s%60).toString().padStart(2,"0")}m`}function Hn(t,n){const s=t.split(`
5
+ `).filter(l=>l.trim());return s.length<=n?s.join(`
6
+ `):s.slice(-n).join(`
7
+ `)}function Ys(t){const n=String(t||"").trim().toLowerCase();return n?n.startsWith("interrupted by user")?"interrupted":n.startsWith("timed out")||n.startsWith("stopped before completion")||n.includes("max tokens")?"incomplete":"error":"error"}function an(t){return{id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,file:t,previewUrl:URL.createObjectURL(t)}}function Xs(t){for(const n of t)URL.revokeObjectURL(n.previewUrl)}const Zs=/\.(png|jpe?g|gif|webp|bmp|svg|avif|heic|heif|tiff?|ico)$/i;function Tn(t){return t.type?t.type.startsWith("image/"):Zs.test(t.name||"")}function Js(t){const n=[],s=/<img\b[^>]*?\bsrc\s*=\s*["'](data:image\/[^"']+)["']/gi;let l;for(;l=s.exec(t);)n.push(l[1]);return n}function er(t,n="pasted-image"){const s=/^data:(image\/[a-z0-9.+-]+);base64,(.*)$/is.exec(t.trim());if(!s)return null;const l=s[1].toLowerCase();try{const r=atob(s[2].replace(/\s+/g,"")),c=new Uint8Array(r.length);for(let d=0;d<r.length;d++)c[d]=r.charCodeAt(d);const p=l.split("/")[1]?.split("+")[0]||"png";return new File([c],`${n}.${p}`,{type:l})}catch{return null}}async function tr(){try{if(typeof navigator>"u"||!navigator.clipboard?.read)return[];const t=await navigator.clipboard.read(),n=[];for(const s of t){const l=s.types.find(p=>p.startsWith("image/"));if(!l)continue;const r=await s.getType(l),c=l.split("/")[1]?.split("+")[0]||"png";n.push(new File([r],`pasted-image.${c}`,{type:l}))}return n}catch{return[]}}function Vn(t){if(!Number.isFinite(t)||t<=0)return"0 B";if(t<1024)return`${t} B`;const n=t/1024;if(n<1024)return`${n.toFixed(n>=100?0:1)} KB`;const s=n/1024;return`${s.toFixed(s>=100?0:1)} MB`}async function nr(t){if(typeof ClipboardItem>"u"||!navigator.clipboard?.write)return!1;try{return await navigator.clipboard.write([new ClipboardItem({[t.type||"image/png"]:t})]),!0}catch{return!1}}function Y(t,n=120){if(t==null)return"";const l=(typeof t=="string"?t:String(t)).replace(/\s+/g," ").trim();return l.length<=n?l:l.slice(0,Math.max(0,n-1))+"…"}function sr(t){if(!t)return null;try{const n=JSON.parse(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}function Gn(t){const n=String(t.toolName||"").trim()||"Tool",s=sr(t.content);if(!s)return n;const l=Y(s.description,120);switch(n){case"Read":{const r=Y(s.file_path||s.path,140);return r?`Read ${r}`:"Read"}case"Edit":{const r=Y(s.file_path||s.path,140);return r?`Edit ${r}`:"Edit"}case"Write":{const r=Y(s.file_path||s.path,140);return r?`Write ${r}`:"Write"}case"Glob":{const r=Y(s.pattern||s.glob,120);return r?`Glob ${r}`:"Glob"}case"Grep":{const r=Y(s.pattern||s.query,120);return r?`Grep ${r}`:"Grep"}case"WebFetch":{const r=Y(s.url,120);return r?`WebFetch ${r}`:"WebFetch"}case"WebSearch":{const r=Y(s.query,120);return r?`WebSearch ${r}`:"WebSearch"}case"TodoWrite":return"Update plan";case"AskUserQuestion":{const c=(Array.isArray(s.questions)?s.questions:[])[0],p=Y(c?.question||s.question,120);return p?`Ask user: ${p}`:"Ask user"}case"Task":{const r=Y(s.description||s.prompt,120);return r?`Task: ${r}`:"Task"}case"Bash":{if(l)return`Bash: ${l}`;const r=Y(s.command,120);return r?`Bash: ${r}`:"Bash"}case"exec_command":case"shell":case"local_shell":{const r=Y(s.cmd||s.command,140);return r?`Run shell: ${r}`:"Run shell"}case"apply_patch":{const r=Y(s.path||s.file_path,140);return r?`Edit ${r}`:"Edit files"}default:{const r=n.match(/^mcp__[^_]+__(.+)$/),c=r?r[1]:n;if(c==="im_send_file"){const d=Y(s.path,120);return d?`Send file: ${d}`:"Send file"}if(c==="im_list_files")return"List workspace files";if(l)return`${n}: ${l}`;const p=Y(s.file_path||s.path||s.command||s.query||s.pattern||s.url,120);return p?`${n}: ${p}`:n}}}function rr(t){const n=(t.content||"").trim();if(!n)return"result";const s=n.split(`
8
+ `).map(l=>l.trim()).find(Boolean)||"";return s?Y(s,140):"result"}function or(t){const n=t.indexOf(":");if(n<=0)return null;const s=t.slice(0,n).trim(),l=t.slice(n+1).trim();return!s||!l?null:{agent:s,sessionId:l}}const mt=new Map;function ir(t,n){return`${t}:${n}`}const lr=[],ar=[],cr={};function dr(t){const n=(()=>{try{return new URL(t.baseURL).host.toLowerCase()}catch{return""}})();return n.includes("openrouter")?"openrouter":n.includes("anthropic")?"anthropic":n.includes("deepseek")?"deepseek":n.includes("googleapis")||n.includes("vertex")?"google":n.includes("openai.com")?"openai":n.includes("dashscope")||n.includes("qwen")||n.includes("aliyun")?"qwen":n.includes("volces")||n.includes("volcengine")||n.includes("doubao")?"doubao":n.includes("bigmodel")||n.includes("zhipu")||n.includes("z.ai")?"glm":n.includes("minimax")?"minimax":t.kind==="anthropic"?"anthropic":t.kind==="google"?"google":t.kind==="openai"?"openai":"custom"}const ur=o.memo(function({session:n,workdir:s,onStreamQueued:l,onSendStart:r,onSendTaskAssigned:c,onSessionChange:p,t:d,streamPhase:m,streamTaskId:b,queuedTaskIds:g,queuedTasks:v,pendingQueuedSends:k,onRecall:y,onSteer:$,onStopAll:A,editDraft:W,onEditDraftConsumed:O,onSelectionChange:K}){const[H,Z]=o.useState(""),[T,V]=o.useState(!1),[_,D]=o.useState(null),[C,E]=o.useState(()=>new Set),[he,le]=o.useState(()=>new Set),Q=o.useRef({prompt:"",files:[]}),Le=ie(a=>a.agentStatus?.agents??null),[G,bt]=o.useState(Le||[]),[ge,ht]=o.useState(""),[Qe,Ye]=o.useState(""),[te,$e]=o.useState(void 0),[Oe,Xe]=o.useState(""),[ne,De]=o.useState([]),[me,Ze]=o.useState(null),[Ie,vt]=o.useState(null),[be,ae]=o.useState(null),[Je,Te]=o.useState(null),[jt,Ee]=o.useState(null),[ve,je]=o.useState(void 0),[M,pe]=o.useState("closed"),[J,wt]=o.useState(null),Me=o.useRef(null),et=o.useRef(!1),Fe=o.useRef(null),Qt=o.useRef(null),xe=o.useRef(null),we=o.useRef([]),[ke,kt]=o.useState([]),[ce,Ue]=o.useState(!1),[tt,nt]=o.useState(0),st=o.useRef(null),Ae=ie(a=>a.refreshAgentStatus),ye=ie(a=>a.modelLayer),ze=ie(a=>a.ensureModelLayer),pt=ie(a=>a.refreshModelLayer),de=ye?.providers??lr,rt=ye?.profiles??ar,ot=ye?.activeProfiles??cr;o.useEffect(()=>{ze()},[ze]),o.useEffect(()=>{Le?.length&&bt(Le)},[Le]),o.useEffect(()=>{we.current=ne},[ne]);const oe=ir(n.agent||"",n.sessionId),_e=o.useRef(oe);_e.current=oe,o.useEffect(()=>{const a=mt.get(oe);return a&&(mt.delete(oe),a.text&&Z(a.text),a.files.length&&De(a.files.map(an))),()=>{const f=Me.current?.value||"",j=we.current.map(I=>I.file);for(const I of we.current)URL.revokeObjectURL(I.previewUrl);f||j.length?mt.set(_e.current,{text:f,files:j}):mt.delete(_e.current)}},[oe]);const yt=o.useRef({agent:n.agent||"",sessionId:n.sessionId});o.useEffect(()=>{const a=yt.current,f={agent:n.agent||"",sessionId:n.sessionId};yt.current=f,!(a.agent===f.agent&&Ft(a.sessionId)&&!Ft(f.sessionId))&&(ht(""),Ye(""),$e(void 0),Xe(""),ae(null),Te(null),Ee(null),pe("closed"))},[n.agent,n.sessionId]),o.useEffect(()=>{W!=null&&(Z(W),O?.(),requestAnimationFrame(()=>{const a=Me.current;a&&(a.focus(),a.setSelectionRange(W.length,W.length))}))},[W,O]),o.useEffect(()=>{if(!s)return;let a=!1;return re.getSkills(s).then(f=>{!a&&f.ok&&kt(f.skills)}).catch(()=>{}),()=>{a=!0}},[s]);const xt=ce?(()=>{const a=H.match(/^\/(\S*)$/);return a?a[1].toLowerCase():null})():null,Ne=xt!==null?ke.filter(a=>a.name.toLowerCase().includes(xt)||a.label&&a.label.toLowerCase().includes(xt)):[];o.useEffect(()=>{nt(0)},[ce,H]),o.useEffect(()=>{if(!ce||!st.current)return;const a=st.current.querySelector(`[data-skill-idx="${tt}"]`);a&&a.scrollIntoView({block:"nearest"})},[tt,ce]),o.useEffect(()=>{if(!ce)return;const a=f=>{st.current?.contains(f.target)||Me.current?.contains(f.target)||Ue(!1)};return document.addEventListener("mousedown",a),()=>document.removeEventListener("mousedown",a)},[ce]),o.useEffect(()=>{if(M==="closed")return;const a=f=>{const j=f.target;xe.current?.contains(j)||document.getElementById("cascade-portal")?.contains(j)||(pe("closed"),ae(null),Te(null),Ee(null))};return document.addEventListener("mousedown",a),()=>document.removeEventListener("mousedown",a)},[M]),o.useLayoutEffect(()=>{if(M==="closed"||!xe.current){wt(null);return}const a=xe.current.getBoundingClientRect();wt({left:a.left,bottom:window.innerHeight-a.top+8})},[M]);const Nt=g&&g.length?g[0]:null;o.useEffect(()=>{_&&(Nt||m!==null&&m!=="queued")&&D(null)},[m,_,Nt]),o.useEffect(()=>{const a=Me.current;a&&(a.style.height="auto",a.style.height=Math.min(a.scrollHeight,200)+"px")},[H]);const Ke=o.useCallback(a=>{const f=Array.from(a||[]).filter(Tn);f.length&&De(j=>[...j,...f.map(an)])},[]),St=o.useCallback(()=>{Ze(null),De(a=>(Xs(a),[]))},[]),Ct=o.useCallback(a=>{De(f=>{const j=f.find(I=>I.id===a);return j&&URL.revokeObjectURL(j.previewUrl),f.filter(I=>I.id!==a)}),Ze(f=>f===a?null:f)},[]),Lt=o.useCallback(()=>{const a=H.trim(),f=ne.map(ee=>ee.file);if(!a&&f.length===0||T)return;const j=ge||n.agent||G.find(ee=>ee.isDefault)?.agent||"";if(!j)return;const I=G.find(ee=>ee.agent===j)||null,z=!!n.agent&&j===n.agent,se=(Qe||z&&n.model||""||I?.selectedModel||"").trim()||null,Se=te!==void 0?te:z&&n.model?n.profileId??null:void 0,Pe=j==="gemini"?null:(Oe||(z?At(j,n.thinkingEffort,n.workflowEnabled):"")||At(j,I?.selectedEffort,I?.workflowEnabled)||"").trim()||null,B=j!==n.agent,X=B?"":n.sessionId,rn=B&&n.agent?n.agent:null,bs=B&&n.sessionId?n.sessionId:null;V(!0),Q.current={prompt:a,files:f},Z(""),mt.delete(_e.current);const vs=f.length?f.map(ee=>URL.createObjectURL(ee)):void 0;St(),r(a,vs),l(),re.sendSessionMessage(s,j,X,a,{attachments:f,model:se,profileId:Se,effort:Pe,previousAgent:rn,previousSessionId:bs}).then(ee=>{if(ee.taskId&&(D(ee.taskId),c?.(ee.taskId)),!ee.ok)return;const gt=typeof ee.sessionKey=="string"?or(ee.sessionKey):null;gt&&(gt.agent!==n.agent||gt.sessionId!==n.sessionId)&&gt&&p?.({...gt,workdir:s})}).catch(()=>{}).finally(()=>V(!1))},[G,St,ne,H,r,c,p,l,ge,Oe,Qe,te,T,n.agent,n.sessionId,n.model,n.profileId,s]),It=m==="streaming",ue=zs({queuedTaskIds:g,streamPhase:m,streamTaskId:b,localTaskId:_}),Tt=ue[ue.length-1]||null,ft=ue.length>0,Yt=ft||It;o.useEffect(()=>{const a=f=>ue.includes(f)||f===b;E(f=>{let j=!1;const I=new Set;for(const z of f)a(z)?I.add(z):j=!0;return j?I:f}),le(f=>{let j=!1;const I=new Set;for(const z of f)a(z)?I.add(z):j=!0;return j?I:f})},[ue,b]),o.useEffect(()=>{!ft&&Q.current.files.length&&(Q.current={prompt:"",files:[]})},[ft]);const Xt=o.useCallback(a=>{if(!C.has(a)){if(E(f=>{const j=new Set(f);return j.add(a),j}),a===Tt){const f=Q.current;f.prompt&&Z(f.prompt),f.files.length&&De(f.files.map(an)),Q.current={prompt:"",files:[]}}y?.(a),a===_&&D(null)}},[C,Tt,_,y]),[it,i]=o.useState(!1),h=o.useCallback(async()=>{if(!(it||!A)){i(!0);try{await A()}finally{i(!1)}}},[it,A]),u=o.useCallback(a=>{he.has(a)||(le(f=>{const j=new Set(f);return j.add(a),j}),$?.(a),a===_&&D(null))},[he,_,$]),x=o.useCallback(a=>{Z(`/${a.name} `),Ue(!1),requestAnimationFrame(()=>{const f=Me.current;f&&(f.focus(),f.setSelectionRange(f.value.length,f.value.length))})},[]),w=o.useCallback(a=>{Z(a);const f=/^\/\S*$/.test(a)&&ke.length>0;Ue(f)},[ke.length]),N=a=>{if(ce&&Ne.length>0){if(a.key==="ArrowDown"){a.preventDefault(),nt(f=>(f+1)%Ne.length);return}if(a.key==="ArrowUp"){a.preventDefault(),nt(f=>(f-1+Ne.length)%Ne.length);return}if(a.key==="Tab"||a.key==="Enter"&&!a.shiftKey&&!et.current){a.preventDefault(),x(Ne[tt]);return}if(a.key==="Escape"){a.preventDefault(),Ue(!1);return}}a.key==="Enter"&&!a.shiftKey&&!et.current&&(a.preventDefault(),Lt())},S=o.useCallback(a=>{const f=a.clipboardData;if(!f)return;const j=Array.from(f.items).filter(B=>B.kind==="file").map(B=>B.getAsFile()).filter(B=>!!B&&Tn(B));if(j.length){a.preventDefault(),Ke(j);return}const I=f.getData("text/html"),z=I?Js(I):[],se=(f.getData("text/uri-list")||f.getData("text/plain")||"").trim();/^data:image\//i.test(se)&&z.push(se);const Se=z.map(B=>er(B)).filter(B=>!!B);if(Se.length){a.preventDefault(),Ke(Se);return}(Array.from(f.items).some(B=>B.kind==="file")||Array.from(f.types||[]).some(B=>B==="Files"||B.startsWith("image/")))&&!se&&(a.preventDefault(),tr().then(B=>{B.length&&Ke(B)}))},[Ke]),R=ge||n.agent||G.find(a=>a.isDefault)?.agent||G.find(a=>a.installed)?.agent||G[0]?.agent||"",U=G.find(a=>a.agent===R)||null,P=be||R,F=G.find(a=>a.agent===P)||U,Re=o.useMemo(()=>{if(!F)return[];const a=[];for(const j of F.models||[])a.push({id:j.id,label:j.id,kind:"native",description:j.alias&&j.alias.toLowerCase()!==j.id.toLowerCase()?j.alias:void 0});const f=new Set(js[P]||[]);for(const j of rt){const I=de.find(se=>se.id===j.providerId);if(!I||!f.has(I.kind))continue;const z=j.name.trim().toLowerCase()!==j.modelId.trim().toLowerCase();a.push({id:j.modelId,label:j.name,kind:"profile",profileId:j.id,description:z?`${I.name} · ${j.modelId}`:I.name})}return a},[F,P,rt,de]),yn=o.useMemo(()=>Re.findIndex(a=>a.kind==="profile"),[Re]),cs=ot[P]||null,Zt=!!n.agent&&R===n.agent,Et=te!==void 0?te:Zt?n.profileId??null:void 0,Mt=Qe||Zt&&n.model||""||U?.selectedModel||"",Jt=R==="gemini"?"":Oe||(Zt?At(R,n.thinkingEffort,n.workflowEnabled):"")||At(R,U?.selectedEffort,U?.workflowEnabled)||"";o.useEffect(()=>{K?.({model:Mt||null,effort:Jt||null})},[Mt,Jt,K]);const ds=U?.effortOptions??[],He=me&&ne.find(a=>a.id===me)||null,us=He?{key:He.id,url:He.previewUrl,name:He.file.name,size:He.file.size,file:He.file,onRemove:()=>Ct(He.id)}:Ie?{key:Ie,url:Ie}:null,Nn=(!!H.trim()||ne.length>0)&&!T&&!!R,en=()=>{ae(null),Te(null),Ee(null),je(void 0)},Sn=o.useCallback((a,f,j)=>{ht(a),Ye(f),j!==void 0&&$e(j),a!==R&&Xe(""),en(),pe("closed")},[R]),hs=o.useCallback(a=>{Xe(a),Ee(null)},[]),ps=()=>{M==="closed"?(en(),Ae(),pt(),pe("agent")):(en(),pe("closed"))},tn=be||R,Cn=dn(tn),nn=Je??Mt,xs=jt??Jt,fs=nn?Ut(nn):"",Ve=(()=>{const a=!be&&Et!==void 0?Et:ot[tn]??null;return a?rt.find(f=>f.id===a)??null:null})(),lt=Ve?de.find(a=>a.id===Ve.providerId)??null:null,gs=lt?dr(lt):null,sn=Ve?Ve.name.trim().toLowerCase()!==Ve.modelId.trim().toLowerCase()?Ve.name:Ut(Ve.modelId):fs,ms=[Cn.shortLabel,lt?lt.name:null,sn||null].filter(Boolean).join(" / ");return e.jsxs("div",{className:"shrink-0",ref:Qt,children:[e.jsxs("div",{className:"max-w-[680px] mx-auto px-5 pb-4 pt-2",children:[Yt&&e.jsxs("div",{className:"mb-2 space-y-1.5",children:[It&&e.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-primary/20 bg-primary/[0.04] px-3.5 py-1.5 transition-colors",children:[e.jsx(fe,{className:"h-3 w-3 text-primary shrink-0"}),e.jsx("span",{className:"flex-1 min-w-0 text-[12px] font-medium text-fg-3 truncate",children:d("hub.running")}),e.jsxs("button",{onClick:h,disabled:it,title:d("hub.stopHint"),className:"flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-medium text-fg-4 hover:text-err hover:bg-err/10 transition-colors disabled:opacity-30 disabled:pointer-events-none shrink-0",children:[it?e.jsx(fe,{className:"h-2.5 w-2.5"}):e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("rect",{x:"4",y:"4",width:"16",height:"16",rx:"2"})}),d("hub.stop")]})]}),ue.map((a,f)=>{const j=f===ue.length-1,I=he.has(a),z=I?d("hub.steering"):ue.length>1?`${d("hub.queued")} #${f+1}`:d("hub.queued"),se=k?.find(X=>X.taskId===a)||(j?k?.find(X=>!X.taskId):void 0),Se=v?.find(X=>X.taskId===a)||null,Pe=Se?.prompt||se?.prompt||null,B=se?.imageUrls?.length?se.imageUrls:(Se?.attachments||[]).filter(X=>X.type==="image").map(X=>X.content);return e.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-warn/25 bg-warn/[0.04] px-3.5 py-1.5 transition-colors",children:[I?e.jsx(fe,{className:"h-3 w-3 text-warn shrink-0"}):e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-warn animate-pulse shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0 flex items-center gap-2",children:[e.jsx("span",{className:"text-[12px] font-medium text-warn shrink-0",children:z}),B.length>0&&e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[B.slice(0,3).map((X,rn)=>e.jsx("button",{type:"button",onClick:()=>vt(X),title:d("hub.previewImage"),className:"block h-5 w-5 shrink-0 overflow-hidden rounded border border-warn/30 transition-opacity hover:opacity-80",children:e.jsx("img",{src:X,alt:"",className:"h-full w-full object-cover"})},`${X}-${rn}`)),B.length>3&&e.jsxs("span",{className:"text-[10px] text-fg-5/60",children:["+",B.length-3]})]}),Pe&&e.jsx("span",{className:"text-[11px] text-fg-5/60 truncate",children:Pe})]}),!I&&e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsxs("button",{onClick:()=>u(a),title:d("hub.steerHint"),className:"flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-medium text-fg-4 hover:text-blue-400 hover:bg-blue-400/10 transition-colors disabled:opacity-30 disabled:pointer-events-none",children:[e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",children:e.jsx("polyline",{points:"9 6 15 12 9 18"})}),d("hub.steer")]}),e.jsxs("button",{onClick:()=>Xt(a),disabled:C.has(a),title:d("hub.recallHint"),className:"flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-medium text-fg-4 hover:text-err hover:bg-err/10 transition-colors disabled:opacity-30 disabled:pointer-events-none",children:[C.has(a)?e.jsx(fe,{className:"h-2.5 w-2.5"}):e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",children:[e.jsx("path",{d:"M18 6 6 18"}),e.jsx("path",{d:"M6 6l12 12"})]}),d("hub.recall")]})]})]},a)})]}),e.jsxs("div",{className:"relative rounded-xl border border-edge/40 bg-panel shadow-sm transition-[border-color,box-shadow] duration-200 focus-within:border-fg-5/40 focus-within:shadow-md",children:[e.jsx("input",{ref:Fe,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:a=>{Ke(a.target.files),a.target.value=""}}),ne.length>0&&e.jsx("div",{className:"px-4 pt-3",children:e.jsx("div",{className:"flex gap-2 overflow-x-auto pb-1",children:ne.map(a=>e.jsxs("div",{className:"relative shrink-0",children:[e.jsxs("button",{type:"button",onClick:()=>Ze(a.id),title:d("hub.previewImage"),className:"group relative h-[72px] w-[72px] overflow-hidden rounded-lg border border-edge/30 bg-panel-alt/30",children:[e.jsx("img",{src:a.previewUrl,alt:a.file.name,className:"h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.03]"}),e.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/60 via-black/10 to-transparent px-1.5 pb-1 pt-3 text-left",children:e.jsx("div",{className:"truncate text-[8px] font-medium text-white/90 leading-tight",children:a.file.name})})]}),e.jsx("button",{type:"button",onClick:f=>{f.stopPropagation(),Ct(a.id)},title:d("hub.removeImage"),className:"absolute -right-1 -top-1 flex h-5 w-5 items-center justify-center rounded-full border border-white/10 bg-black/65 text-white/75 transition-colors hover:bg-black/80 hover:text-white",children:e.jsxs("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",children:[e.jsx("path",{d:"M18 6 6 18"}),e.jsx("path",{d:"M6 6l12 12"})]})})]},a.id))})}),ce&&Ne.length>0&&e.jsxs("div",{ref:st,className:"absolute bottom-full left-0 right-0 mb-1.5 z-50 max-h-[200px] overflow-y-auto rounded-xl border border-edge/40 bg-[var(--th-dropdown)] backdrop-blur-xl shadow-lg animate-in",children:[e.jsx("div",{className:"px-3 pt-2 pb-1 border-b border-edge/20",children:e.jsx("span",{className:"text-[10px] font-semibold text-fg-5 uppercase tracking-wider",children:d("hub.skills")})}),e.jsx("div",{className:"py-1",children:Ne.map((a,f)=>e.jsxs("button",{"data-skill-idx":f,onMouseDown:j=>{j.preventDefault(),x(a)},onMouseEnter:()=>nt(f),className:L("flex flex-col w-full px-3 py-1.5 text-left transition-colors",f===tt?"bg-panel-h text-fg":"text-fg-3 hover:bg-panel-alt/50"),children:[e.jsxs("span",{className:"text-[12.5px] font-medium",children:["/",a.name]}),(a.label||a.description)&&e.jsx("span",{className:"text-[11px] text-fg-5 truncate",children:a.label||a.description})]},a.name))})]}),e.jsx("textarea",{ref:Me,value:H,onChange:a=>w(a.target.value),onPaste:S,onKeyDown:N,onCompositionStart:()=>{et.current=!0},onCompositionEnd:()=>{et.current=!1},placeholder:d("hub.inputPlaceholder"),rows:1,className:"block w-full resize-none bg-transparent px-4 pt-3 pb-1 text-[13.5px] text-fg outline-none placeholder:text-fg-5/25 leading-[1.6]",style:{maxHeight:200,overflow:H.split(`
9
+ `).length>6?"auto":"hidden"}}),e.jsxs("div",{className:"flex items-center gap-1 px-2.5 pb-2 pt-1",children:[e.jsx("button",{type:"button",onClick:()=>Fe.current?.click(),title:d("hub.addImages"),className:"flex h-7 w-7 items-center justify-center rounded-lg text-fg-5/50 transition-colors hover:bg-panel-h/60 hover:text-fg-3",children:e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.1",strokeLinecap:"round",children:[e.jsx("path",{d:"M12 5v14"}),e.jsx("path",{d:"M5 12h14"})]})}),e.jsxs("button",{ref:xe,onClick:ps,disabled:!G.length,title:G.length?ms:void 0,className:L("flex items-center gap-1 h-[28px] pl-2 pr-0.5 rounded-lg text-[11px] font-medium transition-all duration-200 select-none",M!=="closed"?"bg-panel-h border border-edge-h text-fg-3":"text-fg-5/60 hover:text-fg-4 hover:bg-panel-h/50 border border-transparent"),children:[G.length?e.jsx(ct,{brand:tn,size:12}):e.jsx(fe,{className:"h-3 w-3"}),G.length?e.jsxs("span",{className:"flex items-center gap-1 max-w-[460px] min-w-0 truncate",children:[e.jsx("span",{className:"shrink-0",children:Cn.shortLabel}),lt&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-fg-5/40 shrink-0",children:"/"}),e.jsx(ct,{brand:gs||"custom",size:12}),e.jsx("span",{className:"shrink-0 truncate max-w-[140px]",children:lt.name})]}),sn&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-fg-5/40 shrink-0",children:"/"}),e.jsx("span",{className:"truncate",title:nn||void 0,children:sn})]})]}):e.jsx("span",{className:"max-w-[420px] truncate",children:d("hub.selectAgent")}),e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:L("text-fg-5/30 transition-transform duration-200",M!=="closed"&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),M!=="closed"&&J&&gn.createPortal(e.jsxs("div",{id:"cascade-portal",className:"fixed z-[200] w-[300px] rounded-xl border border-edge/40 bg-[var(--th-dropdown)] backdrop-blur-xl shadow-lg overflow-hidden animate-in",style:{left:J.left,bottom:J.bottom},children:[e.jsxs("div",{className:"flex items-center gap-2 px-3 pt-2.5 pb-1.5 border-b border-edge/20",children:[M!=="agent"&&e.jsx("button",{onClick:()=>pe("agent"),className:"p-0.5 rounded text-fg-5/50 hover:text-fg-3 transition-colors",children:e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})})}),e.jsx("span",{className:"text-[10px] font-semibold text-fg-5 uppercase tracking-wider",children:d(M==="agent"?"hub.selectAgent":"hub.selectModel")}),e.jsx("div",{className:"ml-auto flex items-center gap-0.5",children:(()=>{const f=F?.capabilities?.modelSwitch!==!1?["agent","model"]:["agent"],j=f.indexOf(M);return f.map((I,z)=>e.jsx("span",{className:L("w-1.5 h-1.5 rounded-full transition-colors",M===I?"bg-primary":z<j?"bg-primary/40":"bg-fg-5/15")},I))})()})]}),e.jsxs("div",{className:"max-h-[200px] overflow-y-auto py-1",children:[M==="agent"&&G.filter(a=>a.installed).map(a=>{const f=dn(a.agent),j=ws(a.usage),I=j?ks(j):"ok";return e.jsxs(un,{selected:a.agent===(be||R),onClick:()=>{if(ae(a.agent),Te(a.selectedModel||""),Ee(a.selectedEffort||""),!(a.capabilities?.modelSwitch!==!1)){Sn(a.agent,a.selectedModel||"");return}pe("model")},children:[e.jsx(ct,{brand:a.agent,size:14}),e.jsx("span",{style:{color:f.color},children:f.label}),j&&e.jsxs("span",{className:L("ml-auto font-mono text-[10px]",I==="err"?"text-err":I==="warn"?"text-warn":"text-fg-5"),children:[j.label," ",Math.round(j.usedPercent??0),"%"]})]},a.agent)}),M==="model"&&e.jsxs(e.Fragment,{children:[Re.map((a,f)=>{const j=f===0&&a.kind==="native",I=f===yn&&a.kind==="profile",z=ve!==void 0?ve:P===R&&Et!==void 0?Et:cs,se=a.kind==="profile"?!!a.profileId&&a.profileId===z:!z&&a.id===(Je??Mt);return e.jsxs("div",{children:[j&&e.jsx("div",{className:"px-3 pb-1 pt-1.5 text-[10px] font-medium uppercase tracking-wide text-fg-5",children:d("hub.modelGroupNative")}),I&&e.jsx("div",{className:"px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-fg-5",children:d("hub.modelGroupProfiles")}),e.jsx(un,{selected:se,onClick:()=>{const Se=be||R,Pe=a.profileId??null;Te(a.id),je(Pe),Sn(Se,a.id,Pe)},children:e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:L("truncate text-[11.5px]",a.kind==="native"&&"font-mono text-[11px]"),title:a.id,children:a.label}),a.description&&e.jsx("div",{className:"truncate text-[10px] text-fg-5/80",children:a.description})]})})]},`${a.kind}:${a.profileId||a.id}`)}),Re.length===0&&e.jsx("div",{className:"px-3 py-3 text-[11px] text-fg-5 text-center",children:d("config.noModel")})]})]})]}),document.body),e.jsx(pr,{current:xs,options:ds,onSelect:hs,label:d("hub.selectEffort")}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:Lt,disabled:!Nn,className:L("flex items-center justify-center w-[30px] h-[30px] rounded-lg transition-all duration-200",Nn?"bg-primary text-primary-fg hover:brightness-110 shadow-sm":"bg-fg/6 text-fg-5/20"),children:T?e.jsx(fe,{className:"h-3.5 w-3.5"}):e.jsxs("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("line",{x1:"12",y1:"19",x2:"12",y2:"5"}),e.jsx("polyline",{points:"5 12 12 5 19 12"})]})})]})]})]}),e.jsx(hr,{source:us,onClose:()=>{Ze(null),vt(null)},t:d})]})});function hr({source:t,onClose:n,t:s}){const[l,r]=o.useState(!1);if(o.useEffect(()=>{r(!1)},[t?.key]),o.useEffect(()=>{if(!t)return;const d=m=>{m.key==="Escape"&&n()};return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[t,n]),!t)return null;const c=t.file,p=t.onRemove;return gn.createPortal(e.jsx("div",{className:"fixed inset-0 z-[220] flex items-center justify-center bg-black/72 px-4 py-6 backdrop-blur-sm",onClick:n,children:e.jsxs("div",{className:"w-full max-w-[1024px]",onClick:d=>d.stopPropagation(),children:[e.jsxs("div",{className:"mb-3 flex items-center gap-2 text-[11px] text-white/72",children:[t.name&&e.jsx("span",{className:"truncate font-medium text-white/90",children:t.name}),typeof t.size=="number"&&e.jsx("span",{children:Vn(t.size)}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[c&&e.jsx("button",{type:"button",onClick:async()=>{await nr(c)&&(r(!0),window.setTimeout(()=>r(!1),1600))},className:"rounded-lg border border-white/12 bg-white/10 px-3 py-1.5 text-[11px] font-medium text-white/88 transition-colors hover:bg-white/14",children:s(l?"hub.copied":"hub.copyImage")}),p&&e.jsx("button",{type:"button",onClick:p,className:"rounded-lg border border-white/12 bg-white/10 px-3 py-1.5 text-[11px] font-medium text-white/88 transition-colors hover:bg-white/14",children:s("hub.removeImage")}),e.jsx("button",{type:"button",onClick:n,className:"flex h-9 w-9 items-center justify-center rounded-full border border-white/12 bg-white/10 text-white/88 transition-colors hover:bg-white/14",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",children:[e.jsx("path",{d:"M18 6 6 18"}),e.jsx("path",{d:"M6 6l12 12"})]})})]})]}),e.jsx("div",{className:"overflow-hidden rounded-xl border border-white/10 bg-black/35 shadow-[0_20px_70px_rgba(0,0,0,0.45)]",children:e.jsx("img",{src:t.url,alt:t.name||"",className:"max-h-[80vh] w-full object-contain"})})]})}),document.body)}function un({selected:t,onClick:n,children:s}){return e.jsxs("button",{onClick:n,className:L("flex items-center gap-2 w-full px-3 py-2 text-[12px] text-left transition-colors",t?"text-fg bg-panel-h font-medium":"text-fg-3 hover:bg-panel-alt/50 hover:text-fg-2"),children:[s,t&&e.jsx("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:"ml-auto text-ok",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}),!t&&e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"ml-auto text-fg-5/20",children:e.jsx("polyline",{points:"9 6 15 12 9 18"})})]})}function pr({current:t,options:n,onSelect:s,label:l}){const[r,c]=o.useState(!1),p=o.useRef(null);if(o.useEffect(()=>{if(!r)return;const k=y=>{p.current&&!p.current.contains(y.target)&&c(!1)};return document.addEventListener("mousedown",k),()=>document.removeEventListener("mousedown",k)},[r]),!n.length)return null;const d=n.find(k=>k.id===t)?.label||t||"—",m=n.findIndex(k=>k.id===t),b=n.length>1&&m>=0?m/(n.length-1):.5,g=Math.round(-80+b*160),v=t==="ultra";return e.jsxs("div",{className:"relative shrink-0",ref:p,children:[e.jsxs("button",{type:"button",onClick:()=>c(k=>!k),title:l,className:L("flex items-center gap-1 h-[28px] pl-0.5 pr-2 rounded-lg text-[11px] font-medium transition-all duration-200 select-none",r?"bg-panel-h border border-edge-h text-fg-3":"text-fg-5/60 hover:text-fg-4 hover:bg-panel-h/50 border border-transparent"),children:[e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:v?"url(#effortUltraGrad)":"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[v&&e.jsx("defs",{children:e.jsxs("linearGradient",{id:"effortUltraGrad",x1:"2",y1:"20",x2:"22",y2:"6",gradientUnits:"userSpaceOnUse",children:[e.jsx("stop",{offset:"0%",stopColor:"#22d3ee"}),e.jsx("stop",{offset:"55%",stopColor:"#a855f7"}),e.jsx("stop",{offset:"100%",stopColor:"#fb7185"})]})}),e.jsx("path",{d:"M3.34 19a10 10 0 1 1 17.32 0"}),e.jsx("path",{d:"M12 14L12 7.5",transform:`rotate(${g} 12 14)`})]}),e.jsx("span",{className:L("shrink-0",v&&"bg-gradient-to-r from-cyan-400 via-purple-400 to-pink-400 bg-clip-text text-transparent font-semibold"),children:d}),e.jsx("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:L("text-fg-5/30 transition-transform duration-200",r&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),r&&e.jsx("div",{className:"absolute bottom-full left-0 mb-1.5 z-[200] min-w-[150px] rounded-xl border border-edge/40 bg-[var(--th-dropdown)] backdrop-blur-xl shadow-lg overflow-hidden animate-in py-1",children:n.map(k=>e.jsx(un,{selected:k.id===t,onClick:()=>{s(k.id),c(!1)},children:k.label},k.id))})]})}function xr(){return function(t){As(t)}}const jn=[_s,xr],qn=t=>/^https?:\/\//.test(t),fr=t=>/^[a-z][a-z0-9+.-]*:\/\//i.test(t);function gr(t){return t.replace(/:(\d+)(?::\d+)?$/,"")}function Qn(t){let n=t.trim();const s=[["`","`"],['"','"'],["'","'"],["<",">"]];let l=!0;for(;l&&n.length>=2;){l=!1;for(const[r,c]of s)n.startsWith(r)&&n.endsWith(c)&&(n=n.slice(r.length,-c.length).trim(),l=!0)}return n}function wn(t){let n=Qn(t),s="";for(;n.length>1;){const l=n[n.length-1];if(!l||!/[),.;!?]/.test(l)||l==="."&&/^\.[A-Za-z0-9_-]+$/.test(n))break;s=l+s,n=n.slice(0,-1)}return{text:n,trailing:s}}function Vt(t){const n=wn(t).text;if(!n||qn(n)||fr(n)&&!n.startsWith("file://"))return!1;const s=gr(n);if(!s)return!1;if(s.startsWith("file://"))return s.length>7;if(/^[A-Za-z]:[\\/]/.test(s))return!0;if(/^(\/|~\/|\.{1,2}\/)/.test(s))return s.length>1;if(s.includes("/")){const l=s.split("/")[0]||"";return!/^[A-Za-z0-9-]+\.[A-Za-z]{2,}$/.test(l)}return!1}function kn(t,n){re.openInEditor(t,void 0,n||void 0).catch(()=>{})}function Yn(t,n,s){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),t.stopPropagation(),kn(n,s))}const mr="text-blue-400 underline underline-offset-2 decoration-blue-400/30 cursor-pointer hover:text-blue-300 transition-colors",br="underline decoration-dotted decoration-fg-5/40 underline-offset-2 cursor-pointer hover:text-blue-300 hover:decoration-blue-300/50 transition-colors";function Xn({locator:t,workdir:n,className:s,children:l}){return e.jsx("span",{role:"link",tabIndex:0,title:t,className:s??mr,onClick:r=>{r.stopPropagation(),kn(t,n)},onKeyDown:r=>Yn(r,t,n),children:l??t})}function vr(t){const n=[];if(!t)return n;for(const s of t.split(/(\s+)/)){if(!s)continue;if(/^\s+$/.test(s)){n.push({type:"text",value:s});continue}const{text:l,trailing:r}=wn(s),c=Qn(l);c&&!c.endsWith("…")&&Vt(c)?(n.push({type:"link",locator:c,display:r?s.slice(0,s.length-r.length):s}),r&&n.push({type:"text",value:r})):n.push({type:"text",value:s})}return n}function Be({text:t,workdir:n,className:s}){const l=vr(t);return l.some(r=>r.type==="link")?e.jsx(e.Fragment,{children:l.map((r,c)=>r.type==="link"?e.jsx(Xn,{locator:r.locator,workdir:n,className:s??br,children:r.display},c):e.jsx("span",{children:r.value},c))}):e.jsx(e.Fragment,{children:t})}function jr({text:t}){const[n,s]=o.useState(!1),l=()=>{navigator.clipboard.writeText(t).then(()=>{s(!0),setTimeout(()=>s(!1),2e3)}).catch(()=>{})};return e.jsx("button",{onClick:l,className:"flex items-center text-fg-5/50 hover:text-fg-3 transition-colors",children:n?e.jsx("svg",{width:"13",height:"13",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:"13",height:"13",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"})]})})}function En(t){const n=Vt(t),s=/^(npm |npx |git |python|pip |yarn |pnpm |cargo |go |make )/.test(t);return n?"bg-blue-500/8 border-blue-400/12 text-blue-300/90":s?"bg-amber-500/8 border-amber-400/10 text-amber-300/80":"bg-[rgba(255,255,255,0.06)] border-edge/20 text-fg-3"}function qt(t={}){const n=t.workdir||null;return{h1:({children:s})=>e.jsx("h2",{className:"text-[16px] font-bold text-fg mt-4 mb-2",children:s}),h2:({children:s})=>e.jsx("h3",{className:"text-[14.5px] font-semibold text-fg mt-4 mb-1.5",children:s}),h3:({children:s})=>e.jsx("h4",{className:"text-[13.5px] font-semibold text-fg mt-3 mb-1",children:s}),p:({children:s})=>e.jsx("p",{className:"my-1.5 whitespace-pre-wrap break-words",children:s}),strong:({children:s})=>e.jsx("strong",{className:"font-semibold text-fg",children:s}),em:({children:s})=>e.jsx("em",{className:"italic text-fg-3",children:s}),a:({href:s,children:l})=>s&&qn(s)?e.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"text-blue-400 underline underline-offset-2 decoration-blue-400/30 cursor-pointer hover:text-blue-300 transition-colors",children:l}):s&&Vt(s)?e.jsx(Xn,{locator:wn(s).text,workdir:n,children:l}):e.jsx("span",{className:"text-blue-400 underline underline-offset-2 decoration-blue-400/30",children:l}),ul:({children:s})=>e.jsx("ul",{className:"space-y-1 my-2 ml-1",children:s}),ol:({children:s})=>e.jsx("ol",{className:"space-y-1 my-2 ml-1 list-decimal list-inside",children:s}),li:({children:s})=>e.jsxs("li",{className:"flex gap-2 items-start",children:[e.jsx("span",{className:"shrink-0 mt-[10px] w-[5px] h-[5px] rounded-full bg-fg-5/40"}),e.jsx("span",{className:"flex-1",children:s})]}),blockquote:({children:s})=>e.jsx("blockquote",{className:"border-l-2 border-fg-5/30 pl-3 my-2 text-fg-4 italic",children:s}),hr:()=>e.jsx("hr",{className:"border-edge/30 my-4"}),code:({className:s,children:l})=>{const r=String(l).replace(/\n$/,""),c=/language-(\w+)/.exec(s||"");if(!c&&!s&&!r.includes(`
10
+ `))return Vt(r)?e.jsx("code",{role:"link",tabIndex:0,title:r,className:L("px-1.5 py-[1px] rounded text-[12px] font-mono border cursor-pointer hover:brightness-125 transition-all",En(r)),onClick:()=>kn(r,n),onKeyDown:d=>Yn(d,r,n),children:r}):e.jsx("code",{className:L("px-1.5 py-[1px] rounded text-[12px] font-mono border",En(r)),children:r});const p=c?.[1]||"";return e.jsxs("div",{className:"rounded-lg overflow-hidden border border-edge/30 bg-[rgba(0,0,0,0.25)] my-3 not-prose",children:[e.jsxs("div",{className:"flex items-center justify-between px-3.5 py-1.5 border-b border-edge/15 bg-[rgba(0,0,0,0.12)]",children:[e.jsx("span",{className:"text-[10px] font-mono text-fg-5/50",children:p||"text"}),e.jsx(jr,{text:r})]}),e.jsx("pre",{className:"px-3.5 py-3 text-[12px] leading-[1.65] text-fg-3 font-mono whitespace-pre-wrap break-words overflow-x-auto",children:e.jsx("code",{children:r})})]})},pre:({children:s})=>e.jsx(e.Fragment,{children:s}),table:({children:s})=>e.jsx("div",{className:"my-3 overflow-x-auto rounded-lg border border-edge/30",children:e.jsx("table",{className:"w-full text-[12.5px]",children:s})}),thead:({children:s})=>e.jsx("thead",{className:"bg-[rgba(0,0,0,0.1)]",children:s}),th:({children:s})=>e.jsx("th",{className:"px-3 py-1.5 text-left font-semibold text-fg-3 border-b border-edge/30",children:s}),td:({children:s})=>e.jsx("td",{className:"px-3 py-1.5 text-fg-4 border-t border-edge/12",children:s}),tr:({children:s})=>e.jsx("tr",{className:"even:bg-[rgba(255,255,255,0.015)]",children:s})}}qt();function ut(t){return!!t?.steps?.length}function wr(t,n){let s=t;for(const[l,r]of Object.entries(n))s=s.replace(new RegExp(`\\{${l}\\}`,"g"),r);return s}function kr({status:t}){return t==="completed"?e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",className:"text-ok",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}):t==="inProgress"?e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-cyan-400 animate-pulse"}):e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-fg-5/25"})}function Zn({plan:t,t:n,className:s}){const[l,r]=o.useState(!1);if(!ut(t))return null;const c=t.steps.length,p=t.steps.filter(b=>b.status==="completed").length,d=c>0&&p===c,m=wr(n("hub.planProgress"),{done:String(p),total:String(c)});return e.jsx(dt,{open:l,onToggle:()=>r(b=>!b),dot:{color:d?"bg-emerald-400/60":"bg-cyan-400/60",pulse:!d},label:m,preview:t.explanation?e.jsx("span",{className:"text-[11.5px] text-fg-4 truncate",children:t.explanation}):void 0,badge:e.jsx("span",{className:L("rounded-md border px-1.5 py-0.5 text-[10px] font-mono",d?"border-ok/20 text-ok":"border-edge text-fg-5"),children:n(d?"hub.planDone":"hub.planInProgress")}),className:s,children:e.jsx("div",{className:"px-3.5 py-2.5 space-y-1",children:t.steps.map((b,g)=>{const v=b.status==="completed"?"text-fg-5 line-through decoration-fg-5/40":b.status==="inProgress"?"text-fg-3":"text-fg-4";return e.jsxs("div",{className:"flex items-center gap-2 py-[2px]",children:[e.jsx("span",{className:"shrink-0 flex items-center justify-center w-[10px]",children:e.jsx(kr,{status:b.status})}),e.jsx("span",{className:L("text-[12px] leading-[1.5]",v),children:b.step})]},`${g}:${b.step}`)})})})}function Jn({url:t,fileName:n,fileSize:s,caption:l}){return e.jsxs("div",{className:"flex flex-col gap-1 max-w-[340px]",children:[e.jsxs("a",{href:t,download:n,target:"_blank",rel:"noreferrer",title:l||n,className:L("group inline-flex items-center gap-2.5 rounded-md no-underline","border border-fg-6/40 bg-fg-6/[0.05] px-3 py-2","hover:bg-fg-6/[0.12] hover:border-fg-6/60 transition-colors"),children:[e.jsx("span",{className:"grid h-8 w-8 shrink-0 place-items-center rounded bg-fg-6/10 text-fg-3",children:e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]})}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[12.5px] font-medium text-fg-2",children:n}),typeof s=="number"&&s>0&&e.jsx("span",{className:"block text-[11px] text-fg-5/70",children:Vn(s)})]}),e.jsx("span",{className:"shrink-0 text-fg-5/50 group-hover:text-fg-3 transition-colors",children:e.jsxs("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),e.jsx("polyline",{points:"7 10 12 15 17 10"}),e.jsx("line",{x1:"12",y1:"15",x2:"12",y2:"3"})]})})]}),l&&e.jsx("span",{className:"px-0.5 text-[11.5px] leading-[1.55] text-fg-4 break-words",children:l})]})}function es(t){return!!t.text||!!t.thinking||!!(t.activity&&t.activity.split(`
11
+ `).filter(Boolean).length)||!!t.previewMeta?.toolCalls?.length||ut(t.plan)||!!(t.subAgents&&t.subAgents.length)||!!(t.artifacts&&t.artifacts.length)}function To(t){return es(t)||t.phase==="streaming"?!0:t.phase==="done"&&!!t.error}function yr(t){return t.phase!=="done"||!t.error?null:es(t)?"hub.streamErrored":"hub.streamFailed"}function Nr({detail:t,t:n,className:s}){const l=Ys(t);if(l==="interrupted")return e.jsxs("div",{className:L("flex items-center gap-1.5 text-[11px] text-fg-5/55",s),children:[e.jsx("span",{className:"inline-block h-2 w-2 rounded-[2px] bg-fg-5/45 shrink-0"}),e.jsx("span",{children:n("hub.turnStopped")})]});const r=l==="error"?{dot:"bg-rose-400/55",text:"text-rose-300/65"}:{dot:"bg-fg-5/40",text:"text-fg-5/55"};return e.jsxs("div",{className:L("flex items-start gap-1.5 text-[11px] leading-[1.6]",r.text,s),children:[e.jsx("span",{className:L("mt-[5px] h-1 w-1 rounded-full shrink-0",r.dot)}),e.jsx("span",{className:"min-w-0 break-words",children:t})]})}const Sr=64;function Cr(t,n){const[s,l]=o.useState(t),r=o.useRef(0),c=o.useRef(null);return o.useEffect(()=>{if(n<=0)return;const p=Date.now()-r.current,d=()=>{r.current=Date.now(),l(t)};return p>=n?d():(c.current&&clearTimeout(c.current),c.current=window.setTimeout(d,n-p)),()=>{c.current&&clearTimeout(c.current)}},[t,n]),n<=0?t:s}function Eo({stream:t,t:n,workdir:s}){const l=ut(t.plan),[r,c]=o.useState(!1),[p,d]=o.useState(!1),m=o.useRef(null),b=o.useRef(null),g=yr(t),v=o.useMemo(()=>(t.activity||"").split(`
12
+ `).filter(Boolean),[t.activity]),k=t.previewMeta?.toolCalls??[],y=v[v.length-1]||k[k.length-1]?.summary||"",$=k.length,A=t.previewMeta?.contextPercent??null,W=t.previewMeta?.contextUsedTokens??0,O=t.previewMeta?.turnOutputTokens??0,K=t.phase==="streaming",H=K&&t.startedAt!=null&&t.startedAt>0,Z=K;o.useLayoutEffect(()=>{const C=m.current;C&&r&&(C.scrollTop=C.scrollHeight)},[r,t.activity,k.length]),o.useLayoutEffect(()=>{const C=b.current;C&&p&&(C.scrollTop=C.scrollHeight)},[p,t.thinking]);const T=t.subAgents??null,V=Cr(t.text,t.phase==="streaming"?Sr:0),_=o.useMemo(()=>qt({workdir:s}),[s]),D=o.useMemo(()=>e.jsx(mn,{remarkPlugins:jn,components:_,children:V}),[V,_]);return e.jsxs("div",{className:"space-y-3 animate-in",children:[l&&e.jsx(Zn,{plan:t.plan,t:n,className:"mb-1 max-w-[760px]"}),T&&T.length>0&&T.map(C=>e.jsx(ns,{sub:C,t:n},C.id)),(k.length>0||v.length>0)&&e.jsx(dt,{open:r,onToggle:()=>c(C=>!C),dot:{color:"bg-cyan-400/60",pulse:!0},label:n("hub.activity"),preview:e.jsx("span",{className:"text-[12px] text-fg-4 truncate",children:e.jsx(Be,{text:y,workdir:s})}),badge:(k.length||v.length)>1?e.jsx(fn,{children:k.length||v.length}):void 0,children:e.jsx("div",{ref:m,className:"px-3.5 py-2.5 space-y-0.5 max-h-[280px] overflow-y-auto",children:k.length>0?k.map(C=>e.jsx(Lr,{call:C,workdir:s},C.id)):v.map((C,E)=>e.jsxs("div",{className:"flex items-center gap-1.5 py-[2px]",children:[e.jsx("span",{className:"w-1 h-1 rounded-full shrink-0 bg-fg-5/30"}),e.jsx("span",{className:"text-[11px] font-mono text-fg-5/60 truncate",children:e.jsx(Be,{text:C,workdir:s})})]},E))})}),t.thinking&&e.jsx(dt,{open:p,onToggle:()=>d(C=>!C),dot:{color:"bg-violet-400/50",pulse:!0},label:n("hub.thinking"),collapsedContent:e.jsx("div",{className:"px-3.5 pb-2.5 -mt-0.5 text-[12px] text-fg-4 leading-[1.65] whitespace-pre-wrap break-words line-clamp-3",children:Hn(t.thinking,3)}),children:e.jsx("div",{ref:b,className:"px-3.5 py-3 text-[12px] text-fg-4 leading-[1.7] whitespace-pre-wrap break-words max-h-[280px] overflow-y-auto",children:t.thinking})}),t.text&&e.jsx("div",{className:"session-md text-[13.5px] leading-[1.75] text-fg-2",children:D}),t.artifacts&&t.artifacts.length>0&&e.jsx("div",{className:"flex flex-col gap-2",children:t.artifacts.map((C,E)=>C.kind==="photo"?e.jsx("a",{href:C.url,target:"_blank",rel:"noreferrer",className:"inline-block",children:e.jsx("img",{src:C.url,alt:C.caption||C.fileName,className:"max-w-[400px] max-h-[300px] rounded-md border border-fg-6/50 object-contain hover:opacity-90 transition-opacity"})},E):e.jsx(Jn,{url:C.url,fileName:C.fileName,fileSize:C.fileSize,caption:C.caption},E))}),t.phase==="streaming"&&(t.generatingImages??0)>0&&e.jsxs("div",{className:"flex items-center gap-2 text-[12px] text-fg-4",children:[e.jsxs("span",{className:"relative inline-flex items-center justify-center w-3 h-3",children:[e.jsx("span",{className:"absolute inline-flex w-3 h-3 rounded-full bg-cyan-400/40 animate-ping"}),e.jsx("span",{className:"relative inline-block w-1.5 h-1.5 rounded-full bg-cyan-400/80"})]}),e.jsx("span",{children:t.generatingImages===1?"Generating image…":`Generating ${t.generatingImages} images…`})]}),Z&&e.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono text-fg-5/50 tabular-nums",children:[e.jsx(ts,{className:"text-fg-5/45 shrink-0"}),e.jsx(Ir,{toolCount:$,ctxPct:A,ctxTokens:W,turnOutTokens:O,startedAt:H?t.startedAt:null})]}),g&&t.error&&e.jsx(Nr,{detail:t.error,t:n,className:"pt-0.5"})]})}function Lr({call:t,workdir:n}){const[s,l]=o.useState(!1),r=!!(t.input||t.result),c=t.status==="failed"?"bg-rose-400/70":t.status==="running"?"bg-cyan-400/70":"bg-fg-5/30";return e.jsxs("div",{children:[e.jsxs("button",{type:"button",onClick:()=>r&&l(p=>!p),className:`flex w-full items-center gap-1.5 py-[2px] text-left min-w-0 ${r?"cursor-pointer hover:bg-white/[0.03] rounded":"cursor-default"}`,title:r?void 0:t.summary,children:[e.jsx("span",{className:`w-1 h-1 rounded-full shrink-0 ${c} ${t.status==="running"?"animate-pulse":""}`}),e.jsx("span",{className:"text-[11px] font-mono text-fg-5/60 truncate flex-1",children:e.jsx(Be,{text:t.summary,workdir:n})}),r&&e.jsx("span",{className:`shrink-0 text-[9px] text-fg-5/40 transition-transform ${s?"rotate-90":""}`,children:"▸"})]}),s&&e.jsxs("div",{className:"ml-2.5 mt-0.5 mb-1 space-y-1 border-l border-white/[0.06] pl-2.5",children:[t.input&&e.jsx("pre",{className:"whitespace-pre-wrap break-words text-[10.5px] font-mono leading-[1.55] text-fg-4/80 max-h-[140px] overflow-y-auto",children:e.jsx(Be,{text:t.input,workdir:n})}),t.result&&e.jsx("pre",{className:"whitespace-pre-wrap break-words text-[10.5px] font-mono leading-[1.55] text-fg-5/70 max-h-[140px] overflow-y-auto border-t border-white/[0.04] pt-1",children:e.jsx(Be,{text:t.result,workdir:n})})]})]})}function ts({className:t}){return e.jsxs("span",{className:`thinking-dots inline-flex items-center gap-[3px] ${t||""}`,children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})}function Ir({toolCount:t,ctxPct:n,ctxTokens:s,turnOutTokens:l,startedAt:r}){const c=[];return t>0&&c.push(e.jsxs("span",{className:"flex items-center gap-1 text-fg-5/55",title:`${t} tool ${t===1?"call":"calls"} this turn`,children:[e.jsx("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"M22 12h-4l-3 9L9 3l-3 9H2"})}),t]},"ops")),n!=null&&c.push(e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${Kn(n)}`}),n.toFixed(1),"%"]},"ctx")),s>0&&c.push(e.jsx("span",{className:"text-fg-5/40",children:zn(s)},"tok")),l>0&&c.push(e.jsxs("span",{className:"text-fg-5/40",children:["↑",vn(l)]},"out")),r!=null&&c.push(e.jsx(Tr,{startedAt:r},"elapsed")),c.length?e.jsx("span",{className:"shrink-0 flex items-center gap-1.5",children:c.map((p,d)=>e.jsxs("span",{className:"flex items-center gap-1.5",children:[d>0&&e.jsx("span",{className:"text-fg-5/25",children:"·"}),p]},d))}):null}function Tr({startedAt:t}){const[,n]=o.useState(0);o.useEffect(()=>{const l=setInterval(()=>n(r=>r+1),1e3);return()=>clearInterval(l)},[]);const s=Math.max(0,Date.now()-t);return e.jsx("span",{className:"text-fg-5/55 tabular-nums",title:"Elapsed time of the running turn",children:Qs(s)})}function ns({sub:t,t:n}){const[s,l]=o.useState(!1),r=t.status,c=r==="failed"?"bg-rose-400/60":r==="done"?"bg-emerald-400/55":"bg-amber-400/60",p=r==="running",d=t.tools,m=o.useMemo(()=>{const v=new Set,k=[];for(const y of d)v.has(y.name)||(v.add(y.name),k.push(y.name));return k},[d]),b=t.kind?`${n("hub.subAgent")||"Sub-agent"} · ${t.kind}`:n("hub.subAgent")||"Sub-agent",g=t.model?Ut(t.model):null;return e.jsx(dt,{open:s,onToggle:()=>l(v=>!v),dot:{color:c,pulse:p},label:b,preview:e.jsxs("span",{className:"flex items-center gap-1.5 min-w-0 text-[12px] text-fg-4",children:[t.description&&e.jsx("span",{className:"truncate",children:t.description}),g&&e.jsx("span",{className:"text-[10px] font-mono text-fg-5/55 shrink-0",children:g}),!t.description&&m.length>0&&e.jsx("span",{className:"font-mono text-fg-5/60 truncate",children:m.join(" · ")})]}),badge:d.length>0?e.jsx(fn,{children:d.length}):void 0,children:e.jsxs("div",{className:"px-3.5 py-2.5 space-y-1 max-h-[260px] overflow-y-auto",children:[t.description&&e.jsx("div",{className:"mb-1.5 text-[12px] text-fg-3 leading-[1.55]",children:t.description}),d.length===0?e.jsxs("div",{className:"text-[11px] font-mono text-fg-5/50",children:["— ",n("hub.subAgentWaiting")||"waiting for first tool…"]}):d.map(v=>e.jsxs("div",{className:"flex items-center gap-1.5 py-[2px]",children:[e.jsx("span",{className:"w-1 h-1 rounded-full shrink-0 bg-fg-5/30"}),e.jsx("span",{className:"text-[11px] font-mono text-fg-5/65 truncate",children:v.summary})]},v.id))]})})}function Er({message:t,t:n,workdir:s}){const{activityBlocks:l,thinkingBlocks:r,planBlocks:c,subAgentBlocks:p,outputBlocks:d,noticeBlocks:m}=ss(t.blocks),b=[...c].reverse().find(v=>ut(v.plan));return l.length>0||p.length>0||!!b?.plan||r.length>0||d.length>0||m.length>0?e.jsxs("div",{className:"space-y-3",children:[l.length>0&&e.jsx(_r,{blocks:l,t:n,workdir:s}),p.map(v=>v.subAgent?e.jsx(ns,{sub:v.subAgent,t:n},v.toolId||v.subAgent.id):null),b?.plan&&e.jsx(Zn,{plan:b.plan,t:n,className:"max-w-[760px]"}),r.length>0&&e.jsx(Pr,{blocks:r,t:n}),d.length>0&&e.jsx($r,{blocks:d,t:n,workdir:s}),m.length>0&&e.jsx(Ar,{blocks:m,t:n})]}):null}function Mr(t){const{activityBlocks:n,thinkingBlocks:s,planBlocks:l,subAgentBlocks:r,outputBlocks:c,noticeBlocks:p}=ss(t.blocks);return c.length>0||n.length>0||r.length>0||s.length>0||l.some(d=>ut(d.plan))||p.length>0}function ss(t){const n=t.filter(s=>s.type==="plan"||s.type==="tool_use"||s.type==="tool_result"||s.type==="image"||s.type==="file"||s.type==="sub_agent"||!!s.content.trim());return{activityBlocks:n.filter(s=>s.type==="tool_use"||s.type==="tool_result"),thinkingBlocks:n.filter(s=>s.type==="thinking"),planBlocks:n.filter(s=>s.type==="plan"&&ut(s.plan)),subAgentBlocks:n.filter(s=>s.type==="sub_agent"),outputBlocks:n.filter(s=>s.type==="text"||s.type==="image"||s.type==="file"),noticeBlocks:n.filter(s=>s.type==="system_notice")}}function Ar({blocks:t,t:n}){const s=t.map(l=>l.content).filter(Boolean).join(`
13
+
14
+ `).trim();return s?e.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/[0.06] px-3 py-2 text-[12.5px] leading-[1.7] text-fg-3",children:[e.jsx("span",{className:"mt-[6px] h-1.5 w-1.5 rounded-full bg-amber-400/70 shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[11px] font-mono uppercase tracking-wide text-amber-300/80",children:n("hub.systemNotice")||"Agent notice"}),e.jsx("div",{className:"mt-0.5 break-words whitespace-pre-wrap",children:s})]})]}):null}function _r({blocks:t,t:n,workdir:s}){const[l,r]=o.useState(!1),c=t.filter(b=>b.type==="tool_use"),p=c.length,d=c[c.length-1],m=d?Gn(d):"";return e.jsx(dt,{open:l,onToggle:()=>r(b=>!b),dot:{color:"bg-cyan-400/60"},label:n("hub.activity"),preview:e.jsx("span",{className:"text-[11.5px] font-mono text-fg-4 truncate",children:e.jsx(Be,{text:m,workdir:s})}),badge:p>0?e.jsx(fn,{children:p}):void 0,children:e.jsx("div",{className:"px-3.5 py-2.5 space-y-0.5",children:t.map((b,g)=>e.jsx(Rr,{block:b,workdir:s},g))})})}function Rr({block:t,workdir:n}){const[s,l]=o.useState(!1),r=t.type==="tool_use",c=r?Gn(t):rr(t),p=t.content.length>3e3?t.content.slice(0,3e3)+`
15
+ …`:t.content;return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>t.content&&l(d=>!d),className:L("flex items-center gap-2 py-[3px] w-full text-left group rounded-sm transition-colors",t.content&&"hover:bg-panel-h/30"),children:[e.jsx("span",{className:L("h-1.5 w-1.5 rounded-full shrink-0",r?"bg-fg-5/40":"bg-ok/40")}),e.jsx("span",{className:"text-[11px] font-mono text-fg-5/60 group-hover:text-fg-3 transition-colors truncate",children:e.jsx(Be,{text:c,workdir:n})})]}),s&&t.content&&e.jsx("pre",{className:"ml-3 mt-1 mb-2 p-3 rounded-md bg-inset border border-edge text-[11px] leading-[1.6] text-fg-4 font-mono whitespace-pre-wrap break-words max-h-[240px] overflow-y-auto",children:e.jsx(Be,{text:p,workdir:n})})]})}function Pr({blocks:t,t:n}){const[s,l]=o.useState(!1),r=o.useRef(null),c=t.map(d=>d.content).filter(Boolean).join(`
16
+
17
+ `).trim();if(!c)return null;const p=Hn(c,3);return e.jsx(dt,{open:s,onToggle:()=>l(d=>!d),dot:{color:"bg-violet-400/50"},label:n("hub.thinking"),collapsedContent:p?e.jsx("div",{className:"px-3.5 pb-2.5 -mt-0.5 text-[12px] text-fg-4 leading-[1.65] whitespace-pre-wrap break-words line-clamp-3",children:p}):void 0,children:e.jsx(Wr,{scrollRef:r,text:c})})}function Wr({scrollRef:t,text:n}){return o.useLayoutEffect(()=>{const s=t.current;s&&(s.scrollTop=s.scrollHeight)},[t]),e.jsx("div",{ref:t,className:"px-3.5 py-3 text-[12px] text-fg-4 leading-[1.7] whitespace-pre-wrap break-words max-h-[320px] overflow-y-auto",children:n})}function Br({block:t,onLightbox:n,t:s}){const l=t.imageCaption?.trim()||"",r=t.imageCaptionKind==="prompt",[c,p]=o.useState(!1);return e.jsxs("figure",{className:"flex flex-col gap-1.5 max-w-[400px]",children:[e.jsx("img",{src:t.content,alt:l||"",className:"max-w-[400px] max-h-[300px] rounded-md border border-fg-6/50 object-contain cursor-zoom-in hover:opacity-90 transition-opacity",onClick:()=>n(t.content)}),l&&(r?e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",onClick:()=>p(d=>!d),"aria-expanded":c,className:L("self-start inline-flex items-center gap-1 px-2 py-[3px] rounded-md","text-[11px] font-medium tracking-wide","border border-fg-6/40 bg-fg-6/[0.06] text-fg-3","hover:bg-fg-6/[0.12] hover:text-fg-2 hover:border-fg-6/60","transition-colors"),title:s(c?"hub.imagePromptHide":"hub.imagePromptShow"),children:[e.jsx("span",{"aria-hidden":!0,className:"text-[9px] leading-none",children:c?"▾":"▸"}),e.jsx("span",{children:s("hub.imagePrompt")})]}),c&&e.jsx("div",{className:"rounded-md border border-fg-6/30 bg-fg-6/[0.05] px-3 py-2 max-w-[400px] max-h-[260px] overflow-y-auto",children:e.jsx("div",{className:"text-[11.5px] leading-[1.65] text-fg-3 whitespace-pre-wrap break-words",children:l})})]}):e.jsx("figcaption",{className:"text-[11px] leading-[1.55] text-fg-5 max-w-[400px] break-words whitespace-pre-wrap",children:l}))]})}function $r({blocks:t,t:n,workdir:s}){const l=t.filter(g=>g.type==="text"),r=t.filter(g=>g.type==="image"),c=t.filter(g=>g.type==="file"),p=l.map(g=>g.content).filter(Boolean).join(`
18
+
19
+ `),[d,m]=o.useState(null),b=o.useMemo(()=>qt({workdir:s}),[s]);return!p.trim()&&r.length===0&&c.length===0?null:e.jsxs(e.Fragment,{children:[p.trim()&&e.jsx("div",{className:"session-md text-[13.5px] leading-[1.75] text-fg-2",children:e.jsx(mn,{remarkPlugins:jn,components:b,children:p})}),r.length>0&&e.jsx("div",{className:"flex flex-wrap gap-3 mt-2",children:r.map((g,v)=>e.jsx(Br,{block:g,onLightbox:m,t:n},v))}),c.length>0&&e.jsx("div",{className:"flex flex-col gap-2 mt-2",children:c.map((g,v)=>e.jsx(Jn,{url:g.content,fileName:g.fileName||"file",fileSize:g.fileSize,caption:g.fileCaption},v))}),d&&e.jsx(rs,{src:d,onClose:()=>m(null)})]})}const Mo=o.memo(function({turn:n,turnIndex:s,agent:l,meta:r,model:c,effort:p,providerName:d,t:m,workdir:b,onResend:g,onEdit:v,onFork:k}){const y=n.user&&Un(n.user.text),$=k&&typeof s=="number"?()=>k(s):void 0,A=o.useMemo(()=>qt({workdir:b}),[b]),W=!!n.assistant&&Mr(n.assistant);return e.jsxs("div",{className:"session-turn",children:[n.user&&!y&&e.jsx(os,{text:n.user.text,blocks:n.user.blocks,t:m,onResend:g,onEdit:v,onFork:$}),y&&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(mn,{remarkPlugins:jn,components:A,children:n.user.text})}),W&&e.jsxs(e.Fragment,{children:[e.jsx(Ur,{agent:l,meta:r,model:c,effort:p,providerName:d,previewMeta:n.assistant.usage??null}),e.jsx("div",{className:"mb-6",children:e.jsx(Er,{message:n.assistant,t:m,workdir:b})})]})]})});function rs({src:t,onClose:n}){return o.useEffect(()=>{const s=l=>{l.key==="Escape"&&n()};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[n]),gn.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 Or=1500,Dr=16,Mn=8;function Fr(t){const n=t.split(`
20
+ `);return n.length<=Mn?t:n.slice(0,Mn).join(`
21
+ `)}function os({text:t,blocks:n,t:s,onResend:l,onEdit:r,onFork:c}){const[p,d]=o.useState(!1),[m,b]=o.useState(!1),[g,v]=o.useState(null),k=t?t.split(`
22
+ `).length:0,y=!!t&&(t.length>Or||k>Dr),[$,A]=o.useState(!1),W=t?y&&!$?Fr(t):t:"",O=!!(l||r||c),K=n?.filter(T=>T.type==="image")||[],H=()=>{navigator.clipboard.writeText(t).then(()=>{b(!0),setTimeout(()=>b(!1),1500)}).catch(()=>{})},Z=s("hub.expand").replace("{chars}",t?t.length.toLocaleString():"0").replace("{lines}",String(k));return e.jsxs("div",{className:"flex flex-col items-end mb-5 group/bubble",onMouseEnter:()=>d(!0),onMouseLeave:()=>d(!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:[W,y&&!$&&e.jsx("span",{className:"text-fg-5/60",children:"…"})]}),y&&e.jsx("button",{type:"button",onClick:()=>A(T=>!T),className:"mt-2 text-[11.5px] text-fg-4 hover:text-fg-2 underline decoration-fg-5/40 underline-offset-2 transition-colors",children:$?s("hub.collapse"):Z}),K.length>0&&e.jsx("div",{className:L("flex flex-wrap gap-2",t&&"mt-2"),children:K.map((T,V)=>e.jsx("img",{src:T.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:()=>v(T.content)},V))})]}),g&&e.jsx(rs,{src:g,onClose:()=>v(null)}),O&&e.jsxs("div",{className:L("flex items-center gap-1 mt-1.5 mr-1 transition-all duration-200",p?"opacity-100 translate-y-0":"opacity-0 -translate-y-1 pointer-events-none"),children:[e.jsx(Rt,{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"})]})}),l&&e.jsx(Rt,{label:s("hub.rerun"),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("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})}),r&&e.jsx(Rt,{label:s("hub.edit"),onClick:()=>r(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"})]})}),c&&e.jsx(Rt,{label:s("hub.fork"),onClick:c,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 Rt({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 Ur({agent:t,meta:n,model:s,effort:l,providerName:r,previewMeta:c,hideContextUsage:p}){const d=p?null:c?.contextPercent??null,m=p?0:c?.contextUsedTokens??0,b=p?0:c?.turnOutputTokens??0,g=d!=null||m>0||b>0,v=c?.providerName??r??null;return e.jsxs("div",{className:"flex items-center gap-1.5 mt-1 mb-3",children:[e.jsx(ct,{brand:t,size:13}),e.jsx("span",{style:{color:n.color},className:"text-[12px] font-semibold opacity-70",children:n.label}),(s||l)&&e.jsxs("span",{className:"text-[10px] font-mono text-fg-5/50",children:[s||"",s&&l?" · ":"",l||""]}),v&&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 ${v} (BYOK), not the agent CLI's native auth.`,children:["via ",v]}),g&&e.jsxs("span",{className:"ml-auto inline-flex items-center gap-1 text-[10px] font-mono text-fg-5/55",title:zr(c),children:[d!=null&&e.jsx(Kr,{pct:d}),e.jsx("span",{children:d!=null?`${d.toFixed(1)}%`:""}),m>0&&e.jsxs("span",{className:"text-fg-5/40",children:["· ",zn(m)]}),b>0&&e.jsxs("span",{className:"text-fg-5/40",children:["· ↑",vn(b)]})]})]})}function zr(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 Kr({pct:t}){return e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${Kn(t)}`})}function An(t,n,s){return t==="zh-CN"?n:s}function Hr({open:t,onClose:n,workdir:s}){const l=ie(c=>c.locale),r=s.split("/").pop()||s;return e.jsxs(zt,{open:t,onClose:n,wide:!0,children:[e.jsx(Kt,{title:An(l,`${r} — 项目扩展`,`${r} — Project Extensions`),description:An(l,"仅对当前工作区生效。直接操作项目目录中的 .mcp.json 与 .pikiloom/skills/。","Project-scoped only. Operates directly on .mcp.json and .pikiloom/skills/ in the workspace directory."),onClose:n}),t?e.jsx(Rs,{workdir:s}):null]})}let _n=Bn(()=>import("./SessionPanel-DNlLd-PL.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]));function hn(){return _n??=Bn(()=>import("./SessionPanel-DNlLd-PL.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),_n}const Vr=o.lazy(async()=>({default:(await hn()).SessionPanel})),cn=5,Gr=240,qr=120,Qr=12,Yr=900*1e3,q=(t,n)=>`${t}:${n}`;function Xr(t){const n=new Map;for(const d of t)n.set(q(d.agent||"",d.sessionId),d);const s=new Map,l=new Set;for(const d of t){const m=d.migratedFrom;if(!m||m.kind!=="fork"||!m.sessionId)continue;const b=q(m.agent||d.agent||"",m.sessionId);n.has(b)&&(l.add(q(d.agent||"",d.sessionId)),s.has(b)||s.set(b,[]),s.get(b).push(d))}const r=[],c=new Set,p=(d,m)=>{const b=q(d.agent||"",d.sessionId);if(c.has(b))return;c.add(b),r.push(Object.assign({},d,{__forkDepth:m}));const g=s.get(b);if(g)for(const v of g)p(v,m+1)};for(const d of t){const m=q(d.agent||"",d.sessionId);l.has(m)||p(d,0)}for(const d of t)p(d,0);return r}let Zr=0;function Pt(){return`mk-${Date.now().toString(36)}-${(++Zr).toString(36)}`}function Wt(t){try{const n=localStorage.getItem(t);if(n!=null)return n;const s=sessionStorage.getItem(t);if(s!=null){try{localStorage.setItem(t,s),sessionStorage.removeItem(t)}catch{}return s}}catch{}return null}function Bt(t,n){try{localStorage.setItem(t,n)}catch{}}const Jr=[1,2,3,6],pn=6;function eo(t){for(const n of Jr)if(n>=t)return n;return pn}function Rn(){const t=typeof window<"u"?window.innerWidth:1280;return t>=1920?3:t>=1280?2:1}function Ge(t,n){const s=eo(t);return s>n?s:n}function to(t){return t==="vscode"||t==="cursor"||t==="windsurf"||t==="finder"||t==="default"}function no(t,n){const s=String(t||"").toLowerCase();return s.includes("cursor")?"cursor":s.includes("windsurf")?"windsurf":s.includes("code")||n==="darwin"?"vscode":"default"}function is(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 so=o.memo(function({active:n=!0}){const s=ie(i=>i.locale),l=ie(i=>i.state?.runtimeWorkdir??null),r=o.useMemo(()=>ys(s),[s]),[c,p]=o.useState([]),[d,m]=o.useState({}),[b,g]=o.useState({}),[v,k]=o.useState(!0),[y,$]=o.useState(()=>{const i=Wt("pikiloom-layout-mode");return i==="1"||i==="2"||i==="3"||i==="6"?Number(i):Rn()}),[A,W]=o.useState(()=>{const i=Wt("pikiloom-layout-floor");return i==="1"||i==="2"||i==="3"||i==="6"?Number(i):Rn()}),[O,K]=o.useState(()=>{try{const i=Wt("pikiloom-open-sessions");if(i){const h=JSON.parse(i);if(Array.isArray(h))return h.map(u=>({...u,mountKey:u.mountKey||Pt()}))}}catch{}return[]}),[H,Z]=o.useState(()=>{const i=Wt("pikiloom-active-slot");if(i!=null){const h=Number(i);if(Number.isFinite(h)&&h>=0)return h}return 0}),T=o.useCallback(i=>{$(i),Bt("pikiloom-layout-mode",String(i))},[]),V=o.useCallback(i=>{W(i),Bt("pikiloom-layout-floor",String(i))},[]),_=o.useCallback(i=>{K(h=>{const u=typeof i=="function"?i(h):i,x=u.map(({pendingPrompt:w,pendingImageUrls:N,...S})=>S);return Bt("pikiloom-open-sessions",JSON.stringify(x)),u})},[]),D=o.useCallback(i=>{Z(h=>{const u=typeof i=="function"?i(h):i;return Bt("pikiloom-active-slot",String(u)),u})},[]),C=o.useCallback(i=>{T(i),V(i)},[T,V]);o.useEffect(()=>{_(i=>i.length>y?i.slice(0,y):i),D(i=>i>=y?y-1:i)},[y]);const[E,he]=o.useState(!1),le=o.useRef(y);le.current=y;const Q=o.useRef(A);Q.current=A;const Le=o.useRef(H);Le.current=H;const G=o.useRef(O);G.current=O;const bt=o.useRef(-1),ge=O[H]??null,ht=o.useCallback(i=>{if(!i){_([]),D(0);return}const h=i.mountKey?i:{...i,mountKey:Pt()};_(u=>{const x=u.findIndex(N=>N.agent===h.agent&&N.sessionId===h.sessionId);if(x>=0)return D(x),u;if(u.length<le.current){const N=[...u,h];return D(N.length-1),N}if(le.current<pn){const N=[...u,h];return T(Ge(N.length,Q.current)),D(N.length-1),N}const w=[...u];return w[Le.current]=h,w})},[_,D,T]),[Qe,Ye]=o.useState(!1),[te,$e]=o.useState(null),[Oe,Xe]=o.useState(""),[ne,De]=o.useState("all"),[me,Ze]=o.useState({}),[Ie,vt]=o.useState({}),be=o.useDeferredValue(Oe),ae=o.useRef(!1),Je=o.useRef({}),Te=o.useRef(d);Te.current=d;const jt=o.useRef(me);jt.current=me;const Ee=o.useRef(new Set),ve=o.useRef({});o.useEffect(()=>()=>{for(const i of Object.values(ve.current))clearTimeout(i)},[]),o.useEffect(()=>{_(i=>{let h=!1;const u=i.map(x=>{const w=Ie[x.workdir];if(!w)return x;const N=Ln(w,x.agent,x.sessionId);return N===x.sessionId?x:(h=!0,{...x,sessionId:N})});return h?u:i})},[Ie,_]);const je=o.useCallback(async()=>{try{const i=await re.getWorkspaces(),h=i.ok?i.workspaces:[];h.length&&p(u=>u.length===h.length&&u.every((x,w)=>x.path===h[w].path&&x.name===h[w].name)?u:h),ae.current=!0}catch{ae.current=!0}finally{k(!1)}},[]);o.useEffect(()=>{je()},[je]);const M=o.useCallback(async(i,h={})=>{if(!Je.current[i]){Je.current[i]=!0,h.background||g(u=>({...u,[i]:!0}));try{const u=await Os(i,{force:h.force});o.startTransition(()=>{vt(x=>{const w=u.promotions||{},N=x[i];return N&&Object.keys(N).length===Object.keys(w).length&&Object.entries(w).every(([S,R])=>N[S]===R)?x:{...x,[i]:w}}),m(x=>{const w=u.sessions||[],N=x[i]||[],S=new Set(w.map(U=>q(U.agent||"",U.sessionId))),R=N.filter(U=>{if(U.runState!=="running")return!1;const P=q(U.agent||"",U.sessionId);if(S.has(P))return!1;const F=jt.current[P];return!(F?.resolvedKey&&F.resolvedKey!==P)});return{...x,[i]:R.length?[...R,...w]:w}})})}catch{h.background||o.startTransition(()=>{m(u=>({...u,[i]:[]}))})}finally{Je.current[i]=!1,h.background||g(u=>({...u,[i]:!1}))}}},[]),pe=o.useRef(l);o.useEffect(()=>{l!==pe.current&&(pe.current=l,!(!l||!ae.current)&&je().then(()=>{M(l,{force:!0})}))},[l,je,M]);const J=o.useCallback((i,h)=>{const u=i.agent||"";!u||!i.sessionId||(hn(),Us({workdir:h,agent:u,sessionId:i.sessionId,rich:!0,turnOffset:0,turnLimit:Qr}))},[]),wt=o.useCallback((i,h,u=qr)=>{const x=`${h}:${q(i.agent||"",i.sessionId)}`,w=ve.current[x];w&&clearTimeout(w),ve.current[x]=setTimeout(()=>{delete ve.current[x],J(i,h)},u)},[J]),Me=o.useCallback((i,h)=>{const u=`${h}:${q(i.agent||"",i.sessionId)}`,x=ve.current[u];x&&(clearTimeout(x),delete ve.current[u])},[]);o.useEffect(()=>{n&&hn()},[n]),o.useEffect(()=>{if(!n)return;const i=[];return c.forEach((h,u)=>{if(d[h.path]||b[h.path])return;const x=setTimeout(()=>{M(h.path)},u*90);i.push(x)}),()=>{for(const h of i)clearTimeout(h)}},[n,M,b,d,c]);const et=o.useRef(new Map);In(n&&ae.current&&c.length>0?"sessions-changed":null,o.useCallback(i=>{if(typeof document<"u"&&document.visibilityState==="hidden")return;const h=i.key,u=h?c.filter(N=>(Te.current[N.path]||[]).some(S=>q(S.agent||"",S.sessionId)===h)):c,x=u.length?u:c,w=et.current;for(const N of x)w.has(N.path)&&clearTimeout(w.get(N.path)),w.set(N.path,setTimeout(()=>{w.delete(N.path),M(N.path,{background:!0,force:!0})},300))},[c,M]));const Fe=o.useCallback(i=>{const h=i.agent||"";return!h||!i.sessionId?i:Ns(i,me[q(h,i.sessionId)]||null)},[me]);In("stream-update",o.useCallback(i=>{const h=i.key;if(!h)return;const u=Ss(h,i.snapshot??null);Ze(x=>{if(!u){const P=x[h];return!P||P.phase==="done"?x:{...x,[h]:{...P,phase:"done",updatedAt:Date.now()}}}const w=(P,F)=>!!P&&!!F&&P.phase===F.phase&&P.resolvedKey===F.resolvedKey&&P.sessionId===F.sessionId&&P.incomplete===F.incomplete&&P.error===F.error,N=w(x[h],u),S=u.resolvedKey===h||w(x[u.resolvedKey],{...u,key:u.resolvedKey});if(N&&S)return x;const R=Date.now()-Yr,U={};for(const[P,F]of Object.entries(x))F.phase==="done"&&F.updatedAt<R||(U[P]=F);return U[h]=u,u.resolvedKey!==h&&(U[u.resolvedKey]={...u,key:u.resolvedKey}),U})},[])),Cs(o.useCallback(()=>{if(!(!n||!ae.current||c.length===0))for(const i of c)M(i.path,{background:!0,force:!0})},[n,c,M])),o.useEffect(()=>{if(!n||!ae.current||c.length===0)return;const i=()=>{if(!(typeof document<"u"&&document.visibilityState==="hidden"))for(const u of c)M(u.path,{background:!0,force:!0})};if(i(),typeof document>"u"||typeof window>"u")return;const h=()=>{document.visibilityState==="visible"&&i()};return document.addEventListener("visibilitychange",h),window.addEventListener("focus",h),()=>{document.removeEventListener("visibilitychange",h),window.removeEventListener("focus",h)}},[n,M,c]),o.useEffect(()=>{if(!n)return;const i=[];return c.forEach((h,u)=>{const x=(d[h.path]||[])[0];if(!x)return;const w=`${h.path}:${q(x.agent||"",x.sessionId)}`;if(Ee.current.has(w))return;const N=setTimeout(()=>{Ee.current.add(w),J(x,h.path)},Gr+u*120);i.push(N)}),()=>{for(const h of i)clearTimeout(h)}},[n,d,J,c]);const Qt=o.useCallback(async i=>{try{(await re.addWorkspace(i)).ok&&(Ye(!1),await je(),M(i))}catch{}},[je,M]),[xe,we]=o.useState(null),[ke,kt]=o.useState(!1),[ce,Ue]=o.useState(null),tt=o.useCallback(i=>{we(i)},[]),nt=o.useCallback(async()=>{const i=xe;if(i){kt(!0);try{await re.removeWorkspace(i),p(h=>h.filter(u=>u.path!==i)),m(h=>{const u={...h};return delete u[i],u}),_(h=>{const u=h.filter(x=>x.workdir!==i);return u.length!==h.length&&T(Ge(u.length,Q.current)),u}),D(0),we(null)}catch{}finally{kt(!1)}}},[xe]),st=o.useCallback(i=>{M(i,{force:!0})},[M]),[Ae,ye]=o.useState(null),[ze,pt]=o.useState(!1),[de,rt]=o.useState(!1),ot=ie(i=>i.toast),[oe,_e]=o.useState(null),yt=o.useCallback((i,h,u)=>{_e({anchor:{right:i.right,bottom:i.bottom},target:{workdir:u,agent:h.agent||"",sessionId:h.sessionId,title:Pn(h).slice(0,120)||h.sessionId.slice(0,16)}})},[]);o.useEffect(()=>{if(!oe)return;const i=()=>_e(null),h=u=>{u.key==="Escape"&&i()};return window.addEventListener("mousedown",i),window.addEventListener("scroll",i,!0),window.addEventListener("resize",i),window.addEventListener("keydown",h),()=>{window.removeEventListener("mousedown",i),window.removeEventListener("scroll",i,!0),window.removeEventListener("resize",i),window.removeEventListener("keydown",h)}},[oe]);const xt=o.useCallback(i=>{pt(!1),ye(i),_e(null)},[]),Ne=o.useCallback(async()=>{const i=Ae;if(i){rt(!0);try{const h=await re.deleteSession(i.workdir,i.agent,i.sessionId,ze);if(!h.ok){const u=h.error?.includes("still running")?r("session.deleteRunningError"):h.error||r("session.deleteFailed");ot(u,!1);return}m(u=>{const x=u[i.workdir];if(!x)return u;const w=x.filter(N=>!(N.agent===i.agent&&N.sessionId===i.sessionId));return w.length===x.length?u:{...u,[i.workdir]:w}}),_(u=>{const x=u.filter(w=>!(w.workdir===i.workdir&&w.agent===i.agent&&w.sessionId===i.sessionId));return x.length!==u.length&&T(Ge(x.length,Q.current)),x}),ye(null)}catch(h){ot(h?.message||r("session.deleteFailed"),!1)}finally{rt(!1)}}},[Ae,ze,r,ot]),Nt=o.useCallback(i=>{_(h=>{let u=!1;const x=h.map(w=>w.mountKey===i&&(w.pendingPrompt!=null||w.pendingImageUrls)?(u=!0,{...w,pendingPrompt:null,pendingImageUrls:void 0}):w);return u?x:h})},[_]),Ke=o.useCallback((i,h,u)=>{J({agent:i.agent,sessionId:i.sessionId,runState:"running"},i.workdir),m(N=>{const S=N[i.workdir]||[];if(S.some(P=>P.sessionId===i.sessionId&&P.agent===i.agent))return N;const U={sessionId:i.sessionId,agent:i.agent,runState:"running",lastQuestion:h,createdAt:new Date().toISOString(),runUpdatedAt:new Date().toISOString()};return{...N,[i.workdir]:[U,...S]}});const x=bt.current,w={...i,mountKey:Pt(),pendingPrompt:h||null,pendingImageUrls:u&&u.length?u:void 0};o.startTransition(()=>{$e(null),_(N=>{if(x>=N.length)return[...N,w];const S=[...N];return S[x]=w,S}),D(x>=0?x:0)}),M(i.workdir,{background:!0,force:!0})},[M,J,_,D]),St=o.useCallback(i=>{G.current.length>=le.current&&le.current<pn&&T(Ge(le.current+1,Q.current)),$e(i)},[T]),Ct=o.useCallback(()=>{$e(null),T(Ge(G.current.length,Q.current))},[T]),Lt=o.useCallback((i,h)=>{J(i,h);const u=i.agent||"";G.current.some(x=>x.agent===u&&x.sessionId===i.sessionId)&&T(Ge(G.current.length,Q.current)),$e(null),o.startTransition(()=>{ht({agent:u,sessionId:i.sessionId,workdir:h})})},[J,T]),It=o.useCallback((i,h)=>{J({agent:i.agent,sessionId:i.sessionId,runState:"running"},i.workdir),o.startTransition(()=>{h!=null?(_(u=>{if(h>=u.length)return u;const x=[...u];return x[h]={...u[h],agent:i.agent,sessionId:i.sessionId,workdir:i.workdir},x}),D(h)):ht({...i,mountKey:Pt()})}),M(i.workdir,{background:!0,force:!0})},[M,J]),ue=o.useCallback(i=>{let h=i;if(ne==="running"?h=h.filter(u=>$t(u)==="running"):ne==="review"&&(h=h.filter(u=>$t(u)==="incomplete")),be.trim()){const u=be.toLowerCase();h=h.filter(x=>(x.lastMessageText||"").toLowerCase().includes(u)||(x.lastQuestion||"").toLowerCase().includes(u)||(x.lastAnswer||"").toLowerCase().includes(u)||(x.title||"").toLowerCase().includes(u)||(x.agent||"").toLowerCase().includes(u))}return h},[be,ne]),Tt=o.useMemo(()=>{const i={};for(const h of c){const u=(d[h.path]||[]).map(Fe),x=Ie[h.path],w=new Map;for(const S of u){const R=q(S.agent||"",S.sessionId),U=me[R],P=x?Ln(x,S.agent||"",S.sessionId):S.sessionId,F=U?.resolvedKey&&U.resolvedKey!==R?U.resolvedKey:P!==S.sessionId?q(S.agent||"",P):R,Re=w.get(F);if(!Re){w.set(F,S);continue}q(Re.agent||"",Re.sessionId)!==F&&R===F&&w.set(F,S)}const N=ue([...w.values()]);i[h.path]=Xr(N)}return i},[c,d,me,Ie,ue,Fe]),ft=o.useCallback(i=>{const h=(d[i.workdir]||[]).find(u=>u.sessionId===i.sessionId&&u.agent===i.agent)??{sessionId:i.sessionId,agent:i.agent,runState:"running"};return Fe(h)},[Fe,d]),Yt=o.useMemo(()=>new Set(O.map(i=>q(i.agent,i.sessionId))),[O]),Xt=ge?q(ge.agent,ge.sessionId):null,it=o.useCallback(i=>{_(h=>{const u=h.filter((x,w)=>w!==i);return u.length===0?D(0):Le.current>=u.length&&D(u.length-1),T(Ge(u.length,Q.current)),u})},[_,D,T]);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:Oe,onChange:i=>Xe(i.target.value),placeholder:r("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"}),Oe&&e.jsx("button",{onClick:()=>Xe(""),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(i=>e.jsx("button",{onClick:()=>De(i),className:L("flex-1 px-2 py-[5px] rounded-md text-[11px] font-medium transition-all duration-200",ne===i?"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:r(`hub.filter${i[0].toUpperCase()+i.slice(1)}`)},i))})]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:v?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(fe,{className:"h-4 w-4 text-fg-5"})}):c.length===0&&!Qe?e.jsx("div",{className:"py-12 text-center text-[13px] text-fg-5",children:r("hub.noWorkspaces")}):c.map(i=>e.jsx(lo,{workspace:i,sessions:Tt[i.path]||[],loading:!!b[i.path]||!(i.path in d),isActive:i.path===l,selectedKey:Xt,openSessionKeys:Yt,onSelectSession:Lt,onNewSession:St,onRefresh:st,onRemove:tt,onExtensions:Ue,onWarmSession:wt,onCancelWarmSession:Me,onSessionMenuOpen:yt,t:r},i.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(i=>e.jsx("button",{onClick:()=>C(i),className:L("flex-1 flex items-center justify-center p-1.5 rounded transition-all",y===i?"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:r(`hub.layout${i}`),children:i===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"})}):i===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"})]}):i===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"})]})},i))}),e.jsxs(We,{variant:"ghost",size:"sm",onClick:()=>Ye(i=>!i),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"})]}),r("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(${y===6?3:y}, 1fr)`,gridTemplateRows:y===6?"repeat(2, 1fr)":"1fr"},children:(()=>{const i=te?O.length<y?O.length:H:-1;return bt.current=i,Array.from({length:y},(h,u)=>{if(te&&u===i)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(oo,{workdir:te,workspaceName:c.find(S=>S.path===te)?.name||te.split("/").pop()||"",onSessionCreated:Ke,onClose:Ct,t:r},te)},`new-${te}`);const x=O[u]??null;if(!x)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:r("hub.emptySlot")})]})},`empty-${u}`);const w=ft(x),N=u===H;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",N?"border-primary/40 ring-[3px] ring-primary/[0.06]":"border-edge hover:border-edge-h"),style:{boxShadow:N?"var(--th-card-shadow), 0 0 0 1px rgba(14,165,233,0.08)":"var(--th-card-shadow)"},onClick:()=>D(u),children:[e.jsxs("div",{className:L("shrink-0 flex items-center gap-2 px-2.5 h-8 border-b border-edge/30",N?"bg-primary/[0.03]":"bg-panel/60"),children:[(()=>{const S=$t(w);return e.jsx(Gt,{variant:S==="running"?"ok":S==="waiting"?"info":S==="incomplete"?"warn":"idle",pulse:S==="running"||S==="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:x.workdir.split("/").pop()||x.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)||(Ft(x.sessionId)?r("hub.newSession"):x.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:r("hub.created"),children:Ls(w.createdAt)}),w.runUpdatedAt&&e.jsx("span",{title:r("hub.updated"),children:Wn(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:S=>{S.stopPropagation(),he(R=>!R)},className:L("p-0.5 rounded transition-colors",E?"text-fg-3 bg-panel-h":"text-fg-5/40 hover:text-fg-3 hover:bg-panel-h"),title:r("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:S=>{S.stopPropagation(),it(u)},className:"p-0.5 rounded text-fg-5/40 hover:text-fg-2 hover:bg-panel-h transition-colors",title:r("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(o.Suspense,{fallback:e.jsx("div",{className:"h-full"}),children:e.jsx(Vr,{session:w,workdir:x.workdir,active:n&&N,onSessionChange:S=>It(S,u),initialPendingPrompt:x.pendingPrompt??null,initialPendingImageUrls:x.pendingImageUrls,onPendingPromptConsumed:()=>Nt(x.mountKey)},x.mountKey)})})]},x.mountKey||q(x.agent,x.sessionId))})})()})}),E&&ge&&e.jsx(co,{workdir:ge.workdir,onClose:()=>he(!1),t:r}),e.jsx(ro,{open:Qe,initialPath:l||void 0,onAdd:Qt,onClose:()=>Ye(!1),t:r}),e.jsxs(zt,{open:!!xe,onClose:()=>!ke&&we(null),children:[e.jsx(Kt,{title:r("hub.removeWorkspace"),onClose:()=>!ke&&we(null)}),e.jsx("div",{className:"text-[13px] text-fg-3 leading-relaxed",children:r("modal.confirmRemoveWorkspace")}),e.jsx("div",{className:"mt-1 text-[12px] text-fg-5",children:r("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(We,{variant:"ghost",onClick:()=>we(null),disabled:ke,children:r("modal.cancel")}),e.jsx(We,{variant:"primary",onClick:nt,disabled:ke,className:"!bg-red-500/90 !border-red-500/50 hover:!bg-red-500 !text-white",children:r(ke?"modal.removing":"modal.remove")})]})]}),oe&&(()=>{const h=Math.max(8,Math.min(oe.anchor.right-160,window.innerWidth-160-8)),u=Math.min(oe.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:h,top:u,boxShadow:"0 8px 24px rgba(0,0,0,0.20), 0 2px 6px rgba(0,0,0,0.10)"},onMouseDown:x=>x.stopPropagation(),role:"menu",children:e.jsxs("button",{type:"button",role:"menuitem",onClick:()=>xt(oe.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"})]}),r("session.delete")]})})})(),e.jsxs(zt,{open:!!Ae,onClose:()=>!de&&ye(null),children:[e.jsx(Kt,{title:r("session.deleteTitle"),onClose:()=>!de&&ye(null)}),e.jsx("div",{className:"text-[13px] text-fg-3 leading-relaxed",children:r("session.deleteHint")}),Ae&&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:Ae.agent}),e.jsx("span",{className:"mx-1.5 text-fg-5/50",children:"·"}),e.jsx("span",{children:Ae.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:!ze,onChange:()=>pt(!1),disabled:de,className:"mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[12px] text-fg-2",children:r("session.deletePikiloomOnly")}),e.jsx("div",{className:"text-[11px] text-fg-5 leading-snug mt-0.5",children:r("session.deletePikiloomOnlyHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"delete-session-scope",checked:ze,onChange:()=>pt(!0),disabled:de,className:"mt-0.5"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[12px] text-fg-2",children:r("session.deletePurgeNative")}),e.jsx("div",{className:"text-[11px] text-fg-5 leading-snug mt-0.5",children:r("session.deletePurgeNativeHint")})]})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(We,{variant:"ghost",onClick:()=>ye(null),disabled:de,children:r("modal.cancel")}),e.jsx(We,{variant:"primary",onClick:Ne,disabled:de,className:"!bg-red-500/90 !border-red-500/50 hover:!bg-red-500 !text-white",children:r(de?"session.deleting":"modal.remove")})]})]}),e.jsx(Hr,{open:!!ce,onClose:()=>Ue(null),workdir:ce||""})]})});function ro({open:t,initialPath:n,onAdd:s,onClose:l,t:r}){const[c,p]=o.useState(""),d=o.useCallback(m=>p(m),[]);return o.useEffect(()=>{t&&p("")},[t]),e.jsxs(zt,{open:t,onClose:l,children:[e.jsx(Kt,{title:r("hub.addWorkspace"),onClose:l}),e.jsx(Ms,{initialPath:n,maxHeight:360,minHeight:200,onSelect:d,t:r}),e.jsxs("div",{className:"flex gap-2 mt-4",children:[e.jsx(We,{disabled:!c,onClick:()=>c&&s(c),className:"flex-1",children:r("hub.add")}),e.jsx(We,{variant:"secondary",onClick:l,className:"flex-1",children:r("hub.cancel")})]})]})}function oo({workdir:t,workspaceName:n,onSessionCreated:s,onClose:l,t:r}){const[c,p]=o.useState(null),[d,m]=o.useState([]),b=o.useRef(null),g=o.useRef([]),v=o.useMemo(()=>({sessionId:"",agent:"",runState:"completed"}),[]),k=o.useCallback(()=>{},[]),y=o.useCallback((W,O)=>{p(W||null),b.current=W||null;const K=O||[];m(K),g.current=K},[]),$=o.useCallback(W=>{const O=g.current;g.current=[],s(W,b.current||void 0,O.length?O:void 0)},[s]),A=!!c||d.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:r("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(Gt,{variant:A?"ok":"idle",pulse:A}),!A&&e.jsx("button",{onClick:l,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:A?e.jsxs("div",{className:"max-w-[900px] mx-auto px-6 py-6 space-y-0",children:[e.jsx(os,{text:c||"",blocks:d.map(W=>({type:"image",content:W})),t:r}),e.jsx("div",{className:"mt-3 mb-4 animate-in",children:e.jsx(ts,{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:r("hub.newSessionHint")})})})}),e.jsx(ur,{session:v,workdir:t,onStreamQueued:k,onSendStart:y,onSessionChange:$,t:r,streamPhase:null})]})}function io({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
+ `);return e.jsx(Is,{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 lo=o.memo(function({workspace:n,sessions:s,loading:l,isActive:r,selectedKey:c,openSessionKeys:p,onSelectSession:d,onNewSession:m,onRefresh:b,onRemove:g,onExtensions:v,onWarmSession:k,onCancelWarmSession:y,onSessionMenuOpen:$,t:A}){const[W,O]=o.useState(!0),[K,H]=o.useState(cn);o.useEffect(()=>{H(cn)},[s.length]);const Z=s.slice(0,K),T=s.length-K,V=n.path,[_,D]=o.useState(null),C=o.useCallback(()=>{re.getWorkspaceGit(V).then(E=>D(E.git)).catch(()=>D(null))},[V]);return o.useEffect(()=>{C()},[C]),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:()=>O(E=>!E),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",W&&"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",r?"text-primary":"text-fg-3"),children:n.name}),e.jsx(io,{git:_})]}),r&&e.jsx(Gt,{variant:"ok"}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx("button",{onClick:E=>{E.stopPropagation(),m(V)},className:"p-1 rounded text-fg-5 hover:text-primary hover:bg-panel-h/60 transition-colors",title:A("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:E=>{E.stopPropagation(),v(V)},className:"p-1 rounded text-fg-5 hover:text-primary hover:bg-panel-h/60 transition-colors",title:A("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:E=>{E.stopPropagation(),b(V),C()},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"})]})}),!r&&e.jsx("button",{onClick:E=>{E.stopPropagation(),g(V)},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"})]})})]})]}),W&&e.jsx("div",{className:"pb-1",children:l?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(fe,{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:A("sessions.noSessions")}):e.jsxs(e.Fragment,{children:[Z.map(E=>{const he=q(E.agent||"",E.sessionId),le=E.__forkDepth||0;return e.jsx(ao,{session:E,isSelected:c===he,isOpen:p?.has(he)??!1,forkDepth:le,onClick:()=>d(E,V),onWarm:()=>k(E,V),onCancelWarm:()=>y(E,V),onShowMenu:Q=>$(Q,E,V),menuLabel:A("session.openActions")},he)}),T>0&&e.jsxs("button",{onClick:()=>H(E=>E+cn),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:["+ ",A("hub.nMore").replace("{n}",String(T))]}),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"})})]})]})})]})}),ao=o.memo(function({session:n,isSelected:s,isOpen:l,forkDepth:r=0,onClick:c,onWarm:p,onCancelWarm:d,onShowMenu:m,menuLabel:b}){const g=dn(n.agent||""),v=$t(n),k=Pn(n).slice(0,500)||(Ft(n.sessionId)?"":n.sessionId.slice(0,16)),y=Ts(n,k).slice(0,500),$=n.model?Ut(n.model):null,A=r>0?Math.min(r,3)*14:0,W=l?10:12,O=o.useRef(null);return e.jsxs("div",{className:"relative group",children:[e.jsxs("button",{onClick:c,onMouseEnter:p,onFocus:p,onMouseLeave:d,onBlur:d,className:L("w-full pr-3 py-2 text-left transition-all duration-100",s?"bg-selected hover:bg-selected-h":l?"bg-panel-h/30 hover:bg-panel-h/50":"hover:bg-panel-h/50"),style:{paddingLeft:W+A,...l?{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:[r>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(ct,{brand:n.agent||"",size:10}),e.jsx("span",{className:"font-medium shrink-0",style:{color:g.color},children:g.shortLabel}),$&&e.jsx("span",{className:"truncate max-w-[72px] font-mono text-fg-5/40 text-[9px]",children:$}),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:Wn(n.runUpdatedAt||n.createdAt)})]})]}),e.jsxs("div",{className:"mt-1 flex items-center gap-1.5",children:[e.jsx(Gt,{variant:v==="running"?"ok":v==="waiting"?"info":v==="incomplete"?"warn":"idle",pulse:v==="running"||v==="waiting"}),e.jsx("span",{className:"truncate text-[12px] leading-snug text-fg-2",children:k})]}),y&&e.jsx("div",{className:"mt-0.5 pl-[11px]",children:e.jsx("span",{className:"block truncate text-[10px] leading-snug text-fg-5",children:y})})]}),e.jsx("button",{ref:O,type:"button","aria-label":b,"aria-haspopup":"menu",onMouseDown:K=>{K.stopPropagation()},onClick:K=>{K.stopPropagation(),K.preventDefault(),O.current&&m(O.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"})]})})]})}),co=o.memo(function({workdir:n,onClose:s,t:l}){const r=ie(g=>g.state?.hostApp??null),c=ie(g=>g.state?.platform??null),p=ie(g=>g.toast),[d,m]=o.useState(()=>no(r,c)),b=o.useCallback(async g=>{try{const v=await re.openInEditor(g,d);if(!v.ok)throw new Error(v.error||`Failed to open ${g}`)}catch(v){p(v?.message||String(v),!1)}},[d,p]);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:l("hub.files")}),e.jsx("button",{onClick:s,className:"p-0.5 rounded text-fg-5/40 hover:text-fg-2 transition-colors",title:l("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(Es,{value:d,options:(c==="darwin"?["vscode","finder"]:["vscode"]).map(g=>({value:g,label:l(is(g))})),onChange:g=>{to(g)&&m(g)},renderIcon:g=>e.jsx(ls,{target:g,size:14})}),e.jsx(We,{size:"sm",variant:"ghost",onClick:()=>b(n),className:"flex-1 min-w-0 text-[11px]",children:l("hub.openProject")})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-1 py-1.5",children:e.jsx(uo,{basePath:n,openTarget:d,onOpenPath:b,t:l})})]})});function ls({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(ct,{brand:t,size:n})}function uo({basePath:t,includeHidden:n=!1,openTarget:s,onOpenPath:l,t:r}){const[c,p]=o.useState([]),[d,m]=o.useState(!0);o.useEffect(()=>{let g=!1;return m(!0),re.lsDir(t,!0,n).then(v=>{!g&&v.ok&&p(v.dirs.slice(0,50).map(k=>({entry:k,expanded:!1,children:null,loading:!1})))}).catch(()=>{}).finally(()=>{g||m(!1)}),()=>{g=!0}},[t,n]);const b=o.useCallback(g=>{const v=k=>k.map(y=>y.entry.path===g?y.expanded?{...y,expanded:!1}:y.children===null?(re.lsDir(g,!0,n).then($=>{$.ok&&p(A=>xn(A,g,{children:$.dirs.slice(0,50).map(W=>({entry:W,expanded:!1,children:null,loading:!1})),loading:!1}))}).catch(()=>{p($=>xn($,g,{children:[],loading:!1}))}),{...y,loading:!0,expanded:!0}):{...y,expanded:!0}:y.children?{...y,children:v(y.children)}:y);p(k=>v(k))},[n]);return d?e.jsx("div",{className:"flex justify-center py-3",children:e.jsx(fe,{className:"h-3 w-3 text-fg-5"})}):c.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(as,{nodes:c,depth:0,onToggle:b,openTarget:s,onOpenPath:l,t:r})})}function as({nodes:t,depth:n,onToggle:s,openTarget:l,onOpenPath:r,t:c}){return e.jsx(e.Fragment,{children:t.map(p=>e.jsx(ho,{node:p,depth:n,onToggle:s,openTarget:l,onOpenPath:r,t:c},p.entry.path))})}function ho({node:t,depth:n,onToggle:s,openTarget:l,onOpenPath:r,t:c}){const{entry:p,expanded:d,children:m,loading:b}=t,g=n*14,[v,k]=o.useState(!1),y=c(is(l)),$=c("hub.openWithTarget").replace("{target}",y);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{onClick:p.isDir?()=>s(p.path):void 0,onMouseEnter:()=>k(!0),onMouseLeave:()=>k(!1),className:L("flex items-center gap-1.5 py-1 rounded text-[11px] text-fg-3 transition-colors",p.isDir?"hover:bg-panel-h/50 cursor-pointer":"hover:bg-panel-h/50 cursor-default"),style:{paddingLeft:8+g,paddingRight:8},children:[p.isDir?b?e.jsx(fe,{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",d&&"rotate-90"),children:e.jsx("polyline",{points:"9 6 15 12 9 18"})}):e.jsx("span",{className:"w-2 shrink-0"}),p.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:p.name}),v&&e.jsxs("div",{className:"flex items-center gap-0.5 shrink-0",children:[e.jsx("button",{onClick:A=>{A.stopPropagation(),r(p.path)},className:"inline-flex items-center gap-1 rounded px-1 py-0.5 text-fg-5 hover:text-blue-400 transition-colors",title:$,children:e.jsx(ls,{target:l,subtle:!0})}),!p.isDir&&e.jsx(po,{filePath:p.path,t:c})]})]}),p.isDir&&d&&m&&m.length>0&&e.jsx(as,{nodes:m,depth:n+1,onToggle:s,openTarget:l,onOpenPath:r,t:c})]})}function po({filePath:t,t:n}){const[s,l]=o.useState(!1);return e.jsx("button",{onClick:r=>{r.stopPropagation(),navigator.clipboard.writeText(t).then(()=>{l(!0),setTimeout(()=>l(!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 xn(t,n,s){return t.map(l=>l.entry.path===n?{...l,...s}:l.children?{...l,children:xn(l.children,n,s)}:l)}const Ao=Object.freeze(Object.defineProperty({__proto__:null,SessionWorkspace:so},Symbol.toStringTag,{value:"Module"}));export{ur as I,Eo as L,Nr as R,Mo as T,os as U,Lo as a,es as b,Ks as c,No as d,So as e,ts as f,To as g,Ur as h,Ao as i,Fs as l,Io as m,Co as n,yo as o,Ds as p,ko as s};
@@ -1 +1 @@
1
- import{j as s}from"./react-vendor-C7Sl8SE7.js";import{O as t,m as i,S as a}from"./index-BbplxgnQ.js";function o({primary:e,secondary:l,tertiary:n}){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(i,{tone:"primary",onClick:e.onClick,disabled:e.disabled,children:[e.loading&&s.jsx(a,{}),e.label]}),l&&s.jsx(i,{tone:"secondary",onClick:l.onClick,disabled:l.disabled,children:l.label})]}),n&&s.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:n})]})}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{O as t,m as i,S as a}from"./index-CL5H13Cl.js";function o({primary:e,secondary:l,tertiary:n}){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(i,{tone:"primary",onClick:e.onClick,disabled:e.disabled,children:[e.loading&&s.jsx(a,{}),e.label]}),l&&s.jsx(i,{tone:"secondary",onClick:l.onClick,disabled:l.disabled,children:l.label})]}),n&&s.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:n})]})}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/png" href="/logo.png">
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-BbplxgnQ.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-CL5H13Cl.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-DwmXPtDd.css">
@@ -142,7 +142,7 @@ export async function resolveAccountEnv(agent, accountIdOverride) {
142
142
  const accountUsageById = new Map();
143
143
  const usageKey = (agent, id) => `${agent}/${id}`;
144
144
  /** Best-effort per-account usage: read the account's quota from its token (see claudeUsageForToken). */
145
- export async function probeAccountUsage(agent, id) {
145
+ export async function probeAccountUsage(agent, id, opts) {
146
146
  if (agent !== 'claude')
147
147
  return null;
148
148
  const rec = getAccount(agent, id);
@@ -150,7 +150,7 @@ export async function probeAccountUsage(agent, id) {
150
150
  return null;
151
151
  try {
152
152
  const token = await resolveCredential(rec.credential);
153
- const usage = token ? await claudeUsageForToken(token) : null;
153
+ const usage = token ? await claudeUsageForToken(token, opts) : null;
154
154
  accountUsageById.set(usageKey(agent, id), usage);
155
155
  return usage;
156
156
  }
@@ -1775,6 +1775,43 @@ function getClaudeOAuthToken() {
1775
1775
  return null;
1776
1776
  }
1777
1777
  }
1778
+ // Shape the `/api/oauth/usage` JSON into a UsageResult (shared by the sync curl probe and the
1779
+ // async fetch probe). Returns null on an API error payload or when no usable window is present.
1780
+ function buildClaudeOAuthUsage(data) {
1781
+ const apiError = data?.error;
1782
+ if (apiError && typeof apiError === 'object')
1783
+ return null;
1784
+ const makeWindow = (label, entry) => {
1785
+ if (!entry || typeof entry !== 'object')
1786
+ return null;
1787
+ const usedPercent = roundPercent(entry.utilization);
1788
+ if (usedPercent == null)
1789
+ return null;
1790
+ const remainingPercent = Math.max(0, Math.round((100 - usedPercent) * 10) / 10);
1791
+ const resetAt = typeof entry.resets_at === 'string' ? entry.resets_at : null;
1792
+ let resetAfterSeconds = null;
1793
+ if (resetAt) {
1794
+ const resetAtMs = Date.parse(resetAt);
1795
+ if (Number.isFinite(resetAtMs))
1796
+ resetAfterSeconds = Math.max(0, Math.round((resetAtMs - Date.now()) / 1000));
1797
+ }
1798
+ return {
1799
+ label, usedPercent, remainingPercent, resetAt, resetAfterSeconds,
1800
+ status: usedPercent >= 100 ? 'limit_reached' : usedPercent >= 80 ? 'warning' : 'allowed',
1801
+ };
1802
+ };
1803
+ const windows = [];
1804
+ for (const [label, key] of [['5h', 'five_hour'], ['7d', 'seven_day'], ['7d Opus', 'seven_day_opus'], ['7d Sonnet', 'seven_day_sonnet'], ['Extra', 'extra_usage']]) {
1805
+ const w = makeWindow(label, data[key]);
1806
+ if (w)
1807
+ windows.push(w);
1808
+ }
1809
+ if (!windows.length)
1810
+ return null;
1811
+ const overallStatus = windows.some(w => w.status === 'limit_reached') ? 'limit_reached'
1812
+ : windows.some(w => w.status === 'warning') ? 'warning' : 'allowed';
1813
+ return { ok: true, agent: 'claude', source: 'oauth-api', capturedAt: new Date().toISOString(), status: overallStatus, windows, error: null };
1814
+ }
1778
1815
  function getClaudeUsageFromOAuth(tokenOverride) {
1779
1816
  const token = tokenOverride || getClaudeOAuthToken();
1780
1817
  if (!token)
@@ -1783,46 +1820,37 @@ function getClaudeUsageFromOAuth(tokenOverride) {
1783
1820
  const raw = execSync(`curl -s --max-time 5 -H "Authorization: Bearer ${token}" -H "anthropic-beta: oauth-2025-04-20" -H "Content-Type: application/json" "https://api.anthropic.com/api/oauth/usage"`, { encoding: 'utf-8', timeout: 8000 }).trim();
1784
1821
  if (!raw || raw[0] !== '{')
1785
1822
  return null;
1786
- const data = JSON.parse(raw);
1787
- const capturedAt = new Date().toISOString();
1788
- const apiError = data?.error;
1789
- if (apiError && typeof apiError === 'object') {
1790
- return null;
1791
- }
1792
- const makeWindow = (label, entry) => {
1793
- if (!entry || typeof entry !== 'object')
1794
- return null;
1795
- const usedPercent = roundPercent(entry.utilization);
1796
- if (usedPercent == null)
1797
- return null;
1798
- const remainingPercent = Math.max(0, Math.round((100 - usedPercent) * 10) / 10);
1799
- const resetAt = typeof entry.resets_at === 'string' ? entry.resets_at : null;
1800
- let resetAfterSeconds = null;
1801
- if (resetAt) {
1802
- const resetAtMs = Date.parse(resetAt);
1803
- if (Number.isFinite(resetAtMs))
1804
- resetAfterSeconds = Math.max(0, Math.round((resetAtMs - Date.now()) / 1000));
1805
- }
1806
- return {
1807
- label, usedPercent, remainingPercent, resetAt, resetAfterSeconds,
1808
- status: usedPercent >= 100 ? 'limit_reached' : usedPercent >= 80 ? 'warning' : 'allowed',
1809
- };
1810
- };
1811
- const windows = [];
1812
- for (const [label, key] of [['5h', 'five_hour'], ['7d', 'seven_day'], ['7d Opus', 'seven_day_opus'], ['7d Sonnet', 'seven_day_sonnet'], ['Extra', 'extra_usage']]) {
1813
- const w = makeWindow(label, data[key]);
1814
- if (w)
1815
- windows.push(w);
1816
- }
1817
- if (!windows.length)
1818
- return null;
1819
- const overallStatus = windows.some(w => w.status === 'limit_reached') ? 'limit_reached'
1820
- : windows.some(w => w.status === 'warning') ? 'warning' : 'allowed';
1821
- return { ok: true, agent: 'claude', source: 'oauth-api', capturedAt, status: overallStatus, windows, error: null };
1823
+ return buildClaudeOAuthUsage(JSON.parse(raw));
1824
+ }
1825
+ catch {
1826
+ return null;
1827
+ }
1828
+ }
1829
+ // Non-blocking variant for the live (getUsageLive) path — execSync would stall the event loop.
1830
+ async function fetchClaudeUsageFromOAuth(tokenOverride) {
1831
+ const token = tokenOverride || getClaudeOAuthToken();
1832
+ if (!token)
1833
+ return null;
1834
+ const controller = new AbortController();
1835
+ const timer = setTimeout(() => controller.abort(), 5_000);
1836
+ try {
1837
+ const res = await fetch('https://api.anthropic.com/api/oauth/usage', {
1838
+ headers: {
1839
+ authorization: `Bearer ${token}`,
1840
+ 'anthropic-beta': 'oauth-2025-04-20',
1841
+ 'content-type': 'application/json',
1842
+ },
1843
+ signal: controller.signal,
1844
+ });
1845
+ const data = await res.json().catch(() => null);
1846
+ return data ? buildClaudeOAuthUsage(data) : null;
1822
1847
  }
1823
1848
  catch {
1824
1849
  return null;
1825
1850
  }
1851
+ finally {
1852
+ clearTimeout(timer);
1853
+ }
1826
1854
  }
1827
1855
  // Per-account usage for a specific account's `claude setup-token`.
1828
1856
  //
@@ -1900,13 +1928,13 @@ async function claudeUsageFromInferenceHeaders(token) {
1900
1928
  clearTimeout(timer);
1901
1929
  }
1902
1930
  }
1903
- export function claudeUsageForToken(token) {
1931
+ export function claudeUsageForToken(token, opts) {
1904
1932
  const t = String(token || '');
1905
1933
  if (!t)
1906
1934
  return Promise.resolve(null);
1907
1935
  const now = Date.now();
1908
1936
  const cached = claudeTokenUsageCache.get(t);
1909
- if (cached) {
1937
+ if (cached && !opts?.force) {
1910
1938
  const ttl = cached.ok ? TOKEN_USAGE_OK_TTL_MS : TOKEN_USAGE_RETRY_TTL_MS;
1911
1939
  if (now - cached.at < ttl)
1912
1940
  return Promise.resolve(cached.value);
@@ -2198,6 +2226,24 @@ class ClaudeDriver {
2198
2226
  }
2199
2227
  return claudeUsageCache.lastGood ?? telemetry();
2200
2228
  }
2229
+ // Live usage for the agent-status surface. Unlike getUsage it ignores the 5-min query TTL and
2230
+ // always re-probes, so a freshly-switched login (the keychain default-login token changed) is
2231
+ // reflected promptly instead of serving the previous account's frozen `lastGood`. Bounded by
2232
+ // the caller's usage timeout, with the cached value as fallback.
2233
+ async getUsageLive(opts) {
2234
+ const home = getHome();
2235
+ if (!home)
2236
+ return emptyUsage('claude', 'HOME is not set.');
2237
+ const fresh = await fetchClaudeUsageFromOAuth();
2238
+ if (fresh) {
2239
+ claudeUsageCache.lastGood = fresh;
2240
+ claudeUsageCache.lastAttemptAt = Date.now();
2241
+ return fresh;
2242
+ }
2243
+ return claudeUsageCache.lastGood
2244
+ ?? getClaudeUsageFromTelemetry(home, opts.model)
2245
+ ?? emptyUsage('claude', 'No recent Claude usage data found.');
2246
+ }
2201
2247
  async deleteNativeSession(workdir, sessionId) {
2202
2248
  const file = claudeSessionTranscriptPath(workdir, sessionId);
2203
2249
  if (!file || !fs.existsSync(file))
@@ -1641,6 +1641,11 @@ function getCodexSessionMessagesFromRollout(opts) {
1641
1641
  const fallbackMsgs = [];
1642
1642
  let pendingAssistant = null;
1643
1643
  let sawAssistantResponseItems = false;
1644
+ // Codex records the user turn twice: a rich `response_item` (role=user, carries the image as an
1645
+ // input_image data URL or a localImage path) AND a text-only `event_msg`/user_message. The
1646
+ // user bubble is built from the latter, so stash any images from the former and attach them
1647
+ // when the user_message arrives — otherwise pasted images vanish from codex history on reparse.
1648
+ let pendingUserImages = [];
1644
1649
  const ensureAssistant = () => {
1645
1650
  if (!pendingAssistant)
1646
1651
  pendingAssistant = { blocks: [], toolNamesByCallId: new Map() };
@@ -1677,12 +1682,18 @@ function getCodexSessionMessagesFromRollout(opts) {
1677
1682
  if (ev.payload.type === 'user_message' && typeof ev.payload.message === 'string') {
1678
1683
  flushAssistant();
1679
1684
  const text = stripInjectedPrompts(ev.payload.message).trim();
1680
- if (!text)
1685
+ const imageBlocks = pendingUserImages;
1686
+ pendingUserImages = [];
1687
+ if (!text && !imageBlocks.length)
1681
1688
  continue;
1682
1689
  const userMessage = { role: 'user', text };
1683
1690
  fallbackMsgs.push(userMessage);
1684
1691
  allMsgs.push(userMessage);
1685
- richMsgs.push({ role: 'user', text, blocks: [{ type: 'text', content: text }] });
1692
+ const blocks = [];
1693
+ if (text)
1694
+ blocks.push({ type: 'text', content: text });
1695
+ blocks.push(...imageBlocks);
1696
+ richMsgs.push({ role: 'user', text, blocks });
1686
1697
  }
1687
1698
  else if (ev.payload.type === 'agent_message' && typeof ev.payload.message === 'string') {
1688
1699
  const text = ev.payload.message.trim();
@@ -1695,6 +1706,23 @@ function getCodexSessionMessagesFromRollout(opts) {
1695
1706
  continue;
1696
1707
  const payload = ev.payload;
1697
1708
  if (payload.type === 'message') {
1709
+ if (payload.role === 'user') {
1710
+ for (const c of (Array.isArray(payload.content) ? payload.content : [])) {
1711
+ if (c?.type === 'input_image' && typeof c.image_url === 'string' && c.image_url.startsWith('data:image/')) {
1712
+ pendingUserImages.push({ type: 'image', content: c.image_url });
1713
+ }
1714
+ else if (c?.type === 'localImage' && typeof c.path === 'string') {
1715
+ try {
1716
+ if (fs.existsSync(c.path) && fs.statSync(c.path).size <= 4 * 1024 * 1024) {
1717
+ const ext = path.extname(c.path).toLowerCase();
1718
+ pendingUserImages.push({ type: 'image', content: `data:${mimeForExt(ext)};base64,${fs.readFileSync(c.path).toString('base64')}` });
1719
+ }
1720
+ }
1721
+ catch { /* ignore */ }
1722
+ }
1723
+ }
1724
+ continue;
1725
+ }
1698
1726
  if (payload.role !== 'assistant')
1699
1727
  continue;
1700
1728
  const text = extractCodexMessageText(payload.content);