claude-simple 0.2.21 → 0.2.22

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 (74) hide show
  1. package/README.md +6 -0
  2. package/dist/{app.0.2.21.min.js → app.0.2.22.min.js} +97 -98
  3. package/dist/index.html +2 -2
  4. package/dist/{style.0.2.21.min.css → style.0.2.22.min.css} +9 -0
  5. package/package.json +2 -1
  6. package/public/chat.js +8 -1
  7. package/public/index.html +4 -2
  8. package/public/math.js +72 -0
  9. package/public/mermaid.js +52 -0
  10. package/public/shell/templates.js +0 -1
  11. package/public/style.css +9 -0
  12. package/public/sw.js +5 -3
  13. package/public/vendor/fonts/KaTeX_AMS-Regular.ttf +0 -0
  14. package/public/vendor/fonts/KaTeX_AMS-Regular.woff +0 -0
  15. package/public/vendor/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  16. package/public/vendor/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  17. package/public/vendor/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  18. package/public/vendor/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  19. package/public/vendor/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  20. package/public/vendor/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  21. package/public/vendor/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  22. package/public/vendor/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  23. package/public/vendor/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  24. package/public/vendor/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  25. package/public/vendor/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  26. package/public/vendor/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  27. package/public/vendor/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  28. package/public/vendor/fonts/KaTeX_Main-Bold.ttf +0 -0
  29. package/public/vendor/fonts/KaTeX_Main-Bold.woff +0 -0
  30. package/public/vendor/fonts/KaTeX_Main-Bold.woff2 +0 -0
  31. package/public/vendor/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  32. package/public/vendor/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  33. package/public/vendor/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  34. package/public/vendor/fonts/KaTeX_Main-Italic.ttf +0 -0
  35. package/public/vendor/fonts/KaTeX_Main-Italic.woff +0 -0
  36. package/public/vendor/fonts/KaTeX_Main-Italic.woff2 +0 -0
  37. package/public/vendor/fonts/KaTeX_Main-Regular.ttf +0 -0
  38. package/public/vendor/fonts/KaTeX_Main-Regular.woff +0 -0
  39. package/public/vendor/fonts/KaTeX_Main-Regular.woff2 +0 -0
  40. package/public/vendor/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  41. package/public/vendor/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  42. package/public/vendor/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  43. package/public/vendor/fonts/KaTeX_Math-Italic.ttf +0 -0
  44. package/public/vendor/fonts/KaTeX_Math-Italic.woff +0 -0
  45. package/public/vendor/fonts/KaTeX_Math-Italic.woff2 +0 -0
  46. package/public/vendor/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  47. package/public/vendor/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  48. package/public/vendor/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  49. package/public/vendor/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  50. package/public/vendor/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  51. package/public/vendor/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  52. package/public/vendor/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  53. package/public/vendor/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  54. package/public/vendor/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  55. package/public/vendor/fonts/KaTeX_Script-Regular.ttf +0 -0
  56. package/public/vendor/fonts/KaTeX_Script-Regular.woff +0 -0
  57. package/public/vendor/fonts/KaTeX_Script-Regular.woff2 +0 -0
  58. package/public/vendor/fonts/KaTeX_Size1-Regular.ttf +0 -0
  59. package/public/vendor/fonts/KaTeX_Size1-Regular.woff +0 -0
  60. package/public/vendor/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  61. package/public/vendor/fonts/KaTeX_Size2-Regular.ttf +0 -0
  62. package/public/vendor/fonts/KaTeX_Size2-Regular.woff +0 -0
  63. package/public/vendor/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  64. package/public/vendor/fonts/KaTeX_Size3-Regular.ttf +0 -0
  65. package/public/vendor/fonts/KaTeX_Size3-Regular.woff +0 -0
  66. package/public/vendor/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  67. package/public/vendor/fonts/KaTeX_Size4-Regular.ttf +0 -0
  68. package/public/vendor/fonts/KaTeX_Size4-Regular.woff +0 -0
  69. package/public/vendor/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  70. package/public/vendor/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  71. package/public/vendor/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  72. package/public/vendor/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  73. package/public/vendor/katex.min.css +1 -0
  74. package/public/vendor/katex.min.js +1 -0
@@ -1,4 +1,4 @@
1
- var Rr=Object.defineProperty;var K=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var as=(e,t)=>{for(var n in t)Rr(e,n,{get:t[n],enumerable:!0})};function Br(){da||(da=!0,queueMicrotask(()=>{da=!1,fa()}))}function vo(e){for(let t of e)(t._isComputed?Gt:Kt).add(t);pa>0||os||(Or==="microtask"?Br():fa())}function wo(e,t,n,s){let a=new Set(n);for(let r of n)r._subs.delete(t);n.clear(),s?.forEach(r=>r?.()),s?.splice(0);let o=[wt,En,la];[wt,En,la]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[wt,En,la]=o}}var wt,En,pa,la,Gt,Kt,os,Sn,ca,Or,da,fa,yo,$,ma,Ce,ae,Le,Tn,qr,p,g,ko,i,ua,Fr,Re,Ln,Ur,is,Wr,Cc,$o,Ac,jc,So,Lo=K(()=>{wt=null,En=null,pa=0,la=null,Gt=new Set,Kt=new Set,os=!1,Sn=1e4,ca={flushes:0,runs:0,lastFlushRuns:0},Or="sync",da=!1;fa=()=>{if(os)return;os=!0;let e=0;ca.flushes++;try{for(;Gt.size||Kt.size;){for(;Gt.size;){let t=Gt.values().next().value;if(Gt.delete(t),++e>Sn)throw new Error(`mini-react: reactive update loop exceeded ${Sn} runs`);t()}if(Kt.size){let t=Kt.values().next().value;if(Kt.delete(t),++e>Sn)throw new Error(`mini-react: reactive update loop exceeded ${Sn} runs`);t()}}}finally{ca.runs+=e,ca.lastFlushRuns=e,e>Sn&&(Gt.clear(),Kt.clear()),os=!1}};yo=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return wt&&(this._subs.add(wt),En?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,vo(this._subs))}peek(){return this._v}},$=(e,{equals:t}={})=>new yo(e,t);ma=e=>{let t=new yo(void 0),n=new Set,s=!0,a=!1,o=l=>{if(!s||a)return t._v;s=!1;try{let c=wo(e,r,n,null),u=c!==t._v;u&&(t._v=c),u&&l&&vo(t._subs)}catch(c){s=!0,console.error("[computed]",c)}return t._v},r=()=>{s||a||(s=!0,t._subs.size&&o(!0))};r._isComputed=!0;let d=()=>o(!1);return Object.defineProperty(t,"value",{get(){return wt&&(t._subs.add(wt),En?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let l of n)l._subs.delete(r);n.clear()}},t},Ce=e=>{let t=new Set,n=[],s=()=>{try{let a=wo(e,s,t,n);typeof a=="function"&&n.push(a)}catch(a){console.error("[effect]",a)}};return s(),()=>{for(let a of t)a._subs.delete(s);t.clear(),n.forEach(a=>a?.()),n.splice(0)}},ae=e=>{pa++;try{e()}finally{--pa===0&&fa()}},Le=(e,t)=>{let n=e.peek(),s=!1;return Ce(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Tn=e=>Ce(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),qr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},p=e=>String(e??"").replace(/[&<>"]/g,t=>qr[t]),g=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{ae(()=>{for(let[a,o]of e.get(n)){let r=s.target.closest(a);r&&o(s,r)}})},{capture:!0}))};return{on:(n,s,a)=>{t(n);let o=[s,a];return e.get(n).push(o),()=>e.set(n,e.get(n).filter(r=>r!==o))},off:(n,s)=>{e.has(n)&&e.set(n,e.get(n).filter(([a])=>a!==s))}}})(),ko=(e,{keepAlive:t=!1}={})=>{let n=$(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,r=(c,u)=>{if(!t)return u();if(o.has(c))return o.get(c);let h=u();return o.set(c,h),h},d=$(void 0),l=Ce(()=>{let c=n.value;for(let[u,h]of Object.entries(e)){if(u==="*")continue;let x=new RegExp("^"+u.replace(/:\w+/g,"([^/]+)")+"$"),v=c.match(x);if(v){let C=v.slice(1);d.value=typeof h=="function"?r(`${u}|${C.join("/")}`,()=>h(...C)):h;return}}if(e["*"]){let u=e["*"];d.value=typeof u=="function"?r("*",u):u;return}d.value=null});return{current:n,route:d,navigate:c=>{s||(location.hash=c)},match:c=>{let u=n.value.match(new RegExp("^"+c.replace(/:\w+/g,"([^/]+)")+"$"));return u?u.slice(1):null},invalidate:c=>{if(o){if(c===void 0){o.clear();return}for(let u of[...o.keys()])(u===c||u.startsWith(`${c}|`))&&o.delete(u)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),l(),o?.clear())}}},i=e=>document.getElementById(e),ua=()=>typeof navigator>"u"||navigator.onLine!==!1,Fr=e=>new Promise(t=>setTimeout(t,e)),Re=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(Re).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Re(e[t])}`).join(",")}}`,Ln=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=Re(t.queryKey);if(t.exact?e.hash!==n:!e.hash.startsWith(n.slice(0,-1)))return!1}return!t.tags||t.tags.some(n=>e.tags.has(n))},Ur=e=>{try{return JSON.stringify(e),!0}catch{return!1}},is=(e,t)=>{if(Object.is(e,t))return e;if(!e||!t||typeof e!="object"||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return t;let a=t.map((o,r)=>is(e[r],o));return a.every((o,r)=>o===e[r])?e:a}if(Array.isArray(e)||Array.isArray(t)||Object.getPrototypeOf(e)!==Object.prototype||Object.getPrototypeOf(t)!==Object.prototype)return t;let n=Object.keys(t);if(n.length!==Object.keys(e).length)return t;let s={};for(let a of n){if(!(a in e))return t;s[a]=is(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Wr=({staleTime:e=3e4,gcTime:t=3e5,retry:n=2,retryDelay:s=1e3,refetchOnWindowFocus:a=!1,refetchOnReconnect:o=!0}={})=>{let r=new Map,d=new Set,l=new Map,c=null,u=!1,h=m=>{for(let b of d)b(m)},x=m=>m.state,v=m=>!m.invalidated&&Date.now()-m.state.updatedAt.peek()<m.options.staleTime,C=m=>{m.invalidated=!0,m.state.isStale.value=!0},F=m=>{m.gcTimer&&clearTimeout(m.gcTimer),m.gcTimer=null},ke=m=>{F(m),!m.observers&&Number.isFinite(m.options.gcTime)&&(m.gcTimer=setTimeout(()=>{!m.observers&&!m.promise&&(r.delete(m.hash),h({type:"gc",key:m.key}))},m.options.gcTime))},J=m=>{m.pollTimer&&clearTimeout(m.pollTimer),m.pollTimer=null},ne=m=>{J(m);let b=typeof m.options.refetchInterval=="function"?m.options.refetchInterval(m):m.options.refetchInterval;m.observers&&Number.isFinite(b)&&b>0&&(m.pollTimer=setTimeout(async()=>{ua()&&await _(m,{force:!0}).catch(()=>{}),ne(m)},b))},N=(m,b=Re(m.queryKey))=>{let w={staleTime:e,gcTime:t,retry:n,retryDelay:s,...m},k={hash:b,key:m.queryKey,queryFn:m.queryFn,options:w,tags:new Set(m.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:$(m.initialData),error:$(null),status:$(m.initialData===void 0?"idle":"success"),fetchStatus:$("idle"),updatedAt:$(m.initialData===void 0?0:Date.now()),isStale:$(!0)}};return r.set(b,k),k},S=m=>{if(!m?.queryKey)throw new TypeError("query: queryKey is required");let b=Re(m.queryKey),w=r.get(b)??N(m,b);m.queryFn&&(w.queryFn=m.queryFn),w.options={...w.options,...m};for(let k of m.tags??[])w.tags.add(k);return w},_=(m,{force:b=!1}={})=>{if(!m.queryFn)return Promise.reject(new TypeError(`query ${m.hash} has no queryFn`));if(!b&&v(m))return Promise.resolve(m.state.data.peek());if(m.promise)return m.promise;if(!ua())return m.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));F(m);let w=++m.version,k=new AbortController;m.ctrl=k,ae(()=>{m.state.data.peek()===void 0&&(m.state.status.value="pending"),m.state.fetchStatus.value="fetching",m.state.error.value=null}),h({type:"fetch",key:m.key});let W=async(D,G)=>{try{return await m.queryFn({queryKey:m.key,signal:k.signal,meta:m.options.meta})}catch(X){if(k.signal.aborted||X?.name==="AbortError"||D<=0||m.options.retry===!1)throw X;return await Fr(typeof G=="function"?G(D,X):G),W(D-1,typeof G=="number"?G*2:G)}},Y=W(m.options.retry??n,m.options.retryDelay??s).then(D=>(m.version===w&&!k.signal.aborted&&ae(()=>{m.state.data.value=m.options.structuralSharing===!1?D:is(m.state.data.peek(),D),m.state.status.value="success",m.state.fetchStatus.value="idle",m.state.updatedAt.value=Date.now(),m.state.isStale.value=!1,m.invalidated=!1}),h({type:"success",key:m.key}),D)).catch(D=>{throw m.version===w&&!k.signal.aborted&&ae(()=>{m.state.error.value=D,m.state.status.value=m.state.data.peek()===void 0?"error":"success",m.state.fetchStatus.value="idle"}),k.signal.aborted||h({type:"error",key:m.key,error:D}),D}).finally(()=>{m.promise===Y&&(m.promise=null,m.ctrl=null,ke(m))});return m.promise=Y,Y},se=m=>Promise.all([...r.values()].filter(b=>Ln(b,m)&&b.observers).map(b=>_(b,{force:!0}).catch(()=>{}))),M={query(m){let b=S(m);b.observers++,F(b),ne(b),m.enabled!==!1&&(!v(b)||m.refetchOnMount)&&_(b).catch(()=>{});let w=()=>{b.observers=Math.max(0,b.observers-1),ke(b),ne(b)};return[x(b),{refetch:()=>_(b,{force:!0}),invalidate:()=>M.invalidateQueries({queryKey:b.key,exact:!0}),setData:k=>M.setQueryData(b.key,k),cancel:()=>M.cancelQueries({queryKey:b.key,exact:!0}),dispose:w}]},prefetchQuery(m){let b=S(m);return _(b)},fetchQuery(m){let b=S(m);return _(b)},getQueryData(m){return r.get(Re(m))?.state.data.peek()},getQueryState(m){let b=r.get(Re(m));return b&&x(b)},setQueryData(m,b,{tags:w}={}){let k=r.get(Re(m))??S({queryKey:m,tags:w}),W=typeof b=="function"?b(k.state.data.peek()):b,Y=k.options.structuralSharing===!1?W:is(k.state.data.peek(),W);ae(()=>{k.state.data.value=Y,k.state.status.value="success",k.state.error.value=null,k.state.updatedAt.value=Date.now(),k.state.isStale.value=!1}),k.invalidated=!1;for(let D of w??[])k.tags.add(D);return h({type:"set",key:k.key}),c&&c.postMessage({type:"invalidate",hash:k.hash}),Y},invalidateQueries(m){for(let b of r.values())Ln(b,m)&&C(b);return h({type:"invalidate",filter:m}),c&&c.postMessage({type:"invalidate",filter:m}),se(m)},cancelQueries(m){for(let b of r.values())Ln(b,m)&&b.ctrl?.abort()},removeQueries(m){for(let b of[...r.values()])Ln(b,m)&&(b.ctrl?.abort(),F(b),J(b),r.delete(b.hash))},mutate({mutationFn:m,variables:b,optimistic:w,invalidate:k,onMutate:W,onSuccess:Y,onError:D,networkMode:G="online"}={}){if(typeof m!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let X=[],yt=Wt=>(Array.isArray(Wt)?Wt:[Wt]).filter(Boolean).forEach(Ie=>{let ia=M.getQueryData(Ie.queryKey);X.push([Ie.queryKey,ia]),M.setQueryData(Ie.queryKey,ra=>Ie.updater(ra))}),$n=async()=>{let Wt=await W?.(b,{client:M});w&&yt(typeof w=="function"?w(b):w);try{let Ie=await m(b);return await Y?.(Ie,b,Wt),k&&await M.invalidateQueries(k),h({type:"mutation-success"}),Ie}catch(Ie){for(let[ia,ra]of X)M.setQueryData(ia,ra);throw await D?.(Ie,b,Wt),h({type:"mutation-error",error:Ie}),Ie}};return!ua()&&G==="offlineFirst"?(V.push($n),h({type:"mutation-queued"}),Promise.resolve({queued:!0})):$n()},infiniteQuery({queryKey:m,queryFn:b,initialPageParam:w=0,getNextPageParam:k,...W}){let[Y,D]=M.query({queryKey:m,...W,queryFn:async G=>({pages:[await b({...G,pageParam:w})],pageParams:[w]})});return[Y,{...D,fetchNextPage:async()=>{let G=Y.data.peek()??{pages:[],pageParams:[]},X=k?.(G.pages.at(-1),G.pages);if(X==null)return;let yt=await b({queryKey:m,pageParam:X,signal:new AbortController().signal});return M.setQueryData(m,{pages:[...G.pages,yt],pageParams:[...G.pageParams,X]}),yt}}]},dehydrate({shouldDehydrate:m=w=>w.state.status.peek()==="success",version:b=1}={}){return{version:b,timestamp:Date.now(),queries:[...r.values()].filter(m).filter(w=>Ur(w.state.data.peek())).map(w=>({key:w.key,data:w.state.data.peek(),updatedAt:w.state.updatedAt.peek(),staleTime:w.options.staleTime,tags:[...w.tags]}))}},hydrate(m,{version:b=1}={}){if(!m||m.version!==b||!Array.isArray(m.queries))return!1;for(let w of m.queries){let k=r.get(Re(w.key))??S({queryKey:w.key,staleTime:w.staleTime,tags:w.tags});ae(()=>{k.state.data.value=w.data,k.state.status.value="success",k.state.updatedAt.value=w.updatedAt,k.state.isStale.value=Date.now()-w.updatedAt>=k.options.staleTime}),k.invalidated=k.state.isStale.peek()}return h({type:"hydrate"}),!0},persist({storage:m=typeof localStorage>"u"?null:localStorage,key:b="mini-react-query",version:w=1}={}){if(!m)throw new Error("persist: a storage adapter is required");let k=!1,W=async()=>{let D=JSON.stringify(M.dehydrate({version:w}));return m.set?m.set(b,D):m.setItem(b,D)},Y=M.subscribe(()=>{k||(k=!0,queueMicrotask(()=>{k=!1,W().catch(()=>{})}))});return{restore:async()=>{let D=await(m.get?m.get(b):m.getItem(b));return D?M.hydrate(JSON.parse(D),{version:w}):!1},save:W,dispose:Y}},sync(m="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(c?.close(),c=new BroadcastChannel(m),c.onmessage=b=>{if(b.data?.type!=="invalidate")return;let w=b.data.hash?k=>k.hash===b.data.hash:b.data.filter;for(let k of r.values())Ln(k,w)&&C(k);se(w)},()=>{c?.close(),c=null})},subscribe(m){return d.add(m),()=>d.delete(m)},getDebugSnapshot(){return[...r.values()].map(m=>({key:m.key,observers:m.observers,status:m.state.status.peek(),fetchStatus:m.state.fetchStatus.peek(),updatedAt:m.state.updatedAt.peek(),stale:m.state.isStale.peek(),tags:[...m.tags]}))},async fetchJSON(m,b={},{queryKey:w=["GET",m,b.body??null],...k}={}){let W=Re(w);return M.fetchQuery({queryKey:w,...k,queryFn:async({signal:Y})=>{let D=new Headers(b.headers),G=l.get(W);G?.etag&&D.set("If-None-Match",G.etag);let X=await fetch(m,{...b,headers:D,signal:Y});if(X.status===304&&G)return M.getQueryData(w);if(!X.ok)throw new Error(`HTTP ${X.status}`);let yt=X.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(yt){let $n=r.get(W);$n&&($n.options.staleTime=Number(yt)*1e3)}return l.set(W,{etag:X.headers.get("etag")}),X.json()}})},destroy(){u=!0;for(let m of r.values())m.ctrl?.abort(),F(m),J(m);c?.close(),d.clear()}},V=[],rt=()=>{a&&se()},xt=()=>{for(o&&se();V.length;)V.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",rt),window.addEventListener("online",xt));let vt=M.destroy;return M.destroy=()=>{u||(typeof window<"u"&&(window.removeEventListener("focus",rt),window.removeEventListener("online",xt)),vt())},M},Cc=Wr(),$o=({cache:e=!0,ttl:t=3e4,retry:n=2,retryDelay:s=1e3,store:a=null,dedupe:o=!0}={})=>{let r=new Map,d=new Map,l=new Map,c=(h,x)=>{if(a)return a.get(h);let v=r.get(h);return v&&Date.now()-v.ts<x?v.data:void 0},u=async(h,x,v)=>{if(a)return a.set(h,x,{ttl:v});r.set(h,{data:x,ts:Date.now()})};return{get:(h,x,v={})=>{let C=v.ttl??t,F=e&&v.cache!==!1&&C!==0,ke=v.dedupe??o;if(ke&&d.has(h))return d.get(h);let J=()=>{let N=l.get(h)??0,S=(_,se)=>Promise.resolve(x()).then(async M=>(F&&(l.get(h)??0)===N&&await u(h,M,C),M)).catch(M=>{if(_>0&&M?.name!=="AbortError")return new Promise(V=>setTimeout(V,se)).then(()=>S(_-1,se*2));throw M});return S(v.retry??n,s)},ne=N=>(ke&&(d.set(h,N),N.finally(()=>{d.get(h)===N&&d.delete(h)}).catch(()=>{})),N);if(!F)return ne(J());if(!a){let N=c(h,C);return N!==void 0?Promise.resolve(N):ne(J())}return ne(Promise.resolve(c(h,C)).then(N=>N!==void 0?N:J()))},invalidate:h=>{if(h!==void 0)l.set(h,(l.get(h)??0)+1);else{for(let x of r.keys())l.set(x,(l.get(x)??0)+1);for(let x of d.keys())l.set(x,(l.get(x)??0)+1)}if(a)return h===void 0?a.clear():a.delete(h);h===void 0?r.clear():r.delete(h)}}},Ac=new TextEncoder,jc=new TextDecoder,So=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=l=>l.target.result.createObjectStore(t),d.onsuccess=l=>{n=l.target.result,o(n)},d.onerror=l=>r(l.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((l,c)=>{let u=d.transaction(t,o),h=r(u.objectStore(t));h.onsuccess=()=>l(h.result),h.onerror=()=>c(h.error)})};return{async get(o){let r=await a("readonly",d=>d.get(o));if(r){if(r.expires&&Date.now()>r.expires){this.delete(o);return}return r.val}},async set(o,r,{ttl:d}={}){await a("readwrite",l=>l.put({val:r,expires:d?Date.now()+d:null},o))},delete:o=>a("readwrite",r=>r.delete(o)),clear:()=>a("readwrite",o=>o.clear()),keys:()=>a("readonly",o=>o.getAllKeys())}}});var R=K(()=>{Lo()});var No={};as(No,{AGENT_DEFAULT_MODEL:()=>Ao,AGENT_LABELS:()=>te,AGENT_MODELS:()=>ha,LOW_TURN_THRESHOLD:()=>ga,activityHits:()=>Oe,activityLoading:()=>Qe,addCustomModel:()=>Mn,agentFilter:()=>de,agentFilters:()=>$t,agentsMeta:()=>kt,chatDensity:()=>Ve,collapsedFolders:()=>Jt,ctx:()=>f,currentAgent:()=>I,currentEffort:()=>ie,currentModel:()=>P,currentPermission:()=>Ee,currentProject:()=>E,currentTab:()=>U,expandedFolders:()=>zt,favoritesOnly:()=>Ae,filesPath:()=>z,filesRoot:()=>ce,filteredSessions:()=>ct,getCustomModels:()=>ls,getDefaultEffort:()=>lt,getDefaultModel:()=>qe,getEffortsForModel:()=>In,getModelsForAgent:()=>Xe,getSavedModel:()=>Co,getSessionMeta:()=>Qt,gitRoot:()=>be,hubMachineReady:()=>Be,hubMode:()=>A,isProcessing:()=>he,machinesList:()=>Q,metaKey:()=>oe,projectGroups:()=>St,removeCustomModel:()=>ya,selectedMachineId:()=>j,sessionDisplayTitle:()=>Ye,sessionFilter:()=>fe,sessionMetaMap:()=>T,sessionSearch:()=>me,sessionSort:()=>Eo,sessionsData:()=>O,setAgent:()=>Fe,setChatDensity:()=>xa,setCurrentModel:()=>le,setSelectedMachine:()=>ge,showHiddenOnly:()=>je,sidebarView:()=>Je,timeRange:()=>rs,viewingFile:()=>re,workspacesData:()=>ee,wsStatus:()=>ze});function Mo(){try{let e=JSON.parse(localStorage.getItem(To)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Io(e,t=f.sessionId,n=f.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Co(e,t=f.sessionId,n=f.machineId){let s=Io(e,t,n);if(!s)return null;let a=Mo()[s];return typeof a=="string"&&a.trim()?a:null}function le(e,t=I.peek(),n=f.sessionId,s=f.machineId){let a=String(e||"").trim();if(!a)return;let o=Io(t,n,s);if(o){let r=Mo();r[o]=a,localStorage.setItem(To,JSON.stringify(r))}P.value=a}function ge(e){let t=e||null;j.value=t,f.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function oe(e,t,n){let s=`${e||"claude"}:${t}`;return n||f?.machineId?`${n||f.machineId}:${s}`:s}function Qt(e,t,n){return T.peek()?.[oe(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1}}function Ye(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(Qt(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function xa(e){let t=["clean","normal","full"].includes(e)?e:"normal";Ve.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Kr(e){return e?typeof e=="string"?{value:e,label:e}:e.value?{value:String(e.value),label:e.label||e.value,...Array.isArray(e.efforts)&&e.efforts.length?{efforts:e.efforts.map(String)}:{},...e.defaultEffort?{defaultEffort:String(e.defaultEffort)}:{}}:null:null}function va(){try{let e=localStorage.getItem(jo);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Do(e){localStorage.setItem(jo,JSON.stringify(e))}function ls(e){let t=(e||"claude").toLowerCase(),n=va()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Mn(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=va(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,Do(a),!0}function ya(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=va(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,Do(a),!0}function Xe(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Kr).filter(Boolean):(ha[t]||ha.claude).map(r=>({...r})),a=ls(t),o=new Set(s.map(r=>r.value));for(let r of a){if(o.has(r)){s=s.map(d=>{if(d.value!==r)return d;let l=String(d.label||d.value);return{...d,custom:!0,label:l.includes("\u2605")?l:`${l} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function qe(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t];return n?.model?String(n.model):Ao[t]||Xe(t)[0]?.value||"claude-sonnet-4-5"}function In(e,t){let s=Xe(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=kt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function lt(e,t){let n=(e||"claude").toLowerCase(),s=kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Xe(n).find(r=>r.value===t);return o?.defaultEffort?String(o.defaultEffort):n==="grok"?"low":n==="gemini"&&String(t||"").match(/-(low|medium|high)$/i)?.[1]?.toLowerCase()||""}function Fe(e){let t=(e||"claude").toLowerCase();I.value=t,localStorage.setItem("agent",t),Ee.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=Ee.peek());let s=Co(t);s?P.value=s:le(qe(t),t);let a=lt(t,P.peek());a?ie.value=a:t!=="grok"&&t!=="gemini"&&(ie.value="")}function zr(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Jr(e,t){if(!t)return!0;let n=T.value?.[oe(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,n?.notes,n?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function ba(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var O,ee,fe,me,Eo,zt,Jt,z,re,E,U,he,ze,To,Gr,I,P,ie,Ee,ce,be,kt,Je,de,$t,rs,Oe,Qe,T,Ae,je,ga,Ve,A,Q,j,Be,f,te,ha,Ao,jo,ct,St,B=K(()=>{R();O=$([]),ee=$([]),fe=$(null),me=$(""),Eo=$("time"),zt=$(new Set),Jt=$(new Set),z=$(""),re=$(null),E=$(null),U=$("chat"),he=$(!1),ze=$("idle"),To="modelBySession",Gr=localStorage.getItem("agent")||"claude";I=$(Gr),P=$("claude-sonnet-4-5"),ie=$(""),Ee=$("bypassPermissions"),ce=$(""),be=$(""),kt=$(null),Je=$(localStorage.getItem("sidebarView")||"projects"),de=$(localStorage.getItem("agentFilter")||"all"),$t=$((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),rs=$(localStorage.getItem("timeRange")||"14"),Oe=$(null),Qe=$(!1),T=$({}),Ae=$(localStorage.getItem("favoritesOnly")==="1"),je=$(localStorage.getItem("showHiddenOnly")==="1"),ga=2,Ve=$(localStorage.getItem("chatDensity")||"normal"),A=$(!1),Q=$([]),j=$(null),Be=$(!1),f={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null};te={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},ha={claude:[{value:"claude-sonnet-4-5",label:"sonnet-4-5"},{value:"claude-sonnet-4-6",label:"sonnet-4-6"},{value:"claude-opus-4-5",label:"opus-4-5"},{value:"claude-haiku-4-5",label:"haiku-4-5"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}],gemini:[{value:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash (High)"},{value:"gemini-3.7-flash-medium",label:"Gemini 3.7 Flash (Medium)"},{value:"gemini-3.7-flash-low",label:"Gemini 3.7 Flash (Low)"},{value:"gemini-3.6-flash-high",label:"Gemini 3.6 Flash (High)"},{value:"gemini-3.6-flash-medium",label:"Gemini 3.6 Flash (Medium)"},{value:"gemini-3.6-flash-low",label:"Gemini 3.6 Flash (Low)"},{value:"gemini-3.5-flash-high",label:"Gemini 3.5 Flash (High)"},{value:"gemini-3.5-flash-medium",label:"Gemini 3.5 Flash (Medium)"},{value:"gemini-3.5-flash-low",label:"Gemini 3.5 Flash (Low)"},{value:"gemini-3.1-pro-high",label:"Gemini 3.1 Pro (High)"},{value:"gemini-3.1-pro-low",label:"Gemini 3.1 Pro (Low)"}],cursor:[{value:"auto",label:"Auto"},{value:"gpt-5.3-codex",label:"GPT-5.3 Codex"},{value:"composer-2.5",label:"Composer 2.5"}]},Ao={claude:"claude-sonnet-4-5",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};jo="customModelsByAgent";ct=ma(()=>{let e=me.value.toLowerCase().trim(),t=Eo.value,n=de.value,s=$t.value,a=Ae.value,o=je.value,r=T.value,d=Oe.value,l=d?.results?.length&&e?ba(d.results):ba(O.value),c=j.value;return A.value&&c&&(l=l.filter(u=>u&&(!u.machineId||u.machineId===c))),l=l.filter(u=>u&&(s.length?s.includes(u.agent||"claude"):zr(u,n))),o?l=l.filter(u=>u&&r?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden):l=l.filter(u=>u&&!r?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden),a&&(l=l.filter(u=>u&&r?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(l=l.filter(u=>u&&Jr(u,e))),l=[...l].sort((u,h)=>{let x=r?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite?1:0,v=r?.[oe(h.agent,h.sessionId,h.machineId)]?.favorite?1:0;return x!==v?v-x:t==="project"&&(u.cwd||"").localeCompare(h.cwd||"")||h.updatedAt-u.updatedAt}),!e&&!a?l.slice(0,120):l}),St=ma(()=>{let e=ba(ct.value),t=new Map;for(let n of e){if(!n)continue;let s=n.machineId?`${n.machineId}::${n.cwd||"(no path)"}`:n.cwd||"(no path)";t.has(s)||t.set(s,{cwd:n.cwd||null,machineId:n.machineId||null,projectName:n.projectName||(n.cwd?n.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let a=t.get(s);a.sessions.push(n),a.agents[n.agent||"claude"]=(a.agents[n.agent||"claude"]||0)+1,(n.updatedAt||0)>a.updatedAt&&(a.updatedAt=n.updatedAt,a.latest=n)}return[...t.values()].sort((n,s)=>s.updatedAt-n.updatedAt)})});function Cn(e={}){return e.machineId!==void 0?e.machineId:f.machineId||j.peek()||null}function Vr(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/ai/notes"||t.startsWith("/api/ai/notes/")||t.startsWith("/api/auth/")}async function y(e,t,n,s,a={}){let o=Cn(a),r={"Content-Type":"application/json",...f.token?{Authorization:`Bearer ${f.token}`}:{}};A.peek()&&o&&!Vr(t)&&(r["X-Machine-Id"]=o);let d=a.etag===!0?`${f.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&d){let u=_o.get(d);u&&(r["If-None-Match"]=u)}let l=async()=>{let u=await fetch(t,{method:e,signal:s,headers:r,...n!==void 0?{body:JSON.stringify(n)}:{}});if(u.status===304)return wa;let h=await u.json().catch(()=>({}));if(!u.ok)throw new Error(h.error||`HTTP ${u.status}`);if(d){let x=u.headers.get("ETag");x&&_o.set(d,x)}return h};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let c=`${f.token||""}:${o||""}:${t}`;return Qr.get(c,l)}function Vt(e){return f.ws?.readyState===WebSocket.OPEN?(f.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||cs.push(e),!1)}function Po(){for(;cs.length&&f.ws?.readyState===WebSocket.OPEN;)f.ws.send(JSON.stringify(cs.shift()))}function Ho(){cs.length=0}function Ro(e={}){let t=new URLSearchParams(e);f.token&&t.set("token",f.token);let n=Cn();return A.peek()&&n&&t.set("machine",n),t.toString()}function dt(e={}){let t={...e};f.token&&(t.Authorization=`Bearer ${f.token}`);let n=Cn();return A.peek()&&n&&(t["X-Machine-Id"]=n),t}async function Yt(){try{let e=await fetch("/api/hub");if(!e.ok)return A.value=!1,!1;let t=await e.json();if(t?.hub)return A.value=!0,t}catch{}return A.value=!1,!1}var Qr,_o,wa,cs,ue=K(()=>{B();R();Qr=$o({cache:!1,dedupe:!0,retry:0}),_o=new Map,wa=Symbol("not-modified");cs=[]});function Lt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function Zt(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function xe(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Lt(t,!s)}Lt(document.getElementById("welcome"),Zt(document.getElementById("welcome"))),Lt(document.getElementById("auth-screen"),Zt(document.getElementById("auth-screen"))),Lt(document.getElementById("chat-opts"),Zt(document.getElementById("chat-opts"))),Lt(document.getElementById("machine-picker"),Zt(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Lt(a,Zt(a))}let n=document.getElementById("tab-chat");n&&Lt(n,Zt(n))}function An(){let e=window.visualViewport,t=document.documentElement;if(!e)return;let n=e.height<window.innerHeight-80;t.classList.toggle("vv-keyboard",n),t.style.setProperty("--vvh",`${Math.round(e.height)}px`),t.style.setProperty("--vv-top",`${Math.round(e.offsetTop)}px`)}function Uo(){xe(),An();let e=window.visualViewport;e&&(e.addEventListener("resize",An),e.addEventListener("scroll",An)),window.addEventListener("resize",()=>{An(),xe()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{An(),xe()},250)})}var en=K(()=>{});function Et(){try{let e=localStorage.getItem(Wo);return e?JSON.parse(e):null}catch{return null}}function ka(e){try{let n={...Et()||{},...e,updatedAt:Date.now()};localStorage.setItem(Wo,JSON.stringify(n))}catch{}}var Wo,ds=K(()=>{Wo="lastSessionContext"});async function $a(){if(jn&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!Tt)try{Tt=await navigator.wakeLock.request("screen"),Tt.addEventListener("release",()=>{Tt=null,jn&&document.visibilityState==="visible"&&setTimeout(()=>{$a().catch(()=>{})},500)})}catch{Tt=null}}async function Go(){let e=Tt;if(Tt=null,!!e)try{await e.release()}catch{}}function Ko(e){jn=!!e,jn?$a().catch(()=>{}):Go().catch(()=>{})}function zo(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&jn?$a().catch(()=>{}):document.visibilityState==="hidden"&&Go().catch(()=>{})})}var Tt,jn,Jo=K(()=>{Tt=null,jn=!1});function q(e){if(e==null||e==="")return null;if(typeof e=="number")return!Number.isFinite(e)||e<=0?null:e<1e12?Math.round(e*1e3):Math.round(e);if(typeof e=="string"){let t=e.trim();if(/^\d+(\.\d+)?$/.test(t))return q(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function tn(e){let t=q(e);if(t==null)return"";let n=Date.now()-t;return n<0?new Date(t).toLocaleDateString():n<6e4?"just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?`${Math.floor(n/36e5)}h ago`:n<7*864e5?`${Math.floor(n/864e5)}d ago`:new Date(t).toLocaleDateString()}function nn(e,t=!0){let n=e||"claude",a={claude:"bg-orange-500/15 text-orange-400",codex:"bg-emerald-500/15 text-emerald-400",grok:"bg-sky-500/15 text-sky-400",gemini:"bg-violet-500/15 text-violet-400",cursor:"bg-amber-500/15 text-amber-400"}[n]||"bg-base-300 text-base-content/50",o=t?n==="claude"?"CC":n==="codex"?"CX":n==="grok"?"GX":n==="gemini"?"GM":n==="cursor"?"CU":n.slice(0,2).toUpperCase():te[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(te[n]||n)}">${o}</span>`}function sn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var an=K(()=>{R();B()});function Zr(e){let t=q(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Qo(){let e=i("notifications-badge");if(e){if(!Mt){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=Mt>99?"99+":String(Mt)}}function Xo(){let e=i("notifications-menu"),t=i("btn-notifications"),n=i("topbar");if(!e||!t||!n)return;let s=t.getBoundingClientRect(),a=n.getBoundingClientRect(),o=Math.min(416,window.innerWidth-16),r=Math.max(8,Math.min(window.innerWidth-o-8,s.right-o));e.style.top=`${Math.round(a.bottom+8)}px`,e.style.left=`${Math.round(r)}px`,e.style.width=`${Math.round(o)}px`}function Dn(){let e=i("notifications-menu-list"),t=i("notifications-menu-empty");if(!(!e||!t)){if(!$e.length){e.innerHTML="",t.classList.remove("hidden"),Qo();return}t.classList.add("hidden"),e.innerHTML=$e.map(n=>`
1
+ var Ur=Object.defineProperty;var U=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var os=(e,t)=>{for(var n in t)Ur(e,n,{get:t[n],enumerable:!0})};function Gr(){da||(da=!0,queueMicrotask(()=>{da=!1,fa()}))}function yo(e){for(let t of e)(t._isComputed?Gt:zt).add(t);pa>0||is||(Wr==="microtask"?Gr():fa())}function ko(e,t,n,s){let a=new Set(n);for(let i of n)i._subs.delete(t);n.clear(),s?.forEach(i=>i?.()),s?.splice(0);let o=[wt,Tn,la];[wt,Tn,la]=[t,n,s];try{return e()}catch(i){for(let d of a)d._subs.add(t),n.add(d);throw i}finally{[wt,Tn,la]=o}}var wt,Tn,pa,la,Gt,zt,is,Ln,ca,Wr,da,fa,wo,$,ma,Ce,ae,Le,Mn,zr,p,g,$o,r,ua,Kr,Oe,En,Jr,rs,Vr,Rc,So,Oc,Bc,Lo,Eo=U(()=>{wt=null,Tn=null,pa=0,la=null,Gt=new Set,zt=new Set,is=!1,Ln=1e4,ca={flushes:0,runs:0,lastFlushRuns:0},Wr="sync",da=!1;fa=()=>{if(is)return;is=!0;let e=0;ca.flushes++;try{for(;Gt.size||zt.size;){for(;Gt.size;){let t=Gt.values().next().value;if(Gt.delete(t),++e>Ln)throw new Error(`mini-react: reactive update loop exceeded ${Ln} runs`);t()}if(zt.size){let t=zt.values().next().value;if(zt.delete(t),++e>Ln)throw new Error(`mini-react: reactive update loop exceeded ${Ln} runs`);t()}}}finally{ca.runs+=e,ca.lastFlushRuns=e,e>Ln&&(Gt.clear(),zt.clear()),is=!1}};wo=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return wt&&(this._subs.add(wt),Tn?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,yo(this._subs))}peek(){return this._v}},$=(e,{equals:t}={})=>new wo(e,t);ma=e=>{let t=new wo(void 0),n=new Set,s=!0,a=!1,o=l=>{if(!s||a)return t._v;s=!1;try{let c=ko(e,i,n,null),u=c!==t._v;u&&(t._v=c),u&&l&&yo(t._subs)}catch(c){s=!0,console.error("[computed]",c)}return t._v},i=()=>{s||a||(s=!0,t._subs.size&&o(!0))};i._isComputed=!0;let d=()=>o(!1);return Object.defineProperty(t,"value",{get(){return wt&&(t._subs.add(wt),Tn?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let l of n)l._subs.delete(i);n.clear()}},t},Ce=e=>{let t=new Set,n=[],s=()=>{try{let a=ko(e,s,t,n);typeof a=="function"&&n.push(a)}catch(a){console.error("[effect]",a)}};return s(),()=>{for(let a of t)a._subs.delete(s);t.clear(),n.forEach(a=>a?.()),n.splice(0)}},ae=e=>{pa++;try{e()}finally{--pa===0&&fa()}},Le=(e,t)=>{let n=e.peek(),s=!1;return Ce(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Mn=e=>Ce(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),zr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},p=e=>String(e??"").replace(/[&<>"]/g,t=>zr[t]),g=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{ae(()=>{for(let[a,o]of e.get(n)){let i=s.target.closest(a);i&&o(s,i)}})},{capture:!0}))};return{on:(n,s,a)=>{t(n);let o=[s,a];return e.get(n).push(o),()=>e.set(n,e.get(n).filter(i=>i!==o))},off:(n,s)=>{e.has(n)&&e.set(n,e.get(n).filter(([a])=>a!==s))}}})(),$o=(e,{keepAlive:t=!1}={})=>{let n=$(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,i=(c,u)=>{if(!t)return u();if(o.has(c))return o.get(c);let h=u();return o.set(c,h),h},d=$(void 0),l=Ce(()=>{let c=n.value;for(let[u,h]of Object.entries(e)){if(u==="*")continue;let x=new RegExp("^"+u.replace(/:\w+/g,"([^/]+)")+"$"),v=c.match(x);if(v){let C=v.slice(1);d.value=typeof h=="function"?i(`${u}|${C.join("/")}`,()=>h(...C)):h;return}}if(e["*"]){let u=e["*"];d.value=typeof u=="function"?i("*",u):u;return}d.value=null});return{current:n,route:d,navigate:c=>{s||(location.hash=c)},match:c=>{let u=n.value.match(new RegExp("^"+c.replace(/:\w+/g,"([^/]+)")+"$"));return u?u.slice(1):null},invalidate:c=>{if(o){if(c===void 0){o.clear();return}for(let u of[...o.keys()])(u===c||u.startsWith(`${c}|`))&&o.delete(u)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),l(),o?.clear())}}},r=e=>document.getElementById(e),ua=()=>typeof navigator>"u"||navigator.onLine!==!1,Kr=e=>new Promise(t=>setTimeout(t,e)),Oe=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(Oe).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Oe(e[t])}`).join(",")}}`,En=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=Oe(t.queryKey);if(t.exact?e.hash!==n:!e.hash.startsWith(n.slice(0,-1)))return!1}return!t.tags||t.tags.some(n=>e.tags.has(n))},Jr=e=>{try{return JSON.stringify(e),!0}catch{return!1}},rs=(e,t)=>{if(Object.is(e,t))return e;if(!e||!t||typeof e!="object"||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return t;let a=t.map((o,i)=>rs(e[i],o));return a.every((o,i)=>o===e[i])?e:a}if(Array.isArray(e)||Array.isArray(t)||Object.getPrototypeOf(e)!==Object.prototype||Object.getPrototypeOf(t)!==Object.prototype)return t;let n=Object.keys(t);if(n.length!==Object.keys(e).length)return t;let s={};for(let a of n){if(!(a in e))return t;s[a]=rs(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Vr=({staleTime:e=3e4,gcTime:t=3e5,retry:n=2,retryDelay:s=1e3,refetchOnWindowFocus:a=!1,refetchOnReconnect:o=!0}={})=>{let i=new Map,d=new Set,l=new Map,c=null,u=!1,h=m=>{for(let b of d)b(m)},x=m=>m.state,v=m=>!m.invalidated&&Date.now()-m.state.updatedAt.peek()<m.options.staleTime,C=m=>{m.invalidated=!0,m.state.isStale.value=!0},F=m=>{m.gcTimer&&clearTimeout(m.gcTimer),m.gcTimer=null},ke=m=>{F(m),!m.observers&&Number.isFinite(m.options.gcTime)&&(m.gcTimer=setTimeout(()=>{!m.observers&&!m.promise&&(i.delete(m.hash),h({type:"gc",key:m.key}))},m.options.gcTime))},J=m=>{m.pollTimer&&clearTimeout(m.pollTimer),m.pollTimer=null},ne=m=>{J(m);let b=typeof m.options.refetchInterval=="function"?m.options.refetchInterval(m):m.options.refetchInterval;m.observers&&Number.isFinite(b)&&b>0&&(m.pollTimer=setTimeout(async()=>{ua()&&await _(m,{force:!0}).catch(()=>{}),ne(m)},b))},N=(m,b=Oe(m.queryKey))=>{let w={staleTime:e,gcTime:t,retry:n,retryDelay:s,...m},k={hash:b,key:m.queryKey,queryFn:m.queryFn,options:w,tags:new Set(m.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:$(m.initialData),error:$(null),status:$(m.initialData===void 0?"idle":"success"),fetchStatus:$("idle"),updatedAt:$(m.initialData===void 0?0:Date.now()),isStale:$(!0)}};return i.set(b,k),k},S=m=>{if(!m?.queryKey)throw new TypeError("query: queryKey is required");let b=Oe(m.queryKey),w=i.get(b)??N(m,b);m.queryFn&&(w.queryFn=m.queryFn),w.options={...w.options,...m};for(let k of m.tags??[])w.tags.add(k);return w},_=(m,{force:b=!1}={})=>{if(!m.queryFn)return Promise.reject(new TypeError(`query ${m.hash} has no queryFn`));if(!b&&v(m))return Promise.resolve(m.state.data.peek());if(m.promise)return m.promise;if(!ua())return m.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));F(m);let w=++m.version,k=new AbortController;m.ctrl=k,ae(()=>{m.state.data.peek()===void 0&&(m.state.status.value="pending"),m.state.fetchStatus.value="fetching",m.state.error.value=null}),h({type:"fetch",key:m.key});let G=async(D,z)=>{try{return await m.queryFn({queryKey:m.key,signal:k.signal,meta:m.options.meta})}catch(X){if(k.signal.aborted||X?.name==="AbortError"||D<=0||m.options.retry===!1)throw X;return await Kr(typeof z=="function"?z(D,X):z),G(D-1,typeof z=="number"?z*2:z)}},Y=G(m.options.retry??n,m.options.retryDelay??s).then(D=>(m.version===w&&!k.signal.aborted&&ae(()=>{m.state.data.value=m.options.structuralSharing===!1?D:rs(m.state.data.peek(),D),m.state.status.value="success",m.state.fetchStatus.value="idle",m.state.updatedAt.value=Date.now(),m.state.isStale.value=!1,m.invalidated=!1}),h({type:"success",key:m.key}),D)).catch(D=>{throw m.version===w&&!k.signal.aborted&&ae(()=>{m.state.error.value=D,m.state.status.value=m.state.data.peek()===void 0?"error":"success",m.state.fetchStatus.value="idle"}),k.signal.aborted||h({type:"error",key:m.key,error:D}),D}).finally(()=>{m.promise===Y&&(m.promise=null,m.ctrl=null,ke(m))});return m.promise=Y,Y},se=m=>Promise.all([...i.values()].filter(b=>En(b,m)&&b.observers).map(b=>_(b,{force:!0}).catch(()=>{}))),M={query(m){let b=S(m);b.observers++,F(b),ne(b),m.enabled!==!1&&(!v(b)||m.refetchOnMount)&&_(b).catch(()=>{});let w=()=>{b.observers=Math.max(0,b.observers-1),ke(b),ne(b)};return[x(b),{refetch:()=>_(b,{force:!0}),invalidate:()=>M.invalidateQueries({queryKey:b.key,exact:!0}),setData:k=>M.setQueryData(b.key,k),cancel:()=>M.cancelQueries({queryKey:b.key,exact:!0}),dispose:w}]},prefetchQuery(m){let b=S(m);return _(b)},fetchQuery(m){let b=S(m);return _(b)},getQueryData(m){return i.get(Oe(m))?.state.data.peek()},getQueryState(m){let b=i.get(Oe(m));return b&&x(b)},setQueryData(m,b,{tags:w}={}){let k=i.get(Oe(m))??S({queryKey:m,tags:w}),G=typeof b=="function"?b(k.state.data.peek()):b,Y=k.options.structuralSharing===!1?G:rs(k.state.data.peek(),G);ae(()=>{k.state.data.value=Y,k.state.status.value="success",k.state.error.value=null,k.state.updatedAt.value=Date.now(),k.state.isStale.value=!1}),k.invalidated=!1;for(let D of w??[])k.tags.add(D);return h({type:"set",key:k.key}),c&&c.postMessage({type:"invalidate",hash:k.hash}),Y},invalidateQueries(m){for(let b of i.values())En(b,m)&&C(b);return h({type:"invalidate",filter:m}),c&&c.postMessage({type:"invalidate",filter:m}),se(m)},cancelQueries(m){for(let b of i.values())En(b,m)&&b.ctrl?.abort()},removeQueries(m){for(let b of[...i.values()])En(b,m)&&(b.ctrl?.abort(),F(b),J(b),i.delete(b.hash))},mutate({mutationFn:m,variables:b,optimistic:w,invalidate:k,onMutate:G,onSuccess:Y,onError:D,networkMode:z="online"}={}){if(typeof m!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let X=[],yt=Wt=>(Array.isArray(Wt)?Wt:[Wt]).filter(Boolean).forEach(Ie=>{let ia=M.getQueryData(Ie.queryKey);X.push([Ie.queryKey,ia]),M.setQueryData(Ie.queryKey,ra=>Ie.updater(ra))}),Sn=async()=>{let Wt=await G?.(b,{client:M});w&&yt(typeof w=="function"?w(b):w);try{let Ie=await m(b);return await Y?.(Ie,b,Wt),k&&await M.invalidateQueries(k),h({type:"mutation-success"}),Ie}catch(Ie){for(let[ia,ra]of X)M.setQueryData(ia,ra);throw await D?.(Ie,b,Wt),h({type:"mutation-error",error:Ie}),Ie}};return!ua()&&z==="offlineFirst"?(Q.push(Sn),h({type:"mutation-queued"}),Promise.resolve({queued:!0})):Sn()},infiniteQuery({queryKey:m,queryFn:b,initialPageParam:w=0,getNextPageParam:k,...G}){let[Y,D]=M.query({queryKey:m,...G,queryFn:async z=>({pages:[await b({...z,pageParam:w})],pageParams:[w]})});return[Y,{...D,fetchNextPage:async()=>{let z=Y.data.peek()??{pages:[],pageParams:[]},X=k?.(z.pages.at(-1),z.pages);if(X==null)return;let yt=await b({queryKey:m,pageParam:X,signal:new AbortController().signal});return M.setQueryData(m,{pages:[...z.pages,yt],pageParams:[...z.pageParams,X]}),yt}}]},dehydrate({shouldDehydrate:m=w=>w.state.status.peek()==="success",version:b=1}={}){return{version:b,timestamp:Date.now(),queries:[...i.values()].filter(m).filter(w=>Jr(w.state.data.peek())).map(w=>({key:w.key,data:w.state.data.peek(),updatedAt:w.state.updatedAt.peek(),staleTime:w.options.staleTime,tags:[...w.tags]}))}},hydrate(m,{version:b=1}={}){if(!m||m.version!==b||!Array.isArray(m.queries))return!1;for(let w of m.queries){let k=i.get(Oe(w.key))??S({queryKey:w.key,staleTime:w.staleTime,tags:w.tags});ae(()=>{k.state.data.value=w.data,k.state.status.value="success",k.state.updatedAt.value=w.updatedAt,k.state.isStale.value=Date.now()-w.updatedAt>=k.options.staleTime}),k.invalidated=k.state.isStale.peek()}return h({type:"hydrate"}),!0},persist({storage:m=typeof localStorage>"u"?null:localStorage,key:b="mini-react-query",version:w=1}={}){if(!m)throw new Error("persist: a storage adapter is required");let k=!1,G=async()=>{let D=JSON.stringify(M.dehydrate({version:w}));return m.set?m.set(b,D):m.setItem(b,D)},Y=M.subscribe(()=>{k||(k=!0,queueMicrotask(()=>{k=!1,G().catch(()=>{})}))});return{restore:async()=>{let D=await(m.get?m.get(b):m.getItem(b));return D?M.hydrate(JSON.parse(D),{version:w}):!1},save:G,dispose:Y}},sync(m="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(c?.close(),c=new BroadcastChannel(m),c.onmessage=b=>{if(b.data?.type!=="invalidate")return;let w=b.data.hash?k=>k.hash===b.data.hash:b.data.filter;for(let k of i.values())En(k,w)&&C(k);se(w)},()=>{c?.close(),c=null})},subscribe(m){return d.add(m),()=>d.delete(m)},getDebugSnapshot(){return[...i.values()].map(m=>({key:m.key,observers:m.observers,status:m.state.status.peek(),fetchStatus:m.state.fetchStatus.peek(),updatedAt:m.state.updatedAt.peek(),stale:m.state.isStale.peek(),tags:[...m.tags]}))},async fetchJSON(m,b={},{queryKey:w=["GET",m,b.body??null],...k}={}){let G=Oe(w);return M.fetchQuery({queryKey:w,...k,queryFn:async({signal:Y})=>{let D=new Headers(b.headers),z=l.get(G);z?.etag&&D.set("If-None-Match",z.etag);let X=await fetch(m,{...b,headers:D,signal:Y});if(X.status===304&&z)return M.getQueryData(w);if(!X.ok)throw new Error(`HTTP ${X.status}`);let yt=X.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(yt){let Sn=i.get(G);Sn&&(Sn.options.staleTime=Number(yt)*1e3)}return l.set(G,{etag:X.headers.get("etag")}),X.json()}})},destroy(){u=!0;for(let m of i.values())m.ctrl?.abort(),F(m),J(m);c?.close(),d.clear()}},Q=[],rt=()=>{a&&se()},xt=()=>{for(o&&se();Q.length;)Q.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",rt),window.addEventListener("online",xt));let vt=M.destroy;return M.destroy=()=>{u||(typeof window<"u"&&(window.removeEventListener("focus",rt),window.removeEventListener("online",xt)),vt())},M},Rc=Vr(),So=({cache:e=!0,ttl:t=3e4,retry:n=2,retryDelay:s=1e3,store:a=null,dedupe:o=!0}={})=>{let i=new Map,d=new Map,l=new Map,c=(h,x)=>{if(a)return a.get(h);let v=i.get(h);return v&&Date.now()-v.ts<x?v.data:void 0},u=async(h,x,v)=>{if(a)return a.set(h,x,{ttl:v});i.set(h,{data:x,ts:Date.now()})};return{get:(h,x,v={})=>{let C=v.ttl??t,F=e&&v.cache!==!1&&C!==0,ke=v.dedupe??o;if(ke&&d.has(h))return d.get(h);let J=()=>{let N=l.get(h)??0,S=(_,se)=>Promise.resolve(x()).then(async M=>(F&&(l.get(h)??0)===N&&await u(h,M,C),M)).catch(M=>{if(_>0&&M?.name!=="AbortError")return new Promise(Q=>setTimeout(Q,se)).then(()=>S(_-1,se*2));throw M});return S(v.retry??n,s)},ne=N=>(ke&&(d.set(h,N),N.finally(()=>{d.get(h)===N&&d.delete(h)}).catch(()=>{})),N);if(!F)return ne(J());if(!a){let N=c(h,C);return N!==void 0?Promise.resolve(N):ne(J())}return ne(Promise.resolve(c(h,C)).then(N=>N!==void 0?N:J()))},invalidate:h=>{if(h!==void 0)l.set(h,(l.get(h)??0)+1);else{for(let x of i.keys())l.set(x,(l.get(x)??0)+1);for(let x of d.keys())l.set(x,(l.get(x)??0)+1)}if(a)return h===void 0?a.clear():a.delete(h);h===void 0?i.clear():i.delete(h)}}},Oc=new TextEncoder,Bc=new TextDecoder,Lo=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,i)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=l=>l.target.result.createObjectStore(t),d.onsuccess=l=>{n=l.target.result,o(n)},d.onerror=l=>i(l.target.error)}),a=async(o,i)=>{let d=await s();return new Promise((l,c)=>{let u=d.transaction(t,o),h=i(u.objectStore(t));h.onsuccess=()=>l(h.result),h.onerror=()=>c(h.error)})};return{async get(o){let i=await a("readonly",d=>d.get(o));if(i){if(i.expires&&Date.now()>i.expires){this.delete(o);return}return i.val}},async set(o,i,{ttl:d}={}){await a("readwrite",l=>l.put({val:i,expires:d?Date.now()+d:null},o))},delete:o=>a("readwrite",i=>i.delete(o)),clear:()=>a("readwrite",o=>o.clear()),keys:()=>a("readonly",o=>o.getAllKeys())}}});var R=U(()=>{Eo()});var _o={};os(_o,{AGENT_DEFAULT_MODEL:()=>jo,AGENT_LABELS:()=>te,AGENT_MODELS:()=>ha,LOW_TURN_THRESHOLD:()=>ga,activityHits:()=>Be,activityLoading:()=>Ve,addCustomModel:()=>In,agentFilter:()=>de,agentFilters:()=>$t,agentsMeta:()=>kt,chatDensity:()=>Qe,collapsedFolders:()=>Jt,ctx:()=>f,currentAgent:()=>I,currentEffort:()=>ie,currentModel:()=>P,currentPermission:()=>Ee,currentProject:()=>E,currentTab:()=>W,expandedFolders:()=>Kt,favoritesOnly:()=>Ae,filesPath:()=>K,filesRoot:()=>ce,filteredSessions:()=>ct,getCustomModels:()=>cs,getDefaultEffort:()=>lt,getDefaultModel:()=>Fe,getEffortsForModel:()=>Cn,getModelsForAgent:()=>Xe,getSavedModel:()=>Ao,getSessionMeta:()=>Vt,gitRoot:()=>be,hubMachineReady:()=>qe,hubMode:()=>A,isProcessing:()=>he,machinesList:()=>V,metaKey:()=>oe,projectGroups:()=>St,removeCustomModel:()=>ya,selectedMachineId:()=>j,sessionDisplayTitle:()=>Ye,sessionFilter:()=>fe,sessionMetaMap:()=>T,sessionSearch:()=>me,sessionSort:()=>To,sessionsData:()=>O,setAgent:()=>Ue,setChatDensity:()=>xa,setCurrentModel:()=>le,setSelectedMachine:()=>ge,showHiddenOnly:()=>je,sidebarView:()=>Je,timeRange:()=>ls,viewingFile:()=>re,workspacesData:()=>ee,wsStatus:()=>Ke});function Io(){try{let e=JSON.parse(localStorage.getItem(Mo)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Co(e,t=f.sessionId,n=f.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Ao(e,t=f.sessionId,n=f.machineId){let s=Co(e,t,n);if(!s)return null;let a=Io()[s];return typeof a=="string"&&a.trim()?a:null}function le(e,t=I.peek(),n=f.sessionId,s=f.machineId){let a=String(e||"").trim();if(!a)return;let o=Co(t,n,s);if(o){let i=Io();i[o]=a,localStorage.setItem(Mo,JSON.stringify(i))}P.value=a}function ge(e){let t=e||null;j.value=t,f.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function oe(e,t,n){let s=`${e||"claude"}:${t}`;return n||f?.machineId?`${n||f.machineId}:${s}`:s}function Vt(e,t,n){return T.peek()?.[oe(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1}}function Ye(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(Vt(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function xa(e){let t=["clean","normal","full"].includes(e)?e:"normal";Qe.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Yr(e){return e?typeof e=="string"?{value:e,label:e}:e.value?{value:String(e.value),label:e.label||e.value,...Array.isArray(e.efforts)&&e.efforts.length?{efforts:e.efforts.map(String)}:{},...e.defaultEffort?{defaultEffort:String(e.defaultEffort)}:{}}:null:null}function va(){try{let e=localStorage.getItem(Do);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function No(e){localStorage.setItem(Do,JSON.stringify(e))}function cs(e){let t=(e||"claude").toLowerCase(),n=va()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function In(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=va(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,No(a),!0}function ya(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=va(),o=Array.isArray(a[n])?a[n].filter(i=>i!==s):[];return a[n]=o,No(a),!0}function Xe(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Yr).filter(Boolean):(ha[t]||ha.claude).map(i=>({...i})),a=cs(t),o=new Set(s.map(i=>i.value));for(let i of a){if(o.has(i)){s=s.map(d=>{if(d.value!==i)return d;let l=String(d.label||d.value);return{...d,custom:!0,label:l.includes("\u2605")?l:`${l} \u2605`}});continue}o.add(i),s.push({value:i,label:`${i} \u2605`,custom:!0})}return s}function Fe(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t];return n?.model?String(n.model):jo[t]||Xe(t)[0]?.value||"claude-sonnet-4-5"}function Cn(e,t){let s=Xe(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=kt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function lt(e,t){let n=(e||"claude").toLowerCase(),s=kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Xe(n).find(i=>i.value===t);return o?.defaultEffort?String(o.defaultEffort):n==="grok"?"low":n==="gemini"&&String(t||"").match(/-(low|medium|high)$/i)?.[1]?.toLowerCase()||""}function Ue(e){let t=(e||"claude").toLowerCase();I.value=t,localStorage.setItem("agent",t),Ee.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=Ee.peek());let s=Ao(t);s?P.value=s:le(Fe(t),t);let a=lt(t,P.peek());a?ie.value=a:t!=="grok"&&t!=="gemini"&&(ie.value="")}function Xr(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Zr(e,t){if(!t)return!0;let n=T.value?.[oe(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,n?.notes,n?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function ba(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var O,ee,fe,me,To,Kt,Jt,K,re,E,W,he,Ke,Mo,Qr,I,P,ie,Ee,ce,be,kt,Je,de,$t,ls,Be,Ve,T,Ae,je,ga,Qe,A,V,j,qe,f,te,ha,jo,Do,ct,St,B=U(()=>{R();O=$([]),ee=$([]),fe=$(null),me=$(""),To=$("time"),Kt=$(new Set),Jt=$(new Set),K=$(""),re=$(null),E=$(null),W=$("chat"),he=$(!1),Ke=$("idle"),Mo="modelBySession",Qr=localStorage.getItem("agent")||"claude";I=$(Qr),P=$("claude-sonnet-4-5"),ie=$(""),Ee=$("bypassPermissions"),ce=$(""),be=$(""),kt=$(null),Je=$(localStorage.getItem("sidebarView")||"projects"),de=$(localStorage.getItem("agentFilter")||"all"),$t=$((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),ls=$(localStorage.getItem("timeRange")||"14"),Be=$(null),Ve=$(!1),T=$({}),Ae=$(localStorage.getItem("favoritesOnly")==="1"),je=$(localStorage.getItem("showHiddenOnly")==="1"),ga=2,Qe=$(localStorage.getItem("chatDensity")||"normal"),A=$(!1),V=$([]),j=$(null),qe=$(!1),f={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null};te={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},ha={claude:[{value:"claude-sonnet-4-5",label:"sonnet-4-5"},{value:"claude-sonnet-4-6",label:"sonnet-4-6"},{value:"claude-opus-4-5",label:"opus-4-5"},{value:"claude-haiku-4-5",label:"haiku-4-5"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}],gemini:[{value:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash (High)"},{value:"gemini-3.7-flash-medium",label:"Gemini 3.7 Flash (Medium)"},{value:"gemini-3.7-flash-low",label:"Gemini 3.7 Flash (Low)"},{value:"gemini-3.6-flash-high",label:"Gemini 3.6 Flash (High)"},{value:"gemini-3.6-flash-medium",label:"Gemini 3.6 Flash (Medium)"},{value:"gemini-3.6-flash-low",label:"Gemini 3.6 Flash (Low)"},{value:"gemini-3.5-flash-high",label:"Gemini 3.5 Flash (High)"},{value:"gemini-3.5-flash-medium",label:"Gemini 3.5 Flash (Medium)"},{value:"gemini-3.5-flash-low",label:"Gemini 3.5 Flash (Low)"},{value:"gemini-3.1-pro-high",label:"Gemini 3.1 Pro (High)"},{value:"gemini-3.1-pro-low",label:"Gemini 3.1 Pro (Low)"}],cursor:[{value:"auto",label:"Auto"},{value:"gpt-5.3-codex",label:"GPT-5.3 Codex"},{value:"composer-2.5",label:"Composer 2.5"}]},jo={claude:"claude-sonnet-4-5",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};Do="customModelsByAgent";ct=ma(()=>{let e=me.value.toLowerCase().trim(),t=To.value,n=de.value,s=$t.value,a=Ae.value,o=je.value,i=T.value,d=Be.value,l=d?.results?.length&&e?ba(d.results):ba(O.value),c=j.value;return A.value&&c&&(l=l.filter(u=>u&&(!u.machineId||u.machineId===c))),l=l.filter(u=>u&&(s.length?s.includes(u.agent||"claude"):Xr(u,n))),o?l=l.filter(u=>u&&i?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden):l=l.filter(u=>u&&!i?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden),a&&(l=l.filter(u=>u&&i?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(l=l.filter(u=>u&&Zr(u,e))),l=[...l].sort((u,h)=>{let x=i?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite?1:0,v=i?.[oe(h.agent,h.sessionId,h.machineId)]?.favorite?1:0;return x!==v?v-x:t==="project"&&(u.cwd||"").localeCompare(h.cwd||"")||h.updatedAt-u.updatedAt}),!e&&!a?l.slice(0,120):l}),St=ma(()=>{let e=ba(ct.value),t=new Map;for(let n of e){if(!n)continue;let s=n.machineId?`${n.machineId}::${n.cwd||"(no path)"}`:n.cwd||"(no path)";t.has(s)||t.set(s,{cwd:n.cwd||null,machineId:n.machineId||null,projectName:n.projectName||(n.cwd?n.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let a=t.get(s);a.sessions.push(n),a.agents[n.agent||"claude"]=(a.agents[n.agent||"claude"]||0)+1,(n.updatedAt||0)>a.updatedAt&&(a.updatedAt=n.updatedAt,a.latest=n)}return[...t.values()].sort((n,s)=>s.updatedAt-n.updatedAt)})});function An(e={}){return e.machineId!==void 0?e.machineId:f.machineId||j.peek()||null}function tl(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/ai/notes"||t.startsWith("/api/ai/notes/")||t.startsWith("/api/auth/")}async function y(e,t,n,s,a={}){let o=An(a),i={"Content-Type":"application/json",...f.token?{Authorization:`Bearer ${f.token}`}:{}};A.peek()&&o&&!tl(t)&&(i["X-Machine-Id"]=o);let d=a.etag===!0?`${f.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&d){let u=Po.get(d);u&&(i["If-None-Match"]=u)}let l=async()=>{let u=await fetch(t,{method:e,signal:s,headers:i,...n!==void 0?{body:JSON.stringify(n)}:{}});if(u.status===304)return wa;let h=await u.json().catch(()=>({}));if(!u.ok)throw new Error(h.error||`HTTP ${u.status}`);if(d){let x=u.headers.get("ETag");x&&Po.set(d,x)}return h};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let c=`${f.token||""}:${o||""}:${t}`;return el.get(c,l)}function Qt(e){return f.ws?.readyState===WebSocket.OPEN?(f.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||ds.push(e),!1)}function Ho(){for(;ds.length&&f.ws?.readyState===WebSocket.OPEN;)f.ws.send(JSON.stringify(ds.shift()))}function Ro(){ds.length=0}function Oo(e={}){let t=new URLSearchParams(e);f.token&&t.set("token",f.token);let n=An();return A.peek()&&n&&t.set("machine",n),t.toString()}function dt(e={}){let t={...e};f.token&&(t.Authorization=`Bearer ${f.token}`);let n=An();return A.peek()&&n&&(t["X-Machine-Id"]=n),t}async function Yt(){try{let e=await fetch("/api/hub");if(!e.ok)return A.value=!1,!1;let t=await e.json();if(t?.hub)return A.value=!0,t}catch{}return A.value=!1,!1}var el,Po,wa,ds,ue=U(()=>{B();R();el=So({cache:!1,dedupe:!0,retry:0}),Po=new Map,wa=Symbol("not-modified");ds=[]});function Lt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function Zt(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function xe(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Lt(t,!s)}Lt(document.getElementById("welcome"),Zt(document.getElementById("welcome"))),Lt(document.getElementById("auth-screen"),Zt(document.getElementById("auth-screen"))),Lt(document.getElementById("chat-opts"),Zt(document.getElementById("chat-opts"))),Lt(document.getElementById("machine-picker"),Zt(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Lt(a,Zt(a))}let n=document.getElementById("tab-chat");n&&Lt(n,Zt(n))}function jn(){let e=window.visualViewport,t=document.documentElement;if(!e)return;let n=e.height<window.innerHeight-80;t.classList.toggle("vv-keyboard",n),t.style.setProperty("--vvh",`${Math.round(e.height)}px`),t.style.setProperty("--vv-top",`${Math.round(e.offsetTop)}px`)}function Wo(){xe(),jn();let e=window.visualViewport;e&&(e.addEventListener("resize",jn),e.addEventListener("scroll",jn)),window.addEventListener("resize",()=>{jn(),xe()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{jn(),xe()},250)})}var en=U(()=>{});function Et(){try{let e=localStorage.getItem(Go);return e?JSON.parse(e):null}catch{return null}}function ka(e){try{let n={...Et()||{},...e,updatedAt:Date.now()};localStorage.setItem(Go,JSON.stringify(n))}catch{}}var Go,us=U(()=>{Go="lastSessionContext"});async function $a(){if(Dn&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!Tt)try{Tt=await navigator.wakeLock.request("screen"),Tt.addEventListener("release",()=>{Tt=null,Dn&&document.visibilityState==="visible"&&setTimeout(()=>{$a().catch(()=>{})},500)})}catch{Tt=null}}async function zo(){let e=Tt;if(Tt=null,!!e)try{await e.release()}catch{}}function Ko(e){Dn=!!e,Dn?$a().catch(()=>{}):zo().catch(()=>{})}function Jo(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&Dn?$a().catch(()=>{}):document.visibilityState==="hidden"&&zo().catch(()=>{})})}var Tt,Dn,Vo=U(()=>{Tt=null,Dn=!1});function q(e){if(e==null||e==="")return null;if(typeof e=="number")return!Number.isFinite(e)||e<=0?null:e<1e12?Math.round(e*1e3):Math.round(e);if(typeof e=="string"){let t=e.trim();if(/^\d+(\.\d+)?$/.test(t))return q(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function tn(e){let t=q(e);if(t==null)return"";let n=Date.now()-t;return n<0?new Date(t).toLocaleDateString():n<6e4?"just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?`${Math.floor(n/36e5)}h ago`:n<7*864e5?`${Math.floor(n/864e5)}d ago`:new Date(t).toLocaleDateString()}function nn(e,t=!0){let n=e||"claude",a={claude:"bg-orange-500/15 text-orange-400",codex:"bg-emerald-500/15 text-emerald-400",grok:"bg-sky-500/15 text-sky-400",gemini:"bg-violet-500/15 text-violet-400",cursor:"bg-amber-500/15 text-amber-400"}[n]||"bg-base-300 text-base-content/50",o=t?n==="claude"?"CC":n==="codex"?"CX":n==="grok"?"GX":n==="gemini"?"GM":n==="cursor"?"CU":n.slice(0,2).toUpperCase():te[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(te[n]||n)}">${o}</span>`}function sn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var an=U(()=>{R();B()});function al(e){let t=q(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Qo(){let e=r("notifications-badge");if(e){if(!Mt){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=Mt>99?"99+":String(Mt)}}function Zo(){let e=r("notifications-menu"),t=r("btn-notifications"),n=r("topbar");if(!e||!t||!n)return;let s=t.getBoundingClientRect(),a=n.getBoundingClientRect(),o=Math.min(416,window.innerWidth-16),i=Math.max(8,Math.min(window.innerWidth-o-8,s.right-o));e.style.top=`${Math.round(a.bottom+8)}px`,e.style.left=`${Math.round(i)}px`,e.style.width=`${Math.round(o)}px`}function Nn(){let e=r("notifications-menu-list"),t=r("notifications-menu-empty");if(!(!e||!t)){if(!$e.length){e.innerHTML="",t.classList.remove("hidden"),Qo();return}t.classList.add("hidden"),e.innerHTML=$e.map(n=>`
2
2
  <button type="button"
3
3
  class="w-full text-left rounded-lg border px-3 py-2 transition-colors hover:bg-base-200/70 ${n.unread?"border-primary/35 bg-primary/5":"border-base-300 bg-base-100"}"
4
4
  data-notification-id="${p(n.id)}"
@@ -17,48 +17,48 @@ var Rr=Object.defineProperty;var K=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(
17
17
  <div class="flex items-center gap-2 mt-1 text-[10px] text-base-content/35">
18
18
  ${n.projectName?`<span class="font-mono truncate">${p(n.projectName)}</span>`:""}
19
19
  ${n.machineId?`<span class="px-1 py-0.5 rounded bg-base-300 text-base-content/55 font-mono">${p(n.machineId)}</span>`:""}
20
- <span>${p(Zr(n.createdAt))}</span>
20
+ <span>${p(al(n.createdAt))}</span>
21
21
  </div>
22
22
  </div>
23
23
  </div>
24
- </button>`).join(""),Qo()}}function It(){i("notifications-menu")?.classList.add("hidden"),i("notifications-backdrop")?.classList.add("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","false")}function el(){Xo(),i("notifications-menu")?.classList.remove("hidden"),i("notifications-backdrop")?.classList.remove("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","true")}function Zo(){let e=i("notifications-menu");e&&(e.classList.contains("hidden")?el():It())}function Vo(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);$e=[...t.values()].sort((n,s)=>(q(s.createdAt)||0)-(q(n.createdAt)||0)),Mt=$e.reduce((n,s)=>n+(s.unread?1:0),0),Dn()}async function us(){try{let e=await y("GET","/api/notifications?limit=80");$e=Array.isArray(e?.notifications)?e.notifications:[],Mt=Number(e?.unreadCount)||$e.reduce((t,n)=>t+(n.unread?1:0),0),Dn()}catch{$e=[],Mt=0,Dn()}}async function Yo(e=null){let t=await y("POST","/api/notifications/read",e?.length?{ids:e}:{});$e=Array.isArray(t?.notifications)?t.notifications:$e.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),Mt=Number(t?.unreadCount)||$e.reduce((n,s)=>n+(s.unread?1:0),0),Dn()}function tl(e){if(!(typeof Notification>"u")&&document.visibilityState!=="visible"&&Notification.permission==="granted")try{let t=new Notification(e.title||"Session done",{body:e.body||e.projectName||e.sessionId||"",tag:e.id});t.onclick=()=>{window.focus(),t.close()}}catch{}}function ei(e){if(!e?.id)return;if($e.find(n=>n.id===e.id)){Vo([e,...$e.filter(n=>n.id!==e.id)]);return}Vo([e,...$e]),tl(e)}function ti(e={}){Sa=typeof e.openSession=="function"?e.openSession:null,Dn(),us(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),g.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),It()}),g.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Yo()}),g.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Yo([s]),It(),!(!Sa||!n.dataset.notificationSession)&&Sa(n.dataset.notificationSession,n.dataset.notificationCwd||null,null,n.dataset.notificationAgent||"claude",n.dataset.notificationMachine||null))}),document.addEventListener("click",t=>{let n=i("notifications-menu"),s=i("btn-notifications"),a=t.target;!n||n.classList.contains("hidden")||n.contains(a)||s?.contains(a)||It()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&Xo()})}var $e,Mt,Sa,La=K(()=>{R();ue();an();$e=[],Mt=0,Sa=null});function sl(){let e=globalThis.mermaid;return!e||ni||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),ni=!0),e}function al(e){let t=String(e||"").replace(/\r\n?/g,`
25
- `).trim();return t=t.replace(/^```(?:mermaid)?\s*/i,"").replace(/\s*```$/,"").trim(),t=t.replace(/^mermaid\s*\n/i,""),t=t.replace(/^graph\s+(TD|TB|BT|RL|LR)\b/i,"flowchart $1"),t}function ps(e){let t=sl();!t||!e||e.querySelectorAll("pre code.language-mermaid, pre code.lang-mermaid").forEach(n=>{if(n.dataset.mermaidHandled)return;let s=n.closest("pre"),a=al(n.textContent);if(!s||!a)return;n.dataset.mermaidHandled="1";let o=document.createElement("div");o.className="mermaid-diagram",o.setAttribute("role","img"),o.setAttribute("aria-label","Mermaid diagram"),s.replaceWith(o);let r=`mermaid-diagram-${++nl}`;Promise.resolve(t.parse(a)).then(()=>t.render(r,a)).then(({svg:d,bindFunctions:l})=>{o.innerHTML=d,l?.(o)}).catch(d=>{o.replaceWith(s),delete n.dataset.mermaidHandled,s.classList.add("mermaid-error"),s.title=`Mermaid render failed: ${d?.message||"invalid diagram"}`})})}var ni,nl,Ea=K(()=>{ni=!1,nl=0});function ol(){return te[I.peek()]||"Assistant"}function li(e){return e.scrollHeight-e.scrollTop-e.clientHeight<80}function Me(e,t){e&&(t||li(e))&&(e.scrollTop=e.scrollHeight)}function ci(e=f.sessionId,t=f.agent,n=f.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function il(e={}){let t=ci(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(Ta)||"{}")[t])||0}catch{return 0}}function rl(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=ci(e.sessionId||f.sessionId,e.agent||f.agent,f.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(Ta)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((r,d)=>Number(s[d])-Number(s[r])).slice(500).forEach(r=>delete s[r]);try{localStorage.setItem(Ta,JSON.stringify(s))}catch{}return!0}function mt({sessionId:e=f.sessionId,agent:t=f.agent,machineId:n=f.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function cn(e){let t=mt(e),n=i("chat-input");!t||!n||(n.value?Ct.set(t,n.value):Ct.delete(t))}function dn(e){let t=i("chat-input");t&&(t.value=Ct.get(mt(e))||"",rn(t),on(t.value))}function un(e){let t=mt(e);if(!t)return;let n=nt.filter(a=>a.key===t);if(!n.length)return;nt=nt.filter(a=>a.key!==t);let s=Ct.get(t)||"";Ct.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
24
+ </button>`).join(""),Qo()}}function It(){r("notifications-menu")?.classList.add("hidden"),r("notifications-backdrop")?.classList.add("hidden"),r("btn-notifications")?.setAttribute("aria-expanded","false")}function ol(){Zo(),r("notifications-menu")?.classList.remove("hidden"),r("notifications-backdrop")?.classList.remove("hidden"),r("btn-notifications")?.setAttribute("aria-expanded","true")}function ei(){let e=r("notifications-menu");e&&(e.classList.contains("hidden")?ol():It())}function Yo(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);$e=[...t.values()].sort((n,s)=>(q(s.createdAt)||0)-(q(n.createdAt)||0)),Mt=$e.reduce((n,s)=>n+(s.unread?1:0),0),Nn()}async function ps(){try{let e=await y("GET","/api/notifications?limit=80");$e=Array.isArray(e?.notifications)?e.notifications:[],Mt=Number(e?.unreadCount)||$e.reduce((t,n)=>t+(n.unread?1:0),0),Nn()}catch{$e=[],Mt=0,Nn()}}async function Xo(e=null){let t=await y("POST","/api/notifications/read",e?.length?{ids:e}:{});$e=Array.isArray(t?.notifications)?t.notifications:$e.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),Mt=Number(t?.unreadCount)||$e.reduce((n,s)=>n+(s.unread?1:0),0),Nn()}function il(e){if(!(typeof Notification>"u")&&document.visibilityState!=="visible"&&Notification.permission==="granted")try{let t=new Notification(e.title||"Session done",{body:e.body||e.projectName||e.sessionId||"",tag:e.id});t.onclick=()=>{window.focus(),t.close()}}catch{}}function ti(e){if(!e?.id)return;if($e.find(n=>n.id===e.id)){Yo([e,...$e.filter(n=>n.id!==e.id)]);return}Yo([e,...$e]),il(e)}function ni(e={}){Sa=typeof e.openSession=="function"?e.openSession:null,Nn(),ps(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),g.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),It()}),g.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Xo()}),g.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Xo([s]),It(),!(!Sa||!n.dataset.notificationSession)&&Sa(n.dataset.notificationSession,n.dataset.notificationCwd||null,null,n.dataset.notificationAgent||"claude",n.dataset.notificationMachine||null))}),document.addEventListener("click",t=>{let n=r("notifications-menu"),s=r("btn-notifications"),a=t.target;!n||n.classList.contains("hidden")||n.contains(a)||s?.contains(a)||It()}),window.addEventListener("resize",()=>{r("notifications-menu")&&!r("notifications-menu").classList.contains("hidden")&&Zo()})}var $e,Mt,Sa,La=U(()=>{R();ue();an();$e=[],Mt=0,Sa=null});function ll(){let e=document.getElementById("mermaid-zoom-overlay");if(e)return e;e=document.createElement("div"),e.id="mermaid-zoom-overlay",e.className="mermaid-zoom-overlay hidden",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label","Mermaid diagram enlarged"),e.innerHTML='<button type="button" class="mermaid-zoom-close" aria-label="\u5173\u95ED\u653E\u5927\u56FE">\xD7</button><div class="mermaid-zoom-canvas"></div>',document.body.appendChild(e);let t=()=>e.classList.add("hidden");return e.addEventListener("click",n=>{(n.target===e||n.target.closest(".mermaid-zoom-close"))&&t()}),ai||(ai=!0,document.addEventListener("keydown",n=>{n.key==="Escape"&&t()})),e}function oi(e){let t=e.querySelector("svg");if(!t)return;let n=ll(),s=n.querySelector(".mermaid-zoom-canvas");s.innerHTML=t.outerHTML;let a=s.querySelector("svg");a?.removeAttribute("width"),a?.removeAttribute("height"),n.classList.remove("hidden")}function cl(){let e=globalThis.mermaid;return!e||si||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),si=!0),e}function dl(e){let t=String(e||"").replace(/\r\n?/g,`
25
+ `).trim();return t=t.replace(/^```(?:mermaid)?\s*/i,"").replace(/\s*```$/,"").trim(),t=t.replace(/^mermaid\s*\n/i,""),t=t.replace(/^graph\s+(TD|TB|BT|RL|LR)\b/i,"flowchart $1"),t}function fs(e){let t=cl();!t||!e||e.querySelectorAll("pre code.language-mermaid, pre code.lang-mermaid").forEach(n=>{if(n.dataset.mermaidHandled)return;let s=n.closest("pre"),a=dl(n.textContent);if(!s||!a)return;n.dataset.mermaidHandled="1";let o=document.createElement("div");o.className="mermaid-diagram",o.setAttribute("role","img"),o.setAttribute("aria-label","Mermaid diagram"),s.replaceWith(o);let i=`mermaid-diagram-${++rl}`;Promise.resolve(t.parse(a)).then(()=>t.render(i,a)).then(({svg:d,bindFunctions:l})=>{o.innerHTML=d,l?.(o),o.tabIndex=0,o.title="\u70B9\u51FB\u653E\u5927\u56FE\u8868",o.addEventListener("click",c=>{c.target.closest("a")||oi(o)}),o.addEventListener("keydown",c=>{(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),oi(o))})}).catch(d=>{o.replaceWith(s),delete n.dataset.mermaidHandled,s.classList.add("mermaid-error"),s.title=`Mermaid render failed: ${d?.message||"invalid diagram"}`})})}var si,rl,ai,Ea=U(()=>{si=!1,rl=0,ai=!1});function ul(e){return e.parentElement?.closest("pre, code, .mermaid-diagram, .katex, script, style")}function Ta(e,t){let n=[{re:/\\\[([\s\S]+?)\\\]/g,display:!0},{re:/\$\$([\s\S]+?)\$\$/g,display:!0},{re:/\\\(([\s\S]+?)\\\)/g,display:!1},{re:/(?<!\\)\$([^$\n]|\\\$)+?(?<!\s)(?<!\\)\$/g,display:!1}],s=null;for(let a of n){a.re.lastIndex=t;let o=a.re.exec(e);if(!o||s&&o.index>=s.match.index)continue;let i=o[0],d=i.startsWith("\\[")||i.startsWith("\\(")||i.startsWith("$$")?i.slice(2,-2):i.slice(1,-1);d.trim()&&(s={match:o,body:d,display:a.display})}return s}function pl(e){let t=e.nodeValue||"",n=0,s=Ta(t,n);if(!s||typeof globalThis.katex?.renderToString!="function")return;let a=document.createDocumentFragment();for(;s;){s.match.index>n&&a.append(document.createTextNode(t.slice(n,s.match.index)));let o;try{o=globalThis.katex.renderToString(s.body.trim(),{displayMode:s.display,throwOnError:!1,strict:"warn"})}catch{a.append(document.createTextNode(s.match[0])),n=s.match.index+s.match[0].length,s=Ta(t,n);continue}let i=document.createElement(s.display?"div":"span");i.className=s.display?"math-display":"math-inline",i.innerHTML=o,a.append(i),n=s.match.index+s.match[0].length,s=Ta(t,n)}n<t.length&&a.append(document.createTextNode(t.slice(n))),e.replaceWith(a)}function ii(e){if(!e||typeof globalThis.katex?.renderToString!="function")return;let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=[];for(;t.nextNode();)ul(t.currentNode)||n.push(t.currentNode);n.forEach(pl)}var ri=U(()=>{});function fl(){return te[I.peek()]||"Assistant"}function fi(e){return e.scrollHeight-e.scrollTop-e.clientHeight<80}function Me(e,t){e&&(t||fi(e))&&(e.scrollTop=e.scrollHeight)}function mi(e=f.sessionId,t=f.agent,n=f.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function ml(e={}){let t=mi(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(Ma)||"{}")[t])||0}catch{return 0}}function hl(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=mi(e.sessionId||f.sessionId,e.agent||f.agent,f.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(Ma)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((i,d)=>Number(s[d])-Number(s[i])).slice(500).forEach(i=>delete s[i]);try{localStorage.setItem(Ma,JSON.stringify(s))}catch{}return!0}function mt({sessionId:e=f.sessionId,agent:t=f.agent,machineId:n=f.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function dn(e){let t=mt(e),n=r("chat-input");!t||!n||(n.value?Ct.set(t,n.value):Ct.delete(t))}function un(e){let t=r("chat-input");t&&(t.value=Ct.get(mt(e))||"",ln(t),rn(t.value))}function pn(e){let t=mt(e);if(!t)return;let n=nt.filter(a=>a.key===t);if(!n.length)return;nt=nt.filter(a=>a.key!==t);let s=Ct.get(t)||"";Ct.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
26
26
 
27
- `))}function pn(){he.peek()&&(he.value=!1,pt())}function ll(){si||(si=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(Ke=400,fs({probe:!0}),f.ws?.readyState===WebSocket.OPEN&&f.sessionId))try{f.ws.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}}),window.addEventListener("online",()=>{Ke=400,fs({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?fs({force:!0}):fs({probe:!0})}))}function Rn(){let e=i("conn-dot");if(!e)return;let t=ze.peek();e.classList.remove("bg-success","bg-warning","bg-error","bg-base-content/30","animate-pulse"),t==="open"?(e.classList.add("bg-success"),e.title="\u5DF2\u8FDE\u63A5"):t==="connecting"||t==="reconnecting"?(e.classList.add("bg-warning","animate-pulse"),e.title=t==="connecting"?"\u8FDE\u63A5\u4E2D\u2026":"\u91CD\u8FDE\u4E2D\u2026"):t==="offline"?(e.classList.add("bg-error"),e.title="\u79BB\u7EBF"):(e.classList.add("bg-base-content/30"),e.title="\u672A\u8FDE\u63A5")}function fs(e={}){let t=f.ws?.readyState;if(e.force){Ke=400,st({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&et&&Date.now()-et>45e3)try{f.ws.close()}catch{}else if(e.probe&&f.ws.readyState===WebSocket.OPEN)try{f.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(Ke=Math.min(Ke,800),st({quiet:!0}))}function cl(){tt||(ze.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Rn(),tt=setTimeout(()=>{tt=null,st({quiet:!0})},Ke),Ke=Math.min(Math.round(Ke*1.8),15e3))}function di(){hs&&(clearInterval(hs),hs=null)}function dl(e,t){di(),hs=setInterval(()=>{if(!(t!==_n||e.readyState!==WebSocket.OPEN)){if(et&&Date.now()-et>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&et&&Date.now()-et>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function pt(){let e=he.peek()||!!E.peek()&&ze.peek()==="open";Ko(e)}function ul(){Ke=400,tt&&(clearTimeout(tt),tt=null),gs=!1;let e=f.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{f.ws?.close()}catch{}st({quiet:!1}),L("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function st(e={}){ll(),tt&&(clearTimeout(tt),tt=null),e.quiet&&(gs=!0);let t=f.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);ai!==t&&(Ho(),ai=t);let n=++_n;try{f.ws?.close()}catch{}ze.value="connecting",Rn();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;f.token&&a.set("token",f.token),t&&a.set("machine",t),f.sessionId&&a.set("sessionId",f.sessionId),f.agent&&a.set("agent",f.agent);let o=il();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);f.ws=r,r.addEventListener("open",()=>{if(n===_n){if(Ke=1e3,et=Date.now(),ze.value="open",Rn(),f.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}Po(),dl(r,n),pt(),bs&&!gs&&L(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bs=!1,gs=!1}}),r.addEventListener("message",d=>{if(n!==_n)return;let l;try{l=JSON.parse(d.data)}catch{return}if(rl(l)){if(l.type==="pong"){et=Date.now();return}if(l.type==="ping"){if(et=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(l.type==="run-status"){l.running?he.value=!0:he.peek()&&(he.value=!1,ui()),pt();return}pi(l)}}),r.addEventListener("close",()=>{n===_n&&(di(),bs=!0,ze.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Rn(),cl())}),r.addEventListener("error",()=>{})}function ui(){if(!nt.length||he.peek())return;let e=mt(),t=nt.findIndex(a=>a.key===e);if(t<0)return;let[n]=nt.splice(t,1),s=i("chat-input");s&&(s.value=n.text,rn(s)),setTimeout(()=>{if(n.key!==mt()||he.peek()){Ct.set(n.key,n.text);return}On()},0)}function Pn(){he.value=!1,pt(),ui()}function pi(e){if(!(e?.sessionId&&f.sessionId&&e.sessionId!==f.sessionId)){if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)pi(t);return}if(e.type==="session-created"){let t=P.peek();f.sessionId=e.sessionId,e.agent&&e.agent!==I.peek()&&Fe(e.agent),le(t,e.agent||I.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="notification"&&e.notification){ei(e.notification);return}if(e.type==="result"){Hn(),Nn(),De();let t=e.usage;if(t){let n={input_tokens:t.inputTokens??t.input_tokens,output_tokens:t.outputTokens??t.output_tokens,cache_read_input_tokens:t.cacheReadInputTokens??t.cache_read_input_tokens,cache_creation_input_tokens:t.cacheCreationInputTokens??t.cache_creation_input_tokens,total_tokens:t.totalTokens??t.total_tokens,reasoning_tokens:t.reasoningTokens??t.reasoning_tokens,costUSD:t.costUSD??t.cost_usd};f.lastUsage=n,f.sessionId&&(f.lastUsageSessionId=f.sessionId),ln(n)}e.is_error||L("\u2713 Done"),Pn();return}if(e.type==="complete"){Hn(),Nn(),De(),!e.aborted&&e.agent==="claude"?L("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?L("\u2713 Done"):e.aborted&&L("\u5DF2\u505C\u6B62")),Pn();return}if(e.type==="error"){Hn(),Nn(),At("error","Error",e.message),Pn();return}if(e.type==="shell-start"){f.shellBubble=null;return}if(e.type==="shell-output"){f.shellBubble||(f.shellBubble=Ml(e.stream==="stderr"?"shell-err":"shell")),Il(f.shellBubble,e.data);return}if(e.type==="shell-exit"){f.shellBubble=null,L(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),Pn();return}if(e.type==="assistant"){Nn();for(let t of e.message?.content||[])t.type==="text"&&t.text?(De(),At("assistant",ol(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&ja(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){fi(e.ts);return}if(e.type==="assistant_delta"){pl(e.data||"");return}if(e.type==="assistant_stream_end"){Nn();return}if(e.type==="thought_stream_start"){mi();return}if(e.type==="thought_delta"){fl(e.data||"");return}if(e.type==="thought_stream_end"){Hn();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),Me(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&jl(e)}}function fi(e){let t=i("messages");if(!t||(De(),Hn(),We&&t.contains(We)))return;let n=ys(e||Date.now()),s=ws(e||Date.now());t.insertAdjacentHTML("beforeend",`
27
+ `))}function fn(){he.peek()&&(he.value=!1,pt())}function bl(){li||(li=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(De=400,on({probe:!0}),f.ws?.readyState===WebSocket.OPEN&&f.sessionId))try{f.ws.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}}),window.addEventListener("online",()=>{De=400,on({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?on({force:!0}):on({probe:!0})}),window.addEventListener("focus",()=>on({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{De=400,on({probe:!0})}))}function On(){let e=r("conn-dot");if(!e)return;let t=Ke.peek();e.classList.remove("bg-success","bg-warning","bg-error","bg-base-content/30","animate-pulse"),t==="open"?(e.classList.add("bg-success"),e.title="\u5DF2\u8FDE\u63A5"):t==="connecting"||t==="reconnecting"?(e.classList.add("bg-warning","animate-pulse"),e.title=t==="connecting"?"\u8FDE\u63A5\u4E2D\u2026":"\u91CD\u8FDE\u4E2D\u2026"):t==="offline"?(e.classList.add("bg-error"),e.title="\u79BB\u7EBF"):(e.classList.add("bg-base-content/30"),e.title="\u672A\u8FDE\u63A5")}function on(e={}){let t=f.ws?.readyState;if(e.force){De=400,st({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&et&&Date.now()-et>45e3)try{f.ws.close()}catch{}else if(e.probe&&f.ws.readyState===WebSocket.OPEN)try{f.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(De=Math.min(De,800),st({quiet:!0}))}function gl(){tt||(Ke.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",On(),tt=setTimeout(()=>{tt=null,st({quiet:!0})},De),De=Math.min(Math.round(De*1.8),15e3))}function hi(){hs&&(clearInterval(hs),hs=null)}function xl(e,t){hi(),hs=setInterval(()=>{if(!(t!==Pn||e.readyState!==WebSocket.OPEN)){if(et&&Date.now()-et>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&et&&Date.now()-et>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function pt(){let e=he.peek()||!!E.peek()&&Ke.peek()==="open";Ko(e)}function vl(){De=400,tt&&(clearTimeout(tt),tt=null),gs=!1;let e=f.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{f.ws?.close()}catch{}st({quiet:!1}),L("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function st(e={}){bl(),tt&&(clearTimeout(tt),tt=null),e.quiet&&(gs=!0);let t=f.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);ci!==t&&(Ro(),ci=t);let n=++Pn;try{f.ws?.close()}catch{}Ke.value="connecting",On();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;f.token&&a.set("token",f.token),t&&a.set("machine",t),f.sessionId&&a.set("sessionId",f.sessionId),f.agent&&a.set("agent",f.agent);let o=ml();o&&a.set("lastSeq",String(o));let i=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);f.ws=i,i.addEventListener("open",()=>{if(n===Pn){if(De=1e3,et=Date.now(),Ke.value="open",On(),f.sessionId)try{i.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}Ho(),xl(i,n),pt(),bs&&!gs&&L(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bs=!1,gs=!1}}),i.addEventListener("message",d=>{if(n!==Pn)return;let l;try{l=JSON.parse(d.data)}catch{return}if(hl(l)){if(l.type==="pong"){et=Date.now();return}if(l.type==="ping"){if(et=Date.now(),i.readyState===WebSocket.OPEN)try{i.send(JSON.stringify({type:"pong"}))}catch{}return}if(l.type==="run-status"){l.running?he.value=!0:he.peek()&&(he.value=!1,bi()),pt();return}gi(l)}}),i.addEventListener("close",()=>{n===Pn&&(hi(),bs=!0,Ke.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",On(),gl())}),i.addEventListener("error",()=>{})}function bi(){if(!nt.length||he.peek())return;let e=mt(),t=nt.findIndex(a=>a.key===e);if(t<0)return;let[n]=nt.splice(t,1),s=r("chat-input");s&&(s.value=n.text,ln(s)),setTimeout(()=>{if(n.key!==mt()||he.peek()){Ct.set(n.key,n.text);return}Bn()},0)}function Hn(){he.value=!1,pt(),bi()}function gi(e){if(!(e?.sessionId&&f.sessionId&&e.sessionId!==f.sessionId)){if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)gi(t);return}if(e.type==="session-created"){let t=P.peek();f.sessionId=e.sessionId,e.agent&&e.agent!==I.peek()&&Ue(e.agent),le(t,e.agent||I.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="notification"&&e.notification){ti(e.notification);return}if(e.type==="result"){Rn(),_n(),Ne();let t=e.usage;if(t){let n={input_tokens:t.inputTokens??t.input_tokens,output_tokens:t.outputTokens??t.output_tokens,cache_read_input_tokens:t.cacheReadInputTokens??t.cache_read_input_tokens,cache_creation_input_tokens:t.cacheCreationInputTokens??t.cache_creation_input_tokens,total_tokens:t.totalTokens??t.total_tokens,reasoning_tokens:t.reasoningTokens??t.reasoning_tokens,costUSD:t.costUSD??t.cost_usd};f.lastUsage=n,f.sessionId&&(f.lastUsageSessionId=f.sessionId),cn(n)}e.is_error||L("\u2713 Done"),Hn();return}if(e.type==="complete"){Rn(),_n(),Ne(),!e.aborted&&e.agent==="claude"?L("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?L("\u2713 Done"):e.aborted&&L("\u5DF2\u505C\u6B62")),Hn();return}if(e.type==="error"){Rn(),_n(),At("error","Error",e.message),Hn();return}if(e.type==="shell-start"){f.shellBubble=null;return}if(e.type==="shell-output"){f.shellBubble||(f.shellBubble=Pl(e.stream==="stderr"?"shell-err":"shell")),Hl(f.shellBubble,e.data);return}if(e.type==="shell-exit"){f.shellBubble=null,L(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),Hn();return}if(e.type==="assistant"){_n();for(let t of e.message?.content||[])t.type==="text"&&t.text?(Ne(),At("assistant",fl(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&Da(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){xi(e.ts);return}if(e.type==="assistant_delta"){yl(e.data||"");return}if(e.type==="assistant_stream_end"){_n();return}if(e.type==="thought_stream_start"){vi();return}if(e.type==="thought_delta"){wl(e.data||"");return}if(e.type==="thought_stream_end"){Rn();return}if(e.type==="status"){let t=r("stream-status");if(t)t.textContent=e.message||"";else{let n=r("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),Me(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&r(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&Bl(e)}}function xi(e){let t=r("messages");if(!t||(Ne(),Rn(),Ge&&t.contains(Ge)))return;let n=ys(e||Date.now()),s=ws(e||Date.now());t.insertAdjacentHTML("beforeend",`
28
28
  <div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
29
29
  <div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
30
30
  <div class="msg-stream-body whitespace-pre-wrap"></div>
31
31
  </div>
32
32
  ${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
33
- </div>`),We=t.lastElementChild,Te=We.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Me(t,!0)}function pl(e){e&&(Te||fi(Date.now()),Te&&(Te.textContent+=e,Me(i("messages"),!0)))}function Nn(){if(!We||!Te){We=null,Te=null;return}let e=Te.textContent||"";e.trim()?(Te.classList.remove("whitespace-pre-wrap"),Te.classList.add("md"),Te.innerHTML=vs(e),vi(We)):We.remove(),We=null,Te=null,i("stream-status")?.remove()}function mi(){let e=i("messages");e&&(ut&&e.contains(ut)||(e.insertAdjacentHTML("beforeend",`
33
+ </div>`),Ge=t.lastElementChild,Te=Ge.querySelector(".msg-stream-body"),r("stream-status")?.remove(),Me(t,!0)}function yl(e){e&&(Te||xi(Date.now()),Te&&(Te.textContent+=e,Me(r("messages"),!0)))}function _n(){if(!Ge||!Te){Ge=null,Te=null;return}let e=Te.textContent||"";e.trim()?(Te.classList.remove("whitespace-pre-wrap"),Te.classList.add("md"),Te.innerHTML=vs(e),Si(Ge)):Ge.remove(),Ge=null,Te=null,r("stream-status")?.remove()}function vi(){let e=r("messages");e&&(ut&&e.contains(ut)||(e.insertAdjacentHTML("beforeend",`
34
34
  <div class="msg-row assistant px-2 thought-stream">
35
35
  <div class="max-w-[88%] rounded-lg border border-base-300/60 bg-base-200/50 px-2.5 py-1.5 text-[11px] text-base-content/45">
36
36
  <div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
37
37
  <div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
38
38
  </div>
39
- </div>`),ut=e.lastElementChild,Ge=ut.querySelector(".thought-body"),Me(e,!0)))}function fl(e){e&&(Ge||mi(),Ge&&(Ge.textContent+=e,Ge.scrollTop=Ge.scrollHeight,Me(i("messages"),!0)))}function Hn(){if(ut&&Ge){let e=(Ge.textContent||"").length;ut.innerHTML=`
40
- <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}ut=null,Ge=null}function hl(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return L(`Current agent: ${I.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==I.peek()?(f.sessionId=null,Fe(a),le(qe(a)),document.dispatchEvent(new CustomEvent("agent-changed")),L(`Agent \u2192 ${te[a]} \xB7 model ${P.peek()} \xB7 new session`)):L(`Agent already ${te[a]}`),!0):(L(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=I.peek(),l=Xe(d).map(c=>c.value).join(" | ");return L(`Current model: ${P.peek()} (${d})${l?`
41
- Available: ${l}`:""}`),!0}let a=ml[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe(o).some(d=>d.value===a);return r||Mn(o,a),le(a),L(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=In(I.peek(),P.peek());return s?a.includes(s.toLowerCase())?(ie.value=s.toLowerCase(),L(`Effort set to ${s.toLowerCase()}`),!0):(L(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(L(`Current effort: ${ie.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return mn(),f.sessionId=null,f.lastUsage=null,L("Cleared \xB7 new session"),!0;case"usage":return bl(),!0;case"help":return L(`Available slash commands:
39
+ </div>`),ut=e.lastElementChild,ze=ut.querySelector(".thought-body"),Me(e,!0)))}function wl(e){e&&(ze||vi(),ze&&(ze.textContent+=e,ze.scrollTop=ze.scrollHeight,Me(r("messages"),!0)))}function Rn(){if(ut&&ze){let e=(ze.textContent||"").length;ut.innerHTML=`
40
+ <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}ut=null,ze=null}function $l(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return L(`Current agent: ${I.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==I.peek()?(f.sessionId=null,Ue(a),le(Fe(a)),document.dispatchEvent(new CustomEvent("agent-changed")),L(`Agent \u2192 ${te[a]} \xB7 model ${P.peek()} \xB7 new session`)):L(`Agent already ${te[a]}`),!0):(L(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=I.peek(),l=Xe(d).map(c=>c.value).join(" | ");return L(`Current model: ${P.peek()} (${d})${l?`
41
+ Available: ${l}`:""}`),!0}let a=kl[s.toLowerCase()]||s,o=I.peek()||"claude",i=Xe(o).some(d=>d.value===a);return i||In(o,a),le(a),L(`Model set to ${a}${i?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Cn(I.peek(),P.peek());return s?a.includes(s.toLowerCase())?(ie.value=s.toLowerCase(),L(`Effort set to ${s.toLowerCase()}`),!0):(L(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(L(`Current effort: ${ie.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return hn(),f.sessionId=null,f.lastUsage=null,L("Cleared \xB7 new session"),!0;case"usage":return Sl(),!0;case"help":return L(`Available slash commands:
42
42
  /agent [claude|codex|grok|gemini|cursor]
43
43
  /model [haiku|sonnet|opus|<model-id>]
44
44
  /effort [low|medium|high|xhigh|max]
45
45
  /usage
46
46
  /clear
47
- /help`),!0;default:return!1}}function ve(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function bl(){let e=I.peek()||"claude",t=P.peek()||"\u2014",n=f.sessionId,s=[`Agent: ${te[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(f.lastUsage&&(!n||f.lastUsageSessionId===n)){let a=f.lastUsage;s.push(`Last turn: \u2191${ve(a.input_tokens)} \u2193${ve(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${ve(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${ve(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${ve(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){L(s.join(`
48
- `)),Ca("\u25C8 /usage \xB7 no session yet");return}L("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await y("GET",`/api/usage?${a}`)).context||{};if(r.model&&(s[1]=`Model: ${r.model}`),r.title&&s.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let l=r.tokensUsed!=null?ve(r.tokensUsed):"\u2014",c=r.windowTokens!=null?ve(r.windowTokens):"\u2014",u=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${l} / ${c} (${u})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let l=Math.floor(r.sessionDurationSeconds/60),c=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${l}m ${c}s`)}if(r.sessionTotals){let l=r.sessionTotals;s.push(`Session totals: \u2191${ve(l.input_tokens)} \u2193${ve(l.output_tokens)}`+(l.cache_read_input_tokens?` \xB7 ${ve(l.cache_read_input_tokens)} cached`:"")+(l.total_tokens?` \xB7 \u03A3${ve(l.total_tokens)}`:"")+(l.costUSD?` \xB7 $${Number(l.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!f.lastUsage){let l=r.lastTurn;s.push(`Last completed turn: \u2191${ve(l.input_tokens)} \u2193${ve(l.output_tokens)}`+(l.cache_read_input_tokens?` \xB7 ${ve(l.cache_read_input_tokens)} cached`:"")+(l.costUSD!=null?` \xB7 $${Number(l.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let l=[...d.children];for(let c=l.length-1;c>=0;c--)if(l[c].textContent==="Loading usage\u2026"){l[c].remove();break}}L(s.join(`
49
- `)),(r.tokensUsed!=null||r.windowTokens!=null)&&Aa({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?ln(r.sessionTotals):r.lastTurn?ln(r.lastTurn):f.lastUsage&&ln(f.lastUsage)}catch(a){let o=i("messages");if(o){let r=[...o.children];for(let d=r.length-1;d>=0;d--)if(r[d].textContent==="Loading usage\u2026"){r[d].remove();break}}L(`${s.join(`
47
+ /help`),!0;default:return!1}}function ve(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function Sl(){let e=I.peek()||"claude",t=P.peek()||"\u2014",n=f.sessionId,s=[`Agent: ${te[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(f.lastUsage&&(!n||f.lastUsageSessionId===n)){let a=f.lastUsage;s.push(`Last turn: \u2191${ve(a.input_tokens)} \u2193${ve(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${ve(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${ve(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${ve(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){L(s.join(`
48
+ `)),Aa("\u25C8 /usage \xB7 no session yet");return}L("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),i=(await y("GET",`/api/usage?${a}`)).context||{};if(i.model&&(s[1]=`Model: ${i.model}`),i.title&&s.push(`Title: ${i.title}`),i.tokensUsed!=null||i.windowTokens!=null||i.usagePercent!=null){let l=i.tokensUsed!=null?ve(i.tokensUsed):"\u2014",c=i.windowTokens!=null?ve(i.windowTokens):"\u2014",u=i.usagePercent!=null?`${i.usagePercent}%`:"\u2014";s.push(`Context window: ${l} / ${c} (${u})`)}if(i.turnCount!=null&&s.push(`Turns: ${i.turnCount}`),i.toolCallCount!=null&&s.push(`Tools: ${i.toolCallCount}`),i.sessionDurationSeconds!=null){let l=Math.floor(i.sessionDurationSeconds/60),c=Math.round(i.sessionDurationSeconds%60);s.push(`Duration: ${l}m ${c}s`)}if(i.sessionTotals){let l=i.sessionTotals;s.push(`Session totals: \u2191${ve(l.input_tokens)} \u2193${ve(l.output_tokens)}`+(l.cache_read_input_tokens?` \xB7 ${ve(l.cache_read_input_tokens)} cached`:"")+(l.total_tokens?` \xB7 \u03A3${ve(l.total_tokens)}`:"")+(l.costUSD?` \xB7 $${Number(l.costUSD).toFixed(4)}`:""))}if(i.lastTurn&&!f.lastUsage){let l=i.lastTurn;s.push(`Last completed turn: \u2191${ve(l.input_tokens)} \u2193${ve(l.output_tokens)}`+(l.cache_read_input_tokens?` \xB7 ${ve(l.cache_read_input_tokens)} cached`:"")+(l.costUSD!=null?` \xB7 $${Number(l.costUSD).toFixed(4)}`:""))}i.note&&s.push(i.note);let d=r("messages");if(d){let l=[...d.children];for(let c=l.length-1;c>=0;c--)if(l[c].textContent==="Loading usage\u2026"){l[c].remove();break}}L(s.join(`
49
+ `)),(i.tokensUsed!=null||i.windowTokens!=null)&&ja({tokensUsed:i.tokensUsed,windowTokens:i.windowTokens,usagePercent:i.usagePercent,model:i.model||t,turnCount:i.turnCount,toolCallCount:i.toolCallCount}),i.sessionTotals?cn(i.sessionTotals):i.lastTurn?cn(i.lastTurn):f.lastUsage&&cn(f.lastUsage)}catch(a){let o=r("messages");if(o){let i=[...o.children];for(let d=i.length-1;d>=0;d--)if(i[d].textContent==="Loading usage\u2026"){i[d].remove();break}}L(`${s.join(`
50
50
  `)}
51
- (usage fetch failed: ${a.message})`)}}function On(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(he.peek()){if(I.peek()==="grok"&&f.sessionId){let s="grok",a=ie.peek()||lt(s,P.peek())||"low",o=Vt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),effort:a,...Ee.peek()&&{permissionMode:Ee.peek()},...Ee.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});e.value="",rn(e),on(""),xs(),L(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4E0D\u4F1A\u4E22\u5931":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}nt.push({key:mt(),text:t}),e.value="",rn(e),on(""),xs(),L(`\u5DF2\u6392\u961F\u4E0B\u4E00\u6761\uFF0C\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u53D1\u9001\uFF1A${t.length>80?t.slice(0,80)+"\u2026":t}`);return}if(e.value="",Ct.delete(mt()),rn(e),on(""),xs(),t.startsWith("/")&&hl(t))return;he.value=!0,pt();let n=Date.now();if(bi(t))At("shell","$ Shell",t.slice(1).trim(),{ts:n}),Vt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{De(),At("user","You",t,{ts:n});let s=I.peek()||"claude",a=ie.peek()||lt(s,P.peek())||(s==="grok"?"low":""),o=Ee.peek();f.sessionId&&le(P.peek(),s,f.sessionId),Vt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function hi(){f.sessionId&&Vt({type:"command",cmd:"turn.interrupt",sessionId:f.sessionId}),nt=nt.filter(e=>e.key!==mt()),Pn()}function on(e){let t=bi(e),n=i("chat-input"),s=i("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=te[I.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function bi(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function gl(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function rn(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,gl())+"px"}function ys(e){let t=q(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function ws(e){let t=q(e);return t==null?"":new Date(t).toISOString()}function yl(e,t,n){if(e==="system")return t;let s=ys(n),a=ws(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function wl(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?vs(t):null,d=t.length>xl,l=d?`<div class="msg-body">${r??p(t.trimEnd())}</div>${s}`:r??p(t.trimEnd());a=`<div class="max-w-[80%] rounded-2xl rounded-tr-sm px-3 py-2 text-sm bg-primary/15 border border-primary/20 text-base-content break-words${d?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${l}</div>`;break}case"assistant":{let o=t.length>vl,r=o?`<div class="msg-body">${vs(t)}</div>${s}`:vs(t);a=`<div class="max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${o?" msg-card":""}">${r}</div>`;break}case"error":a=`<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-error/10 border border-error/20 text-error break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<div class="w-full max-w-[96%] rounded-lg code-surface px-3 py-2 text-sm font-mono ${e==="shell-err"?"text-error":""} break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return yl(e,a,n)}function At(e,t,n,s={}){let a=i("messages");if(!a)return;let o=q(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",wl(e,n,o)),vi(a.lastElementChild),Me(a,e==="user")}function L(e){At("system","",e)}async function kl(e,t){let n=t||`upload-${Date.now()}`,s=await gi(e,n),a=dt({"x-filename":n});delete a["Content-Type"],s?.type&&!a["Content-Type"]&&!a["content-type"]&&(a["Content-Type"]=s.type);let o=await fetch("/api/upload-image",{method:"POST",headers:a,body:s});if(!o.ok){let d=await o.json().catch(()=>({}));throw new Error(d.error||`Upload failed: ${o.status}`)}let r=await o.json();if(!r?.path)throw new Error("upload returned no path");return r.path}function $l(e,t){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=6&&String.fromCharCode(...e.slice(0,6))==="GIF87a"?"image/gif":e.length>=12&&String.fromCharCode(...e.slice(8,12))==="WEBP"?"image/webp":t||"image/png"}async function gi(e,t){if(!e||!Ma({type:e.type,name:t}))return e;let n;try{n=(await e.slice(0,80).text()).trim()}catch{return e}if(!/^(?:data:image\/[a-z0-9.+-]+;base64,|iVBORw0KGgo|\/9j\/|R0lGOD|UklGR)/i.test(n))return e;let s;try{s=(await e.text()).trim()}catch{return e}let o=/^data:image\/[a-z0-9.+-]+;base64,([a-z0-9+/=\s]+)$/i.exec(s)?.[1]||s;if(!o||!/^[a-z0-9+/=\s]+$/i.test(o)||o.length%4===1)return e;try{let r=atob(o.replace(/\s/g,"")),d=Uint8Array.from(r,u=>u.charCodeAt(0)),l=$l(d,e.type);return l===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(l)?e:d.length>=3&&(d[0]===137&&d[1]===80&&d[2]===78||d[0]===255&&d[1]===216&&d[2]===255||String.fromCharCode(...d.slice(0,6))==="GIF87a"||String.fromCharCode(...d.slice(8,12))==="WEBP")?new Blob([d],{type:l}):e}catch{return e}}function Sl(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length,o=(n>0&&e.value[n-1]!==`
51
+ (usage fetch failed: ${a.message})`)}}function Bn(){let e=r("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(he.peek()){if(I.peek()==="grok"&&f.sessionId){let s="grok",a=ie.peek()||lt(s,P.peek())||"low",o=Qt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),effort:a,...Ee.peek()&&{permissionMode:Ee.peek()},...Ee.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});e.value="",ln(e),rn(""),xs(),L(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4E0D\u4F1A\u4E22\u5931":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}nt.push({key:mt(),text:t}),e.value="",ln(e),rn(""),xs(),L(`\u5DF2\u6392\u961F\u4E0B\u4E00\u6761\uFF0C\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u53D1\u9001\uFF1A${t.length>80?t.slice(0,80)+"\u2026":t}`);return}if(e.value="",Ct.delete(mt()),ln(e),rn(""),xs(),t.startsWith("/")&&$l(t))return;he.value=!0,pt();let n=Date.now();if(wi(t))At("shell","$ Shell",t.slice(1).trim(),{ts:n}),Qt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{Ne(),At("user","You",t,{ts:n});let s=I.peek()||"claude",a=ie.peek()||lt(s,P.peek())||(s==="grok"?"low":""),o=Ee.peek();f.sessionId&&le(P.peek(),s,f.sessionId),Qt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function yi(){f.sessionId&&Qt({type:"command",cmd:"turn.interrupt",sessionId:f.sessionId}),nt=nt.filter(e=>e.key!==mt()),Hn()}function rn(e){let t=wi(e),n=r("chat-input"),s=r("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=te[I.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function wi(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function Ll(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function ln(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,Ll())+"px"}function ys(e){let t=q(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function ws(e){let t=q(e);return t==null?"":new Date(t).toISOString()}function Ml(e,t,n){if(e==="system")return t;let s=ys(n),a=ws(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function Il(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let i=/!\[.*?\]\(.*?\)/.test(t)?vs(t):null,d=t.length>El,l=d?`<div class="msg-body">${i??p(t.trimEnd())}</div>${s}`:i??p(t.trimEnd());a=`<div class="max-w-[80%] rounded-2xl rounded-tr-sm px-3 py-2 text-sm bg-primary/15 border border-primary/20 text-base-content break-words${d?" msg-card":""}${i?" md":""}"${i?"":' style="white-space:pre-wrap"'}>${l}</div>`;break}case"assistant":{let o=t.length>Tl,i=o?`<div class="msg-body">${vs(t)}</div>${s}`:vs(t);a=`<div class="max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${o?" msg-card":""}">${i}</div>`;break}case"error":a=`<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-error/10 border border-error/20 text-error break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<div class="w-full max-w-[96%] rounded-lg code-surface px-3 py-2 text-sm font-mono ${e==="shell-err"?"text-error":""} break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return Ml(e,a,n)}function At(e,t,n,s={}){let a=r("messages");if(!a)return;let o=q(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Il(e,n,o)),Si(a.lastElementChild),Me(a,e==="user")}function L(e){At("system","",e)}async function Cl(e,t){let n=t||`upload-${Date.now()}`,s=await ki(e,n),a=dt({"x-filename":n});delete a["Content-Type"],s?.type&&!a["Content-Type"]&&!a["content-type"]&&(a["Content-Type"]=s.type);let o=await fetch("/api/upload-image",{method:"POST",headers:a,body:s});if(!o.ok){let d=await o.json().catch(()=>({}));throw new Error(d.error||`Upload failed: ${o.status}`)}let i=await o.json();if(!i?.path)throw new Error("upload returned no path");return i.path}function Al(e,t){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=6&&String.fromCharCode(...e.slice(0,6))==="GIF87a"?"image/gif":e.length>=12&&String.fromCharCode(...e.slice(8,12))==="WEBP"?"image/webp":t||"image/png"}async function ki(e,t){if(!e||!Ia({type:e.type,name:t}))return e;let n;try{n=(await e.slice(0,80).text()).trim()}catch{return e}if(!/^(?:data:image\/[a-z0-9.+-]+;base64,|iVBORw0KGgo|\/9j\/|R0lGOD|UklGR)/i.test(n))return e;let s;try{s=(await e.text()).trim()}catch{return e}let o=/^data:image\/[a-z0-9.+-]+;base64,([a-z0-9+/=\s]+)$/i.exec(s)?.[1]||s;if(!o||!/^[a-z0-9+/=\s]+$/i.test(o)||o.length%4===1)return e;try{let i=atob(o.replace(/\s/g,"")),d=Uint8Array.from(i,u=>u.charCodeAt(0)),l=Al(d,e.type);return l===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(l)?e:d.length>=3&&(d[0]===137&&d[1]===80&&d[2]===78||d[0]===255&&d[1]===216&&d[2]===255||String.fromCharCode(...d.slice(0,6))==="GIF87a"||String.fromCharCode(...d.slice(8,12))==="WEBP")?new Blob([d],{type:l}):e}catch{return e}}function jl(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length,o=(n>0&&e.value[n-1]!==`
52
52
  `?`
53
53
  `:"")+t+`
54
- `;e.value=e.value.slice(0,n)+o+e.value.slice(s),e.selectionStart=e.selectionEnd=n+o.length,e.dispatchEvent(new Event("input"))}function Ma(e){return e?e.type&&e.type.startsWith("image/")?!0:/\.(png|jpe?g|gif|webp|bmp|svg|heic|heif|avif)$/i.test(e.name||""):!1}function Ll(e,t){let n=e?.name||t.split("/").pop()||"file";if(Ma(e)){ms+=1;let a=`img${ms}`;return{ref:`![${a}](${t})`,label:a,kind:"image"}}ms+=1;let s=`file${ms}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function xs(){for(let e of ft)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}ft.length=0,Ia()}function fn(){xs()}function Ia(){let e=i("chat-attach-bar");if(e){if(!ft.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=ft.map((t,n)=>`
54
+ `;e.value=e.value.slice(0,n)+o+e.value.slice(s),e.selectionStart=e.selectionEnd=n+o.length,e.dispatchEvent(new Event("input"))}function Ia(e){return e?e.type&&e.type.startsWith("image/")?!0:/\.(png|jpe?g|gif|webp|bmp|svg|heic|heif|avif)$/i.test(e.name||""):!1}function Dl(e,t){let n=e?.name||t.split("/").pop()||"file";if(Ia(e)){ms+=1;let a=`img${ms}`;return{ref:`![${a}](${t})`,label:a,kind:"image"}}ms+=1;let s=`file${ms}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function xs(){for(let e of ft)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}ft.length=0,Ca()}function mn(){xs()}function Ca(){let e=r("chat-attach-bar");if(e){if(!ft.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=ft.map((t,n)=>`
55
55
  <div class="chat-thumb relative" title="${p(t.ref||t.path)}">
56
56
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
57
57
  <span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
58
58
  <button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
59
- </div>`).join("")}}async function El(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await gi(e,t),s=await kl(n,t),{ref:a,label:o,kind:r}=Ll(e,s),d="";if(r==="image")try{d=URL.createObjectURL(n)}catch{}return ft.push({path:s,ref:a,label:o,kind:r,name:t,previewUrl:d}),Ia(),Sl(i("chat-input"),a),s}async function ks(e){let t=[...e||[]].filter(Boolean);if(!t.length)return;let n=i("chat-input");n&&(n.disabled=!0);try{for(let s of t)try{await El(s)}catch(a){L(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function Tl(){let e=i("chat-file-input");if(e){e.value="",e.click();return}let t=document.createElement("input");t.type="file",t.accept="image/*,*/*",t.multiple=!0,t.addEventListener("change",()=>ks(t.files)),t.click()}function xi(){document.addEventListener("paste",async e=>{let t=i("chat-input");if(!t)return;let n=i("chat-composer");if(!(n&&(n.contains(document.activeElement)||document.activeElement===t))&&document.activeElement!==t)return;let a=[...e.clipboardData?.items||[]],o=[];for(let l of a)if(l.kind==="file"){let c=l.getAsFile();c&&o.push(c)}let r=o.filter(l=>Ma(l)),d=r.length?r:o;d.length&&(e.preventDefault(),await ks(d))}),!oi&&(oi=!0,document.addEventListener("dragover",e=>{let t=i("chat-composer");!t||!e.dataTransfer?.types?.includes("Files")||!t.contains(e.target)&&e.target!==t||(e.preventDefault(),t.classList.add("chat-drop-active"))}),document.addEventListener("dragleave",e=>{let t=i("chat-composer");t&&(e.target===t||t.contains(e.target))&&(t.contains(e.relatedTarget)||t.classList.remove("chat-drop-active"))}),document.addEventListener("drop",async e=>{let t=i("chat-composer");if(!t||(t.classList.remove("chat-drop-active"),!t.contains(e.target)&&e.target!==t))return;let n=[...e.dataTransfer?.files||[]];n.length&&(e.preventDefault(),await ks(n))}))}function Ze(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Ca(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
59
+ </div>`).join("")}}async function Nl(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await ki(e,t),s=await Cl(n,t),{ref:a,label:o,kind:i}=Dl(e,s),d="";if(i==="image")try{d=URL.createObjectURL(n)}catch{}return ft.push({path:s,ref:a,label:o,kind:i,name:t,previewUrl:d}),Ca(),jl(r("chat-input"),a),s}async function ks(e){let t=[...e||[]].filter(Boolean);if(!t.length)return;let n=r("chat-input");n&&(n.disabled=!0);try{for(let s of t)try{await Nl(s)}catch(a){L(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function _l(){let e=r("chat-file-input");if(e){e.value="",e.click();return}let t=document.createElement("input");t.type="file",t.accept="image/*,*/*",t.multiple=!0,t.addEventListener("change",()=>ks(t.files)),t.click()}function $i(){document.addEventListener("paste",async e=>{let t=r("chat-input");if(!t)return;let n=r("chat-composer");if(!(n&&(n.contains(document.activeElement)||document.activeElement===t))&&document.activeElement!==t)return;let a=[...e.clipboardData?.items||[]],o=[];for(let l of a)if(l.kind==="file"){let c=l.getAsFile();c&&o.push(c)}let i=o.filter(l=>Ia(l)),d=i.length?i:o;d.length&&(e.preventDefault(),await ks(d))}),!di&&(di=!0,document.addEventListener("dragover",e=>{let t=r("chat-composer");!t||!e.dataTransfer?.types?.includes("Files")||!t.contains(e.target)&&e.target!==t||(e.preventDefault(),t.classList.add("chat-drop-active"))}),document.addEventListener("dragleave",e=>{let t=r("chat-composer");t&&(e.target===t||t.contains(e.target))&&(t.contains(e.relatedTarget)||t.classList.remove("chat-drop-active"))}),document.addEventListener("drop",async e=>{let t=r("chat-composer");if(!t||(t.classList.remove("chat-drop-active"),!t.contains(e.target)&&e.target!==t))return;let n=[...e.dataTransfer?.files||[]];n.length&&(e.preventDefault(),await ks(n))}))}function Ze(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Aa(e){let t=r("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
60
60
  <span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
61
- </div>`),Me(t))}function ln(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Ze(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ze(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ze(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,l=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",c=s?` \xB7 \u03A3${Ze(s)}`:"";Ca(`\u2191${Ze(t)} \u2193${Ze(n)}${a}${o}${r}${c}${l}`)}function Aa(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${Ze(t)} / ${Ze(n)}`):t!=null&&a.push(`context ${Ze(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),Ca(`\u25A3 ${a.join(" \xB7 ")}`)}function mn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML=""),t&&(t.innerHTML=""),f.shellBubble=null,Ue=null,We=Te=null,ut=Ge=null}function Ml(e){let t=i("messages");if(!t)return null;let n=e==="shell-err"?" text-error":"";return t.insertAdjacentHTML("beforeend",`<div class="mx-2 rounded-lg code-surface px-3 py-2 text-sm font-mono${n} whitespace-pre-wrap break-words"></div>`),Me(t),t.lastElementChild}function Il(e,t){e&&(e.textContent+=t,Me(e.closest("#messages")))}function Cl(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,Ve.peek()==="full"?120:80);return{inputStr:t,preview:s}}function ii(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=Cl(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
61
+ </div>`),Me(t))}function cn(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Ze(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ze(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",i=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ze(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,l=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",c=s?` \xB7 \u03A3${Ze(s)}`:"";Aa(`\u2191${Ze(t)} \u2193${Ze(n)}${a}${o}${i}${c}${l}`)}function ja(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${Ze(t)} / ${Ze(n)}`):t!=null&&a.push(`context ${Ze(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),Aa(`\u25A3 ${a.join(" \xB7 ")}`)}function hn(){let e=r("messages"),t=r("permission-requests");e&&(e.innerHTML=""),t&&(t.innerHTML=""),f.shellBubble=null,We=null,Ge=Te=null,ut=ze=null}function Pl(e){let t=r("messages");if(!t)return null;let n=e==="shell-err"?" text-error":"";return t.insertAdjacentHTML("beforeend",`<div class="mx-2 rounded-lg code-surface px-3 py-2 text-sm font-mono${n} whitespace-pre-wrap break-words"></div>`),Me(t),t.lastElementChild}function Hl(e,t){e&&(e.textContent+=t,Me(e.closest("#messages")))}function Rl(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,Qe.peek()==="full"?120:80);return{inputStr:t,preview:s}}function ui(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=Rl(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
62
62
  <div class="flex items-center gap-1.5 text-xs font-mono">
63
63
  <span class="text-warning">\u26A1</span>
64
64
  <span class="text-warning font-semibold">${p(e.name||"tool")}</span>
@@ -66,21 +66,21 @@ Available: ${l}`:""}`),!0}let a=ml[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe
66
66
  <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
67
67
  </div>
68
68
  <div class="tool-detail">${p(n)}</div>
69
- </div>`}function Al(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
69
+ </div>`}function Ol(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
70
70
  <span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
71
71
  <span class="text-base-content/40 truncate flex-1">${p(n)}</span>
72
- <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function De(){Ue=null}function ja(e,t={}){let n=i("messages");if(!n)return;let s=Ve.peek()||"normal",a=q(t.ts);if(s==="clean"){if(!Ue||!n.contains(Ue.el)){let l=ys(a),c=ws(a);n.insertAdjacentHTML("beforeend",`
72
+ <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function Ne(){We=null}function Da(e,t={}){let n=r("messages");if(!n)return;let s=Qe.peek()||"normal",a=q(t.ts);if(s==="clean"){if(!We||!n.contains(We.el)){let l=ys(a),c=ws(a);n.insertAdjacentHTML("beforeend",`
73
73
  <div class="msg-row assistant px-2" data-ts="${p(c)}">
74
74
  <div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
75
75
  <div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
76
76
  <div class="tool-batch-list"></div>
77
77
  </div>
78
78
  ${l?`<div class="msg-ts" title="${p(c)}">${p(l)}</div>`:""}
79
- </div>`),Ue={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ue.names.push(e.name||"tool"),Ue.count++,Ue.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",ii(e,{inBatch:!0})),Al(Ue),Me(n);return}Ue=null;let o=ys(a),r=ws(a);n.insertAdjacentHTML("beforeend",`
80
- <div class="msg-row assistant px-2" data-ts="${p(r)}">
81
- <div class="w-full max-w-[96%]">${ii(e)}</div>
82
- ${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
83
- </div>`),Me(n)}function $s(){let e=i("messages");e&&e.setAttribute("data-density",Ve.peek()||"normal")}function jl(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
79
+ </div>`),We={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}We.names.push(e.name||"tool"),We.count++,We.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",ui(e,{inBatch:!0})),Ol(We),Me(n);return}We=null;let o=ys(a),i=ws(a);n.insertAdjacentHTML("beforeend",`
80
+ <div class="msg-row assistant px-2" data-ts="${p(i)}">
81
+ <div class="w-full max-w-[96%]">${ui(e)}</div>
82
+ ${o?`<div class="msg-ts" title="${p(i)}">${p(o)}</div>`:""}
83
+ </div>`),Me(n)}function $s(){let e=r("messages");e&&e.setAttribute("data-density",Qe.peek()||"normal")}function Bl(e){let t=e.request_id||e.requestId;if(!t||r(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";r("permission-requests")?.insertAdjacentHTML("beforeend",`
84
84
  <div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
85
85
  <div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
86
86
  <div class="font-mono text-xs text-base-content/60 break-all mb-2">
@@ -90,16 +90,16 @@ Available: ${l}`:""}`),!0}let a=ml[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe
90
90
  <button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
91
91
  <button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
92
92
  </div>
93
- </div>`),i("messages").scrollTop=999999}function Dl(){if(ri||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
93
+ </div>`),r("messages").scrollTop=999999}function ql(){if(pi||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",i=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
94
94
  <div class="code-block-header">
95
- <span class="code-block-lang">${p(r)}</span>
95
+ <span class="code-block-lang">${p(i)}</span>
96
96
  <button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
97
97
  </div>
98
98
  <pre><code class="hljs ${d}">${e(s)}</code></pre>
99
- </div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}ri=!0}function vs(e){if(typeof marked>"u")return p(e);try{return Dl(),marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{return p(e)}}function Nl(e){!e||typeof hljs>"u"||(e.querySelectorAll("pre code:not(.hljs)").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),e.querySelectorAll("pre code.hljs").forEach(t=>{t.classList.add("hljs")}))}function vi(e){Nl(e),ps(e)}function yi(){$s(),zo(),Le(ze,s=>{Rn(),pt();let a=i("ws-banner"),o=i("ws-banner-text");if(!a)return;if(s==="open"||s==="idle"){a.classList.add("hidden"),o&&(o.textContent="");return}if(s==="connecting"&&!bs){a.classList.add("hidden");return}a.classList.remove("hidden");let r=s==="offline"?"\u7F51\u7EDC\u5DF2\u65AD\u5F00\uFF0C\u6062\u590D\u540E\u4F1A\u81EA\u52A8\u91CD\u8FDE":s==="connecting"?"\u6B63\u5728\u8FDE\u63A5\u2026":"\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8FDE\u2026\uFF08\u7184\u5C4F\u6216\u5207\u7F51\u65F6\u5E38\u89C1\uFF09";o?o.textContent=r:a.textContent=r}),Le(E,()=>pt()),g.on("click","#btn-refresh-conn, #ws-banner-retry",s=>{s.preventDefault(),ul()}),Le(he,s=>{i("send-btn")?.classList.toggle("hidden",s),i("stop-btn")?.classList.toggle("hidden",!s);let a=i("chat-input");a&&(a.disabled=!1,s?a.placeholder="\u56DE\u590D\u4E2D\u2026 \u53EF\u5148\u5199\u597D\u4E0B\u4E00\u6761\uFF0C\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001 \xB7 \u6216\u70B9 \u25A0 \u505C\u6B62":on(a.value||""));let o=i("messages");if(!o)return;let r=i("typing-indicator");s&&!r?(o.insertAdjacentHTML("beforeend",'<div id="typing-indicator" class="flex justify-start px-2"><div class="flex items-center gap-1.5 rounded-2xl rounded-tl-sm px-3 py-2 bg-base-200 text-xs text-base-content/40"><span class="dot"></span><span class="dot"></span><span class="dot"></span></div></div>'),Me(o)):s||(r?.remove(),De()),pt()}),Le(Ve,()=>$s()),g.on("keydown","#chat-input",s=>{if(s.key!=="Enter")return;let a=s.metaKey||s.ctrlKey,o=window.matchMedia("(max-width: 640px)").matches&&!s.shiftKey&&!a;(a||o)&&(s.preventDefault(),On())}),g.on("submit","#chat-form",s=>{s.preventDefault(),On()}),g.on("input","#chat-input",(s,a)=>{rn(a),on(a.value)}),g.on("click","#btn-attach",s=>{s.preventDefault(),Tl()}),g.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&ks(o),a&&(a.value="")}),g.on("click","[data-rm-attach]",(s,a)=>{s.preventDefault(),s.stopPropagation();let o=parseInt(a.dataset.rmAttach,10);if(Number.isNaN(o)||o<0||o>=ft.length)return;let r=ft[o];if(r?.previewUrl)try{URL.revokeObjectURL(r.previewUrl)}catch{}let d=i("chat-input");d&&r?.ref&&(d.value=d.value.split(r.ref).join("").replace(/\n{3,}/g,`
99
+ </div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}pi=!0}function vs(e){if(typeof marked>"u")return p(e);try{return ql(),marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{return p(e)}}function Fl(e){!e||typeof hljs>"u"||(e.querySelectorAll("pre code:not(.hljs)").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),e.querySelectorAll("pre code.hljs").forEach(t=>{t.classList.add("hljs")}))}function Si(e){Fl(e),ii(e),fs(e)}function Li(){$s(),Jo(),Le(Ke,s=>{On(),pt();let a=r("ws-banner"),o=r("ws-banner-text");if(!a)return;if(s==="open"||s==="idle"){a.classList.add("hidden"),o&&(o.textContent="");return}if(s==="connecting"&&!bs){a.classList.add("hidden");return}a.classList.remove("hidden");let i=s==="offline"?"\u7F51\u7EDC\u5DF2\u65AD\u5F00\uFF0C\u6062\u590D\u540E\u4F1A\u81EA\u52A8\u91CD\u8FDE":s==="connecting"?"\u6B63\u5728\u8FDE\u63A5\u2026":"\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8FDE\u2026\uFF08\u7184\u5C4F\u6216\u5207\u7F51\u65F6\u5E38\u89C1\uFF09";o?o.textContent=i:a.textContent=i}),Le(E,()=>pt()),g.on("click","#ws-banner-retry",s=>{s.preventDefault(),vl()}),Le(he,s=>{r("send-btn")?.classList.toggle("hidden",s),r("stop-btn")?.classList.toggle("hidden",!s);let a=r("chat-input");a&&(a.disabled=!1,s?a.placeholder="\u56DE\u590D\u4E2D\u2026 \u53EF\u5148\u5199\u597D\u4E0B\u4E00\u6761\uFF0C\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001 \xB7 \u6216\u70B9 \u25A0 \u505C\u6B62":rn(a.value||""));let o=r("messages");if(!o)return;let i=r("typing-indicator");s&&!i?(o.insertAdjacentHTML("beforeend",'<div id="typing-indicator" class="flex justify-start px-2"><div class="flex items-center gap-1.5 rounded-2xl rounded-tl-sm px-3 py-2 bg-base-200 text-xs text-base-content/40"><span class="dot"></span><span class="dot"></span><span class="dot"></span></div></div>'),Me(o)):s||(i?.remove(),Ne()),pt()}),Le(Qe,()=>$s()),g.on("keydown","#chat-input",s=>{if(s.key!=="Enter")return;let a=s.metaKey||s.ctrlKey,o=window.matchMedia("(max-width: 640px)").matches&&!s.shiftKey&&!a;(a||o)&&(s.preventDefault(),Bn())}),g.on("submit","#chat-form",s=>{s.preventDefault(),Bn()}),g.on("input","#chat-input",(s,a)=>{ln(a),rn(a.value)}),g.on("click","#btn-attach",s=>{s.preventDefault(),_l()}),g.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&ks(o),a&&(a.value="")}),g.on("click","[data-rm-attach]",(s,a)=>{s.preventDefault(),s.stopPropagation();let o=parseInt(a.dataset.rmAttach,10);if(Number.isNaN(o)||o<0||o>=ft.length)return;let i=ft[o];if(i?.previewUrl)try{URL.revokeObjectURL(i.previewUrl)}catch{}let d=r("chat-input");d&&i?.ref&&(d.value=d.value.split(i.ref).join("").replace(/\n{3,}/g,`
100
100
 
101
- `),d.dispatchEvent(new Event("input"))),ft.splice(o,1),Ia()}),g.on("click","[data-perm-id]",(s,a)=>{Vt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:f.sessionId}),a.closest(".perm-banner")?.remove()}),g.on("click",".tool-card",(s,a)=>{let o=a.closest(".tool-batch");if(o&&!o.classList.contains("open")&&!a.classList.contains("tool-batch-item"))return;s.stopPropagation();let r=i("messages"),d=a.getBoundingClientRect().top;if(a.classList.toggle("open"),r){let l=a.getBoundingClientRect().top;r.scrollTop+=l-d}}),g.on("click",".tool-batch",(s,a)=>{if(s.target.closest(".tool-card")&&a.classList.contains("open"))return;let o=i("messages"),r=a.getBoundingClientRect().top;if(a.classList.toggle("open"),o){let d=a.getBoundingClientRect().top;o.scrollTop+=d-r}});let e=i("messages"),t=i("scroll-top-btn"),n=i("scroll-bottom-btn");if(e&&t&&n){let s=()=>{let a=e.scrollHeight-e.clientHeight>200;t.classList.toggle("hidden",!a||e.scrollTop<200),n.classList.toggle("hidden",!a||li(e))};e.addEventListener("scroll",s,{passive:!0}),new ResizeObserver(s).observe(e),new MutationObserver(s).observe(e,{childList:!0,subtree:!0}),t.addEventListener("click",()=>e.scrollTo({top:0,behavior:"smooth"})),n.addEventListener("click",()=>e.scrollTo({top:e.scrollHeight,behavior:"smooth"})),s()}g.on("click",".msg-expand-btn",(s,a)=>{s.stopPropagation();let r=a.closest(".msg-card").classList.toggle("open");a.textContent=r?"\u25B2 Show less":"\u25BC Show more"}),g.on("click",".code-copy",async(s,a)=>{s.preventDefault(),s.stopPropagation();let d=a.closest(".code-block")?.querySelector("pre code")?.textContent??"";try{await navigator.clipboard.writeText(d),a.textContent="Copied",a.classList.add("copied"),setTimeout(()=>{a.textContent="Copy",a.classList.remove("copied")},1400)}catch{a.textContent="Failed",setTimeout(()=>{a.textContent="Copy"},1400)}})}var _n,tt,Ke,et,hs,si,bs,ai,gs,Ta,nt,Ct,We,Te,ut,Ge,ml,xl,vl,ft,ms,oi,Ue,ri,hn=K(()=>{R();B();ue();Jo();La();Ea();an();an();_n=0,tt=null,Ke=1e3,et=0,hs=null,si=!1,bs=!1,ai=null,gs=!1,Ta="hubStreamCursors",nt=[],Ct=new Map;We=null,Te=null,ut=null,Ge=null;ml={haiku:"claude-haiku-4-5",sonnet:"claude-sonnet-4-6",opus:"claude-opus-4-5",sonnet4:"claude-sonnet-4-6",haiku4:"claude-haiku-4-5"};xl=200,vl=500;ft=[],ms=0,oi=!1;Ue=null;ri=!1});function ki(e,t){wi=e,Da=t,window.addEventListener("hashchange",()=>{if(Na){Na=!1;return}Si(location.hash.slice(1)||"/")}),Le(U,n=>{f.sessionId&&Bn()})}function _a(e){let[t,n=""]=String(e||"").split("?",2),s=t.match(/^\/session\/([^/]+)(?:\/([^/]+))?$/);if(!s)return null;let a=new URLSearchParams(n);try{return{id:decodeURIComponent(s[1]),tab:s[2]?decodeURIComponent(s[2]):null,machineId:a.get("machine")||null,agent:a.get("agent")||null}}catch{return null}}function $i(){Si(location.hash.slice(1)||"/")}function Si(e){let t=_a(e);if(!t){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:n,tab:s,machineId:a,agent:o}=t;!wi||!Da||(n!==f.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:n,tab:s,machineId:a,agent:o}})):s&&s!==U.peek()&&Da(s))}function Pa(e){Na=!0,location.hash=e}function Bn(){if(!f.sessionId)return;let e=new URLSearchParams;f.machineId&&e.set("machine",f.machineId),f.agent&&e.set("agent",f.agent);let t=e.size?`?${e}`:"";Pa(`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(U.peek())}${t}`)}function Li(){if(!f.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;f.machineId&&t.set("machine",f.machineId),f.agent&&t.set("agent",f.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(U.peek())}${n}`,e.toString()}var ud,wi,Da,Na,Ss=K(()=>{R();B();ud=ko({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),wi=null,Da=null,Na=!1});async function Es(){try{return await Ls.get("sessions")??null}catch{return null}}async function Ei(e){try{await Ls.set("sessions",e,{ttl:_l})}catch{}}async function Ti(){try{return await Ls.get("workspaces")??null}catch{return null}}async function qn(e){try{await Ls.set("workspaces",e,{ttl:3600*1e3})}catch{}}var Ls,_l,Ts=K(()=>{R();Ls=So("claude-ui"),_l=300*1e3});function xn(e){if(typeof marked<"u")try{return marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{}return p(e).replace(/\n/g,"<br>")}function vn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),ps(e))}async function Ba(e,t,n){let s=dt({"Content-Type":"application/json"}),a=await fetch(e,{method:"POST",headers:s,body:JSON.stringify(t||{})});if(!a.ok){let c=await a.json().catch(()=>({}));throw new Error(c.error||`HTTP ${a.status}`)}let o=a.body.getReader(),r=new TextDecoder,d="",l="message";for(;;){let{done:c,value:u}=await o.read();if(c)break;d+=r.decode(u,{stream:!0});let h=d.split(`
102
- `);d=h.pop()||"";for(let x of h)if(x.startsWith("event:"))l=x.slice(6).trim();else if(x.startsWith("data:")){let v=x.slice(5).trim();if(!v)continue;let C;try{C=JSON.parse(v)}catch{continue}n[l]?.(C),n.any?.(l,C),l="message"}else x.trim()===""&&(l="message")}}function Ol(){return`
101
+ `),d.dispatchEvent(new Event("input"))),ft.splice(o,1),Ca()}),g.on("click","[data-perm-id]",(s,a)=>{Qt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:f.sessionId}),a.closest(".perm-banner")?.remove()}),g.on("click",".tool-card",(s,a)=>{let o=a.closest(".tool-batch");if(o&&!o.classList.contains("open")&&!a.classList.contains("tool-batch-item"))return;s.stopPropagation();let i=r("messages"),d=a.getBoundingClientRect().top;if(a.classList.toggle("open"),i){let l=a.getBoundingClientRect().top;i.scrollTop+=l-d}}),g.on("click",".tool-batch",(s,a)=>{if(s.target.closest(".tool-card")&&a.classList.contains("open"))return;let o=r("messages"),i=a.getBoundingClientRect().top;if(a.classList.toggle("open"),o){let d=a.getBoundingClientRect().top;o.scrollTop+=d-i}});let e=r("messages"),t=r("scroll-top-btn"),n=r("scroll-bottom-btn");if(e&&t&&n){let s=()=>{let a=e.scrollHeight-e.clientHeight>200;t.classList.toggle("hidden",!a||e.scrollTop<200),n.classList.toggle("hidden",!a||fi(e))};e.addEventListener("scroll",s,{passive:!0}),new ResizeObserver(s).observe(e),new MutationObserver(s).observe(e,{childList:!0,subtree:!0}),t.addEventListener("click",()=>e.scrollTo({top:0,behavior:"smooth"})),n.addEventListener("click",()=>e.scrollTo({top:e.scrollHeight,behavior:"smooth"})),s()}g.on("click",".msg-expand-btn",(s,a)=>{s.stopPropagation();let i=a.closest(".msg-card").classList.toggle("open");a.textContent=i?"\u25B2 Show less":"\u25BC Show more"}),g.on("click",".code-copy",async(s,a)=>{s.preventDefault(),s.stopPropagation();let d=a.closest(".code-block")?.querySelector("pre code")?.textContent??"";try{await navigator.clipboard.writeText(d),a.textContent="Copied",a.classList.add("copied"),setTimeout(()=>{a.textContent="Copy",a.classList.remove("copied")},1400)}catch{a.textContent="Failed",setTimeout(()=>{a.textContent="Copy"},1400)}})}var Pn,tt,De,et,hs,li,bs,ci,gs,Ma,nt,Ct,Ge,Te,ut,ze,kl,El,Tl,ft,ms,di,We,pi,bn=U(()=>{R();B();ue();Vo();La();Ea();ri();an();an();Pn=0,tt=null,De=1e3,et=0,hs=null,li=!1,bs=!1,ci=null,gs=!1,Ma="hubStreamCursors",nt=[],Ct=new Map;Ge=null,Te=null,ut=null,ze=null;kl={haiku:"claude-haiku-4-5",sonnet:"claude-sonnet-4-6",opus:"claude-opus-4-5",sonnet4:"claude-sonnet-4-6",haiku4:"claude-haiku-4-5"};El=200,Tl=500;ft=[],ms=0,di=!1;We=null;pi=!1});function Ti(e,t){Ei=e,Na=t,window.addEventListener("hashchange",()=>{if(_a){_a=!1;return}Ii(location.hash.slice(1)||"/")}),Le(W,n=>{f.sessionId&&qn()})}function Pa(e){let[t,n=""]=String(e||"").split("?",2),s=t.match(/^\/session\/([^/]+)(?:\/([^/]+))?$/);if(!s)return null;let a=new URLSearchParams(n);try{return{id:decodeURIComponent(s[1]),tab:s[2]?decodeURIComponent(s[2]):null,machineId:a.get("machine")||null,agent:a.get("agent")||null}}catch{return null}}function Mi(){Ii(location.hash.slice(1)||"/")}function Ii(e){let t=Pa(e);if(!t){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:n,tab:s,machineId:a,agent:o}=t;!Ei||!Na||(n!==f.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:n,tab:s,machineId:a,agent:o}})):s&&s!==W.peek()&&Na(s))}function Ha(e){_a=!0,location.hash=e}function qn(){if(!f.sessionId)return;let e=new URLSearchParams;f.machineId&&e.set("machine",f.machineId),f.agent&&e.set("agent",f.agent);let t=e.size?`?${e}`:"";Ha(`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(W.peek())}${t}`)}function Ci(){if(!f.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;f.machineId&&t.set("machine",f.machineId),f.agent&&t.set("agent",f.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(W.peek())}${n}`,e.toString()}var wd,Ei,Na,_a,Ss=U(()=>{R();B();wd=$o({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),Ei=null,Na=null,_a=!1});async function Es(){try{return await Ls.get("sessions")??null}catch{return null}}async function Ai(e){try{await Ls.set("sessions",e,{ttl:Ul})}catch{}}async function ji(){try{return await Ls.get("workspaces")??null}catch{return null}}async function Fn(e){try{await Ls.set("workspaces",e,{ttl:3600*1e3})}catch{}}var Ls,Ul,Ts=U(()=>{R();Ls=Lo("claude-ui"),Ul=300*1e3});function vn(e){if(typeof marked<"u")try{return marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{}return p(e).replace(/\n/g,"<br>")}function yn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),fs(e))}async function qa(e,t,n){let s=dt({"Content-Type":"application/json"}),a=await fetch(e,{method:"POST",headers:s,body:JSON.stringify(t||{})});if(!a.ok){let c=await a.json().catch(()=>({}));throw new Error(c.error||`HTTP ${a.status}`)}let o=a.body.getReader(),i=new TextDecoder,d="",l="message";for(;;){let{done:c,value:u}=await o.read();if(c)break;d+=i.decode(u,{stream:!0});let h=d.split(`
102
+ `);d=h.pop()||"";for(let x of h)if(x.startsWith("event:"))l=x.slice(6).trim();else if(x.startsWith("data:")){let v=x.slice(5).trim();if(!v)continue;let C;try{C=JSON.parse(v)}catch{continue}n[l]?.(C),n.any?.(l,C),l="message"}else x.trim()===""&&(l="message")}}function Kl(){return`
103
103
  <div id="meta-agent-panel" class="meta-agent-panel hidden" aria-hidden="true">
104
104
  <div class="meta-agent-backdrop" data-ma-close="1"></div>
105
105
  <div class="meta-agent-sheet">
@@ -279,68 +279,68 @@ Available: ${l}`:""}`),!0}let a=ml[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe
279
279
  </div>
280
280
  </div>
281
281
  </div>
282
- </div>`}function ye(e){ht=e;let t=i("ma-mode-chat"),n=i("ma-mode-history"),s=i("ma-mode-notes"),a=i("ma-mode-report"),o=i("ma-mode-config");for(let[d,l]of[[t,"chat"],[n,"history"],[s,"notes"],[a,"report"],[o,"config"]]){if(!d)continue;let c=e===l;d.classList.toggle("hidden",!c),d.classList.toggle("flex",c)}let r=(d,l)=>{let c=i(d);c&&(c.classList.toggle("border-primary/40",l),c.classList.toggle("text-primary",l))};r("ma-btn-chat",e==="chat"),r("ma-btn-history",e==="history"),r("ma-btn-notes",e==="notes"),r("ma-btn-report",e==="report"),e==="history"&&_t(),e==="notes"&&Dt()}function Un(){let e=i("ma-session-title"),t=i("ma-resume-bar"),n=i("ma-resume-text");if(!pe){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let s=Se?.title||pe.slice(0,8),a=Ns(Se?.updatedAt);if(e&&(e.textContent=a?`${s} \xB7 ${a}`:s),t&&n){t.classList.remove("hidden");let o=Se?.messageCount;n.textContent=o?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${o} \u6761\u6D88\u606F \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED`:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED"}}function qa(e="chat"){let t=i("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),Ds=!0,ye(e),e==="chat"){at();let n=localStorage.getItem(bt);!pe&&n?ot(n,{silent:!0}).catch(()=>{localStorage.removeItem(bt)}):Un()}e==="history"&&at().then(()=>_t()),e==="report"&&qi(),e==="config"&&Fi(),setTimeout(()=>{ht==="chat"&&i("ma-input")?.focus(),ht==="history"&&i("ma-history-search")?.focus()},50)}}function Pi(){let e=i("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),Ds=!1)}function Hi(){Ds?Pi():qa(ht==="config"?"chat":ht)}function Z(e,t,n={}){let s=i("ma-messages");if(!s)return null;let a=document.createElement("div");return a.className=`ma-msg ma-msg-${e}`,e==="user"?a.innerHTML=`<div class="ma-bubble user">${p(t)}</div>`:e==="assistant"?(a.innerHTML=`<div class="ma-bubble assistant md">${xn(t)}</div>`,vn(a)):e==="error"?a.innerHTML=`<div class="ma-bubble error">${p(t)}</div>`:e==="system"?a.innerHTML=`<div class="ma-sys">${p(t)}</div>`:e==="tool"&&(a.innerHTML=`<div class="ma-tool" data-tool-id="${p(n.id||"")}">
282
+ </div>`}function ye(e){ht=e;let t=r("ma-mode-chat"),n=r("ma-mode-history"),s=r("ma-mode-notes"),a=r("ma-mode-report"),o=r("ma-mode-config");for(let[d,l]of[[t,"chat"],[n,"history"],[s,"notes"],[a,"report"],[o,"config"]]){if(!d)continue;let c=e===l;d.classList.toggle("hidden",!c),d.classList.toggle("flex",c)}let i=(d,l)=>{let c=r(d);c&&(c.classList.toggle("border-primary/40",l),c.classList.toggle("text-primary",l))};i("ma-btn-chat",e==="chat"),i("ma-btn-history",e==="history"),i("ma-btn-notes",e==="notes"),i("ma-btn-report",e==="report"),e==="history"&&_t(),e==="notes"&&Dt()}function Wn(){let e=r("ma-session-title"),t=r("ma-resume-bar"),n=r("ma-resume-text");if(!pe){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let s=Se?.title||pe.slice(0,8),a=Ns(Se?.updatedAt);if(e&&(e.textContent=a?`${s} \xB7 ${a}`:s),t&&n){t.classList.remove("hidden");let o=Se?.messageCount;n.textContent=o?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${o} \u6761\u6D88\u606F \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED`:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED"}}function Fa(e="chat"){let t=r("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),Ds=!0,ye(e),e==="chat"){at();let n=localStorage.getItem(bt);!pe&&n?ot(n,{silent:!0}).catch(()=>{localStorage.removeItem(bt)}):Wn()}e==="history"&&at().then(()=>_t()),e==="report"&&zi(),e==="config"&&Ki(),setTimeout(()=>{ht==="chat"&&r("ma-input")?.focus(),ht==="history"&&r("ma-history-search")?.focus()},50)}}function qi(){let e=r("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),Ds=!1)}function Fi(){Ds?qi():Fa(ht==="config"?"chat":ht)}function Z(e,t,n={}){let s=r("ma-messages");if(!s)return null;let a=document.createElement("div");return a.className=`ma-msg ma-msg-${e}`,e==="user"?a.innerHTML=`<div class="ma-bubble user">${p(t)}</div>`:e==="assistant"?(a.innerHTML=`<div class="ma-bubble assistant md">${vn(t)}</div>`,yn(a)):e==="error"?a.innerHTML=`<div class="ma-bubble error">${p(t)}</div>`:e==="system"?a.innerHTML=`<div class="ma-sys">${p(t)}</div>`:e==="tool"&&(a.innerHTML=`<div class="ma-tool" data-tool-id="${p(n.id||"")}">
283
283
  <span class="ma-tool-name">${p(n.name||"tool")}</span>
284
284
  <span class="ma-tool-phase">${p(n.phase||"")}</span>
285
285
  <pre class="ma-tool-args">${p(JSON.stringify(n.args||{},null,0).slice(0,200))}</pre>
286
- </div>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ci(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=xn(t),vn(n),i("ma-messages").scrollTop=i("ma-messages").scrollHeight)}function Ri(e,t,n){let s=i("ma-messages");if(!s)return;let a=s.querySelector(`[data-tool-id="${CSS.escape(e)}"]`);if(!a)return;a.classList.toggle("done",t==="done"),a.classList.toggle("error",t==="error");let o=a.querySelector(".ma-tool-phase");if(o&&(o.textContent=t),n&&t!=="start"){let r=a.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",a.appendChild(r)),r.textContent=JSON.stringify(n,null,0).slice(0,500)}}function Bl(e){let t=i("ma-messages");if(!t)return;let n=document.createElement("div");n.className="ma-approval",n.dataset.approvalId=e.id;let s=e.args?.command??"";n.innerHTML=`
286
+ </div>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function _i(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=vn(t),yn(n),r("ma-messages").scrollTop=r("ma-messages").scrollHeight)}function Ui(e,t,n){let s=r("ma-messages");if(!s)return;let a=s.querySelector(`[data-tool-id="${CSS.escape(e)}"]`);if(!a)return;a.classList.toggle("done",t==="done"),a.classList.toggle("error",t==="error");let o=a.querySelector(".ma-tool-phase");if(o&&(o.textContent=t),n&&t!=="start"){let i=a.querySelector(".ma-tool-result");i||(i=document.createElement("pre"),i.className="ma-tool-result",a.appendChild(i)),i.textContent=JSON.stringify(n,null,0).slice(0,500)}}function Jl(e){let t=r("ma-messages");if(!t)return;let n=document.createElement("div");n.className="ma-approval",n.dataset.approvalId=e.id;let s=e.args?.command??"";n.innerHTML=`
287
287
  <div class="ma-approval-label">\u26A0 Agent \u60F3\u8981\u6267\u884C\u547D\u4EE4\uFF0C\u662F\u5426\u5141\u8BB8\uFF1F</div>
288
288
  <pre class="ma-approval-cmd">${p(s)}</pre>
289
289
  <div class="ma-approval-actions">
290
290
  <button type="button" class="btn btn-xs btn-error" data-approve="0">\u62D2\u7EDD</button>
291
291
  <button type="button" class="btn btn-xs btn-success" data-approve="1">\u5141\u8BB8\u6267\u884C</button>
292
- </div>`,n.querySelectorAll("[data-approve]").forEach(a=>{a.addEventListener("click",async()=>{let o=a.dataset.approve==="1";n.querySelectorAll("button").forEach(r=>{r.disabled=!0}),n.querySelector(".ma-approval-label").textContent=o?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await y("POST","/api/ai/approve",{id:e.id,approved:o})}catch(r){n.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${r.message}`}})}),t.appendChild(n),t.scrollTop=t.scrollHeight}function ql(){return Ii+=1,`img${Ii}`}function Fl(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length;e.value=e.value.slice(0,n)+t+e.value.slice(s),e.selectionStart=e.selectionEnd=n+t.length,e.dispatchEvent(new Event("input"))}async function Ai(e,t){let n=dt({"x-filename":t||`paste-${Date.now()}.png`});delete n["Content-Type"];let s=await fetch("/api/upload-image",{method:"POST",headers:n,body:e});if(!s.ok){let c=await s.json().catch(()=>({}));throw new Error(c.error||`Upload failed: ${s.status}`)}let{path:a}=await s.json();if(!a)throw new Error("upload returned no path");let o=ql(),r=`[${o}](${a})`,d=i("ma-input");Fl(d,(d?.value&&!d.value.endsWith(`
292
+ </div>`,n.querySelectorAll("[data-approve]").forEach(a=>{a.addEventListener("click",async()=>{let o=a.dataset.approve==="1";n.querySelectorAll("button").forEach(i=>{i.disabled=!0}),n.querySelector(".ma-approval-label").textContent=o?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await y("POST","/api/ai/approve",{id:e.id,approved:o})}catch(i){n.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${i.message}`}})}),t.appendChild(n),t.scrollTop=t.scrollHeight}function Vl(){return Ni+=1,`img${Ni}`}function Ql(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length;e.value=e.value.slice(0,n)+t+e.value.slice(s),e.selectionStart=e.selectionEnd=n+t.length,e.dispatchEvent(new Event("input"))}async function Pi(e,t){let n=dt({"x-filename":t||`paste-${Date.now()}.png`});delete n["Content-Type"];let s=await fetch("/api/upload-image",{method:"POST",headers:n,body:e});if(!s.ok){let c=await s.json().catch(()=>({}));throw new Error(c.error||`Upload failed: ${s.status}`)}let{path:a}=await s.json();if(!a)throw new Error("upload returned no path");let o=Vl(),i=`[${o}](${a})`,d=r("ma-input");Ql(d,(d?.value&&!d.value.endsWith(`
293
293
  `)&&d.value.length?`
294
- `:"")+r+`
295
- `);let l="";try{l=URL.createObjectURL(e)}catch{}return jt.push({path:a,previewUrl:l,label:o,ref:r}),Fa(),{path:a,ref:r,label:o}}function Fa(){let e=i("ma-attach-bar");if(e){if(!jt.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=jt.map((t,n)=>`
294
+ `:"")+i+`
295
+ `);let l="";try{l=URL.createObjectURL(e)}catch{}return jt.push({path:a,previewUrl:l,label:o,ref:i}),Ua(),{path:a,ref:i,label:o}}function Ua(){let e=r("ma-attach-bar");if(e){if(!jt.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=jt.map((t,n)=>`
296
296
  <div class="ma-thumb relative" title="${p(t.ref||t.path)}">
297
297
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="ma-thumb-path">${p(t.label||"img")}</span>`}
298
298
  <span class="ma-thumb-label">${p(t.label||"")}</span>
299
299
  <button type="button" class="ma-thumb-x" data-rm-img="${n}">\u2715</button>
300
- </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=jt[n];if(s?.previewUrl)try{URL.revokeObjectURL(s.previewUrl)}catch{}let a=i("ma-input");a&&s?.ref&&(a.value=a.value.split(s.ref).join("").replace(/\n{3,}/g,`
300
+ </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=jt[n];if(s?.previewUrl)try{URL.revokeObjectURL(s.previewUrl)}catch{}let a=r("ma-input");a&&s?.ref&&(a.value=a.value.split(s.ref).join("").replace(/\n{3,}/g,`
301
301
 
302
- `),a.dispatchEvent(new Event("input"))),jt.splice(n,1),Fa()})})}}function Ns(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let n=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0"),a=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0");return`${n}-${s} ${a}:${o}`}async function at(){try{As=(await y("GET","/api/ai/sessions")).sessions||[]}catch{As=[]}return As}function Oi(){let e=E.peek(),t=f.sessionId?`${f.agent||I.peek()||"claude"}:${f.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:f.sessionId||"",agent:f.agent||I.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function Fn(){Nt=null,_i=null,i("ma-note-title").value="",i("ma-note-content").value="",i("ma-note-pin").checked=!1,i("ma-note-link-project").checked=!!E.peek()?.path,i("ma-note-link-session").checked=!!f.sessionId,i("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",i("ma-note-delete").disabled=!0,i("ma-note-links").textContent=Oi().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Bi(e){Nt=e?.id||null,_i=e||null,i("ma-note-title").value=e?.title||"",i("ma-note-content").value=e?.content||"",i("ma-note-pin").checked=!!e?.pinned,i("ma-note-link-project").checked=!!e?.cwd,i("ma-note-link-session").checked=!!e?.sessionId,i("ma-note-status").textContent=e?.updatedAt?`\u4E0A\u6B21\u66F4\u65B0 ${Ns(e.updatedAt)}`:"",i("ma-note-delete").disabled=!e?.id;let t=[];e?.cwd&&t.push(`\u9879\u76EE ${e.cwd.split("/").pop()}`),e?.sessionId&&t.push(`\u4F1A\u8BDD ${e.agent||"claude"}:${e.sessionId.slice(0,8)}`),i("ma-note-links").textContent=t.join(" \xB7 ")||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Ul(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e&&!t){i("ma-note-status").textContent="\u5148\u9009\u4E00\u6761\u8BB0\u4E8B\u6216\u8F93\u5165\u5185\u5BB9";return}let n=[];i("ma-note-link-project")?.checked&&E.peek()?.path&&n.push(`\u9879\u76EE\u8DEF\u5F84\uFF1A${E.peek().path}`),i("ma-note-link-session")?.checked&&f.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${f.agent||I.peek()||"claude"} / ${f.sessionId}`);let s=["\u57FA\u4E8E\u4E0B\u9762\u8FD9\u6761\u5DE5\u4F5C\u8BB0\u4E8B\u56DE\u7B54\uFF0C\u5E76\u7ED3\u5408\u76F8\u5173\u4F1A\u8BDD\u4E0E\u9879\u76EE\u4E0A\u4E0B\u6587\uFF1A",`\u6807\u9898\uFF1A${e||"\u672A\u547D\u540D"}`,t?`\u5185\u5BB9\uFF1A
302
+ `),a.dispatchEvent(new Event("input"))),jt.splice(n,1),Ua()})})}}function Ns(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let n=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0"),a=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0");return`${n}-${s} ${a}:${o}`}async function at(){try{As=(await y("GET","/api/ai/sessions")).sessions||[]}catch{As=[]}return As}function Wi(){let e=E.peek(),t=f.sessionId?`${f.agent||I.peek()||"claude"}:${f.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:f.sessionId||"",agent:f.agent||I.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function Un(){Nt=null,Bi=null,r("ma-note-title").value="",r("ma-note-content").value="",r("ma-note-pin").checked=!1,r("ma-note-link-project").checked=!!E.peek()?.path,r("ma-note-link-session").checked=!!f.sessionId,r("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",r("ma-note-delete").disabled=!0,r("ma-note-links").textContent=Wi().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Gi(e){Nt=e?.id||null,Bi=e||null,r("ma-note-title").value=e?.title||"",r("ma-note-content").value=e?.content||"",r("ma-note-pin").checked=!!e?.pinned,r("ma-note-link-project").checked=!!e?.cwd,r("ma-note-link-session").checked=!!e?.sessionId,r("ma-note-status").textContent=e?.updatedAt?`\u4E0A\u6B21\u66F4\u65B0 ${Ns(e.updatedAt)}`:"",r("ma-note-delete").disabled=!e?.id;let t=[];e?.cwd&&t.push(`\u9879\u76EE ${e.cwd.split("/").pop()}`),e?.sessionId&&t.push(`\u4F1A\u8BDD ${e.agent||"claude"}:${e.sessionId.slice(0,8)}`),r("ma-note-links").textContent=t.join(" \xB7 ")||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Yl(){let e=r("ma-note-title")?.value?.trim()||"",t=r("ma-note-content")?.value?.trim()||"";if(!e&&!t){r("ma-note-status").textContent="\u5148\u9009\u4E00\u6761\u8BB0\u4E8B\u6216\u8F93\u5165\u5185\u5BB9";return}let n=[];r("ma-note-link-project")?.checked&&E.peek()?.path&&n.push(`\u9879\u76EE\u8DEF\u5F84\uFF1A${E.peek().path}`),r("ma-note-link-session")?.checked&&f.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${f.agent||I.peek()||"claude"} / ${f.sessionId}`);let s=["\u57FA\u4E8E\u4E0B\u9762\u8FD9\u6761\u5DE5\u4F5C\u8BB0\u4E8B\u56DE\u7B54\uFF0C\u5E76\u7ED3\u5408\u76F8\u5173\u4F1A\u8BDD\u4E0E\u9879\u76EE\u4E0A\u4E0B\u6587\uFF1A",`\u6807\u9898\uFF1A${e||"\u672A\u547D\u540D"}`,t?`\u5185\u5BB9\uFF1A
303
303
  ${t}`:"",n.length?n.join(`
304
304
  `):"","","\u8BF7\u5148\u603B\u7ED3\u8FD9\u6761\u8BB0\u4E8B\u7684\u6838\u5FC3\uFF0C\u518D\u7ED9\u51FA\u4E0B\u4E00\u6B65\u5EFA\u8BAE\u548C\u53EF\u80FD\u98CE\u9669\u3002"].filter(Boolean).join(`
305
- `);ye("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function gn(){let e=(Ni||"").trim();return js=(await y("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],js}function Dt(){let e=i("ma-notes-list");if(e){if(!js.length){e.innerHTML='<div class="text-center text-xs text-base-content/40 py-10">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002</div>';return}e.innerHTML=js.map(t=>{let n=t.id===Nt,s=[t.scope==="project"?"\u9879\u76EE":t.scope==="session"?"\u4F1A\u8BDD":"\u901A\u7528",t.pinned?"\u7F6E\u9876":""].filter(Boolean).join(" \xB7 ");return`
305
+ `);ye("chat"),r("ma-input").value=s,r("ma-input").dispatchEvent(new Event("input")),r("ma-input").focus()}async function xn(){let e=(Oi||"").trim();return js=(await y("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],js}function Dt(){let e=r("ma-notes-list");if(e){if(!js.length){e.innerHTML='<div class="text-center text-xs text-base-content/40 py-10">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002</div>';return}e.innerHTML=js.map(t=>{let n=t.id===Nt,s=[t.scope==="project"?"\u9879\u76EE":t.scope==="session"?"\u4F1A\u8BDD":"\u901A\u7528",t.pinned?"\u7F6E\u9876":""].filter(Boolean).join(" \xB7 ");return`
306
306
  <button type="button" class="ma-note-item ${n?"active":""}" data-note-id="${p(t.id)}">
307
307
  <div class="text-left">
308
308
  <div class="font-medium text-xs truncate">${p(t.title||"\u672A\u547D\u540D")}</div>
309
309
  <div class="text-[10px] text-base-content/45 mt-0.5 line-clamp-2">${p(t.content||"")}</div>
310
310
  <div class="text-[10px] text-base-content/35 mt-1">${p(s)}${s?" \xB7 ":""}${p(Ns(t.updatedAt)||"")}</div>
311
311
  </div>
312
- </button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await y("GET",`/api/ai/notes/${t.dataset.noteId}`);Bi(n),Dt()}catch(n){i("ma-note-status").textContent=n.message}})})}}async function Wl(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e||!t){i("ma-note-status").textContent="\u6807\u9898\u548C\u5185\u5BB9\u90FD\u4E0D\u80FD\u4E3A\u7A7A";return}let n=Oi(),s={id:Nt||void 0,title:e,content:t,pinned:!!i("ma-note-pin")?.checked,cwd:i("ma-note-link-project")?.checked?n.project:"",sessionId:i("ma-note-link-session")?.checked?n.sessionId:"",agent:i("ma-note-link-session")?.checked?n.agent:""};i("ma-note-status").textContent="\u4FDD\u5B58\u4E2D\u2026";let a=await y("POST","/api/ai/notes",s);Bi(a),await gn(),Dt()}async function Gl(){if(!Nt){Fn();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await y("DELETE",`/api/ai/notes/${Nt}`),Fn(),await gn(),Dt())}function _t(){let e=i("ma-history-list");if(!e)return;let t=(Di||"").trim().toLowerCase(),n=As;if(t&&(n=n.filter(s=>`${s.title||""} ${s.preview||""} ${s.id||""}`.toLowerCase().includes(t))),!n.length){e.innerHTML=`<div class="text-center text-xs text-base-content/40 py-10">
312
+ </button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await y("GET",`/api/ai/notes/${t.dataset.noteId}`);Gi(n),Dt()}catch(n){r("ma-note-status").textContent=n.message}})})}}async function Xl(){let e=r("ma-note-title")?.value?.trim()||"",t=r("ma-note-content")?.value?.trim()||"";if(!e||!t){r("ma-note-status").textContent="\u6807\u9898\u548C\u5185\u5BB9\u90FD\u4E0D\u80FD\u4E3A\u7A7A";return}let n=Wi(),s={id:Nt||void 0,title:e,content:t,pinned:!!r("ma-note-pin")?.checked,cwd:r("ma-note-link-project")?.checked?n.project:"",sessionId:r("ma-note-link-session")?.checked?n.sessionId:"",agent:r("ma-note-link-session")?.checked?n.agent:""};r("ma-note-status").textContent="\u4FDD\u5B58\u4E2D\u2026";let a=await y("POST","/api/ai/notes",s);Gi(a),await xn(),Dt()}async function Zl(){if(!Nt){Un();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await y("DELETE",`/api/ai/notes/${Nt}`),Un(),await xn(),Dt())}function _t(){let e=r("ma-history-list");if(!e)return;let t=(Ri||"").trim().toLowerCase(),n=As;if(t&&(n=n.filter(s=>`${s.title||""} ${s.preview||""} ${s.id||""}`.toLowerCase().includes(t))),!n.length){e.innerHTML=`<div class="text-center text-xs text-base-content/40 py-10">
313
313
  ${t?"\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD":"\u8FD8\u6CA1\u6709\u5386\u53F2\u5BF9\u8BDD\u3002\u53D1\u4E00\u6761\u6D88\u606F\u540E\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002"}
314
- </div>`;return}e.innerHTML=n.map(s=>{let a=s.id===pe,o=Ns(s.updatedAt)||"",r=s.messageCount||0;return`
314
+ </div>`;return}e.innerHTML=n.map(s=>{let a=s.id===pe,o=Ns(s.updatedAt)||"",i=s.messageCount||0;return`
315
315
  <div class="ma-hist-item ${a?"active":""}" data-hist-id="${p(s.id)}">
316
316
  <div class="flex items-start gap-2">
317
317
  <button type="button" class="ma-hist-open flex-1 min-w-0 text-left" data-hist-open="${p(s.id)}">
318
318
  <div class="font-medium text-xs truncate">${p(s.title||s.id.slice(0,8))}</div>
319
319
  <div class="text-[10px] text-base-content/45 mt-0.5 line-clamp-2">${p(s.preview||"\uFF08\u65E0\u9884\u89C8\uFF09")}</div>
320
- <div class="text-[10px] text-base-content/35 mt-1">${p(o)}${r?` \xB7 ${r} \u6761`:""}${a?" \xB7 \u5F53\u524D":""}</div>
320
+ <div class="text-[10px] text-base-content/35 mt-1">${p(o)}${i?` \xB7 ${i} \u6761`:""}${a?" \xB7 \u5F53\u524D":""}</div>
321
321
  </button>
322
322
  <div class="flex flex-col gap-0.5 flex-shrink-0">
323
323
  <button type="button" class="btn btn-ghost btn-xs px-1" data-hist-resume="${p(s.id)}" title="\u6253\u5F00\u5E76\u7EE7\u7EED">\u21B5</button>
324
324
  <button type="button" class="btn btn-ghost btn-xs px-1 text-error" data-hist-del="${p(s.id)}" title="\u5220\u9664">\u2715</button>
325
325
  </div>
326
326
  </div>
327
- </div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await ot(s.dataset.histOpen),ye("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await ot(s.dataset.histResume),ye("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation();let o=s.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await y("DELETE",`/api/ai/sessions/${o}`),pe===o&&(pe=null,Se=null,localStorage.removeItem(bt),ot(null)),await at(),_t()}catch(r){alert(r.message)}})})}function ji(e){return typeof e=="string"?e:Array.isArray(e)&&e.map(t=>typeof t=="string"?t:t?.type==="text"?t.text||"":t?.type==="image_url"?"[\u56FE\u7247]":"").filter(Boolean).join(`
328
- `)||"[\u2026]"}function Kl(e){let t=i("ma-messages");if(t){if(t.innerHTML="",!e?.length){Z("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){Z("user",ji(n.content));continue}if(n.role==="assistant"){if(n.tool_calls?.length)for(let s of n.tool_calls){let a=s.function?.name||s.name||"tool",o={};try{o=JSON.parse(s.function?.arguments||s.arguments||"{}")}catch{}Z("tool","",{name:a,args:o,phase:"history",id:s.id||a})}n.content&&Z("assistant",typeof n.content=="string"?n.content:ji(n.content));continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)Ri(a,"done",s);else{Z("tool","",{name:"tool_result",args:{},phase:"done",id:`tr_${Math.random().toString(36).slice(2,8)}`});let o=t.querySelectorAll(".ma-tool"),r=o[o.length-1];if(r){r.classList.add("done");let d=r.querySelector(".ma-tool-result");d||(d=document.createElement("pre"),d.className="ma-tool-result",r.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,0).slice(0,500)}}}}t.scrollTop=t.scrollHeight}}async function zl(){if(!pe){await ot(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await y("DELETE",`/api/ai/sessions/${pe}`),pe=null,Se=null,localStorage.removeItem(bt),await at(),await ot(null),ht==="history"&&_t()}catch(e){Z("error",e.message)}}async function ot(e,t={}){if(!e){pe=null,Se=null,localStorage.removeItem(bt);let n=i("ma-messages");return n&&(n.innerHTML=""),Z("system","\u65B0\u5BF9\u8BDD \u2014 \u8D34\u56FE \u2192 [imgN](\u8DEF\u5F84)\uFF1B\u9700\u8981\u770B\u56FE\u65F6\u8C03\u7528 VLM\u3002\u5386\u53F2\u5728\u300C\u5386\u53F2\u300D\u9875\uFF0C\u53EF\u968F\u65F6 resume\u3002"),Un(),null}try{let n=await y("GET",`/api/ai/sessions/${e}`);return pe=n.id,Se={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(bt,n.id),Kl(n.messages||[]),t.silent||Z("system","\u2191 \u5386\u53F2\u5DF2\u52A0\u8F7D\u3002\u5728\u4E0B\u65B9\u7EE7\u7EED\u8F93\u5165\u5373\u53EF resume\uFF08\u670D\u52A1\u7AEF\u4FDD\u7559\u5B8C\u6574 tool / VLM \u4E0A\u4E0B\u6587\uFF09\u3002"),Un(),ht==="history"&&_t(),n}catch(n){throw t.silent||Z("error",n.message),n}}async function Cs(){if(bn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;bn=!0,i("ma-send").disabled=!0,Z("user",t),e.value="",e.style.height="";for(let a of jt)if(a.previewUrl)try{URL.revokeObjectURL(a.previewUrl)}catch{}jt=[],Fa();let n=null,s="";try{await Ba("/api/ai/chat",{message:t,sessionId:pe},{session:a=>{pe=a.id,Se={...Se||{},id:a.id,title:a.title||Se?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(bt,a.id),Un()},content:a=>{s=a.content||"",n||(n=Z("assistant","")),Ci(n,s)},tool:a=>{a.phase==="start"?Z("tool","",{name:a.name,args:a.args,phase:"start",id:a.id}):Ri(a.id,a.phase,a.result)},approval:a=>Bl(a),done:a=>{a.sessionId&&(pe=a.sessionId,localStorage.setItem(bt,a.sessionId)),(a.title||a.sessionId)&&(Se={id:pe,title:a.title||Se?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(Se?.messageCount||0)+2}),a.content&&n&&Ci(n,a.content),Un(),at()},error:a=>{Z("error",a.message||"error")}})}catch(a){Z("error",a.message)}finally{bn=!1,i("ma-send").disabled=!1}}async function Jl(){if(bn)return;bn=!0;let e=parseInt(i("ma-report-days")?.value||"1",10),t=i("ma-report-body");t.innerHTML=`<div class="text-sm text-base-content/50 py-6 text-center">\u6B63\u5728\u6C47\u603B\u8FD1 ${e} \u5929\u6D3B\u52A8\u2026</div>`,i("ma-gen-report").disabled=!0;let n="",s=document.createElement("div");s.className="ma-report-tools flex flex-col gap-1 mb-3";try{await Ba("/api/ai/report",{days:e},{content:a=>{n=a.content||"",t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=xn(n),vn(o),t.appendChild(o)},tool:a=>{if(a.phase==="start"){let o=document.createElement("div");o.className="ma-tool",o.dataset.toolId=a.id||a.name,o.innerHTML=`<span class="ma-tool-name">${p(a.name)}</span> <span class="ma-tool-phase">start</span>`,s.appendChild(o)}else{let o=s.querySelector(`[data-tool-id="${CSS.escape(a.id||a.name)}"]`);o&&(o.classList.add(a.phase==="error"?"error":"done"),o.querySelector(".ma-tool-phase").textContent=a.phase)}},done:a=>{if(a.content){t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=xn(a.content),vn(o),t.appendChild(o)}},error:a=>{t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})}catch(a){t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}finally{bn=!1,i("ma-gen-report").disabled=!1}}async function qi(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await y("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=i("ma-report-body");s.innerHTML=`
327
+ </div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await ot(s.dataset.histOpen),ye("chat"),r("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await ot(s.dataset.histResume),ye("chat"),r("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation();let o=s.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await y("DELETE",`/api/ai/sessions/${o}`),pe===o&&(pe=null,Se=null,localStorage.removeItem(bt),ot(null)),await at(),_t()}catch(i){alert(i.message)}})})}function Hi(e){return typeof e=="string"?e:Array.isArray(e)&&e.map(t=>typeof t=="string"?t:t?.type==="text"?t.text||"":t?.type==="image_url"?"[\u56FE\u7247]":"").filter(Boolean).join(`
328
+ `)||"[\u2026]"}function ec(e){let t=r("ma-messages");if(t){if(t.innerHTML="",!e?.length){Z("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){Z("user",Hi(n.content));continue}if(n.role==="assistant"){if(n.tool_calls?.length)for(let s of n.tool_calls){let a=s.function?.name||s.name||"tool",o={};try{o=JSON.parse(s.function?.arguments||s.arguments||"{}")}catch{}Z("tool","",{name:a,args:o,phase:"history",id:s.id||a})}n.content&&Z("assistant",typeof n.content=="string"?n.content:Hi(n.content));continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)Ui(a,"done",s);else{Z("tool","",{name:"tool_result",args:{},phase:"done",id:`tr_${Math.random().toString(36).slice(2,8)}`});let o=t.querySelectorAll(".ma-tool"),i=o[o.length-1];if(i){i.classList.add("done");let d=i.querySelector(".ma-tool-result");d||(d=document.createElement("pre"),d.className="ma-tool-result",i.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,0).slice(0,500)}}}}t.scrollTop=t.scrollHeight}}async function tc(){if(!pe){await ot(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await y("DELETE",`/api/ai/sessions/${pe}`),pe=null,Se=null,localStorage.removeItem(bt),await at(),await ot(null),ht==="history"&&_t()}catch(e){Z("error",e.message)}}async function ot(e,t={}){if(!e){pe=null,Se=null,localStorage.removeItem(bt);let n=r("ma-messages");return n&&(n.innerHTML=""),Z("system","\u65B0\u5BF9\u8BDD \u2014 \u8D34\u56FE \u2192 [imgN](\u8DEF\u5F84)\uFF1B\u9700\u8981\u770B\u56FE\u65F6\u8C03\u7528 VLM\u3002\u5386\u53F2\u5728\u300C\u5386\u53F2\u300D\u9875\uFF0C\u53EF\u968F\u65F6 resume\u3002"),Wn(),null}try{let n=await y("GET",`/api/ai/sessions/${e}`);return pe=n.id,Se={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(bt,n.id),ec(n.messages||[]),t.silent||Z("system","\u2191 \u5386\u53F2\u5DF2\u52A0\u8F7D\u3002\u5728\u4E0B\u65B9\u7EE7\u7EED\u8F93\u5165\u5373\u53EF resume\uFF08\u670D\u52A1\u7AEF\u4FDD\u7559\u5B8C\u6574 tool / VLM \u4E0A\u4E0B\u6587\uFF09\u3002"),Wn(),ht==="history"&&_t(),n}catch(n){throw t.silent||Z("error",n.message),n}}async function Cs(){if(gn)return;let e=r("ma-input"),t=(e?.value||"").trim();if(!t)return;gn=!0,r("ma-send").disabled=!0,Z("user",t),e.value="",e.style.height="";for(let a of jt)if(a.previewUrl)try{URL.revokeObjectURL(a.previewUrl)}catch{}jt=[],Ua();let n=null,s="";try{await qa("/api/ai/chat",{message:t,sessionId:pe},{session:a=>{pe=a.id,Se={...Se||{},id:a.id,title:a.title||Se?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(bt,a.id),Wn()},content:a=>{s=a.content||"",n||(n=Z("assistant","")),_i(n,s)},tool:a=>{a.phase==="start"?Z("tool","",{name:a.name,args:a.args,phase:"start",id:a.id}):Ui(a.id,a.phase,a.result)},approval:a=>Jl(a),done:a=>{a.sessionId&&(pe=a.sessionId,localStorage.setItem(bt,a.sessionId)),(a.title||a.sessionId)&&(Se={id:pe,title:a.title||Se?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(Se?.messageCount||0)+2}),a.content&&n&&_i(n,a.content),Wn(),at()},error:a=>{Z("error",a.message||"error")}})}catch(a){Z("error",a.message)}finally{gn=!1,r("ma-send").disabled=!1}}async function nc(){if(gn)return;gn=!0;let e=parseInt(r("ma-report-days")?.value||"1",10),t=r("ma-report-body");t.innerHTML=`<div class="text-sm text-base-content/50 py-6 text-center">\u6B63\u5728\u6C47\u603B\u8FD1 ${e} \u5929\u6D3B\u52A8\u2026</div>`,r("ma-gen-report").disabled=!0;let n="",s=document.createElement("div");s.className="ma-report-tools flex flex-col gap-1 mb-3";try{await qa("/api/ai/report",{days:e},{content:a=>{n=a.content||"",t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=vn(n),yn(o),t.appendChild(o)},tool:a=>{if(a.phase==="start"){let o=document.createElement("div");o.className="ma-tool",o.dataset.toolId=a.id||a.name,o.innerHTML=`<span class="ma-tool-name">${p(a.name)}</span> <span class="ma-tool-phase">start</span>`,s.appendChild(o)}else{let o=s.querySelector(`[data-tool-id="${CSS.escape(a.id||a.name)}"]`);o&&(o.classList.add(a.phase==="error"?"error":"done"),o.querySelector(".ma-tool-phase").textContent=a.phase)}},done:a=>{if(a.content){t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=vn(a.content),yn(o),t.appendChild(o)}},error:a=>{t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})}catch(a){t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}finally{gn=!1,r("ma-gen-report").disabled=!1}}async function zi(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await y("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=r("ma-report-body");s.innerHTML=`
329
329
  <div class="text-[10px] text-base-content/40 mb-2">${p(n.title||t)} \xB7 ${p(n.generatedAt||"")}</div>
330
- <div class="md ma-report-md">${xn(n.markdown)}</div>`,vn(s)}}catch{}}async function Ql(){let e=i("ma-report-list");try{let t=await y("GET","/api/ai/reports");e.classList.remove("hidden");let n=t.reports||[];if(!n.length){e.innerHTML='<div class="text-xs text-base-content/40 px-2 py-1">\u6682\u65E0\u5386\u53F2\u62A5\u544A</div>';return}e.innerHTML=n.map(s=>`
330
+ <div class="md ma-report-md">${vn(n.markdown)}</div>`,yn(s)}}catch{}}async function sc(){let e=r("ma-report-list");try{let t=await y("GET","/api/ai/reports");e.classList.remove("hidden");let n=t.reports||[];if(!n.length){e.innerHTML='<div class="text-xs text-base-content/40 px-2 py-1">\u6682\u65E0\u5386\u53F2\u62A5\u544A</div>';return}e.innerHTML=n.map(s=>`
331
331
  <button type="button" class="ma-report-item w-full text-left px-2 py-1 rounded hover:bg-base-200 text-xs"
332
332
  data-day="${p(s.day)}">
333
333
  <span class="font-semibold">${p(s.day)}</span>
334
334
  <span class="text-base-content/45 ml-1">${p(s.title||"")}</span>
335
- </button>`).join(""),e.querySelectorAll("[data-day]").forEach(s=>{s.addEventListener("click",async()=>{try{let a=await y("GET",`/api/ai/reports/${s.dataset.day}`),o=i("ma-report-body");o.innerHTML=`
335
+ </button>`).join(""),e.querySelectorAll("[data-day]").forEach(s=>{s.addEventListener("click",async()=>{try{let a=await y("GET",`/api/ai/reports/${s.dataset.day}`),o=r("ma-report-body");o.innerHTML=`
336
336
  <div class="text-[10px] text-base-content/40 mb-2">${p(a.title||a.day)} \xB7 ${p(a.generatedAt||"")}</div>
337
- <div class="md ma-report-md">${xn(a.markdown)}</div>`,vn(o)}catch(a){i("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${p(t.message)}</div>`}}async function Fi(){try{let e=await y("GET","/api/ai/config");i("ma-cfg-url").value=e.url||"",i("ma-cfg-model").value=e.model||"",i("ma-cfg-key").placeholder=e.hasKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"API Key",i("ma-cfg-key").value="",i("ma-cfg-vlm-url").value=e.vlm_url||"",i("ma-cfg-vlm-model").value=e.vlm_model||"",i("ma-cfg-vlm-key").value="",i("ma-cfg-vlm-key").placeholder=e.hasVlmKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"\u53EF\u9009",i("ma-cfg-system").value=e.system||"",i("ma-auto-report")&&(i("ma-auto-report").checked=!!e.auto_report),i("ma-auto-hour")&&(i("ma-auto-hour").value=String(e.auto_report_hour??18)),Wn(e)}catch(e){i("ma-cfg-status").textContent=e.message}}async function Vl(){let e=i("ma-cfg-status");e.textContent="\u4FDD\u5B58\u4E2D\u2026";try{let t={url:i("ma-cfg-url").value.trim(),model:i("ma-cfg-model").value.trim(),vlm_url:i("ma-cfg-vlm-url").value.trim(),vlm_model:i("ma-cfg-vlm-model").value.trim(),system:i("ma-cfg-system").value,auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)},n=i("ma-cfg-key").value.trim(),s=i("ma-cfg-vlm-key").value.trim();n&&(t.key=n),s&&(t.vlm_key=s);let a=await y("PUT","/api/ai/config",t);e.textContent=a.hasKey?"\u5DF2\u4FDD\u5B58 \u2713":"\u5DF2\u4FDD\u5B58\uFF08\u672A\u8BBE\u7F6E Key\uFF09",i("ma-cfg-key").value="",i("ma-cfg-vlm-key").value="",Wn(a)}catch(t){e.textContent=t.message}}function Wn(e){if(Is&&(clearInterval(Is),Is=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Is=setInterval(async()=>{if(!f.token)return;let n=new Date;if(n.getHours()!==t)return;let s=`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`;if(Oa!==s&&!(n.getMinutes()>10))try{Oa=s,localStorage.setItem("ai_last_auto_report",s),await Ba("/api/ai/report",{days:e.auto_report_days||1},{done:()=>{console.info("[meta-agent] auto report saved for",s)},error:a=>console.warn("[meta-agent] auto report",a.message)})}catch(a){console.warn("[meta-agent] auto report failed",a),Oa="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function Ui(){i("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",Ol()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Pi)}),i("ma-btn-chat")?.addEventListener("click",()=>ye("chat")),i("ma-btn-history")?.addEventListener("click",async()=>{await at(),ye("history")}),i("ma-btn-notes")?.addEventListener("click",async()=>{await gn(),Nt||Fn(),ye("notes")}),i("ma-open-history")?.addEventListener("click",async()=>{await at(),ye("history")}),i("ma-btn-report")?.addEventListener("click",()=>{ye("report"),qi()}),i("ma-btn-config")?.addEventListener("click",()=>{ye("config"),Fi()}),i("ma-send")?.addEventListener("click",Cs),i("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Cs())}),i("ma-input")?.addEventListener("input",()=>{let e=i("ma-input");e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}),i("ma-new-chat")?.addEventListener("click",()=>{ot(null),ye("chat")}),i("ma-del-session")?.addEventListener("click",zl),i("ma-resume-focus")?.addEventListener("click",()=>{i("ma-input")?.focus()}),i("ma-history-refresh")?.addEventListener("click",async()=>{await at(),_t()}),i("ma-history-new")?.addEventListener("click",()=>{ot(null),ye("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Di=e.target.value||"",_t()}),i("ma-quick-today")?.addEventListener("click",()=>{ye("chat"),i("ma-input").value="\u6839\u636E\u6211\u6700\u8FD1\u7684\u4F1A\u8BDD\uFF0C\u603B\u7ED3\u4ECA\u5929\u6211\u505A\u4E86\u4EC0\u4E48\uFF1F\u6309\u9879\u76EE\u5217\u51FA\u4EAE\u70B9\u4E0E\u672A\u5B8C\u6210\u4E8B\u9879\u3002",Cs()}),i("ma-quick-projects")?.addEventListener("click",()=>{ye("chat"),i("ma-input").value="\u5217\u51FA\u6700\u8FD1 14 \u5929\u6D3B\u8DC3\u7684\u9879\u76EE\uFF0C\u6BCF\u4E2A\u9879\u76EE\u4E00\u53E5\u8BDD\u8BF4\u660E\u6700\u8FD1\u5728\u505A\u4EC0\u4E48\u3002",Cs()}),i("ma-gen-report")?.addEventListener("click",Jl),i("ma-load-reports")?.addEventListener("click",Ql),i("ma-notes-refresh")?.addEventListener("click",async()=>{await gn(),Dt()}),i("ma-notes-new")?.addEventListener("click",()=>{Fn(),Dt(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Ni=e.target.value||"",await gn(),Dt()}),i("ma-note-save")?.addEventListener("click",async()=>{try{await Wl()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-delete")?.addEventListener("click",async()=>{try{await Gl()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-ask")?.addEventListener("click",Ul),i("ma-cfg-save")?.addEventListener("click",Vl),i("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report").checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)});Wn(e)}catch{}}),i("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour").value||"18",10)});Wn(e)}catch{}}),i("ma-image-input")?.addEventListener("change",async e=>{let t=[...e.target.files||[]],n=i("ma-input");n&&(n.disabled=!0);try{for(let s of t)if(s.type.startsWith("image/")){if(s.size>12*1024*1024){Z("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Ai(s,s.name||`upload-${Date.now()}.png`)}}catch(s){Z("error",`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${s.message}`)}finally{e.target.value="",n&&(n.disabled=!1,n.focus())}}),document.addEventListener("paste",async e=>{if(!Ds||ht!=="chat")return;let t=i("ma-input"),n=i("meta-agent-panel"),s=document.activeElement;if(!n||!s||!n.contains(s))return;let o=[...e.clipboardData?.items||[]].filter(r=>r.type.startsWith("image/"));if(o.length){e.preventDefault(),t&&(t.disabled=!0);try{for(let r of o){let d=r.getAsFile();if(!d)continue;let l=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Ai(d,`paste-${Date.now()}.${l}`)}}catch(r){Z("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),ot(null,{silent:!0}),Fn())}function Gn(){f.token&&(A.peek()&&!Cn()||(at(),gn().catch(()=>{}),y("GET","/api/ai/config").then(Wn).catch(()=>{})))}var Ds,ht,bn,pe,Se,jt,Ii,Is,Oa,As,Di,js,Ni,Nt,_i,bt,Kn=K(()=>{R();ue();B();Ea();Ds=!1,ht="chat",bn=!1,pe=null,Se=null,jt=[],Ii=0,Is=null,Oa=localStorage.getItem("ai_last_auto_report")||"",As=[],Di="",js=[],Ni="",Nt=null,_i=null,bt="ma_last_session_id"});function Ua(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function Ht(){let e=Ua(O.peek()),t=j.peek();A.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=de.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function Ki(e){let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${t}-${n}-${s}`}function Yl(e,t){let n=[],a=new Date(e,t,1).getDay(),r=new Date(e,t+1,0).getDate(),d=new Date(e,t,0).getDate();for(let c=a-1;c>=0;c--)n.push({date:new Date(e,t-1,d-c),isCurrentMonth:!1});for(let c=1;c<=r;c++)n.push({date:new Date(e,t,c),isCurrentMonth:!0});let l=7-n.length%7;if(l<7)for(let c=1;c<=l;c++)n.push({date:new Date(e,t+1,c),isCurrentMonth:!1});return n}function zi(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=q(a.updatedAt);return o!=null&&o>=n&&o<s})}function Ji(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function Rt(e){let t=i("calendar-grid");if(!t)return;e=Ua(e??Ht());let n=i("calendar-month-year");if(n){let u=new Date(_s,Pt,1);n.textContent=u.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(u=>u.cwd).filter(Boolean)).size,o=e.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),r=i("stats-total-sessions"),d=i("stats-total-projects"),l=i("stats-total-tokens");r&&(r.textContent=String(s)),d&&(d.textContent=String(a)),l&&(l.textContent=Ji(o));let c=Yl(_s,Pt);zn||(zn=Ki(new Date)),t.innerHTML=c.map(u=>{let h=u.date,x=Ki(h),C=zi(h,e).length,F=h.toDateString()===new Date().toDateString(),ke=x===zn,J="",ne="text-base-content/65",N="border border-transparent",S="cursor-default",_=u.isCurrentMonth?"":"opacity-25";C>0?(S="cursor-pointer",C<=2?(J="bg-primary/15",ne="text-primary font-bold",N="border border-primary/30"):C<=5?(J="bg-primary/30",ne="text-primary font-bold",N="border border-primary/50"):(J="bg-primary/60",ne="text-primary-content font-bold",N="border border-primary/80")):(J="bg-base-300/25",u.isCurrentMonth&&(S="hover:bg-base-300/50")),F?N="border-2 border-primary":ke&&(N="border-2 border-accent");let se=h.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${h.toLocaleDateString([],{month:"short"})}</span>`:"";return`
337
+ <div class="md ma-report-md">${vn(a.markdown)}</div>`,yn(o)}catch(a){r("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${p(t.message)}</div>`}}async function Ki(){try{let e=await y("GET","/api/ai/config");r("ma-cfg-url").value=e.url||"",r("ma-cfg-model").value=e.model||"",r("ma-cfg-key").placeholder=e.hasKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"API Key",r("ma-cfg-key").value="",r("ma-cfg-vlm-url").value=e.vlm_url||"",r("ma-cfg-vlm-model").value=e.vlm_model||"",r("ma-cfg-vlm-key").value="",r("ma-cfg-vlm-key").placeholder=e.hasVlmKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"\u53EF\u9009",r("ma-cfg-system").value=e.system||"",r("ma-auto-report")&&(r("ma-auto-report").checked=!!e.auto_report),r("ma-auto-hour")&&(r("ma-auto-hour").value=String(e.auto_report_hour??18)),Gn(e)}catch(e){r("ma-cfg-status").textContent=e.message}}async function ac(){let e=r("ma-cfg-status");e.textContent="\u4FDD\u5B58\u4E2D\u2026";try{let t={url:r("ma-cfg-url").value.trim(),model:r("ma-cfg-model").value.trim(),vlm_url:r("ma-cfg-vlm-url").value.trim(),vlm_model:r("ma-cfg-vlm-model").value.trim(),system:r("ma-cfg-system").value,auto_report:!!r("ma-auto-report")?.checked,auto_report_hour:parseInt(r("ma-auto-hour")?.value||"18",10)},n=r("ma-cfg-key").value.trim(),s=r("ma-cfg-vlm-key").value.trim();n&&(t.key=n),s&&(t.vlm_key=s);let a=await y("PUT","/api/ai/config",t);e.textContent=a.hasKey?"\u5DF2\u4FDD\u5B58 \u2713":"\u5DF2\u4FDD\u5B58\uFF08\u672A\u8BBE\u7F6E Key\uFF09",r("ma-cfg-key").value="",r("ma-cfg-vlm-key").value="",Gn(a)}catch(t){e.textContent=t.message}}function Gn(e){if(Is&&(clearInterval(Is),Is=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Is=setInterval(async()=>{if(!f.token)return;let n=new Date;if(n.getHours()!==t)return;let s=`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`;if(Ba!==s&&!(n.getMinutes()>10))try{Ba=s,localStorage.setItem("ai_last_auto_report",s),await qa("/api/ai/report",{days:e.auto_report_days||1},{done:()=>{console.info("[meta-agent] auto report saved for",s)},error:a=>console.warn("[meta-agent] auto report",a.message)})}catch(a){console.warn("[meta-agent] auto report failed",a),Ba="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function Ji(){r("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",Kl()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",qi)}),r("ma-btn-chat")?.addEventListener("click",()=>ye("chat")),r("ma-btn-history")?.addEventListener("click",async()=>{await at(),ye("history")}),r("ma-btn-notes")?.addEventListener("click",async()=>{await xn(),Nt||Un(),ye("notes")}),r("ma-open-history")?.addEventListener("click",async()=>{await at(),ye("history")}),r("ma-btn-report")?.addEventListener("click",()=>{ye("report"),zi()}),r("ma-btn-config")?.addEventListener("click",()=>{ye("config"),Ki()}),r("ma-send")?.addEventListener("click",Cs),r("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Cs())}),r("ma-input")?.addEventListener("input",()=>{let e=r("ma-input");e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}),r("ma-new-chat")?.addEventListener("click",()=>{ot(null),ye("chat")}),r("ma-del-session")?.addEventListener("click",tc),r("ma-resume-focus")?.addEventListener("click",()=>{r("ma-input")?.focus()}),r("ma-history-refresh")?.addEventListener("click",async()=>{await at(),_t()}),r("ma-history-new")?.addEventListener("click",()=>{ot(null),ye("chat")}),r("ma-history-search")?.addEventListener("input",e=>{Ri=e.target.value||"",_t()}),r("ma-quick-today")?.addEventListener("click",()=>{ye("chat"),r("ma-input").value="\u6839\u636E\u6211\u6700\u8FD1\u7684\u4F1A\u8BDD\uFF0C\u603B\u7ED3\u4ECA\u5929\u6211\u505A\u4E86\u4EC0\u4E48\uFF1F\u6309\u9879\u76EE\u5217\u51FA\u4EAE\u70B9\u4E0E\u672A\u5B8C\u6210\u4E8B\u9879\u3002",Cs()}),r("ma-quick-projects")?.addEventListener("click",()=>{ye("chat"),r("ma-input").value="\u5217\u51FA\u6700\u8FD1 14 \u5929\u6D3B\u8DC3\u7684\u9879\u76EE\uFF0C\u6BCF\u4E2A\u9879\u76EE\u4E00\u53E5\u8BDD\u8BF4\u660E\u6700\u8FD1\u5728\u505A\u4EC0\u4E48\u3002",Cs()}),r("ma-gen-report")?.addEventListener("click",nc),r("ma-load-reports")?.addEventListener("click",sc),r("ma-notes-refresh")?.addEventListener("click",async()=>{await xn(),Dt()}),r("ma-notes-new")?.addEventListener("click",()=>{Un(),Dt(),r("ma-note-title")?.focus()}),r("ma-notes-search")?.addEventListener("input",async e=>{Oi=e.target.value||"",await xn(),Dt()}),r("ma-note-save")?.addEventListener("click",async()=>{try{await Xl()}catch(e){r("ma-note-status").textContent=e.message}}),r("ma-note-delete")?.addEventListener("click",async()=>{try{await Zl()}catch(e){r("ma-note-status").textContent=e.message}}),r("ma-note-ask")?.addEventListener("click",Yl),r("ma-cfg-save")?.addEventListener("click",ac),r("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!r("ma-auto-report").checked,auto_report_hour:parseInt(r("ma-auto-hour")?.value||"18",10)});Gn(e)}catch{}}),r("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!r("ma-auto-report")?.checked,auto_report_hour:parseInt(r("ma-auto-hour").value||"18",10)});Gn(e)}catch{}}),r("ma-image-input")?.addEventListener("change",async e=>{let t=[...e.target.files||[]],n=r("ma-input");n&&(n.disabled=!0);try{for(let s of t)if(s.type.startsWith("image/")){if(s.size>12*1024*1024){Z("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Pi(s,s.name||`upload-${Date.now()}.png`)}}catch(s){Z("error",`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${s.message}`)}finally{e.target.value="",n&&(n.disabled=!1,n.focus())}}),document.addEventListener("paste",async e=>{if(!Ds||ht!=="chat")return;let t=r("ma-input"),n=r("meta-agent-panel"),s=document.activeElement;if(!n||!s||!n.contains(s))return;let o=[...e.clipboardData?.items||[]].filter(i=>i.type.startsWith("image/"));if(o.length){e.preventDefault(),t&&(t.disabled=!0);try{for(let i of o){let d=i.getAsFile();if(!d)continue;let l=(i.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Pi(d,`paste-${Date.now()}.${l}`)}}catch(i){Z("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${i.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),ot(null,{silent:!0}),Un())}function zn(){f.token&&(A.peek()&&!An()||(at(),xn().catch(()=>{}),y("GET","/api/ai/config").then(Gn).catch(()=>{})))}var Ds,ht,gn,pe,Se,jt,Ni,Is,Ba,As,Ri,js,Oi,Nt,Bi,bt,Kn=U(()=>{R();ue();B();Ea();Ds=!1,ht="chat",gn=!1,pe=null,Se=null,jt=[],Ni=0,Is=null,Ba=localStorage.getItem("ai_last_auto_report")||"",As=[],Ri="",js=[],Oi="",Nt=null,Bi=null,bt="ma_last_session_id"});function Wa(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function Ht(){let e=Wa(O.peek()),t=j.peek();A.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=de.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function Yi(e){let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${t}-${n}-${s}`}function oc(e,t){let n=[],a=new Date(e,t,1).getDay(),i=new Date(e,t+1,0).getDate(),d=new Date(e,t,0).getDate();for(let c=a-1;c>=0;c--)n.push({date:new Date(e,t-1,d-c),isCurrentMonth:!1});for(let c=1;c<=i;c++)n.push({date:new Date(e,t,c),isCurrentMonth:!0});let l=7-n.length%7;if(l<7)for(let c=1;c<=l;c++)n.push({date:new Date(e,t+1,c),isCurrentMonth:!1});return n}function Xi(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=q(a.updatedAt);return o!=null&&o>=n&&o<s})}function Zi(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function Rt(e){let t=r("calendar-grid");if(!t)return;e=Wa(e??Ht());let n=r("calendar-month-year");if(n){let u=new Date(_s,Pt,1);n.textContent=u.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(u=>u.cwd).filter(Boolean)).size,o=e.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),i=r("stats-total-sessions"),d=r("stats-total-projects"),l=r("stats-total-tokens");i&&(i.textContent=String(s)),d&&(d.textContent=String(a)),l&&(l.textContent=Zi(o));let c=oc(_s,Pt);Jn||(Jn=Yi(new Date)),t.innerHTML=c.map(u=>{let h=u.date,x=Yi(h),C=Xi(h,e).length,F=h.toDateString()===new Date().toDateString(),ke=x===Jn,J="",ne="text-base-content/65",N="border border-transparent",S="cursor-default",_=u.isCurrentMonth?"":"opacity-25";C>0?(S="cursor-pointer",C<=2?(J="bg-primary/15",ne="text-primary font-bold",N="border border-primary/30"):C<=5?(J="bg-primary/30",ne="text-primary font-bold",N="border border-primary/50"):(J="bg-primary/60",ne="text-primary-content font-bold",N="border border-primary/80")):(J="bg-base-300/25",u.isCurrentMonth&&(S="hover:bg-base-300/50")),F?N="border-2 border-primary":ke&&(N="border-2 border-accent");let se=h.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${h.toLocaleDateString([],{month:"short"})}</span>`:"";return`
338
338
  <div class="aspect-square rounded-xl flex flex-col items-center justify-center p-2 relative transition-all min-h-[50px] md:min-h-[60px] ${J} ${ne} ${N} ${S} ${_}"
339
339
  data-cal-date="${x}" title="${h.toDateString()}: ${C} session(s)">
340
340
  ${se}
341
341
  <span class="text-sm font-semibold">${h.getDate()}</span>
342
342
  ${C>0?`<span class="text-[10px] mt-0.5 opacity-80 font-medium whitespace-nowrap">${C}s</span>`:""}
343
- </div>`}).join(""),Xl(e),Ga()}function Xl(e){let t=i("selected-day-title"),n=i("selected-day-sessions");if(!t||!n)return;let[s,a,o]=zn.split("-").map(Number),r=new Date(s,a-1,o);t.textContent=`Activity on ${r.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric",year:"numeric"})}`,e=Ua(e);let d=zi(r,e),l=d.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),c=i("stats-selected-tokens");if(c&&(c.textContent=Ji(l)),!d.length){n.innerHTML='<div class="text-center text-xs text-base-content/40 my-auto py-6">No sessions active on this day</div>';return}d.sort((u,h)=>(q(h.updatedAt)||0)-(q(u.updatedAt)||0)),n.innerHTML=d.map(u=>{let h=q(u.updatedAt),x=h!=null?new Date(h).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
343
+ </div>`}).join(""),ic(e),za()}function ic(e){let t=r("selected-day-title"),n=r("selected-day-sessions");if(!t||!n)return;let[s,a,o]=Jn.split("-").map(Number),i=new Date(s,a-1,o);t.textContent=`Activity on ${i.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric",year:"numeric"})}`,e=Wa(e);let d=Xi(i,e),l=d.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),c=r("stats-selected-tokens");if(c&&(c.textContent=Zi(l)),!d.length){n.innerHTML='<div class="text-center text-xs text-base-content/40 my-auto py-6">No sessions active on this day</div>';return}d.sort((u,h)=>(q(h.updatedAt)||0)-(q(u.updatedAt)||0)),n.innerHTML=d.map(u=>{let h=q(u.updatedAt),x=h!=null?new Date(h).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
344
344
  <div class="flex items-center gap-2.5 p-2.5 rounded-lg bg-base-300/40 hover:bg-base-300 border border-base-300/50 cursor-pointer text-left transition-all ${f.sessionId===u.sessionId?"border-primary bg-primary/5":""}"
345
345
  data-session-id="${p(u.sessionId)}"
346
346
  data-session-cwd="${p(u.cwd||"")}"
@@ -353,7 +353,7 @@ ${t}`:"",n.length?n.join(`
353
353
  <div class="text-[10px] text-base-content/40 truncate mt-0.5">${p(u.projectName||sn(u.cwd)||"No workspace")}</div>
354
354
  </div>
355
355
  <div class="text-[9px] text-base-content/45 font-mono whitespace-nowrap bg-base-300 px-1.5 py-0.5 rounded">${x}</div>
356
- </div>`}).join("")}function Ps(e){return`${e.machineId||""}:${e.agent||"claude"}:${e.sessionId}`}function Wa(){try{let e=JSON.parse(localStorage.getItem(Vi)||"[]");return Array.isArray(e)?e.filter(t=>t&&t.sessionId):[]}catch{return[]}}function Yi(e){try{localStorage.setItem(Vi,JSON.stringify(e))}catch{}}function Xi(e){if(!e?.sessionId)return;let t=Ps(e),n={...e,lastOpenedAt:Date.now()},s=Wa().filter(a=>Ps(a)!==t);s.unshift(n),Yi(s.slice(0,Qi)),Ga(),za()}function Zi(e){if(!e?.sessionId)return;let t=Ps(e);Yi(Wa().filter(n=>Ps(n)!==t)),Ga(),za()}function er(e){return Wa().sort((t,n)=>(q(n.lastOpenedAt)||0)-(q(t.lastOpenedAt)||0)).slice(0,e)}function Ga(){let e=i("recent-sessions-list");if(!e)return;let t=er(6);if(!t.length){e.innerHTML='<div class="col-span-full text-center text-xs text-base-content/40 py-4">No recent sessions</div>';return}e.innerHTML=t.map(n=>{let s=tn(n.updatedAt);return`
356
+ </div>`}).join("")}function Ps(e){return`${e.machineId||""}:${e.agent||"claude"}:${e.sessionId}`}function Ga(){try{let e=JSON.parse(localStorage.getItem(tr)||"[]");return Array.isArray(e)?e.filter(t=>t&&t.sessionId):[]}catch{return[]}}function nr(e){try{localStorage.setItem(tr,JSON.stringify(e))}catch{}}function sr(e){if(!e?.sessionId)return;let t=Ps(e),n={...e,lastOpenedAt:Date.now()},s=Ga().filter(a=>Ps(a)!==t);s.unshift(n),nr(s.slice(0,er)),za(),Ja()}function ar(e){if(!e?.sessionId)return;let t=Ps(e);nr(Ga().filter(n=>Ps(n)!==t)),za(),Ja()}function or(e){return Ga().sort((t,n)=>(q(n.lastOpenedAt)||0)-(q(t.lastOpenedAt)||0)).slice(0,e)}function za(){let e=r("recent-sessions-list");if(!e)return;let t=or(6);if(!t.length){e.innerHTML='<div class="col-span-full text-center text-xs text-base-content/40 py-4">No recent sessions</div>';return}e.innerHTML=t.map(n=>{let s=tn(n.updatedAt);return`
357
357
  <div class="flex items-center gap-2.5 p-3 rounded-xl bg-base-200 hover:bg-base-300 border border-base-300/80 cursor-pointer text-left transition-all ${f.sessionId===n.sessionId?"border-primary bg-primary/5":""}"
358
358
  data-session-id="${p(n.sessionId)}"
359
359
  data-session-cwd="${p(n.cwd||"")}"
@@ -366,9 +366,9 @@ ${t}`:"",n.length?n.join(`
366
366
  <div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||sn(n.cwd)||"No workspace")}</div>
367
367
  </div>
368
368
  <div class="text-[9px] text-base-content/40 whitespace-nowrap self-start mt-0.5">${s}</div>
369
- </div>`}).join("")}function Ot(){let e=i("recent-menu");e&&(e.classList.add("hidden"),e.classList.remove("recent-menu-open"),e.style.top="",e.style.left="",e.style.right="",e.style.width="",e.style.maxHeight=""),i("recent-menu-backdrop")?.classList.add("hidden")}function Ka(){let e=i("recent-menu"),t=i("topbar");if(!e||!t)return;let n=t.getBoundingClientRect(),a=Math.round(n.bottom+6),o=window.matchMedia("(max-width: 640px)").matches?8:null;if(e.style.top=`${a}px`,o!=null)e.style.left=`${o}px`,e.style.right=`${o}px`;else{let l=i("btn-recent-sessions")?.getBoundingClientRect();if(l){let c=Math.min(320,window.innerWidth-16),u=l.left;u+c>window.innerWidth-8&&(u=window.innerWidth-c-8),u<8&&(u=8),e.style.left=`${Math.round(u)}px`,e.style.right="auto",e.style.width=`${c}px`}}let r=Math.max(160,window.innerHeight-a-12);e.style.maxHeight=`${Math.min(r,Math.round(window.innerHeight*.7))}px`}function Zl(){let e=i("recent-menu");e&&(za(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Ka(),i("recent-menu-backdrop")?.classList.remove("hidden"))}function tr(){let e=i("recent-menu");e&&(e.classList.contains("hidden")?Zl():Ot())}function za(){let e=i("recent-menu-list"),t=i("recent-menu-empty"),n=i("recent-menu-count");if(!e)return;let s=er(Qi);if(n&&(n.textContent=s.length?`${s.length}`:""),!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(a=>{let o=tn(a.updatedAt),r=f.sessionId===a.sessionId&&(!a.machineId||!f.machineId||a.machineId===f.machineId),d=a.machineId?`<span class="text-[9px] font-mono text-base-content/35 truncate max-w-[4.5rem]" title="${p(a.machineId)}">@${p(a.machineId)}</span>`:"";return`
369
+ </div>`}).join("")}function Ot(){let e=r("recent-menu");e&&(e.classList.add("hidden"),e.classList.remove("recent-menu-open"),e.style.top="",e.style.left="",e.style.right="",e.style.width="",e.style.maxHeight=""),r("recent-menu-backdrop")?.classList.add("hidden")}function Ka(){let e=r("recent-menu"),t=r("topbar");if(!e||!t)return;let n=t.getBoundingClientRect(),a=Math.round(n.bottom+6),o=window.matchMedia("(max-width: 640px)").matches?8:null;if(e.style.top=`${a}px`,o!=null)e.style.left=`${o}px`,e.style.right=`${o}px`;else{let l=r("btn-recent-sessions")?.getBoundingClientRect();if(l){let c=Math.min(320,window.innerWidth-16),u=l.left;u+c>window.innerWidth-8&&(u=window.innerWidth-c-8),u<8&&(u=8),e.style.left=`${Math.round(u)}px`,e.style.right="auto",e.style.width=`${c}px`}}let i=Math.max(160,window.innerHeight-a-12);e.style.maxHeight=`${Math.min(i,Math.round(window.innerHeight*.7))}px`}function rc(){let e=r("recent-menu");e&&(Ja(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Ka(),r("recent-menu-backdrop")?.classList.remove("hidden"))}function ir(){let e=r("recent-menu");e&&(e.classList.contains("hidden")?rc():Ot())}function Ja(){let e=r("recent-menu-list"),t=r("recent-menu-empty"),n=r("recent-menu-count");if(!e)return;let s=or(er);if(n&&(n.textContent=s.length?`${s.length}`:""),!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(a=>{let o=tn(a.updatedAt),i=f.sessionId===a.sessionId&&(!a.machineId||!f.machineId||a.machineId===f.machineId),d=a.machineId?`<span class="text-[9px] font-mono text-base-content/35 truncate max-w-[4.5rem]" title="${p(a.machineId)}">@${p(a.machineId)}</span>`:"";return`
370
370
  <div class="recent-menu-item w-full text-left px-2 py-1.5 rounded-md flex items-start gap-2
371
- ${r?"bg-primary/15 text-primary":"hover:bg-base-200"}">
371
+ ${i?"bg-primary/15 text-primary":"hover:bg-base-200"}">
372
372
  <button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(Ye(a))}"
373
373
  data-session-id="${p(a.sessionId)}"
374
374
  data-session-cwd="${p(a.cwd||"")}"
@@ -383,7 +383,7 @@ ${t}`:"",n.length?n.join(`
383
383
  <span class="flex flex-col items-end gap-0.5 flex-shrink-0 self-start">
384
384
  <span class="text-[9px] text-base-content/40 whitespace-nowrap">${p(o)}</span>
385
385
  ${d}
386
- ${r?'<span class="text-[9px] opacity-70">\u5F53\u524D</span>':""}
386
+ ${i?'<span class="text-[9px] opacity-70">\u5F53\u524D</span>':""}
387
387
  </span>
388
388
  </button>
389
389
  <button type="button" class="recent-remove btn btn-ghost btn-xs min-h-7 h-7 w-7 px-0 flex-shrink-0 text-base-content/45 hover:text-error"
@@ -391,9 +391,9 @@ ${t}`:"",n.length?n.join(`
391
391
  data-dismiss-recent-session="${p(a.sessionId)}"
392
392
  data-dismiss-recent-agent="${p(a.agent||"claude")}"
393
393
  data-dismiss-recent-machine="${p(a.machineId||"")}">\xD7</button>
394
- </div>`}).join("")}function nr(e){zn=e}function Ja(e){Pt+=e,Pt<0?(Pt=11,_s--):Pt>11&&(Pt=0,_s++)}var _s,Pt,zn,Qi,Vi,Qa=K(()=>{R();B();an();_s=new Date().getFullYear(),Pt=new Date().getMonth(),zn=null;Qi=15,Vi="recentSessionsV1"});var lr={};as(lr,{loadAgentsMeta:()=>wn,loadAllSessions:()=>Ne,loadMemoryTab:()=>qs,loadWorkspaces:()=>yn,mdToHtml:()=>rr,openMemoryFile:()=>Za,promptCustomModel:()=>Rs,refreshEffortSelect:()=>Hs,refreshModelSelect:()=>_e,renderProjectGroups:()=>or,renderSessionList:()=>Ya,renderTimeline:()=>ir,runActivitySearch:()=>Os,scheduleActivitySearch:()=>Bs,sessionItemHtml:()=>Va,syncSidebarChrome:()=>Xa});function sr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function ec({hubIndex:e=!1}={}){let t=new URLSearchParams;t.set("limit","2000"),e&&A.peek()&&t.set("index","1");let n=t.toString();return n?`/api/sessions?${n}`:"/api/sessions"}async function Ne({waitFresh:e=!0,hubIndex:t=!1}={}){let n=sr(await Es());if(n.length){let a=j.peek();if(A.peek()&&a){let o=n.filter(r=>!r.machineId||r.machineId===a);O.value=o.length?o:n}else O.value=n}let s=async()=>{let a=ec({hubIndex:t}),o=await y("GET",a,void 0,void 0,{etag:!0});if(o===wa)return O.peek();let r=sr(o);return O.value=r,Ei(r),r};if(e||!n.length)try{await s()}catch(a){if(!n.length){let o=i("session-list");o&&(o.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(a.message)}</div>`)}}else s().catch(()=>{})}async function yn({waitFresh:e=!0}={}){let t=await Ti();t&&(ee.value=t);let n=async()=>{let s=await y("GET","/api/workspaces");ee.value=s,qn(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function Va(e,{showProject:t=!1}={}){let n=f.sessionId===e.sessionId&&(f.agent||I.peek())===(e.agent||"claude"),s=T.peek()?.[oe(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&me.peek()?e.snippet:Ye(e),r=!!s.favorite,d=!!s.hidden,l=!!(s.notes&&String(s.notes).trim()),c=Number(e.turnCount)||0,u=c>0&&c<=ga,h=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||sn(e.cwd)||"\u2014")}</div>`:"",x=[u?`<span class="session-thin-badge" title="Only ${c} turn${c===1?"":"s"}">thin\xB7${c}</span>`:"",a?`<span class="session-renamed-badge" title="Custom name (original: ${p(e.display||"")})">renamed</span>`:"",d?'<span class="session-hidden-badge" title="Hidden">hidden</span>':"",l?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:""].filter(Boolean).join(""),v=e.machineId?`<span class="text-[9px] px-1 py-0.5 rounded bg-base-300 text-base-content/50 font-mono flex-shrink-0" title="Machine">${p(e.machineId)}</span>`:"",C=a?`${o}
394
+ </div>`}).join("")}function rr(e){Jn=e}function Va(e){Pt+=e,Pt<0?(Pt=11,_s--):Pt>11&&(Pt=0,_s++)}var _s,Pt,Jn,er,tr,Qa=U(()=>{R();B();an();_s=new Date().getFullYear(),Pt=new Date().getMonth(),Jn=null;er=15,tr="recentSessionsV1"});var fr={};os(fr,{loadAgentsMeta:()=>kn,loadAllSessions:()=>_e,loadMemoryTab:()=>qs,loadWorkspaces:()=>wn,mdToHtml:()=>pr,openMemoryFile:()=>eo,promptCustomModel:()=>Rs,refreshEffortSelect:()=>Hs,refreshModelSelect:()=>Pe,renderProjectGroups:()=>dr,renderSessionList:()=>Xa,renderTimeline:()=>ur,runActivitySearch:()=>Os,scheduleActivitySearch:()=>Bs,sessionItemHtml:()=>Ya,syncSidebarChrome:()=>Za});function lr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function lc({hubIndex:e=!1}={}){let t=new URLSearchParams;t.set("limit","2000"),e&&A.peek()&&t.set("index","1");let n=t.toString();return n?`/api/sessions?${n}`:"/api/sessions"}async function _e({waitFresh:e=!0,hubIndex:t=!1}={}){let n=lr(await Es());if(n.length){let a=j.peek();if(A.peek()&&a){let o=n.filter(i=>!i.machineId||i.machineId===a);O.value=o.length?o:n}else O.value=n}let s=async()=>{let a=lc({hubIndex:t}),o=await y("GET",a,void 0,void 0,{etag:!0});if(o===wa)return O.peek();let i=lr(o);return O.value=i,Ai(i),i};if(e||!n.length)try{await s()}catch(a){if(!n.length){let o=r("session-list");o&&(o.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(a.message)}</div>`)}}else s().catch(()=>{})}async function wn({waitFresh:e=!0}={}){let t=await ji();t&&(ee.value=t);let n=async()=>{let s=await y("GET","/api/workspaces");ee.value=s,Fn(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function Ya(e,{showProject:t=!1}={}){let n=f.sessionId===e.sessionId&&(f.agent||I.peek())===(e.agent||"claude"),s=T.peek()?.[oe(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&me.peek()?e.snippet:Ye(e),i=!!s.favorite,d=!!s.hidden,l=!!(s.notes&&String(s.notes).trim()),c=Number(e.turnCount)||0,u=c>0&&c<=ga,h=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||sn(e.cwd)||"\u2014")}</div>`:"",x=[u?`<span class="session-thin-badge" title="Only ${c} turn${c===1?"":"s"}">thin\xB7${c}</span>`:"",a?`<span class="session-renamed-badge" title="Custom name (original: ${p(e.display||"")})">renamed</span>`:"",d?'<span class="session-hidden-badge" title="Hidden">hidden</span>':"",l?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:""].filter(Boolean).join(""),v=e.machineId?`<span class="text-[9px] px-1 py-0.5 rounded bg-base-300 text-base-content/50 font-mono flex-shrink-0" title="Machine">${p(e.machineId)}</span>`:"",C=a?`${o}
395
395
  (original: ${e.display||e.sessionId})`:e.display||"";return`<div class="session-row px-2.5 py-1.5 cursor-pointer hover:bg-base-300 border-l-2
396
- ${n?"border-primary bg-primary/5":"border-transparent"} ${r?"session-fav":""} ${d?"session-hidden-row":""} ${u?"session-thin":""}"
396
+ ${n?"border-primary bg-primary/5":"border-transparent"} ${i?"session-fav":""} ${d?"session-hidden-row":""} ${u?"session-thin":""}"
397
397
  data-session-id="${p(e.sessionId)}"
398
398
  data-session-cwd="${p(e.cwd||"")}"
399
399
  data-session-config-dir="${p(e.configDir||"")}"
@@ -401,12 +401,12 @@ ${t}`:"",n.length?n.join(`
401
401
  data-session-machine="${p(e.machineId||"")}"
402
402
  data-session-display="${p(e.display||"")}">
403
403
  <div class="flex items-start gap-1.5">
404
- <button type="button" class="session-fav-btn flex-shrink-0 leading-none mt-0.5 ${r?"is-fav":""}"
404
+ <button type="button" class="session-fav-btn flex-shrink-0 leading-none mt-0.5 ${i?"is-fav":""}"
405
405
  data-fav-toggle="1"
406
406
  data-fav-session-id="${p(e.sessionId)}"
407
407
  data-fav-session-agent="${p(e.agent||"claude")}"
408
408
  data-fav-session-machine="${p(e.machineId||"")}"
409
- title="${r?"Unfavorite":"Favorite"}">${r?"\u2605":"\u2606"}</button>
409
+ title="${i?"Unfavorite":"Favorite"}">${i?"\u2605":"\u2606"}</button>
410
410
  ${nn(e.agent)}
411
411
  <div class="min-w-0 flex-1">
412
412
  <div class="session-title-wrap flex items-center gap-1 min-w-0"
@@ -431,26 +431,26 @@ ${t}`:"",n.length?n.join(`
431
431
  </div>
432
432
  <span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${tn(e.updatedAt)}</span>
433
433
  </div>
434
- </div>`}async function wn(){try{let e=await y("GET","/api/agents");return kt.value=e,_e(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Hs(){let e=i("sel-effort");if(!e)return;let t=I.peek()||"claude",n=P.peek(),s=In(t,n),a=ie.peek()||"";if(!a){let r=lt(t,n);r&&s.includes(r)&&(a=r,ie.value=r)}let o=['<option value="">effort: off</option>'].concat(s.map(r=>`<option value="${p(r)}" ${r===a?"selected":""}>${p(r)}</option>`));if(e.innerHTML=o.join(""),a&&!s.includes(a)){let r=lt(t,n);r&&s.includes(r)?(ie.value=r,e.value=r):(ie.value="",e.value="")}else e.value=a}function _e(){let e=i("sel-model");if(!e)return;let t=I.peek()||"claude",n=Xe(t),s=P.peek();if(s&&!n.some(o=>o.value===s)&&(n=[{value:s,label:`${s} \u2605`,custom:!0},...n]),e.innerHTML=n.map(o=>`<option value="${p(o.value)}" ${o.value===s?"selected":""}>${p(o.label)}</option>`).join(""),n.some(o=>o.value===s))e.value=s;else{let o=qe(t)||n[0]?.value;le(o),e.value=o,s=o}let a=i("sel-agent");a&&(a.value=t),Hs()}function Rs({editCurrent:e=!1}={}){let t=I.peek()||"claude",n=e&&P.peek()||"",s=e?`Edit model id for ${t}:`:`Add model id for ${t} (saved in this browser):`,a=window.prompt(s,n);if(a==null)return;let o=a.trim();o&&(e&&n&&n!==o&&ls(t).includes(n)&&ya(t,n),Mn(t,o),le(o),_e())}function or(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
434
+ </div>`}async function kn(){try{let e=await y("GET","/api/agents");return kt.value=e,Pe(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Hs(){let e=r("sel-effort");if(!e)return;let t=I.peek()||"claude",n=P.peek(),s=Cn(t,n),a=ie.peek()||"";if(!a){let i=lt(t,n);i&&s.includes(i)&&(a=i,ie.value=i)}let o=['<option value="">effort: off</option>'].concat(s.map(i=>`<option value="${p(i)}" ${i===a?"selected":""}>${p(i)}</option>`));if(e.innerHTML=o.join(""),a&&!s.includes(a)){let i=lt(t,n);i&&s.includes(i)?(ie.value=i,e.value=i):(ie.value="",e.value="")}else e.value=a}function Pe(){let e=r("sel-model");if(!e)return;let t=I.peek()||"claude",n=Xe(t),s=P.peek();if(s&&!n.some(o=>o.value===s)&&(n=[{value:s,label:`${s} \u2605`,custom:!0},...n]),e.innerHTML=n.map(o=>`<option value="${p(o.value)}" ${o.value===s?"selected":""}>${p(o.label)}</option>`).join(""),n.some(o=>o.value===s))e.value=s;else{let o=Fe(t)||n[0]?.value;le(o),e.value=o,s=o}let a=r("sel-agent");a&&(a.value=t),Hs()}function Rs({editCurrent:e=!1}={}){let t=I.peek()||"claude",n=e&&P.peek()||"",s=e?`Edit model id for ${t}:`:`Add model id for ${t} (saved in this browser):`,a=window.prompt(s,n);if(a==null)return;let o=a.trim();o&&(e&&n&&n!==o&&cs(t).includes(n)&&ya(t,n),In(t,o),le(o),Pe())}function dr(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
435
435
  No projects in this range.<br>
436
436
  <span class="text-base-content/30">Try \u201CAll\u201D time or another agent.</span>
437
- </div>`;let t=zt.value,n=Jt.value,s=!!me.value.trim(),a=e[0]?.cwd||"(no path)";return e.map(o=>{let r=o.cwd||"(no path)",d=!1;n.has(r)?d=!1:t.has(r)?d=!0:d=s||r===a||e.length<=3;let l=o.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${p(o.machineId)}</span>`:"",c=`
437
+ </div>`;let t=Kt.value,n=Jt.value,s=!!me.value.trim(),a=e[0]?.cwd||"(no path)";return e.map(o=>{let i=o.cwd||"(no path)",d=!1;n.has(i)?d=!1:t.has(i)?d=!0:d=s||i===a||e.length<=3;let l=o.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${p(o.machineId)}</span>`:"",c=`
438
438
  <div class="project-header px-2.5 py-2 cursor-pointer hover:bg-base-300/80 select-none border-b border-base-300/40"
439
- data-folder="${p(r)}" data-project-cwd="${p(o.cwd||"")}" data-project-machine="${p(o.machineId||"")}">
439
+ data-folder="${p(i)}" data-project-cwd="${p(o.cwd||"")}" data-project-machine="${p(o.machineId||"")}">
440
440
  <div class="flex items-center gap-1.5">
441
441
  <span class="text-[10px] text-base-content/40 w-3 flex-shrink-0">${d?"\u25BE":"\u25B8"}</span>
442
442
  <span class="text-[12px] font-semibold truncate flex-1" title="${p(o.cwd||"")}">${p(o.projectName)}</span>
443
443
  ${l}
444
444
  <span class="text-[9px] text-base-content/30 flex-shrink-0">${tn(o.updatedAt)}</span>
445
445
  </div>
446
- </div>`,u=o.sessions.slice(0,40),h=o.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${o.sessions.length-40} more</div>`:"",x=d?`<div class="pb-1 border-b border-base-300/30">${u.map(v=>Va(v)).join("")}${h}</div>`:"";return c+x}).join("")}function ir(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
446
+ </div>`,u=o.sessions.slice(0,40),h=o.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${o.sessions.length-40} more</div>`:"",x=d?`<div class="pb-1 border-b border-base-300/30">${u.map(v=>Ya(v)).join("")}${h}</div>`:"";return c+x}).join("")}function ur(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
447
447
  No recent activity.<br>
448
448
  <span class="text-base-content/30">Widen the time range or clear filters.</span>
449
449
  </div>`;let t=new Map;for(let n of e){let a=(n.updatedAt?new Date(n.updatedAt):new Date).toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"});t.has(a)||t.set(a,[]),t.get(a).push(n)}return[...t.entries()].map(([n,s])=>`
450
450
  <div class="px-2.5 pt-2.5 pb-1 text-[10px] uppercase tracking-wide text-base-content/35 font-medium sticky top-0 bg-base-200/95 backdrop-blur-sm z-[1]">${p(n)}</div>
451
- ${s.map(a=>Va(a,{showProject:!0})).join("")}
452
- `).join("")}function Ya(){let e=Je.value,t=Array.isArray(ct.value)?ct.value:[],n=Array.isArray(St.value)?St.value:[];return e==="timeline"?ir(t):or(n)}function Xa(){document.querySelectorAll("[data-view]").forEach(o=>{let r=o.dataset.view===Je.peek();o.classList.toggle("bg-primary/15",r),o.classList.toggle("text-primary",r),o.classList.toggle("font-medium",r),o.classList.toggle("text-base-content/50",!r)}),document.querySelectorAll("[data-agent-filter]").forEach(o=>{o.classList.toggle("active",o.dataset.agentFilter===de.peek())});let e=i("time-range");e&&e.value!==rs.peek()&&(e.value=rs.peek());let t=i("search-status");if(!t)return;let n=Oe.peek(),s=Array.isArray(n?.results)?n.results:null,a=(me.peek()||"").trim();if(Qe.peek())t.classList.remove("hidden"),t.textContent="Searching content\u2026";else if(a&&s)t.classList.remove("hidden"),t.textContent=`${s.length} hit${s.length===1?"":"s"}${n.deep===!1?"":" (incl. content)"}`;else if(a)t.classList.remove("hidden"),t.textContent="Local filter only \u2014 type to deep-search";else{let o=ct.peek(),r=St.peek(),d=Array.isArray(o)?o.length:0,l=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=Je.peek()==="projects"?`${l} project${l===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function Os(e){let t=(e||"").trim();if(!t){Oe.value=null,Qe.value=!1;return}Qe.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});de.peek()&&de.peek()!=="all"&&n.set("agent",de.peek());let s=await y("GET",`/api/activity?${n}`);me.peek().trim()===t&&(Oe.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){me.peek().trim()===t&&(Oe.value={q:t.toLowerCase(),results:[],error:n.message})}finally{Qe.value=!1}}function Bs(e){clearTimeout(ar);let t=(e||"").trim();if(!t){Oe.value=null,Qe.value=!1;return}ar=setTimeout(()=>Os(t),350)}function rr(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return marked.parse(String(e),{breaks:!0,gfm:!0})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function qs(){let e=i("memory-area");if(e){if(!f.sessionId){e.innerHTML='<div class="p-4 text-xs text-base-content/40">Open or resume a session to view its memory.</div>';return}e.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let t=f.agent||I.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await y("GET",`/api/sessions/${f.sessionId}/memory?${n}`)).files||[];if(!a.length){e.innerHTML='<div class="p-4 text-base-content/40 text-xs">No memory files available for this agent/session.</div>';return}e.innerHTML=`<div class="p-3 text-[11px] text-base-content/45">${p(t)} \xB7 ${a.length} memory file${a.length===1?"":"s"} \xB7 click to open</div>
453
- <div class="px-3 pb-4 flex flex-col gap-1">${a.map(o=>`<button type="button" class="memory-file text-left px-3 py-2 rounded-lg border border-base-300 hover:border-primary hover:bg-primary/5" data-memory-file="${p(o.id)}" data-memory-agent="${p(t)}"><span class="font-mono text-xs">${p(o.name)}</span><span class="ml-2 text-[10px] text-base-content/40">${p(o.scope||"")}</span></button>`).join("")}<div id="memory-file-content"></div></div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${p(t?.message??String(t))}</div>`}}}async function Za(e,t){let n=i("memory-file-content");if(!(!n||!f.sessionId||!e)){n.innerHTML='<div class="p-3 text-xs text-base-content/40">Loading file\u2026</div>';try{let s=new URLSearchParams({agent:t||f.agent||I.peek()||"claude",file:e}),a=await y("GET",`/api/sessions/${f.sessionId}/memory/file?${s}`);n.innerHTML=`<div class="mt-2 border border-base-300 rounded-lg overflow-hidden"><div class="px-3 py-1.5 bg-base-300/50 text-xs font-mono">${p(a.name)}</div><div class="px-3 py-2 md">${rr(a.content)}</div></div>`}catch(s){n.innerHTML=`<div class="mt-2 p-3 text-error text-xs">${p(s?.message??String(s))}</div>`}}}var ar,Bt=K(()=>{R();B();ue();Ts();an();ar=null});function cr(e,t){Fs=e||"",Us=t||""}async function dr(e){let t=i("project-notes-bar");if(t)try{let n=await y("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);Fs=n.goal||"",Us=n.notes||"",kn(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function kn(){let e=i("project-notes-bar");if(!e)return;let t=Fs||"No goal yet \u2014 click Edit",n=Us||"";e.innerHTML=`
451
+ ${s.map(a=>Ya(a,{showProject:!0})).join("")}
452
+ `).join("")}function Xa(){let e=Je.value,t=Array.isArray(ct.value)?ct.value:[],n=Array.isArray(St.value)?St.value:[];return e==="timeline"?ur(t):dr(n)}function Za(){document.querySelectorAll("[data-view]").forEach(o=>{let i=o.dataset.view===Je.peek();o.classList.toggle("bg-primary/15",i),o.classList.toggle("text-primary",i),o.classList.toggle("font-medium",i),o.classList.toggle("text-base-content/50",!i)}),document.querySelectorAll("[data-agent-filter]").forEach(o=>{o.classList.toggle("active",o.dataset.agentFilter===de.peek())});let e=r("time-range");e&&e.value!==ls.peek()&&(e.value=ls.peek());let t=r("search-status");if(!t)return;let n=Be.peek(),s=Array.isArray(n?.results)?n.results:null,a=(me.peek()||"").trim();if(Ve.peek())t.classList.remove("hidden"),t.textContent="Searching content\u2026";else if(a&&s)t.classList.remove("hidden"),t.textContent=`${s.length} hit${s.length===1?"":"s"}${n.deep===!1?"":" (incl. content)"}`;else if(a)t.classList.remove("hidden"),t.textContent="Local filter only \u2014 type to deep-search";else{let o=ct.peek(),i=St.peek(),d=Array.isArray(o)?o.length:0,l=Array.isArray(i)?i.length:0;t.classList.remove("hidden"),t.textContent=Je.peek()==="projects"?`${l} project${l===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function Os(e){let t=(e||"").trim();if(!t){Be.value=null,Ve.value=!1;return}Ve.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});de.peek()&&de.peek()!=="all"&&n.set("agent",de.peek());let s=await y("GET",`/api/activity?${n}`);me.peek().trim()===t&&(Be.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){me.peek().trim()===t&&(Be.value={q:t.toLowerCase(),results:[],error:n.message})}finally{Ve.value=!1}}function Bs(e){clearTimeout(cr);let t=(e||"").trim();if(!t){Be.value=null,Ve.value=!1;return}cr=setTimeout(()=>Os(t),350)}function pr(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return marked.parse(String(e),{breaks:!0,gfm:!0})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function qs(){let e=r("memory-area");if(e){if(!f.sessionId){e.innerHTML='<div class="p-4 text-xs text-base-content/40">Open or resume a session to view its memory.</div>';return}e.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let t=f.agent||I.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await y("GET",`/api/sessions/${f.sessionId}/memory?${n}`)).files||[];if(!a.length){e.innerHTML='<div class="p-4 text-base-content/40 text-xs">No memory files available for this agent/session.</div>';return}e.innerHTML=`<div class="p-3 text-[11px] text-base-content/45">${p(t)} \xB7 ${a.length} memory file${a.length===1?"":"s"} \xB7 click to open</div>
453
+ <div class="px-3 pb-4 flex flex-col gap-1">${a.map(o=>`<button type="button" class="memory-file text-left px-3 py-2 rounded-lg border border-base-300 hover:border-primary hover:bg-primary/5" data-memory-file="${p(o.id)}" data-memory-agent="${p(t)}"><span class="font-mono text-xs">${p(o.name)}</span><span class="ml-2 text-[10px] text-base-content/40">${p(o.scope||"")}</span></button>`).join("")}<div id="memory-file-content"></div></div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${p(t?.message??String(t))}</div>`}}}async function eo(e,t){let n=r("memory-file-content");if(!(!n||!f.sessionId||!e)){n.innerHTML='<div class="p-3 text-xs text-base-content/40">Loading file\u2026</div>';try{let s=new URLSearchParams({agent:t||f.agent||I.peek()||"claude",file:e}),a=await y("GET",`/api/sessions/${f.sessionId}/memory/file?${s}`);n.innerHTML=`<div class="mt-2 border border-base-300 rounded-lg overflow-hidden"><div class="px-3 py-1.5 bg-base-300/50 text-xs font-mono">${p(a.name)}</div><div class="px-3 py-2 md">${pr(a.content)}</div></div>`}catch(s){n.innerHTML=`<div class="mt-2 p-3 text-error text-xs">${p(s?.message??String(s))}</div>`}}}var cr,Bt=U(()=>{R();B();ue();Ts();an();cr=null});function mr(e,t){Fs=e||"",Us=t||""}async function hr(e){let t=r("project-notes-bar");if(t)try{let n=await y("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);Fs=n.goal||"",Us=n.notes||"",$n(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function $n(){let e=r("project-notes-bar");if(!e)return;let t=Fs||"No goal yet \u2014 click Edit",n=Us||"";e.innerHTML=`
454
454
  <div class="flex items-start gap-2 w-full">
455
455
  <div class="flex-1 min-w-0">
456
456
  <div class="truncate">
@@ -461,7 +461,7 @@ ${t}`:"",n.length?n.join(`
461
461
  </div>
462
462
  <button id="btn-edit-project-notes" class="btn btn-ghost btn-xs px-1.5 hover:bg-base-300 flex-shrink-0">Edit</button>
463
463
  </div>
464
- `}function ur(){let e=i("project-notes-bar");e&&(e.innerHTML=`
464
+ `}function br(){let e=r("project-notes-bar");e&&(e.innerHTML=`
465
465
  <div class="flex flex-col gap-1.5 w-full">
466
466
  <div class="flex items-center gap-2">
467
467
  <span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0">Goal</span>
@@ -478,7 +478,7 @@ ${t}`:"",n.length?n.join(`
478
478
  <button id="btn-cancel-project-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
479
479
  </div>
480
480
  </div>
481
- `,i("project-goal-input")?.focus())}async function Jn(){try{let e=await y("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function Pe(){let e=i("session-notes-bar");if(!e)return;let t=f.sessionId,n=f.agent||I.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=Qt(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
481
+ `,r("project-goal-input")?.focus())}async function Vn(){try{let e=await y("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function He(){let e=r("session-notes-bar");if(!e)return;let t=f.sessionId,n=f.agent||I.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=Vt(n,t),a=(s.notes||"").trim(),o=!!s.favorite,i=!!s.hidden,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
482
482
  <div class="flex-1 min-w-0 flex items-center gap-2">
483
483
  <button type="button" class="session-fav-btn ${o?"is-fav":""}" data-fav-toggle="1"
484
484
  data-fav-session-id="${p(t)}" data-fav-session-agent="${p(n)}"
@@ -488,30 +488,30 @@ ${t}`:"",n.length?n.join(`
488
488
  title="${p(l)}">${p(l)}</span>
489
489
  <button type="button" class="session-rename-btn flex-shrink-0 opacity-70 hover:opacity-100"
490
490
  data-rename-bar="1" title="Rename session">\u270E</button>
491
- <button type="button" class="session-hide-btn flex-shrink-0 ${r?"is-hidden":""}"
491
+ <button type="button" class="session-hide-btn flex-shrink-0 ${i?"is-hidden":""}"
492
492
  data-hide-toggle="1"
493
493
  data-hide-session-id="${p(t)}"
494
494
  data-hide-session-agent="${p(n)}"
495
- title="${r?"Unhide session":"Hide session"}">${r?"\u{1F441}":"\u{1F648}"}</button>
495
+ title="${i?"Unhide session":"Hide session"}">${i?"\u{1F441}":"\u{1F648}"}</button>
496
496
  <span class="font-bold text-base-content/40 uppercase flex-shrink-0">Note:</span>
497
497
  <span class="truncate text-base-content/70 ${a?"":"italic text-base-content/40"}"
498
498
  id="session-notes-text" title="${p(a||"Add a note for this session")}">${p(a||"No session note")}</span>
499
499
  </div>
500
500
  <button id="btn-edit-session-notes" class="btn btn-ghost btn-xs px-1.5">Note</button>
501
- `}function pr(){let e=i("session-notes-bar");if(!e||!f.sessionId)return;let t=f.agent||I.peek()||"claude",n=Qt(t,f.sessionId);e.innerHTML=`
501
+ `}function gr(){let e=r("session-notes-bar");if(!e||!f.sessionId)return;let t=f.agent||I.peek()||"claude",n=Vt(t,f.sessionId);e.innerHTML=`
502
502
  <input id="session-notes-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
503
503
  placeholder="Note for this session\u2026" value="${p(n.notes||"")}">
504
504
  <button id="btn-save-session-notes" class="btn btn-primary btn-xs px-2">Save</button>
505
505
  <button id="btn-cancel-session-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
506
- `;let s=i("session-notes-input");s?.focus(),s?.select()}function Ws(){return{favorite:!1,notes:"",title:"",hidden:!1}}function Gs(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,updatedAt:Date.now()}}function fr(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()}async function mr(e,t,{machineId:n}={}){let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),r=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:r,updatedAt:Date.now()}};try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,favorite:r,machineId:s||void 0},void 0,{machineId:s||void 0});T.value={...T.peek(),[a]:Gs(o,{favorite:d.favorite??r,notes:d.notes,title:d.title,hidden:d.hidden})}}catch(d){T.value={...T.peek(),[a]:o},alert(`Favorite failed: ${d.message}`)}f.sessionId===e&&Pe()}async function hr(e,t,{machineId:n}={}){if(!e)return!1;let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),r=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:r,updatedAt:Date.now()}};try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:s||void 0},void 0,{machineId:s||void 0}),l=Gs(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??r});if(fr(l)){let c={...T.peek()};delete c[a],T.value=c}else T.value={...T.peek(),[a]:l}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return f.sessionId===e&&Pe(),!0}async function eo(e,t,n,{machineId:s}={}){let a=s||f.machineId||null,o=oe(t,e,a),r=T.peek()?.[o]||Ws();try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,notes:n,machineId:a||void 0},void 0,{machineId:a||void 0});T.value={...T.peek(),[o]:Gs(r,{favorite:d.favorite,notes:d.notes??n,title:d.title,hidden:d.hidden})}}catch(d){return alert(`Save note failed: ${d.message}`),!1}return!0}async function tc(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||f.machineId||null,o=oe(t,e,a),r=T.peek()?.[o]||Ws(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...r,title:d,updatedAt:Date.now()}};try{let l=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),c=Gs(r,{favorite:l.favorite,notes:l.notes,title:l.title!==void 0?l.title:d,hidden:l.hidden});if(fr(c)){let u={...T.peek()};delete u[o],T.value=u}else T.value={...T.peek(),[o]:c}}catch(l){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${l.message}`),!1}return f.sessionId===e&&Pe(),!0}function to({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(x=>{x.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(Qt(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,l=a.className;a.classList.add("session-rename-active"),a.innerHTML=`<input type="text" class="session-rename-input input input-xs input-bordered w-full min-w-0 text-xs font-mono"
507
- value="${p(r)}"
506
+ `;let s=r("session-notes-input");s?.focus(),s?.select()}function Ws(){return{favorite:!1,notes:"",title:"",hidden:!1}}function Gs(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,updatedAt:Date.now()}}function xr(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()}async function vr(e,t,{machineId:n}={}){let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),i=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:i,updatedAt:Date.now()}};try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,favorite:i,machineId:s||void 0},void 0,{machineId:s||void 0});T.value={...T.peek(),[a]:Gs(o,{favorite:d.favorite??i,notes:d.notes,title:d.title,hidden:d.hidden})}}catch(d){T.value={...T.peek(),[a]:o},alert(`Favorite failed: ${d.message}`)}f.sessionId===e&&He()}async function yr(e,t,{machineId:n}={}){if(!e)return!1;let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),i=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:i,updatedAt:Date.now()}};try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:i,machineId:s||void 0},void 0,{machineId:s||void 0}),l=Gs(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??i});if(xr(l)){let c={...T.peek()};delete c[a],T.value=c}else T.value={...T.peek(),[a]:l}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return f.sessionId===e&&He(),!0}async function to(e,t,n,{machineId:s}={}){let a=s||f.machineId||null,o=oe(t,e,a),i=T.peek()?.[o]||Ws();try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,notes:n,machineId:a||void 0},void 0,{machineId:a||void 0});T.value={...T.peek(),[o]:Gs(i,{favorite:d.favorite,notes:d.notes??n,title:d.title,hidden:d.hidden})}}catch(d){return alert(`Save note failed: ${d.message}`),!1}return!0}async function cc(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||f.machineId||null,o=oe(t,e,a),i=T.peek()?.[o]||Ws(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...i,title:d,updatedAt:Date.now()}};try{let l=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),c=Gs(i,{favorite:l.favorite,notes:l.notes,title:l.title!==void 0?l.title:d,hidden:l.hidden});if(xr(c)){let u={...T.peek()};delete u[o],T.value=u}else T.value={...T.peek(),[o]:c}}catch(l){return T.value={...T.peek(),[o]:i},alert(`Rename failed: ${l.message}`),!1}return f.sessionId===e&&He(),!0}function no({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(x=>{x.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let i=(Vt(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,l=a.className;a.classList.add("session-rename-active"),a.innerHTML=`<input type="text" class="session-rename-input input input-xs input-bordered w-full min-w-0 text-xs font-mono"
507
+ value="${p(i)}"
508
508
  placeholder="Session name (empty = original)"
509
509
  maxlength="200"
510
510
  data-rename-input="1"
511
511
  data-rename-session-id="${p(e)}"
512
512
  data-rename-session-agent="${p(t)}"
513
513
  data-rename-session-machine="${p(n||"")}"
514
- autocomplete="off" spellcheck="false" />`;let c=a.querySelector(".session-rename-input");if(!c)return;let u=!1,h=async x=>{if(u)return;u=!0;let v=x?c.value:r;if(a.className=l,!x){a.innerHTML=d;return}await tc(e,t,v,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(C=>C.remove()),f.sessionId===e&&Pe(),T.value={...T.peek()}};c.addEventListener("keydown",x=>{x.stopPropagation(),x.key==="Enter"?(x.preventDefault(),h(!0)):x.key==="Escape"&&(x.preventDefault(),h(!1))}),c.addEventListener("click",x=>x.stopPropagation()),c.addEventListener("mousedown",x=>x.stopPropagation()),c.addEventListener("session-rename-cancel",()=>h(!1)),c.addEventListener("blur",()=>{setTimeout(()=>h(!0),0)}),requestAnimationFrame(()=>{c.focus(),c.select()})}var Fs,Us,Qn=K(()=>{R();B();ue();Fs="",Us=""});var xr={};as(xr,{closeMachineMenu:()=>Ut,enterMachine:()=>so,hideMachinePicker:()=>zs,refreshMachinesList:()=>qt,renderMachineMenuList:()=>Vn,renderMachinePickerList:()=>Ks,showMachinePicker:()=>Ft,startMachinePolling:()=>no,syncTopbarMachine:()=>gt});async function qt(){try{let e=await y("GET","/api/machines");Q.value=Array.isArray(e)?e:[]}catch{try{let e=await Yt();e?.machines&&(Q.value=e.machines)}catch{}}return Q.peek()||[]}function Ks(){let e=i("machine-picker-list"),t=i("machine-picker-empty");if(!e)return;let n=Q.peek()||[];if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(s=>{let a=s.online!==!1,o=[s.hostname,s.platform].filter(Boolean).join(" \xB7 ");return`
514
+ autocomplete="off" spellcheck="false" />`;let c=a.querySelector(".session-rename-input");if(!c)return;let u=!1,h=async x=>{if(u)return;u=!0;let v=x?c.value:i;if(a.className=l,!x){a.innerHTML=d;return}await cc(e,t,v,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(C=>C.remove()),f.sessionId===e&&He(),T.value={...T.peek()}};c.addEventListener("keydown",x=>{x.stopPropagation(),x.key==="Enter"?(x.preventDefault(),h(!0)):x.key==="Escape"&&(x.preventDefault(),h(!1))}),c.addEventListener("click",x=>x.stopPropagation()),c.addEventListener("mousedown",x=>x.stopPropagation()),c.addEventListener("session-rename-cancel",()=>h(!1)),c.addEventListener("blur",()=>{setTimeout(()=>h(!0),0)}),requestAnimationFrame(()=>{c.focus(),c.select()})}var Fs,Us,Qn=U(()=>{R();B();ue();Fs="",Us=""});var $r={};os($r,{closeMachineMenu:()=>Ut,enterMachine:()=>ao,hideMachinePicker:()=>Ks,refreshMachinesList:()=>qt,renderMachineMenuList:()=>Yn,renderMachinePickerList:()=>zs,showMachinePicker:()=>Ft,startMachinePolling:()=>so,syncTopbarMachine:()=>gt});async function qt(){try{let e=await y("GET","/api/machines");V.value=Array.isArray(e)?e:[]}catch{try{let e=await Yt();e?.machines&&(V.value=e.machines)}catch{}}return V.peek()||[]}function zs(){let e=r("machine-picker-list"),t=r("machine-picker-empty");if(!e)return;let n=V.peek()||[];if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(s=>{let a=s.online!==!1,o=[s.hostname,s.platform].filter(Boolean).join(" \xB7 ");return`
515
515
  <button type="button" class="machine-pick-card w-full text-left px-4 py-3 rounded-xl border border-base-300
516
516
  hover:border-primary hover:bg-primary/5 transition-colors ${a?"":"opacity-50"}"
517
517
  data-pick-machine="${p(s.id)}" ${a?"":"disabled"}>
@@ -520,22 +520,22 @@ ${t}`:"",n.length?n.join(`
520
520
  <span class="font-semibold text-sm font-mono">${p(s.id)}</span>
521
521
  </div>
522
522
  ${o?`<div class="text-xs text-base-content/45 mt-1 pl-4">${p(o)}</div>`:""}
523
- </button>`}).join("")}function Ft(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),xe(),Be.value=!1,Ks();let t=i("machine-picker-status");if(t){let n=(Q.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function zs(){i("machine-picker")?.classList.add("hidden"),xe(),Be.value=!0}function Ut(){i("machine-menu")?.classList.add("hidden")}function Vn(){let e=i("machine-menu-list"),t=i("machine-menu-empty");if(!e)return;let n=Q.peek()||[],s=j.peek()||"";if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(a=>{let o=a.online!==!1,r=a.id===s,d=[a.hostname,a.platform].filter(Boolean).join(" \xB7 "),l=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
523
+ </button>`}).join("")}function Ft(){let e=r("machine-picker");if(!e)return;e.classList.remove("hidden"),xe(),qe.value=!1,zs();let t=r("machine-picker-status");if(t){let n=(V.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function Ks(){r("machine-picker")?.classList.add("hidden"),xe(),qe.value=!0}function Ut(){r("machine-menu")?.classList.add("hidden")}function Yn(){let e=r("machine-menu-list"),t=r("machine-menu-empty");if(!e)return;let n=V.peek()||[],s=j.peek()||"";if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(a=>{let o=a.online!==!1,i=a.id===s,d=[a.hostname,a.platform].filter(Boolean).join(" \xB7 "),l=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
524
524
  <button type="button"
525
525
  class="machine-menu-item w-full text-left px-2 py-1.5 rounded-md text-xs
526
- ${r?"bg-primary/15 text-primary":"hover:bg-base-200"}
526
+ ${i?"bg-primary/15 text-primary":"hover:bg-base-200"}
527
527
  ${o?"":"opacity-50"}"
528
528
  data-pick-machine="${p(a.id)}"
529
529
  ${o?"":"disabled"}>
530
530
  <div class="flex items-center gap-1.5">
531
531
  <span class="w-1.5 h-1.5 rounded-full flex-shrink-0 ${o?"bg-success":"bg-error"}"></span>
532
532
  <span class="font-mono font-semibold truncate flex-1">${p(a.id)}</span>
533
- ${r?'<span class="text-[9px] opacity-70">\u5F53\u524D</span>':""}
533
+ ${i?'<span class="text-[9px] opacity-70">\u5F53\u524D</span>':""}
534
534
  <span class="text-[9px] ${o?"text-success":"text-error"}">${o?"online":"offline"}</span>
535
535
  </div>
536
536
  ${d||l?`<div class="text-[10px] text-base-content/40 pl-3.5 mt-0.5 truncate">${p(d)}${l?" \xB7 "+p(l):""}</div>`:""}
537
- </button>`}).join("")}function gt(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!A.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=j.peek()||"",o=(Q.peek()||[]).find(d=>d.id===s),r=o?o.online!==!1:!1;t&&(t.textContent=s||"\u9009\u62E9\u673A\u5668"),n&&(n.classList.toggle("bg-success",!!s&&r),n.classList.toggle("bg-warning",!!s&&!r),n.classList.toggle("bg-base-content/30",!s)),Vn()}function no(){br||(br=setInterval(async()=>{if(!A.peek()||!f.token)return;await qt(),gt();let e=j.peek();if(e){let t=(Q.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=i("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3)),gr||(gr=setInterval(()=>{document.visibilityState!=="visible"||!A.peek()||!f.token||!j.peek()||Ne({waitFresh:!1,hubIndex:!0}).catch(()=>{})},2e3))}async function so(e,{forceReload:t=!1}={}){if(!e)return;let n=j.peek(),s=n&&n!==e;if(ge(e),zs(),Ut(),gt(),s||t){try{f.ws?.close()}catch{}f.ws=null,f.sessionId=null,ae(()=>{E.value=null,fe.value=null,re.value=null});try{let{filesRoot:o,gitRoot:r,filesPath:d}=await Promise.resolve().then(()=>(B(),No));o.value="",r.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(Xn(),vr));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Gn(),await Promise.all([Ne(),yn(),Jn(),wn().catch(()=>{})]),Be.value=!0}var br,gr,Yn=K(()=>{R();B();ue();Bt();Qn();Kn();en();br=null,gr=null});var vr={};as(vr,{goHome:()=>Vs,openProject:()=>ao,resumeSession:()=>He,switchTab:()=>it});function Qs(e){for(let t of["files-machine-hint","git-machine-hint"]){let n=i(t);n&&(e?(n.textContent=`@${e}`,n.classList.remove("hidden"),n.title=`Paths are on machine ${e}`):(n.textContent="",n.classList.add("hidden"),n.title=""))}}function ao(e){cn(),un(),fn(),pn();let t=e?.path||"";ae(()=>{E.value=e,fe.value=t,t&&(ce.value=t,be.value=t,z.value="",re.value=null)}),f.sessionId=null,i("topbar-project").textContent=t||"Project";let n=i("files-root-input");n&&t&&(n.value=t);let s=i("git-root-input");s&&t&&(s.value=t),Qs(e?.machineId||j.peek()||f.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",mn(),dn({sessionId:null}),st(),it("chat")}function Vs(){cn(),un(),fn(),pn(),E.value=null,fe.value=null,ce.value="",be.value="",z.value="",re.value=null,f.sessionId=null,dn({sessionId:null}),Qs(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session");let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",Rt(Ht()));let n=i("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),Pa("/")}async function He(e,t,n,s,a,o={}){let r=o.tab&&["chat","files","git","shell","memory"].includes(o.tab)?o.tab:"chat",d=o.skipHistory??(r!=="chat"&&r!=="memory"),l=O.peek().find(S=>S.sessionId===e&&(!a||S.machineId===a||!S.machineId)),c=Et(),u=c?.sessionId===e?c:null,h=s||l?.agent||u?.agent||"claude",x=a||l?.machineId||u?.machineId||j.peek()||null,v=t||l?.cwd||u?.cwd||null,C=n||l?.configDir||u?.configDir||null;if(cn(),un(),fn(),pn(),x&&x!==f.machineId){ge(x);try{f.ws?.close()}catch{}f.ws=null,Promise.resolve().then(()=>(Yn(),xr)).then(({syncTopbarMachine:S})=>S()).catch(()=>{}),Promise.resolve().then(()=>(Bt(),lr)).then(({loadAllSessions:S})=>S()).catch(()=>{})}f.sessionId=e,f.configDir=C,f.agent=h,Fe(h),_e(),dn({sessionId:e,agent:h,machineId:x});let F=v;yr(F,x,e),st(),F&&y("POST","/api/resolve-path",{path:F},void 0,{machineId:x||void 0}).then(S=>{f.sessionId!==e||!S?.path||S.path===F||(F=S.path,yr(F,x,e),ka({sessionId:e,cwd:F}))}).catch(()=>{}),mn(),it(r);{let S=O.peek();O.value=Array.isArray(S)?[...S]:[]}ka({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,tab:r}),Xi({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,display:l?.display||u?.display||"",projectName:l?.projectName||u?.projectName||"",updatedAt:l?.updatedAt||u?.updatedAt||null});let ke=te[h]||h,J=`${x||""}:${h}:${e}`,ne=(S,_,se={})=>{if(f.sessionId!==e)return;if(i("messages").innerHTML="",!S.length){L(`${ke} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`);return}De();let M=40,V=0,rt=()=>{if(f.sessionId!==e)return;let xt=Math.min(V+M,S.length);for(;V<xt;V++){let b=S[V],w=q(b.ts??b.timestamp),k=b.type||(b.role?"text":null);if(k==="text"||b.role&&b.content!=null&&!b.name){(b.role==="assistant"||b.role==="user")&&De();let W=typeof b.content=="string"?b.content:Array.isArray(b.content)?b.content.map(Y=>Y?.text||"").filter(Boolean).join(`
538
- `):String(b.content??"");W&&At(b.role==="user"?"user":"assistant",b.role==="user"?"You":ke,W,{ts:w})}else k==="tool_use"||b.name?ja({name:b.name||"tool",input:b.input??b.arguments??{}},{ts:w}):(k==="token_usage"||b.usage)&&(De(),ln(b.usage||b))}if(V<S.length){requestAnimationFrame(rt);return}De(),_&&Aa(_);let vt=S.filter(b=>b.type==="token_usage").length||S.filter(b=>b.role==="user").length,m=se.truncated?` (showing last ${S.length} of ${se.total||"?"})`:"";L(`\u2500\u2500 ${ke} history \xB7 ${vt} turn${vt!==1?"s":""}${m} \u2500\u2500`)};rt()},N=async()=>{let S=Js.get(J);if(S&&S.msgs?.length&&Date.now()-S.at<nc){ne(S.msgs,S.context,S.meta);return}L(`Loading ${ke} history\u2026`);try{let _=x||j.peek()||f.machineId||null;if(A.peek()&&!_)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");_&&f.machineId!==_&&ge(_);let se=async vt=>{let m=new URLSearchParams({tail:"0",compact:"1",cache:"prefer"});return vt&&m.set("agent",vt),_&&m.set("machine",_),y("GET",`/api/sessions/${e}/messages?${m}`,void 0,void 0,{machineId:_||void 0,dedupe:!1})},M=await se(h),V=Array.isArray(M)?M:M?.messages||[];!V.length&&h&&(M=await se(null),V=Array.isArray(M)?M:M?.messages||[]);let rt=Array.isArray(M)?null:M?.context||null,xt=Array.isArray(M)?{}:{truncated:M?.truncated,total:M?.total};V.length?Js.set(J,{msgs:V,context:rt,meta:xt,at:Date.now()}):Js.delete(J),ne(V,rt,xt)}catch(_){if(f.sessionId!==e)return;Js.delete(J),i("messages").innerHTML="",L(`${ke} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${_.message})`)}};d?N().catch(()=>{}):(await new Promise(S=>requestAnimationFrame(S)),N().catch(()=>{})),Bn(),Pe()}function yr(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;ae(()=>{E.value={id:s,name:s,path:e,machineId:t},fe.value=e,ce.value=e,be.value=e,z.value="",re.value=null}),i("topbar-project").textContent=t?`${e} @${t}`:e;let a=i("files-root-input");a&&(a.value=e);let o=i("git-root-input");o&&(o.value=e),Qs(t),i("welcome")?.classList.add("hidden");let r=i("project-view");r&&(r.classList.remove("hidden"),r.style.display="flex",r.style.flexDirection="column",r.style.flex="1",r.style.minHeight="0",r.style.overflow="hidden")}else{i("welcome")?.classList.add("hidden");let s=i("project-view");s&&(s.classList.remove("hidden"),s.style.display="flex",s.style.flexDirection="column",s.style.flex="1",s.style.minHeight="0"),Qs(t)}}function it(e){U.value=e}var Js,nc,Xn=K(()=>{R();B();ue();ds();hn();Ss();Bt();Qn();Qa();Js=new Map,nc=180*1e3});B();ue();R();B();ue();var Xt=null;function Oo(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function Yr(e){let t=String(e||"").replace(/^\[|\]$/g,"");return!!(/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||t.includes(":")&&/^[0-9a-f:]+$/i.test(t))}function Xr(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:Yr(e)?!1:location.protocol==="https:"}function Bo(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function qo(){Oo()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),Xt=n,document.dispatchEvent(new CustomEvent("pwa-installable")),Bo()}),window.addEventListener("appinstalled",()=>{Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!Oo()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>Bo()),!Xr()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js",{scope:"/"}).then(n=>{n.addEventListener("updatefound",()=>{let s=n.installing;s&&s.addEventListener("statechange",()=>{s.state==="installed"&&navigator.serviceWorker.controller&&console.info("[pwa] New version ready \u2014 reload to apply")})})}).catch(()=>{navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{})})};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,0))}async function Fo(){if(!Xt)return!1;Xt.prompt();let e=await Xt.userChoice.catch(()=>null);return Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}en();ds();hn();Ss();R();ue();B();Ts();function Mi(){document.getElementById("root").insertAdjacentHTML("beforeend",`
537
+ </button>`}).join("")}function gt(){let e=r("machine-menu-wrap"),t=r("topbar-machine-label"),n=r("topbar-machine-dot");if(!A.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=j.peek()||"",o=(V.peek()||[]).find(d=>d.id===s),i=o?o.online!==!1:!1;t&&(t.textContent=s||"\u9009\u62E9\u673A\u5668"),n&&(n.classList.toggle("bg-success",!!s&&i),n.classList.toggle("bg-warning",!!s&&!i),n.classList.toggle("bg-base-content/30",!s)),Yn()}function so(){wr||(wr=setInterval(async()=>{if(!A.peek()||!f.token)return;await qt(),gt();let e=j.peek();if(e){let t=(V.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=r("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3)),kr||(kr=setInterval(()=>{document.visibilityState!=="visible"||!A.peek()||!f.token||!j.peek()||_e({waitFresh:!1,hubIndex:!0}).catch(()=>{})},2e3))}async function ao(e,{forceReload:t=!1}={}){if(!e)return;let n=j.peek(),s=n&&n!==e;if(ge(e),Ks(),Ut(),gt(),s||t){try{f.ws?.close()}catch{}f.ws=null,f.sessionId=null,ae(()=>{E.value=null,fe.value=null,re.value=null});try{let{filesRoot:o,gitRoot:i,filesPath:d}=await Promise.resolve().then(()=>(B(),_o));o.value="",i.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(Zn(),Sr));o()}}let a=r("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),zn(),await Promise.all([_e(),wn(),Vn(),kn().catch(()=>{})]),qe.value=!0}var wr,kr,Xn=U(()=>{R();B();ue();Bt();Qn();Kn();en();wr=null,kr=null});var Sr={};os(Sr,{goHome:()=>Qs,openProject:()=>oo,resumeSession:()=>Re,switchTab:()=>it});function Vs(e){for(let t of["files-machine-hint","git-machine-hint"]){let n=r(t);n&&(e?(n.textContent=`@${e}`,n.classList.remove("hidden"),n.title=`Paths are on machine ${e}`):(n.textContent="",n.classList.add("hidden"),n.title=""))}}function oo(e){dn(),pn(),mn(),fn();let t=e?.path||"";ae(()=>{E.value=e,fe.value=t,t&&(ce.value=t,be.value=t,K.value="",re.value=null)}),f.sessionId=null,r("topbar-project").textContent=t||"Project";let n=r("files-root-input");n&&t&&(n.value=t);let s=r("git-root-input");s&&t&&(s.value=t),Vs(e?.machineId||j.peek()||f.machineId),r("welcome").classList.add("hidden");let a=r("project-view");a.classList.remove("hidden"),a.style.display="flex",hn(),un({sessionId:null}),st(),it("chat")}function Qs(){dn(),pn(),mn(),fn(),E.value=null,fe.value=null,ce.value="",be.value="",K.value="",re.value=null,f.sessionId=null,un({sessionId:null}),Vs(null),document.documentElement.classList.remove("boot-restore");let e=r("topbar-project");e&&(e.textContent="Select a session");let t=r("welcome");t&&(t.classList.remove("hidden"),t.style.display="",Rt(Ht()));let n=r("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),Ha("/")}async function Re(e,t,n,s,a,o={}){let i=o.tab&&["chat","files","git","shell","memory"].includes(o.tab)?o.tab:"chat",d=o.skipHistory??(i!=="chat"&&i!=="memory"),l=O.peek().find(S=>S.sessionId===e&&(!a||S.machineId===a||!S.machineId)),c=Et(),u=c?.sessionId===e?c:null,h=s||l?.agent||u?.agent||"claude",x=a||l?.machineId||u?.machineId||j.peek()||null,v=t||l?.cwd||u?.cwd||null,C=n||l?.configDir||u?.configDir||null;if(dn(),pn(),mn(),fn(),x&&x!==f.machineId){ge(x);try{f.ws?.close()}catch{}f.ws=null,Promise.resolve().then(()=>(Xn(),$r)).then(({syncTopbarMachine:S})=>S()).catch(()=>{}),Promise.resolve().then(()=>(Bt(),fr)).then(({loadAllSessions:S})=>S()).catch(()=>{})}f.sessionId=e,f.configDir=C,f.agent=h,Ue(h),Pe(),un({sessionId:e,agent:h,machineId:x});let F=v;Lr(F,x,e),st(),F&&y("POST","/api/resolve-path",{path:F},void 0,{machineId:x||void 0}).then(S=>{f.sessionId!==e||!S?.path||S.path===F||(F=S.path,Lr(F,x,e),ka({sessionId:e,cwd:F}))}).catch(()=>{}),hn(),it(i);{let S=O.peek();O.value=Array.isArray(S)?[...S]:[]}ka({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,tab:i}),sr({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,display:l?.display||u?.display||"",projectName:l?.projectName||u?.projectName||"",updatedAt:l?.updatedAt||u?.updatedAt||null});let ke=te[h]||h,J=`${x||""}:${h}:${e}`,ne=(S,_,se={})=>{if(f.sessionId!==e)return;if(r("messages").innerHTML="",!S.length){L(`${ke} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`);return}Ne();let M=40,Q=0,rt=()=>{if(f.sessionId!==e)return;let xt=Math.min(Q+M,S.length);for(;Q<xt;Q++){let b=S[Q],w=q(b.ts??b.timestamp),k=b.type||(b.role?"text":null);if(k==="text"||b.role&&b.content!=null&&!b.name){(b.role==="assistant"||b.role==="user")&&Ne();let G=typeof b.content=="string"?b.content:Array.isArray(b.content)?b.content.map(Y=>Y?.text||"").filter(Boolean).join(`
538
+ `):String(b.content??"");G&&At(b.role==="user"?"user":"assistant",b.role==="user"?"You":ke,G,{ts:w})}else k==="tool_use"||b.name?Da({name:b.name||"tool",input:b.input??b.arguments??{}},{ts:w}):(k==="token_usage"||b.usage)&&(Ne(),cn(b.usage||b))}if(Q<S.length){requestAnimationFrame(rt);return}Ne(),_&&ja(_);let vt=S.filter(b=>b.type==="token_usage").length||S.filter(b=>b.role==="user").length,m=se.truncated?` (showing last ${S.length} of ${se.total||"?"})`:"";L(`\u2500\u2500 ${ke} history \xB7 ${vt} turn${vt!==1?"s":""}${m} \u2500\u2500`)};rt()},N=async()=>{let S=Js.get(J);if(S&&S.msgs?.length&&Date.now()-S.at<dc){ne(S.msgs,S.context,S.meta);return}L(`Loading ${ke} history\u2026`);try{let _=x||j.peek()||f.machineId||null;if(A.peek()&&!_)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");_&&f.machineId!==_&&ge(_);let se=async vt=>{let m=new URLSearchParams({tail:"0",compact:"1",cache:"prefer"});return vt&&m.set("agent",vt),_&&m.set("machine",_),y("GET",`/api/sessions/${e}/messages?${m}`,void 0,void 0,{machineId:_||void 0,dedupe:!1})},M=await se(h),Q=Array.isArray(M)?M:M?.messages||[];!Q.length&&h&&(M=await se(null),Q=Array.isArray(M)?M:M?.messages||[]);let rt=Array.isArray(M)?null:M?.context||null,xt=Array.isArray(M)?{}:{truncated:M?.truncated,total:M?.total};Q.length?Js.set(J,{msgs:Q,context:rt,meta:xt,at:Date.now()}):Js.delete(J),ne(Q,rt,xt)}catch(_){if(f.sessionId!==e)return;Js.delete(J),r("messages").innerHTML="",L(`${ke} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${_.message})`)}};d?N().catch(()=>{}):(await new Promise(S=>requestAnimationFrame(S)),N().catch(()=>{})),qn(),He()}function Lr(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;ae(()=>{E.value={id:s,name:s,path:e,machineId:t},fe.value=e,ce.value=e,be.value=e,K.value="",re.value=null}),r("topbar-project").textContent=t?`${e} @${t}`:e;let a=r("files-root-input");a&&(a.value=e);let o=r("git-root-input");o&&(o.value=e),Vs(t),r("welcome")?.classList.add("hidden");let i=r("project-view");i&&(i.classList.remove("hidden"),i.style.display="flex",i.style.flexDirection="column",i.style.flex="1",i.style.minHeight="0",i.style.overflow="hidden")}else{r("welcome")?.classList.add("hidden");let s=r("project-view");s&&(s.classList.remove("hidden"),s.style.display="flex",s.style.flexDirection="column",s.style.flex="1",s.style.minHeight="0"),Vs(t)}}function it(e){W.value=e}var Js,dc,Zn=U(()=>{R();B();ue();us();bn();Ss();Bt();Qn();Qa();Js=new Map,dc=180*1e3});B();ue();R();B();ue();var Xt=null;function Bo(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function nl(e){let t=String(e||"").replace(/^\[|\]$/g,"");return!!(/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||t.includes(":")&&/^[0-9a-f:]+$/i.test(t))}function sl(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:nl(e)?!1:location.protocol==="https:"}function qo(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function Fo(){Bo()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),Xt=n,document.dispatchEvent(new CustomEvent("pwa-installable")),qo()}),window.addEventListener("appinstalled",()=>{Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!Bo()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>qo()),!sl()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js",{scope:"/"}).then(n=>{n.addEventListener("updatefound",()=>{let s=n.installing;s&&s.addEventListener("statechange",()=>{s.state==="installed"&&navigator.serviceWorker.controller&&console.info("[pwa] New version ready \u2014 reload to apply")})})}).catch(()=>{navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{})})};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,0))}async function Uo(){if(!Xt)return!1;Xt.prompt();let e=await Xt.userChoice.catch(()=>null);return Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}en();us();bn();Ss();R();ue();B();Ts();function Di(){document.getElementById("root").insertAdjacentHTML("beforeend",`
539
539
  <dialog id="modal-settings" class="modal">
540
540
  <div class="modal-box max-w-lg">
541
541
  <h3 class="font-bold text-base mb-4">Settings</h3>
@@ -573,14 +573,14 @@ ${t}`:"",n.length?n.join(`
573
573
  </div>
574
574
  </div>
575
575
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
576
- </dialog>`),Ms(),document.getElementById("ws-add-btn").addEventListener("click",Ha),document.getElementById("ws-new-name").addEventListener("keydown",e=>{e.key==="Enter"&&Ha()}),document.getElementById("ws-new-dir").addEventListener("keydown",e=>{e.key==="Enter"&&Ha()}),document.getElementById("mcp-token-generate").addEventListener("click",Hl),document.getElementById("mcp-token-copy").addEventListener("click",Rl)}function Ms(){let e=i("ws-list");if(!e)return;let t=ee.peek();if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">No workspaces configured</div>';return}e.innerHTML=t.map(n=>`
576
+ </dialog>`),Ms(),document.getElementById("ws-add-btn").addEventListener("click",Ra),document.getElementById("ws-new-name").addEventListener("keydown",e=>{e.key==="Enter"&&Ra()}),document.getElementById("ws-new-dir").addEventListener("keydown",e=>{e.key==="Enter"&&Ra()}),document.getElementById("mcp-token-generate").addEventListener("click",Gl),document.getElementById("mcp-token-copy").addEventListener("click",zl)}function Ms(){let e=r("ws-list");if(!e)return;let t=ee.peek();if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">No workspaces configured</div>';return}e.innerHTML=t.map(n=>`
577
577
  <div class="flex items-center gap-2 px-3 py-2 bg-base-200 rounded-lg">
578
578
  <div class="flex-1 min-w-0">
579
579
  <div class="text-sm font-medium">${p(n.name)}</div>
580
580
  <div class="text-xs font-mono text-base-content/50 truncate">${p(n.configDir)}</div>
581
581
  </div>
582
582
  ${t.length>1?`<button class="btn btn-ghost btn-xs text-error" data-ws-delete="${p(n.id)}">\u2715</button>`:'<span class="text-[10px] text-base-content/30">default</span>'}
583
- </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>Pl(n.dataset.wsDelete))})}async function Ha(){let e=i("ws-new-name").value.trim(),t=i("ws-new-dir").value.trim(),n=i("ws-error");if(n.classList.add("hidden"),!e||!t){n.textContent="Name and path are required",n.classList.remove("hidden");return}try{let s=await y("POST","/api/workspaces",{name:e,configDir:t});ee.value=[...ee.peek(),s],qn(ee.peek()),i("ws-new-name").value="",i("ws-new-dir").value="",Ms()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function Pl(e){try{await y("DELETE",`/api/workspaces/${e}`),ee.value=ee.peek().filter(t=>t.id!==e),qn(ee.peek()),Ms()}catch(t){alert(t.message)}}function Ra(){Ms();let e=i("mcp-token-settings");e&&(e.style.display=A.peek()?"":"none"),i("modal-settings")?.showModal()}async function Hl(){let e=i("mcp-token-result"),t=i("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=j.peek();if(!n){t.textContent="\u8BF7\u9009\u62E9\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u540E\u518D\u751F\u6210 Token\u3002",t.classList.remove("hidden");return}try{let s=Number(i("mcp-token-expiry").value),a=await y("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});i("mcp-token-value").value=a.token||"",e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function Rl(){let e=i("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{i("mcp-token-value")?.select(),document.execCommand("copy")}}Kn();La();B();var Wi=()=>`
583
+ </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>Wl(n.dataset.wsDelete))})}async function Ra(){let e=r("ws-new-name").value.trim(),t=r("ws-new-dir").value.trim(),n=r("ws-error");if(n.classList.add("hidden"),!e||!t){n.textContent="Name and path are required",n.classList.remove("hidden");return}try{let s=await y("POST","/api/workspaces",{name:e,configDir:t});ee.value=[...ee.peek(),s],Fn(ee.peek()),r("ws-new-name").value="",r("ws-new-dir").value="",Ms()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function Wl(e){try{await y("DELETE",`/api/workspaces/${e}`),ee.value=ee.peek().filter(t=>t.id!==e),Fn(ee.peek()),Ms()}catch(t){alert(t.message)}}function Oa(){Ms();let e=r("mcp-token-settings");e&&(e.style.display=A.peek()?"":"none"),r("modal-settings")?.showModal()}async function Gl(){let e=r("mcp-token-result"),t=r("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=j.peek();if(!n){t.textContent="\u8BF7\u9009\u62E9\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u540E\u518D\u751F\u6210 Token\u3002",t.classList.remove("hidden");return}try{let s=Number(r("mcp-token-expiry").value),a=await y("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});r("mcp-token-value").value=a.token||"",e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function zl(){let e=r("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{r("mcp-token-value")?.select(),document.execCommand("copy")}}Kn();La();B();var Vi=()=>`
584
584
  <div id="auth-screen" class="${f.token?"hidden":""} flex items-center justify-center h-full p-4" ${f.token?'style="display:none"':""}>
585
585
  <div class="card bg-base-200 border border-base-300 w-full max-w-sm shadow-xl">
586
586
  <div class="card-body gap-3 p-8">
@@ -600,7 +600,7 @@ ${t}`:"",n.length?n.join(`
600
600
  <div id="auth-error" class="alert alert-error text-xs py-2 hidden"></div>
601
601
  </div>
602
602
  </div>
603
- </div>`,Gi=(e={})=>{let t=!!e.restoreSession,n=f.token?"":"hidden",s=f.token?"display:flex":"display:none";return`
603
+ </div>`,Qi=(e={})=>{let t=!!e.restoreSession,n=f.token?"":"hidden",s=f.token?"display:flex":"display:none";return`
604
604
  <div id="sidebar-overlay" class="hidden fixed inset-0 bg-black/50 z-[9]" aria-hidden="true"></div>
605
605
  <div id="app" class="${n} flex-col flex-1 overflow-hidden" style="${s}">
606
606
  <div id="topbar" class="flex items-center gap-2 px-3 bg-base-200 border-b border-base-300 flex-shrink-0" style="height:44px">
@@ -642,7 +642,6 @@ ${t}`:"",n.length?n.join(`
642
642
  <span id="conn-dot" class="w-2 h-2 rounded-full bg-base-content/30 flex-shrink-0" title="\u8FDE\u63A5\u72B6\u6001"></span>
643
643
  <div class="flex gap-2 topbar-actions">
644
644
  <button id="btn-share-session" class="btn btn-ghost btn-xs border border-base-300" title="\u590D\u5236\u5F53\u524D\u4F1A\u8BDD\u5206\u4EAB\u94FE\u63A5">\u5206\u4EAB</button>
645
- <button id="btn-refresh-conn" class="btn btn-ghost btn-xs border border-base-300" title="\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65">\u21BB</button>
646
645
  <button id="btn-pwa-install" class="btn btn-ghost btn-xs border border-base-300 hidden" title="\u5B89\u88C5\u5230\u4E3B\u5C4F\u5E55">\u5B89\u88C5</button>
647
646
  <button id="btn-meta-agent" class="btn btn-ghost btn-xs border border-primary/40 text-primary topbar-icon-btn" title="Meta Agent \u2014 \u62A5\u544A / \u95EE\u7B54 / VLM" aria-label="\u6253\u5F00 Meta Agent">
648
647
  <svg class="topbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="m12 2 1.6 6.4L20 10l-6.4 1.6L12 18l-1.6-6.4L4 10l6.4-1.6L12 2Z"/><path d="m19 16 .7 2.3L22 19l-2.3.7L19 22l-.7-2.3L16 19l2.3-.7L19 16Z"/></svg><span class="topbar-icon-label">Agent</span>
@@ -997,7 +996,7 @@ ${t}`:"",n.length?n.join(`
997
996
  </div>
998
997
  </div>
999
998
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
1000
- </dialog>`};Qa();Bt();Xn();R();B();ue();Ts();ds();Bt();Qn();Kn();Xn();Yn();en();async function Ys(e={}){i("auth-screen").style.display="none";let t=i("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(xe);let n=e.hub;n===void 0?n=await Yt():n?(A.value=!0,n.machines&&(Q.value=n.machines)):A.value=!1;let s=e.deepLink||null,a=Et();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=i("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let l=i("project-view");l&&(l.classList.remove("hidden"),l.style.display="flex",l.style.flexDirection="column",l.style.flex="1",l.style.minHeight="0")}if(A.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(ge(d),zs(),Be.value=!0,Gn());let l=qt().then(h=>(gt(),d&&!h.some(v=>v.id===d&&v.online!==!1)&&h.length&&(h.some(C=>C.id===d)||(ge(null),Ft())),h));no(),gt();let c=Promise.all([Ne({waitFresh:!1}),yn({waitFresh:!1}),Jn().catch(()=>{}),wn().catch(()=>{})]);if(s?.id){let h=O.peek().find(x=>x.sessionId===s.id)||(a?.sessionId===s.id?a:null);await He(s.id,h?.cwd||null,h?.configDir||null,s.agent||h?.agent||null,s.machineId||h?.machineId||d||null,{tab:s.tab||"chat"}),l.catch(()=>{}),c.catch(()=>{});return}if(!d){if(await l,!(Q.peek()||[]).length){Ft(),c.catch(()=>{});return}Ft(),c.catch(()=>{});return}await c;let u=i("topbar-project");u&&u.textContent==="Select a session"&&(u.textContent=`Machine \xB7 ${d}`);return}Gn();let r=Promise.all([Ne({waitFresh:!1}),yn({waitFresh:!1}),Jn().catch(()=>{}),wn().catch(()=>{})]);if(s?.id){await Es().then(l=>{Array.isArray(l)?O.value=l:l&&Array.isArray(l.sessions)&&(O.value=l.sessions)}).catch(()=>{});let d=O.peek().find(l=>l.sessionId===s.id)||(a?.sessionId===s.id?a:null);await He(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),r.catch(()=>{});return}await r}Qn();Yn();R();B();ue();hn();Bt();Xn();Yn();en();function wr(){let e=i("sidebar");e&&(e.classList.add("open"),i("sidebar-overlay").classList.remove("hidden"),i("hamburger")?.setAttribute("aria-expanded","true"),xe(),setTimeout(()=>i("session-search")?.focus({preventScroll:!0}),180))}function Zn(){let e=i("sidebar");e&&(e.classList.remove("open"),i("sidebar-overlay").classList.add("hidden"),i("hamburger")?.setAttribute("aria-expanded","false"),xe(),i("hamburger")?.focus({preventScroll:!0}))}function kr(){window.innerWidth<=640&&Zn()}function $r(){let e=i("sidebar-toggle"),t=i("sidebar");if(!e||!t)return;let n=localStorage.getItem("sidebarCollapsed")==="1",s=localStorage.getItem("sidebarWidth")||t.style.width||"280px",a=()=>{t.classList.toggle("desktop-collapsed",n),n?(t.style.width="0",t.style.minWidth="0",t.style.overflow="hidden"):(t.style.width=s,t.style.minWidth="",t.style.overflow=""),e.textContent=n?"\u25B6":"\u25C0",e.title=n?"\u5C55\u5F00\u4FA7\u680F":"\u6536\u8D77\u4FA7\u680F",e.setAttribute("aria-label",e.title),e.setAttribute("aria-expanded",n?"false":"true")};a(),e.addEventListener("click",()=>{n=!n,n&&(s=t.style.width||s),localStorage.setItem("sidebarCollapsed",n?"1":"0"),a()})}function Sr(){let e=i("sidebar-resize"),t=i("sidebar"),n=!1;e.addEventListener("mousedown",s=>{n=!0,document.body.style.userSelect="none",document.body.style.cursor="col-resize",s.preventDefault()}),document.addEventListener("mousemove",s=>{if(!n)return;let a=Math.min(Math.max(s.clientX,160),520);t.style.width=a+"px",t.style.minWidth=""}),document.addEventListener("mouseup",()=>{if(!n)return;n=!1,document.body.style.userSelect="",document.body.style.cursor="";let s=Math.round(t.getBoundingClientRect().width);s>=160&&localStorage.setItem("sidebarWidth",`${s}px`)})}function oo(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);let t=i("btn-theme"),n=e==="dark"||e==="night"||e==="black"?"\u{1F319}":"\u2600\uFE0F";t&&(t.textContent=n),document.querySelectorAll('[data-sidebar-action="theme"]').forEach(a=>{a.textContent=n});let s=document.getElementById("hljs-theme");if(s||(s=document.querySelector('link[href*="highlight"][href*="styles"]'),s&&(s.id="hljs-theme")),s){let a=e==="dark"||e==="night"||e==="black";s.href="/vendor/highlight-dark.min.css"}}function io(){let e=document.documentElement.getAttribute("data-theme")||"dark";oo(e==="dark"?"light":"dark")}function ro(){let e=i("new-session-agent");e&&(e.value=I.peek()||"claude");let t=i("new-session-workspace");if(t){let a=ee.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),f.configDir&&(t.value=f.configDir)}let n=i("new-session-machine-wrap"),s=i("new-session-machine");if(n&&s)if(A.peek()){n.style.display="";let a=Q.peek()||[],o=j.peek()||"";s.innerHTML=a.length?a.map(r=>`<option value="${p(r.id)}">${p(r.id)}${r.hostname?" \u2014 "+p(r.hostname):""}</option>`).join(""):'<option value="">(no machines online)</option>',o&&(s.value=o),s.disabled=!0}else n.style.display="none",s&&(s.disabled=!1);lo(),i("new-session-path").value=E.peek()?.path||"",i("new-session-error").classList.add("hidden"),i("modal-new-session").showModal(),setTimeout(()=>i("new-session-path").focus(),50)}function lo(){let e=i("new-session-agent")?.value||"claude",t=i("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function co(){let e=i("new-session-path").value.trim(),t=i("new-session-agent")?.value||"claude",n=t==="claude"?i("new-session-workspace").value:null,s=i("new-session-error");if(s.classList.add("hidden"),!e){s.textContent="Working directory is required",s.classList.remove("hidden");return}if(A.peek()){let a=j.peek()||i("new-session-machine")?.value||Q.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),Ft();return}ge(a)}try{let a=await y("POST","/api/resolve-path",{path:e});if(!a.isDir)throw new Error("Path is not a directory");i("modal-new-session").close();let o=a.path.split("/").filter(Boolean).pop()||a.path;cn(),un(),fn(),pn(),f.sessionId=null,f.configDir=n||null,f.agent=t,Fe(t),le(qe(t)||P.peek()),_e(),ae(()=>{E.value={id:o,name:o,path:a.path,machineId:j.peek()||f.machineId},fe.value=a.path,ce.value=a.path,be.value=a.path,z.value="",re.value=null}),i("topbar-project").textContent=a.path;let r=i("files-root-input");r&&(r.value=a.path);let d=i("git-root-input");d&&(d.value=a.path),i("welcome").classList.add("hidden");let l=i("project-view");l.classList.remove("hidden"),l.style.display="flex",mn(),dn({sessionId:null}),st(),it("chat"),L(`New ${te[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function sc(){let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,t=/Android/i.test(navigator.userAgent),n;e?n=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
999
+ </dialog>`};Qa();Bt();Zn();R();B();ue();Ts();us();Bt();Qn();Kn();Zn();Xn();en();async function Ys(e={}){r("auth-screen").style.display="none";let t=r("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(xe);let n=e.hub;n===void 0?n=await Yt():n?(A.value=!0,n.machines&&(V.value=n.machines)):A.value=!1;let s=e.deepLink||null,a=Et();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=r("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let l=r("project-view");l&&(l.classList.remove("hidden"),l.style.display="flex",l.style.flexDirection="column",l.style.flex="1",l.style.minHeight="0")}if(A.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(ge(d),Ks(),qe.value=!0,zn());let l=qt().then(h=>(gt(),d&&!h.some(v=>v.id===d&&v.online!==!1)&&h.length&&(h.some(C=>C.id===d)||(ge(null),Ft())),h));so(),gt();let c=Promise.all([_e({waitFresh:!1}),wn({waitFresh:!1}),Vn().catch(()=>{}),kn().catch(()=>{})]);if(s?.id){let h=O.peek().find(x=>x.sessionId===s.id)||(a?.sessionId===s.id?a:null);await Re(s.id,h?.cwd||null,h?.configDir||null,s.agent||h?.agent||null,s.machineId||h?.machineId||d||null,{tab:s.tab||"chat"}),l.catch(()=>{}),c.catch(()=>{});return}if(!d){if(await l,!(V.peek()||[]).length){Ft(),c.catch(()=>{});return}Ft(),c.catch(()=>{});return}await c;let u=r("topbar-project");u&&u.textContent==="Select a session"&&(u.textContent=`Machine \xB7 ${d}`);return}zn();let i=Promise.all([_e({waitFresh:!1}),wn({waitFresh:!1}),Vn().catch(()=>{}),kn().catch(()=>{})]);if(s?.id){await Es().then(l=>{Array.isArray(l)?O.value=l:l&&Array.isArray(l.sessions)&&(O.value=l.sessions)}).catch(()=>{});let d=O.peek().find(l=>l.sessionId===s.id)||(a?.sessionId===s.id?a:null);await Re(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),i.catch(()=>{});return}await i}Qn();Xn();R();B();ue();bn();Bt();Zn();Xn();en();function Er(){let e=r("sidebar");e&&(e.classList.add("open"),r("sidebar-overlay").classList.remove("hidden"),r("hamburger")?.setAttribute("aria-expanded","true"),xe(),setTimeout(()=>r("session-search")?.focus({preventScroll:!0}),180))}function es(){let e=r("sidebar");e&&(e.classList.remove("open"),r("sidebar-overlay").classList.add("hidden"),r("hamburger")?.setAttribute("aria-expanded","false"),xe(),r("hamburger")?.focus({preventScroll:!0}))}function Tr(){window.innerWidth<=640&&es()}function Mr(){let e=r("sidebar-toggle"),t=r("sidebar");if(!e||!t)return;let n=localStorage.getItem("sidebarCollapsed")==="1",s=localStorage.getItem("sidebarWidth")||t.style.width||"280px",a=()=>{t.classList.toggle("desktop-collapsed",n),n?(t.style.width="0",t.style.minWidth="0",t.style.overflow="hidden"):(t.style.width=s,t.style.minWidth="",t.style.overflow=""),e.textContent=n?"\u25B6":"\u25C0",e.title=n?"\u5C55\u5F00\u4FA7\u680F":"\u6536\u8D77\u4FA7\u680F",e.setAttribute("aria-label",e.title),e.setAttribute("aria-expanded",n?"false":"true")};a(),e.addEventListener("click",()=>{n=!n,n&&(s=t.style.width||s),localStorage.setItem("sidebarCollapsed",n?"1":"0"),a()})}function Ir(){let e=r("sidebar-resize"),t=r("sidebar"),n=!1;e.addEventListener("mousedown",s=>{n=!0,document.body.style.userSelect="none",document.body.style.cursor="col-resize",s.preventDefault()}),document.addEventListener("mousemove",s=>{if(!n)return;let a=Math.min(Math.max(s.clientX,160),520);t.style.width=a+"px",t.style.minWidth=""}),document.addEventListener("mouseup",()=>{if(!n)return;n=!1,document.body.style.userSelect="",document.body.style.cursor="";let s=Math.round(t.getBoundingClientRect().width);s>=160&&localStorage.setItem("sidebarWidth",`${s}px`)})}function io(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);let t=r("btn-theme"),n=e==="dark"||e==="night"||e==="black"?"\u{1F319}":"\u2600\uFE0F";t&&(t.textContent=n),document.querySelectorAll('[data-sidebar-action="theme"]').forEach(a=>{a.textContent=n});let s=document.getElementById("hljs-theme");if(s||(s=document.querySelector('link[href*="highlight"][href*="styles"]'),s&&(s.id="hljs-theme")),s){let a=e==="dark"||e==="night"||e==="black";s.href="/vendor/highlight-dark.min.css"}}function ro(){let e=document.documentElement.getAttribute("data-theme")||"dark";io(e==="dark"?"light":"dark")}function lo(){let e=r("new-session-agent");e&&(e.value=I.peek()||"claude");let t=r("new-session-workspace");if(t){let a=ee.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),f.configDir&&(t.value=f.configDir)}let n=r("new-session-machine-wrap"),s=r("new-session-machine");if(n&&s)if(A.peek()){n.style.display="";let a=V.peek()||[],o=j.peek()||"";s.innerHTML=a.length?a.map(i=>`<option value="${p(i.id)}">${p(i.id)}${i.hostname?" \u2014 "+p(i.hostname):""}</option>`).join(""):'<option value="">(no machines online)</option>',o&&(s.value=o),s.disabled=!0}else n.style.display="none",s&&(s.disabled=!1);co(),r("new-session-path").value=E.peek()?.path||"",r("new-session-error").classList.add("hidden"),r("modal-new-session").showModal(),setTimeout(()=>r("new-session-path").focus(),50)}function co(){let e=r("new-session-agent")?.value||"claude",t=r("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function uo(){let e=r("new-session-path").value.trim(),t=r("new-session-agent")?.value||"claude",n=t==="claude"?r("new-session-workspace").value:null,s=r("new-session-error");if(s.classList.add("hidden"),!e){s.textContent="Working directory is required",s.classList.remove("hidden");return}if(A.peek()){let a=j.peek()||r("new-session-machine")?.value||V.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),Ft();return}ge(a)}try{let a=await y("POST","/api/resolve-path",{path:e});if(!a.isDir)throw new Error("Path is not a directory");r("modal-new-session").close();let o=a.path.split("/").filter(Boolean).pop()||a.path;dn(),pn(),mn(),fn(),f.sessionId=null,f.configDir=n||null,f.agent=t,Ue(t),le(Fe(t)||P.peek()),Pe(),ae(()=>{E.value={id:o,name:o,path:a.path,machineId:j.peek()||f.machineId},fe.value=a.path,ce.value=a.path,be.value=a.path,K.value="",re.value=null}),r("topbar-project").textContent=a.path;let i=r("files-root-input");i&&(i.value=a.path);let d=r("git-root-input");d&&(d.value=a.path),r("welcome").classList.add("hidden");let l=r("project-view");l.classList.remove("hidden"),l.style.display="flex",hn(),un({sessionId:null}),st(),it("chat"),L(`New ${te[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function uc(){let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,t=/Android/i.test(navigator.userAgent),n;e?n=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
1001
1000
  <li>\u70B9\u5E95\u90E8\u5206\u4EAB\u6309\u94AE <strong>\u5206\u4EAB</strong>\uFF08\u65B9\u6846+\u5411\u4E0A\u7BAD\u5934\uFF09</li>
1002
1001
  <li>\u4E0B\u6ED1\u627E\u5230\u5E76\u70B9 <strong>\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55</strong></li>
1003
1002
  <li>\u786E\u8BA4\u540D\u79F0\u540E\u70B9 <strong>\u6DFB\u52A0</strong></li>
@@ -1016,29 +1015,29 @@ ${t}`:"",n.length?n.join(`
1016
1015
  <form method="dialog"><button class="btn btn-sm">\u77E5\u9053\u4E86</button></form>
1017
1016
  </div>
1018
1017
  </div>
1019
- <form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function po(){let e=i("auth-screen");e&&(e.classList.remove("hidden"),e.style.display="flex");let t=i("app");t&&(t.classList.add("hidden"),t.style.display="none");let n=i("auth-btn"),s,a=new AbortController,o=setTimeout(()=>a.abort(),8e3);try{s=await y("GET","/api/auth/status",void 0,a.signal)}catch(r){console.warn("[auth status]",r);let d=i("auth-error");d&&(d.textContent="\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u670D\u52A1\u5730\u5740\u540E\u91CD\u8BD5\u3002",d.classList.remove("hidden")),n&&(n.dataset.mode="login");return}finally{clearTimeout(o)}s.needsSetup?(i("auth-subtitle").textContent="Create your account to get started",n.textContent="Create Account",n.dataset.mode="register"):n.dataset.mode="login"}async function uo(){let e=i("auth-username").value.trim(),t=i("auth-password").value,n=i("auth-error");n.classList.add("hidden");try{let s=await y("POST",`/api/auth/${i("auth-btn").dataset.mode||"login"}`,{username:e,password:t});f.token=s.token,localStorage.setItem("token",s.token),Ys()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function fo(){return f.token?/^#\/session\//.test(location.hash||""):!1}function Lr(e={}){if(oo(localStorage.getItem("theme")||"dark"),!document.getElementById("xterm-css")){let l=document.createElement("link");l.id="xterm-css",l.rel="stylesheet",l.href="/xterm.min.css",document.head.appendChild(l)}if(!document.getElementById("xterm-js")){let l=document.createElement("script");l.id="xterm-js",l.src="/xterm.min.js",document.head.appendChild(l)}if(!document.getElementById("xterm-fit-js")){let l=document.createElement("script");l.id="xterm-fit-js",l.src="/addon-fit.min.js",document.head.appendChild(l)}let t=e.restoreSession??fo(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=Wi()+Gi({restoreSession:t}),t){let l=i("session-list");l&&(l.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}Ce(()=>{let l=ee.value,c=i("ws-tabs");if(!c)return;if(l.length<=1){c.innerHTML="";return}let u=fe.peek();c.innerHTML=[{id:null,name:"All"},...l].map(h=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
1018
+ <form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function fo(){let e=r("auth-screen");e&&(e.classList.remove("hidden"),e.style.display="flex");let t=r("app");t&&(t.classList.add("hidden"),t.style.display="none");let n=r("auth-btn"),s,a=new AbortController,o=setTimeout(()=>a.abort(),8e3);try{s=await y("GET","/api/auth/status",void 0,a.signal)}catch(i){console.warn("[auth status]",i);let d=r("auth-error");d&&(d.textContent="\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u670D\u52A1\u5730\u5740\u540E\u91CD\u8BD5\u3002",d.classList.remove("hidden")),n&&(n.dataset.mode="login");return}finally{clearTimeout(o)}s.needsSetup?(r("auth-subtitle").textContent="Create your account to get started",n.textContent="Create Account",n.dataset.mode="register"):n.dataset.mode="login"}async function po(){let e=r("auth-username").value.trim(),t=r("auth-password").value,n=r("auth-error");n.classList.add("hidden");try{let s=await y("POST",`/api/auth/${r("auth-btn").dataset.mode||"login"}`,{username:e,password:t});f.token=s.token,localStorage.setItem("token",s.token),Ys()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function mo(){return f.token?/^#\/session\//.test(location.hash||""):!1}function Cr(e={}){if(io(localStorage.getItem("theme")||"dark"),!document.getElementById("xterm-css")){let l=document.createElement("link");l.id="xterm-css",l.rel="stylesheet",l.href="/xterm.min.css",document.head.appendChild(l)}if(!document.getElementById("xterm-js")){let l=document.createElement("script");l.id="xterm-js",l.src="/xterm.min.js",document.head.appendChild(l)}if(!document.getElementById("xterm-fit-js")){let l=document.createElement("script");l.id="xterm-fit-js",l.src="/addon-fit.min.js",document.head.appendChild(l)}let t=e.restoreSession??mo(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=Vi()+Qi({restoreSession:t}),t){let l=r("session-list");l&&(l.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}Ce(()=>{let l=ee.value,c=r("ws-tabs");if(!c)return;if(l.length<=1){c.innerHTML="";return}let u=fe.peek();c.innerHTML=[{id:null,name:"All"},...l].map(h=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
1020
1019
  ${(h.id===null?!u:u===h.configDir)?"border-primary text-primary":"border-transparent text-base-content/50 hover:text-base-content"}"
1021
1020
  data-ws-tab="${p(h.configDir||"")}">
1022
1021
  ${p(h.name)}
1023
- </button>`).join("")}),Ce(()=>{ct.value,St.value,Je.value,Qe.value,Oe.value,T.value;let l=i("session-list");l&&(l.querySelector(".session-rename-input")||(l.innerHTML=Ya(),Xa()))}),Ce(()=>{O.value,de.value,j.value,A.value;let l=i("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||Rt())}),Le(fe,l=>{let c=i("session-filter-badge");c&&(c.style.display=l?"inline":"none",c.title=l||"")}),Ce(()=>{let l=E.value;if(l&&l.path)dr(l.path);else{let c=i("project-notes-bar");c&&(c.style.display="none")}}),Le(U,l=>{document.querySelectorAll("[data-tab]").forEach(u=>{let h=u.dataset.tab===l;u.classList.toggle("text-primary",h),u.classList.toggle("border-primary",h),u.classList.toggle("text-base-content/50",!h),u.classList.toggle("border-transparent",!h)});let c=i("project-view");c&&!c.classList.contains("hidden")&&(c.style.display="flex",c.style.flexDirection="column",c.style.minHeight="0",c.style.flex="1"),["chat","files","git","shell","memory"].forEach(u=>{let h=i(`tab-${u}`);if(!h)return;let x=u===l;h.classList.toggle("hidden",!x),x?(h.style.display="flex",h.style.flexDirection="column",h.style.flex="1 1 0",h.style.minHeight="0",h.style.overflow="hidden"):h.style.display="none"}),l==="memory"&&qs(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),xe()}),Sr(),$r(),ti({openSession:He});let s=null;document.addEventListener("sessions-changed",()=>{s&&clearTimeout(s),s=setTimeout(()=>{s=null,Ne({waitFresh:!1})},1200)}),document.addEventListener("router:home",Vs),document.addEventListener("router:session",async({detail:{id:l,tab:c,machineId:u,agent:h}})=>{let x=O.peek().find(C=>C.sessionId===l),v=Et();await He(l,x?.cwd||(v?.sessionId===l?v.cwd:null)||null,x?.configDir||(v?.sessionId===l?v.configDir:null)||null,h||x?.agent||(v?.sessionId===l?v.agent:null)||null,u||x?.machineId||(v?.sessionId===l?v.machineId:null)||null,{tab:c||"chat"})}),g.on("click","#btn-home",Vs),g.on("click","#btn-share-session",async(l,c)=>{let u=Li();if(u)try{await navigator.clipboard.writeText(u),c.textContent="\u5DF2\u590D\u5236",setTimeout(()=>{c.textContent="\u5206\u4EAB"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",u)}}),g.on("click","#auth-btn",uo),g.on("submit","#auth-form",l=>{l.preventDefault(),uo()}),g.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&uo()}),g.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Zn():wr()),g.on("click","#sidebar-overlay",Zn),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Zn())}),g.on("input","#session-search",(l,c)=>{me.value=c.value,Bs(c.value)}),g.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let c=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!c))}),g.on("change","[data-agent-option]",(l,c)=>{let u=new Set($t.peek());c.checked?u.add(c.dataset.agentOption):u.delete(c.dataset.agentOption);let h=[...u];$t.value=h,localStorage.setItem("agentFilters",JSON.stringify(h)),de.value=h.length===1?h[0]:"all"}),g.on("change","#filter-favorites",(l,c)=>{Ae.value=c.checked,localStorage.setItem("favoritesOnly",c.checked?"1":"0")}),g.on("change","#filter-hidden",(l,c)=>{je.value=c.checked,localStorage.setItem("showHiddenOnly",c.checked?"1":"0")}),g.on("click","#filter-clear",()=>{$t.value=[],de.value="all",Ae.value=!1,je.value=!1,localStorage.setItem("agentFilters","[]"),localStorage.setItem("favoritesOnly","0"),localStorage.setItem("showHiddenOnly","0"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=!1}),i("filter-favorites")&&(i("filter-favorites").checked=!1),i("filter-hidden")&&(i("filter-hidden").checked=!1)}),g.on("click","#session-filter-badge",()=>{fe.value=null}),g.on("click","[data-ws-tab]",(l,c)=>{fe.value=c.dataset.wsTab||null}),g.on("click","#sidebar-refresh",()=>{Ne(),me.peek().trim()&&Os(me.peek())}),g.on("click","[data-view]",(l,c)=>{Je.value=c.dataset.view,localStorage.setItem("sidebarView",c.dataset.view)}),g.on("click","[data-agent-filter]",(l,c)=>{de.value=c.dataset.agentFilter,localStorage.setItem("agentFilter",c.dataset.agentFilter),me.peek().trim()&&Bs(me.peek())}),g.on("dblclick","[data-project-cwd]",(l,c)=>{let u=c.dataset.projectCwd;if(!u)return;let h=u.split("/").filter(Boolean).pop()||u;ao({id:h,name:h,path:u}),L(`Project \xB7 ${u}`)}),g.on("click","#btn-pwa-install",async()=>{await Fo()||sc()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),g.on("click","#btn-settings",Ra),g.on("click","#btn-meta-agent",()=>Hi()),g.on("click","#btn-meta-agent-welcome",()=>qa("chat")),g.on("click","#btn-theme",io),g.on("click","[data-sidebar-action]",(l,c)=>{let u=c.dataset.sidebarAction;u==="new"&&ro(),u==="theme"&&io(),u==="settings"&&Ra(),u==="logout"&&(f.token=null,localStorage.removeItem("token"),ge(null),Be.value=!1,location.reload())}),g.on("click","#btn-cal-prev",()=>{Ja(-1),Rt(Ht())}),g.on("click","#btn-cal-next",()=>{Ja(1),Rt(Ht())}),g.on("click","[data-cal-date]",(l,c)=>{nr(c.dataset.calDate),Rt(Ht())}),g.on("click","[data-session-id]",(l,c)=>{l.target.closest("[data-fav-toggle]")||l.target.closest("[data-hide-toggle]")||l.target.closest("[data-rename-session]")||l.target.closest(".session-rename-input")||l.target.closest(".session-title-wrap.session-rename-active")||(He(c.dataset.sessionId,c.dataset.sessionCwd||null,c.dataset.sessionConfigDir||null,c.dataset.sessionAgent||"claude",c.dataset.sessionMachine||null),kr())}),g.on("click","[data-rename-session]",(l,c)=>{l.preventDefault(),l.stopPropagation();let u=c.closest(".session-title-wrap")||c,h=u.dataset.renameSessionId||u.dataset.sessionId;h&&to({sessionId:h,agent:u.dataset.renameSessionAgent||"claude",machineId:u.dataset.renameSessionMachine||null,fallbackDisplay:u.dataset.renameSessionDisplay||"",mountEl:u})}),g.on("click","[data-rename-bar]",(l,c)=>{if(l.preventDefault(),l.stopPropagation(),!f.sessionId)return;let u=document.getElementById("session-title-display")||c;to({sessionId:f.sessionId,agent:f.agent||I.peek()||"claude",machineId:f.machineId||null,mountEl:u})}),g.on("click","[data-folder]",(l,c)=>{let u=c.dataset.folder,x=c.querySelector("span")?.textContent.trim()==="\u25BE",v=new Set(zt.peek()),C=new Set(Jt.peek());x?(v.delete(u),C.add(u)):(v.add(u),C.delete(u)),ae(()=>{zt.value=v,Jt.value=C})}),g.on("click","#memory-refresh",qs),g.on("click","[data-memory-file]",l=>Za(l.dataset.memoryFile,l.dataset.memoryAgent)),g.on("click","[data-tab]",(l,c)=>it(c.dataset.tab));let a=async(l,c)=>{let u=i(l),h=u?.value.trim();if(!h){c.value="";return}try{let x=await y("POST","/api/resolve-path",{path:h});if(x.isDir===!1)throw new Error("Path is not a directory on the target machine");c.value=x.path,u.value=x.path;let v=E.peek();v&&(E.value={...v,path:x.path})}catch(x){u.style.color="oklch(var(--er))",u.title=x.message,setTimeout(()=>{u.style.color="",u.title=""},2e3)}};g.on("click","#files-root-btn",()=>a("files-root-input",ce)),g.on("click","#git-root-btn",()=>a("git-root-input",be)),g.on("keydown","#files-root-input",l=>{l.key==="Enter"&&a("files-root-input",ce)}),g.on("keydown","#git-root-input",l=>{l.key==="Enter"&&a("git-root-input",be)}),g.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),xe()}),g.on("change","#sel-agent",(l,c)=>{let u=I.peek(),h=c.value;u!==h&&(f.sessionId=null,Fe(h),le(qe(h)||P.peek()),i("sel-permission").value=Ee.peek(),_e(),L(`Agent \u2192 ${te[h]||h} \xB7 model ${P.peek()} \xB7 new session`))}),g.on("change","#sel-convert-agent",async(l,c)=>{let u=c.value;if(!u)return;let h=f.sessionId;if(!h){alert("No active session to convert."),c.value="";return}let x=f.agent||I.peek()||"claude";if(x===u){alert("Cannot convert to the same agent."),c.value="";return}c.disabled=!0,L(`Converting session ${h.slice(0,8)} from ${x} to ${u}...`);try{let v=await y("POST",`/api/sessions/${h}/convert`,{targetAgent:u,sourceAgent:x});v&&v.success?(L(`\u2713 Converted successfully. New session: ${v.targetSessionId.slice(0,8)}`),await Ne(),await He(v.targetSessionId,E.peek()?.path||null,null,v.targetAgent),Bn()):L("Failed to convert session.")}catch(v){L(`Error converting session: ${v.message}`),alert(`Error converting session: ${v.message}`)}finally{c.disabled=!1,c.value=""}}),g.on("change","#sel-model",(l,c)=>{le(c.value),Hs()}),g.on("click","#btn-model-add",()=>Rs({editCurrent:!1})),g.on("click","#btn-model-edit",()=>Rs({editCurrent:!0})),g.on("change","#sel-effort",(l,c)=>{ie.value=c.value}),g.on("change","#sel-permission",(l,c)=>{Ee.value=c.value}),g.on("change","#sel-density",(l,c)=>{xa(c.value),L(`Density \u2192 ${c.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",_e),g.on("click","#btn-new-session, #btn-new-session-welcome",ro),g.on("click","#new-session-cancel",()=>i("modal-new-session").close()),g.on("click","#new-session-start",co),g.on("change","#new-session-agent",lo),g.on("keydown","#new-session-path",l=>{l.key==="Enter"&&co()}),g.on("click","#send-btn",On),g.on("click","#stop-btn",hi),g.on("click","#btn-logout",()=>{f.token=null,localStorage.removeItem("token"),ge(null),Be.value=!1,location.reload()}),g.on("click","[data-pick-machine]",async(l,c)=>{let u=c.dataset.pickMachine;if(!u||u===j.peek()){Ut();return}await so(u,{forceReload:!0}),us()});let o=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await qt(),Ks(),Vn(),gt(),l){let c=(Q.peek()||[]).filter(u=>u.online!==!1).length;l.textContent=`${c} online`}};g.on("click","#btn-refresh-machines",o),g.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await o()}),g.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),Ot(),It();let c=i("machine-menu");c&&(c.classList.contains("hidden")?(await qt(),Vn(),c.classList.remove("hidden")):c.classList.add("hidden"))}),g.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),Ut(),It(),tr();let c=!i("recent-menu")?.classList.contains("hidden"),u=i("btn-recent-sessions");u&&u.setAttribute("aria-expanded",c?"true":"false")}),g.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),Ot(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let c=i("machine-menu-wrap");c&&!c.contains(l.target)&&Ut();let u=i("recent-menu"),h=i("btn-recent-sessions"),x=l.target;if(u&&!u.classList.contains("hidden")){if(u.contains(x)||h?.contains(x))return;Ot(),h?.setAttribute("aria-expanded","false")}}),g.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),Ut(),Ot(),Zo()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Ka()}),g.on("click","#recent-menu [data-session-id]",()=>{Ot(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),g.on("click","[data-dismiss-recent-session]",(l,c)=>{l.preventDefault(),l.stopPropagation(),Zi({sessionId:c.dataset.dismissRecentSession,agent:c.dataset.dismissRecentAgent||"claude",machineId:c.dataset.dismissRecentMachine||null})}),g.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{ur()}),g.on("click","#btn-cancel-project-notes",()=>{kn()});let r=async()=>{let l=i("project-goal-input")?.value?.trim()??"",c=i("project-notes-input")?.value?.trim()??"",u=E.peek();if(!(!u||!u.path))try{let h=await y("POST","/api/projects/notes",{root:u.path,goal:l,notes:c});cr(h.goal||"",h.notes||""),kn()}catch(h){alert(`Error saving project notes: ${h.message}`)}};g.on("click","#btn-save-project-notes",r),g.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&r(),l.key==="Escape"&&kn()}),g.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&kn()}),g.on("click","[data-fav-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.favSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),mr(c.dataset.favSessionId,c.dataset.favSessionAgent||"claude",{machineId:u||null})}),g.on("click","[data-hide-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.hideSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),hr(c.dataset.hideSessionId,c.dataset.hideSessionAgent||"claude",{machineId:u||null})}),g.on("click","#btn-edit-session-notes, #session-notes-text",()=>{pr()}),g.on("click","#btn-cancel-session-notes",()=>Pe()),g.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!f.sessionId)return;let c=f.agent||I.peek()||"claude";await eo(f.sessionId,c,l)&&Pe()}),g.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&Pe(),l.key==="Enter"){let c=l.target.value.trim();if(!f.sessionId)return;let u=f.agent||I.peek()||"claude";await eo(f.sessionId,u,c)&&Pe()}}),g.on("click","#btn-fav-filter",()=>{let l=!Ae.peek();Ae.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),i("btn-fav-filter")?.classList.toggle("active",l),l&&je.peek()&&(je.value=!1,localStorage.setItem("showHiddenOnly","0"),i("btn-hidden-filter")?.classList.remove("active"))}),g.on("click","#btn-hidden-filter",()=>{let l=!je.peek();je.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),i("btn-hidden-filter")?.classList.toggle("active",l),l&&Ae.peek()&&(Ae.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),_e(),Ce(()=>{A.value,j.value,f.token&&us()}),i("sel-permission").value=Ee.peek(),$s();let d=i("sel-density");d&&(d.value=Ve.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=$t.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=Ae.peek()),i("filter-hidden")&&(i("filter-hidden").checked=je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===de.peek())}),i("btn-fav-filter")?.classList.toggle("active",Ae.peek()),i("btn-hidden-filter")?.classList.toggle("active",je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let c=l.dataset.view===Je.peek();l.classList.toggle("bg-primary/15",c),l.classList.toggle("text-primary",c),l.classList.toggle("font-medium",c),l.classList.toggle("text-base-content/50",!c)})}hn();R();B();ue();function ac(e){let t=e.split(".").pop()?.toLowerCase();return{js:"\u{1F4C4}",ts:"\u{1F4C4}",jsx:"\u{1F4C4}",tsx:"\u{1F4C4}",py:"\u{1F40D}",md:"\u{1F4DD}",json:"\u2699\uFE0F",html:"\u{1F310}",css:"\u{1F3A8}",sh:"\u26A1",env:"\u{1F511}",docx:"\u{1F4D8}",pptx:"\u{1F4D9}",xlsx:"\u{1F4D7}",pdf:"\u{1F4D5}"}[t]||"\u{1F4C4}"}function oc(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function Er(e){let t=oc(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function ic(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function rc(e){let t=atob(e),n=new Uint8Array(t.length);for(let s=0;s<t.length;s++)n[s]=t.charCodeAt(s);return n.buffer}var mo=new Map;function Xs(e){if(mo.has(e))return mo.get(e);let t=new Promise((n,s)=>{let a=document.querySelector(`script[data-src="${e}"]`);if(a){if(a.dataset.loaded==="1")return n();a.addEventListener("load",()=>n()),a.addEventListener("error",()=>s(new Error(`Failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.async=!0,o.dataset.src=e,o.onload=()=>{o.dataset.loaded="1",n()},o.onerror=()=>s(new Error(`Failed to load ${e}`)),document.head.appendChild(o)});return mo.set(e,t),t}function lc(e){let n=((e||"").split("/").pop()||"").toLowerCase(),s={dockerfile:"dockerfile",makefile:"makefile",gemfile:"ruby",rakefile:"ruby",procfile:"yaml","cmakelists.txt":"cmake"};if(s[n])return s[n];let a=n.includes(".")?n.split(".").pop():"";return{js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",mts:"typescript",cts:"typescript",py:"python",pyw:"python",pyi:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",kts:"kotlin",c:"c",h:"c",cpp:"cpp",cc:"cpp",cxx:"cpp",hpp:"cpp",hh:"cpp",cs:"csharp",swift:"swift",php:"php",scala:"scala",sh:"bash",bash:"bash",zsh:"bash",fish:"bash",ps1:"powershell",psm1:"powershell",html:"xml",htm:"xml",xhtml:"xml",xml:"xml",svg:"xml",css:"css",scss:"scss",less:"less",json:"json",jsonc:"json",json5:"json",yml:"yaml",yaml:"yaml",toml:"ini",ini:"ini",conf:"ini",env:"bash",md:"markdown",mdx:"markdown",markdown:"markdown",sql:"sql",graphql:"graphql",gql:"graphql",vue:"xml",svelte:"xml",r:"r",lua:"lua",pl:"perl",pm:"perl",dart:"dart",ex:"elixir",exs:"elixir",erl:"erlang",zig:"zig",nim:"nim",clj:"clojure",cljs:"clojure",diff:"diff",patch:"diff",dockerfile:"dockerfile"}[a]||""}function cc(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function es(e,t,n){let s=ic(t);return`
1022
+ </button>`).join("")}),Ce(()=>{ct.value,St.value,Je.value,Ve.value,Be.value,T.value;let l=r("session-list");l&&(l.querySelector(".session-rename-input")||(l.innerHTML=Xa(),Za()))}),Ce(()=>{O.value,de.value,j.value,A.value;let l=r("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||Rt())}),Le(fe,l=>{let c=r("session-filter-badge");c&&(c.style.display=l?"inline":"none",c.title=l||"")}),Ce(()=>{let l=E.value;if(l&&l.path)hr(l.path);else{let c=r("project-notes-bar");c&&(c.style.display="none")}}),Le(W,l=>{document.querySelectorAll("[data-tab]").forEach(u=>{let h=u.dataset.tab===l;u.classList.toggle("text-primary",h),u.classList.toggle("border-primary",h),u.classList.toggle("text-base-content/50",!h),u.classList.toggle("border-transparent",!h)});let c=r("project-view");c&&!c.classList.contains("hidden")&&(c.style.display="flex",c.style.flexDirection="column",c.style.minHeight="0",c.style.flex="1"),["chat","files","git","shell","memory"].forEach(u=>{let h=r(`tab-${u}`);if(!h)return;let x=u===l;h.classList.toggle("hidden",!x),x?(h.style.display="flex",h.style.flexDirection="column",h.style.flex="1 1 0",h.style.minHeight="0",h.style.overflow="hidden"):h.style.display="none"}),l==="memory"&&qs(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),xe()}),Ir(),Mr(),ni({openSession:Re});let s=null;document.addEventListener("sessions-changed",()=>{s&&clearTimeout(s),s=setTimeout(()=>{s=null,_e({waitFresh:!1})},1200)}),document.addEventListener("router:home",Qs),document.addEventListener("router:session",async({detail:{id:l,tab:c,machineId:u,agent:h}})=>{let x=O.peek().find(C=>C.sessionId===l),v=Et();await Re(l,x?.cwd||(v?.sessionId===l?v.cwd:null)||null,x?.configDir||(v?.sessionId===l?v.configDir:null)||null,h||x?.agent||(v?.sessionId===l?v.agent:null)||null,u||x?.machineId||(v?.sessionId===l?v.machineId:null)||null,{tab:c||"chat"})}),g.on("click","#btn-home",Qs),g.on("click","#btn-share-session",async(l,c)=>{let u=Ci();if(u)try{await navigator.clipboard.writeText(u),c.textContent="\u5DF2\u590D\u5236",setTimeout(()=>{c.textContent="\u5206\u4EAB"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",u)}}),g.on("click","#auth-btn",po),g.on("submit","#auth-form",l=>{l.preventDefault(),po()}),g.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&po()}),g.on("click","#hamburger",()=>r("sidebar").classList.contains("open")?es():Er()),g.on("click","#sidebar-overlay",es),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&r("sidebar")?.classList.contains("open")&&(l.preventDefault(),es())}),g.on("input","#session-search",(l,c)=>{me.value=c.value,Bs(c.value)}),g.on("click","#sidebar-filter-toggle",()=>{let l=r("sidebar-filter-menu");if(!l)return;let c=l.classList.toggle("hidden");r("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!c))}),g.on("change","[data-agent-option]",(l,c)=>{let u=new Set($t.peek());c.checked?u.add(c.dataset.agentOption):u.delete(c.dataset.agentOption);let h=[...u];$t.value=h,localStorage.setItem("agentFilters",JSON.stringify(h)),de.value=h.length===1?h[0]:"all"}),g.on("change","#filter-favorites",(l,c)=>{Ae.value=c.checked,localStorage.setItem("favoritesOnly",c.checked?"1":"0")}),g.on("change","#filter-hidden",(l,c)=>{je.value=c.checked,localStorage.setItem("showHiddenOnly",c.checked?"1":"0")}),g.on("click","#filter-clear",()=>{$t.value=[],de.value="all",Ae.value=!1,je.value=!1,localStorage.setItem("agentFilters","[]"),localStorage.setItem("favoritesOnly","0"),localStorage.setItem("showHiddenOnly","0"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=!1}),r("filter-favorites")&&(r("filter-favorites").checked=!1),r("filter-hidden")&&(r("filter-hidden").checked=!1)}),g.on("click","#session-filter-badge",()=>{fe.value=null}),g.on("click","[data-ws-tab]",(l,c)=>{fe.value=c.dataset.wsTab||null}),g.on("click","#sidebar-refresh",()=>{_e(),me.peek().trim()&&Os(me.peek())}),g.on("click","[data-view]",(l,c)=>{Je.value=c.dataset.view,localStorage.setItem("sidebarView",c.dataset.view)}),g.on("click","[data-agent-filter]",(l,c)=>{de.value=c.dataset.agentFilter,localStorage.setItem("agentFilter",c.dataset.agentFilter),me.peek().trim()&&Bs(me.peek())}),g.on("dblclick","[data-project-cwd]",(l,c)=>{let u=c.dataset.projectCwd;if(!u)return;let h=u.split("/").filter(Boolean).pop()||u;oo({id:h,name:h,path:u}),L(`Project \xB7 ${u}`)}),g.on("click","#btn-pwa-install",async()=>{await Uo()||uc()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),g.on("click","#btn-settings",Oa),g.on("click","#btn-meta-agent",()=>Fi()),g.on("click","#btn-meta-agent-welcome",()=>Fa("chat")),g.on("click","#btn-theme",ro),g.on("click","[data-sidebar-action]",(l,c)=>{let u=c.dataset.sidebarAction;u==="new"&&lo(),u==="theme"&&ro(),u==="settings"&&Oa(),u==="logout"&&(f.token=null,localStorage.removeItem("token"),ge(null),qe.value=!1,location.reload())}),g.on("click","#btn-cal-prev",()=>{Va(-1),Rt(Ht())}),g.on("click","#btn-cal-next",()=>{Va(1),Rt(Ht())}),g.on("click","[data-cal-date]",(l,c)=>{rr(c.dataset.calDate),Rt(Ht())}),g.on("click","[data-session-id]",(l,c)=>{l.target.closest("[data-fav-toggle]")||l.target.closest("[data-hide-toggle]")||l.target.closest("[data-rename-session]")||l.target.closest(".session-rename-input")||l.target.closest(".session-title-wrap.session-rename-active")||(Re(c.dataset.sessionId,c.dataset.sessionCwd||null,c.dataset.sessionConfigDir||null,c.dataset.sessionAgent||"claude",c.dataset.sessionMachine||null),Tr())}),g.on("click","[data-rename-session]",(l,c)=>{l.preventDefault(),l.stopPropagation();let u=c.closest(".session-title-wrap")||c,h=u.dataset.renameSessionId||u.dataset.sessionId;h&&no({sessionId:h,agent:u.dataset.renameSessionAgent||"claude",machineId:u.dataset.renameSessionMachine||null,fallbackDisplay:u.dataset.renameSessionDisplay||"",mountEl:u})}),g.on("click","[data-rename-bar]",(l,c)=>{if(l.preventDefault(),l.stopPropagation(),!f.sessionId)return;let u=document.getElementById("session-title-display")||c;no({sessionId:f.sessionId,agent:f.agent||I.peek()||"claude",machineId:f.machineId||null,mountEl:u})}),g.on("click","[data-folder]",(l,c)=>{let u=c.dataset.folder,x=c.querySelector("span")?.textContent.trim()==="\u25BE",v=new Set(Kt.peek()),C=new Set(Jt.peek());x?(v.delete(u),C.add(u)):(v.add(u),C.delete(u)),ae(()=>{Kt.value=v,Jt.value=C})}),g.on("click","#memory-refresh",qs),g.on("click","[data-memory-file]",l=>eo(l.dataset.memoryFile,l.dataset.memoryAgent)),g.on("click","[data-tab]",(l,c)=>it(c.dataset.tab));let a=async(l,c)=>{let u=r(l),h=u?.value.trim();if(!h){c.value="";return}try{let x=await y("POST","/api/resolve-path",{path:h});if(x.isDir===!1)throw new Error("Path is not a directory on the target machine");c.value=x.path,u.value=x.path;let v=E.peek();v&&(E.value={...v,path:x.path})}catch(x){u.style.color="oklch(var(--er))",u.title=x.message,setTimeout(()=>{u.style.color="",u.title=""},2e3)}};g.on("click","#files-root-btn",()=>a("files-root-input",ce)),g.on("click","#git-root-btn",()=>a("git-root-input",be)),g.on("keydown","#files-root-input",l=>{l.key==="Enter"&&a("files-root-input",ce)}),g.on("keydown","#git-root-input",l=>{l.key==="Enter"&&a("git-root-input",be)}),g.on("click","#btn-opts",()=>{r("chat-opts").classList.toggle("hidden"),xe()}),g.on("change","#sel-agent",(l,c)=>{let u=I.peek(),h=c.value;u!==h&&(f.sessionId=null,Ue(h),le(Fe(h)||P.peek()),r("sel-permission").value=Ee.peek(),Pe(),L(`Agent \u2192 ${te[h]||h} \xB7 model ${P.peek()} \xB7 new session`))}),g.on("change","#sel-convert-agent",async(l,c)=>{let u=c.value;if(!u)return;let h=f.sessionId;if(!h){alert("No active session to convert."),c.value="";return}let x=f.agent||I.peek()||"claude";if(x===u){alert("Cannot convert to the same agent."),c.value="";return}c.disabled=!0,L(`Converting session ${h.slice(0,8)} from ${x} to ${u}...`);try{let v=await y("POST",`/api/sessions/${h}/convert`,{targetAgent:u,sourceAgent:x});v&&v.success?(L(`\u2713 Converted successfully. New session: ${v.targetSessionId.slice(0,8)}`),await _e(),await Re(v.targetSessionId,E.peek()?.path||null,null,v.targetAgent),qn()):L("Failed to convert session.")}catch(v){L(`Error converting session: ${v.message}`),alert(`Error converting session: ${v.message}`)}finally{c.disabled=!1,c.value=""}}),g.on("change","#sel-model",(l,c)=>{le(c.value),Hs()}),g.on("click","#btn-model-add",()=>Rs({editCurrent:!1})),g.on("click","#btn-model-edit",()=>Rs({editCurrent:!0})),g.on("change","#sel-effort",(l,c)=>{ie.value=c.value}),g.on("change","#sel-permission",(l,c)=>{Ee.value=c.value}),g.on("change","#sel-density",(l,c)=>{xa(c.value),L(`Density \u2192 ${c.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",Pe),g.on("click","#btn-new-session, #btn-new-session-welcome",lo),g.on("click","#new-session-cancel",()=>r("modal-new-session").close()),g.on("click","#new-session-start",uo),g.on("change","#new-session-agent",co),g.on("keydown","#new-session-path",l=>{l.key==="Enter"&&uo()}),g.on("click","#send-btn",Bn),g.on("click","#stop-btn",yi),g.on("click","#btn-logout",()=>{f.token=null,localStorage.removeItem("token"),ge(null),qe.value=!1,location.reload()}),g.on("click","[data-pick-machine]",async(l,c)=>{let u=c.dataset.pickMachine;if(!u||u===j.peek()){Ut();return}await ao(u,{forceReload:!0}),ps()});let o=async()=>{let l=r("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await qt(),zs(),Yn(),gt(),l){let c=(V.peek()||[]).filter(u=>u.online!==!1).length;l.textContent=`${c} online`}};g.on("click","#btn-refresh-machines",o),g.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await o()}),g.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),Ot(),It();let c=r("machine-menu");c&&(c.classList.contains("hidden")?(await qt(),Yn(),c.classList.remove("hidden")):c.classList.add("hidden"))}),g.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),Ut(),It(),ir();let c=!r("recent-menu")?.classList.contains("hidden"),u=r("btn-recent-sessions");u&&u.setAttribute("aria-expanded",c?"true":"false")}),g.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),Ot(),r("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let c=r("machine-menu-wrap");c&&!c.contains(l.target)&&Ut();let u=r("recent-menu"),h=r("btn-recent-sessions"),x=l.target;if(u&&!u.classList.contains("hidden")){if(u.contains(x)||h?.contains(x))return;Ot(),h?.setAttribute("aria-expanded","false")}}),g.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),Ut(),Ot(),ei()}),window.addEventListener("resize",()=>{r("recent-menu")&&!r("recent-menu").classList.contains("hidden")&&Ka()}),g.on("click","#recent-menu [data-session-id]",()=>{Ot(),r("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),g.on("click","[data-dismiss-recent-session]",(l,c)=>{l.preventDefault(),l.stopPropagation(),ar({sessionId:c.dataset.dismissRecentSession,agent:c.dataset.dismissRecentAgent||"claude",machineId:c.dataset.dismissRecentMachine||null})}),g.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{br()}),g.on("click","#btn-cancel-project-notes",()=>{$n()});let i=async()=>{let l=r("project-goal-input")?.value?.trim()??"",c=r("project-notes-input")?.value?.trim()??"",u=E.peek();if(!(!u||!u.path))try{let h=await y("POST","/api/projects/notes",{root:u.path,goal:l,notes:c});mr(h.goal||"",h.notes||""),$n()}catch(h){alert(`Error saving project notes: ${h.message}`)}};g.on("click","#btn-save-project-notes",i),g.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&i(),l.key==="Escape"&&$n()}),g.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&$n()}),g.on("click","[data-fav-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.favSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),vr(c.dataset.favSessionId,c.dataset.favSessionAgent||"claude",{machineId:u||null})}),g.on("click","[data-hide-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.hideSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),yr(c.dataset.hideSessionId,c.dataset.hideSessionAgent||"claude",{machineId:u||null})}),g.on("click","#btn-edit-session-notes, #session-notes-text",()=>{gr()}),g.on("click","#btn-cancel-session-notes",()=>He()),g.on("click","#btn-save-session-notes",async()=>{let l=r("session-notes-input")?.value?.trim()||"";if(!f.sessionId)return;let c=f.agent||I.peek()||"claude";await to(f.sessionId,c,l)&&He()}),g.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&He(),l.key==="Enter"){let c=l.target.value.trim();if(!f.sessionId)return;let u=f.agent||I.peek()||"claude";await to(f.sessionId,u,c)&&He()}}),g.on("click","#btn-fav-filter",()=>{let l=!Ae.peek();Ae.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),r("btn-fav-filter")?.classList.toggle("active",l),l&&je.peek()&&(je.value=!1,localStorage.setItem("showHiddenOnly","0"),r("btn-hidden-filter")?.classList.remove("active"))}),g.on("click","#btn-hidden-filter",()=>{let l=!je.peek();je.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),r("btn-hidden-filter")?.classList.toggle("active",l),l&&Ae.peek()&&(Ae.value=!1,localStorage.setItem("favoritesOnly","0"),r("btn-fav-filter")?.classList.remove("active"))}),Pe(),Ce(()=>{A.value,j.value,f.token&&ps()}),r("sel-permission").value=Ee.peek(),$s();let d=r("sel-density");d&&(d.value=Qe.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=$t.peek().includes(l.dataset.agentOption)}),r("filter-favorites")&&(r("filter-favorites").checked=Ae.peek()),r("filter-hidden")&&(r("filter-hidden").checked=je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===de.peek())}),r("btn-fav-filter")?.classList.toggle("active",Ae.peek()),r("btn-hidden-filter")?.classList.toggle("active",je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let c=l.dataset.view===Je.peek();l.classList.toggle("bg-primary/15",c),l.classList.toggle("text-primary",c),l.classList.toggle("font-medium",c),l.classList.toggle("text-base-content/50",!c)})}bn();R();B();ue();function pc(e){let t=e.split(".").pop()?.toLowerCase();return{js:"\u{1F4C4}",ts:"\u{1F4C4}",jsx:"\u{1F4C4}",tsx:"\u{1F4C4}",py:"\u{1F40D}",md:"\u{1F4DD}",json:"\u2699\uFE0F",html:"\u{1F310}",css:"\u{1F3A8}",sh:"\u26A1",env:"\u{1F511}",docx:"\u{1F4D8}",pptx:"\u{1F4D9}",xlsx:"\u{1F4D7}",pdf:"\u{1F4D5}"}[t]||"\u{1F4C4}"}function fc(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function Ar(e){let t=fc(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function mc(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function hc(e){let t=atob(e),n=new Uint8Array(t.length);for(let s=0;s<t.length;s++)n[s]=t.charCodeAt(s);return n.buffer}var ho=new Map;function Xs(e){if(ho.has(e))return ho.get(e);let t=new Promise((n,s)=>{let a=document.querySelector(`script[data-src="${e}"]`);if(a){if(a.dataset.loaded==="1")return n();a.addEventListener("load",()=>n()),a.addEventListener("error",()=>s(new Error(`Failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.async=!0,o.dataset.src=e,o.onload=()=>{o.dataset.loaded="1",n()},o.onerror=()=>s(new Error(`Failed to load ${e}`)),document.head.appendChild(o)});return ho.set(e,t),t}function bc(e){let n=((e||"").split("/").pop()||"").toLowerCase(),s={dockerfile:"dockerfile",makefile:"makefile",gemfile:"ruby",rakefile:"ruby",procfile:"yaml","cmakelists.txt":"cmake"};if(s[n])return s[n];let a=n.includes(".")?n.split(".").pop():"";return{js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",mts:"typescript",cts:"typescript",py:"python",pyw:"python",pyi:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",kts:"kotlin",c:"c",h:"c",cpp:"cpp",cc:"cpp",cxx:"cpp",hpp:"cpp",hh:"cpp",cs:"csharp",swift:"swift",php:"php",scala:"scala",sh:"bash",bash:"bash",zsh:"bash",fish:"bash",ps1:"powershell",psm1:"powershell",html:"xml",htm:"xml",xhtml:"xml",xml:"xml",svg:"xml",css:"css",scss:"scss",less:"less",json:"json",jsonc:"json",json5:"json",yml:"yaml",yaml:"yaml",toml:"ini",ini:"ini",conf:"ini",env:"bash",md:"markdown",mdx:"markdown",markdown:"markdown",sql:"sql",graphql:"graphql",gql:"graphql",vue:"xml",svelte:"xml",r:"r",lua:"lua",pl:"perl",pm:"perl",dart:"dart",ex:"elixir",exs:"elixir",erl:"erlang",zig:"zig",nim:"nim",clj:"clojure",cljs:"clojure",diff:"diff",patch:"diff",dockerfile:"dockerfile"}[a]||""}function gc(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function ts(e,t,n){let s=mc(t);return`
1024
1023
  <div class="flex items-center gap-2 px-4 py-1.5 border-b border-base-300 flex-shrink-0 bg-base-200">
1025
1024
  <span class="text-xs text-base-content/40 flex-1 truncate">${p(e)} \xB7 ${p(s)}${n?` \xB7 <span class="text-primary/70">${p(n)}</span>`:""}</span>
1026
1025
  <button type="button" class="btn btn-ghost btn-xs" data-download-path="${p(e)}">\u2193 Download</button>
1027
- </div>`}function dc(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,n)=>n.isDir-t.isDir||t.name.localeCompare(n.name)),e.map(t=>`
1026
+ </div>`}function xc(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,n)=>n.isDir-t.isDir||t.name.localeCompare(n.name)),e.map(t=>`
1028
1027
  <div class="flex items-center gap-2 px-4 py-1.5 hover:bg-base-300 group"
1029
1028
  ${t.isDir?`data-dir-path="${p(t.path)}"`:`data-file-path="${p(t.path)}"`}>
1030
- <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":ac(t.name)}</span>
1029
+ <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":pc(t.name)}</span>
1031
1030
  <span class="text-sm flex-1 truncate cursor-pointer ${t.isDir?"text-primary":""}">${p(t.name)}</span>
1032
1031
  ${t.isDir?"":`
1033
1032
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-base-content/50 hover:text-base-content"
1034
1033
  data-download-path="${p(t.path)}" title="Download" aria-label="Download">\u2193</button>
1035
1034
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-error/60 hover:text-error"
1036
1035
  data-delete-path="${p(t.path)}" title="Delete" aria-label="Delete">\u2715</button>`}
1037
- </div>`).join(""))}function uc(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512)),a=lc(e),o=a?`language-${p(a)}`:"",r=s?`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(e)}">Download</button></div>`:`<pre class="file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0"><code class="hljs file-preview-code ${o}">${p(t)}</code></pre>`;return es(e,n,s?"binary":a||"text")+r}async function pc(e){if(await Xs("/vendor/mammoth.browser.min.js"),typeof mammoth>"u")throw new Error("mammoth failed to load");let t=await mammoth.convertToHtml({arrayBuffer:e});return`<div class="office-preview office-docx overflow-auto flex-1 p-4 md">${t.messages?.length?`<div class="office-warn text-xs text-warning/80 px-3 py-1">${t.messages.length} conversion note(s)</div>`:""}<div class="office-docx-body">${t.value||'<p class="text-base-content/40">Empty document</p>'}</div></div>`}async function fc(e){if(await Xs("/vendor/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),n=t.SheetNames||[];if(!n.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let s=n.map((o,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${p(o)}</button>`).join(""),a=n.map((o,r)=>{let d=t.Sheets[o],l;try{l=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${r}`,editable:!1})}catch{l='<p class="text-base-content/40 text-xs p-2">Unable to render this sheet</p>'}return`<div class="office-sheet-pane${r===0?"":" hidden"}" data-sheet-pane="${r}">${l}</div>`}).join("");return`
1036
+ </div>`).join(""))}function vc(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512)),a=bc(e),o=a?`language-${p(a)}`:"",i=s?`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(e)}">Download</button></div>`:`<pre class="file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0"><code class="hljs file-preview-code ${o}">${p(t)}</code></pre>`;return ts(e,n,s?"binary":a||"text")+i}async function yc(e){if(await Xs("/vendor/mammoth.browser.min.js"),typeof mammoth>"u")throw new Error("mammoth failed to load");let t=await mammoth.convertToHtml({arrayBuffer:e});return`<div class="office-preview office-docx overflow-auto flex-1 p-4 md">${t.messages?.length?`<div class="office-warn text-xs text-warning/80 px-3 py-1">${t.messages.length} conversion note(s)</div>`:""}<div class="office-docx-body">${t.value||'<p class="text-base-content/40">Empty document</p>'}</div></div>`}async function wc(e){if(await Xs("/vendor/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),n=t.SheetNames||[];if(!n.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let s=n.map((o,i)=>`<button type="button" class="office-sheet-tab${i===0?" active":""}" data-sheet-idx="${i}">${p(o)}</button>`).join(""),a=n.map((o,i)=>{let d=t.Sheets[o],l;try{l=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${i}`,editable:!1})}catch{l='<p class="text-base-content/40 text-xs p-2">Unable to render this sheet</p>'}return`<div class="office-sheet-pane${i===0?"":" hidden"}" data-sheet-pane="${i}">${l}</div>`}).join("");return`
1038
1037
  <div class="office-preview office-xlsx flex flex-col flex-1 min-h-0 overflow-hidden">
1039
1038
  <div class="office-sheet-tabs flex gap-1 px-2 py-1.5 border-b border-base-300 overflow-x-auto flex-shrink-0 bg-base-200">${s}</div>
1040
1039
  <div class="office-sheet-body flex-1 overflow-auto p-2">${a}</div>
1041
- </div>`}function mc(e){let t=[],n=/<a:p[\s>][\s\S]*?<\/a:p>/g,s=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,a,o=e.match(n)||[e];for(let r of o){let d=[];for(s.lastIndex=0;(a=s.exec(r))!==null;){let l=a[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");l&&d.push(l)}d.length&&t.push(d.join(""))}return t}async function hc(e){if(await Xs("/vendor/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),n=Object.keys(t.files).filter(a=>/^ppt\/slides\/slide\d+\.xml$/i.test(a)).sort((a,o)=>{let r=parseInt(a.match(/slide(\d+)/i)?.[1]||"0",10),d=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10);return r-d});if(!n.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let s=[];for(let a=0;a<n.length;a++){let o=await t.files[n[a]].async("string"),r=mc(o),d=r.length?r.map(l=>`<p>${p(l)}</p>`).join(""):'<p class="text-base-content/40 italic">\uFF08\u6B64\u9875\u65E0\u53EF\u63D0\u53D6\u6587\u672C / \u53EF\u80FD\u4EE5\u56FE\u7247\u4E3A\u4E3B\uFF09</p>';s.push(`
1040
+ </div>`}function kc(e){let t=[],n=/<a:p[\s>][\s\S]*?<\/a:p>/g,s=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,a,o=e.match(n)||[e];for(let i of o){let d=[];for(s.lastIndex=0;(a=s.exec(i))!==null;){let l=a[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");l&&d.push(l)}d.length&&t.push(d.join(""))}return t}async function $c(e){if(await Xs("/vendor/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),n=Object.keys(t.files).filter(a=>/^ppt\/slides\/slide\d+\.xml$/i.test(a)).sort((a,o)=>{let i=parseInt(a.match(/slide(\d+)/i)?.[1]||"0",10),d=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10);return i-d});if(!n.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let s=[];for(let a=0;a<n.length;a++){let o=await t.files[n[a]].async("string"),i=kc(o),d=i.length?i.map(l=>`<p>${p(l)}</p>`).join(""):'<p class="text-base-content/40 italic">\uFF08\u6B64\u9875\u65E0\u53EF\u63D0\u53D6\u6587\u672C / \u53EF\u80FD\u4EE5\u56FE\u7247\u4E3A\u4E3B\uFF09</p>';s.push(`
1042
1041
  <article class="office-slide-card">
1043
1042
  <header class="office-slide-num">Slide ${a+1}</header>
1044
1043
  <div class="office-slide-body">${d}</div>
@@ -1046,21 +1045,21 @@ ${t}`:"",n.length?n.join(`
1046
1045
  <div class="office-preview office-pptx overflow-auto flex-1 p-3 space-y-3">
1047
1046
  <p class="text-xs text-base-content/50 px-1">\u6587\u672C\u9884\u89C8\uFF08\u7248\u5F0F/\u56FE\u7247\u4E0D\u8FD8\u539F\uFF09\xB7 ${n.length} slide(s)</p>
1048
1047
  ${s.join("")}
1049
- </div>`}async function bc(){if(await Xs("/vendor/pdf.min.js"),typeof pdfjsLib>"u")throw new Error("pdf.js failed to load");return pdfjsLib.GlobalWorkerOptions.workerSrc="/vendor/pdf.worker.min.js",pdfjsLib}async function gc(e){let n=await(await bc()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let l=await n.getPage(d),c=l.getViewport({scale:1}),u=Math.min(1.5,820/c.width),h=l.getViewport({scale:u}),x=document.createElement("canvas");x.width=Math.floor(h.width),x.height=Math.floor(h.height),x.className="office-pdf-page",x.dataset.page=String(d),await l.render({canvasContext:x.getContext("2d"),viewport:h}).promise,o.push(`
1048
+ </div>`}async function Sc(){if(await Xs("/vendor/pdf.min.js"),typeof pdfjsLib>"u")throw new Error("pdf.js failed to load");return pdfjsLib.GlobalWorkerOptions.workerSrc="/vendor/pdf.worker.min.js",pdfjsLib}async function Lc(e){let n=await(await Sc()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let l=await n.getPage(d),c=l.getViewport({scale:1}),u=Math.min(1.5,820/c.width),h=l.getViewport({scale:u}),x=document.createElement("canvas");x.width=Math.floor(h.width),x.height=Math.floor(h.height),x.className="office-pdf-page",x.dataset.page=String(d),await l.render({canvasContext:x.getContext("2d"),viewport:h}).promise,o.push(`
1050
1049
  <figure class="office-pdf-figure">
1051
1050
  <figcaption class="office-pdf-cap">Page ${d} / ${s}</figcaption>
1052
1051
  ${x.outerHTML}
1053
- </figure>`)}let r=s>a?`<p class="text-xs text-base-content/50 px-2">Showing first ${a} of ${s} pages \u2014 download for full file.</p>`:"";return`
1052
+ </figure>`)}let i=s>a?`<p class="text-xs text-base-content/50 px-2">Showing first ${a} of ${s} pages \u2014 download for full file.</p>`:"";return`
1054
1053
  <div class="office-preview office-pdf overflow-auto flex-1 p-3 space-y-3">
1055
1054
  <p class="text-xs text-base-content/50 px-1">PDF preview \xB7 ${s} page(s)</p>
1056
- ${r}
1055
+ ${i}
1057
1056
  ${o.join("")}
1058
- </div>`}async function xc(e,t,n){let s=Er(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=rc(t),r;if(s==="docx")r=await pc(o);else if(s==="xlsx")r=await fc(o);else if(s==="pptx")r=await hc(o);else if(s==="pdf")r=await gc(o);else throw new Error("Unsupported office type");return es(e,n,a[s]||s)+r}function vc(e,t){let n=e?e.split("/"):[],s=t?n.slice(0,-1):n,a='<span class="cursor-pointer text-primary hover:underline" data-dir-path="">root</span>',o="";for(let r of s)o=o?`${o}/${r}`:r,a+=` <span class="text-base-content/40">/</span> <span class="cursor-pointer text-primary hover:underline" data-dir-path="${p(o)}">${p(r)}</span>`;return t&&(a+=` <span class="text-base-content/40">/</span> <span>${p(n.at(-1))}</span>`),a}function yc(){let e=E.peek(),t=ce.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=z.peek(),a=e?.id||"_",o=[...n.files],r=!1;for(let d of o){let l=s?`${s}/${d.name}`:d.name,c=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(l)}`;try{let u=await fetch(c,{method:"POST",headers:dt(),body:d,duplex:"half"});if(!u.ok){let h=await u.json().catch(()=>({}));throw new Error(h.error||`HTTP ${u.status}`)}}catch(u){alert(`Upload failed (${d.name}): ${u.message}`),r=!0;break}}if(!r){let d=z.peek();z.value=d+"\0",z.value=d}}),n.click()}async function wc(e,t){let n=ce.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s=e?.id||"_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),r=`/api/projects/${s}/file?${o}`;try{let d=await fetch(r,{headers:dt(),credentials:"same-origin"});if(!d.ok){let h=await d.json().catch(()=>({}));throw new Error(h.error||`HTTP ${d.status}`)}let l=await d.blob(),c=URL.createObjectURL(l),u=document.createElement("a");u.href=c,u.download=a,u.rel="noopener",u.style.display="none",document.body.appendChild(u),u.click(),u.remove(),setTimeout(()=>URL.revokeObjectURL(c),6e4)}catch(d){try{let l=`/api/projects/${s}/file?${Ro({root:n,path:t,download:"true"})}`,c=document.createElement("a");c.href=l,c.download=a,c.rel="noopener",c.target="_blank",document.body.appendChild(c),c.click(),c.remove()}catch{alert(`Download failed: ${d.message}`)}}}async function kc(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=ce.peek()||e?.path||"",s=e?.id||"_";try{await y("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),z.value=z.peek()+" ",z.value=z.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function $c(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=Er(t);if(o&&n.encoding==="base64"){e.innerHTML=es(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let r=await xc(t,n.content,a);if(s.aborted)return;e.innerHTML=r}catch(r){if(s.aborted)return;e.innerHTML=es(t,a,o)+`<div class="p-4 text-xs text-error">Preview failed: ${p(r.message)} \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`}return}if(n.encoding==="base64"){e.innerHTML=es(t,a,"binary")+`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`;return}e.innerHTML=uc(t,n.content||"",a),cc(e)}function Tr(){Ce(()=>{let e=i("files-breadcrumb");if(!e)return;let t=re.value!==null;e.innerHTML=`
1059
- ${vc(re.value??z.value,t)}
1057
+ </div>`}async function Ec(e,t,n){let s=Ar(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=hc(t),i;if(s==="docx")i=await yc(o);else if(s==="xlsx")i=await wc(o);else if(s==="pptx")i=await $c(o);else if(s==="pdf")i=await Lc(o);else throw new Error("Unsupported office type");return ts(e,n,a[s]||s)+i}function Tc(e,t){let n=e?e.split("/"):[],s=t?n.slice(0,-1):n,a='<span class="cursor-pointer text-primary hover:underline" data-dir-path="">root</span>',o="";for(let i of s)o=o?`${o}/${i}`:i,a+=` <span class="text-base-content/40">/</span> <span class="cursor-pointer text-primary hover:underline" data-dir-path="${p(o)}">${p(i)}</span>`;return t&&(a+=` <span class="text-base-content/40">/</span> <span>${p(n.at(-1))}</span>`),a}function Mc(){let e=E.peek(),t=ce.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=K.peek(),a=e?.id||"_",o=[...n.files],i=!1;for(let d of o){let l=s?`${s}/${d.name}`:d.name,c=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(l)}`;try{let u=await fetch(c,{method:"POST",headers:dt(),body:d,duplex:"half"});if(!u.ok){let h=await u.json().catch(()=>({}));throw new Error(h.error||`HTTP ${u.status}`)}}catch(u){alert(`Upload failed (${d.name}): ${u.message}`),i=!0;break}}if(!i){let d=K.peek();K.value=d+"\0",K.value=d}}),n.click()}async function Ic(e,t){let n=ce.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s=e?.id||"_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),i=`/api/projects/${s}/file?${o}`;try{let d=await fetch(i,{headers:dt(),credentials:"same-origin"});if(!d.ok){let h=await d.json().catch(()=>({}));throw new Error(h.error||`HTTP ${d.status}`)}let l=await d.blob(),c=URL.createObjectURL(l),u=document.createElement("a");u.href=c,u.download=a,u.rel="noopener",u.style.display="none",document.body.appendChild(u),u.click(),u.remove(),setTimeout(()=>URL.revokeObjectURL(c),6e4)}catch(d){try{let l=`/api/projects/${s}/file?${Oo({root:n,path:t,download:"true"})}`,c=document.createElement("a");c.href=l,c.download=a,c.rel="noopener",c.target="_blank",document.body.appendChild(c),c.click(),c.remove()}catch{alert(`Download failed: ${d.message}`)}}}async function Cc(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=ce.peek()||e?.path||"",s=e?.id||"_";try{await y("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),K.value=K.peek()+" ",K.value=K.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function Ac(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=Ar(t);if(o&&n.encoding==="base64"){e.innerHTML=ts(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let i=await Ec(t,n.content,a);if(s.aborted)return;e.innerHTML=i}catch(i){if(s.aborted)return;e.innerHTML=ts(t,a,o)+`<div class="p-4 text-xs text-error">Preview failed: ${p(i.message)} \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`}return}if(n.encoding==="base64"){e.innerHTML=ts(t,a,"binary")+`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`;return}e.innerHTML=vc(t,n.content||"",a),gc(e)}function jr(){Ce(()=>{let e=r("files-breadcrumb");if(!e)return;let t=re.value!==null;e.innerHTML=`
1058
+ ${Tc(re.value??K.value,t)}
1060
1059
  <div class="flex-1"></div>
1061
- ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Tn(async e=>{let t=U.value,n=E.value,s=(ce.value||n?.path||"").trim(),a=re.value,o=z.value,r=i("files-area");if(!r||t!=="files")return;if(!s){r.innerHTML='<div class="p-4 text-xs text-base-content/40">No path yet \u2014 open a session (uses that machine&apos;s cwd) or type an absolute path and press Go.</div>';return}let d=n?.id||"_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let u=await y("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await $c(r,a,u,e);return}let l=await y("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let c=Array.isArray(l)?l:Array.isArray(l?.files)?l.files:null;if(!c){r.innerHTML=`<div class="p-4 text-xs text-error">${p(l?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=dc(c)}catch(l){!e.aborted&&l?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${p(l.message)}</div>`)}}),g.on("click","[data-dir-path]",(e,t)=>{re.value=null,z.value=t.dataset.dirPath}),g.on("click","[data-file-path]",(e,t)=>{re.value=t.dataset.filePath}),g.on("click","#btn-upload",()=>yc()),g.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&wc(E.peek(),n)}),g.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&kc(E.peek(),n)}),g.on("click",".office-sheet-tab",(e,t)=>{let n=t.closest(".office-xlsx");if(!n)return;let s=t.dataset.sheetIdx;n.querySelectorAll(".office-sheet-tab").forEach(a=>a.classList.toggle("active",a===t)),n.querySelectorAll(".office-sheet-pane").forEach(a=>{a.classList.toggle("hidden",a.dataset.sheetPane!==s)})})}R();B();ue();var Mr=$(!1);function Sc(e){return e?e.split(`
1060
+ ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Mn(async e=>{let t=W.value,n=E.value,s=(ce.value||n?.path||"").trim(),a=re.value,o=K.value,i=r("files-area");if(!i||t!=="files")return;if(!s){i.innerHTML='<div class="p-4 text-xs text-base-content/40">No path yet \u2014 open a session (uses that machine&apos;s cwd) or type an absolute path and press Go.</div>';return}let d=n?.id||"_";i.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let u=await y("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await Ac(i,a,u,e);return}let l=await y("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let c=Array.isArray(l)?l:Array.isArray(l?.files)?l.files:null;if(!c){i.innerHTML=`<div class="p-4 text-xs text-error">${p(l?.error||"Invalid directory listing")}</div>`;return}i.innerHTML=xc(c)}catch(l){!e.aborted&&l?.name!=="AbortError"&&(i.innerHTML=`<div class="p-4 text-xs text-error">${p(l.message)}</div>`)}}),g.on("click","[data-dir-path]",(e,t)=>{re.value=null,K.value=t.dataset.dirPath}),g.on("click","[data-file-path]",(e,t)=>{re.value=t.dataset.filePath}),g.on("click","#btn-upload",()=>Mc()),g.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&Ic(E.peek(),n)}),g.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&Cc(E.peek(),n)}),g.on("click",".office-sheet-tab",(e,t)=>{let n=t.closest(".office-xlsx");if(!n)return;let s=t.dataset.sheetIdx;n.querySelectorAll(".office-sheet-tab").forEach(a=>a.classList.toggle("active",a===t)),n.querySelectorAll(".office-sheet-pane").forEach(a=>{a.classList.toggle("hidden",a.dataset.sheetPane!==s)})})}R();B();ue();var Dr=$(!1);function jc(e){return e?e.split(`
1062
1061
  `).map(t=>p(t).replace(/\b([0-9a-f]{7})\b/,'<span class="gh">$1</span>').replace(/\(([^)]*)\)/,'<span style="color:oklch(var(--wa))">($1)</span>')).join(`
1063
- `):'<span class="text-base-content/40">No commits</span>'}function Lc(e){if(!e)return"";if(!e.isGit)return'<div class="p-4 text-sm text-base-content/50">Not a git repository</div>';let t={M:"text-warning",D:"text-error"};return`
1062
+ `):'<span class="text-base-content/40">No commits</span>'}function Dc(e){if(!e)return"";if(!e.isGit)return'<div class="p-4 text-sm text-base-content/50">Not a git repository</div>';let t={M:"text-warning",D:"text-error"};return`
1064
1063
  <div class="px-4 py-2 text-xs text-base-content/50 border-b border-base-300">
1065
1064
  Branch: <span class="text-success font-semibold">${p(e.branch)}</span>
1066
1065
  </div>
@@ -1086,16 +1085,16 @@ ${t}`:"",n.length?n.join(`
1086
1085
  <span class="text-base-content/40">Loading\u2026</span>
1087
1086
  </div>
1088
1087
  </div>
1089
- </div>`}function Ec(e){return e.split(`
1088
+ </div>`}function Nc(e){return e.split(`
1090
1089
  `).map(t=>t.startsWith("+")&&!t.startsWith("+++")?`<span class="diff-add">${p(t)}</span>`:t.startsWith("-")&&!t.startsWith("---")?`<span class="diff-del">${p(t)}</span>`:t.startsWith("@@")?`<span class="diff-hunk">${p(t)}</span>`:/^(diff |index |---|[+]{3})/.test(t)?`<span class="diff-head">${p(t)}</span>`:`<span>${p(t)}</span>`).join(`
1091
- `)}function Ir(){Tn(async e=>{let t=U.value,n=E.value,s=be.value||n?.path,a=i("git-area");if(!a||t!=="git")return;if(!s){a.innerHTML='<div class="p-4 text-sm text-base-content/50">Enter a project root above, or open a session with a working directory.</div>';return}let o=n?.id||"_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await y("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Lc(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(r?.message??String(r))}</div>`)}}),Tn(async e=>{let t=E.value,n=be.value||t?.path,s=Mr.value,a=i("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let r=await y("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=r?.diff?Ec(r.diff):'<span class="text-base-content/40">No changes</span>')}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<span class="text-error">${p(r?.message??String(r))}</span>`)}}),g.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";Mr.value=n,i("diff-unstaged").className=`cursor-pointer ${n?"text-base-content/50":"text-primary"}`,i("diff-staged").className=`cursor-pointer ${n?"text-primary":"text-base-content/50"}`}),g.on("click","#git-graph-toggle",()=>{let e=i("git-graph-panel"),t=i("git-graph-chevron"),n=e.classList.toggle("hidden");t.textContent=n?"\u25B6":"\u25BC",n||Tc()})}function Tc(){let e=E.peek(),t=be.peek()||e?.path,n=i("git-graph-content");if(!t||!n)return;let s=e?.id||"_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',y("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?Sc(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}R();B();var we=null,H=null,ea=null,ss=!1,ta=null,Dr=null,ts=0,ns=null,ho=!1,Cr=!1,Ar={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function bo(e){we&&we.readyState===WebSocket.OPEN&&we.send(JSON.stringify({type:"input",data:e}))}function Mc(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function na(){if(Mc()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}H?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function Nr(){if(H)return;let e=i("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(Nr,100);return}H=new Terminal({cursorBlink:!0,fontFamily:"Fira Code, Courier New, monospace",fontSize:12,theme:{background:"#0d1117",foreground:"#c9d1d9",cursor:"#58a6ff",black:"#0d1117",red:"#ff7b72",green:"#3fb950",yellow:"#d29922",blue:"#58a6ff",magenta:"#bc8cff",cyan:"#39c5cf",white:"#b1bac4",brightBlack:"#484f58",brightRed:"#ffa198",brightGreen:"#56d364",brightYellow:"#e3b341",brightBlue:"#79c0ff",brightMagenta:"#d8b9ff",brightCyan:"#56d4dd",brightWhite:"#ffffff"}}),typeof FitAddon<"u"&&(ea=new FitAddon.FitAddon,H.loadAddon(ea)),H.open(e),Zs(),H.onData(n=>{bo(n)}),e.addEventListener("pointerdown",()=>na(),{passive:!0}),e.addEventListener("touchend",()=>na(),{passive:!0}),window.addEventListener("resize",()=>{Zs(),sa()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,U.peek()==="shell"&&(Zs(),sa())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function Zs(){try{ea&&H&&ea.fit()}catch{}}function sa(){we&&we.readyState===WebSocket.OPEN&&H&&we.send(JSON.stringify({type:"resize",cols:H.cols,rows:H.rows}))}function _r(){return f.machineId||j.peek()||null}function aa(e){ns&&(clearTimeout(ns),ns=null),ho=!0;let t=++ts;if(we){try{we.close()}catch{}we=null}ss=!1;let n=location.protocol==="https:"?"wss":"ws",s=H?H.cols:80,a=H?H.rows:24,o=new URLSearchParams;f.token&&o.set("token",f.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let r=_r();A.peek()&&r&&o.set("machine",r),ta=e||null,Dr=r,we=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),we.addEventListener("open",()=>{t===ts&&(ss=!0,H?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
1092
- `),sa())}),we.addEventListener("message",d=>{if(t!==ts)return;let l;try{l=JSON.parse(d.data)}catch{return}l.type==="output"?H?.write(l.data):l.type==="exit"?H?.write(`\r
1090
+ `)}function Nr(){Mn(async e=>{let t=W.value,n=E.value,s=be.value||n?.path,a=r("git-area");if(!a||t!=="git")return;if(!s){a.innerHTML='<div class="p-4 text-sm text-base-content/50">Enter a project root above, or open a session with a working directory.</div>';return}let o=n?.id||"_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let i=await y("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Dc(i))}catch(i){!e.aborted&&i?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(i?.message??String(i))}</div>`)}}),Mn(async e=>{let t=E.value,n=be.value||t?.path,s=Dr.value,a=r("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let i=await y("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=i?.diff?Nc(i.diff):'<span class="text-base-content/40">No changes</span>')}catch(i){!e.aborted&&i?.name!=="AbortError"&&(a.innerHTML=`<span class="text-error">${p(i?.message??String(i))}</span>`)}}),g.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";Dr.value=n,r("diff-unstaged").className=`cursor-pointer ${n?"text-base-content/50":"text-primary"}`,r("diff-staged").className=`cursor-pointer ${n?"text-primary":"text-base-content/50"}`}),g.on("click","#git-graph-toggle",()=>{let e=r("git-graph-panel"),t=r("git-graph-chevron"),n=e.classList.toggle("hidden");t.textContent=n?"\u25B6":"\u25BC",n||_c()})}function _c(){let e=E.peek(),t=be.peek()||e?.path,n=r("git-graph-content");if(!t||!n)return;let s=e?.id||"_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',y("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?jc(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}R();B();var we=null,H=null,ea=null,as=!1,ta=null,Rr=null,ns=0,ss=null,bo=!1,_r=!1,Pr={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function go(e){we&&we.readyState===WebSocket.OPEN&&we.send(JSON.stringify({type:"input",data:e}))}function Pc(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function na(){if(Pc()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}H?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function Or(){if(H)return;let e=r("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(Or,100);return}H=new Terminal({cursorBlink:!0,fontFamily:"Fira Code, Courier New, monospace",fontSize:12,theme:{background:"#0d1117",foreground:"#c9d1d9",cursor:"#58a6ff",black:"#0d1117",red:"#ff7b72",green:"#3fb950",yellow:"#d29922",blue:"#58a6ff",magenta:"#bc8cff",cyan:"#39c5cf",white:"#b1bac4",brightBlack:"#484f58",brightRed:"#ffa198",brightGreen:"#56d364",brightYellow:"#e3b341",brightBlue:"#79c0ff",brightMagenta:"#d8b9ff",brightCyan:"#56d4dd",brightWhite:"#ffffff"}}),typeof FitAddon<"u"&&(ea=new FitAddon.FitAddon,H.loadAddon(ea)),H.open(e),Zs(),H.onData(n=>{go(n)}),e.addEventListener("pointerdown",()=>na(),{passive:!0}),e.addEventListener("touchend",()=>na(),{passive:!0}),window.addEventListener("resize",()=>{Zs(),sa()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,W.peek()==="shell"&&(Zs(),sa())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function Zs(){try{ea&&H&&ea.fit()}catch{}}function sa(){we&&we.readyState===WebSocket.OPEN&&H&&we.send(JSON.stringify({type:"resize",cols:H.cols,rows:H.rows}))}function Br(){return f.machineId||j.peek()||null}function aa(e){ss&&(clearTimeout(ss),ss=null),bo=!0;let t=++ns;if(we){try{we.close()}catch{}we=null}as=!1;let n=location.protocol==="https:"?"wss":"ws",s=H?H.cols:80,a=H?H.rows:24,o=new URLSearchParams;f.token&&o.set("token",f.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let i=Br();A.peek()&&i&&o.set("machine",i),ta=e||null,Rr=i,we=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),we.addEventListener("open",()=>{t===ns&&(as=!0,H?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
1091
+ `),sa())}),we.addEventListener("message",d=>{if(t!==ns)return;let l;try{l=JSON.parse(d.data)}catch{return}l.type==="output"?H?.write(l.data):l.type==="exit"?H?.write(`\r
1093
1092
  \x1B[33m[process exited: ${l.code}]\x1B[0m\r
1094
1093
  `):l.type==="error"&&H?.write(`\r
1095
1094
  \x1B[31m[error: ${l.data||l.message||""}]\x1B[0m\r
1096
- `)}),we.addEventListener("close",()=>{t===ts&&(ss=!1,H?.write(`\r
1095
+ `)}),we.addEventListener("close",()=>{t===ns&&(as=!1,H?.write(`\r
1097
1096
  \x1B[33m[disconnected]\x1B[0m\r
1098
- `),!(!ho||U.peek()!=="shell")&&(H?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
1099
- `),ns=setTimeout(()=>{ns=null,aa(ta)},1500)))}),we.addEventListener("error",()=>{t===ts&&H?.write(`\r
1097
+ `),!(!bo||W.peek()!=="shell")&&(H?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
1098
+ `),ss=setTimeout(()=>{ss=null,aa(ta)},1500)))}),we.addEventListener("error",()=>{t===ns&&H?.write(`\r
1100
1099
  \x1B[31m[WebSocket error]\x1B[0m\r
1101
- `)})}function jr(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),H||Nr(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Zs();let n=_r();!ss||ta!==(e||null)||Dr!==n?(H?.clear(),aa(e)):sa()})})}function Pr(){Cr||(Cr=!0,document.getElementById("term-keyboard")?.addEventListener("click",na),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(bo(`${t.value}\r`),t.value="",t.focus({preventScroll:!0}))}),document.getElementById("term-mobile-keys")?.addEventListener("pointerdown",e=>{e.target.closest("[data-term-key]")&&e.preventDefault()}),document.getElementById("term-mobile-keys")?.addEventListener("click",e=>{let t=e.target.closest("[data-term-key]")?.dataset.termKey;!t||!Ar[t]||(bo(Ar[t]),na())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(U.peek()!=="shell"||!ho||ss||aa(ta))}),Le(U,e=>{e==="shell"&&jr()}),document.addEventListener("shell-tab-shown",()=>{U.peek()==="shell"&&jr()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{H?.clear(),aa(E.peek()?.path)})}hn();Kn();Ss();en();function go(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function oa(){document.documentElement.classList.remove("boot-restore")}var xo=_a(location.hash.slice(1)||"/"),Hr=fo()||!!(f.token&&xo?.id);Lr({restoreSession:Hr});Uo();yi();Tr();Ir();Mi();Pr();xi();Ui();ki(He,it);(async()=>{let e=Yt();if(f.token)try{let t=document.getElementById("auth-screen"),n=document.getElementById("app");if(t&&(t.style.display="none",t.classList.add("hidden")),n&&(n.style.display="flex",n.classList.remove("hidden")),Hr){document.documentElement.classList.add("boot-restore");let a=document.getElementById("welcome"),o=document.getElementById("project-view");a&&(a.classList.add("hidden"),a.style.display="none"),o&&(o.classList.remove("hidden"),o.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}let s=await e;await Ys({hub:s,deepLink:xo}),xo?.id||($i(),(location.hash||"").startsWith("#/session/")||oa()),requestAnimationFrame(()=>{requestAnimationFrame(go)})}catch(t){console.error("[boot]",t),f.token=null,localStorage.removeItem("token"),oa(),await po(),go()}else{oa();try{await po()}catch(t){console.error("[boot auth]",t)}finally{go()}}})();document.addEventListener("router:home",()=>{oa()});qo();
1100
+ `)})}function Hr(){let e=E.peek()?.path,t=r("term-cwd");t&&(t.textContent=e||"~"),H||Or(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Zs();let n=Br();!as||ta!==(e||null)||Rr!==n?(H?.clear(),aa(e)):sa()})})}function qr(){_r||(_r=!0,document.getElementById("term-keyboard")?.addEventListener("click",na),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(go(`${t.value}\r`),t.value="",t.focus({preventScroll:!0}))}),document.getElementById("term-mobile-keys")?.addEventListener("pointerdown",e=>{e.target.closest("[data-term-key]")&&e.preventDefault()}),document.getElementById("term-mobile-keys")?.addEventListener("click",e=>{let t=e.target.closest("[data-term-key]")?.dataset.termKey;!t||!Pr[t]||(go(Pr[t]),na())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(W.peek()!=="shell"||!bo||as||aa(ta))}),Le(W,e=>{e==="shell"&&Hr()}),document.addEventListener("shell-tab-shown",()=>{W.peek()==="shell"&&Hr()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{H?.clear(),aa(E.peek()?.path)})}bn();Kn();Ss();en();function xo(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function oa(){document.documentElement.classList.remove("boot-restore")}var vo=Pa(location.hash.slice(1)||"/"),Fr=mo()||!!(f.token&&vo?.id);Cr({restoreSession:Fr});Wo();Li();jr();Nr();Di();qr();$i();Ji();Ti(Re,it);(async()=>{let e=Yt();if(f.token)try{let t=document.getElementById("auth-screen"),n=document.getElementById("app");if(t&&(t.style.display="none",t.classList.add("hidden")),n&&(n.style.display="flex",n.classList.remove("hidden")),Fr){document.documentElement.classList.add("boot-restore");let a=document.getElementById("welcome"),o=document.getElementById("project-view");a&&(a.classList.add("hidden"),a.style.display="none"),o&&(o.classList.remove("hidden"),o.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}let s=await e;await Ys({hub:s,deepLink:vo}),vo?.id||(Mi(),(location.hash||"").startsWith("#/session/")||oa()),requestAnimationFrame(()=>{requestAnimationFrame(xo)})}catch(t){console.error("[boot]",t),f.token=null,localStorage.removeItem("token"),oa(),await fo(),xo()}else{oa();try{await fo()}catch(t){console.error("[boot auth]",t)}finally{xo()}}})();document.addEventListener("router:home",()=>{oa()});Fo();