@lelouchhe/webagent 0.8.0 → 0.10.0
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/README.md +43 -15
- package/config.toml +7 -27
- package/dist/index.html +21 -5
- package/dist/js/app.INIQQEGD.js +5 -0
- package/dist/js/chunk.3CLGCUHW.js +1 -0
- package/dist/js/{chunk.CT5WBNGZ.js → chunk.7WADDFJZ.js} +50 -49
- package/dist/js/chunk.AOTG3PL7.js +20 -0
- package/dist/js/{login.2WA6DTGM.js → login.WMURU4NI.js} +1 -1
- package/dist/js/viewer.RHZMFYWJ.js +1 -0
- package/dist/login.html +2 -2
- package/dist/share-viewer.html +6 -6
- package/dist/{styles.00etlpgs.css → styles.01aj0l37.css} +186 -4
- package/dist/sw.js +6 -6
- package/lib/agent-key.js +6 -0
- package/lib/attachment-dispatch.js +60 -31
- package/lib/attachment-interceptor.js +7 -7
- package/lib/attachment-labels.js +1 -1
- package/lib/attachments.js +69 -7
- package/lib/auth-middleware.js +11 -4
- package/lib/auth.js +2 -2
- package/lib/bridge.js +209 -90
- package/lib/client-registry.js +12 -12
- package/lib/config.js +2 -31
- package/lib/event-handler.js +166 -85
- package/lib/files/limits.js +15 -0
- package/lib/files/paths.js +155 -0
- package/lib/files/routes.js +232 -0
- package/lib/home-path.js +35 -0
- package/lib/http-status.js +1 -0
- package/lib/mcp/capability.js +74 -0
- package/lib/mcp/server.js +148 -0
- package/lib/mcp/task-history.js +245 -0
- package/lib/mcp/task-host.js +253 -0
- package/lib/mcp/tools.js +168 -0
- package/lib/mode-bucket.js +1 -1
- package/lib/push-service.js +33 -35
- package/lib/routes.js +1022 -475
- package/lib/server.js +84 -34
- package/lib/share/routes.js +97 -85
- package/lib/shared/task-reference.js +20 -0
- package/lib/sse-manager.js +8 -8
- package/lib/store.js +992 -284
- package/lib/task-collaboration.js +15 -0
- package/lib/task-manager.js +1409 -0
- package/lib/task-path.js +131 -0
- package/lib/{session-state.js → task-state.js} +90 -38
- package/lib/task-tree-lock.js +74 -0
- package/lib/{sessions-anchor.js → tasks-anchor.js} +8 -7
- package/lib/tokens.js +1 -1
- package/lib/types.js +2 -2
- package/package.json +8 -1
- package/dist/js/app.XBFXH37R.js +0 -2
- package/dist/js/chunk.UMQMOGWO.js +0 -1
- package/dist/js/viewer.CVWXSKJM.js +0 -1
- package/lib/session-manager.js +0 -613
- package/lib/title-service.js +0 -95
package/dist/js/app.XBFXH37R.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as Ln,b as B,c as Cn,d as At,e as An,f as Ke,g as Pn,h as Mn,i as F,j as Rn,k as Pe,l as W,m as Nn,n as On,o as E,p as P,q as je,r as Pt,s as Mt,t as _n,u as Rt}from"./chunk.CT5WBNGZ.js";import{a as v,b as G}from"./chunk.UMQMOGWO.js";import"./chunk.AJZBJBMO.js";var ze=null;function Bi(e){location.replace(e)}function Fi(e){let t;try{if(e.startsWith("/"))t=e.split("?")[0];else{let s=new URL(e);if(s.origin!==location.origin)return!1;t=s.pathname}}catch{return!1}return t.startsWith("/api/")}function Di(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function $n(e={}){let t=e.baseFetch??globalThis.fetch.bind(globalThis),s=e.onUnauthorized??Bi;ze??=globalThis.fetch;let i=async(r,o)=>{let u=Di(r),c=Fi(u),d=o;if(c){let h=localStorage.getItem(G);if(h){let p=o?.headers??(r instanceof Request?r.headers:void 0),m=new Headers(p);m.has("Authorization")||m.set("Authorization",`Bearer ${h}`),d={...o??{},headers:m}}}let f=await t(r,d);if(c&&f.status===v.UNAUTHORIZED){try{localStorage.removeItem(G)}catch{}s("/login")}return f};return globalThis.fetch=i,Ui}function Ui(){ze&&(globalThis.fetch=ze,ze=null)}var Vi=new Set(["plan","read-only"]),Gi=new Set(["autopilot","bypassPermissions","full-access","yolo"]),Wi=new Set(["agent","default","build"]);function Je(e){if(!e)return"";let t=e.match(/[#/]([^#/]+)$/);return t?t[1]:e}function qn(e){return Vi.has(Je(e))}function Hn(e){return Gi.has(Je(e))}function Bn(e){let t=Je(e);return t?!Wi.has(t):!1}function Fn(e){return Je(e).replace(/([A-Z])/g," $1").trim()}var ie=class extends Error{name="ApiError";status;constructor(t,s){super(s),this.status=t}},Nt=3e4,Dn=1e4;async function Me(e,t=Nt){if(typeof AbortController!="function")return e(void 0);let s=new AbortController,i=setTimeout(()=>{s.abort()},t);i.unref?.();try{return await e(s.signal)}finally{clearTimeout(i)}}async function N(e,t,s=Nt){return Me(async i=>{let r=await fetch(e,i?{...t,signal:i}:t);if(!r.ok){let u=`HTTP ${r.status}`;try{let c=await r.json();c.error&&(u=typeof c.error=="string"?c.error:JSON.stringify(c.error))}catch{}throw new ie(r.status,u)}let o=await r.text();if(o)return JSON.parse(o)},s)}function O(e,t,s,i=Nt){let r={"Content-Type":"application/json"};return s&&(r["X-Client-Op-Id"]=s),N(e,{method:"POST",headers:r,body:JSON.stringify(t)},i)}function Z(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"op-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,10)}function Un(e,t){let s={};return e?.cwd&&(s.cwd=e.cwd),e?.inheritFromSessionId&&(s.inheritFromSessionId=e.inheritFromSessionId),O("/api/v1/sessions",s,t)}function ge(e){return N("/api/v1/sessions/"+e,{method:"DELETE"})}function Ye(){return N("/api/v1/sessions")}function re(e){return N("/api/v1/sessions/"+e)}function Vn(e){return N("/api/v1/sessions/"+e+"/snapshot")}function Ot(e,t,s,i=Z()){let r={text:t};return s?.length&&(r.attachments=s),O("/api/v1/sessions/"+e+"/prompt",r,i)}function Gn(e){return O("/api/v1/sessions/"+e+"/cancel",{},Z())}function Wn(e,t,s){return O("/api/v1/sessions/"+e+"/permissions/"+t,{optionId:s},Z())}function Kn(e,t){return O("/api/v1/sessions/"+e+"/permissions/"+t,{denied:!0},Z())}function he(e,t,s){let i=t.replace(/_/g,"-"),r=typeof s=="boolean"?"config/"+i:i;return N("/api/v1/sessions/"+e+"/"+r,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:s})})}function Qe(e,t){return N("/api/v1/sessions/"+e+"/title",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:t})})}function jn(e,t){return O("/api/v1/sessions/"+e+"/bash",{command:t})}function ye(e,t,s){let i={visible:t};return s&&(i.sessionId=s),O("/api/beta/clients/"+e+"/visibility",i,void 0,Dn)}function Ze(){return O("/api/v1/bridge/reload",{})}function zn(){return O("/api/v1/sse-ticket",{},void 0,Dn)}function Re(){return N("/api/v1/messages")}function Jn(e,t){return O(`/api/v1/messages/${encodeURIComponent(e)}/consume`,{...t?{inheritFromSessionId:t}:{}})}function Xe(e){return N(`/api/v1/messages/${encodeURIComponent(e)}`,{method:"DELETE"})}function et(){return N("/api/v1/tokens")}function tt(e){return O("/api/v1/tokens",{name:e})}function nt(e){return N("/api/v1/tokens/"+encodeURIComponent(e),{method:"DELETE"})}var T=e=>document.querySelector(e),l={messages:T("#messages"),input:T("#input"),sendBtn:T("#send-btn"),prompt:T("#input-prompt"),status:T("#status"),sessionInfo:T("#session-info"),inboxBtn:T("#inbox-btn"),inboxCount:T("#inbox-count"),attachBtn:T("#attach-btn"),fileInput:T("#file-input"),attachPreview:T("#attach-preview"),themeBtn:T("#theme-btn"),slashMenu:T("#slash-menu"),planPanel:T("#plan-panel"),inputArea:T("#input-area"),modePill:T("#mode-pill"),statusBar:T("#status-bar")};function L(e){l.input.value=e,l.input.dispatchEvent(new window.Event("input",{bubbles:!0}))}var n={eventSource:null,clientId:null,sessionId:null,sessionSwitchGen:0,messageNavigationGen:0,pendingNavigationSessionId:null,pendingNavigationEvents:[],runtimeHydrationSessionId:null,sessionCwd:null,sessionTitle:null,inboxCount:0,awaitingNewSession:!1,newSessionRequestInFlight:!1,pendingNewSessionOpId:null,_newSessionRecoveryTimer:null,configOptions:[],agentCommands:[],agentCommandsEpoch:null,agentCommandsRevision:0,sessionMode:null,sessionModel:null,currentAssistantEl:null,currentAssistantText:"",pendingFinalAnswerToolText:null,assistantRafToken:null,currentThinkingEl:null,currentThinkingText:"",busy:!1,busyKind:null,cancelStatus:null,plan:null,pendingAttachments:[],currentBashEl:null,followMessages:!0,pendingToolCallIds:new Set,pendingPermissionRequestIds:new Set,pendingPromptDone:!1,turnEnded:!1,currentPromptId:null,newTurnStarted:!1,sentMessageForSession:null,sentMessageOpId:null,awaitingOwnUserEcho:!1,replayedOwnUserEcho:!1,reconcileAfterOwnUserEcho:!1,sentBashForSession:null,cancelTimeout:1e4,serverVersion:null,agentName:null,agentVersion:null,_cancelTimerId:null,_onCancelTimeout:null,lastEventSeq:0,lastStateSeq:0,oldestLoadedSeq:0,hasMoreHistory:!1,loadingOlderEvents:!1,replayInProgress:!1,replayTarget:null,replayQueue:[],agentReloading:!1,recentPathsLimit:10,previewToken:null},Ki={disconnected:"is-disconnected",connecting:"is-connecting",connected:"is-connected"};function le(e,t=e){l.status.textContent="",l.status.className=`status-dot ${Ki[e]}`,l.status.dataset.state=e,l.status.setAttribute("aria-label",t),l.status.setAttribute("title",t)}function it(e){let t=Math.max(0,Math.trunc(e));n.inboxCount=t,l.inboxCount.hidden=t===0,l.inboxCount.textContent=t===0?"":`(${t>9?"9+":t})`;let s=t===0?"Inbox, no pending messages":`Inbox, ${t} pending ${t===1?"message":"messages"}`;l.inboxBtn.setAttribute("aria-label",s),l.inboxBtn.title=t===0?"Open inbox":`${s}. Open inbox`}function _t(e){return n.configOptions.find(t=>t.id===e)}function j(e){let t=_t(e);return t&&"options"in t?t:null}function $t(e){return _t(e)?.currentValue??null}function Zn(e){let t=$t(e);return typeof t=="string"?t:null}function Xn(e,t){let s=_t(e);s&&("options"in s&&typeof t=="string"||s.type==="boolean"&&typeof t=="boolean")&&(s.currentValue=t)}function qt(e){n.configOptions=e,e.length>0&&es(),k(),D()}function ji(e){n.configOptions.length>0||(n.sessionMode=e.session.mode??null,n.sessionModel=e.session.model??null)}function es(){n.sessionMode=null,n.sessionModel=null}function ts(e){return e==="mode"?n.sessionMode:n.sessionModel}function k(){if(l.inputArea.classList.remove("plan-mode","autopilot-mode","preview-mode"),n.previewToken){l.inputArea.classList.add("preview-mode"),l.input.placeholder="publish or cancel",l.modePill.textContent="preview",K();return}l.input.placeholder="Message or ?";let e=Zn("mode")||ts("mode")||"";qn(e)?l.inputArea.classList.add("plan-mode"):Hn(e)&&l.inputArea.classList.add("autopilot-mode"),l.modePill.textContent=Bn(e)?Fn(e):"",K()}function D(){let e=Zn("model")||ts("model"),t=n.sessionCwd??"";if(l.statusBar.textContent="",t){e&&l.statusBar.appendChild(document.createTextNode(e+" \xB7 "));let s=document.createElement("span");s.className="status-cwd",s.textContent=t,l.statusBar.appendChild(s)}else e&&(l.statusBar.textContent=e)}var ns=()=>{};function ss(e){ns=e}function is(e){n.plan=e?.map(t=>({...t}))??null,ns(n.plan)}function zi(e){n.lastStateSeq=e.seq;let t=e.runtime.busy;t?.promptId&&(n.currentPromptId=t.promptId),n.busyKind=t?.kind??null,n.cancelStatus=t?.cancelStatus??null,w(t!=null),t==null&&Se(),is(e.runtime.plan??null),rt(e.agentCommands??{epoch:"",revision:0,commands:[]}),ji(e),k(),D()}function rt(e){return e.epoch===n.agentCommandsEpoch&&e.revision<n.agentCommandsRevision?!1:(n.agentCommandsEpoch=e.epoch,n.agentCommandsRevision=e.revision,n.agentCommands=e.commands.slice(),!0)}function Ht(e){if(e.seq!==n.lastStateSeq+1)return!1;n.lastStateSeq=e.seq;let t=e.patch.runtime;if(t&&"busy"in t){let s=t.busy??null;s?.promptId&&(n.currentPromptId=s.promptId),n.busyKind=s?.kind??null,n.cancelStatus=s?.cancelStatus??null,w(s!=null),s==null&&Se()}return t&&"plan"in t&&is(t.plan??null),!0}async function ot(e,t){let s=await rs(e,t);return s.status==="applied"?s.snapshot:null}async function rs(e,t){let s=n.sessionSwitchGen,i=n.lastStateSeq;try{let r=await Vn(e);return n.sessionSwitchGen!==s||t&&!t()?{status:"stale"}:n.lastStateSeq!==i||r.seq<n.lastStateSeq?{status:"superseded"}:(zi(r),{status:"applied",snapshot:r})}catch{return{status:"failed"}}}function Ji(e){let t=n.pendingNavigationEvents.filter(s=>s.type==="state_patch"&&s.sessionId===e).sort((s,i)=>s.seq-i.seq);return n.pendingNavigationEvents=n.pendingNavigationEvents.filter(s=>s.type!=="state_patch"||s.sessionId!==e),t}function Yi(e){n.pendingNavigationEvents=n.pendingNavigationEvents.filter(t=>t.type!=="state_patch"||t.sessionId!==e)}var Yn=0;function Qn(e){for(let t of Ji(e))if(!(t.seq<=n.lastStateSeq)&&!Ht({seq:t.seq,patch:t.patch}))return!1;return!0}async function ce(e,t){let s=++Yn;n.runtimeHydrationSessionId=e;try{for(let i=0;i<3;i++){let r=await rs(e,t);if(r.status==="stale")return!1;if(r.status==="superseded"){if(Qn(e))return!0;continue}if(r.status!=="failed"&&Qn(e))return!0}return!1}finally{s===Yn?n.runtimeHydrationSessionId=null:n.runtimeHydrationSessionId!==e&&Yi(e)}}function w(e){n.busy=e,e||(n.busyKind=null,n.cancelStatus=null),e?l.prompt.classList.add("busy"):l.prompt.classList.remove("busy"),K()}function _({cwd:e,inheritFromSessionId:t=n.sessionId}={}){Bt({cwd:e,inheritFromSessionId:t})}async function Bt({cwd:e,inheritFromSessionId:t=n.sessionId}={}){if(n.newSessionRequestInFlight||n.pendingNewSessionOpId)return!1;Qi(),n.sessionSwitchGen++,n.messageNavigationGen++;let s=n.sessionSwitchGen;n.pendingNavigationSessionId=null,n.pendingNavigationEvents=[],n.runtimeHydrationSessionId=null,n.awaitingNewSession=!0,n.newSessionRequestInFlight=!0;let i=Z();n.pendingNewSessionOpId=i;try{let r=await Un({cwd:e,inheritFromSessionId:t},i);if(n.newSessionRequestInFlight=!1,s!==n.sessionSwitchGen)return n.pendingNewSessionOpId===i&&ae(),!1;if(typeof r.id!="string")throw new Error("Session create response is missing an id");return st.delete(i),ae(),os(r),!0}catch{return st.delete(i)?!0:s===n.sessionSwitchGen&&n.pendingNewSessionOpId===i?await new Promise(r=>{ve.set(i,r),n._newSessionRecoveryTimer=setTimeout(()=>{ve.delete(i),n.pendingNewSessionOpId===i&&(n.pendingNewSessionOpId=null,s===n.sessionSwitchGen&&(n.awaitingNewSession=!1)),n._newSessionRecoveryTimer=null,r(!1)},3e3)}):!1}finally{n.newSessionRequestInFlight=!1,s!==n.sessionSwitchGen&&n.pendingNewSessionOpId===i&&ae()}}var st=new Set,ve=new Map;function ae(e){if(e){let t=ve.get(e);t?(ve.delete(e),t(!0)):st.add(e)}else{st.clear();for(let t of ve.values())t(!1);ve.clear()}n._newSessionRecoveryTimer!=null&&(clearTimeout(n._newSessionRecoveryTimer),n._newSessionRecoveryTimer=null),n.pendingNewSessionOpId=null,n.newSessionRequestInFlight=!1}var os=()=>{};function as(e){os=e}var ls=()=>{};function cs(e){ls=e}function Qi(){ls()}var us=[];function Ne(e){us.push(e)}var ds=()=>{};function fs(e){ds=e}function K(){ds()}function I({preserveNavigationTarget:e=!1}={}){for(let t of us)t();l.messages.innerHTML="",n.assistantRafToken!=null&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n.assistantRafToken),n.assistantRafToken=null),n.currentAssistantEl=null,n.currentAssistantText="",n.pendingFinalAnswerToolText=null,n.currentThinkingEl=null,n.currentThinkingText="",n.busyKind=null,n.cancelStatus=null,n.plan=null,n.pendingAttachments.length=0,n.followMessages=!0,n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,n.turnEnded=!1,n.currentPromptId=null,n.newTurnStarted=!1,n.sentMessageOpId=null,n.awaitingOwnUserEcho=!1,n.replayedOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,n._cancelTimerId!=null&&clearTimeout(n._cancelTimerId),n._cancelTimerId=null,n.lastEventSeq=0,n.lastStateSeq=0,n.pendingNavigationEvents=[],n.oldestLoadedSeq=0,n.hasMoreHistory=!1,n.loadingOlderEvents=!1,n.replayInProgress=!1,n.replayQueue=[],e||(n.pendingNavigationSessionId=null),n.previewToken=null,l.attachPreview.innerHTML="",l.attachPreview.classList.remove("active"),l.input.disabled=!1,l.sendBtn.disabled=!1,k(),w(!1),n.sessionTitle=null,n.sessionCwd=null,n.configOptions=[],n.agentCommands=[],n.agentCommandsEpoch=null,n.agentCommandsRevision=0,es(),at(null,null),l.statusBar.textContent=""}async function we(){if(!n.busy||!n.sessionId)return null;let e=n.sessionId,t=n.lastStateSeq;n.cancelStatus="requested",K();try{let s=await Gn(e);return n.sessionId===e&&n.lastStateSeq===t&&(s.status==="idle"||s.status==="cancelled"?w(!1):s.status==="superseded"&&(n.cancelStatus=null,K())),s}catch(s){throw n.sessionId===e&&n.lastStateSeq===t&&(n.cancelStatus=null,K()),s}}function Se(){n._cancelTimerId!=null&&(clearTimeout(n._cancelTimerId),n._cancelTimerId=null)}function ps(){return location.hash.slice(1)||null}function be(e){history.replaceState(null,"",`#${e}`)}function at(e,t){l.sessionInfo.textContent=t??(e?e.slice(0,8)+"\u2026":""),document.title=t??">_"}le("disconnected");function ct(e,t){let s=document.createElement("div");return s.className=`msg ${e}`,e==="user"?s.innerHTML=F(t).replace(/\n/g,"<br>"):e==="assistant"?P(s,t,n.pendingFinalAnswerToolText??void 0):Pe(s,t),b(s),s}function a(e){let t=document.createElement("div");return t.className="system-msg",t.textContent=e,b(t),t}function M(){let e=n.currentAssistantEl,t=n.currentAssistantText,s=e instanceof HTMLElement&&e.dataset.assistantDisplay==="final-answer"||n.pendingFinalAnswerToolText!==null,i=n.assistantRafToken,r=i!=null;n.currentAssistantEl=null,n.currentAssistantText="",r&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(i),n.assistantRafToken=null),e&&(r||s)&&P(e,t,n.pendingFinalAnswerToolText??void 0,!0),n.pendingFinalAnswerToolText=null,e&&typeof e.querySelector=="function"&&(e.removeAttribute("data-primed"),B(e),W(e))}function ms(){if(n.assistantRafToken==null)return;typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n.assistantRafToken),n.assistantRafToken=null;let e=n.currentAssistantEl;e&&P(e,n.currentAssistantText,n.pendingFinalAnswerToolText??void 0)}function C(){if(n.currentThinkingEl){let e=n.currentThinkingEl.querySelector("summary");e.textContent="\u283F thought",e.classList.remove("active"),e.style.animation="none",n.currentThinkingEl.removeAttribute("data-primed"),n.currentThinkingEl=null,n.currentThinkingText=""}}var ue=null,Zi=80;function Oe(e){return e.scrollHeight-e.scrollTop-e.clientHeight<Zi}function Xi(){n.followMessages=Oe(l.messages)}l.messages.addEventListener("scroll",Xi);function gs(){return n.followMessages||Oe(l.messages)}function b(e,t=!1){if(n.replayTarget)return n.replayTarget.appendChild(e),e;let s=t||gs();return l.messages.appendChild(e),x(s),e}function hs(){z(),ue=document.createElement("div"),ue.id="waiting",ue.innerHTML='<span class="cursor">\u258C</span>',b(ue,!0)}function z(){ue&&(ue.remove(),ue=null)}var Ft=!1,lt=!1;function Dt(e){let t=l.messages;if(e||n.followMessages){t.clientHeight,t.scrollTop=t.scrollHeight,n.followMessages=!0;return}n.followMessages=Oe(t)}function er(e){if(!(e||n.followMessages)){n.followMessages=Oe(l.messages);return}Dt(!0),!(typeof requestAnimationFrame!="function"||lt)&&(lt=!0,requestAnimationFrame(()=>{if(!n.followMessages){lt=!1;return}Dt(!0),requestAnimationFrame(()=>{lt=!1,n.followMessages&&Dt(!0)})}))}function ys(e){let t=gs();e(),t&&er(!0)}function x(e){let t=l.messages;if(e||n.followMessages){typeof requestAnimationFrame=="function"?Ft||(Ft=!0,requestAnimationFrame(()=>{Ft=!1,t.scrollTop=t.scrollHeight})):t.scrollTop=t.scrollHeight,n.followMessages=!0;return}n.followMessages=Oe(t)}function A(e){if(e==null||e==="")return"";let t;if(typeof e=="number")t=new Date(e);else{let i=String(e);t=new Date(i.endsWith("Z")||/[+-]\d{2}:?\d{2}$/.test(i)?i:i+"Z")}if(isNaN(t.getTime()))return"";let s=i=>String(i).padStart(2,"0");return`${t.getFullYear()}-${s(t.getMonth()+1)}-${s(t.getDate())} ${s(t.getHours())}:${s(t.getMinutes())}`}function vs(e,t=!1){let s=document.createElement("div");return s.className="bash-block",s.innerHTML=`<span class="bash-cmd${t?" running":""}">${F(e)}</span><div class="bash-output"></div>`,s.querySelector(".bash-cmd").addEventListener("click",()=>{let i=s.querySelector(".bash-output");i.style.display==="none"?i.style.display="block":i.classList.contains("has-content")&&(i.style.display="none")}),b(s),t&&(n.currentBashEl=s),s}function ut(e,t,s){if(!e)return;let i=e.querySelector(".bash-cmd");i.classList.remove("running");let r="";if(s?r=`[signal: ${s}]`:t!==0&&t!=null&&(r=`[exit: ${t}]`),r){let o=document.createElement("span");o.className=`bash-exit ${t===0?"ok":"fail"}`,o.textContent=r,i.after(o)}e===n.currentBashEl&&(n.currentBashEl=null)}function Ut(e,t){let s=e.replace(/^\s+/,"");if(s==="")return{node:t,pathPrefix:"",tailQuery:""};let i=/\s$/.test(s),r=s.split(/\s+/).filter(m=>m.length>0),o=i?r:r.slice(0,-1),u=i?"":r[r.length-1]??"",c=t,d="",f=0;for(let m of o){let g=c.children?.find(y=>y.name===m);if(!g)break;d=d?`${d} ${g.name}`:g.name,c=g,f++}let h=o.slice(f);u&&h.push(u);let p=h.join(" ");return{node:c,pathPrefix:d,tailQuery:p}}function ws(e,t,s){let i=[],r=t.trim().toLowerCase(),o=[];if(e.children){let m=e.name==="<root>"?[...e.children].sort((g,y)=>g.name.localeCompare(y.name)):e.children;for(let g of m){if(r&&!g.name.toLowerCase().includes(r))continue;let q=(g.children?.length??0)>0||g.fetch||g.freeform;o.push({spec:{primary:g.name,secondary:g.desc},prefix:q?"\u203A":"",kind:"subcommand",node:g})}}i.push(...o);let u=[],c="none",d="";if(e.fetch&&e.toSpec){if(s==="loading")c="loading";else if(s&&typeof s=="object"&&!Array.isArray(s)&&"error"in s)c="error",d=typeof s.error=="string"?s.error:"";else if(Array.isArray(s))if(s.length===0)c="empty";else{let g=(r?s.filter(y=>e.matches?e.matches(y,r):e.toSpec(y).primary.toLowerCase().includes(r)):s).map(y=>e.toSpec(y));g.length===0?c="no-match":(c="ok",u=g)}}let f=null;if(e.freeform){let m=t.trim();if(!(m.length>0&&u.some(y=>y.primary.toLowerCase()===m.toLowerCase()))){let y=e.freeform(t);y&&(f={spec:y,prefix:"\u21B5",kind:"freeform"},i.push(f))}}if((o.length>0||f!==null)&&c!=="none"&&i.push({spec:{primary:""},prefix:"",kind:"separator"}),c==="loading")i.push({spec:{primary:"(loading...)"},prefix:"",kind:"placeholder"});else if(c==="error")i.push({spec:{primary:`(${d||"error"})`},prefix:"",kind:"placeholder"});else if(c==="empty")i.push({spec:{primary:"(none)"},prefix:"",kind:"placeholder"});else if(c==="no-match")i.push({spec:{primary:"(no match)"},prefix:"",kind:"placeholder"});else if(c==="ok")for(let m of u)i.push({spec:m,prefix:m.current?"*":"",kind:"data"});return i}function Ss(e,t,s){let i=document.createElement("div");i.className="slash-item"+(t?" selected":"");let r=e.path!==void 0,o=document.createElement("div");o.className="slash-row-l1";let u=document.createElement("span");u.className="slash-prefix",u.textContent=s,o.appendChild(u);let c=document.createElement("span");if(c.className="slash-primary"+(e.current?" slash-current":""),c.textContent=e.primary,o.appendChild(c),e.secondary!==void 0){let d=document.createElement("span");d.className="slash-secondary",d.textContent=e.secondary,o.appendChild(d)}if(i.appendChild(o),r){let d=document.createElement("div");d.className="slash-row-l2";let f=document.createElement("span");if(f.className="slash-path",f.textContent=e.path,d.appendChild(f),e.pathSecondary!==void 0){let h=document.createElement("span");h.className="slash-path-secondary",h.textContent=e.pathSecondary,d.appendChild(h)}i.appendChild(d)}return i}var Gt={debug:0,info:1,warn:2,error:3,off:99},_e=new Set(["off","debug","info","warn","error"]),bs=4096;function Ts(e){try{let t=new WeakSet,s=JSON.stringify(e,(i,r)=>{if(r instanceof Error)return{name:r.name,message:r.message,stack:r.stack};if(typeof r=="function")return`[Function ${r.name??"anonymous"}]`;if(typeof r=="bigint")return r.toString()+"n";if(typeof r=="symbol")return r.toString();if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r});return typeof s!="string"?String(e):s.length>bs?s.slice(0,bs)+`\u2026(truncated, ${s.length} bytes)`:s}catch{try{return String(e)}catch{return"[unserializable]"}}}function Vt(e){return e<10?"0"+e:String(e)}function tr(e){return e<10?"00"+e:e<100?"0"+e:String(e)}function Es(e){let t=new Date(e);return`${Vt(t.getHours())}:${Vt(t.getMinutes())}:${Vt(t.getSeconds())}.${tr(t.getMilliseconds())}`}var Kt="off",ks="default",Is,Wt=null;function dt(e,t="runtime"){_e.has(e)&&(Kt=e,ks=t)}function jt(){return Kt}function xs(){return ks}function ft(e){Is=e;let t=As(e);dt(t.level,t.source)}function Ls(e){Wt=e}function Cs(e){try{let s=new URL(e).searchParams.get("debug");return s===null||!_e.has(s)?null:s}catch{return null}}function nr(){return typeof location>"u"?null:Cs(location.href)}function sr(){if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(je);return!e||!_e.has(e)?null:e}catch{return null}}function As(e,t=typeof location>"u"?null:location.href){let s=t?Cs(t):null;if(s)return{level:s,source:"url"};let i=sr();return i?{level:i,source:"local"}:e&&_e.has(e)?{level:e,source:"config"}:{level:"off",source:"default"}}function Ps(e){typeof localStorage<"u"&&localStorage.setItem(je,e);let t={level:e,source:"local"};return dt(e,"local"),t}function Ms(){typeof localStorage<"u"&&localStorage.removeItem(je);let e=As(Is);return dt(e.level,e.source),e}function Rs(e){let t=(s,i,r)=>{if(Gt[s]<Gt[Kt])return;let o=e?`[${e}] `:"";try{let u=console[s];r!==void 0?u(o+i,r):u(o+i)}catch{}if(Wt)try{let u=Es(Date.now()),c=e?` [${e}]`:"",d=r!==void 0?" "+Ts(r):"";Wt(`${u}${c} ${s.toUpperCase()} ${i}${d}`)}catch{}};return{debug:(s,i)=>{t("debug",s,i)},info:(s,i)=>{t("info",s,i)},warn:(s,i)=>{t("warn",s,i)},error:(s,i)=>{t("error",s,i)},scope:s=>Rs(e?`${e}.${s}`:s)}}var S=Rs();{let e=nr();e&&dt(e)}if(typeof window<"u"){let e=S.scope("window");window.addEventListener("error",t=>{e.error(t.message||"uncaught error",{filename:t.filename,lineno:t.lineno,colno:t.colno,stack:t.error instanceof Error?t.error.stack:void 0})}),window.addEventListener("unhandledrejection",t=>{let s=t.reason;e.error("unhandled rejection",{reason:s instanceof Error?{name:s.name,message:s.message,stack:s.stack}:s})})}var X=null,J=!1,$e=!1;function zt(){if(l.planPanel.replaceChildren(),!X||J){l.planPanel.hidden=!0,l.planPanel.open=!1;return}let e=Mn(X,{className:"plan-panel-content",open:!0});l.planPanel.append(...e.childNodes),l.planPanel.hidden=!1,l.planPanel.open=$e}function ir(e){if(e.length===0||e.every(t=>t.status==="completed")){Jt();return}X||(J=!1),X=e,zt()}function Jt(){X=null,J=!1,$e=!1,zt()}function pt(e){return X?(e==="show"?J=!1:e==="hide"?(J=!0,$e=!1):(J=!J,J&&($e=!1)),zt(),!0):!1}function Ns(){return X!==null}function Os(){return X!==null&&!J}l.planPanel.addEventListener("click",e=>{let t=e.target;!(t instanceof HTMLElement)||!t.closest(".plan-summary")||($e=!l.planPanel.open)});Ne(Jt);ss(e=>{e?ir(e):Jt()});cs(()=>{St++,ee++,n.replayInProgress=!1,n.replayQueue=[]});as(e=>{typeof e.id=="string"&&U({type:"session_created",sessionId:e.id,cwd:typeof e.cwd=="string"?e.cwd:void 0,title:typeof e.title=="string"?e.title:null,configOptions:Array.isArray(e.configOptions)?e.configOptions:[],agentCommands:e.agentCommands&&typeof e.agentCommands=="object"?e.agentCommands:void 0,clientOpId:typeof e.clientOpId=="string"?e.clientOpId:void 0})});async function $(e,t){n.sessionSwitchGen++;let s=n.sessionSwitchGen;try{let i=await Ye();if(s!==n.sessionSwitchGen)return;let r=i.find(o=>o.id!==e);if(r){I(),n.sessionId=r.id,be(r.id);let[o,u]=await Promise.all([re(r.id),He(r.id)]);if(s!==n.sessionSwitchGen)return;let c=await ce(r.id,()=>s===n.sessionSwitchGen);if(s!==n.sessionSwitchGen)return;if(!c)throw new Error("Failed to hydrate fallback session");U({type:"session_created",sessionId:o.id,cwd:o.cwd,title:o.title,configOptions:o.configOptions}),u&&x(!0);return}}catch{}s===n.sessionSwitchGen&&(I(),n.sessionId=null,_({cwd:t??void 0}))}function Qt(e){return n.replayTarget?.querySelector(`[id="${e}"]`)??document.getElementById(e)}function rr(e){return n.replayTarget?.querySelector(e)??document.querySelector(e)}function Us(e){e.querySelectorAll(".plan[open]").forEach(t=>{t.open=!1})}function _s(e){(typeof navigator<"u"?navigator.serviceWorker:void 0)?.controller?.postMessage({type:"close-notification",tag:e})}function or(){if(typeof Notification>"u"||n.replayInProgress)return;let e=Notification.permission;if(e!=="granted"){if(e==="denied"){if(localStorage.getItem(Mt))return;localStorage.setItem(Mt,"1"),a("tip: notifications are blocked \u2014 allow in browser site settings to enable");return}localStorage.getItem(Pt)||(localStorage.setItem(Pt,"1"),a("tip: use /notify to enable background notifications"))}}function mt(){Pn(n.pendingPromptDone,n.pendingToolCallIds.size,n.pendingPermissionRequestIds.size)&&(z(),C(),M(),n.busyKind!=="bash"&&w(!1),n.pendingPromptDone=!1,or())}function ar(){for(let e of n.pendingToolCallIds){let t=document.getElementById(`tc-${e}`);if(!t)continue;t.className="tool-call failed";let s=t.querySelector(".icon");s&&(s.textContent="\u2717")}for(let e of n.pendingPermissionRequestIds){let t=document.querySelector(`.permission[data-request-id="${e}"]`);if(!t?.querySelector("button"))continue;let i=t.querySelector(".title")?.textContent??"\u26BF";t.innerHTML=`<span class="dim">${F(i)} \u2014 cancelled</span>`}n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear()}function lr(){for(let e of n.pendingToolCallIds){let t=document.getElementById(`tc-${e}`);if(!t)continue;t.className="tool-call completed";let s=t.querySelector(".icon");s&&(s.textContent="\u2713")}n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear()}var Vs=200;async function He(e){js();let t=++ee;n.replayInProgress=!0,n.replayQueue=[];try{let s=await Me(async d=>{let f=await fetch(`/api/v1/sessions/${e}/events?limit=${Vs}`,d?{signal:d}:void 0);return f.ok?await f.json():null});if(!s||t!==ee)return!1;let{events:i,streaming:r,hasMore:o}=Ke(s),u=document.createDocumentFragment(),c=tn(i);n.replayTarget=u;for(let d=0;d<i.length;d++){let f=JSON.parse(i[d].data);nn(i[d].type,f,i,d,c)}return n.replayTarget=null,l.messages.style.display="none",l.messages.appendChild(u),l.messages.style.display="",i.length&&(n.lastEventSeq=i[i.length-1].seq,n.oldestLoadedSeq=i[0].seq),n.hasMoreHistory=o===!0,n.hasMoreHistory&&yr(),Gs(),Zt(i,r),!0}catch{return!1}finally{t===ee&&(n.replayTarget=null,n.replayInProgress=!1,ti(e))}}function Zt(e,t){if(n.assistantRafToken!=null&&S.warn("primeStreamingState: assistantRafToken non-null at entry (missing flush upstream)"),t.thinking){let i;if(e.length){if(s(e,"thinking")>s(e,"user_message")){let r=l.messages.querySelectorAll(".thinking");i=r[r.length-1]}}else{let r=l.messages.querySelectorAll(".thinking");i=r[r.length-1]}if(i){n.currentThinkingEl=i,n.currentThinkingText=i.getAttribute("data-raw")??"",i.setAttribute("data-primed","");let r=i.querySelector("summary");r&&(r.textContent="\u283F thinking...",r.classList.add("active"))}}if(t.assistant){let i;if(e.length){if(s(e,"assistant_message")>s(e,"user_message")){let r=l.messages.querySelectorAll(".msg.assistant");i=r[r.length-1]}}else{let r=l.messages.querySelectorAll(".msg.assistant");i=r[r.length-1]}i&&(n.currentAssistantEl=i,n.currentAssistantText=i.getAttribute("data-raw")??"",i.setAttribute("data-primed",""))}function s(i,r){for(let o=i.length-1;o>=0;o--)if(i[o].type===r)return o;return-1}}function $s(e){if(!e||e.parentNode===l.messages)return;let t=e.dataset.optimisticOpId;t&&Array.from(l.messages.querySelectorAll(".msg.user[data-client-op-id]")).some(i=>i.dataset.clientOpId===t)||l.messages.appendChild(e)}function Gs(){let e=l.messages.querySelector("[data-sync-boundary]");e&&e.removeAttribute("data-sync-boundary");let t=l.messages.lastElementChild;t&&t.setAttribute("data-sync-boundary","")}var Ee=new Map,gt=!1,Te=!1,qe=null,ht=0,Ws=Promise.resolve();function Ks(e){if(n.sessionId!==e)return;if(gt){Te=!0,qe=e;return}gt=!0,qe=e;let t=ht;Ws=(async()=>{do{Te=!1;let s=Ee.has(e);await wt(e,{preserveLiveOnEmpty:!0}),s&&(Te=!0)}while(t===ht&&Te&&qe===n.sessionId)})().finally(()=>{t===ht&&(gt=!1,Te=!1,qe=null)})}function wt(e,t={}){let s=Ee.get(e);if(s)return t.preserveLiveOnEmpty&&(s.preserveLiveOnEmpty=!0),s.promise;let i={promise:Promise.resolve(!1),preserveLiveOnEmpty:t.preserveLiveOnEmpty===!0},r=cr(e,i);return i.promise=r,Ee.set(e,i),r.finally(()=>{Ee.get(e)===i&&Ee.delete(e)}).catch(()=>{}),r}async function cr(e,t){let s=++ee;n.replayInProgress=!0,n.replayQueue=[],ms();try{let i=`/api/v1/sessions/${e}/events?after=${n.lastEventSeq}`,r=await Me(async g=>{let y=await fetch(i,g?{signal:g}:void 0);return y.ok?await y.json():null});if(!r||s!==ee||n.sessionId&&n.sessionId!==e)return!1;let{events:o,streaming:u}=Ke(r);if(t.preserveLiveOnEmpty&&o.length===0)return!0;for(let g of l.messages.querySelectorAll("[data-primed]")){let y=g.getAttribute("data-raw")??"";if(g.removeAttribute("data-primed"),g.classList.contains("msg")&&g.classList.contains("assistant"))W(g),g.replaceChildren(),P(g,y,void 0,!0),B(g);else if(g.classList.contains("thinking")){let q=g.querySelector(".thinking-content");q&&(q.textContent=y);let H=g.querySelector("summary");H&&(H.textContent="\u283F thought",H.classList.remove("active"),H.style.animation="none")}}let c=null;if(n.awaitingOwnUserEcho&&n.sentMessageOpId)for(let g of l.messages.querySelectorAll("[data-optimistic-op-id]"))g.dataset.optimisticOpId===n.sentMessageOpId&&(c=g);let d=l.messages.querySelector("[data-sync-boundary]");if(d)for(;d.nextElementSibling;)d.nextElementSibling.remove();if(n.currentAssistantEl&&W(n.currentAssistantEl),n.currentAssistantEl=null,n.currentAssistantText="",n.pendingFinalAnswerToolText=null,n.currentThinkingEl=null,n.currentThinkingText="",n.currentBashEl=null,o.length===0)return Zt(o,u),$s(c),!0;!d&&n.lastEventSeq===0&&l.messages.replaceChildren();let f=document.createDocumentFragment(),h=tn(o);n.replayTarget=f;for(let g=0;g<o.length;g++){let y=JSON.parse(o[g].data);nn(o[g].type,y,o,g,h)}n.replayTarget=null;let p=l.messages.lastElementChild,m=f.firstElementChild;if(p&&m&&ei(p,m)){if(p.classList.contains("msg")&&p.classList.contains("assistant")&&m.classList.contains("msg")&&m.classList.contains("assistant")){let g=p.getAttribute("data-raw")??"",y=m.getAttribute("data-raw")??"",q=g+y;p.setAttribute("data-raw",q),W(p),p.replaceChildren(),P(p,q,void 0,!0),B(p);let H=m.dataset.lastEventSeq;H?p.dataset.lastEventSeq=H:delete p.dataset.lastEventSeq,m.remove()}else if(p.classList.contains("thinking")&&m.classList.contains("thinking")){let g=p.getAttribute("data-raw")??"",y=m.getAttribute("data-raw")??"",q=g+y;p.setAttribute("data-raw",q);let H=p.querySelector(".thinking-content");H&&(H.textContent=q);let xn=m.dataset.lastEventSeq;xn?p.dataset.lastEventSeq=xn:delete p.dataset.lastEventSeq,m.remove()}}return l.messages.appendChild(f),n.lastEventSeq=o[o.length-1].seq,Gs(),Zt(o,u),$s(c),!0}catch{return!1}finally{s===ee&&(n.replayTarget=null,n.replayInProgress=!1,ti(e))}}var fe=null,St=0,ee=0;function js(){St++}function Xt(e,t){return t===St&&n.sessionId===e}function yt(){return typeof requestAnimationFrame!="function"?Promise.resolve():new Promise(e=>requestAnimationFrame(()=>{e()}))}function zs(e){let t=e.getBoundingClientRect();for(let i of Array.from(e.children)){if(!(i instanceof HTMLElement)||i.id==="history-sentinel"||i.id==="history-loading")continue;let r=i.getBoundingClientRect();if(r.bottom>=t.top&&r.top<=t.bottom)return{el:i,top:r.top}}let s=Array.from(e.children).find(i=>i instanceof HTMLElement&&i.id!=="history-sentinel"&&i.id!=="history-loading");return s?{el:s,top:s.getBoundingClientRect().top}:null}function Js(e,t){if(!t?.el.isConnected)return 0;let s=Ys(t);return s!==0&&(e.scrollTop+=s),s}function Ys(e){return e?.el.isConnected?e.el.getBoundingClientRect().top-e.top:0}function ur(e,t){let s=Math.abs(t);return s<=4||s>e.clientHeight}function Qs(e,t){let s=zs(e);return t(),Js(e,s)}function dr(e,t,s){let i=t.lastElementChild,r=Array.from(e.children).find(o=>o.id!=="history-sentinel"&&o.id!=="history-loading"&&!o.classList.contains("history-loading"));if(!i||!r||r.hasAttribute("data-primed")||r===n.currentAssistantEl||r===n.currentThinkingEl)return{anchor:s,scrollHeightBefore:null};if(s?.el===r){let o=r.nextElementSibling;if(!o){let c=e.scrollHeight;return Yt(i,r)?{anchor:null,scrollHeightBefore:c}:{anchor:s,scrollHeightBefore:null}}let u={el:o,top:o.getBoundingClientRect().top};return Yt(i,r)?{anchor:u,scrollHeightBefore:null}:{anchor:s,scrollHeightBefore:null}}return Yt(i,r),{anchor:s,scrollHeightBefore:null}}async function fr(e){if(!(e.scrollTop>=0)){for(let t=1;t<=20;t++)if(await yt(),e.scrollTop>=0){await yt();return}e.scrollTop=0,await yt()}}async function pr(e,t){for(let s=1;s<=8;s++){await yt();let i=Ys(t);if(i!==0){if(!ur(e,i))return;e.scrollTop+=i}}}function bt(){fe&&(fe.disconnect(),fe=null)}function Tt(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(bt(),fe=new IntersectionObserver(t=>{t[0].isIntersecting&&!n.loadingOlderEvents&&n.hasMoreHistory&&n.sessionId&&Sr(n.sessionId)},{root:l.messages,rootMargin:"200px 0px 0px 0px"}),fe.observe(e))}function mr(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(bt(),fe=new IntersectionObserver(t=>{t[0].isIntersecting||Tt()},{root:l.messages,rootMargin:"200px 0px 0px 0px"}),fe.observe(e))}function gr(e=l.messages){document.getElementById("history-loading")||Qs(e,()=>{let t=document.createElement("div");t.id="history-loading",t.className="history-loading",t.setAttribute("role","status"),t.textContent="\u2191 loading\u2026";let s=document.getElementById("history-sentinel");s?s.after(t):e.prepend(t)})}function en(e=l.messages){let t=document.getElementById("history-loading");t&&Qs(e,()=>{t.remove()})}function hr(e,t){!n.hasMoreHistory||n.sessionId!==e||(t?Tt():mr())}function yr(){vt();let e=document.createElement("div");e.id="history-sentinel",e.className="history-sentinel",e.setAttribute("aria-hidden","true"),l.messages.prepend(e),Tt()}function vr(){!n.hasMoreHistory||!document.getElementById("history-sentinel")||Tt()}function vt({invalidateLoads:e=!0}={}){e&&js(),bt(),en(),document.getElementById("history-sentinel")?.remove()}async function wr(e,t){let s=await Me(async o=>{let u=await fetch(`/api/v1/sessions/${e}/events?limit=${Vs}&before=${n.oldestLoadedSeq}`,o?{signal:o}:void 0);return u.ok?await u.json():null});if(!Xt(e,t)||!s)return null;let{events:i,hasMore:r}=Ke(s);return{events:i,hasMore:r}}Ne(vt);Ne(()=>{ee++,Ee.clear(),ht++,gt=!1,Te=!1,qe=null,Ws=Promise.resolve()});async function Sr(e){if(n.loadingOlderEvents||!n.hasMoreHistory||n.oldestLoadedSeq<=0)return!1;n.loadingOlderEvents=!0;let t=++St;bt();let s=l.messages,i=!1;gr(s);try{let r=await wr(e,t);if(!r)return!1;let{events:o,hasMore:u}=r;if(await fr(s),!Xt(e,t))return!1;if(o.length===0)return n.hasMoreHistory=!1,vt({invalidateLoads:!1}),!0;let c=document.createDocumentFragment(),d=tn(o);n.replayTarget=c;for(let m=0;m<o.length;m++){let g=JSON.parse(o[m].data);nn(o[m].type,g,o,m,d)}n.replayTarget=null;let f=zs(s);en(s);let h=dr(s,c,f);f=h.anchor;let p=document.getElementById("history-sentinel");return p?p.after(c):s.prepend(c),h.scrollHeightBefore===null?Js(s,f):s.scrollTop+=s.scrollHeight-h.scrollHeightBefore,n.oldestLoadedSeq=o[0].seq,n.hasMoreHistory=u===!0,n.hasMoreHistory||vt({invalidateLoads:!1}),await pr(s,f),i=!0,!0}catch{return!1}finally{Xt(e,t)&&(en(s),n.loadingOlderEvents=!1,hr(e,i))}}function tn(e){let t=new Set;for(let s of e)if(s.type==="permission_response"){let i=JSON.parse(s.data);t.add(i.requestId)}return{toolCalls:new Map,permissions:new Map,resolvedPermissions:t,currentBashEl:null}}function Zs(e){let t=document.createElement("details");t.className="message",t.open=!0,t.setAttribute("data-message-id",e.message_id),t.setAttribute("data-raw",e.body);let s=e.from_label??e.from_ref,i=e.title?` \xB7 ${F(e.title)}`:"";t.innerHTML=`<summary>\u2709\uFE0E ${F(s)}${i}</summary><div class="message-content"></div>`;let r=t.querySelector(".message-content");r&&Pe(r,e.body),b(t),r&&B(r)}function nn(e,t,s,i,r){let o=t;if(Nn(e)){Tr(e,o,s,i,r);return}switch(e){case"prompt_done":if(n.awaitingOwnUserEcho)break;n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,w(!1);break;case"message":Zs(o);break}}function de(){return{findToolCallEl:e=>document.getElementById(`tc-${e}`),findPermissionEl:e=>document.querySelector(`.permission[data-request-id="${e}"]`),findBashEl:()=>n.currentBashEl,enhanceMarkdown:B,finalAnswerToolText:n.pendingFinalAnswerToolText}}function br(e,t,s){let i=null,r=s>0?t[s-1]:null;if(r?.type==="tool_call_update"){let o=JSON.parse(r.data);i=At(o.status??"",o.content)}return{findToolCallEl:o=>e?e.toolCalls.get(o)??null:Qt(`tc-${o}`),findPermissionEl:o=>e?e.permissions.get(o)??null:rr(`.permission[data-request-id="${o}"]`),findBashEl:()=>e?e.currentBashEl:Qt("bash-replay-pending"),isPermissionResolved:o=>e?e.resolvedPermissions.has(o):t.slice(s+1).some(u=>{let c=JSON.parse(u.data);return u.type==="permission_response"&&c.requestId===o}),enhanceMarkdown:B,finalAnswerToolText:i}}function Xs(e,t,s,i){e.querySelectorAll("button").forEach(o=>{let u=o.dataset.optionId??"",c=o.dataset.optionKind??"",d=o.textContent||"";o.onclick=()=>{An(c).apiAction==="deny"?Kn(n.sessionId,t).catch(()=>{}):Wn(n.sessionId,t,u).catch(()=>{}),e.innerHTML=`<span class="dim">\u26BF ${F(s)} \u2014 ${F(d)}</span>`,i?.()}})}function qs(e,t){t&&(e.dataset.firstEventSeq=String(t.seq),e.dataset.lastEventSeq=String(t.seq))}function Hs(e,t){t&&(e.dataset.lastEventSeq=String(t.seq))}function Bs(e,t,s){if(t<=0||t>=e.length)return!1;let i=e[t-1],r=e[t];return i.type===s&&r.seq===i.seq+1}function ei(e,t){let s=Fs(e.dataset.lastEventSeq),i=Fs(t.dataset.firstEventSeq);return s!==null&&i!==null&&i===s+1}function Fs(e){if(!e||!/^[1-9]\d*$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}function Yt(e,t){if(!ei(e,t))return!1;if(e.classList.contains("msg")&&e.classList.contains("assistant")&&t.classList.contains("msg")&&t.classList.contains("assistant")){let i=(e.getAttribute("data-raw")??"")+(t.getAttribute("data-raw")??"");On(t,e),t.setAttribute("data-raw",i),W(t),t.replaceChildren(),P(t,i,void 0,!0),B(t)}else if(e.classList.contains("thinking")&&t.classList.contains("thinking")){let i=(e.getAttribute("data-raw")??"")+(t.getAttribute("data-raw")??"");t.setAttribute("data-raw",i);let r=t.querySelector(".thinking-content");r&&(r.textContent=i)}else return!1;let s=e.dataset.firstEventSeq;return s?t.dataset.firstEventSeq=s:delete t.dataset.firstEventSeq,e.remove(),!0}function Tr(e,t,s,i,r){let o=br(r,s,i);switch(e){case"assistant_message":{let c=(n.replayTarget??l.messages).lastElementChild,d=t.text??"";if(Bs(s,i,"assistant_message")&&c?.classList.contains("msg")&&c.classList.contains("assistant")){let p=(c.getAttribute("data-raw")??"")+d;c.setAttribute("data-raw",p),W(c),c.replaceChildren(),P(c,p,void 0,!0),B(c),Hs(c,s[i]);break}let f=E(e,t,o);f&&(qs(f,s[i]),b(f));break}case"thinking":{let c=(n.replayTarget??l.messages).lastElementChild,d=t.text??"";if(Bs(s,i,"thinking")&&c?.classList.contains("thinking")){let h=c.querySelector(".thinking-content");if(h){let m=(c.getAttribute("data-raw")??"")+d;c.setAttribute("data-raw",m),h.textContent=m,Hs(c,s[i]);break}}let f=E(e,t,o);f&&(qs(f,s[i]),b(f));break}case"tool_call":{let u=E(e,t,o);u&&(b(u),r&&r.toolCalls.set(t.id,u));break}case"tool_call_update":{E(e,t,o),(t.status==="completed"||t.status==="failed")&&n.pendingToolCallIds.delete(t.id);break}case"permission_request":{let u=t.requestId,c=t.title??"",d=E(e,t,o);d&&((o.isPermissionResolved?.(u)??!1)||Xs(d,u,c),b(d),r&&r.permissions.set(u,d));break}case"bash_command":{let u=E(e,t,o);u&&(r?r.currentBashEl=u:u.id="bash-replay-pending",b(u));break}case"bash_result":{let u=r?r.currentBashEl:Qt("bash-replay-pending");u&&!r&&u.removeAttribute("id"),E(e,t,o),r&&(r.currentBashEl=null);break}case"user_message":case"plan":case"permission_response":{e==="user_message"&&n.awaitingOwnUserEcho&&s[i]?.session_id===n.sentMessageForSession&&t.clientOpId===n.sentMessageOpId&&(n.replayedOwnUserEcho=!0);let u=E(e,t,o);u&&(e==="plan"&&Us(n.replayTarget??l.messages),b(u));break}}}function ti(e){let t=n.replayQueue;n.replayQueue=[];for(let s of t){if(Er(s,e)){s.type==="user_message"&&!(n.sentMessageForSession===s.sessionId&&n.sentMessageOpId===s.clientOpId)&&(n.newTurnStarted=!0,n.turnEnded=!1);continue}U(s)}if(n.awaitingOwnUserEcho&&n.replayedOwnUserEcho){let s=n.reconcileAfterOwnUserEcho;n.awaitingOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,s&&Ks(e)}n.replayedOwnUserEcho=!1}function Er(e,t){if("sessionId"in e&&e.sessionId!==t)return!1;switch(e.type){case"tool_call":return!!document.getElementById(`tc-${e.id}`);case"permission_request":return!!document.querySelector(`.permission[data-request-id="${e.requestId}"]`);case"user_message":return typeof e.clientOpId=="string"&&Array.from(document.querySelectorAll(".msg.user[data-client-op-id]")).some(s=>s.dataset.clientOpId===e.clientOpId);case"thought_chunk":return!!n.currentThinkingEl;case"message_chunk":return!!n.currentAssistantEl;default:return!1}}function Ds(){let e=n.currentAssistantEl;if(!e)return;let t=performance.now();P(e,n.currentAssistantText,n.pendingFinalAnswerToolText??void 0);let s=performance.now(),i=s-t;if(i>8){let o=Rn(),u=d=>Math.round(d*10)/10,c={ms:u(i),len:n.currentAssistantText.length,seq:o.seq,blocks:o.blocks,hits:o.hits,misses:o.misses,fastPath:o.fastPath,lex:{total:u(o.lex),prefix:u(o.lexPrefix),tail:u(o.lexTail),prefixBlocks:o.prefixBlocks,prefixLen:o.prefixLen,tailLen:o.tailLen,mathRelex:o.mathRelex,mathRelexLen:o.mathRelexLen,tailBlocks:o.tailBlocks,tailRawBlocks:o.tailRawBlocks},parse:u(o.parse),sanitize:u(o.sanitize),dom:u(o.dom),subList:o.subList,subTable:o.subTable,defsAbsorbed:o.defsAbsorbed,linkMemoSize:o.linkMemoSize,missDetails:o.missDetails.slice(0,5).map(d=>({type:d.type,len:d.len,snip:d.snip,parseMs:u(d.parseMs),sanMs:u(d.sanMs),domMs:u(d.domMs),path:d.path,...d.items!==void 0?{items:d.items}:{}}))};i>16?S.warn("md-render budget",c):S.debug("md-render slow",c)}x();let r=performance.now();try{performance.measure("doAssistantRender",{start:t,end:r}),performance.measure("scrollToBottom",{start:s,end:r})}catch{}}function kr(){if(n.assistantRafToken==null){if(typeof requestAnimationFrame!="function"){Ds();return}n.assistantRafToken=requestAnimationFrame(()=>{n.assistantRafToken=null,Ds()})}}function Et(e){let t=n.pendingNavigationEvents.filter(s=>"sessionId"in s&&s.sessionId===e);n.pendingNavigationEvents=n.pendingNavigationEvents.filter(s=>!("sessionId"in s)||s.sessionId!==e);for(let s of t)U(s)}function U(e){if(e.type==="inbox_count_changed"){it(e.pendingCount);return}if(n.replayInProgress){n.replayQueue.push(e);return}let t="sessionId"in e?e.sessionId:void 0;if(e.type==="state_patch"&&n.runtimeHydrationSessionId===e.sessionId){n.pendingNavigationEvents.push(e);return}if(t&&e.type!=="session_created"&&n.sessionId===null&&n.pendingNavigationSessionId===t){n.pendingNavigationEvents.push(e);return}let s="sessionId"in e?e.sessionId:void 0;if(!(s&&e.type!=="session_created"&&e.type!=="session_deleted"&&(!n.sessionId||s!==n.sessionId)))switch(e.type){case"connected":if(e.cancelTimeout!=null&&(n.cancelTimeout=e.cancelTimeout),e.recentPathsLimit!=null&&(n.recentPathsLimit=e.recentPathsLimit),ft(e.debugLevel),n.agentReloading){n.agentReloading=!1;let i=e.agent.name,r=e.agent.version,o=i&&r?`${i} ${r}`:"Agent";a(`${o} reloaded.`),w(!1)}break;case"state_patch":{let i=n.cancelStatus,r=Ht({seq:e.seq,patch:e.patch});if(r&&i!=="unconfirmed"&&n.cancelStatus==="unconfirmed"&&a("Cancel was not acknowledged \u2014 retry ^C or use /reload to restart the agent."),!r&&n.sessionId===e.sessionId){let o=n.sessionId;ot(o,()=>n.sessionId===o)}break}case"available_commands_update":rt({epoch:e.epoch??"",revision:e.revision??0,commands:e.commands})&&l.input.dispatchEvent(new window.Event("input",{bubbles:!0}));break;case"session_created":{let i=n.awaitingNewSession&&n.pendingNewSessionOpId===e.clientOpId;if(n.pendingNewSessionOpId&&!i||(i&&ae(e.clientOpId),n.pendingNavigationSessionId&&e.sessionId!==n.pendingNavigationSessionId)||!n.awaitingNewSession&&n.sessionId&&e.sessionId!==n.sessionId)break;n.awaitingNewSession=!1,n.pendingNavigationSessionId=null;let r=n.sessionId===null;n.sessionId=e.sessionId,r&&vr(),n.sessionCwd=e.cwd??n.sessionCwd,n.sessionTitle=e.title??null,e.agentCommands&&rt(e.agentCommands),e.configOptions&&e.configOptions.length&&qt(e.configOptions),k(),D(),be(n.sessionId),n.clientId&&ye(n.clientId,!document.hidden,n.sessionId).catch(()=>{}),at(n.sessionId,n.sessionTitle),le("connected","connected"),l.input.disabled=!1,l.sendBtn.disabled=!1;{let o=document.getElementById("bash-replay-pending");o?(o.removeAttribute("id"),o.querySelector(".bash-cmd")?.classList.add("running"),n.currentBashEl=o):n.currentBashEl=null}l.messages.children.length===0&&a(`Session created: ${n.sessionTitle??e.sessionId.slice(0,8)+"\u2026"}`),D();break}case"user_message":{if(n.sentMessageForSession===e.sessionId&&n.sentMessageOpId===e.clientOpId){let i=n.reconcileAfterOwnUserEcho;n.sentMessageForSession=null,n.sentMessageOpId=null,n.awaitingOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,i&&Ks(e.sessionId);break}if(C(),M(),n.newTurnStarted=!0,n.turnEnded=!1,e.sessionId===n.sessionId){let i=E("user_message",e,de());i&&b(i)}break}case"message_chunk":if(n.turnEnded)break;z(),C(),n.currentAssistantEl||(n.currentAssistantEl=ct("assistant",""),n.currentAssistantText=""),n.currentAssistantText+=e.text,kr();break;case"thought_chunk":if(n.turnEnded)break;z(),n.currentThinkingEl||(n.currentThinkingEl=document.createElement("details"),n.currentThinkingEl.className="thinking",n.currentThinkingEl.innerHTML='<summary class="active">\u283F thinking...</summary><div class="thinking-content"></div>',n.currentThinkingText="",b(n.currentThinkingEl)),n.currentThinkingText+=e.text,n.currentThinkingEl.querySelector(".thinking-content").textContent=n.currentThinkingText,x();break;case"tool_call":{if(n.turnEnded)break;n.pendingToolCallIds.add(e.id),w(!0),z(),C(),M();let i=E("tool_call",e,de());i&&b(i);break}case"tool_call_update":{(e.status==="completed"||e.status==="failed")&&n.pendingToolCallIds.delete(e.id),e.status==="completed"&&(n.pendingFinalAnswerToolText=At(e.status,e.content),n.currentAssistantEl&&n.pendingFinalAnswerToolText&&P(n.currentAssistantEl,n.currentAssistantText,n.pendingFinalAnswerToolText)),E("tool_call_update",e,de()),mt(),x();break}case"plan":{C(),M();let i=E("plan",e,de());i&&(Us(l.messages),b(i));break}case"permission_request":{if(n.turnEnded||document.querySelector(`.permission[data-request-id="${e.requestId}"]`))break;n.pendingPermissionRequestIds.add(e.requestId),w(!0),C();let i=E("permission_request",e,de());if(i){let r=e.requestId;Xs(i,r,e.title,()=>{n.pendingPermissionRequestIds.delete(r),mt()}),b(i)}break}case"permission_response":{n.pendingPermissionRequestIds.delete(e.requestId),e.sessionId===n.sessionId&&E("permission_response",e,de()),mt();break}case"bash_command":{if(n.sentBashForSession===e.sessionId){n.sentBashForSession=null;break}if(e.sessionId===n.sessionId){let i=E("bash_command",e,de());i&&(i.querySelector(".bash-cmd").classList.add("running"),b(i),n.currentBashEl=i),w(!0)}break}case"bash_output":{if(e.sessionId!==n.sessionId)break;if(n.currentBashEl){let i=n.currentBashEl.querySelector(".bash-output");if(!i)break;if(e.stream==="stderr"){let r=document.createElement("span");r.className="stderr",r.textContent=e.text,i.appendChild(r)}else i.appendChild(document.createTextNode(e.text));i.classList.add("has-content"),i.scrollTop=i.scrollHeight,x()}break}case"bash_done":{if(e.sessionId!==n.sessionId)break;ut(n.currentBashEl,e.code,e.signal),e.error&&a(`err: ${e.error}`),n.busyKind!=="agent"&&w(!1);break}case"prompt_done":{if(Se(),e.promptId&&n.currentPromptId&&e.promptId!==n.currentPromptId){S.warn("dropping completion from a superseded turn",{sessionId:e.sessionId,stopReason:e.stopReason,promptId:e.promptId,currentPromptId:n.currentPromptId}),C(),M();break}if(n.awaitingOwnUserEcho){S.warn("dropping stale prompt_done during own-echo window",{sessionId:e.sessionId,stopReason:e.stopReason}),n.reconcileAfterOwnUserEcho=!0;break}if(e.stopReason==="cancelled"&&n.newTurnStarted){n.newTurnStarted=!1,C(),M();break}n.newTurnStarted=!1,e.stopReason==="cancelled"?ar():lr(),n.turnEnded=!0,n.pendingPromptDone=!0,mt();break}case"session_deleted":e.sessionId===n.sessionId&&$(e.sessionId,n.sessionCwd??void 0);break;case"session_expired":{$(n.sessionId,n.sessionCwd??void 0);break}case"config_set":{Xn(e.configId,e.value);let i=j(e.configId),r=i?.name??e.configId,o=typeof e.value=="string"?i?.options.find(u=>u.value===e.value)?.name??e.value:String(e.value);a(`ok: ${r}: ${o}`),e.configId==="mode"&&k(),D();break}case"config_option_update":e.configOptions.length&&qt(e.configOptions);break;case"session_title_updated":e.sessionId===n.sessionId&&(n.sessionTitle=e.title,at(n.sessionId,n.sessionTitle));break;case"agent_reloading":n.agentReloading=!0,a("Agent reloading\u2026"),w(!0);break;case"agent_reloading_failed":a(`err: Agent reload failed: ${e.error}`),w(!1);break;case"error":if(e.promptId&&n.currentPromptId&&e.promptId!==n.currentPromptId){S.warn("dropping failure from a superseded turn",{sessionId:e.sessionId,message:e.message,promptId:e.promptId,currentPromptId:n.currentPromptId});break}if(n.awaitingOwnUserEcho){S.warn("dropping stale error during own-echo window",{sessionId:e.sessionId,message:e.message}),n.reconcileAfterOwnUserEcho=!0;break}n.awaitingNewSession=!1,n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,z(),C(),M(),a(`err: ${e.message}`),n.busyKind!=="bash"&&w(!1);break;case"message_created":break;case"message_consumed":_s(`msg-${e.messageId}`);break;case"message_acked":_s(`msg-${e.messageId}`);break;case"message":e.sessionId===n.sessionId&&(Zs(e),x());break;default:break}}var ii="message",ni=null;async function ke(e){if(n.messageNavigationGen++,n.sessionId===e)return"unchanged";n.sessionSwitchGen++;let t=n.sessionSwitchGen,s=n.sessionId;ae(),n.awaitingNewSession=!1,n.pendingNavigationSessionId=null,n.pendingNavigationEvents=[],be(e),I(),n.sessionId=null,n.pendingNavigationSessionId=e;let i=()=>t===n.sessionSwitchGen&&n.pendingNavigationSessionId===e;try{let[r,o]=await Promise.all([re(e),He(e)]);if(!i())return"ignored";if(!await ce(e,i)){if(!i())return"ignored";throw new Error("Failed to hydrate session snapshot")}return i()?(U({type:"session_created",sessionId:r.id,cwd:r.cwd,title:r.title,configOptions:r.configOptions}),Et(e),o&&x(!0),"switched"):"ignored"}catch(r){throw i()&&(I(),n.sessionId=null,s&&be(s)),r}}async function kt(e){let t=++n.messageNavigationGen,s=await Jn(e,n.sessionId);return t!==n.messageNavigationGen?"ignored":(a(s.alreadyConsumed?`inbox: already consumed \u2192 switching to ${s.sessionId}`:`inbox: opened as ${s.sessionId}`),ke(s.sessionId))}async function ri(e){return e.sessionId?ke(e.sessionId):e.messageId?kt(e.messageId):"ignored"}function sn(){let e=new URL(location.href).searchParams.get(ii);return e&&e.length<=256?e:null}function si(){let e=new URL(location.href);e.searchParams.delete(ii),history.replaceState(null,"",`${e.pathname}${e.search}${e.hash}`)}async function oi(){let e=sn();if(!e||ni===e)return"ignored";ni=e;try{let t=await kt(e);return si(),t}catch(t){let s=t instanceof ie&&(t.status===v.BAD_REQUEST||t.status===v.NOT_FOUND);s&&(si(),n.sessionId||_());let i=t instanceof Error?t.message:String(t);return a(`err: notification consume failed (${i})`),s?"terminal-error":"retryable-error"}}async function Be({cwd:e,showCwd:t=!1}={}){if(!n.sessionId){a("warn: No active session");return}let s=n.sessionId,i=e??n.sessionCwd??void 0;if(n.busy){a("err: Cancel active work before clearing the session");return}if(I(),a(t&&i?`Clearing session and starting at ${i}\u2026`:"Clearing session\u2026"),!await Bt({cwd:i,inheritFromSessionId:s})){a("err: Failed to clear session");return}try{await ge(s)}catch(o){a(`err: Failed to delete previous session \u2014 ${String(o)}`)}}var Fe=S.scope("share");function Ir(e,t){return e.startsWith("http")?e:e?`${location.origin}${e}`:`${location.origin}/s/${t}`}async function It(){if(!n.sessionId){a("share: no active session");return}let e=n.sessionId;try{let t=await fetch(`/api/v1/sessions/${encodeURIComponent(e)}/share`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({}),credentials:"same-origin"});if(!t.ok){let r=await t.text();t.status===v.CONFLICT?a("share: session busy (agent streaming) \u2014 retry after the response completes"):t.status===v.FORBIDDEN?a("share: forbidden (not owner)"):t.status===v.BAD_REQUEST&&r.includes("sanitize")?a(`share: \u2717 sanitize blocked this session \u2014 ${r}`):a(`share: create failed ${t.status} \u2014 ${r.slice(0,200)}`);return}let s=await t.json();n.previewToken=s.token,k();let i=s.reused?"reused":"ready";a(`share: preview ${i} \u2014 ^P publish \xB7 ^C cancel`)}catch(t){Fe.error("preview create error",{err:t}),a(`share: network error \u2014 ${String(t)}`)}}async function rn(){if(!n.sessionId){a("share: no active session");return}if(!n.previewToken){a("share: no preview to publish \u2014 run /share first");return}let e=n.sessionId,t=n.previewToken;try{let s=await fetch(`/api/v1/sessions/${encodeURIComponent(e)}/share/publish`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t}),credentials:"same-origin"});if(!s.ok){let c=await s.text();s.status===v.FORBIDDEN?a("share: forbidden (not owner)"):s.status===v.NOT_FOUND?a("share: token not found (already revoked?)"):a(`share: publish failed ${s.status} \u2014 ${c.slice(0,200)}`);return}let i=await s.json(),r=Ir(i.public_url,i.token);n.previewToken=null,k();let o=a(`share: published
|
|
2
|
-
`),u=document.createElement("a");u.href=r,u.textContent=r,u.target="_blank",u.rel="noopener noreferrer",o.appendChild(u)}catch(s){Fe.error("publish error",{err:s}),a(`share: network error \u2014 ${String(s)}`)}}function on(){if(!n.previewToken){a("share: no preview active");return}n.previewToken=null,k(),a("share: preview canceled")}async function an(){let e=await fetch("/api/v1/shares",{credentials:"same-origin"});if(!e.ok)throw new Error(`list failed ${e.status}`);return(await e.json()).shares.filter(s=>s.shared_at!=null)}async function xt(e){if(!e){a("share: usage \u2014 /share revoke <token>");return}try{let s=(await xr()).find(o=>o.token===e);if(!s){a("share: token not found (already revoked?)");return}let i=await fetch(`/api/v1/sessions/${encodeURIComponent(s.session_id)}/share`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:e}),credentials:"same-origin"});if(!i.ok){i.status===v.FORBIDDEN?a("share: forbidden (not owner)"):i.status===v.NOT_FOUND?a(`share: ${e} already revoked`):a(`share: revoke failed ${i.status}`);return}let r=await i.json();a(r.revoked?`share: revoked ${e}`:`share: ${e} already revoked`)}catch(t){Fe.error("revoke error",{err:t}),a(`share: network error \u2014 ${String(t)}`)}}async function xr(){let e=await fetch("/api/v1/shares",{credentials:"same-origin"});if(!e.ok)throw new Error(`list failed ${e.status}`);return(await e.json()).shares.filter(s=>s.shared_at!=null)}function De(e){let t=`${location.origin}/s/${e}`;window.open(t,"_blank","noopener"),a(`share: opened ${t}`)}async function ai(){try{let e=await fetch("/api/v1/share/by",{credentials:"same-origin"});return e.ok?(await e.json()).value:null}catch{return null}}async function Ue(e){try{let t=await fetch("/api/v1/share/by",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:e}),credentials:"same-origin"});if(!t.ok){let i=await t.text();a(`share: set author failed ${t.status} \u2014 ${i.slice(0,200)}`);return}let s=await t.json();if(n.previewToken&&n.sessionId)try{await fetch(`/api/v1/sessions/${encodeURIComponent(n.sessionId)}/share`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:n.previewToken,display_name:s.value??""}),credentials:"same-origin"})}catch(i){Fe.warn("by: preview patch failed",{err:i})}a(s.value?`share: author set to '${s.value}'`:"share: author cleared (publish anonymously)")}catch(t){Fe.error("by error",{err:t}),a(`share: network error \u2014 ${String(t)}`)}}var Ie=!1;async function fi(){try{Ie=await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{Ie=!1}}function Lr(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s),r=new Uint8Array(i.length);for(let o=0;o<i.length;o++)r[o]=i.charCodeAt(o);return r}async function Cr(){try{let e=await navigator.serviceWorker.ready,t=await fetch("/api/beta/push/vapid-key");if(!t.ok)return;let{publicKey:s}=await t.json(),r=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Lr(s)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:r.endpoint,keys:r.keys,clientId:n.clientId})})}catch(e){S.scope("push").error("subscribe failed",{err:e})}}async function Ar(){try{let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!t)return;let s=t.endpoint;await t.unsubscribe(),await fetch("/api/beta/push/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:s})})}catch(e){S.scope("push").error("unsubscribe failed",{err:e})}}async function Pr(){return(await fetch("/api/v1/sessions")).json()}async function li(){let e=n.recentPathsLimit,t=e>0?`/api/v1/recent-paths?limit=${e}`:"/api/v1/recent-paths";return(await(await fetch(t)).json()).map(r=>({cwd:r.cwd,time:r.last_used_at}))}var ci=async()=>{let{messages:e}=await Re();return e},ui=async()=>et();function cn(){return`log: ${jt()} (${xs()})`}function pi(){a(`${cn()} \u2014 use /log <off|debug|info|warn|error|reset>`)}function un(e){Ps(e),a(`${cn()} saved`),e!=="off"&&S.info("log enabled",{level:e})}function dn(){Ms(),a(`${cn()} reset`)}async function fn(){a("Resetting local state\u2026");let e=await _n();e.errors.length&&a(`warn: reset had issues: ${e.errors.join("; ")}`),location.reload()}async function Mr(e,t,s){let i=j(e);i&&(i.currentValue=t),k(),D(),a(`${i?.name??e} \u2192 ${s}`),n.sessionId&&await he(n.sessionId,e,t).catch(()=>{})}async function pn(e){try{await kt(e.id)}catch(t){a(`err: consume failed (${t.message})`)}}async function Rr(e){try{await Xe(e.id),a(`inbox: ack ${e.id}`)}catch(t){a(`err: ack failed (${t.message})`)}}async function Nr(e){if(!/^[A-Za-z0-9_-]{1,64}$/.test(e)){a("err: token name must match [A-Za-z0-9_-]{1,64}");return}try{let t=await tt(e);a(`token: created ${t.name} (${t.scope})`),a(`${t.token}`),a("\u2014 save this now; it will never be shown again")}catch(t){let s=t;s.status===v.CONFLICT?a(`err: token "${e}" already exists`):s.status===v.FORBIDDEN?a("err: admin scope required to manage tokens"):a(`err: create failed (${s.message})`)}}async function Or(e){try{await nt(e),a(`token: revoked ${e}`)}catch(t){let s=t;s.status===v.NOT_FOUND?a(`err: no token named "${e}"`):s.status===v.FORBIDDEN?a("err: admin scope required to manage tokens"):s.status===v.BAD_REQUEST&&/using|yourself|cannot/i.test(s.message)?a("err: can't revoke the token you're signed in with \u2014 use another admin token"):a(`err: revoke failed (${s.message})`)}}async function _r(){if(typeof Notification>"u"){a("err: notifications not supported in this browser");return}if(Notification.permission==="denied"){a("notify: blocked \u2014 allow in browser site settings to enable");return}if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted"){a("notify: blocked \u2014 allow in browser site settings to enable");return}await fi();let e=Ie;await Cr(),Ie=!0,a(e?"notify: already enabled":"notify: enabled")}async function $r(){await Ar(),Ie=!1,a("notify: disabled")}function di(e,t){let s=e.shared_at?A(e.shared_at):"\u2014";return{primary:e.token,secondary:e.session_title??void 0,path:`/s/${e.token}`,pathSecondary:s,onSelect:()=>{t==="open"?De(e.token):xt(e.token)}}}var pe={name:"<root>",children:[{name:"/cancel",desc:"Cancel current response",onSelect:()=>{n.busy?we().then(()=>a("^C cancelling\u2026")).catch(e=>{a(`err: cancel failed \u2014 ${String(e)}`)}):a("Nothing to cancel.")}},{name:"/clear",desc:"Clear current session",fetch:li,toSpec:e=>{let t=e,s=t.cwd.toLowerCase()===(n.sessionCwd??"").toLowerCase();return{primary:t.cwd,current:s,onSelect:()=>{Be({cwd:t.cwd,showCwd:!0})}}},freeform:e=>{let t=e.trim();return t?{primary:`clear and start at '${t}'`,onSelect:()=>{Be({cwd:t,showCwd:!0})}}:null}},{name:"/log",desc:"Set log level",fetch:()=>[{value:"reset",name:"reset",desc:"Follow config/default"},{value:"off",name:"off",desc:"Disable logging"},{value:"error",name:"error",desc:"Show errors only"},{value:"warn",name:"warn",desc:"Show warnings and errors"},{value:"info",name:"info",desc:"Show info, warnings, errors"},{value:"debug",name:"debug",desc:"Show all messages"}],toSpec:e=>{let t=e;return{primary:t.name,secondary:t.desc,current:t.value!=="reset"&&t.value===jt(),onSelect:()=>{if(t.value==="reset"){dn();return}un(t.value)}}}},{name:"/plan",desc:"Toggle plan panel",fetch:()=>[{value:"show",name:"show",desc:"Show plan panel"},{value:"hide",name:"hide",desc:"Hide plan panel"}],toSpec:e=>{let t=e;return{primary:t.name,secondary:t.desc,current:Ns()&&t.value==="show"===Os(),onSelect:()=>{pt(t.value)}}}},{name:"/reset",desc:"Reset local state",onSelect:()=>{fn()}},{name:"/exit",desc:"End current session",onSelect:async()=>{if(!n.sessionId){a("warn: No active session");return}let e=n.sessionId;try{if(n.busy){a("err: Cancel active work before exiting the session");return}await ge(e),await $(e,n.sessionCwd??void 0)}catch{a("err: Failed to exit session")}}},{name:"/help",desc:"Show help",onSelect:()=>{qr()}},{name:"/inbox",desc:"Manage inbox",fetch:ci,toSpec:e=>{let t=e,s=t.from_label??t.from_ref,i=A(t.created_at);return{primary:t.title,secondary:i,path:t.cwd??"",pathSecondary:s,onSelect:()=>pn(t)}},children:[{name:"dismiss",desc:"Dismiss only",fetch:ci,toSpec:e=>{let t=e,s=t.from_label??t.from_ref,i=A(t.created_at);return{primary:t.title,secondary:i,path:t.cwd??"",pathSecondary:s,onSelect:()=>Rr(t)}}}]},{name:"/logout",desc:"Log out",onSelect:()=>{try{localStorage.removeItem(G)}catch{}try{n.eventSource?.close()}catch{}a("Logged out."),location.replace("/login")}},ln("/mode","Switch mode","mode"),ln("/model","Switch model","model",!0),{name:"/new",desc:"Create new session",fetch:li,toSpec:e=>{let t=e,s=t.cwd.toLowerCase()===(n.sessionCwd??"").toLowerCase();return{primary:t.cwd,current:s,onSelect:()=>{I(),a("Creating new session\u2026"),_({cwd:t.cwd})}}},freeform:e=>{let t=e.trim();return t?{primary:`create session at '${t}'`,onSelect:()=>{I(),a("Creating new session\u2026"),_({cwd:t})}}:null}},{name:"/notify",desc:"Toggle notifications",fetch:async()=>(await fi(),[{value:"on",name:"on",desc:"Enable notifications"},{value:"off",name:"off",desc:"Disable notifications"}]),toSpec:e=>{let t=e,s=t.value==="on"===Ie;return{primary:t.name,secondary:t.desc,current:s,onSelect:t.value==="on"?_r:$r}}},{name:"/reload",desc:"Reload agent",onSelect:()=>{a("Reloading agent\u2026"),Ze().catch(e=>{a(`err: ${e instanceof Error?e.message:"Failed to reload agent"}`)})}},{name:"/rename",desc:"Rename session",freeform:e=>{let t=e.trim();return t?{primary:`rename to '${t}'`,onSelect:async()=>{if(!n.sessionId){a("err: No active session");return}try{await Qe(n.sessionId,t),a(`Renamed \u2192 ${t}`)}catch{a("err: Failed to rename session")}}}:null}},{name:"/share",desc:"Share a read-only snapshot",fetch:an,toSpec:e=>di(e,"open"),freeform:e=>{let t=e.trim();return t?{primary:`open share '${t}'`,onSelect:()=>{De(t)}}:{primary:"create new share preview",onSelect:()=>It()}},children:[{name:"by",desc:"Set author",fetch:async()=>[{value:await ai()}],toSpec:e=>{let t=e.value;return{primary:t??"(none)",secondary:t?"current \u2014 Enter to clear":"currently anonymous",onSelect:()=>Ue(null)}},freeform:e=>{let t=e.trim();return t?{primary:`set author to '${t}'`,onSelect:()=>Ue(t)}:null}},{name:"revoke",desc:"Revoke a share",fetch:an,toSpec:e=>di(e,"revoke")}]},{name:"/switch",desc:"Switch session",fetch:Pr,matches:(e,t)=>{let s=e;return(s.title??"").toLowerCase().includes(t)||s.id.startsWith(t)},toSpec:e=>{let t=e,s=t.title??t.id,i=A(t.last_active_at);return{primary:s,secondary:i,path:t.cwd,current:t.id===n.sessionId,onSelect:async()=>{try{await ke(t.id)}catch{a("err: Failed to switch session")}}}}},ln("/think","Set thinking effort","reasoning_effort"),{name:"/token",desc:"Manage API tokens",fetch:ui,toSpec:e=>{let t=e,s=t.lastUsedAt?A(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${s}`,path:`${t.scope} \xB7 created ${A(t.createdAt)}`,current:t.isSelf,onSelect:t.isSelf?void 0:()=>{a(`\u2014 use /token revoke ${t.name} to revoke`)}}},freeform:e=>{let t=e.trim();return/^[A-Za-z0-9_-]{1,64}$/.test(t)?{primary:`create token '${t}'`,onSelect:()=>Nr(t)}:null},children:[{name:"revoke",desc:"Revoke token",fetch:async()=>(await ui()).filter(e=>!e.isSelf),toSpec:e=>{let t=e,s=t.lastUsedAt?A(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${s}`,path:`${t.scope} \xB7 created ${A(t.createdAt)}`,onSelect:()=>Or(t.name)}}}]}]};function ln(e,t,s,i=!1){return{name:e,desc:t,fetch:()=>{let r=j(s);return r?r.options:[]},toSpec:r=>{let o=r,u=$t(s);return{primary:o.name,secondary:i?`(${o.value})`:void 0,current:o.value===u,onSelect:()=>Mr(s,o.value,o.name)}},matches:i?(r,o)=>{let u=r;return u.name.toLowerCase().includes(o)||u.value.toLowerCase().includes(o)}:void 0}}function qr(){let e=[];n.serverVersion&&e.push(`WebAgent ${n.serverVersion}`),n.agentName&&n.agentVersion&&e.push(`${n.agentName} ${n.agentVersion}`),e.length&&a(e.join(" \xB7 ")),a("\u203A has next step * current value"),a("Tab completes \xB7 Enter sends raw text"),a("? \u2014 Show help"),a("!<command> \u2014 Run bash command"),a("// \u2014 Agent commands (agent-specific)");for(let t of pe.children)a(`${t.name} \u2014 ${t.desc??""}`);a("--- Shortcuts ---");for(let t of Hr)a(`${t.key} \u2014 ${t.desc}`);a("--- Tips ---");for(let t of Br)a(t.text)}var Hr=[{key:"Enter",desc:"Send message"},{key:"Shift+Enter",desc:"New line"},{key:"^C",desc:"Cancel current response"},{key:"^M",desc:"Cycle mode (Agent \u2192 Plan \u2192 Autopilot)"},{key:"^U",desc:"Attach file (any type)"}],Br=[{text:"Tap \u276F prompt to cycle mode"}];async function Fr(){try{let e=await navigator.serviceWorker.ready,t=await fetch("/api/beta/push/vapid-key");if(!t.ok)return;let{publicKey:s}=await t.json(),r=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Ur(s)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:r.endpoint,keys:r.keys,clientId:n.clientId})})}catch(e){S.scope("push").error("subscribe failed",{err:e})}}async function Dr(){try{let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!t)return;let s=t.endpoint;await t.unsubscribe(),await fetch("/api/beta/push/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:s})})}catch(e){S.scope("push").error("unsubscribe failed",{err:e})}}function Ur(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s),r=new Uint8Array(i.length);for(let o=0;o<i.length;o++)r[o]=i.charCodeAt(o);return r}async function mi(){try{return await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{return!1}}async function mn(e){let t=e.split(/\s+/),s=t[0].toLowerCase(),i=t.slice(1).join(" ").trim();switch(s){case"/plan":{let r=i.toLowerCase()||"toggle";return r!=="show"&&r!=="hide"&&r!=="toggle"?(a("plan: use /plan, /plan show, or /plan hide"),!0):(pt(r),!0)}case"/share":{let r=i.split(/\s+/),o=(r[0]??"").toLowerCase();if(o==="")return await It(),!0;if(o==="revoke"){let c=r[1]??"";return await xt(c),!0}if(o==="by"){let c=i.replace(/^by(\s+|$)/i,"").trim();return await Ue(c===""?null:c),!0}let u=r[0]??"";return/^[A-Za-z0-9_-]{24}$/.test(u)?(De(u),!0):(a(`share: unknown subcommand '${o}' \u2014 try /share, /share by <name>, /share <token>, or /share revoke <token>`),!0)}case"/new":{let r=i||n.sessionCwd||void 0,o=n.sessionId;return I(),n.sessionId=null,a("Creating new session\u2026"),_({cwd:r,inheritFromSessionId:o}),!0}case"/rename":{if(!n.sessionId)return a("err: No active session"),!0;if(!i)return a(`Current: ${n.sessionTitle??"(untitled)"}`),a("Usage: /rename <new title>"),!0;try{await Qe(n.sessionId,i),a(`Renamed \u2192 ${i}`)}catch{a("err: Failed to rename session")}return!0}case"/sessions":return a("Removed. Use /switch to see all sessions."),!0;case"/clear":return await Be({cwd:i||void 0,showCwd:!!i}),!0;case"/exit":{if(!n.sessionId)return a("warn: No active session"),!0;let r=n.sessionId;try{if(n.busy)return a("err: Cancel active work before exiting the session"),!0;await ge(r),await $(r,n.sessionCwd??void 0)}catch{a("err: Failed to exit session")}return!0}case"/logout":{try{localStorage.removeItem(G)}catch{}try{n.eventSource?.close()}catch{}return a("Logged out."),location.replace("/login"),!0}case"/token":{let r=i.trim().split(/\s+/).filter(Boolean),o=r[0];if(!o){try{let c=await et();if(c.length===0)return a("token: (none)"),!0;for(let d of c){let f=d.lastUsedAt?A(d.lastUsedAt):"never";a(`${d.name} (${d.scope}) \u2014 created ${A(d.createdAt)}, last used ${f}`)}a("\u2014 /token <name> to create \xB7 /token revoke <name> to revoke")}catch(c){let d=c;d.status===v.FORBIDDEN?a("err: admin scope required to manage tokens"):a(`err: token list failed (${d.message})`)}return!0}if(o==="revoke"){let c=r[1];if(!c)return a("err: usage /token revoke <name>"),!0;try{await nt(c),a(`token: revoked ${c}`)}catch(d){let f=d;f.status===v.NOT_FOUND?a(`err: no token named "${c}"`):f.status===v.FORBIDDEN?a("err: admin scope required to manage tokens"):f.status===v.BAD_REQUEST&&/using|yourself|cannot/i.test(f.message)?a("err: can't revoke the token you're signed in with \u2014 use another admin token"):a(`err: revoke failed (${f.message})`)}return!0}let u=o;if(!/^[A-Za-z0-9_-]{1,64}$/.test(u))return a("err: token name must match [A-Za-z0-9_-]{1,64}"),!0;try{let c=await tt(u);a(`token: created ${c.name} (${c.scope})`),a(`${c.token}`),a("\u2014 save this now; it will never be shown again")}catch(c){let d=c;d.status===v.CONFLICT?a(`err: token "${u}" already exists`):d.status===v.FORBIDDEN?a("err: admin scope required to manage tokens"):a(`err: create failed (${d.message})`)}return!0}case"/switch":{if(!i)return a("Usage: /switch <title or id prefix>"),!0;try{let o=await(await fetch("/api/v1/sessions")).json(),u=i.toLowerCase(),c=o.find(d=>d.id.startsWith(i)||d.title?.toLowerCase().includes(u));if(!c)return a(`err: No session matching "${i}"`),!0;await ke(c.id)}catch{a("err: Failed to switch session")}return!0}case"/cancel":return n.busy?we().then(()=>a("^C cancelling\u2026")).catch(r=>{a(`err: cancel failed \u2014 ${String(r)}`)}):a("Nothing to cancel."),!0;case"/reload":return a("Reloading agent\u2026"),Ze().then(()=>{}).catch(r=>{a(`err: ${r instanceof Error?r.message:"Failed to reload agent"}`)}),!0;case"/help":case"?":{let r=[];n.serverVersion&&r.push(`WebAgent ${n.serverVersion}`),n.agentName&&n.agentVersion&&r.push(`${n.agentName} ${n.agentVersion}`),r.length&&a(r.join(" \xB7 ")),a("\u203A has next step * current value"),a("Tab completes \xB7 Enter sends raw text"),a("? \u2014 Show help"),a("!<command> \u2014 Run bash command"),a("// \u2014 Agent commands (agent-specific)");for(let o of pe.children)a(`${o.name} \u2014 ${o.desc??""}`);return a("--- Shortcuts ---"),a("Enter \u2014 Send message"),a("Shift+Enter \u2014 New line"),a("^C \u2014 Cancel current response"),a("^M \u2014 Cycle mode (Agent \u2192 Plan \u2192 Autopilot)"),a("^U \u2014 Attach file (any type)"),a("--- Tips ---"),a("Tap \u276F prompt to cycle mode"),!0}case"/model":case"/mode":case"/think":{let o={"/model":"model","/mode":"mode","/think":"reasoning_effort"}[s],u=j(o);if(!i){let p=u?.options.find(m=>m.value===u.currentValue)?.name??u?.currentValue??"unknown";return a(`${u?.name??o}: ${p}`),a(`Type ${s} + space to pick from list`),!0}if(!u)return a(`err: ${s.slice(1)} is not available.`),!0;let c=i.trim(),d=p=>p.toLowerCase().replace(/[\s_]+/g,"-"),f=d(c),h=u.options.find(p=>d(p.value)===f||d(p.name)===f);if(!h){let p=u.options.filter(m=>d(m.value).includes(f)||d(m.name).includes(f));if(p.length===1)h=p[0];else if(p.length>1)return a(`err: Ambiguous "${i}". Type ${s} + space to see options.`),!0}return h?(u.currentValue=h.value,k(),D(),a(`${u.name} \u2192 ${h.name}`),await he(n.sessionId,o,h.value).catch(()=>{}),!0):(a(`err: Unknown "${i}". Type ${s} + space to see options.`),!0)}case"/inbox":{let r=i.trim().split(/\s+/).filter(Boolean),o=r[0];if(!o){try{let{messages:p}=await Re();if(p.length===0)return a("inbox: empty"),!0;for(let m of p){let g=m.from_label??m.from_ref,y=A(m.created_at);a(`${m.id} \xB7 ${m.title} \xB7 ${g} \xB7 ${y}`)}a("\u2014 /inbox <id> to open \xB7 /inbox dismiss <id> to dismiss only")}catch(p){a(`err: inbox list failed (${p.message})`)}return!0}let u=o==="dismiss",c=u?r[1]:o;if(!c)return a("err: usage /inbox <id> | /inbox dismiss <id>"),!0;let d;try{({messages:d}=await Re())}catch(p){return a(`err: inbox list failed (${p.message})`),!0}let f=c.toLowerCase(),h=d.find(p=>p.id===c)??d.find(p=>p.id.toLowerCase().startsWith(f))??d.find(p=>p.title.toLowerCase().includes(f));if(!h)return a(`err: no inbox message matching "${c}"`),!0;if(u){try{await Xe(h.id),a(`inbox: dismissed ${h.id}`)}catch(p){a(`err: dismiss failed (${p.message})`)}return!0}try{await pn(h)}catch(p){a(`err: consume failed (${p.message})`)}return!0}case"/notify":{if(typeof Notification>"u")return a("err: notifications not supported in this browser"),!0;let r=i.toLowerCase();if(r==="on"){if(Notification.permission==="denied")return a("notify: blocked \u2014 allow in browser site settings to enable"),!0;if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted")return a("notify: blocked \u2014 allow in browser site settings to enable"),!0;let u=await mi();return await Fr(),a(u?"notify: already enabled":"notify: enabled"),!0}if(r==="off")return await Dr(),a("notify: disabled"),!0;let o=Notification.permission;return o==="denied"?a("notify: blocked \u2014 allow in browser site settings to enable"):o==="granted"&&await mi()?a("notify: enabled"):a("notify: off \u2014 use /notify on to enable"),!0}case"/log":{let r=i.toLowerCase().trim();return r===""?(pi(),!0):r==="reset"?(dn(),!0):["off","debug","info","warn","error"].includes(r)?(un(r),!0):(a(`err: invalid level '${r}' (use off|debug|info|warn|error|reset)`),!0)}case"/reset":return await fn(),!0;default:return a(`err: Unknown command "${s}". Type / to see available commands.`),!0}}var xe=null,Ve=pe,te,V=[],Y=-1,ne=null,se=null;function hn(){return se??l.input.value}function Vr(){return{name:"<agent-root>",children:n.agentCommands.map(e=>({name:`//${e.name}`,desc:e.input?`${e.description} \xB7 ${e.input.hint}`:e.description,onSelect:()=>{L(`//${e.name}`),l.sendBtn.click()}}))}}function yn(e){return e.startsWith("//")?Vr():pe}function gi(e){xe="",Ve=yn(l.input.value),te=void 0,V=[{spec:{primary:e},prefix:"",kind:"placeholder"}],Y=-1,Lt(""),l.slashMenu.classList.add("active")}function Ge(){let e=hn();if(ne!==null){if(e===ne)return;ne=null}if(!e.startsWith("/")){R();return}let t=e.startsWith("//");if(t&&n.busy){gi("(agent busy \u2014 wait or ^C to cancel)");return}if(t&&n.agentCommands.length===0){gi("(agent commands unavailable)");return}let s=yn(e),{node:i,pathPrefix:r,tailQuery:o}=Ut(e,s);if(r!==xe)if(xe=r,Ve=i,i.fetch&&i.toSpec){let u=i.fetch();if(u instanceof Promise){te="loading";let c=r;u.then(d=>{xe===c&&(te=d,gn(hi(),r))},d=>{if(xe!==c)return;te={error:d instanceof Error&&d.message?d.message:"fetch failed"},gn(hi(),r)})}else te=u}else te=void 0;else Ve=i;gn(o,r)}function hi(){let e=hn(),{tailQuery:t}=Ut(e,yn(e));return t}function gn(e,t){let s=ws(Ve,e,te);if(l.input.value==="/"&&s.push({spec:{primary:"Agent commands: type //"},prefix:"",kind:"placeholder"}),V=s,s.length===0){R();return}let i=s.findIndex(r=>r.kind!=="separator"&&r.kind!=="placeholder");Y=i>=0?i:0,Lt(t),l.slashMenu.classList.add("active")}function Lt(e){l.slashMenu.innerHTML="",l.slashMenu.classList.toggle("slash-menu-root",e===""),V.forEach((s,i)=>{if(s.kind==="separator"){let u=document.createElement("div");u.className="slash-separator",u.dataset.idx=String(i),l.slashMenu.appendChild(u);return}let r=i===Y,o=Ss(s.spec,r,s.prefix);s.prefix==="\u203A"&&o.classList.add("slash-arrow"),s.kind==="placeholder"&&o.classList.add("slash-placeholder"),o.dataset.idx=String(i),l.slashMenu.appendChild(o)}),l.slashMenu.dataset.pathPrefix=e;let t=l.slashMenu.querySelector(".slash-item.selected");t&&t.scrollIntoView({block:"nearest"})}function R(){let e=hn();se=null,l.slashMenu.classList.remove("active"),l.slashMenu.innerHTML="",Y=-1,V=[],xe=null,Ve=pe,te=void 0,ne=e}function vi(e){se=e,ne=null,Ge()}function Gr(){let e=V[Y];if(!e)return;let t=l.slashMenu.dataset.pathPrefix??"",s=se!==null;if(!(e.kind==="separator"||e.kind==="placeholder")){if(e.kind==="subcommand"&&e.node){let r=(e.node.children??[]).length>0||!!e.node.fetch||!!e.node.freeform,u=`${t}${t?" ":""}${e.node.name}${r?" ":""}`;s?r?(se=u,ne=null,Ge()):R():(L(u),r?(ne=null,Ge()):R())}else e.kind==="data"?(s||L(`${t}${t?" ":""}${e.spec.primary}`),R()):e.kind==="freeform"&&R();l.input.focus()}}async function Wr(e){let t=V[e];if(!t)return;let s=l.slashMenu.dataset.pathPrefix??"",i=se!==null;if(!(t.kind==="separator"||t.kind==="placeholder")){if(t.kind==="subcommand"&&t.node){if((t.node.children??[]).length>0||!!t.node.fetch||!!t.node.freeform){let c=`${s}${s?" ":""}${t.node.name} `;ne=null,i?(se=c,Ge()):L(c),l.input.focus();return}R(),i||L(""),t.node.onSelect&&await t.node.onSelect();return}R(),i||L(""),t.spec.onSelect?await t.spec.onSelect():a("Read-only entry \u2014 no action.")}}function wi(e){return!l.slashMenu.classList.contains("active")||V.length===0?!1:e.key==="ArrowDown"?(Y=yi(Y,1),Lt(l.slashMenu.dataset.pathPrefix??""),!0):e.key==="ArrowUp"?(Y=yi(Y,-1),Lt(l.slashMenu.dataset.pathPrefix??""),!0):e.key==="Tab"?(Gr(),!0):!1}function yi(e,t){let s=V.length;for(let i=1;i<=s;i++){let r=(e+t*i+s)%s;if(V[r].kind!=="separator"&&V[r].kind!=="placeholder")return r}return e}l.slashMenu.addEventListener("mousedown",e=>{e.preventDefault();let s=e.target?.closest(".slash-item");s?.dataset.idx!==void 0&&Wr(Number(s.dataset.idx))});l.input.addEventListener("input",()=>{se=null,Ge(),l.inputArea.classList.toggle("bash-mode",l.input.value.startsWith("!"))});function Kr(e){return new Promise(t=>{let s=new FileReader;s.onload=()=>{t(s.result)},s.readAsDataURL(e)})}async function Si(e){let t=e.type.startsWith("image/"),s={kind:t?"image":"file",file:e,mimeType:e.type||"application/octet-stream",name:e.name||(t?"image":"file")};return t&&(s.previewUrl=await Kr(e)),s}function bi(e){n.pendingAttachments.push(e),We()}function We(){if(l.attachPreview.innerHTML="",n.pendingAttachments.length===0){l.attachPreview.classList.remove("active");return}l.attachPreview.classList.add("active"),n.pendingAttachments.forEach((e,t)=>{let s=document.createElement("span");if(s.className="attach-thumb",e.kind==="image"&&e.previewUrl){let r=document.createElement("img");r.src=e.previewUrl,s.appendChild(r)}else{s.classList.add("attach-file");let r=document.createElement("span");r.className="attach-file-name",r.textContent=e.name,s.appendChild(r)}let i=document.createElement("button");i.className="remove",i.textContent="\xD7",i.addEventListener("click",()=>{n.pendingAttachments.splice(t,1),We()}),s.appendChild(i),l.attachPreview.appendChild(s)})}l.fileInput.onchange=async()=>{for(let e of l.fileInput.files)bi(await Si(e));l.fileInput.value=""};l.input.addEventListener("paste",e=>{let t=e.clipboardData?.items;if(t)for(let s of t)s.type.startsWith("image/")&&(e.preventDefault(),(async()=>{let i=s.getAsFile();i&&bi(await Si(i))})())});function vn(e){let t=e.trim();return!t.startsWith("//")&&t.startsWith("/")||t==="?"||t.startsWith("? ")}function wn(e){let t=e.trim();return vn(t)||t.startsWith("!")}var Le={send:()=>{},cancel:()=>{},attach:()=>{},publish:()=>{},cancelPreview:()=>{}};function Ei(e){Le=e}function jr(){if(n.previewToken)return[{label:"^P",title:"Publish preview (Ctrl+P)",className:"publish",onClick:()=>{Le.publish()}},{label:"^C",title:"Cancel preview (Ctrl+C)",className:"cancel",onClick:()=>{Le.cancelPreview()}}];let e={label:"^U",title:"Attach file (Ctrl+U)",onClick:()=>{Le.attach()}},t=()=>{n.busy&&!wn(l.input.value)?Le.cancel():Le.send()};if(n.busy&&!wn(l.input.value)){let s=n.busyKind==="bash"&&n.cancelStatus==="requested"?"Force stop bash":n.busyKind==="bash"?"Cancel bash (Ctrl+C)":n.cancelStatus==="unconfirmed"?"Retry cancel (agent did not acknowledge)":n.cancelStatus==="requested"?"Retry cancel (waiting for agent acknowledgement)":"Cancel (Ctrl+C)";return[e,{label:"^C",title:s,className:"cancel",onClick:t}]}return[e,{label:"\u21B5",title:"Send (Enter)",onClick:t}]}var zr=["cancel","publish"];function Ti(e,t){e.textContent=t.label,e.title=t.title,e.disabled=t.disabled??!1,e.onclick=t.onClick;for(let s of zr)e.classList.remove(s);t.className&&e.classList.add(t.className)}function Jr(){let[e,t]=jr();Ti(l.attachBtn,e),Ti(l.sendBtn,t),l.input.disabled=!!n.previewToken}fs(Jr);function ki(e){let t=e.search(/\s/);return t<0?{token:e,remainder:""}:{token:e.slice(0,t),remainder:e.slice(t)}}function Ii(e,t){if(!e.startsWith("//"))return null;let{token:s,remainder:i}=ki(e),r=s.slice(2);if(!r)return null;let o=t.find(u=>u.name.toLowerCase()===r.toLowerCase());return o?{command:s,agentText:`/${o.name}${i}`}:null}function Sn(e){return ki(e).token||e}function bn(){return n.clientId!==null}n._onCancelTimeout=()=>a("warn: Agent not responding to cancel");function Li(){let e=l.input.value.trim();if(!e&&n.pendingAttachments.length===0)return;let t=e.startsWith("//");if(vn(e)&&n.pendingAttachments.length===0){L(""),l.input.style.height="auto",mn(e);return}if(e.startsWith("!")&&n.pendingAttachments.length===0){let c=e.slice(1).trim();if(!c)return;if(!n.sessionId){a("warn: Session not ready yet, please wait\u2026");return}if(!bn()){a("warn: Not connected, please retry");return}L(""),l.input.style.height="auto",l.inputArea.classList.remove("bash-mode"),vs(c,!0),n.sentBashForSession=n.sessionId,jn(n.sessionId,c).catch(()=>{}),w(!0);return}if(n.busy)return;if(t&&!Ii(e,n.agentCommands)){let c=Sn(e);a(`err: Unknown command "${c}". Type // to see available commands.`);return}if(L(""),l.input.style.height="auto",l.inputArea.classList.remove("bash-mode"),!n.sessionId){a("warn: Session not ready yet, please wait\u2026");return}if(!bn()){a("warn: Not connected, please retry");return}C(),M(),n.awaitingOwnUserEcho=!0,n.reconcileAfterOwnUserEcho=!1;let s=Z();n.sentMessageOpId=s;let i=ct("user",e||"(attachment)");i.dataset.optimisticOpId=s;let r=[];for(let c of n.pendingAttachments)if(c.kind==="image"&&c.previewUrl){let d=document.createElement("img");d.className="user-image",d.src=c.previewUrl,d.alt=c.name,i.appendChild(d),r.push(null)}else{let d=document.createElement("div");d.className="user-attachment",d.textContent=`[${c.kind}: ${c.name}]`,i.appendChild(d),r.push(d)}let o=n.pendingAttachments.slice();n.pendingAttachments.length=0,We();let u=c=>{Yr(c,{text:e,isAgentCommand:t,messageEl:i,attachments:o})};o.length>0?Promise.all(o.map(c=>{let d=new FormData;return d.append("file",c.file,c.name),fetch(`/api/v1/sessions/${n.sessionId}/attachments`,{method:"POST",body:d}).then(f=>f.json()).then(f=>({kind:f.kind,attachmentId:f.attachmentId,displayName:f.displayName,mimeType:f.mimeType,url:f.url}))})).then(c=>{if(!bn()){i.remove(),a("warn: Not connected, please retry"),n.awaitingOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,w(!1);return}for(let f=0;f<c.length;f++){let h=r[f];if(!h)continue;let p=c[f];if(p.kind==="image"||!p.url)continue;let m=document.createElement("a");m.className="user-file",m.href=p.url,m.target="_blank",m.rel="noopener",m.download=p.displayName,m.textContent=p.displayName,h.replaceWith(m)}let d=c.map(({kind:f,attachmentId:h,displayName:p,mimeType:m})=>({kind:f,attachmentId:h,displayName:p,mimeType:m}));Ot(n.sessionId,e||"What is in this attachment?",d,s).catch(u)}):Ot(n.sessionId,e,void 0,s).catch(u),n.turnEnded=!1,n.sentMessageForSession=n.sessionId,w(!0),hs()}function Yr(e,t){if(n.awaitingOwnUserEcho=!1,n.sentMessageOpId=null,w(!1),z(),t?.isAgentCommand&&e instanceof ie&&e.status===v.UNPROCESSABLE_CONTENT){t.messageEl.remove(),n.sentMessageForSession=null,L(t.text),n.pendingAttachments.push(...t.attachments),We();let i=Sn(t.text);a(`err: Unknown command "${i}". Type // to see available commands.`);return}let s=e instanceof Error?e.message:String(e);a(`err: ${s}`)}function Ci(){if(!n.busy||!n.sessionId)return;let e=n.cancelStatus!==null;a(e?"^C retrying cancel\u2026":"^C cancelling\u2026"),we().then(()=>{}).catch(t=>{let s=t instanceof Error?t.message:String(t);a(`err: cancel failed \u2014 ${s}`)})}Ei({send:Li,cancel:Ci,attach:()=>{l.fileInput.click()},publish:()=>{rn()},cancelPreview:on});K();l.input.addEventListener("keydown",e=>{if(wi(e)){e.preventDefault();return}if(e.key==="Enter"&&!e.shiftKey){e.preventDefault(),R(),Li();return}if(e.key==="u"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey){e.preventDefault(),l.fileInput.click();return}});document.addEventListener("keydown",e=>{if(e.key==="c"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey&&!(!!window.getSelection()?.toString()||l.input.selectionStart!==l.input.selectionEnd)){if(n.previewToken){e.preventDefault(),on();return}if(n.busy){e.preventDefault(),Ci();return}}e.key==="Escape"&&l.slashMenu.classList.contains("active")&&(e.preventDefault(),R(),l.input.focus())});var xi=0;function Ai(){let e=j("mode");if(!e?.options.length){Date.now()-xi>3e3&&(a("Mode switcher temporarily unavailable. Try `/new` to start a fresh session."),xi=Date.now());return}let t=e.options.findIndex(i=>i.value===e.currentValue),s=e.options[(t+1)%e.options.length];e.currentValue=s.value,he(n.sessionId,"mode",s.value).catch(()=>{}),a(`Mode \u2192 ${s.name}`),k()}document.addEventListener("keydown",e=>{e.key==="m"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey&&(e.preventDefault(),Ai())});document.addEventListener("keydown",e=>{n.previewToken&&(!(e.ctrlKey||e.metaKey)||e.shiftKey||e.key==="p"&&(e.preventDefault(),rn()))});l.prompt.addEventListener("click",Ai);l.input.addEventListener("input",K);l.input.addEventListener("input",()=>{ys(Qr)});function Qr(){l.input.style.height="auto",l.input.style.height=Math.min(l.input.scrollHeight,Zr())+"px"}function Zr(){let e=Number.parseFloat(window.getComputedStyle(l.input).maxHeight);return Number.isFinite(e)?e:Number.POSITIVE_INFINITY}var Xr=S.scope("sse");async function eo(e){try{let s=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!s)return;await fetch("/api/beta/push/register-client",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:e,endpoint:s.endpoint})})}catch{}}var to=45e3,no=5e3,so=3e3,Ae=0,Tn=null,Ce=0,me=null;function Pi(){me||(me=setTimeout(()=>{me=null,Ct()},so),me.unref?.())}function En(){Ae=Date.now()}function io(){Tn||(Tn=setInterval(Mi,no),Tn.unref?.())}function Mi(){if(!Ae||Date.now()-Ae<to)return;Xr.warn("stream silent, reconnecting",{silentMs:Date.now()-Ae}),Ae=0;let e=n.eventSource;e&&(e.onerror=null,e.close()),Ri(),Ct()}function Ct(){me&&(clearTimeout(me),me=null);let e=++Ce;le("connecting","connecting"),ro(e)}async function ro(e){En(),io();let t;try{t=(await zn()).ticket}catch{e===Ce&&Pi();return}if(e!==Ce)return;let s=new EventSource(`/api/v1/events/stream?ticket=${encodeURIComponent(t)}`);n.eventSource=s,s.onmessage=i=>{if(e!==Ce){s.close();return}En();let r=JSON.parse(i.data);r.type==="connected"&&r.clientId&&(n.clientId=r.clientId,typeof r.pendingCount=="number"&&it(r.pendingCount),ft(r.debugLevel),ye(r.clientId,!document.hidden,n.sessionId??void 0),eo(r.clientId),!r.agent)||U(r)},s.onerror=()=>{s.close(),e===Ce&&(Ae=0,Ri(),Pi())},s.addEventListener("heartbeat",()=>{e===Ce&&(En(),n.clientId&&(document.hidden||ye(n.clientId,!0,n.sessionId??void 0)))}),oo()}async function oo(){await ao(),await oi()}async function ao(){le("connecting","session loading");let e=n.sessionSwitchGen,t=ps();if(t&&t===n.sessionId&&n.lastEventSeq>0){if(await kn(t,!0,e),e!==n.sessionSwitchGen)return;x(!1);return}if(t){if(I({preserveNavigationTarget:n.pendingNavigationSessionId===t}),await kn(t,!1,e),e!==n.sessionSwitchGen)return;x(!0);return}try{let s=await Ye();if(e!==n.sessionSwitchGen)return;if(s.length>0){if(I(),await kn(s[0].id,!1,e),e!==n.sessionSwitchGen)return;x(!0);return}}catch{}e===n.sessionSwitchGen&&(sn()||_())}async function kn(e,t,s){if(t){try{let r=await re(e);if(s!==n.sessionSwitchGen)return;U({type:"session_created",sessionId:r.id,cwd:r.cwd,title:r.title,configOptions:r.configOptions})}catch{if(s!==n.sessionSwitchGen)return;await $(e,n.sessionCwd??void 0);return}if(s!==n.sessionSwitchGen)return;let[i]=await Promise.all([ce(e,()=>s===n.sessionSwitchGen),wt(e)]);if(s!==n.sessionSwitchGen)return;i||await $(e,n.sessionCwd??void 0)}else{n.sessionId=null,n.pendingNavigationSessionId=e;let i=He(e),r;try{let[o,u]=await Promise.all([re(e),i]),c=await ce(e,()=>s===n.sessionSwitchGen);if(s!==n.sessionSwitchGen)return;if(!c){await $(e,n.sessionCwd??void 0);return}r=o,u||a("warn: Failed to load history.")}catch{if(s!==n.sessionSwitchGen)return;await $(e,n.sessionCwd??void 0);return}U({type:"session_created",sessionId:r.id,cwd:r.cwd,title:r.title,configOptions:r.configOptions}),Et(e)}}function Ri(){le("disconnected","disconnected"),n.eventSource=null,n.clientId=null,C(),M(),n.currentBashEl&&ut(n.currentBashEl,null,"disconnected"),n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,n.turnEnded=!1,n.currentPromptId=null,n.lastStateSeq=0,Se(),w(!1)}function Ni(e,t){let s=`/api/beta/clients/${encodeURIComponent(e)}/visibility`,i=JSON.stringify({visible:!1,sessionId:t});try{fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:i,keepalive:!0}).catch(()=>{})}catch{}}document.addEventListener("visibilitychange",()=>{if(n.clientId&&(document.hidden?Ni(n.clientId,n.sessionId??null):ye(n.clientId,!0,n.sessionId??void 0)),document.hidden||Mi(),!document.hidden&&n.sessionId&&!n.replayInProgress){let e=n.sessionId;Promise.all([ot(e),wt(e)]).then(()=>{n.sessionId===e&&x(!1)})}});window.addEventListener("pagehide",()=>{n.clientId&&Ni(n.clientId,n.sessionId??null)});var lo=80,co=300,uo=10,Oi=!1,Q=null;function fo(){return typeof window.visualViewport>"u"?null:window.visualViewport}function _i(){let e=fo();return e?e.offsetTop>0||window.innerHeight-e.height>lo:!0}function po(e){return e===l.input}function In(e){return typeof e.pointerId=="number"?e.pointerId:1}function mo(e){e.pointerType==="touch"&&(Q=null,po(e.target)&&document.activeElement===l.input&&(l.input.disabled||_i()||(Q={pointerId:In(e),startX:e.clientX,startY:e.clientY,startTs:e.timeStamp})))}function go(e){if(!Q||In(e)!==Q.pointerId)return;let t=Q;Q=null;let s=e.timeStamp-t.startTs,i=Math.hypot(e.clientX-t.startX,e.clientY-t.startY);s>co||i>uo||document.activeElement!==l.input||l.input.disabled||_i()||l.input.blur()}function ho(e){Q&&In(e)===Q.pointerId&&(Q=null)}function $i(){Oi||(Oi=!0,document.addEventListener("pointerdown",mo,{capture:!0}),document.addEventListener("pointerup",go,{capture:!0}),document.addEventListener("pointercancel",ho,{capture:!0}))}var qi=!1;function Hi(){qi||(qi=!0,l.inboxBtn.addEventListener("click",()=>{l.input.value?vi("/inbox "):L("/inbox "),l.input.focus()}))}if(!localStorage.getItem(G))throw location.replace("/login"),new Error("redirecting to /login");$n();Ls(a);$i();Hi();l.messages.addEventListener("click",Ln);Rt(Cn);Ct();fetch("/api/v1/version").then(e=>e.json()).then(e=>{typeof e.server=="string"&&(n.serverVersion=e.server);let t=e.agent;t&&(n.agentName=typeof t.name=="string"?t.name:null,n.agentVersion=typeof t.version=="string"?t.version:null)}).catch(()=>{});"serviceWorker"in navigator&&(navigator.serviceWorker.register("/sw.js"),navigator.serviceWorker.addEventListener("message",e=>{let t=e.data??{};t.type==="navigate"&&ri(t).catch(s=>{let i=s instanceof Error?s.message:String(s);a(`err: notification navigation failed (${i})`)})}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var s=Object.freeze({OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,CONFLICT:409,GONE:410,PAYLOAD_TOO_LARGE:413,UNPROCESSABLE_CONTENT:422,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,SERVICE_UNAVAILABLE:503});var c="wa_token";async function p(n,a={}){let i=a.fetch??fetch,o=n.trim();if(!o)return{ok:!1,error:"Token is required"};let r;try{r=await i("/api/v1/auth/verify",{method:"GET",headers:{Authorization:`Bearer ${o}`}})}catch(e){return{ok:!1,error:`Network error: ${e instanceof Error?e.message:String(e)}`}}if(r.status===s.OK){let e;try{e=await r.json()}catch{return{ok:!1,error:"Server returned invalid response"}}if(!e.ok||typeof e.name!="string"||typeof e.scope!="string")return{ok:!1,error:"Server returned malformed response"};try{localStorage.setItem(c,o)}catch(t){return{ok:!1,error:`Could not store token: ${t instanceof Error?t.message:String(t)}`}}return{ok:!0,name:e.name,scope:e.scope}}return r.status===s.UNAUTHORIZED?{ok:!1,error:"Invalid or rejected token"}:{ok:!1,error:`Unexpected response (status ${r.status})`}}export{s as a,c as b,p as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as g,d as h,m as y,o as T,p as C}from"./chunk.CT5WBNGZ.js";import{a as p}from"./chunk.UMQMOGWO.js";import"./chunk.AJZBJBMO.js";var $=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function f(t){return String(t).padStart(2,"0")}function E(t,n){if(!t)return"";let s=new Date(t),i=s.getTime();if(isNaN(i))return"";let l=Math.floor((n.getTime()-i)/1e3);if(l<60)return"just now";let c=Math.floor(l/60);if(c<60)return`${c}m ago`;let o=Math.floor(c/60);if(o<24)return`${o}h ago`;let e=Math.floor(o/24);if(e<7)return`${e}d ago`;let m=s.getUTCFullYear()===n.getUTCFullYear(),r=$[s.getUTCMonth()],a=s.getUTCDate();return m?`${r} ${a}`:`${r} ${a}, ${s.getUTCFullYear()}`}function _(t){if(!t)return"";let n=new Date(t);return isNaN(n.getTime())?"":`${n.getUTCFullYear()}-${f(n.getUTCMonth()+1)}-${f(n.getUTCDate())} ${f(n.getUTCHours())}:${f(n.getUTCMinutes())} UTC`}function S(t){let n=/^\/api\/v1\/sessions\/[^/]+\/attachments\/([A-Za-z0-9._-]+)(?:\?.*)?$/;return s=>{let i=n.exec(s);return i?`/s/${encodeURIComponent(t)}/attachments/${i[1]}`:s}}function w(t){if(typeof t.data=="string")try{return JSON.parse(t.data)}catch{return{}}return t.data}function x(t,n,s,i){if(t.type!=="assistant_message"||n?.type!=="assistant_message"||t.seq!==n.seq+1||!s?.classList.contains("assistant"))return!1;let l=(s.getAttribute("data-raw")??"")+(typeof i.text=="string"?i.text:"");return s.setAttribute("data-raw",l),C(s,l,void 0,!0),g(s),!0}function v(t,n,s){let i=new Set;for(let r of t)if(r.type==="permission_response")try{let a=JSON.parse(r.data);typeof a.requestId=="string"&&i.add(a.requestId)}catch{}let l=new Map,c=new Map,o=null,e=null,m={rewriteAttachmentSrc:S(s),enhanceMarkdown:g,findToolCallEl:r=>l.get(r)??null,findPermissionEl:r=>c.get(r)??null,findBashEl:()=>o,isPermissionResolved:r=>i.has(r),finalAnswerToolText:null};for(let r=0;r<t.length;r++){let a=t[r];if(!y(a.type))continue;let u=w(a),A=r>0?t[r-1]:null,M=n.lastElementChild;if(x(a,A,M,u)){e=null;continue}m.finalAnswerToolText=a.type==="assistant_message"?e:null;let d=T(a.type,u,m);d?(n.appendChild(d),a.type==="tool_call"&&typeof u.id=="string"?l.set(u.id,d):a.type==="permission_request"&&typeof u.requestId=="string"?c.set(u.requestId,d):a.type==="bash_command"&&(o=d)):a.type==="bash_result"&&(o=null),a.type==="tool_call_update"?e=h(typeof u.status=="string"?u.status:"",Array.isArray(u.content)?u.content:void 0):e=null}}async function U(){try{let e=localStorage.getItem("theme")??"auto";document.documentElement.setAttribute("data-theme",e)}catch{}let t=/^\/s\/([A-Za-z0-9_-]{24})(?:[/?#]|$)/.exec(location.pathname);if(!t){document.body.textContent="invalid share URL";return}let n=t[1],s=document.getElementById("session-info"),i=document.getElementById("messages"),l=document.querySelector(".share-footer-author"),c=document.querySelector(".share-footer-meta");if(!i)return;let o;try{let e=await fetch(`/api/v1/shared/${encodeURIComponent(n)}/events`,{headers:{Accept:"application/json"},credentials:"omit"});if(e.status===p.GONE){document.body.innerHTML="<div class='share-gone'>\u6B64\u94FE\u63A5\u5DF2\u64A4\u9500\u6216\u8FC7\u671F\u3002</div>";return}if(!e.ok){document.body.textContent=`error ${e.status}`;return}o=await e.json()}catch(e){document.body.textContent=`failed to load: ${String(e)}`;return}if(document.title=o.share.session_title?`${o.share.session_title} \u2014 shared`:"shared session",s&&(s.textContent=o.share.session_title??"(untitled)"),l){let e=o.share.display_name??"";l.textContent=e?`by ${e}`:""}if(v(o.events,i,n),c){let e=o.share.shared_at??o.share.created_at;c.textContent=E(e,new Date),c instanceof HTMLElement&&(c.title=_(e))}}U();
|