claude-simple 0.2.31 → 0.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/edge-ctl.js +0 -1
- package/client.js +17 -7
- package/dist/{app.0.2.31.min.js → app.0.2.32.min.js} +134 -134
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/public/cache.js +41 -5
- package/public/files.js +23 -1
- package/public/index.html +2 -2
- package/public/shell/session-nav.js +2 -0
- package/public/sw.js +3 -3
- package/src/agents/sessions.js +26 -0
- package/src/app.js +3 -1
- package/src/runtime/http-transfer.js +70 -0
- /package/dist/{style.0.2.31.min.css → style.0.2.32.min.css} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
var $d=Object.defineProperty;var F=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var ls=(e,t)=>{for(var n in t)$d(e,n,{get:t[n],enumerable:!0})};function Ld(){Ho||(Ho=!0,queueMicrotask(()=>{Ho=!1,Oo()}))}function wi(e){for(let t of e)(t._isComputed?En:In).add(t);Ro>0||na||(Sd==="microtask"?Ld():Oo())}function $i(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=[Gt,us,No];[Gt,us,No]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[Gt,us,No]=o}}var Gt,us,Ro,No,En,In,na,cs,Po,Sd,Ho,Oo,ki,I,Bo,je,xe,De,Tn,Ed,p,b,Si,i,qo,Id,ot,ds,Td,sa,Cd,Of,aa,Bf,Uf,Li,Ei=F(()=>{Gt=null,us=null,Ro=0,No=null,En=new Set,In=new Set,na=!1,cs=1e4,Po={flushes:0,runs:0,lastFlushRuns:0},Sd="sync",Ho=!1;Oo=()=>{if(na)return;na=!0;let e=0;Po.flushes++;try{for(;En.size||In.size;){for(;En.size;){let t=En.values().next().value;if(En.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}if(In.size){let t=In.values().next().value;if(In.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}}}finally{Po.runs+=e,Po.lastFlushRuns=e,e>cs&&(En.clear(),In.clear()),na=!1}};ki=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return Gt&&(this._subs.add(Gt),us?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,wi(this._subs))}peek(){return this._v}},I=(e,{equals:t}={})=>new ki(e,t);Bo=e=>{let t=new ki(void 0),n=new Set,s=!0,a=!1,o=u=>{if(!s||a)return t._v;s=!1;try{let l=$i(e,r,n,null),f=l!==t._v;f&&(t._v=l),f&&u&&wi(t._subs)}catch(l){s=!0,console.error("[computed]",l)}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 Gt&&(t._subs.add(Gt),us?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let u of n)u._subs.delete(r);n.clear()}},t},je=e=>{let t=new Set,n=[],s=()=>{try{let a=$i(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)}},xe=e=>{Ro++;try{e()}finally{--Ro===0&&Oo()}},De=(e,t)=>{let n=e.peek(),s=!1;return je(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Tn=e=>je(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),Ed={"&":"&","<":"<",">":">",'"':"""},p=e=>String(e??"").replace(/[&<>"]/g,t=>Ed[t]),b=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{xe(()=>{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))}}})(),Si=(e,{keepAlive:t=!1}={})=>{let n=I(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,r=(l,f)=>{if(!t)return f();if(o.has(l))return o.get(l);let m=f();return o.set(l,m),m},d=I(void 0),u=je(()=>{let l=n.value;for(let[f,m]of Object.entries(e)){if(f==="*")continue;let g=new RegExp("^"+f.replace(/:\w+/g,"([^/]+)")+"$"),w=l.match(g);if(w){let y=w.slice(1);d.value=typeof m=="function"?r(`${f}|${y.join("/")}`,()=>m(...y)):m;return}}if(e["*"]){let f=e["*"];d.value=typeof f=="function"?r("*",f):f;return}d.value=null});return{current:n,route:d,navigate:l=>{s||(location.hash=l)},match:l=>{let f=n.value.match(new RegExp("^"+l.replace(/:\w+/g,"([^/]+)")+"$"));return f?f.slice(1):null},invalidate:l=>{if(o){if(l===void 0){o.clear();return}for(let f of[...o.keys()])(f===l||f.startsWith(`${l}|`))&&o.delete(f)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),u(),o?.clear())}}},i=e=>document.getElementById(e),qo=()=>typeof navigator>"u"||navigator.onLine!==!1,Id=e=>new Promise(t=>setTimeout(t,e)),ot=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(ot).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ot(e[t])}`).join(",")}}`,ds=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=ot(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))},Td=e=>{try{return JSON.stringify(e),!0}catch{return!1}},sa=(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)=>sa(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]=sa(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Cd=({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,u=new Map,l=null,f=!1,m=h=>{for(let v of d)v(h)},g=h=>h.state,w=h=>!h.invalidated&&Date.now()-h.state.updatedAt.peek()<h.options.staleTime,y=h=>{h.invalidated=!0,h.state.isStale.value=!0},H=h=>{h.gcTimer&&clearTimeout(h.gcTimer),h.gcTimer=null},me=h=>{H(h),!h.observers&&Number.isFinite(h.options.gcTime)&&(h.gcTimer=setTimeout(()=>{!h.observers&&!h.promise&&(r.delete(h.hash),m({type:"gc",key:h.key}))},h.options.gcTime))},J=h=>{h.pollTimer&&clearTimeout(h.pollTimer),h.pollTimer=null},ue=h=>{J(h);let v=typeof h.options.refetchInterval=="function"?h.options.refetchInterval(h):h.options.refetchInterval;h.observers&&Number.isFinite(v)&&v>0&&(h.pollTimer=setTimeout(async()=>{qo()&&await he(h,{force:!0}).catch(()=>{}),ue(h)},v))},q=(h,v=ot(h.queryKey))=>{let k={staleTime:e,gcTime:t,retry:n,retryDelay:s,...h},S={hash:v,key:h.queryKey,queryFn:h.queryFn,options:k,tags:new Set(h.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:I(h.initialData),error:I(null),status:I(h.initialData===void 0?"idle":"success"),fetchStatus:I("idle"),updatedAt:I(h.initialData===void 0?0:Date.now()),isStale:I(!0)}};return r.set(v,S),S},Q=h=>{if(!h?.queryKey)throw new TypeError("query: queryKey is required");let v=ot(h.queryKey),k=r.get(v)??q(h,v);h.queryFn&&(k.queryFn=h.queryFn),k.options={...k.options,...h};for(let S of h.tags??[])k.tags.add(S);return k},he=(h,{force:v=!1}={})=>{if(!h.queryFn)return Promise.reject(new TypeError(`query ${h.hash} has no queryFn`));if(!v&&w(h))return Promise.resolve(h.state.data.peek());if(h.promise)return h.promise;if(!qo())return h.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));H(h);let k=++h.version,S=new AbortController;h.ctrl=S,xe(()=>{h.state.data.peek()===void 0&&(h.state.status.value="pending"),h.state.fetchStatus.value="fetching",h.state.error.value=null}),m({type:"fetch",key:h.key});let B=async(A,V)=>{try{return await h.queryFn({queryKey:h.key,signal:S.signal,meta:h.options.meta})}catch(R){if(S.signal.aborted||R?.name==="AbortError"||A<=0||h.options.retry===!1)throw R;return await Id(typeof V=="function"?V(A,R):V),B(A-1,typeof V=="number"?V*2:V)}},U=B(h.options.retry??n,h.options.retryDelay??s).then(A=>(h.version===k&&!S.signal.aborted&&xe(()=>{h.state.data.value=h.options.structuralSharing===!1?A:sa(h.state.data.peek(),A),h.state.status.value="success",h.state.fetchStatus.value="idle",h.state.updatedAt.value=Date.now(),h.state.isStale.value=!1,h.invalidated=!1}),m({type:"success",key:h.key}),A)).catch(A=>{throw h.version===k&&!S.signal.aborted&&xe(()=>{h.state.error.value=A,h.state.status.value=h.state.data.peek()===void 0?"error":"success",h.state.fetchStatus.value="idle"}),S.signal.aborted||m({type:"error",key:h.key,error:A}),A}).finally(()=>{h.promise===U&&(h.promise=null,h.ctrl=null,me(h))});return h.promise=U,U},Ae=h=>Promise.all([...r.values()].filter(v=>ds(v,h)&&v.observers).map(v=>he(v,{force:!0}).catch(()=>{}))),L={query(h){let v=Q(h);v.observers++,H(v),ue(v),h.enabled!==!1&&(!w(v)||h.refetchOnMount)&&he(v).catch(()=>{});let k=()=>{v.observers=Math.max(0,v.observers-1),me(v),ue(v)};return[g(v),{refetch:()=>he(v,{force:!0}),invalidate:()=>L.invalidateQueries({queryKey:v.key,exact:!0}),setData:S=>L.setQueryData(v.key,S),cancel:()=>L.cancelQueries({queryKey:v.key,exact:!0}),dispose:k}]},prefetchQuery(h){let v=Q(h);return he(v)},fetchQuery(h){let v=Q(h);return he(v)},getQueryData(h){return r.get(ot(h))?.state.data.peek()},getQueryState(h){let v=r.get(ot(h));return v&&g(v)},setQueryData(h,v,{tags:k}={}){let S=r.get(ot(h))??Q({queryKey:h,tags:k}),B=typeof v=="function"?v(S.state.data.peek()):v,U=S.options.structuralSharing===!1?B:sa(S.state.data.peek(),B);xe(()=>{S.state.data.value=U,S.state.status.value="success",S.state.error.value=null,S.state.updatedAt.value=Date.now(),S.state.isStale.value=!1}),S.invalidated=!1;for(let A of k??[])S.tags.add(A);return m({type:"set",key:S.key}),l&&l.postMessage({type:"invalidate",hash:S.hash}),U},invalidateQueries(h){for(let v of r.values())ds(v,h)&&y(v);return m({type:"invalidate",filter:h}),l&&l.postMessage({type:"invalidate",filter:h}),Ae(h)},cancelQueries(h){for(let v of r.values())ds(v,h)&&v.ctrl?.abort()},removeQueries(h){for(let v of[...r.values()])ds(v,h)&&(v.ctrl?.abort(),H(v),J(v),r.delete(v.hash))},mutate({mutationFn:h,variables:v,optimistic:k,invalidate:S,onMutate:B,onSuccess:U,onError:A,networkMode:V="online"}={}){if(typeof h!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let R=[],ve=j=>(Array.isArray(j)?j:[j]).filter(Boolean).forEach(ce=>{let Wt=L.getQueryData(ce.queryKey);R.push([ce.queryKey,Wt]),L.setQueryData(ce.queryKey,Ln=>ce.updater(Ln))}),Ke=async()=>{let j=await B?.(v,{client:L});k&&ve(typeof k=="function"?k(v):k);try{let ce=await h(v);return await U?.(ce,v,j),S&&await L.invalidateQueries(S),m({type:"mutation-success"}),ce}catch(ce){for(let[Wt,Ln]of R)L.setQueryData(Wt,Ln);throw await A?.(ce,v,j),m({type:"mutation-error",error:ce}),ce}};return!qo()&&V==="offlineFirst"?(ge.push(Ke),m({type:"mutation-queued"}),Promise.resolve({queued:!0})):Ke()},infiniteQuery({queryKey:h,queryFn:v,initialPageParam:k=0,getNextPageParam:S,...B}){let[U,A]=L.query({queryKey:h,...B,queryFn:async V=>({pages:[await v({...V,pageParam:k})],pageParams:[k]})});return[U,{...A,fetchNextPage:async()=>{let V=U.data.peek()??{pages:[],pageParams:[]},R=S?.(V.pages.at(-1),V.pages);if(R==null)return;let ve=await v({queryKey:h,pageParam:R,signal:new AbortController().signal});return L.setQueryData(h,{pages:[...V.pages,ve],pageParams:[...V.pageParams,R]}),ve}}]},dehydrate({shouldDehydrate:h=k=>k.state.status.peek()==="success",version:v=1}={}){return{version:v,timestamp:Date.now(),queries:[...r.values()].filter(h).filter(k=>Td(k.state.data.peek())).map(k=>({key:k.key,data:k.state.data.peek(),updatedAt:k.state.updatedAt.peek(),staleTime:k.options.staleTime,tags:[...k.tags]}))}},hydrate(h,{version:v=1}={}){if(!h||h.version!==v||!Array.isArray(h.queries))return!1;for(let k of h.queries){let S=r.get(ot(k.key))??Q({queryKey:k.key,staleTime:k.staleTime,tags:k.tags});xe(()=>{S.state.data.value=k.data,S.state.status.value="success",S.state.updatedAt.value=k.updatedAt,S.state.isStale.value=Date.now()-k.updatedAt>=S.options.staleTime}),S.invalidated=S.state.isStale.peek()}return m({type:"hydrate"}),!0},persist({storage:h=typeof localStorage>"u"?null:localStorage,key:v="mini-react-query",version:k=1}={}){if(!h)throw new Error("persist: a storage adapter is required");let S=!1,B=async()=>{let A=JSON.stringify(L.dehydrate({version:k}));return h.set?h.set(v,A):h.setItem(v,A)},U=L.subscribe(()=>{S||(S=!0,queueMicrotask(()=>{S=!1,B().catch(()=>{})}))});return{restore:async()=>{let A=await(h.get?h.get(v):h.getItem(v));return A?L.hydrate(JSON.parse(A),{version:k}):!1},save:B,dispose:U}},sync(h="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(l?.close(),l=new BroadcastChannel(h),l.onmessage=v=>{if(v.data?.type!=="invalidate")return;let k=v.data.hash?S=>S.hash===v.data.hash:v.data.filter;for(let S of r.values())ds(S,k)&&y(S);Ae(k)},()=>{l?.close(),l=null})},subscribe(h){return d.add(h),()=>d.delete(h)},getDebugSnapshot(){return[...r.values()].map(h=>({key:h.key,observers:h.observers,status:h.state.status.peek(),fetchStatus:h.state.fetchStatus.peek(),updatedAt:h.state.updatedAt.peek(),stale:h.state.isStale.peek(),tags:[...h.tags]}))},async fetchJSON(h,v={},{queryKey:k=["GET",h,v.body??null],...S}={}){let B=ot(k);return L.fetchQuery({queryKey:k,...S,queryFn:async({signal:U})=>{let A=new Headers(v.headers),V=u.get(B);V?.etag&&A.set("If-None-Match",V.etag);let R=await fetch(h,{...v,headers:A,signal:U});if(R.status===304&&V)return L.getQueryData(k);if(!R.ok)throw new Error(`HTTP ${R.status}`);let ve=R.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(ve){let Ke=r.get(B);Ke&&(Ke.options.staleTime=Number(ve)*1e3)}return u.set(B,{etag:R.headers.get("etag")}),R.json()}})},destroy(){f=!0;for(let h of r.values())h.ctrl?.abort(),H(h),J(h);l?.close(),d.clear()}},ge=[],be=()=>{a&&Ae()},ae=()=>{for(o&&Ae();ge.length;)ge.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",be),window.addEventListener("online",ae));let Ft=L.destroy;return L.destroy=()=>{f||(typeof window<"u"&&(window.removeEventListener("focus",be),window.removeEventListener("online",ae)),Ft())},L},Of=Cd(),aa=({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,u=new Map,l=(m,g)=>{if(a)return a.get(m);let w=r.get(m);return w&&Date.now()-w.ts<g?w.data:void 0},f=async(m,g,w)=>{if(a)return a.set(m,g,{ttl:w});r.set(m,{data:g,ts:Date.now()})};return{get:(m,g,w={})=>{let y=w.ttl??t,H=e&&w.cache!==!1&&y!==0,me=w.dedupe??o;if(me&&d.has(m))return d.get(m);let J=()=>{let q=u.get(m)??0,Q=(he,Ae)=>Promise.resolve(g()).then(async L=>(H&&(u.get(m)??0)===q&&await f(m,L,y),L)).catch(L=>{if(he>0&&L?.name!=="AbortError")return new Promise(ge=>setTimeout(ge,Ae)).then(()=>Q(he-1,Ae*2));throw L});return Q(w.retry??n,s)},ue=q=>(me&&(d.set(m,q),q.finally(()=>{d.get(m)===q&&d.delete(m)}).catch(()=>{})),q);if(!H)return ue(J());if(!a){let q=l(m,y);return q!==void 0?Promise.resolve(q):ue(J())}return ue(Promise.resolve(l(m,y)).then(q=>q!==void 0?q:J()))},invalidate:m=>{if(m!==void 0)u.set(m,(u.get(m)??0)+1);else{for(let g of r.keys())u.set(g,(u.get(g)??0)+1);for(let g of d.keys())u.set(g,(u.get(g)??0)+1)}if(a)return m===void 0?a.clear():a.delete(m);m===void 0?r.clear():r.delete(m)}}},Bf=new TextEncoder,Uf=new TextDecoder,Li=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=u=>u.target.result.createObjectStore(t),d.onsuccess=u=>{n=u.target.result,o(n)},d.onerror=u=>r(u.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((u,l)=>{let f=d.transaction(t,o),m=r(f.objectStore(t));m.onsuccess=()=>u(m.result),m.onerror=()=>l(m.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",u=>u.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 G=F(()=>{Ei()});var Ni={};ls(Ni,{AGENT_DEFAULT_MODEL:()=>ji,AGENT_LABELS:()=>Z,AGENT_MODELS:()=>Uo,LOW_TURN_THRESHOLD:()=>Wo,activityHits:()=>rt,activityLoading:()=>gt,addCustomModel:()=>Jt,agentFilter:()=>ye,agentFilters:()=>zt,agentsMeta:()=>Kt,chatDensity:()=>_e,collapsedFolders:()=>Mn,ctx:()=>c,currentAgent:()=>$,currentEffort:()=>te,currentModel:()=>_,currentPermission:()=>de,currentProject:()=>E,currentTab:()=>X,expandedFolders:()=>Cn,favoritesOnly:()=>ze,filesPath:()=>Y,filesRoot:()=>re,filteredSessions:()=>Dt,getCustomModels:()=>ra,getDefaultEffort:()=>Qe,getDefaultModel:()=>Be,getEffortsForModel:()=>Qt,getModelsForAgent:()=>Oe,getSavedModel:()=>Ai,getSessionMeta:()=>An,gitRoot:()=>Se,hubMachineReady:()=>it,hubMode:()=>M,isProcessing:()=>N,machinesList:()=>ie,metaKey:()=>z,projectGroups:()=>Vt,removeCustomModel:()=>zo,selectedMachineId:()=>D,sessionDisplayTitle:()=>bt,sessionFilter:()=>ke,sessionMetaMap:()=>T,sessionSearch:()=>$e,sessionSort:()=>Ii,sessionsData:()=>ne,setAgent:()=>Ne,setChatDensity:()=>Go,setCurrentModel:()=>se,setSelectedMachine:()=>Le,showHiddenOnly:()=>Je,sidebarView:()=>ht,timeRange:()=>oa,viewingFile:()=>oe,workspacesData:()=>pe,wsStatus:()=>fe});function Ci(){try{let e=JSON.parse(localStorage.getItem(Ti)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Mi(e,t=c.sessionId,n=c.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Ai(e,t=c.sessionId,n=c.machineId){let s=Mi(e,t,n);if(!s)return null;let a=Ci()[s];return typeof a=="string"&&a.trim()?a:null}function se(e,t=$.peek(),n=c.sessionId,s=c.machineId){let a=String(e||"").trim();if(!a)return;let o=Mi(t,n,s);if(o){let r=Ci();r[o]=a,localStorage.setItem(Ti,JSON.stringify(r))}_.value=a}function Le(e){let t=e||null;D.value=t,c.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function z(e,t,n){let s=`${e||"claude"}:${t}`;return n||c?.machineId?`${n||c.machineId}:${s}`:s}function An(e,t,n){return T.peek()?.[z(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function bt(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(An(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function Go(e){let t=["clean","normal","full"].includes(e)?e:"normal";_e.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Ad(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 Ko(){try{let e=localStorage.getItem(Di);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function _i(e){localStorage.setItem(Di,JSON.stringify(e))}function ra(e){let t=(e||"claude").toLowerCase(),n=Ko()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Jt(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=Ko(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,_i(a),!0}function zo(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=Ko(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,_i(a),!0}function Oe(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Ad).filter(Boolean):(Uo[t]||Uo.claude).map(r=>({...r})),a=ra(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 u=String(d.label||d.value);return{...d,custom:!0,label:u.includes("\u2605")?u:`${u} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function Be(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t];return n?.model?String(n.model):ji[t]||Oe(t)[0]?.value||"sonnet"}function Qt(e,t){let s=Oe(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 Qe(e,t){let n=(e||"claude").toLowerCase(),s=Kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Oe(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 Ne(e){let t=(e||"claude").toLowerCase();$.value=t,localStorage.setItem("agent",t),de.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=de.peek());let s=Ai(t);s?_.value=s:se(Be(t),t);let a=Qe(t,_.peek());a?te.value=a:t!=="grok"&&t!=="gemini"&&(te.value="")}function jd(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Dd(e,t){if(!t)return!0;let n=T.value?.[z(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 Fo(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var ne,pe,ke,$e,Ii,Cn,Mn,Y,oe,E,X,N,fe,Ti,Md,$,_,te,de,re,Se,Kt,ht,ye,zt,oa,rt,gt,T,ze,Je,Wo,_e,M,ie,D,it,c,Z,Uo,ji,Di,Dt,Vt,W=F(()=>{G();ne=I([]),pe=I([]),ke=I(null),$e=I(""),Ii=I("time"),Cn=I(new Set),Mn=I(new Set),Y=I(""),oe=I(null),E=I(null),X=I("chat"),N=I(!1),fe=I("idle"),Ti="modelBySession",Md=localStorage.getItem("agent")||"claude";$=I(Md),_=I("sonnet"),te=I(""),de=I("bypassPermissions"),re=I(""),Se=I(""),Kt=I(null),ht=I(localStorage.getItem("sidebarView")||"projects"),ye=I(localStorage.getItem("agentFilter")||"all"),zt=I((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),oa=I(localStorage.getItem("timeRange")||"14"),rt=I(null),gt=I(!1),T=I({}),ze=I(localStorage.getItem("favoritesOnly")==="1"),Je=I(localStorage.getItem("showHiddenOnly")==="1"),Wo=2,_e=I(localStorage.getItem("chatDensity")||"normal"),M=I(!1),ie=I([]),D=I(null),it=I(!1),c={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null,externalSessionReadOnly:!1,role:null,username:null,lock:{key:null,token:null,holder:null,held:!1,foreign:!1}};Z={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},Uo={claude:[{value:"fable",label:"fable"},{value:"opus",label:"opus"},{value:"sonnet",label:"sonnet"},{value:"haiku",label:"haiku"}],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"}]},ji={claude:"sonnet",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};Di="customModelsByAgent";Dt=Bo(()=>{let e=$e.value.toLowerCase().trim(),t=Ii.value,n=ye.value,s=zt.value,a=ze.value,o=Je.value,r=T.value,d=rt.value,u=d?.results?.length&&e?Fo(d.results):Fo(ne.value),l=D.value;return M.value&&l&&(u=u.filter(f=>f&&(!f.machineId||f.machineId===l))),u=u.filter(f=>f&&(s.length?s.includes(f.agent||"claude"):jd(f,n))),o?u=u.filter(f=>f&&r?.[z(f.agent,f.sessionId,f.machineId)]?.hidden):u=u.filter(f=>f&&!r?.[z(f.agent,f.sessionId,f.machineId)]?.hidden),a&&(u=u.filter(f=>f&&r?.[z(f.agent,f.sessionId,f.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(u=u.filter(f=>f&&Dd(f,e))),u=[...u].sort((f,m)=>{let g=r?.[z(f.agent,f.sessionId,f.machineId)]?.favorite?1:0,w=r?.[z(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return g!==w?w-g:t==="project"&&(f.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-f.updatedAt}),!e&&!a?u.slice(0,120):u}),Vt=Bo(()=>{let e=Fo(Dt.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 ps(e={}){return e.machineId!==void 0?e.machineId:c.machineId||D.peek()||null}function Pd(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/notes"||t.startsWith("/api/notes/")||t==="/api/queue"||t.startsWith("/api/queue/")||t.startsWith("/api/ai/")||t.startsWith("/api/auth/")||t.startsWith("/api/collab/")}async function x(e,t,n,s,a={}){let o=a.hub?null:ps(a),r={"Content-Type":"application/json",...c.token?{Authorization:`Bearer ${c.token}`}:{}};!a.hub&&M.peek()&&o&&!Pd(t)&&(r["X-Machine-Id"]=o),e.toUpperCase()!=="GET"&&e.toUpperCase()!=="HEAD"&&c.lock?.token&&c.lock?.key&&!String(t).startsWith("/api/collab/")&&(r["X-Lock-Token"]=c.lock.token,r["X-Lock-Key"]=c.lock.key);let u=a.etag===!0?`${c.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&u){let m=Hi.get(u);m&&(r["If-None-Match"]=m)}let l=async()=>{let m=await fetch(t,{method:e,signal:s,headers:r,cache:a.cache||(e.toUpperCase()==="GET"?"no-store":"default"),...n!==void 0?{body:JSON.stringify(n)}:{}});if(m.status===304)return Nd;let g=await m.json().catch(()=>({}));if(!m.ok)throw new Error(g.error||`HTTP ${m.status}`);if(u){let w=m.headers.get("ETag");w&&Hi.set(u,w)}return g};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let f=`${c.token||""}:${o||""}:${t}`;return _d.get(f,l)}function lt(e){return c.ws?.readyState===WebSocket.OPEN?(c.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||ia.push(e),!1)}function la(){for(;ia.length&&c.ws?.readyState===WebSocket.OPEN;)c.ws.send(JSON.stringify(ia.shift()))}function ca(){ia.length=0}function Jo(e={}){let t=new URLSearchParams(e);c.token&&t.set("token",c.token);let n=ps();return M.peek()&&n&&t.set("machine",n),t.toString()}function ct(e={},t={}){let n={...e};c.token&&(n.Authorization=`Bearer ${c.token}`);let s=ps();return!t.hub&&M.peek()&&s&&(n["X-Machine-Id"]=s),n}async function da(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}var _d,Hi,Nd,ia,le=F(()=>{W();G();_d=aa({cache:!1,dedupe:!0,retry:0}),Hi=new Map,Nd=Symbol("not-modified");ia=[]});function Yt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function jn(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function Ee(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Yt(t,!s)}Yt(document.getElementById("welcome"),jn(document.getElementById("welcome"))),Yt(document.getElementById("auth-screen"),jn(document.getElementById("auth-screen"))),Yt(document.getElementById("chat-opts"),jn(document.getElementById("chat-opts"))),Yt(document.getElementById("machine-picker"),jn(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Yt(a,jn(a))}let n=document.getElementById("tab-chat");n&&Yt(n,jn(n))}function fs(){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 Ri(){Ee(),fs();let e=window.visualViewport;e&&(e.addEventListener("resize",fs),e.addEventListener("scroll",fs)),window.addEventListener("resize",()=>{fs(),Ee()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{fs(),Ee()},250)})}var Dn=F(()=>{});function Xt(){try{let e=localStorage.getItem(Oi);return e?JSON.parse(e):null}catch{return null}}function Qo(e){try{let n={...Xt()||{},...e,updatedAt:Date.now()};localStorage.setItem(Oi,JSON.stringify(n))}catch{}}var Oi,pa=F(()=>{Oi="lastSessionContext"});function Hd(e){let t=String(e??"").trim();if(!t)return"";try{return decodeURIComponent(t)}catch{return t}}function Bi(e){return String(e||"").replace(/\\/g,"/")}function qd(e){return e.replace(/:[0-9]+(?::[0-9]+)?$/,"")}function fa(e,t){let n=Hd(e);if(!n||/^(https?:|mailto:|tel:|javascript:|#)/i.test(n)||(n=Bi(n).split(/[?#]/)[0],n=n.replace(/^file:\/\//i,""),/^\/[A-Za-z]:\//.test(n)&&(n=n.slice(1)),!n||n==="."||n==="/")||/^\/(api|ws|session)\b/.test(n))return null;let s=n.endsWith("/"),a=qd(n.replace(/\/+$/,"")),o=Bi(t).replace(/\/+$/,"");if((a.startsWith("/")||/^[A-Za-z]:\//.test(a))&&o){let d=a.toLowerCase(),u=o.toLowerCase();if(d===u)return{relative:"",isDir:!0,root:o};if(d.startsWith(`${u}/`))return{relative:a.slice(o.length+1),isDir:s,root:o};let l=a.split("/"),f=l.pop()||"",m=l.join("/")||(a.startsWith("/")?"/":"");return{relative:f,isDir:s,root:m}}if(a=a.replace(/^\.\//,""),a.startsWith("../")&&o){let d=o.split("/"),u=a.split("/");for(let f of u)f===".."?d.pop():f&&f!=="."&&d.push(f);let l=d.join("/")||"/";return fa(l,t)}return{relative:a,isDir:s,root:o||t}}var Vo=F(()=>{});function Od(){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()}),Fi||(Fi=!0,document.addEventListener("keydown",n=>{n.key==="Escape"&&t()})),e}function Wi(e){let t=e.querySelector("svg");if(!t)return;let n=Od(),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 Bd(){let e=globalThis.mermaid;return!e||Ui||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),Ui=!0),e}function Ud(e){let t=String(e||"").replace(/\r\n?/g,`
|
|
2
|
-
`).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
|
|
3
|
-
`}function
|
|
4
|
-
`+n,t+3);return s===-1?{end:e.length}:{end:s+1+n.length}}if(e[t]==="`"){let n=1;for(;e[t+n]==="`";)n++;let s=t+n;for(;s<e.length;){if(e[s]==="`"){let a=0;for(;e[s+a]==="`";)a++;if(a===n)return{end:s+a};s+=a;continue}s++}return{end:t+n}}return null}function
|
|
1
|
+
var Ld=Object.defineProperty;var W=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var cs=(e,t)=>{for(var n in t)Ld(e,n,{get:t[n],enumerable:!0})};function Id(){qo||(qo=!0,queueMicrotask(()=>{qo=!1,Oo()}))}function $i(e){for(let t of e)(t._isComputed?Tn:Cn).add(t);Bo>0||sa||(Ed==="microtask"?Id():Oo())}function Li(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=[zt,ps,Po];[zt,ps,Po]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[zt,ps,Po]=o}}var zt,ps,Bo,Po,Tn,Cn,sa,ds,Ho,Ed,qo,Oo,Si,I,Uo,je,xe,De,Mn,Td,p,b,Ei,i,Ro,Cd,ot,us,Md,aa,Ad,Uf,oa,Ff,Wf,Ii,Ti=W(()=>{zt=null,ps=null,Bo=0,Po=null,Tn=new Set,Cn=new Set,sa=!1,ds=1e4,Ho={flushes:0,runs:0,lastFlushRuns:0},Ed="sync",qo=!1;Oo=()=>{if(sa)return;sa=!0;let e=0;Ho.flushes++;try{for(;Tn.size||Cn.size;){for(;Tn.size;){let t=Tn.values().next().value;if(Tn.delete(t),++e>ds)throw new Error(`mini-react: reactive update loop exceeded ${ds} runs`);t()}if(Cn.size){let t=Cn.values().next().value;if(Cn.delete(t),++e>ds)throw new Error(`mini-react: reactive update loop exceeded ${ds} runs`);t()}}}finally{Ho.runs+=e,Ho.lastFlushRuns=e,e>ds&&(Tn.clear(),Cn.clear()),sa=!1}};Si=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return zt&&(this._subs.add(zt),ps?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,$i(this._subs))}peek(){return this._v}},I=(e,{equals:t}={})=>new Si(e,t);Uo=e=>{let t=new Si(void 0),n=new Set,s=!0,a=!1,o=u=>{if(!s||a)return t._v;s=!1;try{let l=Li(e,r,n,null),f=l!==t._v;f&&(t._v=l),f&&u&&$i(t._subs)}catch(l){s=!0,console.error("[computed]",l)}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 zt&&(t._subs.add(zt),ps?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let u of n)u._subs.delete(r);n.clear()}},t},je=e=>{let t=new Set,n=[],s=()=>{try{let a=Li(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)}},xe=e=>{Bo++;try{e()}finally{--Bo===0&&Oo()}},De=(e,t)=>{let n=e.peek(),s=!1;return je(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Mn=e=>je(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),Td={"&":"&","<":"<",">":">",'"':"""},p=e=>String(e??"").replace(/[&<>"]/g,t=>Td[t]),b=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{xe(()=>{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))}}})(),Ei=(e,{keepAlive:t=!1}={})=>{let n=I(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,r=(l,f)=>{if(!t)return f();if(o.has(l))return o.get(l);let m=f();return o.set(l,m),m},d=I(void 0),u=je(()=>{let l=n.value;for(let[f,m]of Object.entries(e)){if(f==="*")continue;let g=new RegExp("^"+f.replace(/:\w+/g,"([^/]+)")+"$"),w=l.match(g);if(w){let y=w.slice(1);d.value=typeof m=="function"?r(`${f}|${y.join("/")}`,()=>m(...y)):m;return}}if(e["*"]){let f=e["*"];d.value=typeof f=="function"?r("*",f):f;return}d.value=null});return{current:n,route:d,navigate:l=>{s||(location.hash=l)},match:l=>{let f=n.value.match(new RegExp("^"+l.replace(/:\w+/g,"([^/]+)")+"$"));return f?f.slice(1):null},invalidate:l=>{if(o){if(l===void 0){o.clear();return}for(let f of[...o.keys()])(f===l||f.startsWith(`${l}|`))&&o.delete(f)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),u(),o?.clear())}}},i=e=>document.getElementById(e),Ro=()=>typeof navigator>"u"||navigator.onLine!==!1,Cd=e=>new Promise(t=>setTimeout(t,e)),ot=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(ot).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ot(e[t])}`).join(",")}}`,us=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=ot(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))},Md=e=>{try{return JSON.stringify(e),!0}catch{return!1}},aa=(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)=>aa(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]=aa(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Ad=({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,u=new Map,l=null,f=!1,m=h=>{for(let v of d)v(h)},g=h=>h.state,w=h=>!h.invalidated&&Date.now()-h.state.updatedAt.peek()<h.options.staleTime,y=h=>{h.invalidated=!0,h.state.isStale.value=!0},A=h=>{h.gcTimer&&clearTimeout(h.gcTimer),h.gcTimer=null},ae=h=>{A(h),!h.observers&&Number.isFinite(h.options.gcTime)&&(h.gcTimer=setTimeout(()=>{!h.observers&&!h.promise&&(r.delete(h.hash),m({type:"gc",key:h.key}))},h.options.gcTime))},O=h=>{h.pollTimer&&clearTimeout(h.pollTimer),h.pollTimer=null},pe=h=>{O(h);let v=typeof h.options.refetchInterval=="function"?h.options.refetchInterval(h):h.options.refetchInterval;h.observers&&Number.isFinite(v)&&v>0&&(h.pollTimer=setTimeout(async()=>{Ro()&&await he(h,{force:!0}).catch(()=>{}),pe(h)},v))},q=(h,v=ot(h.queryKey))=>{let k={staleTime:e,gcTime:t,retry:n,retryDelay:s,...h},S={hash:v,key:h.queryKey,queryFn:h.queryFn,options:k,tags:new Set(h.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:I(h.initialData),error:I(null),status:I(h.initialData===void 0?"idle":"success"),fetchStatus:I("idle"),updatedAt:I(h.initialData===void 0?0:Date.now()),isStale:I(!0)}};return r.set(v,S),S},Q=h=>{if(!h?.queryKey)throw new TypeError("query: queryKey is required");let v=ot(h.queryKey),k=r.get(v)??q(h,v);h.queryFn&&(k.queryFn=h.queryFn),k.options={...k.options,...h};for(let S of h.tags??[])k.tags.add(S);return k},he=(h,{force:v=!1}={})=>{if(!h.queryFn)return Promise.reject(new TypeError(`query ${h.hash} has no queryFn`));if(!v&&w(h))return Promise.resolve(h.state.data.peek());if(h.promise)return h.promise;if(!Ro())return h.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));A(h);let k=++h.version,S=new AbortController;h.ctrl=S,xe(()=>{h.state.data.peek()===void 0&&(h.state.status.value="pending"),h.state.fetchStatus.value="fetching",h.state.error.value=null}),m({type:"fetch",key:h.key});let U=async(j,V)=>{try{return await h.queryFn({queryKey:h.key,signal:S.signal,meta:h.options.meta})}catch(R){if(S.signal.aborted||R?.name==="AbortError"||j<=0||h.options.retry===!1)throw R;return await Cd(typeof V=="function"?V(j,R):V),U(j-1,typeof V=="number"?V*2:V)}},F=U(h.options.retry??n,h.options.retryDelay??s).then(j=>(h.version===k&&!S.signal.aborted&&xe(()=>{h.state.data.value=h.options.structuralSharing===!1?j:aa(h.state.data.peek(),j),h.state.status.value="success",h.state.fetchStatus.value="idle",h.state.updatedAt.value=Date.now(),h.state.isStale.value=!1,h.invalidated=!1}),m({type:"success",key:h.key}),j)).catch(j=>{throw h.version===k&&!S.signal.aborted&&xe(()=>{h.state.error.value=j,h.state.status.value=h.state.data.peek()===void 0?"error":"success",h.state.fetchStatus.value="idle"}),S.signal.aborted||m({type:"error",key:h.key,error:j}),j}).finally(()=>{h.promise===F&&(h.promise=null,h.ctrl=null,ae(h))});return h.promise=F,F},Ae=h=>Promise.all([...r.values()].filter(v=>us(v,h)&&v.observers).map(v=>he(v,{force:!0}).catch(()=>{}))),L={query(h){let v=Q(h);v.observers++,A(v),pe(v),h.enabled!==!1&&(!w(v)||h.refetchOnMount)&&he(v).catch(()=>{});let k=()=>{v.observers=Math.max(0,v.observers-1),ae(v),pe(v)};return[g(v),{refetch:()=>he(v,{force:!0}),invalidate:()=>L.invalidateQueries({queryKey:v.key,exact:!0}),setData:S=>L.setQueryData(v.key,S),cancel:()=>L.cancelQueries({queryKey:v.key,exact:!0}),dispose:k}]},prefetchQuery(h){let v=Q(h);return he(v)},fetchQuery(h){let v=Q(h);return he(v)},getQueryData(h){return r.get(ot(h))?.state.data.peek()},getQueryState(h){let v=r.get(ot(h));return v&&g(v)},setQueryData(h,v,{tags:k}={}){let S=r.get(ot(h))??Q({queryKey:h,tags:k}),U=typeof v=="function"?v(S.state.data.peek()):v,F=S.options.structuralSharing===!1?U:aa(S.state.data.peek(),U);xe(()=>{S.state.data.value=F,S.state.status.value="success",S.state.error.value=null,S.state.updatedAt.value=Date.now(),S.state.isStale.value=!1}),S.invalidated=!1;for(let j of k??[])S.tags.add(j);return m({type:"set",key:S.key}),l&&l.postMessage({type:"invalidate",hash:S.hash}),F},invalidateQueries(h){for(let v of r.values())us(v,h)&&y(v);return m({type:"invalidate",filter:h}),l&&l.postMessage({type:"invalidate",filter:h}),Ae(h)},cancelQueries(h){for(let v of r.values())us(v,h)&&v.ctrl?.abort()},removeQueries(h){for(let v of[...r.values()])us(v,h)&&(v.ctrl?.abort(),A(v),O(v),r.delete(v.hash))},mutate({mutationFn:h,variables:v,optimistic:k,invalidate:S,onMutate:U,onSuccess:F,onError:j,networkMode:V="online"}={}){if(typeof h!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let R=[],ve=D=>(Array.isArray(D)?D:[D]).filter(Boolean).forEach(de=>{let Kt=L.getQueryData(de.queryKey);R.push([de.queryKey,Kt]),L.setQueryData(de.queryKey,In=>de.updater(In))}),Ke=async()=>{let D=await U?.(v,{client:L});k&&ve(typeof k=="function"?k(v):k);try{let de=await h(v);return await F?.(de,v,D),S&&await L.invalidateQueries(S),m({type:"mutation-success"}),de}catch(de){for(let[Kt,In]of R)L.setQueryData(Kt,In);throw await j?.(de,v,D),m({type:"mutation-error",error:de}),de}};return!Ro()&&V==="offlineFirst"?(ge.push(Ke),m({type:"mutation-queued"}),Promise.resolve({queued:!0})):Ke()},infiniteQuery({queryKey:h,queryFn:v,initialPageParam:k=0,getNextPageParam:S,...U}){let[F,j]=L.query({queryKey:h,...U,queryFn:async V=>({pages:[await v({...V,pageParam:k})],pageParams:[k]})});return[F,{...j,fetchNextPage:async()=>{let V=F.data.peek()??{pages:[],pageParams:[]},R=S?.(V.pages.at(-1),V.pages);if(R==null)return;let ve=await v({queryKey:h,pageParam:R,signal:new AbortController().signal});return L.setQueryData(h,{pages:[...V.pages,ve],pageParams:[...V.pageParams,R]}),ve}}]},dehydrate({shouldDehydrate:h=k=>k.state.status.peek()==="success",version:v=1}={}){return{version:v,timestamp:Date.now(),queries:[...r.values()].filter(h).filter(k=>Md(k.state.data.peek())).map(k=>({key:k.key,data:k.state.data.peek(),updatedAt:k.state.updatedAt.peek(),staleTime:k.options.staleTime,tags:[...k.tags]}))}},hydrate(h,{version:v=1}={}){if(!h||h.version!==v||!Array.isArray(h.queries))return!1;for(let k of h.queries){let S=r.get(ot(k.key))??Q({queryKey:k.key,staleTime:k.staleTime,tags:k.tags});xe(()=>{S.state.data.value=k.data,S.state.status.value="success",S.state.updatedAt.value=k.updatedAt,S.state.isStale.value=Date.now()-k.updatedAt>=S.options.staleTime}),S.invalidated=S.state.isStale.peek()}return m({type:"hydrate"}),!0},persist({storage:h=typeof localStorage>"u"?null:localStorage,key:v="mini-react-query",version:k=1}={}){if(!h)throw new Error("persist: a storage adapter is required");let S=!1,U=async()=>{let j=JSON.stringify(L.dehydrate({version:k}));return h.set?h.set(v,j):h.setItem(v,j)},F=L.subscribe(()=>{S||(S=!0,queueMicrotask(()=>{S=!1,U().catch(()=>{})}))});return{restore:async()=>{let j=await(h.get?h.get(v):h.getItem(v));return j?L.hydrate(JSON.parse(j),{version:k}):!1},save:U,dispose:F}},sync(h="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(l?.close(),l=new BroadcastChannel(h),l.onmessage=v=>{if(v.data?.type!=="invalidate")return;let k=v.data.hash?S=>S.hash===v.data.hash:v.data.filter;for(let S of r.values())us(S,k)&&y(S);Ae(k)},()=>{l?.close(),l=null})},subscribe(h){return d.add(h),()=>d.delete(h)},getDebugSnapshot(){return[...r.values()].map(h=>({key:h.key,observers:h.observers,status:h.state.status.peek(),fetchStatus:h.state.fetchStatus.peek(),updatedAt:h.state.updatedAt.peek(),stale:h.state.isStale.peek(),tags:[...h.tags]}))},async fetchJSON(h,v={},{queryKey:k=["GET",h,v.body??null],...S}={}){let U=ot(k);return L.fetchQuery({queryKey:k,...S,queryFn:async({signal:F})=>{let j=new Headers(v.headers),V=u.get(U);V?.etag&&j.set("If-None-Match",V.etag);let R=await fetch(h,{...v,headers:j,signal:F});if(R.status===304&&V)return L.getQueryData(k);if(!R.ok)throw new Error(`HTTP ${R.status}`);let ve=R.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(ve){let Ke=r.get(U);Ke&&(Ke.options.staleTime=Number(ve)*1e3)}return u.set(U,{etag:R.headers.get("etag")}),R.json()}})},destroy(){f=!0;for(let h of r.values())h.ctrl?.abort(),A(h),O(h);l?.close(),d.clear()}},ge=[],be=()=>{a&&Ae()},oe=()=>{for(o&&Ae();ge.length;)ge.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",be),window.addEventListener("online",oe));let Gt=L.destroy;return L.destroy=()=>{f||(typeof window<"u"&&(window.removeEventListener("focus",be),window.removeEventListener("online",oe)),Gt())},L},Uf=Ad(),oa=({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,u=new Map,l=(m,g)=>{if(a)return a.get(m);let w=r.get(m);return w&&Date.now()-w.ts<g?w.data:void 0},f=async(m,g,w)=>{if(a)return a.set(m,g,{ttl:w});r.set(m,{data:g,ts:Date.now()})};return{get:(m,g,w={})=>{let y=w.ttl??t,A=e&&w.cache!==!1&&y!==0,ae=w.dedupe??o;if(ae&&d.has(m))return d.get(m);let O=()=>{let q=u.get(m)??0,Q=(he,Ae)=>Promise.resolve(g()).then(async L=>(A&&(u.get(m)??0)===q&&await f(m,L,y),L)).catch(L=>{if(he>0&&L?.name!=="AbortError")return new Promise(ge=>setTimeout(ge,Ae)).then(()=>Q(he-1,Ae*2));throw L});return Q(w.retry??n,s)},pe=q=>(ae&&(d.set(m,q),q.finally(()=>{d.get(m)===q&&d.delete(m)}).catch(()=>{})),q);if(!A)return pe(O());if(!a){let q=l(m,y);return q!==void 0?Promise.resolve(q):pe(O())}return pe(Promise.resolve(l(m,y)).then(q=>q!==void 0?q:O()))},invalidate:m=>{if(m!==void 0)u.set(m,(u.get(m)??0)+1);else{for(let g of r.keys())u.set(g,(u.get(g)??0)+1);for(let g of d.keys())u.set(g,(u.get(g)??0)+1)}if(a)return m===void 0?a.clear():a.delete(m);m===void 0?r.clear():r.delete(m)}}},Ff=new TextEncoder,Wf=new TextDecoder,Ii=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=u=>u.target.result.createObjectStore(t),d.onsuccess=u=>{n=u.target.result,o(n)},d.onerror=u=>r(u.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((u,l)=>{let f=d.transaction(t,o),m=r(f.objectStore(t));m.onsuccess=()=>u(m.result),m.onerror=()=>l(m.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",u=>u.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 K=W(()=>{Ti()});var Hi={};cs(Hi,{AGENT_DEFAULT_MODEL:()=>_i,AGENT_LABELS:()=>Z,AGENT_MODELS:()=>Fo,LOW_TURN_THRESHOLD:()=>Go,activityHits:()=>rt,activityLoading:()=>bt,addCustomModel:()=>Vt,agentFilter:()=>ye,agentFilters:()=>Qt,agentsMeta:()=>Jt,chatDensity:()=>_e,collapsedFolders:()=>jn,ctx:()=>c,currentAgent:()=>$,currentEffort:()=>te,currentModel:()=>N,currentPermission:()=>ue,currentProject:()=>E,currentTab:()=>X,expandedFolders:()=>An,favoritesOnly:()=>ze,filesPath:()=>Y,filesRoot:()=>ie,filteredSessions:()=>_t,getCustomModels:()=>ia,getDefaultEffort:()=>Qe,getDefaultModel:()=>Oe,getEffortsForModel:()=>Yt,getModelsForAgent:()=>Be,getSavedModel:()=>Di,getSessionMeta:()=>Dn,gitRoot:()=>Se,hubMachineReady:()=>it,hubMode:()=>M,isProcessing:()=>P,machinesList:()=>le,metaKey:()=>J,projectGroups:()=>Xt,removeCustomModel:()=>Jo,selectedMachineId:()=>_,sessionDisplayTitle:()=>vt,sessionFilter:()=>ke,sessionMetaMap:()=>T,sessionSearch:()=>$e,sessionSort:()=>Ci,sessionsData:()=>ne,setAgent:()=>Ne,setChatDensity:()=>Ko,setCurrentModel:()=>se,setSelectedMachine:()=>Le,showHiddenOnly:()=>Je,sidebarView:()=>gt,timeRange:()=>ra,viewingFile:()=>re,workspacesData:()=>fe,wsStatus:()=>me});function Ai(){try{let e=JSON.parse(localStorage.getItem(Mi)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function ji(e,t=c.sessionId,n=c.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Di(e,t=c.sessionId,n=c.machineId){let s=ji(e,t,n);if(!s)return null;let a=Ai()[s];return typeof a=="string"&&a.trim()?a:null}function se(e,t=$.peek(),n=c.sessionId,s=c.machineId){let a=String(e||"").trim();if(!a)return;let o=ji(t,n,s);if(o){let r=Ai();r[o]=a,localStorage.setItem(Mi,JSON.stringify(r))}N.value=a}function Le(e){let t=e||null;_.value=t,c.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function J(e,t,n){let s=`${e||"claude"}:${t}`;return n||c?.machineId?`${n||c.machineId}:${s}`:s}function Dn(e,t,n){return T.peek()?.[J(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function vt(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(Dn(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function Ko(e){let t=["clean","normal","full"].includes(e)?e:"normal";_e.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Dd(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 zo(){try{let e=localStorage.getItem(Ni);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Pi(e){localStorage.setItem(Ni,JSON.stringify(e))}function ia(e){let t=(e||"claude").toLowerCase(),n=zo()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Vt(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=zo(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,Pi(a),!0}function Jo(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=zo(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,Pi(a),!0}function Be(e){let t=(e||"claude").toLowerCase(),n=Jt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Dd).filter(Boolean):(Fo[t]||Fo.claude).map(r=>({...r})),a=ia(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 u=String(d.label||d.value);return{...d,custom:!0,label:u.includes("\u2605")?u:`${u} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function Oe(e){let t=(e||"claude").toLowerCase(),n=Jt.peek()?.defaults?.[t];return n?.model?String(n.model):_i[t]||Be(t)[0]?.value||"sonnet"}function Yt(e,t){let s=Be(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=Jt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function Qe(e,t){let n=(e||"claude").toLowerCase(),s=Jt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Be(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 Ne(e){let t=(e||"claude").toLowerCase();$.value=t,localStorage.setItem("agent",t),ue.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=ue.peek());let s=Di(t);s?N.value=s:se(Oe(t),t);let a=Qe(t,N.peek());a?te.value=a:t!=="grok"&&t!=="gemini"&&(te.value="")}function _d(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Nd(e,t){if(!t)return!0;let n=T.value?.[J(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 Wo(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var ne,fe,ke,$e,Ci,An,jn,Y,re,E,X,P,me,Mi,jd,$,N,te,ue,ie,Se,Jt,gt,ye,Qt,ra,rt,bt,T,ze,Je,Go,_e,M,le,_,it,c,Z,Fo,_i,Ni,_t,Xt,G=W(()=>{K();ne=I([]),fe=I([]),ke=I(null),$e=I(""),Ci=I("time"),An=I(new Set),jn=I(new Set),Y=I(""),re=I(null),E=I(null),X=I("chat"),P=I(!1),me=I("idle"),Mi="modelBySession",jd=localStorage.getItem("agent")||"claude";$=I(jd),N=I("sonnet"),te=I(""),ue=I("bypassPermissions"),ie=I(""),Se=I(""),Jt=I(null),gt=I(localStorage.getItem("sidebarView")||"projects"),ye=I(localStorage.getItem("agentFilter")||"all"),Qt=I((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),ra=I(localStorage.getItem("timeRange")||"14"),rt=I(null),bt=I(!1),T=I({}),ze=I(localStorage.getItem("favoritesOnly")==="1"),Je=I(localStorage.getItem("showHiddenOnly")==="1"),Go=2,_e=I(localStorage.getItem("chatDensity")||"normal"),M=I(!1),le=I([]),_=I(null),it=I(!1),c={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null,externalSessionReadOnly:!1,role:null,username:null,lock:{key:null,token:null,holder:null,held:!1,foreign:!1}};Z={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},Fo={claude:[{value:"fable",label:"fable"},{value:"opus",label:"opus"},{value:"sonnet",label:"sonnet"},{value:"haiku",label:"haiku"}],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"}]},_i={claude:"sonnet",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};Ni="customModelsByAgent";_t=Uo(()=>{let e=$e.value.toLowerCase().trim(),t=Ci.value,n=ye.value,s=Qt.value,a=ze.value,o=Je.value,r=T.value,d=rt.value,u=d?.results?.length&&e?Wo(d.results):Wo(ne.value),l=_.value;return M.value&&l&&(u=u.filter(f=>f&&(!f.machineId||f.machineId===l))),u=u.filter(f=>f&&(s.length?s.includes(f.agent||"claude"):_d(f,n))),o?u=u.filter(f=>f&&r?.[J(f.agent,f.sessionId,f.machineId)]?.hidden):u=u.filter(f=>f&&!r?.[J(f.agent,f.sessionId,f.machineId)]?.hidden),a&&(u=u.filter(f=>f&&r?.[J(f.agent,f.sessionId,f.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(u=u.filter(f=>f&&Nd(f,e))),u=[...u].sort((f,m)=>{let g=r?.[J(f.agent,f.sessionId,f.machineId)]?.favorite?1:0,w=r?.[J(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return g!==w?w-g:t==="project"&&(f.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-f.updatedAt}),!e&&!a?u.slice(0,120):u}),Xt=Uo(()=>{let e=Wo(_t.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 fs(e={}){return e.machineId!==void 0?e.machineId:c.machineId||_.peek()||null}function qd(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/notes"||t.startsWith("/api/notes/")||t==="/api/queue"||t.startsWith("/api/queue/")||t.startsWith("/api/ai/")||t.startsWith("/api/auth/")||t.startsWith("/api/collab/")}async function x(e,t,n,s,a={}){let o=a.hub?null:fs(a),r={"Content-Type":"application/json",...c.token?{Authorization:`Bearer ${c.token}`}:{}};!a.hub&&M.peek()&&o&&!qd(t)&&(r["X-Machine-Id"]=o),e.toUpperCase()!=="GET"&&e.toUpperCase()!=="HEAD"&&c.lock?.token&&c.lock?.key&&!String(t).startsWith("/api/collab/")&&(r["X-Lock-Token"]=c.lock.token,r["X-Lock-Key"]=c.lock.key);let u=a.etag===!0?`${c.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&u){let m=Ri.get(u);m&&(r["If-None-Match"]=m)}let l=async()=>{let m=await fetch(t,{method:e,signal:s,headers:r,cache:a.cache||(e.toUpperCase()==="GET"?"no-store":"default"),...n!==void 0?{body:JSON.stringify(n)}:{}});if(m.status===304)return Hd;let g=await m.json().catch(()=>({}));if(!m.ok)throw new Error(g.error||`HTTP ${m.status}`);if(u){let w=m.headers.get("ETag");w&&Ri.set(u,w)}return g};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let f=`${c.token||""}:${o||""}:${t}`;return Pd.get(f,l)}function lt(e){return c.ws?.readyState===WebSocket.OPEN?(c.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||la.push(e),!1)}function ca(){for(;la.length&&c.ws?.readyState===WebSocket.OPEN;)c.ws.send(JSON.stringify(la.shift()))}function da(){la.length=0}function Qo(e={}){let t=new URLSearchParams(e);c.token&&t.set("token",c.token);let n=fs();return M.peek()&&n&&t.set("machine",n),t.toString()}function ct(e={},t={}){let n={...e};c.token&&(n.Authorization=`Bearer ${c.token}`);let s=fs();return!t.hub&&M.peek()&&s&&(n["X-Machine-Id"]=s),n}async function ua(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}var Pd,Ri,Hd,la,ce=W(()=>{G();K();Pd=oa({cache:!1,dedupe:!0,retry:0}),Ri=new Map,Hd=Symbol("not-modified");la=[]});function Zt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function _n(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function Ee(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Zt(t,!s)}Zt(document.getElementById("welcome"),_n(document.getElementById("welcome"))),Zt(document.getElementById("auth-screen"),_n(document.getElementById("auth-screen"))),Zt(document.getElementById("chat-opts"),_n(document.getElementById("chat-opts"))),Zt(document.getElementById("machine-picker"),_n(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Zt(a,_n(a))}let n=document.getElementById("tab-chat");n&&Zt(n,_n(n))}function ms(){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 Oi(){Ee(),ms();let e=window.visualViewport;e&&(e.addEventListener("resize",ms),e.addEventListener("scroll",ms)),window.addEventListener("resize",()=>{ms(),Ee()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{ms(),Ee()},250)})}var Nn=W(()=>{});function en(){try{let e=localStorage.getItem(Ui);return e?JSON.parse(e):null}catch{return null}}function Vo(e){try{let n={...en()||{},...e,updatedAt:Date.now()};localStorage.setItem(Ui,JSON.stringify(n))}catch{}}var Ui,fa=W(()=>{Ui="lastSessionContext"});function Rd(e){let t=String(e??"").trim();if(!t)return"";try{return decodeURIComponent(t)}catch{return t}}function Fi(e){return String(e||"").replace(/\\/g,"/")}function Bd(e){return e.replace(/:[0-9]+(?::[0-9]+)?$/,"")}function ma(e,t){let n=Rd(e);if(!n||/^(https?:|mailto:|tel:|javascript:|#)/i.test(n)||(n=Fi(n).split(/[?#]/)[0],n=n.replace(/^file:\/\//i,""),/^\/[A-Za-z]:\//.test(n)&&(n=n.slice(1)),!n||n==="."||n==="/")||/^\/(api|ws|session)\b/.test(n))return null;let s=n.endsWith("/"),a=Bd(n.replace(/\/+$/,"")),o=Fi(t).replace(/\/+$/,"");if((a.startsWith("/")||/^[A-Za-z]:\//.test(a))&&o){let d=a.toLowerCase(),u=o.toLowerCase();if(d===u)return{relative:"",isDir:!0,root:o};if(d.startsWith(`${u}/`))return{relative:a.slice(o.length+1),isDir:s,root:o};let l=a.split("/"),f=l.pop()||"",m=l.join("/")||(a.startsWith("/")?"/":"");return{relative:f,isDir:s,root:m}}if(a=a.replace(/^\.\//,""),a.startsWith("../")&&o){let d=o.split("/"),u=a.split("/");for(let f of u)f===".."?d.pop():f&&f!=="."&&d.push(f);let l=d.join("/")||"/";return ma(l,t)}return{relative:a,isDir:s,root:o||t}}var Yo=W(()=>{});function Ud(){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()}),Gi||(Gi=!0,document.addEventListener("keydown",n=>{n.key==="Escape"&&t()})),e}function Ki(e){let t=e.querySelector("svg");if(!t)return;let n=Ud(),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 Fd(){let e=globalThis.mermaid;return!e||Wi||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),Wi=!0),e}function Wd(e){let t=String(e||"").replace(/\r\n?/g,`
|
|
2
|
+
`).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 xt(e){let t=Fd();!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=Wd(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-${++Od}`;Promise.resolve(t.parse(a)).then(()=>t.render(r,a)).then(({svg:d,bindFunctions:u})=>{o.innerHTML=d,u?.(o),o.tabIndex=0,o.title="\u70B9\u51FB\u653E\u5927\u56FE\u8868",o.addEventListener("click",l=>{l.target.closest("a")||Ki(o)}),o.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),Ki(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 Wi,Od,Gi,Pn=W(()=>{Wi=!1,Od=0,Gi=!1});function Zo(e){return Gd.test(String(e||""))}function Kd(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function zi(e,t){return t===0||e[t-1]===`
|
|
3
|
+
`}function zd(e,t){if(zi(e,t)&&(e.startsWith("```",t)||e.startsWith("~~~",t))){let n=e.startsWith("```",t)?"```":"~~~",s=e.indexOf(`
|
|
4
|
+
`+n,t+3);return s===-1?{end:e.length}:{end:s+1+n.length}}if(e[t]==="`"){let n=1;for(;e[t+n]==="`";)n++;let s=t+n;for(;s<e.length;){if(e[s]==="`"){let a=0;for(;e[s+a]==="`";)a++;if(a===n)return{end:s+a};s+=a;continue}s++}return{end:t+n}}return null}function Jd(e,t){let n=e.slice(t);if(n.startsWith("$$")){let s=n.indexOf("$$",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\[")){let s=n.indexOf("\\]",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\(")){let s=n.indexOf("\\)",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!1,end:t+s+2}}}if(n[0]==="$"&&n[1]!=="$"){let s=n.match(/^\$([^$\n]|\\\$)+?(?<!\s)\$/);if(s&&s[0][1]!==" "){let a=s[0].slice(1,-1);if(a.trim())return{body:a,display:!1,end:t+s[0].length}}}if(zi(e,t)){let s=n.match(/^[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/);if(s&&Zo(s[1]))return{body:s[1],display:!0,end:t+s[0].length};let a=n.match(/^[ \t]*\[([^\]\n]+)\](?!\()/);if(a&&Zo(a[1]))return{body:a[1],display:!0,end:t+a[0].length}}return null}function Ji(e){let t=[],n=String(e??""),s="",a=0;for(;a<n.length;){let o=zd(n,a);if(o){s+=n.slice(a,o.end),a=o.end;continue}let r=Jd(n,a);if(r){let d=t.length;t.push({body:r.body,display:r.display}),s+=`@@MATH${d}@@`,a=r.end;continue}s+=n[a],a++}return{text:s,slots:t}}function ha(e,t){return t?.length?String(e).replace(/@@MATH(\d+)@@/g,(n,s)=>{let a=t[Number(s)];if(!a)return n;let o=a.display?"\\[":"\\(",r=a.display?"\\]":"\\)";return Kd(`${o}${a.body}${r}`)}):e}function Qd(e){return e.parentElement?.closest("pre, code, .mermaid-diagram, .katex, script, style")}function Xo(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},{re:/(?:^|\n)[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/g,display:!0,latex:!0},{re:/(?:^|\n)[ \t]*\[([^\]\n]+\\[a-zA-Z{}_^][^\]\n]*)\](?!\()/g,display:!0,latex:!0}],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 r=o[0],d;o[1]!=null&&(a.latex||r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")||r.startsWith("$"))?d=o[1]:d=r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")?r.slice(2,-2):r.slice(1,-1),d.trim()&&(a.latex&&!Zo(d)||(s={match:o,body:d,display:a.display}))}return s}function Vd(e){let t=e.nodeValue||"",n=0,s=Xo(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=Xo(t,n);continue}let r=document.createElement(s.display?"div":"span");r.className=s.display?"math-display":"math-inline",r.innerHTML=o,a.append(r),n=s.match.index+s.match[0].length,s=Xo(t,n)}n<t.length&&a.append(document.createTextNode(t.slice(n))),e.replaceWith(a)}function yt(e){if(!e||typeof globalThis.katex?.renderToString!="function")return;let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=[];for(;t.nextNode();)Qd(t.currentNode)||n.push(t.currentNode);n.forEach(Vd)}var Gd,tn=W(()=>{Gd=/\\[a-zA-Z]+|[_^]\{|\\[,;!]|\\[{}()[\]]|\\leq\b|\\geq\b|\\neq\b|\\in\b|\\sum\b|\\int\b|\\frac\b|\\min\b|\\max\b|\\mathrm\b|\\text\b|\\left\b|\\right\b/});function Xd(e){return String(e??"").replace(Yd,(t,n)=>`
|
|
5
5
|
|
|
6
6
|
> \u26A0\uFE0F \u539F\u59CB\u8BB0\u5F55\u5DF2\u622A\u65AD\uFF08${n} bytes\uFF09
|
|
7
7
|
|
|
8
|
-
`)}function Ve(e,{fallback:t}={}){let{text:n,slots:s}=
|
|
8
|
+
`)}function Ve(e,{fallback:t}={}){let{text:n,slots:s}=Ji(Xd(e));if(typeof marked>"u"){let a=t?t(n):n;return ha(a,s)}try{return ha(marked.parse(n,{breaks:!0,gfm:!0}),s)}catch{let a=t?t(n):n;return ha(a,s)}}var Yd,nn=W(()=>{tn();Yd=/(?:<|\[)\s*(?:…\s*)?truncated\s+([\d,]+)\s+bytes\s*(?:>|\])/gi});function er(e,t){let n=ma(e,t||ie.peek()||E.peek()?.path||"");if(!n)return!1;if(n.root&&(ie.value=n.root),n.isDir)re.value=null,Y.value=n.relative;else{let s=n.relative.split("/").filter(Boolean);Y.value=s.slice(0,-1).join("/"),re.value=n.relative}return X.value="files",!0}var tr=W(()=>{K();G();ce();Yo();Pn();tn();nn()});function eu({sessionId:e=c.sessionId,agent:t=c.agent||$.peek()||"claude",machineId:n=c.machineId||_.peek()||"local"}={}){return e?`session:${n||"local"}:${t||"claude"}:${e}`:null}function sn(){return!((c.role||"editor")==="viewer"||c.lock?.foreign)}function tu(){document.dispatchEvent(new CustomEvent("session-lock-changed",{detail:c.lock}))}function Hn(e){c.lock={key:null,token:null,holder:null,held:!1,foreign:!1,...e||{}},tu()}async function wt(e={}){let t=eu(e);return t?(c.role||"editor")==="viewer"?(Hn({key:t,held:!1,foreign:!0,holder:"viewer"}),{ok:!1,error:"viewers cannot take exclusive locks",code:403}):(c.lock?.key&&c.lock.key!==t&&await ba(),hs||(hs=(async()=>{try{let s={key:t,kind:"session",ttlSec:nr,exclusive:!0,...c.lock?.token&&c.lock?.key===t?{token:c.lock.token}:{}},a=await x("POST","/api/collab/locks",s,void 0,{hub:!0});return Hn({key:t,token:a.token,holder:a.holder,held:!0,foreign:!1,expiresAt:a.expiresAt,version:a.version}),su(),{ok:!0,lock:a}}catch(s){let a=String(s.message||s);return/locked|HTTP 423|423/.test(a)?(Hn({key:t,held:!1,foreign:!0,holder:"another user"}),{ok:!1,code:423,error:a}):(Hn({key:t,held:!0,foreign:!1,unmanaged:!0}),{ok:!0,skipped:!0,error:a})}finally{hs=null}})(),hs)):(Hn({foreign:!1,held:!0,unmanaged:!0}),{ok:!0,skipped:!0})}async function nu(){let{key:e,token:t,held:n}=c.lock||{};if(!(!e||!t||!n))try{let s=await x("POST","/api/collab/lock-action",{key:e,action:"heartbeat",token:t,ttlSec:nr},void 0,{hub:!0});s?.token&&(c.lock.token=s.token),s?.expiresAt&&(c.lock.expiresAt=s.expiresAt)}catch(s){let a=String(s.message||s);/token mismatch|HTTP 409|409|no lock|HTTP 404|404/.test(a)&&((await wt()).ok||sr())}}function su(){sr(),ga=setInterval(()=>{nu().catch(()=>{})},Zd)}function sr(){ga&&(clearInterval(ga),ga=null)}async function ba(){sr();let{key:e,token:t}=c.lock||{};if(Hn({held:!1,foreign:!1}),!!e)try{await x("POST","/api/collab/lock-action",{key:e,action:"release",token:t,ttlSec:nr},void 0,{hub:!0})}catch{}}async function Qi(){try{let e=await x("GET","/api/collab/me",void 0,void 0,{hub:!0});return c.role=e?.role||c.role||"editor",c.username=e?.username||c.username||null,e}catch{return c.role||(c.role="editor"),null}}var nr,Zd,ga,hs,gs=W(()=>{G();ce();nr=60,Zd=2e4,ga=null,hs=null});async function ar(){if(bs&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!an)try{an=await navigator.wakeLock.request("screen"),an.addEventListener("release",()=>{an=null,bs&&document.visibilityState==="visible"&&setTimeout(()=>{ar().catch(()=>{})},500)})}catch{an=null}}async function Vi(){let e=an;if(an=null,!!e)try{await e.release()}catch{}}function va(e){bs=!!e,bs?ar().catch(()=>{}):Vi().catch(()=>{})}function or(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&bs?ar().catch(()=>{}):document.visibilityState==="hidden"&&Vi().catch(()=>{})})}var an,bs,rr=W(()=>{an=null,bs=!1});function B(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 B(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function qn(e){let t=B(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 Rn(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():Z[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(Z[n]||n)}">${o}</span>`}function Bn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var Nt=W(()=>{K();G()});function au(e){let t=B(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Yi(){let e=i("notifications-badge");if(e){if(!on){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=on>99?"99+":String(on)}}function el(){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 vs(){let e=i("notifications-menu-list"),t=i("notifications-menu-empty");if(!(!e||!t)){if(!Pe.length){e.innerHTML="",t.classList.remove("hidden"),Yi();return}t.classList.add("hidden"),e.innerHTML=Pe.map(n=>`
|
|
9
9
|
<button type="button"
|
|
10
10
|
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"}"
|
|
11
11
|
data-notification-id="${p(n.id)}"
|
|
@@ -24,47 +24,47 @@ var $d=Object.defineProperty;var F=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(
|
|
|
24
24
|
<div class="flex items-center gap-2 mt-1 text-[10px] text-base-content/35">
|
|
25
25
|
${n.projectName?`<span class="font-mono truncate">${p(n.projectName)}</span>`:""}
|
|
26
26
|
${n.machineId?`<span class="px-1 py-0.5 rounded bg-base-300 text-base-content/55 font-mono">${p(n.machineId)}</span>`:""}
|
|
27
|
-
<span>${p(
|
|
27
|
+
<span>${p(au(n.createdAt))}</span>
|
|
28
28
|
</div>
|
|
29
29
|
</div>
|
|
30
30
|
</div>
|
|
31
|
-
</button>`).join(""),
|
|
31
|
+
</button>`).join(""),Yi()}}function rn(){i("notifications-menu")?.classList.add("hidden"),i("notifications-backdrop")?.classList.add("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","false")}function ou(){el(),i("notifications-menu")?.classList.remove("hidden"),i("notifications-backdrop")?.classList.remove("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","true")}function tl(){let e=i("notifications-menu");e&&(e.classList.contains("hidden")?ou():rn())}function Xi(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);Pe=[...t.values()].sort((n,s)=>(B(s.createdAt)||0)-(B(n.createdAt)||0)),on=Pe.reduce((n,s)=>n+(s.unread?1:0),0),vs()}async function xa(){try{let e=await x("GET","/api/notifications?limit=80");Pe=Array.isArray(e?.notifications)?e.notifications:[],on=Number(e?.unreadCount)||Pe.reduce((t,n)=>t+(n.unread?1:0),0),vs()}catch{Pe=[],on=0,vs()}}async function Zi(e=null){let t=await x("POST","/api/notifications/read",e?.length?{ids:e}:{});Pe=Array.isArray(t?.notifications)?t.notifications:Pe.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),on=Number(t?.unreadCount)||Pe.reduce((n,s)=>n+(s.unread?1:0),0),vs()}function ru(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 ya(e){if(!e?.id)return;if(Pe.find(n=>n.id===e.id)){Xi([e,...Pe.filter(n=>n.id!==e.id)]);return}Xi([e,...Pe]),ru(e)}function nl(e={}){ir=typeof e.openSession=="function"?e.openSession:null,vs(),xa(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),b.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),rn()}),b.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Zi()}),b.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Zi([s]),rn(),!(!ir||!n.dataset.notificationSession)&&ir(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)||rn()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&el()})}var Pe,on,ir,wa=W(()=>{K();ce();Nt();Pe=[],on=0,ir=null});function xs(e,t=80){return e?e.scrollHeight-e.scrollTop-e.clientHeight<t:!0}function iu(e,t){return e<0?!1:t}function lu({force:e=!1,following:t=!0,userScrolling:n=!1}={}){return e?!0:n?!1:t}function ka(e){let t=!0,n=!1,s=0,a=()=>{t=xs(e),n=!1},o=u=>{t=iu(u.deltaY,t),u.deltaY<0&&(n=!0)},r=u=>{s=u.touches?.[0]?.clientY||0},d=u=>{(u.touches?.[0]?.clientY||0)-s>8&&(t=!1,n=!0)};return e.addEventListener("scroll",a,{passive:!0}),e.addEventListener("wheel",o,{passive:!0}),e.addEventListener("touchstart",r,{passive:!0}),e.addEventListener("touchmove",d,{passive:!0}),{stick(u=!1){lu({force:u,following:t,userScrolling:n})&&(e.scrollTop=e.scrollHeight,t=!0)},setFollowing(u){t=!!u},isFollowing(){return t},destroy(){e.removeEventListener("scroll",a),e.removeEventListener("wheel",o),e.removeEventListener("touchstart",r),e.removeEventListener("touchmove",d)}}}var lr=W(()=>{});function cu(){return Z[$.peek()]||"Assistant"}function du(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}function ll(e){return e?(ln&&ln.el===e||(ln?.destroy?.(),ln=ka(e),ln.el=e),ln):null}function He(e,t){if(!e||e.dataset.historyPainting==="1")return;ll(e).stick(!!t)}function Da(){try{Fe.length?sessionStorage.setItem(pr,JSON.stringify(Fe.slice(-30))):sessionStorage.removeItem(pr)}catch{}}function pu(){let e=St(),t=Fe.filter(n=>n.key===e).length;t&&!ol.has(e)&&(ol.add(e),C(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function cl(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function fu(e={}){let t=cl(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(ur)||"{}")[t])||0}catch{return 0}}function mu(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=cl(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(ur)||"{}")||{}}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(ur,JSON.stringify(s))}catch{}return!0}function St({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Wn(e){let t=St(e),n=i("chat-input");!t||!n||(n.value?cn.set(t,n.value):cn.delete(t))}function Gn(e){let t=i("chat-input");t&&(t.value=cn.get(St(e))||"",Ls(t),Ss(t.value))}function Kn(e){let t=St(e);if(!t)return;let n=Fe.filter(a=>a.key===t);if(!n.length)return;Fe=Fe.filter(a=>a.key!==t),Da();let s=cn.get(t)||"";cn.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
|
|
32
32
|
|
|
33
|
-
`))}function
|
|
33
|
+
`))}function zn(){P.peek()&&(P.value=!1,dn())}function hu(){sl||(sl=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(ut=400,On({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{ut=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",()=>{ut=400,On({probe:!0})}))}function Sa(){let e=i("conn-dot");if(!e)return;let t=me.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=c.ws?.readyState;if(e.force){ut=400,Ht({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&$t&&Date.now()-$t>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(ut=Math.min(ut,800),Ht({quiet:!0}))}function gu(){Un||(me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Sa(),Un=setTimeout(()=>{Un=null,Ht({quiet:!0})},ut),ut=Math.min(Math.round(ut*1.8),15e3))}function dl(){$a&&(clearInterval($a),$a=null)}function bu(e,t){dl(),$a=setInterval(()=>{if(!(t!==ws||e.readyState!==WebSocket.OPEN)){if($t&&Date.now()-$t>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&$t&&Date.now()-$t>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function dn(){let e=P.peek()||!!E.peek()&&me.peek()==="open";va(e)}function Ta(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function Ca(){let e=sn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?P.peek()?t.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":Ss(t.value||""):t.placeholder=Ta()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=Ta()))}function _a(e){Ca()}function Ht(e={}){hu(),Un&&(clearTimeout(Un),Un=null),e.quiet&&(dr=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);al!==t&&(da(),al=t);let n=++ws;try{c.ws?.close()}catch{}me.value="connecting",Sa();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=fu();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===ws){if(ut=1e3,$t=Date.now(),me.value="open",Sa(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}ca(),pu(),bu(r,n),dn(),cr&&!dr&&C(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),cr=!1,dr=!1}}),r.addEventListener("message",d=>{if(n!==ws)return;let u;try{u=JSON.parse(d.data)}catch{return}if(mu(u)){if(u.type==="pong"){$t=Date.now();return}if(u.type==="ping"){if($t=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?P.value=!0:(P.peek()&&(P.value=!1),fr()),dn();return}pl(u)}}),r.addEventListener("close",()=>{n===ws&&(dl(),cr=!0,me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Sa(),gu())}),r.addEventListener("error",()=>{})}function fr(){if(!Fe.length||P.peek())return;let e=St(),t=Fe.findIndex(a=>a.key===e);if(t<0)return;let[n]=Fe.splice(t,1);Da();let s=i("chat-input");s&&(s.value=n.text,Ls(s)),setTimeout(()=>{if(n.key!==St()||P.peek()){cn.set(n.key,n.text);return}Es()},0)}function ks(){P.value=!1,dn(),fr()}function hr(){return ul}function pl(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)pl(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&ul++,e.type==="session-created"){let t=N.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){ya(e.notification);return}if(e.type==="grok-queue-status"){Mu(e);return}if(e.type==="result"){$s(),ys(),pt();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};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),Fn(n)}e.is_error||C("\u2713 Done"),ks();return}if(e.type==="complete"){$s(),ys(),pt(),!e.aborted&&e.agent==="claude"?C("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?C("\u2713 Done"):e.aborted&&C("\u5DF2\u505C\u6B62")),ks();return}if(e.type==="error"){$s(),ys(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},Ca()),qt("error","Error",du(e.message)),ks();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=ju(e.stream==="stderr"?"shell-err":"shell")),Du(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,C(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),ks();return}if(e.type==="assistant"){ys();for(let t of e.message?.content||[])t.type==="text"&&t.text?(pt(),qt("assistant",cu(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&xr(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){P.peek()||(P.value=!0,dn()),fl(e.ts);return}if(e.type==="assistant_delta"){P.peek()||(P.value=!0,dn()),vu(e.data||"");return}if(e.type==="assistant_stream_end"){ys();return}if(e.type==="thought_stream_start"){ml();return}if(e.type==="thought_delta"){xu(e.data||"");return}if(e.type==="thought_stream_end"){$s();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>`),He(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)&&Pu(e)}}function fl(e){let t=i("messages");if(!t||(pt(),$s(),Xe&&t.contains(Xe)))return;let n=Ma(e||Date.now()),s=Aa(e||Date.now());t.insertAdjacentHTML("beforeend",`
|
|
34
34
|
<div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
|
|
35
35
|
<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
|
|
36
36
|
<div class="msg-stream-body whitespace-pre-wrap"></div>
|
|
37
37
|
</div>
|
|
38
38
|
${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
|
|
39
|
-
</div>`),Xe=t.lastElementChild,Ue=Xe.querySelector(".msg-stream-body"),i("stream-status")?.remove(),He(t)}function
|
|
39
|
+
</div>`),Xe=t.lastElementChild,Ue=Xe.querySelector(".msg-stream-body"),i("stream-status")?.remove(),He(t)}function vu(e){e&&(Ue||fl(Date.now()),Ue&&(Ue.textContent+=e,He(i("messages"))))}function ys(){if(!Xe||!Ue){Xe=null,Ue=null;return}let e=Ue.textContent||"";e.trim()?(Ue.classList.remove("whitespace-pre-wrap"),Ue.classList.add("md"),Ue.innerHTML=Ea(e),wl(Xe),xl(Xe,e)):Xe.remove(),Xe=null,Ue=null,i("stream-status")?.remove()}function ml(){let e=i("messages");e&&(Pt&&e.contains(Pt)||(e.insertAdjacentHTML("beforeend",`
|
|
40
40
|
<div class="msg-row assistant px-2 thought-stream">
|
|
41
41
|
<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">
|
|
42
42
|
<div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
|
|
43
43
|
<div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
|
|
44
44
|
</div>
|
|
45
|
-
</div>`),
|
|
46
|
-
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}
|
|
47
|
-
Available: ${u}`:""}`),!0}let a=
|
|
45
|
+
</div>`),Pt=e.lastElementChild,dt=Pt.querySelector(".thought-body"),He(e)))}function xu(e){e&&(dt||ml(),dt&&(dt.textContent+=e,dt.scrollTop=dt.scrollHeight,He(i("messages"))))}function $s(){if(Pt&&dt){let e=(dt.textContent||"").length;Pt.innerHTML=`
|
|
46
|
+
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Pt=null,dt=null}function wu(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return C(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Oe(a)),document.dispatchEvent(new CustomEvent("agent-changed")),C(`Agent \u2192 ${Z[a]} \xB7 model ${N.peek()} \xB7 new session`)):C(`Agent already ${Z[a]}`),!0):(C(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Be(d).map(l=>l.value).join(" | ");return C(`Current model: ${N.peek()} (${d})${u?`
|
|
47
|
+
Available: ${u}`:""}`),!0}let a=yu[s.toLowerCase()]||s,o=$.peek()||"claude",r=Be(o).some(d=>d.value===a);return r||Vt(o,a),se(a),C(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Yt($.peek(),N.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),C(`Effort set to ${s.toLowerCase()}`),!0):(C(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(C(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return Qn(),c.sessionId=null,c.lastUsage=null,C("Cleared \xB7 new session"),!0;case"usage":return ku(),!0;case"help":return C(`Available slash commands:
|
|
48
48
|
/agent [claude|codex|grok|gemini|cursor]
|
|
49
49
|
/model [haiku|sonnet|opus|<model-id>]
|
|
50
50
|
/effort [low|medium|high|xhigh|max]
|
|
51
51
|
/usage
|
|
52
52
|
/clear
|
|
53
|
-
/help`),!0;default:return!1}}function Ie(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
|
|
54
|
-
`)),
|
|
55
|
-
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&
|
|
53
|
+
/help`),!0;default:return!1}}function Ie(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 ku(){let e=$.peek()||"claude",t=N.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ie(a.input_tokens)} \u2193${Ie(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ie(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ie(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ie(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){C(s.join(`
|
|
54
|
+
`)),gr("\u25C8 /usage \xB7 no session yet");return}C("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("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 u=r.tokensUsed!=null?Ie(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ie(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ie(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}C(s.join(`
|
|
55
|
+
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&br({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?Fn(r.sessionTotals):r.lastTurn?Fn(r.lastTurn):c.lastUsage&&Fn(c.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}}C(`${s.join(`
|
|
56
56
|
`)}
|
|
57
|
-
(usage fetch failed: ${a.message})`)}}function
|
|
57
|
+
(usage fetch failed: ${a.message})`)}}function Es(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!sn()){C(Ta()),wt().then(()=>Ca()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){wt().then(s=>{if(!s?.ok&&!s?.skipped){Ca(),C(Ta());return}Es()}).catch(()=>Es());return}if(P.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,N.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,effort:a,...ue.peek()&&{permissionMode:ue.peek()},...ue.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});vl(t),e.value="",Ls(e),Ss(""),La(),C(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}Fe.push({key:St(),text:t}),Da(),e.value="",Ls(e),Ss(""),La(),C(`\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="",cn.delete(St()),Ls(e),Ss(""),La(),t.startsWith("/")&&wu(t))return;P.value=!0,dn();let n=Date.now();if(gl(t))qt("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{pt(),qt("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,N.peek())||(s==="grok"?"low":""),o=ue.peek();c.sessionId&&se(N.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function hl(){c.sessionId&<({type:"command",cmd:"turn.interrupt",sessionId:c.sessionId}),Fe=Fe.filter(e=>e.key!==St()),Da(),Au(),ks()}function Ss(e){let t=gl(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=Z[$.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 gl(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function $u(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Ls(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,$u())+"px"}function Ma(e){let t=B(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 Aa(e){let t=B(e);return t==null?"":new Date(t).toISOString()}function Eu(e,t,n){if(e==="system")return t;let s=Ma(n),a=Aa(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 Iu(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)?Ea(t):null,d=t.length>Su,u=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"'}>${u}</div>`;break}case"assistant":{let o=t.length>Lu,r=o?`<div class="msg-body">${Ea(t)}</div>${s}`:Ea(t);a=`<div class="msg-assistant-content 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 Eu(e,a,n)}function qt(e,t,n,s={}){let a=i("messages");if(!a)return;let o=B(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Iu(e,n,o)),wl(a.lastElementChild),e==="assistant"&&xl(a.lastElementChild,n,s),He(a,!!s.forceStick)}function C(e){qt("system","",e)}function La(){for(let e of ja)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}ja.length=0,Tu()}function Jn(){La()}function Tu(){let e=i("chat-attach-bar");if(e){if(!ja.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=ja.map((t,n)=>`
|
|
58
58
|
<div class="chat-thumb relative" title="${p(t.ref||t.path)}">
|
|
59
59
|
${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
|
|
60
60
|
<span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
|
|
61
61
|
<button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
|
|
62
|
-
</div>`).join("")}}function
|
|
62
|
+
</div>`).join("")}}function kt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function gr(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
|
|
63
63
|
<span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
|
|
64
|
-
</div>`),He(t))}function
|
|
65
|
-
${String(e||"")}`}function
|
|
64
|
+
</div>`),He(t))}function Fn(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 ${kt(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${kt(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${kt(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${kt(s)}`:"";gr(`\u2191${kt(t)} \u2193${kt(n)}${a}${o}${r}${l}${u}`)}function br(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 ${kt(t)} / ${kt(n)}`):t!=null&&a.push(`context ${kt(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`),gr(`\u25A3 ${a.join(" \xB7 ")}`)}function bl(){let e=i("messages");e&&(e.dataset.historyPainting="1",e.innerHTML="",Ye=null,mr.clear())}function vr(e=null){let t=i("messages");t&&(delete t.dataset.historyPainting,e==null?He(t,!0):(t.scrollTop=Math.max(0,e),ll(t).setFollowing(xs(t))))}function Qn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,Ye=null,Xe=Ue=null,Pt=dt=null,mr.clear(),Ia.clear()}function Cu(e,t=c.sessionId){return`${t||""}
|
|
65
|
+
${String(e||"")}`}function vl(e,t=c.sessionId){let n=Cu(e,t);!e||Ia.has(n)||(Ia.add(n),qt("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function Mu(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)vl(n,e.sessionId||c.sessionId);t.length&&C(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function Au(){let e=i("messages");e&&(e.querySelectorAll(".queued-user-msg").forEach(t=>{t.classList.remove("queued-user-msg"),t.classList.add("cancelled-queued-user-msg")}),Ia.clear())}function xl(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++uu}`;mr.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
|
|
66
66
|
<button type="button" class="msg-action-btn" data-copy-message="${p(s)}" title="Copy answer">Copy</button>
|
|
67
|
-
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}function
|
|
67
|
+
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}function ju(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>`),He(t),t.lastElementChild}function Du(e,t){e&&(e.textContent+=t,He(e.closest("#messages")))}function _u(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,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function rl(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=_u(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
|
|
68
68
|
<div class="flex items-center gap-1.5 text-xs font-mono">
|
|
69
69
|
<span class="text-warning">\u26A1</span>
|
|
70
70
|
<span class="text-warning font-semibold">${p(e.name||"tool")}</span>
|
|
@@ -72,21 +72,21 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
72
72
|
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
|
|
73
73
|
</div>
|
|
74
74
|
<div class="tool-detail">${p(n)}</div>
|
|
75
|
-
</div>`}function
|
|
75
|
+
</div>`}function Nu(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>
|
|
76
76
|
<span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
|
|
77
77
|
<span class="text-base-content/40 truncate flex-1">${p(n)}</span>
|
|
78
|
-
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function pt(){Ye=null}function
|
|
78
|
+
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function pt(){Ye=null}function xr(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=B(t.ts);if(s==="clean"){if(!Ye||!n.contains(Ye.el)){let u=Ma(a),l=Aa(a);n.insertAdjacentHTML("beforeend",`
|
|
79
79
|
<div class="msg-row assistant px-2" data-ts="${p(l)}">
|
|
80
80
|
<div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
|
|
81
81
|
<div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
|
|
82
82
|
<div class="tool-batch-list"></div>
|
|
83
83
|
</div>
|
|
84
84
|
${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
|
|
85
|
-
</div>`),Ye={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ye.names.push(e.name||"tool"),Ye.count++,Ye.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",
|
|
85
|
+
</div>`),Ye={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ye.names.push(e.name||"tool"),Ye.count++,Ye.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",rl(e,{inBatch:!0})),Nu(Ye),He(n);return}Ye=null;let o=Ma(a),r=Aa(a);n.insertAdjacentHTML("beforeend",`
|
|
86
86
|
<div class="msg-row assistant px-2" data-ts="${p(r)}">
|
|
87
|
-
<div class="w-full max-w-[96%]">${
|
|
87
|
+
<div class="w-full max-w-[96%]">${rl(e)}</div>
|
|
88
88
|
${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
|
|
89
|
-
</div>`),He(n)}function
|
|
89
|
+
</div>`),He(n)}function yl(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function Pu(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",`
|
|
90
90
|
<div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
|
|
91
91
|
<div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
|
|
92
92
|
<div class="font-mono text-xs text-base-content/60 break-all mb-2">
|
|
@@ -96,13 +96,13 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
96
96
|
<button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
|
|
97
97
|
<button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
|
|
98
98
|
</div>
|
|
99
|
-
</div>`),He(i("messages"))}function
|
|
99
|
+
</div>`),He(i("messages"))}function Hu(){if(il||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
|
|
100
100
|
<div class="code-block-header">
|
|
101
101
|
<span class="code-block-lang">${p(r)}</span>
|
|
102
102
|
<button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
|
|
103
103
|
</div>
|
|
104
104
|
<pre><code class="hljs ${d}">${e(s)}</code></pre>
|
|
105
|
-
</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>`},html(s){return e(s)}};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)}
|
|
105
|
+
</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>`},html(s){return e(s)}};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)}il=!0}function Ea(e){if(typeof marked>"u")return p(e);try{return Hu(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function qu(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 wl(e){qu(e),yt(e),xt(e)}var ln,ws,Un,ut,$t,$a,sl,cr,al,dr,ur,mr,uu,Ia,pr,Fe,ol,cn,ul,Xe,Ue,Pt,dt,yu,Su,Lu,ja,Ye,il,Na=W(()=>{K();tr();G();ce();gs();rr();wa();Pn();tn();nn();lr();Nt();Nt();ln=null;ws=0,Un=null,ut=1e3,$t=0,$a=null,sl=!1,cr=!1,al=null,dr=!1,ur="hubStreamCursors",mr=new Map,uu=0,Ia=new Set,pr="pendingUserTexts",Fe=(()=>{try{let e=JSON.parse(sessionStorage.getItem(pr)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),ol=new Set,cn=new Map;ul=0;Xe=null,Ue=null,Pt=null,dt=null;yu={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"};Su=200,Lu=500;ja=[];Ye=null;il=!1});function $l(e,t){kl=e,yr=t,window.addEventListener("hashchange",()=>{if(wr){wr=!1;return}Ll(location.hash.slice(1)||"/")}),De(X,n=>{c.sessionId&&Is()})}function kr(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 Sl(){Ll(location.hash.slice(1)||"/")}function Ll(e){let t=String(e||"").split("?")[0];if(t==="/settings"){document.dispatchEvent(new CustomEvent("router:settings"));return}if(t==="/notes"){document.dispatchEvent(new CustomEvent("router:notes"));return}let n=kr(e);if(!n){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:s,tab:a,machineId:o,agent:r}=n;!kl||!yr||(s!==c.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:s,tab:a,machineId:o,agent:r}})):a&&a!==X.peek()&&yr(a))}function $r(e){wr=!0,location.hash=e}function Is(){if(!c.sessionId)return;let e=new URLSearchParams;c.machineId&&e.set("machine",c.machineId),c.agent&&e.set("agent",c.agent);let t=e.size?`?${e}`:"";$r(`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${t}`)}function El(){if(!c.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;c.machineId&&t.set("machine",c.machineId),c.agent&&t.set("agent",c.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${n}`,e.toString()}var Qm,kl,yr,wr,Pa=W(()=>{K();G();Qm=Ei({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),kl=null,yr=null,wr=!1});async function qa(){try{return await ft.get("sessions")??null}catch{return null}}async function Il(e){try{await ft.set("sessions",e,{ttl:Ru})}catch{}}async function Tl(){try{return await ft.get("workspaces")??null}catch{return null}}async function Ts(e){try{await ft.set("workspaces",e,{ttl:3600*1e3})}catch{}}async function Cl(e){try{return Cs(await ft.get(`transcript:${e}`))}catch{return null}}function Ml(e,t){let n=Cs(t);return Sr=Sr.catch(()=>{}).then(async()=>{await ft.set(`transcript:${e}`,n,{ttl:1440*60*1e3});let s=`transcript:${e}`,a=await ft.get("transcript-index-v2"),o=[{key:s,at:Date.now()},...(a||[]).filter(d=>d.key!==s)].filter(d=>d.at>=Date.now()-1440*60*1e3).slice(0,24),r=new Set(o.map(d=>d.key));for(let d of await ft.keys())String(d).startsWith("transcript:")&&!r.has(d)&&await ft.delete(d);await ft.set("transcript-index-v2",o)}),Sr.catch(()=>{})}function Ha(e,t=1024*1024){if(typeof e=="string")return e.length*3+2;if(!e||typeof e!="object")return 16;let n=2;for(let[s,a]of Object.entries(e))if(n+=s.length*3+Ha(a,t-n)+4,n>t)break;return n}function Cs(e){if(!e?.msgs)return e??null;let t=e.msgs.length,n=Ha(e.context),s=n>64*1024?null:e.context;for(n=Ha(s);t>0&&e.msgs.length-t<80;){let a=Ha(e.msgs[t-1]);if(n+a>1024*1024)break;n+=a,t--}return{...e,context:s,msgs:e.msgs.slice(t),meta:{...e.meta,oldestIndex:(e.meta?.oldestIndex||0)+t,truncated:t>0||!!e.meta?.truncated}}}var ft,Ru,Sr,Ms=W(()=>{K();ft=Ii("claude-ui"),Ru=300*1e3;Sr=Promise.resolve()});var jr={};cs(jr,{closeNotes:()=>ql,initNotes:()=>Ar,openNotes:()=>Oa});function Oa(){Rl();let e=document.getElementById("notes-page");if(!e)return;e.hidden=!1,document.getElementById("welcome")?.classList.add("hidden");let t=document.getElementById("project-view");t&&(t.classList.add("hidden"),t.style.display="none"),document.documentElement.classList.remove("notes-open"),(location.hash||"")!=="#/notes"&&(location.hash="/notes"),fn({keepList:!0})}function ql({restore:e=!0}={}){let t=document.getElementById("notes-page");if(!t)return;t.hidden=!0,document.documentElement.classList.remove("notes-open"),Ze=null,Lt=!1;let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!0),!!e)if(c.sessionId){let s=document.getElementById("project-view");s&&(s.classList.remove("hidden"),s.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}else{let s=document.getElementById("welcome");s&&(s.classList.remove("hidden"),s.style.display="")}}function Rl(){if(Nl)return;Nl=!0,(document.getElementById("main")||document.getElementById("root")).insertAdjacentHTML("beforeend",Qu()),document.addEventListener("router:notes",()=>Oa()),document.getElementById("notes-page").addEventListener("click",s=>{if(s.target.closest("[data-notes-close]")){ql(),(location.hash||"")==="#/notes"&&history.back();return}let o=s.target.closest("[data-notes-add]");if(o){s.preventDefault(),Lt=!Lt;let m=document.getElementById("notes-add-form");m&&(m.hidden=!Lt),o.textContent=Lt?"\u6536\u8D77":"+ \u65B0\u589E",Lt&&document.getElementById("notes-add-text")?.focus();return}if(s.target.closest("[data-notes-submit]")){s.preventDefault(),Pl();return}let d=s.target.closest("[data-notes-edit]");if(d){s.preventDefault(),Vu(d.dataset.notesEdit);return}if(s.target.closest("[data-notes-save]")){s.preventDefault(),Xu();return}if(s.target.closest("[data-notes-cancel]")){if(s.preventDefault(),Ze)Yu();else{Lt=!1;let m=document.getElementById("notes-add-form");m&&(m.hidden=!0);let g=document.querySelector("[data-notes-add]");g&&(g.textContent="+ \u65B0\u589E")}return}let f=s.target.closest("[data-notes-remove]");if(f){s.preventDefault();let m=f.dataset.notesRemove;confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&Bl(m)}});let n=document.getElementById("notes-add-text");n&&n.addEventListener("keydown",s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&(s.preventDefault(),Pl())})}function Qu(){return`
|
|
106
106
|
<section id="notes-page" class="notes-page" hidden>
|
|
107
107
|
<header class="notes-header">
|
|
108
108
|
<div>
|
|
@@ -124,21 +124,21 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
124
124
|
<ul id="notes-list" class="notes-list">
|
|
125
125
|
<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>
|
|
126
126
|
</ul>
|
|
127
|
-
</section>`}async function
|
|
128
|
-
<textarea class="notes-edit-text" rows="4">${
|
|
127
|
+
</section>`}async function fn({keepList:e=!1}={}){let t=document.getElementById("notes-list");if(t){(!e||!pn)&&(t.innerHTML='<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>');try{pn=(await x("GET","/api/notes?limit=200",void 0,void 0,{hub:!0}))?.items||[],Mr()}catch(n){t.innerHTML=`<li class="notes-empty notes-error">\u52A0\u8F7D\u5931\u8D25:${n?.message||n}</li>`}}}function Mr(){let e=document.getElementById("notes-list");if(!e)return;let t=document.getElementById("notes-count");t&&(t.textContent=pn?.length?`${pn.length} \u6761\u8BB0\u4E8B \xB7 \u591A\u7AEF\u5B9E\u65F6\u540C\u6B65`:"\u591A\u7AEF\u5B9E\u65F6\u540C\u6B65");let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!Lt),!pn||pn.length===0){e.innerHTML='<li class="notes-empty">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002\u70B9\u4E0A\u9762\u7684\u300C\u65B0\u589E\u300D\uFF0C\u6216\u8005\u5728 Meta Agent \u91CC\u8F93\u5165\u300C\u8BB0: xxx\u300D</li>';return}e.innerHTML="";for(let s of pn){let a=document.createElement("li");a.className="notes-item",a.dataset.id=s.id,Ze===s.id?a.innerHTML=`
|
|
128
|
+
<textarea class="notes-edit-text" rows="4">${Hl(s.text)}</textarea>
|
|
129
129
|
<div class="notes-item-actions">
|
|
130
130
|
<button class="btn btn-sm btn-primary" data-notes-save>\u4FDD\u5B58</button>
|
|
131
131
|
<button class="btn btn-sm btn-ghost" data-notes-cancel>\u53D6\u6D88</button>
|
|
132
132
|
</div>`:a.innerHTML=`
|
|
133
|
-
<div class="notes-text">${
|
|
133
|
+
<div class="notes-text">${Hl(s.text)}</div>
|
|
134
134
|
<div class="notes-item-foot">
|
|
135
|
-
<span class="notes-meta">${
|
|
135
|
+
<span class="notes-meta">${Zu(s.createdAt)}</span>
|
|
136
136
|
<div class="notes-item-actions">
|
|
137
137
|
<button class="btn btn-ghost btn-xs" data-notes-edit="${s.id}" title="\u7F16\u8F91">\u7F16\u8F91</button>
|
|
138
138
|
<button class="btn btn-ghost btn-xs text-error" data-notes-remove="${s.id}" title="\u5220\u9664">\u5220\u9664</button>
|
|
139
139
|
</div>
|
|
140
|
-
</div>`,e.appendChild(a)}}function
|
|
141
|
-
`);d=m.pop()||"";for(let g of m)if(g.startsWith("event:"))u=g.slice(6).trim();else if(g.startsWith("data:")){let w=g.slice(5).trim();if(!w)continue;let y;try{y=JSON.parse(w)}catch{continue}n[u]?.(y),!n[u]&&n.tool&&(u==="tool_call"&&n.tool({name:y.name,args:y.args,id:y.callId,phase:"start"}),u==="tool_result"&&n.tool({id:y.callId,phase:y.ok===!1?"error":"done",result:y.ok===!1?y.error:y.result})),n.any?.(u,y),u="message"}else g.trim()===""&&(u="message")}}function
|
|
140
|
+
</div>`,e.appendChild(a)}}function Vu(e){Ze=e,Mr()}function Yu(){Ze=null,Mr()}async function Xu(){let e=document.getElementById("notes-list");if(!e)return;let t=e.querySelector(`li[data-id="${ep(Ze)}"]`);if(!t)return;let n=t.querySelector(".notes-edit-text");if(!n)return;let s=(n.value||"").trim();if(!s){confirm("\u6587\u672C\u4E3A\u7A7A,\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&await Bl(Ze);return}try{await x("PATCH",`/api/notes/${Ze}`,{text:s},void 0,{hub:!0}),Ze=null,await fn({keepList:!0})}catch(a){alert("\u4FDD\u5B58\u5931\u8D25:"+(a?.message||a))}}async function Pl(){let e=document.getElementById("notes-add-text");if(!e)return;let t=(e.value||"").trim();if(!t){e.focus();return}try{await x("POST","/api/notes",{text:t},void 0,{hub:!0}),e.value="",Lt=!1;let n=document.getElementById("notes-add-form");n&&(n.hidden=!0);let s=document.querySelector("[data-notes-add]");s&&(s.textContent="+ \u65B0\u589E"),await fn({keepList:!0})}catch(n){alert("\u4FDD\u5B58\u5931\u8D25:"+(n?.message||n))}}async function Bl(e){try{await x("DELETE",`/api/notes/${e}`,void 0,void 0,{hub:!0}),Ze===e&&(Ze=null),await fn({keepList:!0})}catch(t){alert("\u5220\u9664\u5931\u8D25:"+(t?.message||t))}}function Zu(e){if(!e)return"";let t=new Date(e),n=s=>String(s).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function ep(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_-]/g,t=>"\\"+t)}function Hl(e){return String(e??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Ar(){Rl()}var pn,Ze,Nl,Lt,js=W(()=>{ce();G();pn=null,Ze=null,Nl=!1,Lt=!1;typeof window<"u"&&(window.addEventListener("hub:note-added",()=>{document.getElementById("notes-page")?.hidden||fn()}),window.addEventListener("hub:note-updated",()=>{document.getElementById("notes-page")?.hidden||fn()}),window.addEventListener("hub:note-removed",()=>{document.getElementById("notes-page")?.hidden||fn()}))});function Xn(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function Zn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),yt(e),xt(e))}async function Nr(e,t,n){let s=ct({"Content-Type":"application/json"},{hub:!0}),a=await fetch(e,{method:"POST",headers:s,body:JSON.stringify(t||{})});if(!a.ok){let l=await a.json().catch(()=>({}));throw new Error(l.error||`HTTP ${a.status}`)}let o=a.body.getReader(),r=new TextDecoder,d="",u="message";for(;;){let{done:l,value:f}=await o.read();if(l)break;d+=r.decode(f,{stream:!0});let m=d.split(`
|
|
141
|
+
`);d=m.pop()||"";for(let g of m)if(g.startsWith("event:"))u=g.slice(6).trim();else if(g.startsWith("data:")){let w=g.slice(5).trim();if(!w)continue;let y;try{y=JSON.parse(w)}catch{continue}n[u]?.(y),!n[u]&&n.tool&&(u==="tool_call"&&n.tool({name:y.name,args:y.args,id:y.callId,phase:"start"}),u==="tool_result"&&n.tool({id:y.callId,phase:y.ok===!1?"error":"done",result:y.ok===!1?y.error:y.result})),n.any?.(u,y),u="message"}else g.trim()===""&&(u="message")}}function tp(){return`
|
|
142
142
|
<div id="meta-agent-panel" class="meta-agent-panel hidden" aria-hidden="true">
|
|
143
143
|
<div class="meta-agent-backdrop" data-ma-close="1"></div>
|
|
144
144
|
<div class="meta-agent-sheet">
|
|
@@ -318,39 +318,39 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
318
318
|
</div>
|
|
319
319
|
</div>
|
|
320
320
|
</div>
|
|
321
|
-
</div>`}function Te(e){
|
|
321
|
+
</div>`}function Te(e){Rt=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,u]of[[t,"chat"],[n,"history"],[s,"notes"],[a,"report"],[o,"config"]]){if(!d)continue;let l=e===u;d.classList.toggle("hidden",!l),d.classList.toggle("flex",l)}let r=(d,u)=>{let l=i(d);l&&(l.classList.toggle("border-primary/40",u),l.classList.toggle("text-primary",u))};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"&&bn(),e==="notes"&&hn()}function _s(){let e=i("ma-session-title"),t=i("ma-resume-bar"),n=i("ma-resume-text");if(!we){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let s=qe?.title||we.slice(0,8),a=za(qe?.updatedAt);if(e&&(e.textContent=a?`${s} \xB7 ${a}`:s),t&&n){t.classList.remove("hidden");let o=qe?.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 Pr(e="chat"){let t=i("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),Ka=!0,Te(e),e==="chat"){Et();let n=localStorage.getItem(Bt);!we&&n?It(n,{silent:!0}).catch(()=>{localStorage.removeItem(Bt)}):_s()}e==="history"&&Et().then(()=>bn()),e==="report"&&Xl(),e==="config"&&Zl(),setTimeout(()=>{Rt==="chat"&&i("ma-input")?.focus(),Rt==="history"&&i("ma-history-search")?.focus()},50)}}function Jl(){let e=i("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),Ka=!1)}function Ql(){Ka?Jl():Pr(Rt==="config"?"chat":Rt)}function ee(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>`,Zn(a)):e==="reasoning"?(a.innerHTML='<details class="ma-reasoning" open><summary>\u601D\u8003\u8FC7\u7A0B</summary><pre style="white-space:pre-wrap"></pre></details>',a.querySelector("pre").textContent=t):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=`<details class="ma-tool" data-tool-id="${p(n.id||"")}">
|
|
322
322
|
<summary><span class="ma-tool-name">${p(n.name||"tool")}</span>
|
|
323
323
|
<span class="ma-tool-phase">${p(n.phase||"")}</span></summary>
|
|
324
324
|
<pre class="ma-tool-args" style="white-space:pre-wrap">${p(JSON.stringify(n.args||{},null,2))}</pre>
|
|
325
|
-
</details>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function
|
|
325
|
+
</details>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ul(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=Xn(t),Zn(n),i("ma-messages").scrollTop=i("ma-messages").scrollHeight)}function _r(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!==void 0&&t!=="start"){let r=a.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",r.style.whiteSpace="pre-wrap",a.appendChild(r)),r.textContent=JSON.stringify(n,null,2)}}function np(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=`
|
|
326
326
|
<div class="ma-approval-label">\u26A0 Agent \u60F3\u8981\u6267\u884C\u547D\u4EE4\uFF0C\u662F\u5426\u5141\u8BB8\uFF1F</div>
|
|
327
327
|
<pre class="ma-approval-cmd">${p(s)}</pre>
|
|
328
328
|
<div class="ma-approval-actions">
|
|
329
329
|
<button type="button" class="btn btn-xs btn-error" data-approve="0">\u62D2\u7EDD</button>
|
|
330
330
|
<button type="button" class="btn btn-xs btn-success" data-approve="1">\u5141\u8BB8\u6267\u884C</button>
|
|
331
|
-
</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 x("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
|
|
331
|
+
</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 x("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 sp(){return Ol+=1,`img${Ol}`}function ap(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 Fl(e,t){let n=ct({"x-filename":t||`paste-${Date.now()}.png`},{hub:!0});delete n["Content-Type"];let s=await fetch("/api/upload-image",{method:"POST",headers:n,body:e});if(!s.ok){let l=await s.json().catch(()=>({}));throw new Error(l.error||`Upload failed: ${s.status}`)}let{path:a}=await s.json();if(!a)throw new Error("upload returned no path");let o=sp(),r=`[${o}](${a})`,d=i("ma-input");ap(d,(d?.value&&!d.value.endsWith(`
|
|
332
332
|
`)&&d.value.length?`
|
|
333
333
|
`:"")+r+`
|
|
334
|
-
`);let u="";try{u=URL.createObjectURL(e)}catch{}return
|
|
334
|
+
`);let u="";try{u=URL.createObjectURL(e)}catch{}return mn.push({path:a,previewUrl:u,label:o,ref:r}),Hr(),{path:a,ref:r,label:o}}function Hr(){let e=i("ma-attach-bar");if(e){if(!mn.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=mn.map((t,n)=>`
|
|
335
335
|
<div class="ma-thumb relative" title="${p(t.ref||t.path)}">
|
|
336
336
|
${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="ma-thumb-path">${p(t.label||"img")}</span>`}
|
|
337
337
|
<span class="ma-thumb-label">${p(t.label||"")}</span>
|
|
338
338
|
<button type="button" class="ma-thumb-x" data-rm-img="${n}">\u2715</button>
|
|
339
|
-
</div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=
|
|
339
|
+
</div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=mn[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,`
|
|
340
340
|
|
|
341
|
-
`),a.dispatchEvent(new Event("input"))),
|
|
341
|
+
`),a.dispatchEvent(new Event("input"))),mn.splice(n,1),Hr()})})}}function za(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 Et(){try{Wa=(await x("GET","/api/ai/sessions")).sessions||[]}catch{Wa=[]}return Wa}function Vl(){let e=E.peek(),t=c.sessionId?`${c.agent||$.peek()||"claude"}:${c.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:c.sessionId||"",agent:c.agent||$.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function Ds(){gn=null,zl=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=!!c.sessionId,i("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",i("ma-note-delete").disabled=!0,i("ma-note-links").textContent=Vl().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Yl(e){gn=e?.id||null,zl=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 ${za(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 op(){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&&c.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${c.agent||$.peek()||"claude"} / ${c.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
|
|
342
342
|
${t}`:"",n.length?n.join(`
|
|
343
343
|
`):"","","\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(`
|
|
344
|
-
`);Te("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function
|
|
344
|
+
`);Te("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function Yn(){let e=(Kl||"").trim();return Ga=(await x("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],Ga}function hn(){let e=i("ma-notes-list");if(e){if(!Ga.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=Ga.map(t=>{let n=t.id===gn,s=[t.scope==="project"?"\u9879\u76EE":t.scope==="session"?"\u4F1A\u8BDD":"\u901A\u7528",t.pinned?"\u7F6E\u9876":""].filter(Boolean).join(" \xB7 ");return`
|
|
345
345
|
<button type="button" class="ma-note-item ${n?"active":""}" data-note-id="${p(t.id)}">
|
|
346
346
|
<div class="text-left">
|
|
347
347
|
<div class="font-medium text-xs truncate">${p(t.title||"\u672A\u547D\u540D")}</div>
|
|
348
348
|
<div class="text-[10px] text-base-content/45 mt-0.5 line-clamp-2">${p(t.content||"")}</div>
|
|
349
|
-
<div class="text-[10px] text-base-content/35 mt-1">${p(s)}${s?" \xB7 ":""}${p(
|
|
349
|
+
<div class="text-[10px] text-base-content/35 mt-1">${p(s)}${s?" \xB7 ":""}${p(za(t.updatedAt)||"")}</div>
|
|
350
350
|
</div>
|
|
351
|
-
</button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await x("GET",`/api/ai/notes/${t.dataset.noteId}`);
|
|
351
|
+
</button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await x("GET",`/api/ai/notes/${t.dataset.noteId}`);Yl(n),hn()}catch(n){i("ma-note-status").textContent=n.message}})})}}async function rp(){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=Vl(),s={id:gn||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 x("POST","/api/ai/notes",s);Yl(a),await Yn(),hn()}async function ip(){if(!gn){Ds();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await x("DELETE",`/api/ai/notes/${gn}`),Ds(),await Yn(),hn())}function bn(){let e=i("ma-history-list");if(!e)return;let t=(Gl||"").trim().toLowerCase(),n=Wa;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">
|
|
352
352
|
${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"}
|
|
353
|
-
</div>`;return}e.innerHTML=n.map(s=>{let a=s.id===we,o=
|
|
353
|
+
</div>`;return}e.innerHTML=n.map(s=>{let a=s.id===we,o=za(s.updatedAt)||"",r=s.messageCount||0;return`
|
|
354
354
|
<div class="ma-hist-item ${a?"active":""}" data-hist-id="${p(s.id)}">
|
|
355
355
|
<div class="flex items-start gap-2">
|
|
356
356
|
<button type="button" class="ma-hist-open flex-1 min-w-0 text-left" data-hist-open="${p(s.id)}">
|
|
@@ -363,61 +363,61 @@ ${t}`:"",n.length?n.join(`
|
|
|
363
363
|
<button type="button" class="btn btn-ghost btn-xs px-1 text-error" data-hist-del="${p(s.id)}" title="\u5220\u9664">\u2715</button>
|
|
364
364
|
</div>
|
|
365
365
|
</div>
|
|
366
|
-
</div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await
|
|
367
|
-
`)||"[\u2026]"}function
|
|
366
|
+
</div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await It(s.dataset.histOpen),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await It(s.dataset.histResume),Te("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 x("DELETE",`/api/ai/sessions/${o}`),we===o&&(we=null,qe=null,localStorage.removeItem(Bt),It(null)),await Et(),bn()}catch(r){alert(r.message)}})})}function Wl(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(`
|
|
367
|
+
`)||"[\u2026]"}function lp(e){let t=i("ma-messages");if(t){if(t.innerHTML="",!e?.length){ee("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){ee("user",Wl(n.content));continue}if(n.role==="assistant"){if(n.reasoning&&(ee("reasoning",n.reasoning).querySelector("details").open=!1),n.content&&ee("assistant",typeof n.content=="string"?n.content:Wl(n.content)),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{}ee("tool","",{name:a,args:o,phase:"history",id:s.id||a})}continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)_r(a,typeof s=="string"&&s.startsWith("error:")?"error":"done",s);else{ee("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",d.style.whiteSpace="pre-wrap",r.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,2)}}}}t.scrollTop=t.scrollHeight}}async function cp(){if(!we){await It(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${we}`),we=null,qe=null,localStorage.removeItem(Bt),await Et(),await It(null),Rt==="history"&&bn()}catch(e){ee("error",e.message)}}async function It(e,t={}){if(!e){we=null,qe=null,localStorage.removeItem(Bt);let n=i("ma-messages");return n&&(n.innerHTML=""),ee("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"),_s(),null}try{let n=await x("GET",`/api/ai/sessions/${e}`);return we=n.id,qe={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(Bt,n.id),lp(n.messages||[]),t.silent||ee("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"),_s(),Rt==="history"&&bn(),n}catch(n){throw t.silent||ee("error",n.message),n}}async function Fa(){if(Vn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;Vn=!0,i("ma-send").disabled=!0,ee("user",t),e.value="",e.style.height="";for(let o of mn)if(o.previewUrl)try{URL.revokeObjectURL(o.previewUrl)}catch{}mn=[],Hr();let n=null,s="",a=null;try{await Nr("/api/ai/chat",{message:t,sessionId:we},{session:o=>{we=o.id,qe={...qe||{},id:o.id,title:o.title||qe?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(Bt,o.id),_s()},round_start:()=>{n=null,a&&(a.querySelector("details").open=!1),a=null},reasoning:o=>{a||(a=ee("reasoning","")),a.querySelector("pre").textContent=o.content||""},tool_call:o=>{ee("tool","",{name:o.name,args:o.args,phase:"\u6267\u884C\u4E2D",id:o.callId})},tool_result:o=>_r(o.callId,o.ok===!1?"error":"done",o.ok===!1?o.error:o.result),content:o=>{s=o.content||"",n||(n=ee("assistant","")),Ul(n,s)},tool:o=>{o.phase==="start"?ee("tool","",{name:o.name,args:o.args,phase:"start",id:o.id}):_r(o.id,o.phase,o.result)},approval:o=>np(o),done:o=>{o.sessionId&&(we=o.sessionId,localStorage.setItem(Bt,o.sessionId)),(o.title||o.sessionId)&&(qe={id:we,title:o.title||qe?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(qe?.messageCount||0)+2}),o.content&&(n||(n=ee("assistant","")),Ul(n,o.content)),a&&(a.querySelector("details").open=!1),_s(),Et()},error:o=>{ee("error",o.message||"error")}})}catch(o){ee("error",o.message)}finally{Vn=!1,i("ma-send").disabled=!1}}async function dp(){if(Vn)return;Vn=!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 Nr("/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),Zn(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),Zn(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{Vn=!1,i("ma-gen-report").disabled=!1}}async function Xl(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await x("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=i("ma-report-body");s.innerHTML=`
|
|
368
368
|
<div class="text-[10px] text-base-content/40 mb-2">${p(n.title||t)} \xB7 ${p(n.generatedAt||"")}</div>
|
|
369
|
-
<div class="md ma-report-md">${
|
|
369
|
+
<div class="md ma-report-md">${Xn(n.markdown)}</div>`,Zn(s)}}catch{}}async function up(){let e=i("ma-report-list");try{let t=await x("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=>`
|
|
370
370
|
<button type="button" class="ma-report-item w-full text-left px-2 py-1 rounded hover:bg-base-200 text-xs"
|
|
371
371
|
data-day="${p(s.day)}">
|
|
372
372
|
<span class="font-semibold">${p(s.day)}</span>
|
|
373
373
|
<span class="text-base-content/45 ml-1">${p(s.title||"")}</span>
|
|
374
374
|
</button>`).join(""),e.querySelectorAll("[data-day]").forEach(s=>{s.addEventListener("click",async()=>{try{let a=await x("GET",`/api/ai/reports/${s.dataset.day}`),o=i("ma-report-body");o.innerHTML=`
|
|
375
375
|
<div class="text-[10px] text-base-content/40 mb-2">${p(a.title||a.day)} \xB7 ${p(a.generatedAt||"")}</div>
|
|
376
|
-
<div class="md ma-report-md">${
|
|
377
|
-
<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] ${
|
|
376
|
+
<div class="md ma-report-md">${Xn(a.markdown)}</div>`,Zn(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 Zl(){try{let e=await x("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)),Ns(e)}catch(e){i("ma-cfg-status").textContent=e.message}}async function pp(){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 x("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="",Ns(a)}catch(t){e.textContent=t.message}}function Ns(e){if(Ua&&(clearInterval(Ua),Ua=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Ua=setInterval(async()=>{if(!c.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(Dr!==s&&!(n.getMinutes()>10))try{Dr=s,localStorage.setItem("ai_last_auto_report",s),await Nr("/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),Dr="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function ec(){i("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",tp()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Jl)}),i("ma-btn-chat")?.addEventListener("click",()=>Te("chat")),i("ma-btn-history")?.addEventListener("click",async()=>{await Et(),Te("history")}),i("ma-btn-notes")?.addEventListener("click",async()=>{await Yn(),gn||Ds(),Te("notes")}),i("ma-open-history")?.addEventListener("click",async()=>{await Et(),Te("history")}),i("ma-btn-report")?.addEventListener("click",()=>{Te("report"),Xl()}),i("ma-btn-config")?.addEventListener("click",()=>{Te("config"),Zl()}),i("ma-send")?.addEventListener("click",Fa),i("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Fa())}),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",()=>{It(null),Te("chat")}),i("ma-del-session")?.addEventListener("click",cp),i("ma-resume-focus")?.addEventListener("click",()=>{i("ma-input")?.focus()}),i("ma-history-refresh")?.addEventListener("click",async()=>{await Et(),bn()}),i("ma-history-new")?.addEventListener("click",()=>{It(null),Te("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Gl=e.target.value||"",bn()}),i("ma-quick-today")?.addEventListener("click",()=>{Te("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",Fa()}),i("ma-quick-projects")?.addEventListener("click",()=>{Te("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",Fa()}),i("ma-gen-report")?.addEventListener("click",dp),i("ma-load-reports")?.addEventListener("click",up),i("ma-notes-refresh")?.addEventListener("click",async()=>{await Yn(),hn()}),i("ma-notes-new")?.addEventListener("click",()=>{Ds(),hn(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Kl=e.target.value||"",await Yn(),hn()}),i("ma-note-save")?.addEventListener("click",async()=>{try{await rp()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-delete")?.addEventListener("click",async()=>{try{await ip()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-ask")?.addEventListener("click",op),i("ma-cfg-save")?.addEventListener("click",pp),i("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report").checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)});Ns(e)}catch{}}),i("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour").value||"18",10)});Ns(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){ee("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Fl(s,s.name||`upload-${Date.now()}.png`)}}catch(s){ee("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(!Ka||Rt!=="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 u=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Fl(d,`paste-${Date.now()}.${u}`)}}catch(r){ee("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),It(null,{silent:!0}),Ds())}function Ps(){c.token&&(M.peek()&&!fs()||(Et(),Yn().catch(()=>{}),x("GET","/api/ai/config").then(Ns).catch(()=>{})))}var Ka,Rt,Vn,we,qe,mn,Ol,Ua,Dr,Wa,Gl,Ga,Kl,gn,zl,Bt,Hs=W(()=>{K();ce();G();Pn();nn();tn();Ka=!1,Rt="chat",Vn=!1,we=null,qe=null,mn=[],Ol=0,Ua=null,Dr=localStorage.getItem("ai_last_auto_report")||"",Wa=[],Gl="",Ga=[],Kl="",gn=null,zl=null,Bt="ma_last_session_id"});function qr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function xn(){let e=qr(ne.peek()),t=_.peek();M.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=ye.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function sc(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 fp(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 l=a-1;l>=0;l--)n.push({date:new Date(e,t-1,d-l),isCurrentMonth:!1});for(let l=1;l<=r;l++)n.push({date:new Date(e,t,l),isCurrentMonth:!0});let u=7-n.length%7;if(u<7)for(let l=1;l<=u;l++)n.push({date:new Date(e,t+1,l),isCurrentMonth:!1});return n}function ac(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=B(a.updatedAt);return o!=null&&o>=n&&o<s})}function oc(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function yn(e){let t=i("calendar-grid");if(!t)return;e=qr(e??xn());let n=i("calendar-month-year");if(n){let f=new Date(Ja,vn,1);n.textContent=f.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(f=>f.cwd).filter(Boolean)).size,o=e.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),r=i("stats-total-sessions"),d=i("stats-total-projects"),u=i("stats-total-tokens");r&&(r.textContent=String(s)),d&&(d.textContent=String(a)),u&&(u.textContent=oc(o));let l=fp(Ja,vn);qs||(qs=sc(new Date)),t.innerHTML=l.map(f=>{let m=f.date,g=sc(m),y=ac(m,e).length,A=m.toDateString()===new Date().toDateString(),ae=g===qs,O="",pe="text-base-content/65",q="border border-transparent",Q="cursor-default",he=f.isCurrentMonth?"":"opacity-25";y>0?(Q="cursor-pointer",y<=2?(O="bg-primary/15",pe="text-primary font-bold",q="border border-primary/30"):y<=5?(O="bg-primary/30",pe="text-primary font-bold",q="border border-primary/50"):(O="bg-primary/60",pe="text-primary-content font-bold",q="border border-primary/80")):(O="bg-base-300/25",f.isCurrentMonth&&(Q="hover:bg-base-300/50")),A?q="border-2 border-primary":ae&&(q="border-2 border-accent");let Ae=m.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${m.toLocaleDateString([],{month:"short"})}</span>`:"";return`
|
|
377
|
+
<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] ${O} ${pe} ${q} ${Q} ${he}"
|
|
378
378
|
data-cal-date="${g}" title="${m.toDateString()}: ${y} session(s)">
|
|
379
379
|
${Ae}
|
|
380
380
|
<span class="text-sm font-semibold">${m.getDate()}</span>
|
|
381
381
|
${y>0?`<span class="text-[10px] mt-0.5 opacity-80 font-medium whitespace-nowrap">${y}s</span>`:""}
|
|
382
|
-
</div>`}).join(""),
|
|
382
|
+
</div>`}).join(""),mp(e),Br()}function mp(e){let t=i("selected-day-title"),n=i("selected-day-sessions");if(!t||!n)return;let[s,a,o]=qs.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=qr(e);let d=ac(r,e),u=d.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),l=i("stats-selected-tokens");if(l&&(l.textContent=oc(u)),!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((f,m)=>(B(m.updatedAt)||0)-(B(f.updatedAt)||0)),n.innerHTML=d.map(f=>{let m=B(f.updatedAt),g=m!=null?new Date(m).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
|
|
383
383
|
<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 ${c.sessionId===f.sessionId?"border-primary bg-primary/5":""}"
|
|
384
384
|
data-session-id="${p(f.sessionId)}"
|
|
385
385
|
data-session-cwd="${p(f.cwd||"")}"
|
|
386
386
|
data-session-config-dir="${p(f.configDir||"")}"
|
|
387
387
|
data-session-agent="${p(f.agent||"claude")}"
|
|
388
388
|
data-session-machine="${p(f.machineId||"")}">
|
|
389
|
-
<div class="flex-shrink-0">${
|
|
389
|
+
<div class="flex-shrink-0">${Rn(f.agent)}</div>
|
|
390
390
|
<div class="flex-1 min-w-0">
|
|
391
|
-
<div class="text-xs font-semibold truncate text-base-content/90">${p(
|
|
392
|
-
<div class="text-[10px] text-base-content/40 truncate mt-0.5">${p(f.projectName||
|
|
391
|
+
<div class="text-xs font-semibold truncate text-base-content/90">${p(vt(f))}</div>
|
|
392
|
+
<div class="text-[10px] text-base-content/40 truncate mt-0.5">${p(f.projectName||Bn(f.cwd)||"No workspace")}</div>
|
|
393
393
|
</div>
|
|
394
394
|
<div class="text-[9px] text-base-content/45 font-mono whitespace-nowrap bg-base-300 px-1.5 py-0.5 rounded">${g}</div>
|
|
395
|
-
</div>`}).join("")}function
|
|
395
|
+
</div>`}).join("")}function Qa(e){return`${e.machineId||""}:${e.agent||"claude"}:${e.sessionId}`}function Rr(){try{let e=JSON.parse(localStorage.getItem(ic)||"[]");return Array.isArray(e)?e.filter(t=>t&&t.sessionId):[]}catch{return[]}}function lc(e){try{localStorage.setItem(ic,JSON.stringify(e))}catch{}}function cc(e){if(!e?.sessionId)return;let t=Qa(e),n={...e,lastOpenedAt:Date.now()},s=Rr().filter(a=>Qa(a)!==t);s.unshift(n),lc(s.slice(0,rc)),Br(),Ur()}function dc(e){if(!e?.sessionId)return;let t=Qa(e);lc(Rr().filter(n=>Qa(n)!==t)),Br(),Ur()}function uc(e){return Rr().sort((t,n)=>(B(n.lastOpenedAt)||0)-(B(t.lastOpenedAt)||0)).slice(0,e)}function Br(){let e=i("recent-sessions-list");if(!e)return;let t=uc(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=qn(n.updatedAt);return`
|
|
396
396
|
<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 ${c.sessionId===n.sessionId?"border-primary bg-primary/5":""}"
|
|
397
397
|
data-session-id="${p(n.sessionId)}"
|
|
398
398
|
data-session-cwd="${p(n.cwd||"")}"
|
|
399
399
|
data-session-config-dir="${p(n.configDir||"")}"
|
|
400
400
|
data-session-agent="${p(n.agent||"claude")}"
|
|
401
401
|
data-session-machine="${p(n.machineId||"")}">
|
|
402
|
-
<div class="flex-shrink-0">${
|
|
402
|
+
<div class="flex-shrink-0">${Rn(n.agent)}</div>
|
|
403
403
|
<div class="flex-1 min-w-0">
|
|
404
|
-
<div class="text-xs font-bold truncate text-base-content/95">${p(
|
|
405
|
-
<div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||
|
|
404
|
+
<div class="text-xs font-bold truncate text-base-content/95">${p(vt(n))}</div>
|
|
405
|
+
<div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||Bn(n.cwd)||"No workspace")}</div>
|
|
406
406
|
</div>
|
|
407
407
|
<div class="text-[9px] text-base-content/40 whitespace-nowrap self-start mt-0.5">${s}</div>
|
|
408
|
-
</div>`}).join("")}function
|
|
408
|
+
</div>`}).join("")}function wn(){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 Or(){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 u=i("btn-recent-sessions")?.getBoundingClientRect();if(u){let l=Math.min(320,window.innerWidth-16),f=u.left;f+l>window.innerWidth-8&&(f=window.innerWidth-l-8),f<8&&(f=8),e.style.left=`${Math.round(f)}px`,e.style.right="auto",e.style.width=`${l}px`}}let r=Math.max(160,window.innerHeight-a-12);e.style.maxHeight=`${Math.min(r,Math.round(window.innerHeight*.7))}px`}function hp(){let e=i("recent-menu");e&&(Ur(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Or(),i("recent-menu-backdrop")?.classList.remove("hidden"))}function pc(){let e=i("recent-menu");e&&(e.classList.contains("hidden")?hp():wn())}function Ur(){let e=i("recent-menu-list"),t=i("recent-menu-empty"),n=i("recent-menu-count");if(!e)return;let s=uc(rc);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=qn(a.updatedAt),r=c.sessionId===a.sessionId&&(!a.machineId||!c.machineId||a.machineId===c.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`
|
|
409
409
|
<div class="recent-menu-item w-full text-left px-2 py-1.5 rounded-md flex items-start gap-2
|
|
410
410
|
${r?"bg-primary/15 text-primary":"hover:bg-base-200"}">
|
|
411
|
-
<button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(
|
|
411
|
+
<button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(vt(a))}"
|
|
412
412
|
data-session-id="${p(a.sessionId)}"
|
|
413
413
|
data-session-cwd="${p(a.cwd||"")}"
|
|
414
414
|
data-session-config-dir="${p(a.configDir||"")}"
|
|
415
415
|
data-session-agent="${p(a.agent||"claude")}"
|
|
416
416
|
data-session-machine="${p(a.machineId||"")}">
|
|
417
|
-
<span class="flex-shrink-0 mt-0.5">${
|
|
417
|
+
<span class="flex-shrink-0 mt-0.5">${Rn(a.agent)}</span>
|
|
418
418
|
<span class="flex-1 min-w-0">
|
|
419
|
-
<span class="block text-xs font-semibold truncate leading-snug">${p(
|
|
420
|
-
<span class="block text-[10px] text-base-content/40 truncate mt-0.5">${p(a.projectName||
|
|
419
|
+
<span class="block text-xs font-semibold truncate leading-snug">${p(vt(a))}</span>
|
|
420
|
+
<span class="block text-[10px] text-base-content/40 truncate mt-0.5">${p(a.projectName||Bn(a.cwd)||"\u2014")}</span>
|
|
421
421
|
</span>
|
|
422
422
|
<span class="flex flex-col items-end gap-0.5 flex-shrink-0 self-start">
|
|
423
423
|
<span class="text-[9px] text-base-content/40 whitespace-nowrap">${p(o)}</span>
|
|
@@ -426,12 +426,12 @@ ${t}`:"",n.length?n.join(`
|
|
|
426
426
|
</span>
|
|
427
427
|
</button>
|
|
428
428
|
<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"
|
|
429
|
-
title="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664" aria-label="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664 ${p(
|
|
429
|
+
title="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664" aria-label="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664 ${p(vt(a))}"
|
|
430
430
|
data-dismiss-recent-session="${p(a.sessionId)}"
|
|
431
431
|
data-dismiss-recent-agent="${p(a.agent||"claude")}"
|
|
432
432
|
data-dismiss-recent-machine="${p(a.machineId||"")}">\xD7</button>
|
|
433
|
-
</div>`}).join("")}function
|
|
434
|
-
(original: ${e.display||e.sessionId})`:e.display||"",
|
|
433
|
+
</div>`}).join("")}function fc(e){qs=e}function Fr(e){vn+=e,vn<0?(vn=11,Ja--):vn>11&&(vn=0,Ja++)}var Ja,vn,qs,rc,ic,Wr=W(()=>{K();G();Nt();Ja=new Date().getFullYear(),vn=new Date().getMonth(),qs=null;rc=15,ic="recentSessionsV1"});var so={};cs(so,{loadAgentsMeta:()=>ts,loadAllSessions:()=>We,loadMemoryTab:()=>no,loadWorkspaces:()=>es,markActiveSessionRow:()=>gp,mdToHtml:()=>wc,openMemoryFile:()=>Qr,promptCustomModel:()=>Za,refreshEffortSelect:()=>Xa,refreshModelSelect:()=>et,renderProjectGroups:()=>xc,renderSessionList:()=>Jr,renderTimeline:()=>yc,runActivitySearch:()=>eo,scheduleActivitySearch:()=>to,sessionItemHtml:()=>zr,syncSidebarChrome:()=>Rs});function mc(e){return!Array.isArray(e)||!e.length?"":e.map(t=>`${t.sessionId}:${t.updatedAt||0}:${t.turnCount||0}:${t.agent||""}`).join("|")}function gp(e,t){let n=t||"claude";document.querySelectorAll("#session-list .session-row").forEach(s=>{let a=s.dataset.sessionId===e&&(s.dataset.sessionAgent||"claude")===n;s.classList.toggle("border-primary",a),s.classList.toggle("bg-primary/5",a),s.classList.toggle("border-transparent",!a);let o=s.querySelector(".session-title-text");o&&(o.classList.toggle("text-primary",a),o.classList.toggle("font-medium",a),o.classList.toggle("text-base-content/85",!a))})}function hc(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function bp(e,t){return e?.parentSessionId?J(e.parentAgent||t.agent,e.parentSessionId,e.parentMachineId??t.machineId):""}function vp(e){let t=Array.isArray(e)?e:[],n=new Map(t.map(u=>[J(u.agent,u.sessionId,u.machineId),u])),s=new Map,a=[];for(let u of t){let l=T.peek()?.[J(u.agent,u.sessionId,u.machineId)]?.branch,f=bp(l,u);if(f&&n.has(f)&&f!==J(u.agent,u.sessionId,u.machineId)){let m=s.get(f)||[];m.push(u),s.set(f,m)}else a.push(u)}let o=(u,l)=>(l.updatedAt||0)-(u.updatedAt||0);a.sort(o);for(let u of s.values())u.sort(o);let r=[],d=(u,l,f=new Set)=>{let m=J(u.agent,u.sessionId,u.machineId);if(!f.has(m)){f.add(m),r.push(l?{...u,_branchDepth:l}:u);for(let g of s.get(m)||[])d(g,l+1,f)}};for(let u of a)d(u,0);return r}async function xp(){if(!Gr){Gr=!0;try{Ya++,await We()}finally{Gr=!1}}}function yp({hubIndex:e=!1,offset:t=0}={}){let n=new URLSearchParams;n.set("limit",String(Va)),t&&n.set("offset",String(t)),(M.peek()||e)&&n.set("index","1");let s=n.toString();return s?`/api/sessions?${s}`:"/api/sessions"}async function We({waitFresh:e=!0,hubIndex:t=!1}={}){let n=_.peek()||null;n!==gc&&(gc=n,Ya=1);let s=++bc,a=hc(await qa()).slice(0,Va*Ya);if(a.length){let r=_.peek();if(M.peek()&&r){let d=a.filter(u=>!u.machineId||u.machineId===r);ne.value=d.length?d:a}else ne.value=a}let o=async()=>{let r=[];for(let u=0;u<Ya;u++){let l=yp({hubIndex:t,offset:u*Va}),f=await x("GET",l,void 0,void 0,{machineId:n||void 0});if(s!==bc)return ne.peek();let m=hc(f);if(r.push(...m),Kr=m.length===Va,!Kr)break}let d=new Map(r.map(u=>[`${u.machineId||""}:${u.agent}:${u.sessionId}`,u]));return r.splice(0,r.length,...d.values()),mc(r)!==mc(ne.peek())&&(ne.value=r,Il(r)),r};if(e||!a.length)try{await o()}catch(r){if(!a.length){let d=i("session-list");d&&(d.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(r.message)}</div>`)}}else o().catch(()=>{})}async function es({waitFresh:e=!0}={}){let t=await Tl();t&&(fe.value=t);let n=async()=>{let s=await x("GET","/api/workspaces");fe.value=s,Ts(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function zr(e,{showProject:t=!1}={}){let n=c.sessionId===e.sessionId&&(c.agent||$.peek())===(e.agent||"claude"),s=T.peek()?.[J(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&$e.peek()?e.snippet:vt(e),r=!!s.favorite,d=!!s.hidden,u=!!(s.notes&&String(s.notes).trim()),l=s.branch?.parentSessionId?s.branch:null,f=Math.max(0,Math.min(4,Number(e._branchDepth)||0)),m=Number(e.turnCount)||0,g=m>0&&m<=Go,w=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||Bn(e.cwd)||"\u2014")}</div>`:"",y=[g?`<span class="session-thin-badge" title="Only ${m} turn${m===1?"":"s"}">thin\xB7${m}</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>':"",u?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:"",l?`<span class="session-branch-badge" title="Forked from ${p(l.parentAgent||e.agent)}:${p(l.parentSessionId)}">\u2387 fork</span>`:""].filter(Boolean).join(""),A=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>`:"",ae=a?`${o}
|
|
434
|
+
(original: ${e.display||e.sessionId})`:e.display||"",O=l?`<div class="session-branch-line" title="Forked from ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId)}">\u21B3 ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId.slice(0,8))}</div>`:"";return`<div class="session-row ${f?"session-branch":""} px-2.5 py-1.5 cursor-pointer hover:bg-base-300 border-l-2
|
|
435
435
|
${n?"border-primary bg-primary/5":"border-transparent"} ${r?"session-fav":""} ${d?"session-hidden-row":""} ${g?"session-thin":""}"
|
|
436
436
|
style="--branch-depth:${f}"
|
|
437
437
|
data-session-id="${p(e.sessionId)}"
|
|
@@ -447,7 +447,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
447
447
|
data-fav-session-agent="${p(e.agent||"claude")}"
|
|
448
448
|
data-fav-session-machine="${p(e.machineId||"")}"
|
|
449
449
|
title="${r?"Unfavorite":"Favorite"}">${r?"\u2605":"\u2606"}</button>
|
|
450
|
-
${
|
|
450
|
+
${Rn(e.agent)}
|
|
451
451
|
<div class="min-w-0 flex-1">
|
|
452
452
|
<div class="session-title-wrap flex items-center gap-1 min-w-0"
|
|
453
453
|
data-rename-session-id="${p(e.sessionId)}"
|
|
@@ -455,7 +455,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
455
455
|
data-rename-session-machine="${p(e.machineId||"")}"
|
|
456
456
|
data-rename-session-display="${p(e.display||"")}">
|
|
457
457
|
<div class="session-title-text text-[11px] leading-snug truncate flex-1 min-w-0 ${n?"text-primary font-medium":"text-base-content/85"} ${a?"session-title-renamed":""}"
|
|
458
|
-
title="${p(
|
|
458
|
+
title="${p(ae)}">${p(o)}</div>
|
|
459
459
|
<button type="button" class="session-rename-btn flex-shrink-0"
|
|
460
460
|
data-rename-session="1"
|
|
461
461
|
title="Rename session">\u270E</button>
|
|
@@ -467,31 +467,31 @@ ${t}`:"",n.length?n.join(`
|
|
|
467
467
|
title="${d?"Unhide session":"Hide session"}">${d?"\u{1F441}":"\u{1F648}"}</button>
|
|
468
468
|
</div>
|
|
469
469
|
${w}
|
|
470
|
-
${
|
|
471
|
-
${y||
|
|
470
|
+
${O}
|
|
471
|
+
${y||A?`<div class="flex items-center gap-1 mt-0.5 flex-wrap">${A}${y}</div>`:""}
|
|
472
472
|
</div>
|
|
473
|
-
<span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${
|
|
473
|
+
<span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${qn(e.updatedAt)}</span>
|
|
474
474
|
</div>
|
|
475
|
-
</div>`}async function
|
|
475
|
+
</div>`}async function ts(){try{let e=await x("GET","/api/agents");return Jt.value=e,et(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Xa(){let e=i("sel-effort");if(!e)return;let t=$.peek()||"claude",n=N.peek(),s=Yt(t,n),a=te.peek()||"";if(!a){let r=Qe(t,n);r&&s.includes(r)&&(a=r,te.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=Qe(t,n);r&&s.includes(r)?(te.value=r,e.value=r):(te.value="",e.value="")}else e.value=a}function et(){let e=i("sel-model");if(!e)return;let t=$.peek()||"claude",n=Be(t),s=N.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=Oe(t)||n[0]?.value;se(o),e.value=o,s=o}let a=i("sel-agent");a&&(a.value=t),Xa()}function Za({editCurrent:e=!1}={}){let t=$.peek()||"claude",n=e&&N.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&&ia(t).includes(n)&&Jo(t,n),Vt(t,o),se(o),et())}function xc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
|
|
476
476
|
No projects in this range.<br>
|
|
477
477
|
<span class="text-base-content/30">Try \u201CAll\u201D time or another agent.</span>
|
|
478
|
-
</div>`;let t=
|
|
478
|
+
</div>`;let t=An.value,n=jn.value,s=!!$e.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 u=o.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${p(o.machineId)}</span>`:"",l=`
|
|
479
479
|
<div class="project-header px-2.5 py-2 cursor-pointer hover:bg-base-300/80 select-none border-b border-base-300/40"
|
|
480
480
|
data-folder="${p(r)}" data-project-cwd="${p(o.cwd||"")}" data-project-machine="${p(o.machineId||"")}">
|
|
481
481
|
<div class="flex items-center gap-1.5">
|
|
482
482
|
<span class="text-[10px] text-base-content/40 w-3 flex-shrink-0">${d?"\u25BE":"\u25B8"}</span>
|
|
483
483
|
<span class="text-[12px] font-semibold truncate flex-1" title="${p(o.cwd||"")}">${p(o.projectName)}</span>
|
|
484
484
|
${u}
|
|
485
|
-
<span class="text-[9px] text-base-content/30 flex-shrink-0">${
|
|
485
|
+
<span class="text-[9px] text-base-content/30 flex-shrink-0">${qn(o.updatedAt)}</span>
|
|
486
486
|
</div>
|
|
487
|
-
</div>`,m=
|
|
487
|
+
</div>`,m=vp(o.sessions).slice(0,40),g=o.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${o.sessions.length-40} more</div>`:"",w=d?`<div class="pb-1 border-b border-base-300/30">${m.map(y=>zr(y)).join("")}${g}</div>`:"";return l+w}).join("")}function yc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
|
|
488
488
|
No recent activity.<br>
|
|
489
489
|
<span class="text-base-content/30">Widen the time range or clear filters.</span>
|
|
490
490
|
</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])=>`
|
|
491
491
|
<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>
|
|
492
|
-
${s.map(a=>
|
|
493
|
-
`).join("")}function
|
|
494
|
-
<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
|
|
492
|
+
${s.map(a=>zr(a,{showProject:!0})).join("")}
|
|
493
|
+
`).join("")}function Jr(){let e=gt.value,t=Array.isArray(_t.value)?_t.value:[],n=Array.isArray(Xt.value)?Xt.value:[];return(e==="timeline"?yc(t):xc(n))+(Kr?'<button class="btn btn-sm btn-ghost w-full" data-load-more-sessions>\u52A0\u8F7D\u66F4\u591A\u4F1A\u8BDD</button>':"")}function Rs(){document.querySelectorAll("[data-view]").forEach(o=>{let r=o.dataset.view===gt.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===ye.peek())});let e=i("time-range");e&&e.value!==ra.peek()&&(e.value=ra.peek());let t=i("search-status");if(!t)return;let n=rt.peek(),s=Array.isArray(n?.results)?n.results:null,a=($e.peek()||"").trim();if(bt.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=_t.peek(),r=Xt.peek(),d=Array.isArray(o)?o.length:0,u=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=gt.peek()==="projects"?`${u} project${u===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function eo(e){let t=(e||"").trim();if(!t){rt.value=null,bt.value=!1;return}bt.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});ye.peek()&&ye.peek()!=="all"&&n.set("agent",ye.peek());let s=await x("GET",`/api/activity?${n}`);$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:[],error:n.message})}finally{bt.value=!1}}function to(e){clearTimeout(vc);let t=(e||"").trim();if(!t){rt.value=null,bt.value=!1;return}vc=setTimeout(()=>eo(t),350)}function wc(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return Ve(e,{fallback:t=>`<pre class="whitespace-pre-wrap text-xs">${p(t)}</pre>`})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function no(){let e=i("memory-area");if(e){if(!c.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=c.agent||$.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await x("GET",`/api/sessions/${c.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>
|
|
494
|
+
<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 Qr(e,t){let n=i("memory-file-content");if(!(!n||!c.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||c.agent||$.peek()||"claude",file:e}),a=await x("GET",`/api/sessions/${c.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">${wc(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 Va,Ya,gc,bc,Kr,Gr,vc,Tt=W(()=>{K();G();ce();Ms();Nt();nn();Va=200,Ya=1,gc=null,bc=0,Kr=!1,Gr=!1;document.addEventListener("click",e=>{e.target.closest?.("[data-load-more-sessions]")&&xp().catch(console.warn)});vc=null});function kc(e,t){ao=e||"",oo=t||""}async function $c(e){let t=i("project-notes-bar");if(t)try{let n=await x("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);ao=n.goal||"",oo=n.notes||"",ns(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function ns(){let e=i("project-notes-bar");if(!e)return;let t=ao||"No goal yet \u2014 click Edit",n=oo||"";e.innerHTML=`
|
|
495
495
|
<div class="flex items-start gap-2 w-full">
|
|
496
496
|
<div class="flex-1 min-w-0">
|
|
497
497
|
<div class="truncate">
|
|
@@ -502,24 +502,24 @@ ${t}`:"",n.length?n.join(`
|
|
|
502
502
|
</div>
|
|
503
503
|
<button id="btn-edit-project-notes" class="btn btn-ghost btn-xs px-1.5 hover:bg-base-300 flex-shrink-0">Edit</button>
|
|
504
504
|
</div>
|
|
505
|
-
`}function
|
|
505
|
+
`}function Sc(){let e=i("project-notes-bar");e&&(e.innerHTML=`
|
|
506
506
|
<div class="flex flex-col gap-1.5 w-full">
|
|
507
507
|
<div class="flex items-center gap-2">
|
|
508
508
|
<span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0">Goal</span>
|
|
509
509
|
<input id="project-goal-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
|
|
510
|
-
placeholder="One-line project goal\u2026" value="${p(
|
|
510
|
+
placeholder="One-line project goal\u2026" value="${p(ao)}">
|
|
511
511
|
</div>
|
|
512
512
|
<div class="flex items-start gap-2">
|
|
513
513
|
<span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0 mt-1">Notes</span>
|
|
514
514
|
<textarea id="project-notes-input" rows="2" class="textarea textarea-xs textarea-bordered flex-1 text-xs leading-snug"
|
|
515
|
-
placeholder="Longer project notes (stack, links, status\u2026)">${p(
|
|
515
|
+
placeholder="Longer project notes (stack, links, status\u2026)">${p(oo)}</textarea>
|
|
516
516
|
</div>
|
|
517
517
|
<div class="flex items-center gap-1 justify-end">
|
|
518
518
|
<button id="btn-save-project-notes" class="btn btn-primary btn-xs px-2">Save</button>
|
|
519
519
|
<button id="btn-cancel-project-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
|
|
520
520
|
</div>
|
|
521
521
|
</div>
|
|
522
|
-
`,i("project-goal-input")?.focus())}async function
|
|
522
|
+
`,i("project-goal-input")?.focus())}async function Bs(){try{let e=await x("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function tt(){let e=i("session-notes-bar");if(!e)return;let t=c.sessionId,n=c.agent||$.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=Dn(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,d=s.branch?.parentSessionId?s.branch:null,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
|
|
523
523
|
<div class="flex-1 min-w-0 flex items-center gap-2">
|
|
524
524
|
<button type="button" class="session-fav-btn ${o?"is-fav":""}" data-fav-toggle="1"
|
|
525
525
|
data-fav-session-id="${p(t)}" data-fav-session-agent="${p(n)}"
|
|
@@ -545,12 +545,12 @@ ${t}`:"",n.length?n.join(`
|
|
|
545
545
|
${d?`<span class="session-branch-current" title="Forked from ${p(d.parentAgent||n)} \xB7 ${p(d.parentSessionId)}">\u2387 from ${p(d.parentSessionId.slice(0,8))}</span>`:""}
|
|
546
546
|
</div>
|
|
547
547
|
<button id="btn-edit-session-notes" class="btn btn-ghost btn-xs px-1.5">Note</button>
|
|
548
|
-
`}function
|
|
548
|
+
`}function Lc(){let e=i("session-notes-bar");if(!e||!c.sessionId)return;let t=c.agent||$.peek()||"claude",n=Dn(t,c.sessionId);e.innerHTML=`
|
|
549
549
|
<input id="session-notes-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
|
|
550
550
|
placeholder="Note for this session\u2026" value="${p(n.notes||"")}">
|
|
551
551
|
<button id="btn-save-session-notes" class="btn btn-primary btn-xs px-2">Save</button>
|
|
552
552
|
<button id="btn-cancel-session-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
|
|
553
|
-
`;let s=i("session-notes-input");s?.focus(),s?.select()}function
|
|
553
|
+
`;let s=i("session-notes-input");s?.focus(),s?.select()}function ro(){return{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function io(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,branch:t.branch!==void 0?t.branch||null:e.branch||null,updatedAt:Date.now()}}function Ec(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()&&!e?.branch}async function Ic(e,t,{machineId:n}={}){let s=n||c.machineId||null,a=J(t,e,s),o=T.peek()?.[a]||ro(),r=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:r,updatedAt:Date.now()}};try{let d=await x("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]:io(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}`)}c.sessionId===e&&tt()}async function Tc(e,t,{machineId:n}={}){if(!e)return!1;let s=n||c.machineId||null,a=J(t,e,s),o=T.peek()?.[a]||ro(),r=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:r,updatedAt:Date.now()}};try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:s||void 0},void 0,{machineId:s||void 0}),u=io(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??r});if(Ec(u)){let l={...T.peek()};delete l[a],T.value=l}else T.value={...T.peek(),[a]:u}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return c.sessionId===e&&tt(),!0}async function Vr(e,t,n,{machineId:s}={}){let a=s||c.machineId||null,o=J(t,e,a),r=T.peek()?.[o]||ro();try{let d=await x("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]:io(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 wp(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||c.machineId||null,o=J(t,e,a),r=T.peek()?.[o]||ro(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...r,title:d,updatedAt:Date.now()}};try{let u=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),l=io(r,{favorite:u.favorite,notes:u.notes,title:u.title!==void 0?u.title:d,hidden:u.hidden});if(Ec(l)){let f={...T.peek()};delete f[o],T.value=f}else T.value={...T.peek(),[o]:l}}catch(u){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${u.message}`),!1}return c.sessionId===e&&tt(),!0}function Yr({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(g=>{g.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(Dn(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,u=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"
|
|
554
554
|
value="${p(r)}"
|
|
555
555
|
placeholder="Session name (empty = original)"
|
|
556
556
|
maxlength="200"
|
|
@@ -558,7 +558,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
558
558
|
data-rename-session-id="${p(e)}"
|
|
559
559
|
data-rename-session-agent="${p(t)}"
|
|
560
560
|
data-rename-session-machine="${p(n||"")}"
|
|
561
|
-
autocomplete="off" spellcheck="false" />`;let l=a.querySelector(".session-rename-input");if(!l)return;let f=!1,m=async g=>{if(f)return;f=!0;let w=g?l.value:r;if(a.className=u,!g){a.innerHTML=d;return}await
|
|
561
|
+
autocomplete="off" spellcheck="false" />`;let l=a.querySelector(".session-rename-input");if(!l)return;let f=!1,m=async g=>{if(f)return;f=!0;let w=g?l.value:r;if(a.className=u,!g){a.innerHTML=d;return}await wp(e,t,w,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(y=>y.remove()),c.sessionId===e&&tt(),T.value={...T.peek()}};l.addEventListener("keydown",g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),m(!0)):g.key==="Escape"&&(g.preventDefault(),m(!1))}),l.addEventListener("click",g=>g.stopPropagation()),l.addEventListener("mousedown",g=>g.stopPropagation()),l.addEventListener("session-rename-cancel",()=>m(!1)),l.addEventListener("blur",()=>{setTimeout(()=>m(!0),0)}),requestAnimationFrame(()=>{l.focus(),l.select()})}var ao,oo,Os=W(()=>{K();G();ce();ao="",oo=""});var Ac={};cs(Ac,{closeMachineMenu:()=>Sn,enterMachine:()=>Zr,hideMachinePicker:()=>co,refreshMachinesList:()=>kn,renderMachineMenuList:()=>Us,renderMachinePickerList:()=>lo,showMachinePicker:()=>$n,startMachinePolling:()=>Xr,syncTopbarMachine:()=>Ot});async function kn(){try{let e=await x("GET","/api/machines");le.value=Array.isArray(e)?e:[]}catch{try{let e=await ua();e?.machines&&(le.value=e.machines)}catch{}}return le.peek()||[]}function lo(){let e=i("machine-picker-list"),t=i("machine-picker-empty");if(!e)return;let n=le.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`
|
|
562
562
|
<button type="button" class="machine-pick-card w-full text-left px-4 py-3 rounded-xl border border-base-300
|
|
563
563
|
hover:border-primary hover:bg-primary/5 transition-colors ${a?"":"opacity-50"}"
|
|
564
564
|
data-pick-machine="${p(s.id)}" ${a?"":"disabled"}>
|
|
@@ -567,7 +567,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
567
567
|
<span class="font-semibold text-sm font-mono">${p(s.id)}</span>
|
|
568
568
|
</div>
|
|
569
569
|
${o?`<div class="text-xs text-base-content/45 mt-1 pl-4">${p(o)}</div>`:""}
|
|
570
|
-
</button>`}).join("")}function
|
|
570
|
+
</button>`}).join("")}function $n(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),Ee(),it.value=!1,lo();let t=i("machine-picker-status");if(t){let n=(le.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function co(){i("machine-picker")?.classList.add("hidden"),Ee(),it.value=!0}function Sn(){i("machine-menu")?.classList.add("hidden")}function Us(){let e=i("machine-menu-list"),t=i("machine-menu-empty");if(!e)return;let n=le.peek()||[],s=_.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 "),u=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
|
|
571
571
|
<button type="button"
|
|
572
572
|
class="machine-menu-item w-full text-left px-2 py-1.5 rounded-md text-xs
|
|
573
573
|
${r?"bg-primary/15 text-primary":"hover:bg-base-200"}
|
|
@@ -581,8 +581,8 @@ ${t}`:"",n.length?n.join(`
|
|
|
581
581
|
<span class="text-[9px] ${o?"text-success":"text-error"}">${o?"online":"offline"}</span>
|
|
582
582
|
</div>
|
|
583
583
|
${d||u?`<div class="text-[10px] text-base-content/40 pl-3.5 mt-0.5 truncate">${p(d)}${u?" \xB7 "+p(u):""}</div>`:""}
|
|
584
|
-
</button>`}).join("")}function Ot(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!M.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=
|
|
585
|
-
`):String(
|
|
584
|
+
</button>`}).join("")}function Ot(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!M.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=_.peek()||"",o=(le.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)),Us()}function Xr(){Cc||(Cc=setInterval(async()=>{if(!M.peek()||!c.token)return;await kn(),Ot();let e=_.peek();if(e){let t=(le.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=i("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3)),Mc||(Mc=setInterval(()=>{document.visibilityState!=="visible"||!M.peek()||!c.token||!_.peek()||We({waitFresh:!1,hubIndex:!0}).catch(()=>{})},2e3))}async function Zr(e,{forceReload:t=!1}={}){if(!e)return;let n=_.peek(),s=n&&n!==e;if(Le(e),co(),Sn(),Ot(),s||t){try{c.ws?.close()}catch{}c.ws=null,c.sessionId=null,xe(()=>{E.value=null,ke.value=null,re.value=null});try{let{filesRoot:o,gitRoot:r,filesPath:d}=await Promise.resolve().then(()=>(G(),Hi));o.value="",r.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(ss(),ei));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Ps(),await Promise.all([We(),es(),Bs(),ts().catch(()=>{})]),it.value=!0}var Cc,Mc,Fs=W(()=>{K();G();ce();Tt();Os();Hs();Nn();Cc=null,Mc=null});var ei={};cs(ei,{goHome:()=>fo,openProject:()=>ti,resumeSession:()=>nt,switchTab:()=>Ct});function po(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 ti(e){Ws=null,ba(),_a(!1),Wn(),Kn(),Jn(),zn();let t=e?.path||"";xe(()=>{E.value=e,ke.value=t,t&&(ie.value=t,Se.value=t,Y.value="",re.value=null)}),c.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),po(e?.machineId||_.peek()||c.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",Qn(),Gn({sessionId:null}),Ht(),Ct("chat")}function fo(){Ws=null,ba(),_a(!1),Wn(),Kn(),Jn(),zn(),E.value=null,ke.value=null,ie.value="",Se.value="",Y.value="",re.value=null,c.sessionId=null,Gn({sessionId:null}),po(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session"),Promise.resolve().then(()=>(js(),jr)).then(({closeNotes:s})=>s({restore:!1})).catch(()=>{});let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",yn(xn()));let n=i("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),$r("/")}async function nt(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"),u=ne.peek().find(L=>L.sessionId===e&&(!a||L.machineId===a||!L.machineId)),l=en(),f=l?.sessionId===e?l:null,m=s||u?.agent||f?.agent||"claude",g=a||u?.machineId||f?.machineId||_.peek()||null,w=t||u?.cwd||f?.cwd||null,y=n||u?.configDir||f?.configDir||null;if(Promise.resolve().then(()=>(js(),jr)).then(({closeNotes:L})=>L({restore:!1})).catch(()=>{}),Wn(),Kn(),Jn(),zn(),g&&g!==c.machineId){Le(g);try{c.ws?.close()}catch{}c.ws=null,Promise.resolve().then(()=>(Fs(),Ac)).then(({syncTopbarMachine:L})=>L()).catch(()=>{}),Promise.resolve().then(()=>(Tt(),so)).then(({loadAllSessions:L})=>L()).catch(()=>{})}c.sessionId=e,_a(!1),wt({sessionId:e,agent:m,machineId:g}).catch(()=>{}),c.configDir=y,c.agent=m,Ne(m),et(),Gn({sessionId:e,agent:m,machineId:g});let A=w;jc(A,g,e),A&&x("POST","/api/resolve-path",{path:A},void 0,{machineId:g||void 0}).then(L=>{c.sessionId!==e||!L?.path||L.path===A||(A=L.path,jc(A,g,e),Vo({sessionId:e,cwd:A}))}).catch(()=>{}),Qn(),Ht(),Ct(r),Promise.resolve().then(()=>(Tt(),so)).then(({markActiveSessionRow:L})=>{L(e,m)}).catch(()=>{}),Vo({sessionId:e,cwd:A||w,configDir:y,agent:m,machineId:g,tab:r}),cc({sessionId:e,cwd:A||w,configDir:y,agent:m,machineId:g,display:u?.display||f?.display||"",projectName:u?.projectName||f?.projectName||"",updatedAt:u?.updatedAt||f?.updatedAt||null});let ae=Z[m]||m,O=`${c.token||""}:${g||""}:${m}:${e}`,pe=0,q=0,Q=null,he=(L,ge,be={},oe=!1)=>{if(c.sessionId!==e||c.agent!==m||(c.machineId||null)!==g)return;let Gt=++pe,h=i("messages"),v=!!h.querySelector(".msg-row"),k=h.scrollTop,S=h.scrollHeight,U=!v||h.scrollHeight-h.scrollTop-h.clientHeight<80;if(bl(),be.oldestIndex>0){let R=document.createElement("button");R.className="btn btn-sm btn-ghost",R.textContent="\u52A0\u8F7D\u66F4\u65E9\u7684\u6D88\u606F",R.onclick=async()=>{R.disabled=!0;try{let ve=new URLSearchParams({tail:"80",compact:"1",before:String(be.oldestIndex),agent:m});g&&ve.set("machine",g);let Ke=await x("GET",`/api/sessions/${e}/messages?${ve}`,void 0,void 0,{machineId:g||void 0});if(Gt!==pe||c.sessionId!==e)return;let D=[...Ke.messages,...L],de={...be,oldestIndex:Ke.oldestIndex,truncated:Ke.oldestIndex>0};Q={msgs:D,context:ge,meta:de},he(D,ge,de,!0)}catch(ve){R.disabled=!1,R.textContent=`\u52A0\u8F7D\u5931\u8D25\uFF0C\u70B9\u51FB\u91CD\u8BD5 (${ve.message})`}},i("messages").appendChild(R)}if(be.stale&&C("\u5F53\u524D\u663E\u793A\u79BB\u7EBF\u7F13\u5B58\uFF0C\u6B63\u5728\u7B49\u5F85\u673A\u5668\u6062\u590D\u8FDE\u63A5"),!L.length){C(`${ae} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`),vr();return}pt();let F=40,j=0,V=()=>{if(c.sessionId!==e||Gt!==pe)return;let R=Math.min(j+F,L.length);for(;j<R;j++){let D=L[j],de=B(D.ts??D.timestamp),Kt=D.type||(D.role?"text":null);if(Kt==="text"||D.role&&D.content!=null&&!D.name){(D.role==="assistant"||D.role==="user")&&pt();let In=typeof D.content=="string"?D.content:Array.isArray(D.content)?D.content.map(Sd=>Sd?.text||"").filter(Boolean).join(`
|
|
585
|
+
`):String(D.content??"");In&&qt(D.role==="user"?"user":"assistant",D.role==="user"?"You":ae,In,{ts:de,historyIndex:(be.oldestIndex||0)+j})}else Kt==="tool_use"||D.name?xr({name:D.name||"tool",input:D.input??D.arguments??{}},{ts:de}):(Kt==="token_usage"||D.usage)&&(pt(),Fn(D.usage||D))}if(j<L.length){requestAnimationFrame(V);return}pt(),ge&&br(ge);let ve=L.filter(D=>D.type==="token_usage").length||L.filter(D=>D.role==="user").length,Ke=be.truncated?` (showing last ${L.length} of ${be.total||"?"})`:"";C(`\u2500\u2500 ${ae} history \xB7 ${ve} turn${ve!==1?"s":""}${Ke} \u2500\u2500`),vr(oe?k+h.scrollHeight-S:U?null:k)};V()},Ae=async({preferCache:L=!0}={})=>{let ge=++q,be=Ut.get(O)||(L?await Cl(O):null);if(!(ge!==q||c.sessionId!==e)){if(L&&be&&be.msgs?.length){let oe=Cs(be);he(oe.msgs,oe.context,oe.meta)}be?.msgs?.length||C(`Loading ${ae} history\u2026`);try{let oe=g||_.peek()||c.machineId||null;if(M.peek()&&!oe)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");oe&&c.machineId!==oe&&Le(oe);let Gt=async F=>{let j=new URLSearchParams({tail:"80",compact:"1"});return F&&j.set("agent",F),oe&&j.set("machine",oe),x("GET",`/api/sessions/${e}/messages?${j}`,void 0,void 0,{machineId:oe||void 0,dedupe:!1,cache:"no-store"})},h=hr(),v=await Gt(m);if(ge!==q||c.sessionId!==e)return;let k=Array.isArray(v)?v:v?.messages||[];!k.length&&m&&(v=await Gt(null),k=Array.isArray(v)?v:v?.messages||[]);let S=Array.isArray(v)?null:v?.context||null;if(ge!==q||c.sessionId!==e)return;let U=Array.isArray(v)?{}:{truncated:v?.truncated,total:v?.total,oldestIndex:v?.oldestIndex||0,stale:v?.stale};if(Q&&U.oldestIndex>Q.meta.oldestIndex&&Q.meta.oldestIndex>0){let F=U.oldestIndex-Q.meta.oldestIndex;F<=Q.msgs.length&&(k=[...Q.msgs.slice(0,F),...k],U.oldestIndex=Q.meta.oldestIndex)}if(Q={msgs:k,context:S,meta:U},k.length&&!U.stale){let F={msgs:k,context:S,meta:U,at:Date.now()};for(Ut.delete(O),Ut.set(O,Cs(F));Ut.size>24;)Ut.delete(Ut.keys().next().value);Ml(O,F).catch(()=>{})}else Ut.delete(O);if(h!==hr()||i("messages")?.querySelector(".live-stream"))return;he(k,S,U)}catch(oe){if(c.sessionId!==e||ge!==q)return;Ut.delete(O),C(`${ae} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${oe.message})`)}}};Ws={sessionId:e,agent:m,refresh:()=>Ae({preferCache:!1}).catch(()=>{})},d?Ae().catch(()=>{}):(await new Promise(L=>requestAnimationFrame(L)),Ae().catch(()=>{})),Is(),tt()}function jc(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;xe(()=>{E.value={id:s,name:s,path:e,machineId:t},ke.value=e,ie.value=e,Se.value=e,Y.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),po(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"),po(t)}}function Ct(e){X.value=e}var Ws,uo,Ut,ss=W(()=>{K();G();ce();Ms();fa();Na();gs();Pa();Tt();Os();Wr();Ws=null,uo=null;document.addEventListener("external-session-updated",({detail:e})=>{let t=Ws;!t||!e||e.sessionId!==t.sessionId||e.agent&&t.agent&&e.agent!==t.agent||(uo&&clearTimeout(uo),uo=setTimeout(()=>{uo=null,Ws?.refresh()},140))});Ut=new Map});G();G();K();var Xf=oa({cache:!1,dedupe:!0,retry:0});async function qi(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}K();G();ce();var pa=null;async function Bi(){if(!pa)return!1;pa.prompt();let e=await pa.userChoice.catch(()=>null);return pa=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}Nn();fa();Na();Pa();K();ce();G();Ms();var Ir=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","CLAUDE_CODE_SUBAGENT_MODEL","CLAUDE_CODE_EFFORT_LEVEL"],un="claude";function Dl(){document.getElementById("root").insertAdjacentHTML("beforeend",Bu()),Ou()}function Bu(){return`
|
|
586
586
|
<div id="settings-page" class="set-page" hidden>
|
|
587
587
|
<header class="set-island">
|
|
588
588
|
<button type="button" id="set-back" class="btn btn-ghost btn-sm px-2" aria-label="\u8FD4\u56DE">\u2190</button>
|
|
@@ -612,7 +612,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
612
612
|
<div class="label py-1"><span class="label-text text-xs uppercase tracking-wide">Profile</span></div>
|
|
613
613
|
<select id="ae-profile" class="select select-bordered select-sm"></select>
|
|
614
614
|
</label>
|
|
615
|
-
<div class="set-fields">${
|
|
615
|
+
<div class="set-fields">${Ir.map(t=>`<label class="form-control"><div class="label py-1"><span class="label-text text-xs font-mono">${p(t)}</span></div><input id="ae-${t}" class="input input-bordered input-sm font-mono text-xs" autocomplete="off" spellcheck="false"></label>`).join("")}</div>
|
|
616
616
|
<p id="claude-env-error" class="text-error text-xs mt-2 hidden"></p>
|
|
617
617
|
<button type="button" id="claude-env-save" class="btn btn-primary btn-sm mt-4">Save profile</button>
|
|
618
618
|
</section>
|
|
@@ -682,20 +682,20 @@ ${t}`:"",n.length?n.join(`
|
|
|
682
682
|
</section>
|
|
683
683
|
</div>
|
|
684
684
|
</div>
|
|
685
|
-
</div>`}function
|
|
685
|
+
</div>`}function Ou(){i("quota-refresh")?.addEventListener("click",Er),i("quota-profile")?.addEventListener("change",Er),i("set-back")?.addEventListener("click",jl),document.querySelectorAll("[data-set-sec]").forEach(e=>{e.addEventListener("click",()=>Ra(e.dataset.setSec))}),i("ws-add-btn")?.addEventListener("click",Lr),i("ws-new-name")?.addEventListener("keydown",e=>{e.key==="Enter"&&Lr()}),i("ws-new-dir")?.addEventListener("keydown",e=>{e.key==="Enter"&&Lr()}),i("mcp-token-generate")?.addEventListener("click",zu),i("mcp-token-copy")?.addEventListener("click",Ju),i("claude-env-save")?.addEventListener("click",Wu),i("ae-profile")?.addEventListener("change",()=>{As()}),i("user-add-btn")?.addEventListener("click",Gu),i("pw-save")?.addEventListener("click",Ku),document.addEventListener("router:settings",()=>Ba()),document.addEventListener("router:home",()=>{Uu()&&jl()})}function Ra(e){un=e||"claude",document.querySelectorAll("[data-set-sec]").forEach(t=>t.classList.toggle("is-on",t.dataset.setSec===un)),document.querySelectorAll("[data-set-panel]").forEach(t=>{t.hidden=t.dataset.setPanel!==un}),un==="quota"&&Er()}var Al=0;async function Er(){let e=++Al,t=i("quota-list");if(!t)return;t.textContent="\u6B63\u5728\u8BFB\u53D6\u5F53\u524D\u673A\u5668\u7684\u989D\u5EA6\u2026";let n=_.peek(),s=i("quota-profile"),a=s?.value||"";if(s&&(s.innerHTML='<option value="">Claude \u9ED8\u8BA4\u8D26\u53F7</option>'+(fe.peek()||[]).map(r=>`<option value="${p(r.configDir)}">${p(r.name||r.configDir)}</option>`).join(""),s.value=a),M.peek()&&!n){t.textContent="\u8BF7\u5148\u9009\u62E9\u673A\u5668";return}let o=await Promise.all(["claude","grok","codex"].map(async r=>{let d=new URLSearchParams({agent:r});r==="claude"&&s?.value&&d.set("configDir",s.value);try{return await x("GET",`/api/agents/quota?${d}`,void 0,void 0,{machineId:n||void 0})}catch(u){return{agent:r,meters:[],message:u.message}}}));e!==Al||n!==_.peek()||(t.innerHTML=o.map(r=>`<div class="border border-base-300 rounded-lg p-4 mb-3">
|
|
686
686
|
<h3 class="font-semibold">${p(r.agent)} ${p(r.plan||"")}</h3>
|
|
687
687
|
${(r.meters||[]).map(d=>`<div class="mt-3"><div class="text-sm">${p(d.label)} \xB7 \u5DF2\u7528 ${p(d.usedPercent)}% \xB7 \u5269\u4F59 ${p(d.remainingPercent)}%</div>
|
|
688
688
|
<progress class="progress progress-primary w-full" max="100" value="${Number(d.usedPercent)}"></progress>
|
|
689
689
|
${d.resetsAt?`<div class="text-xs opacity-60">\u91CD\u7F6E\uFF1A${p(new Date(d.resetsAt).toLocaleString())}</div>`:""}</div>`).join("")||`<p class="text-sm opacity-60 mt-2">${p(r.message||"\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u989D\u5EA6")}</p>`}
|
|
690
690
|
${r.fetchedAt?`<div class="text-xs opacity-50 mt-2">\u66F4\u65B0\u4E8E ${p(new Date(r.fetchedAt).toLocaleString())}</div>`:""}
|
|
691
|
-
</div>`).join(""))}function
|
|
691
|
+
</div>`).join(""))}function Ba(e){let t=i("settings-page");if(!t)return;t.hidden=!1,document.documentElement.classList.add("settings-open"),Ra(e||un||"claude"),Tr(),Cr(),As(),_l(),(i("mcp-token-settings")||document.querySelector('[data-set-panel="mcp"]'))&&!M.peek()&&document.querySelector('[data-set-sec="mcp"]')?.classList.add("hidden"),(location.hash||"")!=="#/settings"&&(location.hash="/settings")}function jl(){let e=i("settings-page");e&&(e.hidden=!0),document.documentElement.classList.remove("settings-open"),(location.hash||"")==="#/settings"&&(location.hash="")}function Uu(){return!i("settings-page")?.hidden}function Tr(){let e=i("ws-list");if(!e)return;let t=fe.peek()||[];if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709 workspace</div>';return}e.innerHTML=t.map((n,s)=>`
|
|
692
692
|
<div class="set-row" style="--index:${s}">
|
|
693
693
|
<div class="set-row-body">
|
|
694
694
|
<div class="text-sm font-medium">${p(n.name)}</div>
|
|
695
695
|
<div class="text-xs font-mono text-base-content/50">${p(n.configDir)}</div>
|
|
696
696
|
</div>
|
|
697
697
|
${t.length>1?`<button type="button" class="btn btn-ghost btn-xs" data-ws-delete="${p(n.id)}">Remove</button>`:'<span class="text-xs text-base-content/40">default</span>'}
|
|
698
|
-
</div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>
|
|
698
|
+
</div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>Fu(n.dataset.wsDelete))})}function Cr(e){let t=i("ae-profile");if(!t)return;let n=e??t.value,s=fe.peek()||[],a=[...new Set(s.map(o=>o.name).filter(Boolean))];t.innerHTML='<option value="">Default</option>'+a.map(o=>`<option value="${p(o)}">${p(o)}</option>`).join(""),[...t.options].some(o=>o.value===n)?t.value=n:t.value=""}async function Lr(){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="\u9700\u8981 name \u548C\u8DEF\u5F84",n.classList.remove("hidden");return}try{let s=await x("POST","/api/workspaces",{name:e,configDir:t}),a=[...(fe.peek()||[]).filter(o=>o.id!==s.id),s];fe.value=a,Ts(a),i("ws-new-name").value="",i("ws-new-dir").value="",Tr(),Cr(s.name),await As(),Ra("claude")}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function Fu(e){try{await x("DELETE",`/api/workspaces/${e}`);let t=(fe.peek()||[]).filter(n=>n.id!==e);fe.value=t,Ts(t),Tr(),Cr(""),await As()}catch(t){let n=i("ws-error");n&&(n.textContent=t.message,n.classList.remove("hidden"))}}async function As(){try{let e=i("ae-profile")?.value||"",t=e?`?name=${encodeURIComponent(e)}`:"",n=await x("GET",`/api/agent-env${t}`),s=n.env||{},a=e?{}:n.process||{};for(let o of Ir){let r=i(`ae-${o}`);if(!r)continue;let d=s[o]??a[o];d&&typeof d=="object"&&d.set?(r.placeholder=`saved ${d.preview||"\u2022\u2022\u2022\u2022"}`,r.value="",r.dataset.keep="1"):(r.value=typeof d=="string"?d:"",r.placeholder=o,r.dataset.keep="")}}catch{}}async function Wu(){let e=i("claude-env-error");e?.classList.add("hidden");let t={};for(let n of Ir){let s=i(`ae-${n}`);if(!s)continue;let a=s.value.trim();a?t[n]=a:s.dataset.keep==="1"?t[n]={set:!0}:t[n]=""}try{let n=i("ae-profile")?.value||"";await x("PUT","/api/agent-env",{name:n,env:t}),await As()}catch(n){e&&(e.textContent=n.message,e.classList.remove("hidden"))}}async function _l(){let e=i("set-nav-users"),t=document.querySelector('[data-set-panel="users"]');try{let n=await x("GET","/api/collab/me"),s=n.role==="admin"||n.role==="owner";if(e?.classList.toggle("hidden",!s),t&&(t.hidden=!s||un!=="users"),!s){un==="users"&&Ra("claude");return}let a=await x("GET","/api/collab/users"),o=i("users-list"),r=Array.isArray(a)?a:[];o.innerHTML=r.map(d=>`<div class="set-row"><div class="text-sm font-medium flex-1">${p(d.username)}</div><div class="text-xs text-base-content/50">${p(d.role||"")}</div></div>`).join("")||'<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709\u5176\u4ED6\u7528\u6237</div>'}catch{e?.classList.add("hidden")}}async function Gu(){let e=i("users-error");e?.classList.add("hidden");let t=i("user-new-name")?.value.trim(),n=i("user-new-pass")?.value||"",s=i("user-new-role")?.value||"editor";if(!t||!n){e&&(e.textContent="\u9700\u8981\u7528\u6237\u540D\u548C\u5BC6\u7801",e.classList.remove("hidden"));return}try{await x("POST","/api/collab/users",{username:t,password:n,role:s}),i("user-new-name").value="",i("user-new-pass").value="",await _l()}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function Ku(){let e=i("pw-error");e?.classList.add("hidden");let t=i("pw-current")?.value||"",n=i("pw-next")?.value||"",s=i("pw-next2")?.value||"";if(n!==s){e&&(e.textContent="\u4E24\u6B21\u65B0\u5BC6\u7801\u4E0D\u4E00\u81F4",e.classList.remove("hidden"));return}try{await x("POST","/api/auth/password",{current:t,next:n}),i("pw-current").value="",i("pw-next").value="",i("pw-next2").value=""}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function zu(){let e=i("mcp-token-result"),t=i("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=_.peek();if(!n){t.textContent="\u8BF7\u5148\u5728\u4E3B\u754C\u9762\u9009\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u3002",t.classList.remove("hidden");return}try{let s=Number(i("mcp-token-expiry").value),a=await x("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});i("mcp-token-value").value=a.token||"";let o=i("mcp-token-url");o&&(o.textContent=`${location.origin}/mcp`),e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function Ju(){let e=i("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{i("mcp-token-value")?.select(),document.execCommand("copy")}}js();Hs();wa();G();var tc=()=>`
|
|
699
699
|
<div id="auth-screen" class="${c.token?"hidden":""} flex items-center justify-center h-full p-4" ${c.token?'style="display:none"':""}>
|
|
700
700
|
<div class="card bg-base-200 border border-base-300 w-full max-w-sm shadow-xl">
|
|
701
701
|
<div class="card-body gap-3 p-8">
|
|
@@ -716,7 +716,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
716
716
|
<div id="auth-error" class="alert alert-error text-xs py-2 hidden"></div>
|
|
717
717
|
</div>
|
|
718
718
|
</div>
|
|
719
|
-
</div>`,
|
|
719
|
+
</div>`,nc=(e={})=>{let t=!!e.restoreSession,n=c.token?"":"hidden",s=c.token?"display:flex":"display:none";return`
|
|
720
720
|
<div id="sidebar-overlay" class="hidden fixed inset-0 bg-black/50 z-[9]" aria-hidden="true"></div>
|
|
721
721
|
<div id="app" class="${n} flex-col flex-1 overflow-hidden" style="${s}">
|
|
722
722
|
<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">
|
|
@@ -1120,7 +1120,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
1120
1120
|
</div>
|
|
1121
1121
|
</div>
|
|
1122
1122
|
<form method="dialog" class="modal-backdrop"><button>close</button></form>
|
|
1123
|
-
</dialog>`};
|
|
1123
|
+
</dialog>`};Wr();Tt();ss();K();G();ce();gs();Ms();fa();Tt();Os();Hs();ss();Fs();Nn();async function mo(e={}){i("auth-screen").style.display="none";let t=i("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(Ee),Qi().catch(()=>{});let n=e.hub;n===void 0?n=await ua():n?(M.value=!0,n.machines&&(le.value=n.machines)):M.value=!1;let s=e.deepLink||null,a=en();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=i("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let u=i("project-view");u&&(u.classList.remove("hidden"),u.style.display="flex",u.style.flexDirection="column",u.style.flex="1",u.style.minHeight="0")}if(M.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(Le(d),co(),it.value=!0,Ps());let u=kn().then(m=>(Ot(),d&&!m.some(w=>w.id===d&&w.online!==!1)&&m.length&&(m.some(y=>y.id===d)||(Le(null),$n())),m));Xr(),Ot();let l=Promise.all([We({waitFresh:!1}),es({waitFresh:!1}),Bs().catch(()=>{}),ts().catch(()=>{})]);if(s?.id){let m=ne.peek().find(g=>g.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,m?.cwd||null,m?.configDir||null,s.agent||m?.agent||null,s.machineId||m?.machineId||d||null,{tab:s.tab||"chat"}),u.catch(()=>{}),l.catch(()=>{});return}if(!d){if(await u,!(le.peek()||[]).length){$n(),l.catch(()=>{});return}$n(),l.catch(()=>{});return}await l;let f=i("topbar-project");f&&f.textContent==="Select a session"&&(f.textContent=`Machine \xB7 ${d}`);return}Ps();let r=Promise.all([We({waitFresh:!1}),es({waitFresh:!1}),Bs().catch(()=>{}),ts().catch(()=>{})]);if(s?.id){await qa().then(u=>{Array.isArray(u)?ne.value=u:u&&Array.isArray(u.sessions)&&(ne.value=u.sessions)}).catch(()=>{});let d=ne.peek().find(u=>u.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),r.catch(()=>{});return}await r}Os();Fs();K();G();ce();Na();Tt();ss();Fs();Nn();function Dc(){let e=i("sidebar");e&&(e.classList.add("open"),i("sidebar-overlay").classList.remove("hidden"),i("hamburger")?.setAttribute("aria-expanded","true"),Ee(),setTimeout(()=>i("session-search")?.focus({preventScroll:!0}),180))}function Gs(){let e=i("sidebar");e&&(e.classList.remove("open"),i("sidebar-overlay").classList.add("hidden"),i("hamburger")?.setAttribute("aria-expanded","false"),Ee(),i("hamburger")?.focus({preventScroll:!0}))}function _c(){window.innerWidth<=640&&Gs()}function Nc(){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 Pc(){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 ni(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 si(){let e=document.documentElement.getAttribute("data-theme")||"dark";ni(e==="dark"?"light":"dark")}function ai(){let e=i("new-session-agent");e&&(e.value=$.peek()||"claude");let t=i("new-session-workspace");if(t){let a=fe.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),c.configDir&&(t.value=c.configDir)}let n=i("new-session-machine-wrap"),s=i("new-session-machine");if(n&&s)if(M.peek()){n.style.display="";let a=le.peek()||[],o=_.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);oi(),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 oi(){let e=i("new-session-agent")?.value||"claude",t=i("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function ri(){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(M.peek()){let a=_.peek()||i("new-session-machine")?.value||le.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),$n();return}Le(a)}try{let a=await x("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;Wn(),Kn(),Jn(),zn(),c.sessionId=null,c.configDir=n||null,c.agent=t,Ne(t),se(Oe(t)||N.peek()),et(),xe(()=>{E.value={id:o,name:o,path:a.path,machineId:_.peek()||c.machineId},ke.value=a.path,ie.value=a.path,Se.value=a.path,Y.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 u=i("project-view");u.classList.remove("hidden"),u.style.display="flex",Qn(),Gn({sessionId:null}),Ht(),Ct("chat"),C(`New ${Z[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function kp(){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">
|
|
1124
1124
|
<li>\u70B9\u5E95\u90E8\u5206\u4EAB\u6309\u94AE <strong>\u5206\u4EAB</strong>\uFF08\u65B9\u6846+\u5411\u4E0A\u7BAD\u5934\uFF09</li>
|
|
1125
1125
|
<li>\u4E0B\u6ED1\u627E\u5230\u5E76\u70B9 <strong>\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55</strong></li>
|
|
1126
1126
|
<li>\u786E\u8BA4\u540D\u79F0\u540E\u70B9 <strong>\u6DFB\u52A0</strong></li>
|
|
@@ -1140,48 +1140,48 @@ ${t}`:"",n.length?n.join(`
|
|
|
1140
1140
|
<form method="dialog"><button class="btn btn-sm">\u77E5\u9053\u4E86</button></form>
|
|
1141
1141
|
</div>
|
|
1142
1142
|
</div>
|
|
1143
|
-
<form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function
|
|
1143
|
+
<form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function li(){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 x("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 ii(){let e=i("auth-username").value.trim(),t=i("auth-password").value,n=i("auth-error");n.classList.add("hidden");try{let s=await x("POST",`/api/auth/${i("auth-btn").dataset.mode||"login"}`,{username:e,password:t});c.token=s.token,localStorage.setItem("token",s.token),mo()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function ci(){return c.token?/^#\/session\//.test(location.hash||""):!1}function Hc(e={}){if(ni(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??ci(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=tc()+nc({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>')}je(()=>{let l=fe.value,f=i("ws-tabs");if(!f)return;if(l.length<=1){f.innerHTML="";return}let m=ke.peek();f.innerHTML=[{id:null,name:"All"},...l].map(g=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
|
|
1144
1144
|
${(g.id===null?!m:m===g.configDir)?"border-primary text-primary":"border-transparent text-base-content/50 hover:text-base-content"}"
|
|
1145
1145
|
data-ws-tab="${p(g.configDir||"")}">
|
|
1146
1146
|
${p(g.name)}
|
|
1147
|
-
</button>`).join("")}),je(()=>{Dt.value,Vt.value,ht.value,rt.value,T.value;let l=i("session-list");if(!l||l.querySelector(".session-rename-input"))return;let f=Kr();if(l._lastHtml===f){qs();return}let m=l.scrollTop;l.innerHTML=f,l._lastHtml=f,l.scrollTop=m,qs()}),je(()=>{gt.value,qs()}),je(()=>{ne.value,ye.value,D.value,M.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"||vn())}),De(ke,l=>{let f=i("session-filter-badge");f&&(f.style.display=l?"inline":"none",f.title=l||"")}),je(()=>{let l=E.value;if(l&&l.path)wc(l.path);else{let f=i("project-notes-bar");f&&(f.style.display="none")}}),De(X,l=>{document.querySelectorAll("[data-tab]").forEach(m=>{let g=m.dataset.tab===l;m.classList.toggle("text-primary",g),m.classList.toggle("border-primary",g),m.classList.toggle("text-base-content/50",!g),m.classList.toggle("border-transparent",!g)});let f=i("project-view");f&&!f.classList.contains("hidden")&&(f.style.display="flex",f.style.flexDirection="column",f.style.minHeight="0",f.style.flex="1"),["chat","files","git","shell","memory"].forEach(m=>{let g=i(`tab-${m}`);if(!g)return;let w=m===l;g.classList.toggle("hidden",!w),w?(g.style.display="flex",g.style.flexDirection="column",g.style.flex="1 1 0",g.style.minHeight="0",g.style.overflow="hidden"):g.style.display="none"}),l==="memory"&&eo(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),Ee()}),_c(),Dc(),el({openSession:nt});let s=l=>{i("app")?.classList.toggle("chat-chrome-collapsed",l),i("btn-expand-chat-chrome")?.classList.toggle("hidden",!l),localStorage.setItem("chatChromeCollapsed",l?"1":"0")};s(localStorage.getItem("chatChromeCollapsed")==="1");let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,We({waitFresh:!1})},1200)}),document.addEventListener("router:home",po),document.addEventListener("router:session",async({detail:{id:l,tab:f,machineId:m,agent:g}})=>{let w=ne.peek().find(H=>H.sessionId===l),y=Xt();await nt(l,w?.cwd||(y?.sessionId===l?y.cwd:null)||null,w?.configDir||(y?.sessionId===l?y.configDir:null)||null,g||w?.agent||(y?.sessionId===l?y.agent:null)||null,m||w?.machineId||(y?.sessionId===l?y.machineId:null)||null,{tab:f||"chat"})}),b.on("click","#btn-home",po),b.on("click","#btn-share-session, #btn-share-session-current",async(l,f)=>{let m=Sl();if(m)try{await navigator.clipboard.writeText(m),f.classList.add("is-copied"),f.title="\u5DF2\u590D\u5236\u5206\u4EAB\u94FE\u63A5",setTimeout(()=>{f.classList.remove("is-copied"),f.title="\u590D\u5236\u5F53\u524D\u4F1A\u8BDD\u5206\u4EAB\u94FE\u63A5"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",m)}}),b.on("click","#auth-btn",oi),b.on("submit","#auth-form",l=>{l.preventDefault(),oi()}),b.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&oi()}),b.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Ws():Ac()),b.on("click","#sidebar-overlay",Ws),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Ws())}),b.on("input","#session-search",(l,f)=>{$e.value=f.value,Za(f.value)}),b.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let f=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!f))}),b.on("change","[data-agent-option]",(l,f)=>{let m=new Set(zt.peek());f.checked?m.add(f.dataset.agentOption):m.delete(f.dataset.agentOption);let g=[...m];zt.value=g,localStorage.setItem("agentFilters",JSON.stringify(g)),ye.value=g.length===1?g[0]:"all"}),b.on("change","#filter-favorites",(l,f)=>{ze.value=f.checked,localStorage.setItem("favoritesOnly",f.checked?"1":"0")}),b.on("change","#filter-hidden",(l,f)=>{Je.value=f.checked,localStorage.setItem("showHiddenOnly",f.checked?"1":"0")}),b.on("click","#filter-clear",()=>{zt.value=[],ye.value="all",ze.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)}),b.on("click","#session-filter-badge",()=>{ke.value=null}),b.on("click","[data-ws-tab]",(l,f)=>{ke.value=f.dataset.wsTab||null}),b.on("click","#sidebar-refresh",()=>{We(),$e.peek().trim()&&Xa($e.peek())}),b.on("click","[data-view]",(l,f)=>{ht.value=f.dataset.view,localStorage.setItem("sidebarView",f.dataset.view)}),b.on("click","[data-agent-filter]",(l,f)=>{ye.value=f.dataset.agentFilter,localStorage.setItem("agentFilter",f.dataset.agentFilter),$e.peek().trim()&&Za($e.peek())}),b.on("dblclick","[data-project-cwd]",(l,f)=>{let m=f.dataset.projectCwd;if(!m)return;let g=m.split("/").filter(Boolean).pop()||m;Zr({id:g,name:g,path:m}),C(`Project \xB7 ${m}`)}),b.on("click","#btn-pwa-install",async()=>{await qi()||yp()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),b.on("click","#btn-settings",qa),b.on("click","#btn-notes",()=>Ra()),b.on("click","#btn-collapse-chat-chrome",()=>s(!0)),b.on("click","#btn-expand-chat-chrome",()=>s(!1)),b.on("click","#btn-meta-agent",()=>zl()),b.on("click","#btn-meta-agent-welcome",()=>_r("chat")),b.on("click","#btn-theme",ti),b.on("click","[data-sidebar-action]",(l,f)=>{let m=f.dataset.sidebarAction;m==="new"&&ni(),m==="theme"&&ti(),m==="settings"&&qa(),m==="logout"&&(c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload())}),b.on("click","#btn-cal-prev",()=>{Br(-1),vn(bn())}),b.on("click","#btn-cal-next",()=>{Br(1),vn(bn())}),b.on("click","[data-cal-date]",(l,f)=>{uc(f.dataset.calDate),vn(bn())}),b.on("click","[data-session-id]",(l,f)=>{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")||(nt(f.dataset.sessionId,f.dataset.sessionCwd||null,f.dataset.sessionConfigDir||null,f.dataset.sessionAgent||"claude",f.dataset.sessionMachine||null),jc())}),b.on("click","[data-rename-session]",(l,f)=>{l.preventDefault(),l.stopPropagation();let m=f.closest(".session-title-wrap")||f,g=m.dataset.renameSessionId||m.dataset.sessionId;g&&Qr({sessionId:g,agent:m.dataset.renameSessionAgent||"claude",machineId:m.dataset.renameSessionMachine||null,fallbackDisplay:m.dataset.renameSessionDisplay||"",mountEl:m})}),b.on("click","[data-rename-bar]",(l,f)=>{if(l.preventDefault(),l.stopPropagation(),!c.sessionId)return;let m=document.getElementById("session-title-display")||f;Qr({sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null,mountEl:m})}),b.on("click","[data-folder]",(l,f)=>{let m=f.dataset.folder,w=f.querySelector("span")?.textContent.trim()==="\u25BE",y=new Set(Cn.peek()),H=new Set(Mn.peek());w?(y.delete(m),H.add(m)):(y.add(m),H.delete(m)),xe(()=>{Cn.value=y,Mn.value=H})}),b.on("click","#memory-refresh",eo),b.on("click","[data-memory-file]",l=>zr(l.dataset.memoryFile,l.dataset.memoryAgent)),b.on("click","[data-tab]",(l,f)=>Tt(f.dataset.tab));let o=async(l,f)=>{let m=i(l),g=m?.value.trim();if(!g){f.value="";return}try{let w=await x("POST","/api/resolve-path",{path:g});if(w.isDir===!1)throw new Error("Path is not a directory on the target machine");f.value=w.path,m.value=w.path;let y=E.peek();y&&(E.value={...y,path:w.path})}catch(w){m.style.color="oklch(var(--er))",m.title=w.message,setTimeout(()=>{m.style.color="",m.title=""},2e3)}};b.on("click","#files-root-btn",()=>o("files-root-input",re)),b.on("click","#git-root-btn",()=>o("git-root-input",Se)),b.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",re)}),b.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",Se)}),b.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),Ee()}),b.on("change","#sel-agent",(l,f)=>{let m=$.peek(),g=f.value;m!==g&&(c.sessionId=null,Ne(g),se(Be(g)||_.peek()),i("sel-permission").value=de.peek(),et(),C(`Agent \u2192 ${Z[g]||g} \xB7 model ${_.peek()} \xB7 new session`))}),b.on("change","#sel-convert-agent",async(l,f)=>{let m=f.value;if(!m)return;let g=c.sessionId;if(!g){alert("No active session to convert."),f.value="";return}let w=c.agent||$.peek()||"claude";if(w===m){alert("Cannot convert to the same agent."),f.value="";return}f.disabled=!0,C(`Converting session ${g.slice(0,8)} from ${w} to ${m}...`);try{let y=await x("POST",`/api/sessions/${g}/convert`,{targetAgent:m,sourceAgent:w});y&&y.success?(C(`\u2713 Converted successfully. New session: ${y.targetSessionId.slice(0,8)}`),await We(),await nt(y.targetSessionId,E.peek()?.path||null,null,y.targetAgent),Es()):C("Failed to convert session.")}catch(y){C(`Error converting session: ${y.message}`),alert(`Error converting session: ${y.message}`)}finally{f.disabled=!1,f.value=""}}),b.on("change","#sel-model",(l,f)=>{se(f.value),Va()}),b.on("click","#btn-model-add",()=>Ya({editCurrent:!1})),b.on("click","#btn-model-edit",()=>Ya({editCurrent:!0})),b.on("change","#sel-effort",(l,f)=>{te.value=f.value}),b.on("change","#sel-permission",(l,f)=>{de.value=f.value}),b.on("change","#sel-density",(l,f)=>{Go(f.value),C(`Density \u2192 ${f.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",et),b.on("click","#btn-new-session, #btn-new-session-current, #btn-new-session-welcome",ni),b.on("click","#new-session-cancel",()=>i("modal-new-session").close()),b.on("click","#new-session-start",ai),b.on("change","#new-session-agent",si),b.on("keydown","#new-session-path",l=>{l.key==="Enter"&&ai()}),b.on("click","#send-btn",Ls),b.on("click","#stop-btn",fl),b.on("click","#btn-logout",()=>{c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload()}),b.on("click","[data-pick-machine]",async(l,f)=>{let m=f.dataset.pickMachine;if(!m||m===D.peek()){kn();return}await Yr(m,{forceReload:!0}),va()});let r=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await yn(),ro(),Bs(),Ot(),l){let f=(ie.peek()||[]).filter(m=>m.online!==!1).length;l.textContent=`${f} online`}};b.on("click","#btn-refresh-machines",r),b.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await r()}),b.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),xn(),an();let f=i("machine-menu");f&&(f.classList.contains("hidden")?(await yn(),Bs(),f.classList.remove("hidden")):f.classList.add("hidden"))}),b.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),kn(),an(),dc();let f=!i("recent-menu")?.classList.contains("hidden"),m=i("btn-recent-sessions");m&&m.setAttribute("aria-expanded",f?"true":"false")}),b.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let f=i("machine-menu-wrap");f&&!f.contains(l.target)&&kn();let m=i("recent-menu"),g=i("btn-recent-sessions"),w=l.target;if(m&&!m.classList.contains("hidden")){if(m.contains(w)||g?.contains(w))return;xn(),g?.setAttribute("aria-expanded","false")}}),b.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),kn(),xn(),Zi()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Rr()}),b.on("click","#recent-menu [data-session-id]",()=>{xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),b.on("click","[data-dismiss-recent-session]",(l,f)=>{l.preventDefault(),l.stopPropagation(),lc({sessionId:f.dataset.dismissRecentSession,agent:f.dataset.dismissRecentAgent||"claude",machineId:f.dataset.dismissRecentMachine||null})}),b.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{kc()}),b.on("click","#btn-cancel-project-notes",()=>{ts()});let d=async()=>{let l=i("project-goal-input")?.value?.trim()??"",f=i("project-notes-input")?.value?.trim()??"",m=E.peek();if(!(!m||!m.path))try{let g=await x("POST","/api/projects/notes",{root:m.path,goal:l,notes:f});yc(g.goal||"",g.notes||""),ts()}catch(g){alert(`Error saving project notes: ${g.message}`)}};b.on("click","#btn-save-project-notes",d),b.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&d(),l.key==="Escape"&&ts()}),b.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&ts()}),b.on("click","[data-fav-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.favSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Lc(f.dataset.favSessionId,f.dataset.favSessionAgent||"claude",{machineId:m||null})}),b.on("click","[data-hide-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.hideSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Ec(f.dataset.hideSessionId,f.dataset.hideSessionAgent||"claude",{machineId:m||null})}),b.on("click","#btn-edit-session-notes, #session-notes-text",()=>{$c()}),b.on("click","#btn-cancel-session-notes",()=>tt()),b.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!c.sessionId)return;let f=c.agent||$.peek()||"claude";await Jr(c.sessionId,f,l)&&tt()}),b.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&tt(),l.key==="Enter"){let f=l.target.value.trim();if(!c.sessionId)return;let m=c.agent||$.peek()||"claude";await Jr(c.sessionId,m,f)&&tt()}}),b.on("click","#btn-fav-filter",()=>{let l=!ze.peek();ze.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"))}),b.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&&ze.peek()&&(ze.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),et(),je(()=>{M.value,D.value,c.token&&va()}),i("sel-permission").value=de.peek(),vl();let u=i("sel-density");u&&(u.value=_e.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=zt.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=ze.peek()),i("filter-hidden")&&(i("filter-hidden").checked=Je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===ye.peek())}),i("btn-fav-filter")?.classList.toggle("active",ze.peek()),i("btn-hidden-filter")?.classList.toggle("active",Je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let f=l.dataset.view===ht.peek();l.classList.toggle("bg-primary/15",f),l.classList.toggle("text-primary",f),l.classList.toggle("font-medium",f),l.classList.toggle("text-base-content/50",!f)})}G();er();W();le();hs();or();ya();_n();Zt();en();ir();_t();_t();function wp(){return Z[$.peek()]||"Assistant"}function kp(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}var $n=null;function $p(e){return vs(e)}function Fc(e){return e?($n&&$n.el===e||($n?.destroy?.(),$n=wa(e),$n.el=e),$n):null}function Re(e,t){if(!e||e.dataset.historyPainting==="1")return;Fc(e).stick(!!t)}var Ks=0,At=null,at=1e3,Mt=0,go=null,Pc=!1,bo=!1,Hc=null,vo=!1,ci="hubStreamCursors",Eo=new Map,Sp=0,di=new Set,ui="pendingUserTexts",Sn=(()=>{try{let e=JSON.parse(sessionStorage.getItem(ui)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),qc=new Set,Wc=new Map;function Gc(){try{Sn.length?sessionStorage.setItem(ui,JSON.stringify(Sn.slice(-30))):sessionStorage.removeItem(ui)}catch{}}function Lp(){let e=Ys(),t=Sn.filter(n=>n.key===e).length;t&&!qc.has(e)&&(qc.add(e),P(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function Kc(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function Ep(e={}){let t=Kc(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(ci)||"{}")[t])||0}catch{return 0}}function Ip(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=Kc(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(ci)||"{}")||{}}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(ci,JSON.stringify(s))}catch{}return!0}function Ys({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Tp(){Pc||(Pc=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(at=400,ss({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{at=400,ss({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?ss({force:!0}):ss({probe:!0})}),window.addEventListener("focus",()=>ss({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{at=400,ss({probe:!0})}))}function Js(){let e=i("conn-dot");if(!e)return;let t=fe.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 ss(e={}){let t=c.ws?.readyState;if(e.force){at=400,ko({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&Mt&&Date.now()-Mt>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(at=Math.min(at,800),ko({quiet:!0}))}function Cp(){At||(fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),At=setTimeout(()=>{At=null,ko({quiet:!0})},at),at=Math.min(Math.round(at*1.8),15e3))}function zc(){go&&(clearInterval(go),go=null)}function Mp(e,t){zc(),go=setInterval(()=>{if(!(t!==Ks||e.readyState!==WebSocket.OPEN)){if(Mt&&Date.now()-Mt>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&Mt&&Date.now()-Mt>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function jt(){let e=N.peek()||!!E.peek()&&fe.peek()==="open";ba(e)}function wo(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function as(){let e=tn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?N.peek()?t.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":Qs(t.value||""):t.placeholder=wo()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=wo()))}function Ap(){at=400,At&&(clearTimeout(At),At=null),vo=!1;let e=c.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{c.ws?.close()}catch{}ko({quiet:!1}),P("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function ko(e={}){Tp(),At&&(clearTimeout(At),At=null),e.quiet&&(vo=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);Hc!==t&&(ca(),Hc=t);let n=++Ks;try{c.ws?.close()}catch{}fe.value="connecting",Js();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=Ep();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===Ks){if(at=1e3,Mt=Date.now(),fe.value="open",Js(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}la(),Lp(),Mp(r,n),jt(),bo&&!vo&&P(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bo=!1,vo=!1}}),r.addEventListener("message",d=>{if(n!==Ks)return;let u;try{u=JSON.parse(d.data)}catch{return}if(Ip(u)){if(u.type==="pong"){Mt=Date.now();return}if(u.type==="ping"){if(Mt=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?N.value=!0:(N.peek()&&(N.value=!1),pi()),jt();return}Jc(u)}}),r.addEventListener("close",()=>{n===Ks&&(zc(),bo=!0,fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),Cp())}),r.addEventListener("error",()=>{})}function pi(){if(!Sn.length||N.peek())return;let e=Ys(),t=Sn.findIndex(a=>a.key===e);if(t<0)return;let[n]=Sn.splice(t,1);Gc();let s=i("chat-input");s&&(s.value=n.text,Vs(s)),setTimeout(()=>{if(n.key!==Ys()||N.peek()){Wc.set(n.key,n.text);return}Xs()},0)}function mo(){N.value=!1,jt(),pi()}var jp=0;function Jc(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)Jc(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&jp++,e.type==="session-created"){let t=_.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){xa(e.notification);return}if(e.type==="grok-queue-status"){Xp(e);return}if(e.type==="result"){zs(),Gs(),os();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};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),xo(n)}e.is_error||P("\u2713 Done"),mo();return}if(e.type==="complete"){zs(),Gs(),os(),!e.aborted&&e.agent==="claude"?P("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?P("\u2713 Done"):e.aborted&&P("\u5DF2\u505C\u6B62")),mo();return}if(e.type==="error"){zs(),Gs(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},as()),rs("error","Error",kp(e.message)),mo();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=tf(e.stream==="stderr"?"shell-err":"shell")),nf(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,P(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),mo();return}if(e.type==="assistant"){Gs();for(let t of e.message?.content||[])t.type==="text"&&t.text?(os(),rs("assistant",wp(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&of(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){N.peek()||(N.value=!0,jt()),Qc(e.ts);return}if(e.type==="assistant_delta"){N.peek()||(N.value=!0,jt()),Dp(e.data||"");return}if(e.type==="assistant_stream_end"){Gs();return}if(e.type==="thought_stream_start"){Vc();return}if(e.type==="thought_delta"){_p(e.data||"");return}if(e.type==="thought_stream_end"){zs();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>`),Re(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)&&rf(e)}}var st=null,Ge=null,Bt=null,mt=null;function Qc(e){let t=i("messages");if(!t||(os(),zs(),st&&t.contains(st)))return;let n=$o(e||Date.now()),s=So(e||Date.now());t.insertAdjacentHTML("beforeend",`
|
|
1147
|
+
</button>`).join("")}),je(()=>{_t.value,Xt.value,gt.value,rt.value,T.value;let l=i("session-list");if(!l||l.querySelector(".session-rename-input"))return;let f=Jr();if(l._lastHtml===f){Rs();return}let m=l.scrollTop;l.innerHTML=f,l._lastHtml=f,l.scrollTop=m,Rs()}),je(()=>{bt.value,Rs()}),je(()=>{ne.value,ye.value,_.value,M.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"||yn())}),De(ke,l=>{let f=i("session-filter-badge");f&&(f.style.display=l?"inline":"none",f.title=l||"")}),je(()=>{let l=E.value;if(l&&l.path)$c(l.path);else{let f=i("project-notes-bar");f&&(f.style.display="none")}}),De(X,l=>{document.querySelectorAll("[data-tab]").forEach(m=>{let g=m.dataset.tab===l;m.classList.toggle("text-primary",g),m.classList.toggle("border-primary",g),m.classList.toggle("text-base-content/50",!g),m.classList.toggle("border-transparent",!g)});let f=i("project-view");f&&!f.classList.contains("hidden")&&(f.style.display="flex",f.style.flexDirection="column",f.style.minHeight="0",f.style.flex="1"),["chat","files","git","shell","memory"].forEach(m=>{let g=i(`tab-${m}`);if(!g)return;let w=m===l;g.classList.toggle("hidden",!w),w?(g.style.display="flex",g.style.flexDirection="column",g.style.flex="1 1 0",g.style.minHeight="0",g.style.overflow="hidden"):g.style.display="none"}),l==="memory"&&no(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),Ee()}),Pc(),Nc(),nl({openSession:nt});let s=l=>{i("app")?.classList.toggle("chat-chrome-collapsed",l),i("btn-expand-chat-chrome")?.classList.toggle("hidden",!l),localStorage.setItem("chatChromeCollapsed",l?"1":"0")};s(localStorage.getItem("chatChromeCollapsed")==="1");let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,We({waitFresh:!1})},1200)}),document.addEventListener("router:home",fo),document.addEventListener("router:session",async({detail:{id:l,tab:f,machineId:m,agent:g}})=>{let w=ne.peek().find(A=>A.sessionId===l),y=en();await nt(l,w?.cwd||(y?.sessionId===l?y.cwd:null)||null,w?.configDir||(y?.sessionId===l?y.configDir:null)||null,g||w?.agent||(y?.sessionId===l?y.agent:null)||null,m||w?.machineId||(y?.sessionId===l?y.machineId:null)||null,{tab:f||"chat"})}),b.on("click","#btn-home",fo),b.on("click","#btn-share-session, #btn-share-session-current",async(l,f)=>{let m=El();if(m)try{await navigator.clipboard.writeText(m),f.classList.add("is-copied"),f.title="\u5DF2\u590D\u5236\u5206\u4EAB\u94FE\u63A5",setTimeout(()=>{f.classList.remove("is-copied"),f.title="\u590D\u5236\u5F53\u524D\u4F1A\u8BDD\u5206\u4EAB\u94FE\u63A5"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",m)}}),b.on("click","#auth-btn",ii),b.on("submit","#auth-form",l=>{l.preventDefault(),ii()}),b.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&ii()}),b.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Gs():Dc()),b.on("click","#sidebar-overlay",Gs),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Gs())}),b.on("input","#session-search",(l,f)=>{$e.value=f.value,to(f.value)}),b.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let f=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!f))}),b.on("change","[data-agent-option]",(l,f)=>{let m=new Set(Qt.peek());f.checked?m.add(f.dataset.agentOption):m.delete(f.dataset.agentOption);let g=[...m];Qt.value=g,localStorage.setItem("agentFilters",JSON.stringify(g)),ye.value=g.length===1?g[0]:"all"}),b.on("change","#filter-favorites",(l,f)=>{ze.value=f.checked,localStorage.setItem("favoritesOnly",f.checked?"1":"0")}),b.on("change","#filter-hidden",(l,f)=>{Je.value=f.checked,localStorage.setItem("showHiddenOnly",f.checked?"1":"0")}),b.on("click","#filter-clear",()=>{Qt.value=[],ye.value="all",ze.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)}),b.on("click","#session-filter-badge",()=>{ke.value=null}),b.on("click","[data-ws-tab]",(l,f)=>{ke.value=f.dataset.wsTab||null}),b.on("click","#sidebar-refresh",()=>{We(),$e.peek().trim()&&eo($e.peek())}),b.on("click","[data-view]",(l,f)=>{gt.value=f.dataset.view,localStorage.setItem("sidebarView",f.dataset.view)}),b.on("click","[data-agent-filter]",(l,f)=>{ye.value=f.dataset.agentFilter,localStorage.setItem("agentFilter",f.dataset.agentFilter),$e.peek().trim()&&to($e.peek())}),b.on("dblclick","[data-project-cwd]",(l,f)=>{let m=f.dataset.projectCwd;if(!m)return;let g=m.split("/").filter(Boolean).pop()||m;ti({id:g,name:g,path:m}),C(`Project \xB7 ${m}`)}),b.on("click","#btn-pwa-install",async()=>{await Bi()||kp()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),b.on("click","#btn-settings",Ba),b.on("click","#btn-notes",()=>Oa()),b.on("click","#btn-collapse-chat-chrome",()=>s(!0)),b.on("click","#btn-expand-chat-chrome",()=>s(!1)),b.on("click","#btn-meta-agent",()=>Ql()),b.on("click","#btn-meta-agent-welcome",()=>Pr("chat")),b.on("click","#btn-theme",si),b.on("click","[data-sidebar-action]",(l,f)=>{let m=f.dataset.sidebarAction;m==="new"&&ai(),m==="theme"&&si(),m==="settings"&&Ba(),m==="logout"&&(c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload())}),b.on("click","#btn-cal-prev",()=>{Fr(-1),yn(xn())}),b.on("click","#btn-cal-next",()=>{Fr(1),yn(xn())}),b.on("click","[data-cal-date]",(l,f)=>{fc(f.dataset.calDate),yn(xn())}),b.on("click","[data-session-id]",(l,f)=>{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")||(nt(f.dataset.sessionId,f.dataset.sessionCwd||null,f.dataset.sessionConfigDir||null,f.dataset.sessionAgent||"claude",f.dataset.sessionMachine||null),_c())}),b.on("click","[data-rename-session]",(l,f)=>{l.preventDefault(),l.stopPropagation();let m=f.closest(".session-title-wrap")||f,g=m.dataset.renameSessionId||m.dataset.sessionId;g&&Yr({sessionId:g,agent:m.dataset.renameSessionAgent||"claude",machineId:m.dataset.renameSessionMachine||null,fallbackDisplay:m.dataset.renameSessionDisplay||"",mountEl:m})}),b.on("click","[data-rename-bar]",(l,f)=>{if(l.preventDefault(),l.stopPropagation(),!c.sessionId)return;let m=document.getElementById("session-title-display")||f;Yr({sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null,mountEl:m})}),b.on("click","[data-folder]",(l,f)=>{let m=f.dataset.folder,w=f.querySelector("span")?.textContent.trim()==="\u25BE",y=new Set(An.peek()),A=new Set(jn.peek());w?(y.delete(m),A.add(m)):(y.add(m),A.delete(m)),xe(()=>{An.value=y,jn.value=A})}),b.on("click","#memory-refresh",no),b.on("click","[data-memory-file]",l=>Qr(l.dataset.memoryFile,l.dataset.memoryAgent)),b.on("click","[data-tab]",(l,f)=>Ct(f.dataset.tab));let o=async(l,f)=>{let m=i(l),g=m?.value.trim();if(!g){f.value="";return}try{let w=await x("POST","/api/resolve-path",{path:g});if(w.isDir===!1)throw new Error("Path is not a directory on the target machine");f.value=w.path,m.value=w.path;let y=E.peek();y&&(E.value={...y,path:w.path})}catch(w){m.style.color="oklch(var(--er))",m.title=w.message,setTimeout(()=>{m.style.color="",m.title=""},2e3)}};b.on("click","#files-root-btn",()=>o("files-root-input",ie)),b.on("click","#git-root-btn",()=>o("git-root-input",Se)),b.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",ie)}),b.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",Se)}),b.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),Ee()}),b.on("change","#sel-agent",(l,f)=>{let m=$.peek(),g=f.value;m!==g&&(c.sessionId=null,Ne(g),se(Oe(g)||N.peek()),i("sel-permission").value=ue.peek(),et(),C(`Agent \u2192 ${Z[g]||g} \xB7 model ${N.peek()} \xB7 new session`))}),b.on("change","#sel-convert-agent",async(l,f)=>{let m=f.value;if(!m)return;let g=c.sessionId;if(!g){alert("No active session to convert."),f.value="";return}let w=c.agent||$.peek()||"claude";if(w===m){alert("Cannot convert to the same agent."),f.value="";return}f.disabled=!0,C(`Converting session ${g.slice(0,8)} from ${w} to ${m}...`);try{let y=await x("POST",`/api/sessions/${g}/convert`,{targetAgent:m,sourceAgent:w});y&&y.success?(C(`\u2713 Converted successfully. New session: ${y.targetSessionId.slice(0,8)}`),await We(),await nt(y.targetSessionId,E.peek()?.path||null,null,y.targetAgent),Is()):C("Failed to convert session.")}catch(y){C(`Error converting session: ${y.message}`),alert(`Error converting session: ${y.message}`)}finally{f.disabled=!1,f.value=""}}),b.on("change","#sel-model",(l,f)=>{se(f.value),Xa()}),b.on("click","#btn-model-add",()=>Za({editCurrent:!1})),b.on("click","#btn-model-edit",()=>Za({editCurrent:!0})),b.on("change","#sel-effort",(l,f)=>{te.value=f.value}),b.on("change","#sel-permission",(l,f)=>{ue.value=f.value}),b.on("change","#sel-density",(l,f)=>{Ko(f.value),C(`Density \u2192 ${f.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",et),b.on("click","#btn-new-session, #btn-new-session-current, #btn-new-session-welcome",ai),b.on("click","#new-session-cancel",()=>i("modal-new-session").close()),b.on("click","#new-session-start",ri),b.on("change","#new-session-agent",oi),b.on("keydown","#new-session-path",l=>{l.key==="Enter"&&ri()}),b.on("click","#send-btn",Es),b.on("click","#stop-btn",hl),b.on("click","#btn-logout",()=>{c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload()}),b.on("click","[data-pick-machine]",async(l,f)=>{let m=f.dataset.pickMachine;if(!m||m===_.peek()){Sn();return}await Zr(m,{forceReload:!0}),xa()});let r=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await kn(),lo(),Us(),Ot(),l){let f=(le.peek()||[]).filter(m=>m.online!==!1).length;l.textContent=`${f} online`}};b.on("click","#btn-refresh-machines",r),b.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await r()}),b.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),wn(),rn();let f=i("machine-menu");f&&(f.classList.contains("hidden")?(await kn(),Us(),f.classList.remove("hidden")):f.classList.add("hidden"))}),b.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),Sn(),rn(),pc();let f=!i("recent-menu")?.classList.contains("hidden"),m=i("btn-recent-sessions");m&&m.setAttribute("aria-expanded",f?"true":"false")}),b.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),wn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let f=i("machine-menu-wrap");f&&!f.contains(l.target)&&Sn();let m=i("recent-menu"),g=i("btn-recent-sessions"),w=l.target;if(m&&!m.classList.contains("hidden")){if(m.contains(w)||g?.contains(w))return;wn(),g?.setAttribute("aria-expanded","false")}}),b.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),Sn(),wn(),tl()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Or()}),b.on("click","#recent-menu [data-session-id]",()=>{wn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),b.on("click","[data-dismiss-recent-session]",(l,f)=>{l.preventDefault(),l.stopPropagation(),dc({sessionId:f.dataset.dismissRecentSession,agent:f.dataset.dismissRecentAgent||"claude",machineId:f.dataset.dismissRecentMachine||null})}),b.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{Sc()}),b.on("click","#btn-cancel-project-notes",()=>{ns()});let d=async()=>{let l=i("project-goal-input")?.value?.trim()??"",f=i("project-notes-input")?.value?.trim()??"",m=E.peek();if(!(!m||!m.path))try{let g=await x("POST","/api/projects/notes",{root:m.path,goal:l,notes:f});kc(g.goal||"",g.notes||""),ns()}catch(g){alert(`Error saving project notes: ${g.message}`)}};b.on("click","#btn-save-project-notes",d),b.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&d(),l.key==="Escape"&&ns()}),b.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&ns()}),b.on("click","[data-fav-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.favSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Ic(f.dataset.favSessionId,f.dataset.favSessionAgent||"claude",{machineId:m||null})}),b.on("click","[data-hide-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.hideSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Tc(f.dataset.hideSessionId,f.dataset.hideSessionAgent||"claude",{machineId:m||null})}),b.on("click","#btn-edit-session-notes, #session-notes-text",()=>{Lc()}),b.on("click","#btn-cancel-session-notes",()=>tt()),b.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!c.sessionId)return;let f=c.agent||$.peek()||"claude";await Vr(c.sessionId,f,l)&&tt()}),b.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&tt(),l.key==="Enter"){let f=l.target.value.trim();if(!c.sessionId)return;let m=c.agent||$.peek()||"claude";await Vr(c.sessionId,m,f)&&tt()}}),b.on("click","#btn-fav-filter",()=>{let l=!ze.peek();ze.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"))}),b.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&&ze.peek()&&(ze.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),et(),je(()=>{M.value,_.value,c.token&&xa()}),i("sel-permission").value=ue.peek(),yl();let u=i("sel-density");u&&(u.value=_e.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=Qt.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=ze.peek()),i("filter-hidden")&&(i("filter-hidden").checked=Je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===ye.peek())}),i("btn-fav-filter")?.classList.toggle("active",ze.peek()),i("btn-hidden-filter")?.classList.toggle("active",Je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let f=l.dataset.view===gt.peek();l.classList.toggle("bg-primary/15",f),l.classList.toggle("text-primary",f),l.classList.toggle("font-medium",f),l.classList.toggle("text-base-content/50",!f)})}K();tr();G();ce();gs();rr();wa();Pn();tn();nn();lr();Nt();Nt();function $p(){return Z[$.peek()]||"Assistant"}function Sp(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}var Ln=null;function Lp(e){return xs(e)}function Gc(e){return e?(Ln&&Ln.el===e||(Ln?.destroy?.(),Ln=ka(e),Ln.el=e),Ln):null}function Re(e,t){if(!e||e.dataset.historyPainting==="1")return;Gc(e).stick(!!t)}var zs=0,jt=null,at=1e3,At=0,bo=null,qc=!1,vo=!1,Rc=null,xo=!1,ui="hubStreamCursors",Io=new Map,Ep=0,pi=new Set,fi="pendingUserTexts",En=(()=>{try{let e=JSON.parse(sessionStorage.getItem(fi)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),Bc=new Set,Kc=new Map;function zc(){try{En.length?sessionStorage.setItem(fi,JSON.stringify(En.slice(-30))):sessionStorage.removeItem(fi)}catch{}}function Ip(){let e=Xs(),t=En.filter(n=>n.key===e).length;t&&!Bc.has(e)&&(Bc.add(e),H(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function Jc(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function Tp(e={}){let t=Jc(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(ui)||"{}")[t])||0}catch{return 0}}function Cp(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=Jc(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(ui)||"{}")||{}}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(ui,JSON.stringify(s))}catch{}return!0}function Xs({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Mp(){qc||(qc=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(at=400,as({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{at=400,as({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?as({force:!0}):as({probe:!0})}),window.addEventListener("focus",()=>as({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{at=400,as({probe:!0})}))}function Qs(){let e=i("conn-dot");if(!e)return;let t=me.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 as(e={}){let t=c.ws?.readyState;if(e.force){at=400,$o({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&At&&Date.now()-At>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(at=Math.min(at,800),$o({quiet:!0}))}function Ap(){jt||(me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Qs(),jt=setTimeout(()=>{jt=null,$o({quiet:!0})},at),at=Math.min(Math.round(at*1.8),15e3))}function Qc(){bo&&(clearInterval(bo),bo=null)}function jp(e,t){Qc(),bo=setInterval(()=>{if(!(t!==zs||e.readyState!==WebSocket.OPEN)){if(At&&Date.now()-At>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&At&&Date.now()-At>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function Dt(){let e=P.peek()||!!E.peek()&&me.peek()==="open";va(e)}function ko(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function os(){let e=sn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?P.peek()?t.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":Vs(t.value||""):t.placeholder=ko()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=ko()))}function Dp(){at=400,jt&&(clearTimeout(jt),jt=null),xo=!1;let e=c.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{c.ws?.close()}catch{}$o({quiet:!1}),H("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function $o(e={}){Mp(),jt&&(clearTimeout(jt),jt=null),e.quiet&&(xo=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);Rc!==t&&(da(),Rc=t);let n=++zs;try{c.ws?.close()}catch{}me.value="connecting",Qs();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=Tp();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===zs){if(at=1e3,At=Date.now(),me.value="open",Qs(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}ca(),Ip(),jp(r,n),Dt(),vo&&!xo&&H(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),vo=!1,xo=!1}}),r.addEventListener("message",d=>{if(n!==zs)return;let u;try{u=JSON.parse(d.data)}catch{return}if(Cp(u)){if(u.type==="pong"){At=Date.now();return}if(u.type==="ping"){if(At=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?P.value=!0:(P.peek()&&(P.value=!1),mi()),Dt();return}Vc(u)}}),r.addEventListener("close",()=>{n===zs&&(Qc(),vo=!0,me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Qs(),Ap())}),r.addEventListener("error",()=>{})}function mi(){if(!En.length||P.peek())return;let e=Xs(),t=En.findIndex(a=>a.key===e);if(t<0)return;let[n]=En.splice(t,1);zc();let s=i("chat-input");s&&(s.value=n.text,Ys(s)),setTimeout(()=>{if(n.key!==Xs()||P.peek()){Kc.set(n.key,n.text);return}Zs()},0)}function ho(){P.value=!1,Dt(),mi()}var _p=0;function Vc(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)Vc(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&_p++,e.type==="session-created"){let t=N.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){ya(e.notification);return}if(e.type==="grok-queue-status"){ef(e);return}if(e.type==="result"){Js(),Ks(),rs();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};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),yo(n)}e.is_error||H("\u2713 Done"),ho();return}if(e.type==="complete"){Js(),Ks(),rs(),!e.aborted&&e.agent==="claude"?H("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?H("\u2713 Done"):e.aborted&&H("\u5DF2\u505C\u6B62")),ho();return}if(e.type==="error"){Js(),Ks(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},os()),is("error","Error",Sp(e.message)),ho();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=sf(e.stream==="stderr"?"shell-err":"shell")),af(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,H(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),ho();return}if(e.type==="assistant"){Ks();for(let t of e.message?.content||[])t.type==="text"&&t.text?(rs(),is("assistant",$p(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&lf(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){P.peek()||(P.value=!0,Dt()),Yc(e.ts);return}if(e.type==="assistant_delta"){P.peek()||(P.value=!0,Dt()),Np(e.data||"");return}if(e.type==="assistant_stream_end"){Ks();return}if(e.type==="thought_stream_start"){Xc();return}if(e.type==="thought_delta"){Pp(e.data||"");return}if(e.type==="thought_stream_end"){Js();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>`),Re(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)&&cf(e)}}var st=null,Ge=null,Ft=null,ht=null;function Yc(e){let t=i("messages");if(!t||(rs(),Js(),st&&t.contains(st)))return;let n=So(e||Date.now()),s=Lo(e||Date.now());t.insertAdjacentHTML("beforeend",`
|
|
1148
1148
|
<div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
|
|
1149
1149
|
<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
|
|
1150
1150
|
<div class="msg-stream-body whitespace-pre-wrap"></div>
|
|
1151
1151
|
</div>
|
|
1152
1152
|
${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
|
|
1153
|
-
</div>`),st=t.lastElementChild,Ge=st.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Re(t)}function
|
|
1153
|
+
</div>`),st=t.lastElementChild,Ge=st.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Re(t)}function Np(e){e&&(Ge||Yc(Date.now()),Ge&&(Ge.textContent+=e,Re(i("messages"))))}function Ks(){if(!st||!Ge){st=null,Ge=null;return}let e=Ge.textContent||"";e.trim()?(Ge.classList.remove("whitespace-pre-wrap"),Ge.classList.add("md"),Ge.innerHTML=wo(e),ad(st),sd(st,e)):st.remove(),st=null,Ge=null,i("stream-status")?.remove()}function Xc(){let e=i("messages");e&&(Ft&&e.contains(Ft)||(e.insertAdjacentHTML("beforeend",`
|
|
1154
1154
|
<div class="msg-row assistant px-2 thought-stream">
|
|
1155
1155
|
<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">
|
|
1156
1156
|
<div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
|
|
1157
1157
|
<div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
|
|
1158
1158
|
</div>
|
|
1159
|
-
</div>`),
|
|
1160
|
-
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}
|
|
1161
|
-
Available: ${u}`:""}`),!0}let a=
|
|
1159
|
+
</div>`),Ft=e.lastElementChild,ht=Ft.querySelector(".thought-body"),Re(e)))}function Pp(e){e&&(ht||Xc(),ht&&(ht.textContent+=e,ht.scrollTop=ht.scrollHeight,Re(i("messages"))))}function Js(){if(Ft&&ht){let e=(ht.textContent||"").length;Ft.innerHTML=`
|
|
1160
|
+
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Ft=null,ht=null}var Hp={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"};function qp(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return H(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Oe(a)),document.dispatchEvent(new CustomEvent("agent-changed")),H(`Agent \u2192 ${Z[a]} \xB7 model ${N.peek()} \xB7 new session`)):H(`Agent already ${Z[a]}`),!0):(H(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Be(d).map(l=>l.value).join(" | ");return H(`Current model: ${N.peek()} (${d})${u?`
|
|
1161
|
+
Available: ${u}`:""}`),!0}let a=Hp[s.toLowerCase()]||s,o=$.peek()||"claude",r=Be(o).some(d=>d.value===a);return r||Vt(o,a),se(a),H(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Yt($.peek(),N.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),H(`Effort set to ${s.toLowerCase()}`),!0):(H(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(H(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return Xp(),c.sessionId=null,c.lastUsage=null,H("Cleared \xB7 new session"),!0;case"usage":return Rp(),!0;case"help":return H(`Available slash commands:
|
|
1162
1162
|
/agent [claude|codex|grok|gemini|cursor]
|
|
1163
1163
|
/model [haiku|sonnet|opus|<model-id>]
|
|
1164
1164
|
/effort [low|medium|high|xhigh|max]
|
|
1165
1165
|
/usage
|
|
1166
1166
|
/clear
|
|
1167
|
-
/help`),!0;default:return!1}}function Ce(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
|
|
1168
|
-
`)),
|
|
1169
|
-
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&
|
|
1167
|
+
/help`),!0;default:return!1}}function Ce(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 Rp(){let e=$.peek()||"claude",t=N.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ce(a.input_tokens)} \u2193${Ce(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ce(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ce(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ce(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){H(s.join(`
|
|
1168
|
+
`)),bi("\u25C8 /usage \xB7 no session yet");return}H("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("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 u=r.tokensUsed!=null?Ce(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ce(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ce(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}H(s.join(`
|
|
1169
|
+
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&Yp({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?yo(r.sessionTotals):r.lastTurn?yo(r.lastTurn):c.lastUsage&&yo(c.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}}H(`${s.join(`
|
|
1170
1170
|
`)}
|
|
1171
|
-
(usage fetch failed: ${a.message})`)}}function
|
|
1171
|
+
(usage fetch failed: ${a.message})`)}}function Zs(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!sn()){H(ko()),wt().then(()=>os()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){wt().then(s=>{if(!s?.ok&&!s?.skipped){os(),H(ko());return}Zs()}).catch(()=>Zs());return}if(P.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,N.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,effort:a,...ue.peek()&&{permissionMode:ue.peek()},...ue.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});nd(t),e.value="",Ys(e),Vs(""),di(),H(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}En.push({key:Xs(),text:t}),zc(),e.value="",Ys(e),Vs(""),di(),H(`\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="",Kc.delete(Xs()),Ys(e),Vs(""),di(),t.startsWith("/")&&qp(t))return;P.value=!0,Dt();let n=Date.now();if(Zc(t))is("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||H("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{rs(),is("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,N.peek())||(s==="grok"?"low":""),o=ue.peek();c.sessionId&&se(N.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||H("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function Vs(e){let t=Zc(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=Z[$.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 Zc(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function Bp(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Ys(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,Bp())+"px"}var Op=200,Up=500;function So(e){let t=B(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 Lo(e){let t=B(e);return t==null?"":new Date(t).toISOString()}function Fp(e,t,n){if(e==="system")return t;let s=So(n),a=Lo(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 Wp(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)?wo(t):null,d=t.length>Op,u=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"'}>${u}</div>`;break}case"assistant":{let o=t.length>Up,r=o?`<div class="msg-body">${wo(t)}</div>${s}`:wo(t);a=`<div class="msg-assistant-content 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 Fp(e,a,n)}function is(e,t,n,s={}){let a=i("messages");if(!a)return;let o=B(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Wp(e,n,o)),ad(a.lastElementChild),e==="assistant"&&sd(a.lastElementChild,n,s),Re(a,!!s.forceStick)}function H(e){is("system","",e)}var Wt=[],go=0,Oc=!1;async function Gp(e,t){let n=t||`upload-${Date.now()}`,s=await ed(e,n),a=ct({"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 Kp(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 ed(e,t){if(!e||!hi({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,f=>f.charCodeAt(0)),u=Kp(d,e.type);return u===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(u)?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:u}):e}catch{return e}}function zp(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]!==`
|
|
1172
1172
|
`?`
|
|
1173
1173
|
`:"")+t+`
|
|
1174
|
-
`;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
|
|
1174
|
+
`;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 hi(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 Jp(e,t){let n=e?.name||t.split("/").pop()||"file";if(hi(e)){go+=1;let a=`img${go}`;return{ref:``,label:a,kind:"image"}}go+=1;let s=`file${go}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function di(){for(let e of Wt)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Wt.length=0,gi()}function gi(){let e=i("chat-attach-bar");if(e){if(!Wt.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Wt.map((t,n)=>`
|
|
1175
1175
|
<div class="chat-thumb relative" title="${p(t.ref||t.path)}">
|
|
1176
1176
|
${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
|
|
1177
1177
|
<span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
|
|
1178
1178
|
<button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
|
|
1179
|
-
</div>`).join("")}}async function
|
|
1179
|
+
</div>`).join("")}}async function Qp(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await ed(e,t),s=await Gp(n,t),{ref:a,label:o,kind:r}=Jp(e,s),d="";if(r==="image")try{d=URL.createObjectURL(n)}catch{}return Wt.push({path:s,ref:a,label:o,kind:r,name:t,previewUrl:d}),gi(),zp(i("chat-input"),a),s}async function Eo(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 Qp(s)}catch(a){H(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function Vp(){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",()=>Eo(t.files)),t.click()}function td(){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 u of a)if(u.kind==="file"){let l=u.getAsFile();l&&o.push(l)}let r=o.filter(u=>hi(u)),d=r.length?r:o;d.length&&(e.preventDefault(),await Eo(d))}),!Oc&&(Oc=!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 Eo(n))}))}function Mt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function bi(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
|
|
1180
1180
|
<span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
|
|
1181
|
-
</div>`),Re(t))}function
|
|
1182
|
-
${String(e||"")}`}function
|
|
1181
|
+
</div>`),Re(t))}function yo(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 ${Mt(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Mt(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Mt(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${Mt(s)}`:"";bi(`\u2191${Mt(t)} \u2193${Mt(n)}${a}${o}${r}${l}${u}`)}function Yp(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 ${Mt(t)} / ${Mt(n)}`):t!=null&&a.push(`context ${Mt(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`),bi(`\u25A3 ${a.join(" \xB7 ")}`)}function Xp(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,mt=null,st=Ge=null,Ft=ht=null,Io.clear(),pi.clear()}function Zp(e,t=c.sessionId){return`${t||""}
|
|
1182
|
+
${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.add(n),is("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function ef(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)nd(n,e.sessionId||c.sessionId);t.length&&H(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function sd(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++Ep}`;Io.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
|
|
1183
1183
|
<button type="button" class="msg-action-btn" data-copy-message="${p(s)}" title="Copy answer">Copy</button>
|
|
1184
|
-
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}async function
|
|
1184
|
+
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}async function tf(e){let t=Io.get(e.dataset.copyMessage||"");if(t){try{await navigator.clipboard.writeText(t.text),e.textContent="Copied"}catch{e.textContent="Failed"}setTimeout(()=>{e.textContent="Copy"},1300)}}async function nf(e){let t=Io.get(e.dataset.forkMessage||"");if(!(!t||!t.sessionId||t.sessionId!==c.sessionId)){e.disabled=!0,e.textContent="Forking\u2026";try{let n=await x("POST",`/api/sessions/${encodeURIComponent(t.sessionId)}/fork`,{sourceAgent:t.agent,...t.historyIndex!=null?{upTo:t.historyIndex}:{},assistantText:t.text},void 0,{machineId:t.machineId||void 0});if(!n?.success||!n.targetSessionId)throw new Error("Fork did not create a session");let s={parentSessionId:t.sessionId,parentAgent:t.agent,parentMachineId:t.machineId,forkMessageIndex:Number.isInteger(n.forkMessageIndex)?n.forkMessageIndex:t.historyIndex,forkedAt:Date.now()},a=await x("PUT","/api/sessions/meta",{sessionId:n.targetSessionId,agent:n.targetAgent||t.agent,branch:s,machineId:t.machineId||void 0},void 0,{machineId:t.machineId||void 0}),o=J(n.targetAgent||t.agent,n.targetSessionId,t.machineId);T.value={...T.peek(),[o]:{favorite:!!a?.favorite,notes:a?.notes||"",title:a?.title||"",hidden:!!a?.hidden,branch:a?.branch||s,updatedAt:a?.updatedAt||Date.now()}};let[{loadAllSessions:r},{resumeSession:d}]=await Promise.all([Promise.resolve().then(()=>(Tt(),so)),Promise.resolve().then(()=>(ss(),ei))]);await r({waitFresh:!0}),await d(n.targetSessionId,E.peek()?.path||null,c.configDir||null,n.targetAgent||t.agent,t.machineId||null),H("Fork created \u2014 this branch can now continue independently.")}catch(n){e.textContent="Fork failed",H(`Fork failed: ${n.message}`),setTimeout(()=>{e.textContent="Fork"},1800)}finally{e.disabled=!1,e.textContent==="Forking\u2026"&&(e.textContent="Fork")}}}function sf(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>`),Re(t),t.lastElementChild}function af(e,t){e&&(e.textContent+=t,Re(e.closest("#messages")))}var mt=null;function of(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,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function Uc(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=of(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
|
|
1185
1185
|
<div class="flex items-center gap-1.5 text-xs font-mono">
|
|
1186
1186
|
<span class="text-warning">\u26A1</span>
|
|
1187
1187
|
<span class="text-warning font-semibold">${p(e.name||"tool")}</span>
|
|
@@ -1189,21 +1189,21 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
|
|
|
1189
1189
|
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
|
|
1190
1190
|
</div>
|
|
1191
1191
|
<div class="tool-detail">${p(n)}</div>
|
|
1192
|
-
</div>`}function
|
|
1192
|
+
</div>`}function rf(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>
|
|
1193
1193
|
<span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
|
|
1194
1194
|
<span class="text-base-content/40 truncate flex-1">${p(n)}</span>
|
|
1195
|
-
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function
|
|
1195
|
+
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function rs(){mt=null}function lf(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=B(t.ts);if(s==="clean"){if(!mt||!n.contains(mt.el)){let u=So(a),l=Lo(a);n.insertAdjacentHTML("beforeend",`
|
|
1196
1196
|
<div class="msg-row assistant px-2" data-ts="${p(l)}">
|
|
1197
1197
|
<div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
|
|
1198
1198
|
<div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
|
|
1199
1199
|
<div class="tool-batch-list"></div>
|
|
1200
1200
|
</div>
|
|
1201
1201
|
${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
|
|
1202
|
-
</div>`),
|
|
1202
|
+
</div>`),mt={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}mt.names.push(e.name||"tool"),mt.count++,mt.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",Uc(e,{inBatch:!0})),rf(mt),Re(n);return}mt=null;let o=So(a),r=Lo(a);n.insertAdjacentHTML("beforeend",`
|
|
1203
1203
|
<div class="msg-row assistant px-2" data-ts="${p(r)}">
|
|
1204
|
-
<div class="w-full max-w-[96%]">${
|
|
1204
|
+
<div class="w-full max-w-[96%]">${Uc(e)}</div>
|
|
1205
1205
|
${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
|
|
1206
|
-
</div>`),Re(n)}function
|
|
1206
|
+
</div>`),Re(n)}function Fc(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function cf(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",`
|
|
1207
1207
|
<div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
|
|
1208
1208
|
<div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
|
|
1209
1209
|
<div class="font-mono text-xs text-base-content/60 break-all mb-2">
|
|
@@ -1213,39 +1213,39 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
|
|
|
1213
1213
|
<button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
|
|
1214
1214
|
<button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
|
|
1215
1215
|
</div>
|
|
1216
|
-
</div>`),Re(i("messages"))}var
|
|
1216
|
+
</div>`),Re(i("messages"))}var Wc=!1;function df(){if(Wc||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
|
|
1217
1217
|
<div class="code-block-header">
|
|
1218
1218
|
<span class="code-block-lang">${p(r)}</span>
|
|
1219
1219
|
<button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
|
|
1220
1220
|
</div>
|
|
1221
1221
|
<pre><code class="hljs ${d}">${e(s)}</code></pre>
|
|
1222
|
-
</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>`},html(s){return e(s)}};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)}
|
|
1222
|
+
</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>`},html(s){return e(s)}};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)}Wc=!0}function wo(e){if(typeof marked>"u")return p(e);try{return df(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function uf(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 ad(e){uf(e),yt(e),xt(e)}function od(){Fc(),or(),De(me,s=>{Qs(),Dt();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"&&!vo){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}),De(E,()=>Dt()),b.on("click","#messages a, #chat-log a, .md-body a",(s,a)=>{let o=a.getAttribute("href")||"",r=E.peek()?.path||"";er(o,r)&&(s.preventDefault(),s.stopPropagation())}),b.on("click","#ws-banner-retry",s=>{s.preventDefault(),Dp()}),De(P,s=>{i("send-btn")?.classList.toggle("hidden",s),i("stop-btn")?.classList.toggle("hidden",!s),os(),s||i("send-btn")?.toggleAttribute("disabled",!sn());let a=i("messages");if(!a)return;let o=i("typing-indicator");s&&!o?(a.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>'),Re(a)):s||(o?.remove(),rs()),Dt()}),De(_e,()=>Fc()),document.addEventListener("session-lock-changed",()=>os()),os(),b.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(),Zs())}),b.on("submit","#chat-form",s=>{s.preventDefault(),Zs()}),b.on("input","#chat-input",(s,a)=>{Ys(a),Vs(a.value)}),b.on("click","#btn-attach",s=>{s.preventDefault(),Vp()}),b.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&Eo(o),a&&(a.value="")}),b.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>=Wt.length)return;let r=Wt[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,`
|
|
1223
1223
|
|
|
1224
|
-
`),d.dispatchEvent(new Event("input"))),
|
|
1224
|
+
`),d.dispatchEvent(new Event("input"))),Wt.splice(o,1),gi()}),b.on("click","[data-perm-id]",(s,a)=>{lt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:c.sessionId}),a.closest(".perm-banner")?.remove()}),b.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 u=a.getBoundingClientRect().top;r.scrollTop+=u-d}}),b.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||Lp(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",()=>{Gc(e)?.setFollowing(!0),e.scrollTo({top:e.scrollHeight,behavior:"smooth"})}),s()}b.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"}),b.on("click","[data-copy-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),tf(a)}),b.on("click","[data-fork-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),nf(a)}),b.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)}})}K();G();ce();Yo();Pn();tn();nn();function pf(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 rd(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function id(e){let t=rd(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function ld(e){let t=rd(e);return t==="md"||t==="markdown"||t==="mdx"}function ff(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function mf(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 vi=new Map;function To(e){if(vi.has(e))return vi.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 vi.set(e,t),t}function hf(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 gf(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function ls(e,t,n){let s=ff(t);return`
|
|
1225
1225
|
<div class="flex items-center gap-2 px-4 py-1.5 border-b border-base-300 flex-shrink-0 bg-base-200">
|
|
1226
1226
|
<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>
|
|
1227
1227
|
<button type="button" class="btn btn-ghost btn-xs" data-download-path="${p(e)}">\u2193 Download</button>
|
|
1228
|
-
</div>`}function
|
|
1228
|
+
</div>`}function bf(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=>`
|
|
1229
1229
|
<div class="flex items-center gap-2 px-4 py-1.5 hover:bg-base-300 group"
|
|
1230
1230
|
${t.isDir?`data-dir-path="${p(t.path)}"`:`data-file-path="${p(t.path)}"`}>
|
|
1231
|
-
<span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":
|
|
1231
|
+
<span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":pf(t.name)}</span>
|
|
1232
1232
|
<span class="text-sm flex-1 truncate cursor-pointer ${t.isDir?"text-primary":""}">${p(t.name)}</span>
|
|
1233
1233
|
${t.isDir?"":`
|
|
1234
1234
|
<button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-base-content/50 hover:text-base-content"
|
|
1235
1235
|
data-download-path="${p(t.path)}" title="Download" aria-label="Download">\u2193</button>
|
|
1236
1236
|
<button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-error/60 hover:text-error"
|
|
1237
1237
|
data-delete-path="${p(t.path)}" title="Delete" aria-label="Delete">\u2715</button>`}
|
|
1238
|
-
</div>`).join(""))}function
|
|
1238
|
+
</div>`).join(""))}function vf(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512));if(!s&&ld(e))return yf(e,t,n);let a=hf(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 ls(e,n,s?"binary":a||"text")+r}function xf(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function yf(e,t,n){return ls(e,n,"Markdown")+`
|
|
1239
1239
|
<div class="file-markdown-toolbar" role="group" aria-label="Markdown view">
|
|
1240
1240
|
<button type="button" class="file-markdown-mode active" data-file-render-mode="preview">Preview</button>
|
|
1241
1241
|
<button type="button" class="file-markdown-mode" data-file-render-mode="code">Code</button>
|
|
1242
1242
|
</div>
|
|
1243
|
-
<div class="file-markdown-preview md p-4 overflow-auto flex-1">${
|
|
1244
|
-
<pre class="file-markdown-code file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0 hidden"><code class="file-preview-code language-markdown">${p(t)}</code></pre>`}function
|
|
1243
|
+
<div class="file-markdown-preview md p-4 overflow-auto flex-1">${xf(t)}</div>
|
|
1244
|
+
<pre class="file-markdown-code file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0 hidden"><code class="file-preview-code language-markdown">${p(t)}</code></pre>`}function wf(e){let t=e?.querySelector(".file-markdown-preview");t&&(typeof hljs<"u"&&t.querySelectorAll("pre code:not(.hljs)").forEach(n=>{try{hljs.highlightElement(n)}catch{}}),yt(t),xt(t))}async function kf(e){if(await To("/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 $f(e){if(await To("/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],u;try{u=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${r}`,editable:!1})}catch{u='<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}">${u}</div>`}).join("");return`
|
|
1245
1245
|
<div class="office-preview office-xlsx flex flex-col flex-1 min-h-0 overflow-hidden">
|
|
1246
1246
|
<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>
|
|
1247
1247
|
<div class="office-sheet-body flex-1 overflow-auto p-2">${a}</div>
|
|
1248
|
-
</div>`}function
|
|
1248
|
+
</div>`}function Sf(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 u=a[1].replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'");u&&d.push(u)}d.length&&t.push(d.join(""))}return t}async function Lf(e){if(await To("/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=Sf(o),d=r.length?r.map(u=>`<p>${p(u)}</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(`
|
|
1249
1249
|
<article class="office-slide-card">
|
|
1250
1250
|
<header class="office-slide-num">Slide ${a+1}</header>
|
|
1251
1251
|
<div class="office-slide-body">${d}</div>
|
|
@@ -1253,7 +1253,7 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
|
|
|
1253
1253
|
<div class="office-preview office-pptx overflow-auto flex-1 p-3 space-y-3">
|
|
1254
1254
|
<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>
|
|
1255
1255
|
${s.join("")}
|
|
1256
|
-
</div>`}async function
|
|
1256
|
+
</div>`}async function Ef(){if(await To("/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 If(e){let n=await(await Ef()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let u=await n.getPage(d),l=u.getViewport({scale:1}),f=Math.min(1.5,820/l.width),m=u.getViewport({scale:f}),g=document.createElement("canvas");g.width=Math.floor(m.width),g.height=Math.floor(m.height),g.className="office-pdf-page",g.dataset.page=String(d),await u.render({canvasContext:g.getContext("2d"),viewport:m}).promise,o.push(`
|
|
1257
1257
|
<figure class="office-pdf-figure">
|
|
1258
1258
|
<figcaption class="office-pdf-cap">Page ${d} / ${s}</figcaption>
|
|
1259
1259
|
${g.outerHTML}
|
|
@@ -1262,12 +1262,12 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
|
|
|
1262
1262
|
<p class="text-xs text-base-content/50 px-1">PDF preview \xB7 ${s} page(s)</p>
|
|
1263
1263
|
${r}
|
|
1264
1264
|
${o.join("")}
|
|
1265
|
-
</div>`}async function
|
|
1266
|
-
${
|
|
1265
|
+
</div>`}async function Tf(e,t,n){let s=id(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=mf(t),r;if(s==="docx")r=await kf(o);else if(s==="xlsx")r=await $f(o);else if(s==="pptx")r=await Lf(o);else if(s==="pdf")r=await If(o);else throw new Error("Unsupported office type");return ls(e,n,a[s]||s)+r}function Cf(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 Mf(){let e=E.peek(),t=ie.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=Y.peek(),a="_",o=[...n.files],r=!1;for(let d of o){let u=s?`${s}/${d.name}`:d.name,l=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(u)}`;try{let f=await fetch(l,{method:"POST",headers:ct(),body:d,duplex:"half"});if(!f.ok){let m=await f.json().catch(()=>({}));throw new Error(m.error||`HTTP ${f.status}`)}}catch(f){alert(`Upload failed (${d.name}): ${f.message}`),r=!0;break}}if(!r){let d=Y.peek();Y.value=d+"\0",Y.value=d}}),n.click()}async function Af(e,t){let n=ie.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s="_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),r=`/api/projects/${s}/file?${o}`;try{let d=typeof window.showSaveFilePicker=="function"?await window.showSaveFilePicker({suggestedName:a}):null,u=await fetch(r,{headers:ct(),credentials:"same-origin"});if(!u.ok){let ae=await u.json().catch(()=>({}));throw new Error(ae.error||`HTTP ${u.status}`)}if(d&&u.body){await u.body.pipeTo(await d.createWritable());return}let l=16*1024*1024;if(Number(u.headers.get("content-length"))>l)throw await u.body?.cancel(),new Error("Use native download");let f=u.body.getReader(),m=[],g=0;for(;;){let{done:ae,value:O}=await f.read();if(ae)break;if(g+=O.byteLength,g>l)throw await f.cancel(),new Error("Use native download");m.push(O)}let w=new Blob(m,{type:u.headers.get("content-type")||"application/octet-stream"}),y=URL.createObjectURL(w),A=document.createElement("a");A.href=y,A.download=a,A.rel="noopener",A.style.display="none",document.body.appendChild(A),A.click(),A.remove(),setTimeout(()=>URL.revokeObjectURL(y),6e4)}catch(d){if(d.name==="AbortError")return;try{let u=`/api/projects/${s}/file?${Qo({root:n,path:t,download:"true"})}`,l=document.createElement("a");l.href=u,l.download=a,l.rel="noopener",l.target="_blank",document.body.appendChild(l),l.click(),l.remove()}catch{alert(`Download failed: ${d.message}`)}}}async function jf(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=ie.peek()||e?.path||"",s="_";try{await x("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),Y.value=Y.peek()+" ",Y.value=Y.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function Df(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=id(t);if(o&&n.encoding==="base64"){e.innerHTML=ls(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let r=await Tf(t,n.content,a);if(s.aborted)return;e.innerHTML=r}catch(r){if(s.aborted)return;e.innerHTML=ls(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=ls(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=vf(t,n.content||"",a),gf(e),ld(t)&&wf(e)}function cd(){je(()=>{let e=i("files-breadcrumb");if(!e)return;let t=re.value!==null;e.innerHTML=`
|
|
1266
|
+
${Cf(re.value??Y.value,t)}
|
|
1267
1267
|
<div class="flex-1"></div>
|
|
1268
|
-
${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),
|
|
1268
|
+
${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=X.value,n=E.value,s=(ie.value||n?.path||"").trim(),a=re.value,o=Y.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's cwd) or type an absolute path and press Go.</div>';return}let d="_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let f=await x("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await Df(r,a,f,e);return}let u=await x("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let l=Array.isArray(u)?u:Array.isArray(u?.files)?u.files:null;if(!l){r.innerHTML=`<div class="p-4 text-xs text-error">${p(u?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=bf(l)}catch(u){!e.aborted&&u?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${p(u.message)}</div>`)}}),b.on("click","[data-dir-path]",(e,t)=>{re.value=null,Y.value=t.dataset.dirPath}),b.on("click","[data-file-path]",(e,t)=>{re.value=t.dataset.filePath}),b.on("click","#btn-upload",()=>Mf()),b.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&Af(E.peek(),n)}),b.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&jf(E.peek(),n)}),b.on("click","[data-file-render-mode]",(e,t)=>{let n=t.closest("#files-area");if(!n)return;let s=t.dataset.fileRenderMode==="code";n.querySelector(".file-markdown-preview")?.classList.toggle("hidden",s),n.querySelector(".file-markdown-code")?.classList.toggle("hidden",!s),n.querySelectorAll("[data-file-render-mode]").forEach(a=>{a.classList.toggle("active",a===t)})}),b.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)})})}K();G();ce();var dd=I(!1);function _f(e){return e?e.split(`
|
|
1269
1269
|
`).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(`
|
|
1270
|
-
`):'<span class="text-base-content/40">No commits</span>'}function
|
|
1270
|
+
`):'<span class="text-base-content/40">No commits</span>'}function Nf(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`
|
|
1271
1271
|
<div class="px-4 py-2 text-xs text-base-content/50 border-b border-base-300">
|
|
1272
1272
|
Branch: <span class="text-success font-semibold">${p(e.branch)}</span>
|
|
1273
1273
|
</div>
|
|
@@ -1293,16 +1293,16 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
|
|
|
1293
1293
|
<span class="text-base-content/40">Loading\u2026</span>
|
|
1294
1294
|
</div>
|
|
1295
1295
|
</div>
|
|
1296
|
-
</div>`}function
|
|
1296
|
+
</div>`}function Pf(e){return e.split(`
|
|
1297
1297
|
`).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(`
|
|
1298
|
-
`)}function
|
|
1299
|
-
`),
|
|
1298
|
+
`)}function ud(){Mn(async e=>{let t=X.value,n=E.value,s=Se.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="_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await x("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Nf(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(r?.message??String(r))}</div>`)}}),Mn(async e=>{let t=E.value,n=Se.value||t?.path,s=dd.value,a=i("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let r=await x("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=r?.diff?Pf(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>`)}}),b.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";dd.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"}`}),b.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||Hf()})}function Hf(){let e=E.peek(),t=Se.peek()||e?.path,n=i("git-graph-content");if(!t||!n)return;let s="_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',x("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?_f(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}js();K();G();var Me=null,z=null,Mo=null,na=!1,Ao=null,hd=null,ea=0,ta=null,xi=!1,pd=!1,fd={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function yi(e){Me&&Me.readyState===WebSocket.OPEN&&Me.send(JSON.stringify({type:"input",data:e}))}function qf(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function jo(){if(qf()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}z?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function gd(){if(z)return;let e=i("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(gd,100);return}z=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"&&(Mo=new FitAddon.FitAddon,z.loadAddon(Mo)),z.open(e),Co(),z.onData(n=>{yi(n)}),e.addEventListener("pointerdown",()=>jo(),{passive:!0}),e.addEventListener("touchend",()=>jo(),{passive:!0}),window.addEventListener("resize",()=>{Co(),Do()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,X.peek()==="shell"&&(Co(),Do())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function Co(){try{Mo&&z&&Mo.fit()}catch{}}function Do(){Me&&Me.readyState===WebSocket.OPEN&&z&&Me.send(JSON.stringify({type:"resize",cols:z.cols,rows:z.rows}))}function bd(){return c.machineId||_.peek()||null}function _o(e){ta&&(clearTimeout(ta),ta=null),xi=!0;let t=++ea;if(Me){try{Me.close()}catch{}Me=null}na=!1;let n=location.protocol==="https:"?"wss":"ws",s=z?z.cols:80,a=z?z.rows:24,o=new URLSearchParams;c.token&&o.set("token",c.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let r=bd();M.peek()&&r&&o.set("machine",r),Ao=e||null,hd=r,Me=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),Me.addEventListener("open",()=>{t===ea&&(na=!0,z?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
|
|
1299
|
+
`),Do())}),Me.addEventListener("message",d=>{if(t!==ea)return;let u;try{u=JSON.parse(d.data)}catch{return}u.type==="output"?z?.write(u.data):u.type==="exit"?z?.write(`\r
|
|
1300
1300
|
\x1B[33m[process exited: ${u.code}]\x1B[0m\r
|
|
1301
|
-
`):u.type==="error"&&
|
|
1301
|
+
`):u.type==="error"&&z?.write(`\r
|
|
1302
1302
|
\x1B[31m[error: ${u.data||u.message||""}]\x1B[0m\r
|
|
1303
|
-
`)}),Me.addEventListener("close",()=>{t===
|
|
1303
|
+
`)}),Me.addEventListener("close",()=>{t===ea&&(na=!1,z?.write(`\r
|
|
1304
1304
|
\x1B[33m[disconnected]\x1B[0m\r
|
|
1305
|
-
`),!(!
|
|
1306
|
-
`),
|
|
1305
|
+
`),!(!xi||X.peek()!=="shell")&&(z?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
|
|
1306
|
+
`),ta=setTimeout(()=>{ta=null,_o(Ao)},1500)))}),Me.addEventListener("error",()=>{t===ea&&z?.write(`\r
|
|
1307
1307
|
\x1B[31m[WebSocket error]\x1B[0m\r
|
|
1308
|
-
`)})}function
|
|
1308
|
+
`)})}function md(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),z||gd(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Co();let n=bd();!na||Ao!==(e||null)||hd!==n?(z?.clear(),_o(e)):Do()})})}function vd(){pd||(pd=!0,document.getElementById("term-keyboard")?.addEventListener("click",jo),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(yi(`${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||!fd[t]||(yi(fd[t]),jo())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(X.peek()!=="shell"||!xi||na||_o(Ao))}),De(X,e=>{e==="shell"&&md()}),document.addEventListener("shell-tab-shown",()=>{X.peek()==="shell"&&md()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{z?.clear(),_o(E.peek()?.path)})}Hs();Pa();var xd=null;function yd(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function Rf(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 Bf(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:Rf(e)?!1:location.protocol==="https:"}function wd(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function kd(){yd()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),xd=n,document.dispatchEvent(new CustomEvent("pwa-installable")),wd()}),window.addEventListener("appinstalled",()=>{xd=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!yd()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>wd()),!Bf()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js?v=33",{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))}Nn();function wi(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function No(){document.documentElement.classList.remove("boot-restore")}var ki=kr(location.hash.slice(1)||"/"),$d=ci()||!!(c.token&&ki?.id);Hc({restoreSession:$d});Oi();od();cd();ud();Dl();Ar();vd();td();ec();$l(nt,Ct);(async()=>{let e=qi();if(c.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")),$d){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 mo({hub:s,deepLink:ki}),ki?.id||(Sl(),(location.hash||"").startsWith("#/session/")||No()),requestAnimationFrame(()=>{requestAnimationFrame(wi)})}catch(t){console.error("[boot]",t),c.token=null,localStorage.removeItem("token"),No(),await li(),wi()}else{No();try{await li()}catch(t){console.error("[boot auth]",t)}finally{wi()}}})();document.addEventListener("router:home",()=>{No()});kd();
|