@nervmor/codexui 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1435,6 +1435,6 @@ ${A}`:A,d.value="",qt(()=>{var j;return(j=we.value)==null?void 0:j.focus()})},on
1435
1435
 
1436
1436
  `)&&$n(ge,`${Xe}
1437
1437
 
1438
- `)}v(u);const Ui=Ee(u);Ui&&(he(ge,Ui),Et(ge,{label:"Running command",details:[((ql=Ui.commandExecution)==null?void 0:ql.command)??""]}));const Hi=Q(u);if(Hi){const Xe=(a.value[ge]??[]).find(tr=>tr.id===Hi.itemId);Xe!=null&&Xe.commandExecution&&he(ge,{...Xe,commandExecution:{...Xe.commandExecution,aggregatedOutput:`${Xe.commandExecution.aggregatedOutput}${Hi.delta}`}})}const Hl=_e(u);if(Hl&&he(ge,Hl),jt(u)&&(fe&&n.value&&Pn(n.value,{scrollTop:0,isAtBottom:!0,scrollRatio:1}),rn(ge)),u.method==="turn/completed"){fe=!1,rn(ge),a.value[ge]&&(a.value=Xt(a.value,ge));const Xe=Ft(u);Xe&&(_t(Xe,!1),Et(Xe,null),Pt(Xe),de||(Ie(Xe),Hs(Xe)))}}function Ct(u){const f=Ft(u);f&&V.add(f);const _=u.method;(_.startsWith("thread/")||_.startsWith("turn/")||_.startsWith("item/"))&&(Ve=!0),!(lt!==null||typeof window>"u")&&(lt=window.setTimeout(()=>{lt=null,E()},ba))}async function zt(u){if(!be){be=!0;try{const f=await Zs(),_=[];for(const C of f.order){const Y=bs(C);_.includes(Y)||_.push(Y)}if(_.length>0){const C=Vo(_,u);cs(L.value,C)||(L.value=C,ws(L.value))}if(Object.keys(f.labels).length>0){const C={...se.value};let Y=!1;for(const[oe,de]of Object.entries(f.labels)){const Se=bs(oe);C[Se]!==de&&(C[Se]=de,Y=!0)}Y&&(se.value=C,_a(C))}}catch{}}}async function Us(){if(!(Object.keys(Ne.value).length>0))try{const u=await s0();Object.keys(u.titles).length>0&&(Ne.value=u.titles)}catch{}}async function S(u,f,_){if(Ne.value[u])return;const C=f.trim();if(!C)return;const Y=C.length>300?C.slice(0,300):C;try{const oe=await o0(Y,_);if(!oe||Ne.value[u])return;Ne.value={...Ne.value,[u]:oe},Je(),fa(u,oe)}catch{}}async function x(){var u;Dt.value||(He.value=!0);try{const[f]=await Promise.all([Lk(),Us()]);await zt(f);const _=Vo(L.value,f);cs(L.value,_)||(L.value=_,ws(L.value));const C=ka(f,L.value),Y=DA(t.value,C,l.value);t.value=zo(t.value,Y),l.value=on(l.value,new Set(Vr(t.value).map(Se=>Se.id))),Je(),Dt.value=!0;const oe=Vr(e.value);hn(oe),oe.some(Se=>Se.id===n.value)||U(((u=oe[0])==null?void 0:u.id)??"")}finally{He.value=!1}}async function M(u,f={}){if(!u)return;const _=we.value[u]===!0,C=f.silent!==!0&&!_;C&&(Fe.value=!0);try{ce.value[u]!==!0&&(await ua(u),ce.value={...ce.value,[u]:!0});const{messages:Y,inProgress:oe}=await jk(u),de=r.value[u]??[],Se=SA(de,Y,{preserveMissing:f.silent===!0});_n(u,Se);const ge=o.value[u]??[],st=IA(ge,Y);Lt(u,st),Ke(u,Y),we.value={...we.value,[u]:!0};const Nt=In(u);Nt&&(ne.value={...ne.value,[u]:Nt}),_t(u,oe),oe||kn(u),ut(u)}finally{C&&(Fe.value=!1)}}async function Z(u,f={}){u&&we.value[u]!==!0&&await M(u,f)}async function We(){try{const u=t.value.flatMap(f=>f.threads.map(_=>_.cwd)).filter(Boolean);qe.value=await i0(u.length>0?[...new Set(u)]:void 0)}catch{}}async function $t(){try{Te(await Hk())}catch{}}async function tn(u={}){Be.value="";const f=u.includeSelectedThreadMessages!==!1,_=u.awaitAncillaryRefreshes===!0;try{await x();const C=Promise.allSettled([et(),Qe(),We(),$t()]).then(()=>{});f&&await M(n.value),_&&await C}catch(C){Be.value=C instanceof Error?C.message:"Unknown application error"}}async function Zn(u){U(u);try{await M(u)}catch(f){Be.value=f instanceof Error?f.message:"Unknown application error"}}async function sn(u){try{await Vk(u),await x(),n.value===u&&await M(n.value)}catch(f){Be.value=f instanceof Error?f.message:"Unknown application error"}}async function Jt(u,f){const _=f.trim();if(!(!u||!_))try{await Wk(u,_),Ne.value={...Ne.value,[u]:_},Je(),fa(u,_)}catch(C){Be.value=C instanceof Error?C.message:"Unknown application error"}}async function Hn(u,f=[],_=[],C="steer",Y=[]){const oe=n.value,de=u.trim();if(!oe||!de&&f.length===0&&Y.length===0)return;const Se=l.value[oe]===!0;if(Se&&C==="queue"){const ge=d.value[oe]??[],st=`q-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;d.value={...d.value,[oe]:[...ge,{id:st,text:de,imageUrls:f,skills:_,fileAttachments:Y,collaborationMode:T.value}]};return}if(Se){fe=!0,er(oe,de,f,_,Y).catch(ge=>{const st=ge instanceof Error?ge.message:"Unknown application error";Mt(oe,st),Be.value=st});return}Be.value="",fe=!0,ot(oe,null),Et(oe,{label:"Thinking",details:ct(N.value,O.value,T.value)}),Mt(oe,null),_t(oe,!0);try{await er(oe,de,f,_,Y)}catch(ge){fe=!1,_t(oe,!1),Et(oe,null);const st=ge instanceof Error?ge.message:"Unknown application error";throw Mt(oe,st),Be.value=st,ge}}async function Dr(u,f,_=[],C=[],Y=[]){const oe=u.trim(),de=f.trim(),Se=N.value.trim();if(!oe&&_.length===0&&Y.length===0)return"";xe.value=!0,Be.value="";let ge="";try{try{ge=await mu(de||void 0,Se||void 0)}catch(Vn){if(Se&&Se!==Ln&&Wo(Vn))await ve(),ge=await mu(de||void 0,Ln);else throw Vn}if(!ge)return"";Ot(ge,de,oe||"[Image]"),ce.value={...ce.value,[ge]:!0},U(ge),fe=!0,ot(ge,null),Et(ge,{label:"Thinking",details:ct(N.value,O.value,T.value)}),Mt(ge,null),_t(ge,!0);const st=ge,Nt=de||null,Qt=oe;return er(ge,oe,_,C,Y).catch(Vn=>{fe=!1,_t(ge,!1),Et(ge,null);const Zr=Vn instanceof Error?Vn.message:"Unknown application error";Mt(ge,Zr),Be.value=Zr}).finally(()=>{xe.value=!1}),S(st,Qt,Nt),ge}catch(st){fe=!1,ge&&(_t(ge,!1),Et(ge,null));const Nt=st instanceof Error?st.message:"Unknown application error";throw ge&&Mt(ge,Nt),Be.value=Nt,xe.value=!1,st}}async function er(u,f,_=[],C=[],Y=[]){const oe=N.value.trim(),de=O.value,Se=T.value,ge=f.trim(),st=C.map(Qt=>({name:Qt.name,path:Qt.path})),Nt=Y.map(Qt=>({...Qt}));ke(u,{text:ge,imageUrls:[..._],skills:st,fileAttachments:Nt,effort:de,collaborationMode:Se,fallbackRetried:!1});try{ce.value[u]!==!0&&await ua(u);try{await da(u,f,_,oe||void 0,de||void 0,C.length>0?C:void 0,Y,Se)}catch(Qt){if(oe&&oe!==Ln&&Wo(Qt))await ve(),ke(u,{text:ge,imageUrls:[..._],skills:st,fileAttachments:Nt,effort:de,collaborationMode:Se,fallbackRetried:!0}),await da(u,f,_,Ln,de||void 0,C.length>0?C:void 0,Y,Se);else throw Qt}ce.value={...ce.value,[u]:!0},V.add(u),Ve=!0,await E()}catch(Qt){throw Qt}}async function Hs(u){const f=d.value[u];if(!f||f.length===0)return;const[_,...C]=f;d.value=C.length>0?{...d.value,[u]:C}:Xt(d.value,u),xe.value=!0,Be.value="",fe=!0,ot(u,null),Et(u,{label:"Thinking",details:ct(N.value,O.value,_.collaborationMode)}),Mt(u,null),_t(u,!0);try{G(_.collaborationMode),await er(u,_.text,_.imageUrls,_.skills,_.fileAttachments)}catch{_t(u,!1),Et(u,null)}finally{xe.value=!1}}async function Li(){const u=n.value;if(!u||l.value[u]!==!0)return;const f=X.value[u];nt.value=!0,Be.value="";try{await Kk(u,f),_t(u,!1),Et(u,null),Mt(u,null),X.value[u]&&(X.value=Xt(X.value,u)),V.add(u),Ve=!0,await E()}catch(_){const C=_ instanceof Error?_.message:"Failed to interrupt active turn";Mt(u,C),Be.value=C}finally{nt.value=!1}}async function ji(u){const f=n.value;if(!f||ze.value)return;const C=(r.value[f]??[]).reduce((oe,de)=>typeof de.turnIndex=="number"&&de.turnIndex>oe?de.turnIndex:oe,-1);if(C<0||u>C)return;const Y=C-u+1;if(!(Y<1)){ze.value=!0,Be.value="";try{const oe=await pu(f,Y);_n(f,oe),kn(f),Lt(f,[]),rn(f),a.value[f]&&(a.value=Xt(a.value,f)),ot(f,null),Et(f,null),Mt(f,null),Ve=!0,await E()}catch(oe){Be.value=oe instanceof Error?oe.message:"Failed to rollback thread"}finally{ze.value=!1}}}function Bi(u,f){u.length===0||(se.value[u]??"")===f||(se.value={...se.value,[u]:f},_a(se.value))}async function Fi(u){var oe;if(u.length===0)return;const f=L.value.filter(de=>de!==u);if(cs(L.value,f)||(L.value=f,ws(L.value)),t.value=t.value.filter(de=>de.projectName!==u),se.value[u]!==void 0){const de={...se.value};delete de[u],se.value=de,_a(de)}Je();const _=Vr(e.value);hn(_),_.some(de=>de.id===n.value)||U(((oe=_[0])==null?void 0:oe.id)??"");const Y=new Set;try{const de=await Zs();for(const Se of de.order)bs(Se)===u&&Y.add(Se);for(const Se of de.active)bs(Se)===u&&Y.add(Se);for(const Se of Object.keys(de.labels))bs(Se)===u&&Y.add(Se)}catch{}if(Y.size>0)try{const de=await Zs(),Se=de.order.filter(Nt=>!Y.has(Nt)),ge=de.active.filter(Nt=>!Y.has(Nt)),st=ge.length===0&&Se.length>0?[Se[0]]:ge;await vu({order:Se,labels:MA(de.labels,Y),active:st});return}catch{}await Ws()}function Do(u,f){if(u.length===0||t.value.length===0)return;const _=t.value.map(ge=>ge.projectName),C=_.indexOf(u);if(C===-1)return;const Y=Math.max(0,Math.min(f,_.length-1)),oe=bA(_,C,Y);if(oe===_)return;const de=Vo(oe,t.value);L.value=de,ws(L.value);const Se=ka(t.value,L.value);t.value=zo(t.value,Se),Je(),Ws()}function Vs(u){const f=u.trim();if(!f)return;const _=[f,...L.value.filter(Y=>Y!==f)];if(cs(L.value,_))return;L.value=_,ws(L.value);const C=ka(t.value,L.value);t.value=zo(t.value,C),Je(),Ws()}async function Ws(){var u,f;try{const _=await Zs(),C=new Map;for(const de of _.order){const Se=bs(de);C.has(Se)||C.set(Se,de)}for(const de of t.value){const Se=((f=(u=de.threads[0])==null?void 0:u.cwd)==null?void 0:f.trim())??"";Se&&C.set(de.projectName,Se)}const Y=[];for(const de of L.value){const Se=C.get(de);Se&&!Y.includes(Se)&&Y.push(Se)}for(const de of _.order)Y.includes(de)||Y.push(de);const oe=_.active.filter(de=>Y.includes(de));oe.length===0&&Y.length>0&&oe.push(Y[0]),await vu({order:Y,labels:_.labels,active:oe})}catch{}}async function E(){if(at.value){typeof window<"u"&&lt===null&&(lt=window.setTimeout(()=>{lt=null,E()},ba));return}at.value=!0;const u=Ve,f=new Set(V);Ve=!1,V.clear();try{u&&await x();const _=n.value;if(!_)return;const C=f.has(_),Y=l.value[_]===!0,oe=In(_),de=ne.value[_]??"",Se=oe.length>0&&oe!==de;(C||Y||Se||u)&&await M(_,{silent:!0})}catch{}finally{at.value=!1,(Ve||V.size>0)&&typeof window<"u"&&lt===null&&(lt=window.setTimeout(()=>{lt=null,E()},ba))}}async function ee(){await yt(),Ve=!0,n.value&&V.add(n.value),await E()}function Ce(){typeof window>"u"||it||(yt(),it=Bk(u=>{if(u.method==="ready"){ee();return}Ht(u),Ct(u)}))}async function yt(){try{const f=(await Uk()).map(_=>pn(_)).filter(_=>_!==null);Cn(f)}catch{}}async function gt(u){try{await Fk(u.id,{result:u.result,error:u.error}),Wt(u.id)}catch(f){Be.value=f instanceof Error?f.message:"Failed to reply to server request"}}function rt(){it&&(it(),it=null),Ve=!1,V.clear(),Ae.clear(),lt!==null&&typeof window<"u"&&(window.clearTimeout(lt),lt=null),fe=!1,r.value={},s.value={},o.value={},i.value={},a.value={},Oe.value={},me.value={},ae.value={},X.value={},d.value={},Me.value=null}const Yt=pe(()=>{const u=n.value;return u?d.value[u]??[]:[]});function zs(u){const f=n.value;if(!f)return;const _=d.value[f];if(!_)return;const C=_.filter(Y=>Y.id!==u);d.value=C.length>0?{...d.value,[f]:C}:Xt(d.value,f)}function Gs(u){const f=n.value;if(!f)return;const _=d.value[f];if(!_)return;const C=_.find(Y=>Y.id===u);C&&(zs(u),G(C.collaborationMode),Hn(C.text,C.imageUrls,C.skills,"steer",C.fileAttachments))}function jh(u){U(u)}return{projectGroups:e,projectDisplayNameById:se,selectedThread:I,selectedThreadScrollState:$,selectedThreadServerRequests:q,selectedLiveOverlay:F,codexQuota:P,selectedThreadId:n,availableCollaborationModes:b,availableModelIds:h,selectedCollaborationMode:T,selectedModelId:N,selectedReasoningEffort:O,installedSkills:qe,messages:H,isLoadingThreads:He,isLoadingMessages:Fe,isSendingMessage:xe,isInterruptingTurn:nt,error:Be,refreshAll:tn,refreshSkills:We,selectThread:Zn,loadMessages:M,ensureThreadMessagesLoaded:Z,setThreadScrollState:Pn,archiveThreadById:sn,renameThreadById:Jt,sendMessageToSelectedThread:Hn,sendMessageToNewThread:Dr,interruptSelectedThreadTurn:Li,rollbackSelectedThread:ji,isRollingBack:ze,selectedThreadQueuedMessages:Yt,removeQueuedMessage:zs,steerQueuedMessage:Gs,setSelectedCollaborationMode:G,setSelectedModelId:z,setSelectedReasoningEffort:tt,respondToPendingServerRequest:gt,renameProject:Bi,removeProject:Fi,reorderProject:Do,pinProjectToTop:Vs,startPolling:Ce,stopPolling:rt,primeSelectedThread:jh}}const FA={class:"sidebar-root"},UA={class:"sidebar-scrollable"},HA=["aria-pressed"],VA={key:1,class:"sidebar-search-bar"},WA={key:0,class:"sidebar-settings-area"},zA={key:0,class:"sidebar-settings-panel"},GA={class:"sidebar-settings-value"},qA={class:"sidebar-settings-value"},KA={class:"content-root"},JA={class:"content-body"},YA={key:1,class:"content-grid"},QA={class:"new-thread-empty"},XA={class:"worktree-init-status-title"},ZA={class:"worktree-init-status-message"},ex={key:2,class:"content-grid"},tx={class:"content-thread"},nx={class:"composer-with-queue"},rx={class:"build-badge","aria-label":"Author name, worktree name, and version"},Zu="codex-web-local.sidebar-collapsed.v1",Sa="codex-web-local.last-active-thread-route.v1",ed="codex-web-local.send-with-enter.v1",td="codex-web-local.in-progress-send-mode.v1",nd="codex-web-local.dark-mode.v1",rd="codex-web-local.dictation-click-to-toggle.v1",sx=400,ox=Zt({__name:"App",setup(e){const t="codexui",n="1.0.1",{projectGroups:r,projectDisplayNameById:s,selectedThread:o,selectedThreadScrollState:i,selectedThreadServerRequests:a,selectedLiveOverlay:l,codexQuota:d,selectedThreadId:c,availableCollaborationModes:h,availableModelIds:b,selectedCollaborationMode:T,selectedModelId:N,selectedReasoningEffort:O,installedSkills:J,messages:ie,isLoadingThreads:L,isLoadingMessages:se,isInterruptingTurn:ne,refreshAll:we,refreshSkills:ce,selectThread:me,ensureThreadMessagesLoaded:Oe,setThreadScrollState:ae,archiveThreadById:X,renameThreadById:le,sendMessageToSelectedThread:te,sendMessageToNewThread:Me,interruptSelectedThreadTurn:Ne,rollbackSelectedThread:qe,isRollingBack:He,selectedThreadQueuedMessages:Fe,removeQueuedMessage:xe,steerQueuedMessage:nt,setSelectedCollaborationMode:ze,setSelectedModelId:Be,setSelectedReasoningEffort:at,respondToPendingServerRequest:Dt,renameProject:it,removeProject:lt,reorderProject:Ve,pinProjectToTop:V,startPolling:be,stopPolling:fe,primeSelectedThread:Ae}=BA(),Re=_v(),k=bv(),{isMobile:I}=$f(),$=D(!1),q=D(!1),F=D(""),P=D("local"),H=D({order:[],labels:{}}),U=D({phase:"idle",title:"",message:""}),z=D(Hn()),G=D(""),Te=D(!1),ve=D(null),ke=D(null);let Ie=null;const Ue=D("New Project (1)"),tt=D(""),Qe=D(!1),ct=D(M(ed,!0)),et=D(We()),pt=D(Z()),Je=D(M(rd,!1)),Ot=D(null),hn=D(!1),ut=D(!1),ot=pe(()=>{const E=Re.params.threadId;return typeof E=="string"?E:""}),_t=pe(()=>{const E=new Set;for(const ee of r.value)for(const Ce of ee.threads)E.add(Ce.id);return E}),Pt=pe(()=>Re.name==="home"),Et=pe(()=>Re.name==="skills"),Mt=pe(()=>{var E;return Et.value?"Skills":Pt.value?"New thread":((E=o.value)==null?void 0:E.title)??"Choose a thread"}),In=pe(()=>ie.value.filter(E=>{const ee=er(E.messageType,E.role);return ee==="worked"?!0:!(ee==="turnActivity.live"||ee==="turnError.live"||ee==="agentReasoning.live")})),Pn=pe(()=>l.value),_n=pe(()=>Pt.value?"__new-thread__":c.value),Lt=pe(()=>{var E,ee;return Pt.value?F.value.trim():((ee=(E=o.value)==null?void 0:E.cwd)==null?void 0:ee.trim())??""}),Vt=pe(()=>{var E;return!Pt.value&&((E=o.value)==null?void 0:E.inProgress)===!0}),Mn=pe(()=>{var yt,gt;const E=[],ee=new Set;for(const rt of H.value.order){const Yt=rt.trim();!Yt||ee.has(Yt)||(ee.add(Yt),E.push({value:Yt,label:H.value.labels[Yt]||_e(Yt)}))}for(const rt of r.value){const Yt=((gt=(yt=rt.threads[0])==null?void 0:yt.cwd)==null?void 0:gt.trim())??"";!Yt||ee.has(Yt)||(ee.add(Yt),E.push({value:Yt,label:s.value[rt.projectName]??rt.projectName}))}const Ce=F.value.trim();return Ce&&!ee.has(Ce)&&E.unshift({value:Ce,label:_e(Ce)}),E}),en=typeof window<"u"?window.matchMedia("(prefers-color-scheme: dark)"):null;Or(()=>{window.addEventListener("keydown",Cn),document.addEventListener("visibilitychange",Xn),window.addEventListener("pageshow",An),window.addEventListener("focus",xn),Jt(),en==null||en.addEventListener("change",Jt),Li(),K(),Ee(),R()}),Ci(()=>{window.removeEventListener("keydown",Cn),document.removeEventListener("visibilitychange",Xn),window.removeEventListener("pageshow",An),window.removeEventListener("focus",xn),en==null||en.removeEventListener("change",Jt),Ie&&(clearTimeout(Ie),Ie=null),fe()}),mt(G,E=>{const ee=E.trim();if(Ie&&(clearTimeout(Ie),Ie=null),!ee){ke.value=null;return}Ie=setTimeout(()=>{r0(ee,1e3).then(Ce=>{G.value.trim()===ee&&(ke.value=Ce.threadIds)}).catch(()=>{G.value.trim()===ee&&(ke.value=null)})},220)});function $n(){ce()}function Bn(){Te.value=!Te.value,Te.value?qt(()=>{var E;return(E=ve.value)==null?void 0:E.focus()}):G.value=""}function rn(){var E;G.value="",(E=ve.value)==null||E.focus()}function kn(E){E.key==="Escape"&&(Te.value=!1,G.value="")}function Fn(E){E&&(Re.name==="thread"&&ot.value===E||(k.push({name:"thread",params:{threadId:E}}),I.value&&Wt(!0)))}async function pr(E){E&&(c.value!==E&&(await me(E),await k.push({name:"thread",params:{threadId:E}})),await qt(),zt())}function mr(E){X(E)}function Un(E){var yt,gt;const ee=r.value.find(rt=>rt.projectName===E),Ce=((gt=(yt=ee==null?void 0:ee.threads[0])==null?void 0:yt.cwd)==null?void 0:gt.trim())??"";Ce&&(F.value=Ce),I.value&&Wt(!0),!Pt.value&&k.push({name:"home"})}function Le(E){var yt,gt;const ee=r.value.find(rt=>rt.projectName===E),Ce=((gt=(yt=ee==null?void 0:ee.threads[0])==null?void 0:yt.cwd)==null?void 0:gt.trim())??"";!Ce||typeof window>"u"||window.open(`/codex-local-browse${encodeURI(Ce)}`,"_blank","noopener,noreferrer")}function Pe(){var ee,Ce;const E=((Ce=(ee=o.value)==null?void 0:ee.cwd)==null?void 0:Ce.trim())??"";E&&(F.value=E),I.value&&Wt(!0),!Pt.value&&k.push({name:"home"})}function Tn(E){it(E.projectName,E.displayName)}function Ft(E){le(E.threadId,E.title)}async function En(E){await lt(E),await Ee(),R()}function On(E){Ve(E.projectName,E.toIndex)}function pn(E){ae(E.threadId,E.state)}function Nn(E){Dt(E)}function Wt(E){z.value!==E&&(z.value=E,Dr(E))}function Cn(E){E.defaultPrevented||!E.ctrlKey&&!E.metaKey||E.shiftKey||E.altKey||E.key.toLowerCase()==="b"&&(E.preventDefault(),Wt(!z.value))}function Xn(){if(!(typeof document>"u")&&I.value){if(document.visibilityState==="hidden"){Ot.value=Date.now(),hn.value=!1;return}A()}}function An(E){E.persisted&&A()}function xn(){A()}function A(){typeof window>"u"||typeof document>"u"||!I.value||document.visibilityState!=="visible"||hn.value||Ot.value===null||Date.now()-Ot.value<sx||(hn.value=!0,Ot.value=null,j())}async function j(){if(!ut.value){ut.value=!0;try{await we({includeSelectedThreadMessages:!0,awaitAncillaryRefreshes:!0}),await Do(),await Vs()}finally{ut.value=!1}}}function re(E){const ee=E.text;if(Pt.value){Ws(ee,E.imageUrls,E.skills,E.fileAttachments);return}te(ee,E.imageUrls,E.skills,E.mode,E.fileAttachments)}function je(E){F.value=E.trim()}async function g(E){const ee=E.trim();if(!ee)return;const Ce=v(ee),yt=await m(),gt=Ce?ee:he(yt,ee);if(gt)try{const rt=await e0(gt,{createIfMissing:!Ce,label:Ce?"":ee});rt&&(F.value=rt,V(_e(rt)),Ee(),R())}catch{}}async function m(){const E=B();if(E)return E;try{const ee=await gu();if(ee)return tt.value=ee,ee}catch{}return""}function v(E){return E?E.startsWith("~/")||E.startsWith("/")?!0:/^[a-zA-Z]:[\\/]/.test(E):!1}async function R(){const E=B();if(!E){Ue.value="New Project (1)";return}try{const ee=await t0(E);Ue.value=ee.name||"New Project (1)"}catch{Ue.value="New Project (1)"}}function B(){var Ce,yt;const E=F.value.trim();if(E)return Q(E);const ee=((yt=(Ce=Mn.value[0])==null?void 0:Ce.value)==null?void 0:yt.trim())??"";return ee?Q(ee):tt.value.trim()}async function K(){try{tt.value=await gu()}catch{tt.value=""}}async function Ee(){try{const E=await Zs();H.value={order:[...E.order],labels:{...E.labels}}}catch{H.value={order:[],labels:{}}}}function Q(E){const ee=E.trim().replace(/\/+$/,"");if(!ee)return"";const Ce=ee.lastIndexOf("/");return Ce<=0?"":ee.slice(0,Ce)}function _e(E){const ee=E.trim().replace(/\/+$/,"");if(!ee)return"";const Ce=ee.lastIndexOf("/");return Ce<0?ee:ee.slice(Ce+1)}function he(E,ee){const Ce=E.trim().replace(/\/+$/,""),yt=ee.trim().replace(/^\/+/,"");return!Ce||!yt?"":`${Ce}/${yt}`}function Ke(E){Be(E)}function jt(E){at(E)}function Ht(){Ne()}function Ct(E){qe(E.turnIndex)}function zt(){if(Pt.value||Et.value||typeof document>"u"||!o.value||In.value.length===0)return;const E=Us(),ee=S(),Ce=new Blob([E],{type:"text/markdown;charset=utf-8"}),yt=URL.createObjectURL(Ce),gt=document.createElement("a");gt.href=yt,gt.download=ee,document.body.appendChild(gt),gt.click(),document.body.removeChild(gt),window.setTimeout(()=>URL.revokeObjectURL(yt),0)}function Us(){var Ce,yt,gt;const E=[],ee=((yt=(Ce=o.value)==null?void 0:Ce.title)==null?void 0:yt.trim())||"Untitled thread";E.push(`# ${x(ee)}`),E.push(""),E.push(`- Exported: ${new Date().toISOString()}`),E.push(`- Thread ID: ${((gt=o.value)==null?void 0:gt.id)??""}`),E.push(""),E.push("---"),E.push("");for(const rt of In.value){const Yt=rt.role?rt.role.toUpperCase():"MESSAGE";E.push(`## ${Yt}`),E.push("");const zs=rt.text.trim();if(zs&&(E.push(zs),E.push("")),rt.commandExecution&&(E.push("```text"),E.push(`command: ${rt.commandExecution.command}`),E.push(`status: ${rt.commandExecution.status}`),rt.commandExecution.cwd&&E.push(`cwd: ${rt.commandExecution.cwd}`),rt.commandExecution.exitCode!==null&&E.push(`exitCode: ${rt.commandExecution.exitCode}`),E.push(rt.commandExecution.aggregatedOutput||"(no output)"),E.push("```"),E.push("")),rt.fileAttachments&&rt.fileAttachments.length>0){E.push("Attachments:");for(const Gs of rt.fileAttachments)E.push(`- ${Gs.path}`);E.push("")}if(rt.images&&rt.images.length>0){E.push("Images:");for(const Gs of rt.images)E.push(`- ${Gs}`);E.push("")}}return`${E.join(`
1438
+ `)}v(u);const Ui=Ee(u);Ui&&(he(ge,Ui),Et(ge,{label:"Running command",details:[((ql=Ui.commandExecution)==null?void 0:ql.command)??""]}));const Hi=Q(u);if(Hi){const Xe=(a.value[ge]??[]).find(tr=>tr.id===Hi.itemId);Xe!=null&&Xe.commandExecution&&he(ge,{...Xe,commandExecution:{...Xe.commandExecution,aggregatedOutput:`${Xe.commandExecution.aggregatedOutput}${Hi.delta}`}})}const Hl=_e(u);if(Hl&&he(ge,Hl),jt(u)&&(fe&&n.value&&Pn(n.value,{scrollTop:0,isAtBottom:!0,scrollRatio:1}),rn(ge)),u.method==="turn/completed"){fe=!1,rn(ge),a.value[ge]&&(a.value=Xt(a.value,ge));const Xe=Ft(u);Xe&&(_t(Xe,!1),Et(Xe,null),Pt(Xe),de||(Ie(Xe),Hs(Xe)))}}function Ct(u){const f=Ft(u);f&&V.add(f);const _=u.method;(_.startsWith("thread/")||_.startsWith("turn/")||_.startsWith("item/"))&&(Ve=!0),!(lt!==null||typeof window>"u")&&(lt=window.setTimeout(()=>{lt=null,E()},ba))}async function zt(u){if(!be){be=!0;try{const f=await Zs(),_=[];for(const C of f.order){const Y=bs(C);_.includes(Y)||_.push(Y)}if(_.length>0){const C=Vo(_,u);cs(L.value,C)||(L.value=C,ws(L.value))}if(Object.keys(f.labels).length>0){const C={...se.value};let Y=!1;for(const[oe,de]of Object.entries(f.labels)){const Se=bs(oe);C[Se]!==de&&(C[Se]=de,Y=!0)}Y&&(se.value=C,_a(C))}}catch{}}}async function Us(){if(!(Object.keys(Ne.value).length>0))try{const u=await s0();Object.keys(u.titles).length>0&&(Ne.value=u.titles)}catch{}}async function S(u,f,_){if(Ne.value[u])return;const C=f.trim();if(!C)return;const Y=C.length>300?C.slice(0,300):C;try{const oe=await o0(Y,_);if(!oe||Ne.value[u])return;Ne.value={...Ne.value,[u]:oe},Je(),fa(u,oe)}catch{}}async function x(){var u;Dt.value||(He.value=!0);try{const[f]=await Promise.all([Lk(),Us()]);await zt(f);const _=Vo(L.value,f);cs(L.value,_)||(L.value=_,ws(L.value));const C=ka(f,L.value),Y=DA(t.value,C,l.value);t.value=zo(t.value,Y),l.value=on(l.value,new Set(Vr(t.value).map(Se=>Se.id))),Je(),Dt.value=!0;const oe=Vr(e.value);hn(oe),oe.some(Se=>Se.id===n.value)||U(((u=oe[0])==null?void 0:u.id)??"")}finally{He.value=!1}}async function M(u,f={}){if(!u)return;const _=we.value[u]===!0,C=f.silent!==!0&&!_;C&&(Fe.value=!0);try{ce.value[u]!==!0&&(await ua(u),ce.value={...ce.value,[u]:!0});const{messages:Y,inProgress:oe}=await jk(u),de=r.value[u]??[],Se=SA(de,Y,{preserveMissing:f.silent===!0});_n(u,Se);const ge=o.value[u]??[],st=IA(ge,Y);Lt(u,st),Ke(u,Y),we.value={...we.value,[u]:!0};const Nt=In(u);Nt&&(ne.value={...ne.value,[u]:Nt}),_t(u,oe),oe||kn(u),ut(u)}finally{C&&(Fe.value=!1)}}async function Z(u,f={}){u&&we.value[u]!==!0&&await M(u,f)}async function We(){try{const u=t.value.flatMap(f=>f.threads.map(_=>_.cwd)).filter(Boolean);qe.value=await i0(u.length>0?[...new Set(u)]:void 0)}catch{}}async function $t(){try{Te(await Hk())}catch{}}async function tn(u={}){Be.value="";const f=u.includeSelectedThreadMessages!==!1,_=u.awaitAncillaryRefreshes===!0;try{await x();const C=Promise.allSettled([et(),Qe(),We(),$t()]).then(()=>{});f&&await M(n.value),_&&await C}catch(C){Be.value=C instanceof Error?C.message:"Unknown application error"}}async function Zn(u){U(u);try{await M(u)}catch(f){Be.value=f instanceof Error?f.message:"Unknown application error"}}async function sn(u){try{await Vk(u),await x(),n.value===u&&await M(n.value)}catch(f){Be.value=f instanceof Error?f.message:"Unknown application error"}}async function Jt(u,f){const _=f.trim();if(!(!u||!_))try{await Wk(u,_),Ne.value={...Ne.value,[u]:_},Je(),fa(u,_)}catch(C){Be.value=C instanceof Error?C.message:"Unknown application error"}}async function Hn(u,f=[],_=[],C="steer",Y=[]){const oe=n.value,de=u.trim();if(!oe||!de&&f.length===0&&Y.length===0)return;const Se=l.value[oe]===!0;if(Se&&C==="queue"){const ge=d.value[oe]??[],st=`q-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;d.value={...d.value,[oe]:[...ge,{id:st,text:de,imageUrls:f,skills:_,fileAttachments:Y,collaborationMode:T.value}]};return}if(Se){fe=!0,er(oe,de,f,_,Y).catch(ge=>{const st=ge instanceof Error?ge.message:"Unknown application error";Mt(oe,st),Be.value=st});return}Be.value="",fe=!0,ot(oe,null),Et(oe,{label:"Thinking",details:ct(N.value,O.value,T.value)}),Mt(oe,null),_t(oe,!0);try{await er(oe,de,f,_,Y)}catch(ge){fe=!1,_t(oe,!1),Et(oe,null);const st=ge instanceof Error?ge.message:"Unknown application error";throw Mt(oe,st),Be.value=st,ge}}async function Dr(u,f,_=[],C=[],Y=[]){const oe=u.trim(),de=f.trim(),Se=N.value.trim();if(!oe&&_.length===0&&Y.length===0)return"";xe.value=!0,Be.value="";let ge="";try{try{ge=await mu(de||void 0,Se||void 0)}catch(Vn){if(Se&&Se!==Ln&&Wo(Vn))await ve(),ge=await mu(de||void 0,Ln);else throw Vn}if(!ge)return"";Ot(ge,de,oe||"[Image]"),ce.value={...ce.value,[ge]:!0},U(ge),fe=!0,ot(ge,null),Et(ge,{label:"Thinking",details:ct(N.value,O.value,T.value)}),Mt(ge,null),_t(ge,!0);const st=ge,Nt=de||null,Qt=oe;return er(ge,oe,_,C,Y).catch(Vn=>{fe=!1,_t(ge,!1),Et(ge,null);const Zr=Vn instanceof Error?Vn.message:"Unknown application error";Mt(ge,Zr),Be.value=Zr}).finally(()=>{xe.value=!1}),S(st,Qt,Nt),ge}catch(st){fe=!1,ge&&(_t(ge,!1),Et(ge,null));const Nt=st instanceof Error?st.message:"Unknown application error";throw ge&&Mt(ge,Nt),Be.value=Nt,xe.value=!1,st}}async function er(u,f,_=[],C=[],Y=[]){const oe=N.value.trim(),de=O.value,Se=T.value,ge=f.trim(),st=C.map(Qt=>({name:Qt.name,path:Qt.path})),Nt=Y.map(Qt=>({...Qt}));ke(u,{text:ge,imageUrls:[..._],skills:st,fileAttachments:Nt,effort:de,collaborationMode:Se,fallbackRetried:!1});try{ce.value[u]!==!0&&await ua(u);try{await da(u,f,_,oe||void 0,de||void 0,C.length>0?C:void 0,Y,Se)}catch(Qt){if(oe&&oe!==Ln&&Wo(Qt))await ve(),ke(u,{text:ge,imageUrls:[..._],skills:st,fileAttachments:Nt,effort:de,collaborationMode:Se,fallbackRetried:!0}),await da(u,f,_,Ln,de||void 0,C.length>0?C:void 0,Y,Se);else throw Qt}ce.value={...ce.value,[u]:!0},V.add(u),Ve=!0,await E()}catch(Qt){throw Qt}}async function Hs(u){const f=d.value[u];if(!f||f.length===0)return;const[_,...C]=f;d.value=C.length>0?{...d.value,[u]:C}:Xt(d.value,u),xe.value=!0,Be.value="",fe=!0,ot(u,null),Et(u,{label:"Thinking",details:ct(N.value,O.value,_.collaborationMode)}),Mt(u,null),_t(u,!0);try{G(_.collaborationMode),await er(u,_.text,_.imageUrls,_.skills,_.fileAttachments)}catch{_t(u,!1),Et(u,null)}finally{xe.value=!1}}async function Li(){const u=n.value;if(!u||l.value[u]!==!0)return;const f=X.value[u];nt.value=!0,Be.value="";try{await Kk(u,f),_t(u,!1),Et(u,null),Mt(u,null),X.value[u]&&(X.value=Xt(X.value,u)),V.add(u),Ve=!0,await E()}catch(_){const C=_ instanceof Error?_.message:"Failed to interrupt active turn";Mt(u,C),Be.value=C}finally{nt.value=!1}}async function ji(u){const f=n.value;if(!f||ze.value)return;const C=(r.value[f]??[]).reduce((oe,de)=>typeof de.turnIndex=="number"&&de.turnIndex>oe?de.turnIndex:oe,-1);if(C<0||u>C)return;const Y=C-u+1;if(!(Y<1)){ze.value=!0,Be.value="";try{const oe=await pu(f,Y);_n(f,oe),kn(f),Lt(f,[]),rn(f),a.value[f]&&(a.value=Xt(a.value,f)),ot(f,null),Et(f,null),Mt(f,null),Ve=!0,await E()}catch(oe){Be.value=oe instanceof Error?oe.message:"Failed to rollback thread"}finally{ze.value=!1}}}function Bi(u,f){u.length===0||(se.value[u]??"")===f||(se.value={...se.value,[u]:f},_a(se.value))}async function Fi(u){var oe;if(u.length===0)return;const f=L.value.filter(de=>de!==u);if(cs(L.value,f)||(L.value=f,ws(L.value)),t.value=t.value.filter(de=>de.projectName!==u),se.value[u]!==void 0){const de={...se.value};delete de[u],se.value=de,_a(de)}Je();const _=Vr(e.value);hn(_),_.some(de=>de.id===n.value)||U(((oe=_[0])==null?void 0:oe.id)??"");const Y=new Set;try{const de=await Zs();for(const Se of de.order)bs(Se)===u&&Y.add(Se);for(const Se of de.active)bs(Se)===u&&Y.add(Se);for(const Se of Object.keys(de.labels))bs(Se)===u&&Y.add(Se)}catch{}if(Y.size>0)try{const de=await Zs(),Se=de.order.filter(Nt=>!Y.has(Nt)),ge=de.active.filter(Nt=>!Y.has(Nt)),st=ge.length===0&&Se.length>0?[Se[0]]:ge;await vu({order:Se,labels:MA(de.labels,Y),active:st});return}catch{}await Ws()}function Do(u,f){if(u.length===0||t.value.length===0)return;const _=t.value.map(ge=>ge.projectName),C=_.indexOf(u);if(C===-1)return;const Y=Math.max(0,Math.min(f,_.length-1)),oe=bA(_,C,Y);if(oe===_)return;const de=Vo(oe,t.value);L.value=de,ws(L.value);const Se=ka(t.value,L.value);t.value=zo(t.value,Se),Je(),Ws()}function Vs(u){const f=u.trim();if(!f)return;const _=[f,...L.value.filter(Y=>Y!==f)];if(cs(L.value,_))return;L.value=_,ws(L.value);const C=ka(t.value,L.value);t.value=zo(t.value,C),Je(),Ws()}async function Ws(){var u,f;try{const _=await Zs(),C=new Map;for(const de of _.order){const Se=bs(de);C.has(Se)||C.set(Se,de)}for(const de of t.value){const Se=((f=(u=de.threads[0])==null?void 0:u.cwd)==null?void 0:f.trim())??"";Se&&C.set(de.projectName,Se)}const Y=[];for(const de of L.value){const Se=C.get(de);Se&&!Y.includes(Se)&&Y.push(Se)}for(const de of _.order)Y.includes(de)||Y.push(de);const oe=_.active.filter(de=>Y.includes(de));oe.length===0&&Y.length>0&&oe.push(Y[0]),await vu({order:Y,labels:_.labels,active:oe})}catch{}}async function E(){if(at.value){typeof window<"u"&&lt===null&&(lt=window.setTimeout(()=>{lt=null,E()},ba));return}at.value=!0;const u=Ve,f=new Set(V);Ve=!1,V.clear();try{u&&await x();const _=n.value;if(!_)return;const C=f.has(_),Y=l.value[_]===!0,oe=In(_),de=ne.value[_]??"",Se=oe.length>0&&oe!==de;(C||Y||Se||u)&&await M(_,{silent:!0})}catch{}finally{at.value=!1,(Ve||V.size>0)&&typeof window<"u"&&lt===null&&(lt=window.setTimeout(()=>{lt=null,E()},ba))}}async function ee(){await yt(),Ve=!0,n.value&&V.add(n.value),await E()}function Ce(){typeof window>"u"||it||(yt(),it=Bk(u=>{if(u.method==="ready"){ee();return}Ht(u),Ct(u)}))}async function yt(){try{const f=(await Uk()).map(_=>pn(_)).filter(_=>_!==null);Cn(f)}catch{}}async function gt(u){try{await Fk(u.id,{result:u.result,error:u.error}),Wt(u.id)}catch(f){Be.value=f instanceof Error?f.message:"Failed to reply to server request"}}function rt(){it&&(it(),it=null),Ve=!1,V.clear(),Ae.clear(),lt!==null&&typeof window<"u"&&(window.clearTimeout(lt),lt=null),fe=!1,r.value={},s.value={},o.value={},i.value={},a.value={},Oe.value={},me.value={},ae.value={},X.value={},d.value={},Me.value=null}const Yt=pe(()=>{const u=n.value;return u?d.value[u]??[]:[]});function zs(u){const f=n.value;if(!f)return;const _=d.value[f];if(!_)return;const C=_.filter(Y=>Y.id!==u);d.value=C.length>0?{...d.value,[f]:C}:Xt(d.value,f)}function Gs(u){const f=n.value;if(!f)return;const _=d.value[f];if(!_)return;const C=_.find(Y=>Y.id===u);C&&(zs(u),G(C.collaborationMode),Hn(C.text,C.imageUrls,C.skills,"steer",C.fileAttachments))}function jh(u){U(u)}return{projectGroups:e,projectDisplayNameById:se,selectedThread:I,selectedThreadScrollState:$,selectedThreadServerRequests:q,selectedLiveOverlay:F,codexQuota:P,selectedThreadId:n,availableCollaborationModes:b,availableModelIds:h,selectedCollaborationMode:T,selectedModelId:N,selectedReasoningEffort:O,installedSkills:qe,messages:H,isLoadingThreads:He,isLoadingMessages:Fe,isSendingMessage:xe,isInterruptingTurn:nt,error:Be,refreshAll:tn,refreshSkills:We,selectThread:Zn,loadMessages:M,ensureThreadMessagesLoaded:Z,setThreadScrollState:Pn,archiveThreadById:sn,renameThreadById:Jt,sendMessageToSelectedThread:Hn,sendMessageToNewThread:Dr,interruptSelectedThreadTurn:Li,rollbackSelectedThread:ji,isRollingBack:ze,selectedThreadQueuedMessages:Yt,removeQueuedMessage:zs,steerQueuedMessage:Gs,setSelectedCollaborationMode:G,setSelectedModelId:z,setSelectedReasoningEffort:tt,respondToPendingServerRequest:gt,renameProject:Bi,removeProject:Fi,reorderProject:Do,pinProjectToTop:Vs,startPolling:Ce,stopPolling:rt,primeSelectedThread:jh}}const FA={class:"sidebar-root"},UA={class:"sidebar-scrollable"},HA=["aria-pressed"],VA={key:1,class:"sidebar-search-bar"},WA={key:0,class:"sidebar-settings-area"},zA={key:0,class:"sidebar-settings-panel"},GA={class:"sidebar-settings-value"},qA={class:"sidebar-settings-value"},KA={class:"content-root"},JA={class:"content-body"},YA={key:1,class:"content-grid"},QA={class:"new-thread-empty"},XA={class:"worktree-init-status-title"},ZA={class:"worktree-init-status-message"},ex={key:2,class:"content-grid"},tx={class:"content-thread"},nx={class:"composer-with-queue"},rx={class:"build-badge","aria-label":"Author name, worktree name, and version"},Zu="codex-web-local.sidebar-collapsed.v1",Sa="codex-web-local.last-active-thread-route.v1",ed="codex-web-local.send-with-enter.v1",td="codex-web-local.in-progress-send-mode.v1",nd="codex-web-local.dark-mode.v1",rd="codex-web-local.dictation-click-to-toggle.v1",sx=400,ox=Zt({__name:"App",setup(e){const t="codexui",n="1.0.2",{projectGroups:r,projectDisplayNameById:s,selectedThread:o,selectedThreadScrollState:i,selectedThreadServerRequests:a,selectedLiveOverlay:l,codexQuota:d,selectedThreadId:c,availableCollaborationModes:h,availableModelIds:b,selectedCollaborationMode:T,selectedModelId:N,selectedReasoningEffort:O,installedSkills:J,messages:ie,isLoadingThreads:L,isLoadingMessages:se,isInterruptingTurn:ne,refreshAll:we,refreshSkills:ce,selectThread:me,ensureThreadMessagesLoaded:Oe,setThreadScrollState:ae,archiveThreadById:X,renameThreadById:le,sendMessageToSelectedThread:te,sendMessageToNewThread:Me,interruptSelectedThreadTurn:Ne,rollbackSelectedThread:qe,isRollingBack:He,selectedThreadQueuedMessages:Fe,removeQueuedMessage:xe,steerQueuedMessage:nt,setSelectedCollaborationMode:ze,setSelectedModelId:Be,setSelectedReasoningEffort:at,respondToPendingServerRequest:Dt,renameProject:it,removeProject:lt,reorderProject:Ve,pinProjectToTop:V,startPolling:be,stopPolling:fe,primeSelectedThread:Ae}=BA(),Re=_v(),k=bv(),{isMobile:I}=$f(),$=D(!1),q=D(!1),F=D(""),P=D("local"),H=D({order:[],labels:{}}),U=D({phase:"idle",title:"",message:""}),z=D(Hn()),G=D(""),Te=D(!1),ve=D(null),ke=D(null);let Ie=null;const Ue=D("New Project (1)"),tt=D(""),Qe=D(!1),ct=D(M(ed,!0)),et=D(We()),pt=D(Z()),Je=D(M(rd,!1)),Ot=D(null),hn=D(!1),ut=D(!1),ot=pe(()=>{const E=Re.params.threadId;return typeof E=="string"?E:""}),_t=pe(()=>{const E=new Set;for(const ee of r.value)for(const Ce of ee.threads)E.add(Ce.id);return E}),Pt=pe(()=>Re.name==="home"),Et=pe(()=>Re.name==="skills"),Mt=pe(()=>{var E;return Et.value?"Skills":Pt.value?"New thread":((E=o.value)==null?void 0:E.title)??"Choose a thread"}),In=pe(()=>ie.value.filter(E=>{const ee=er(E.messageType,E.role);return ee==="worked"?!0:!(ee==="turnActivity.live"||ee==="turnError.live"||ee==="agentReasoning.live")})),Pn=pe(()=>l.value),_n=pe(()=>Pt.value?"__new-thread__":c.value),Lt=pe(()=>{var E,ee;return Pt.value?F.value.trim():((ee=(E=o.value)==null?void 0:E.cwd)==null?void 0:ee.trim())??""}),Vt=pe(()=>{var E;return!Pt.value&&((E=o.value)==null?void 0:E.inProgress)===!0}),Mn=pe(()=>{var yt,gt;const E=[],ee=new Set;for(const rt of H.value.order){const Yt=rt.trim();!Yt||ee.has(Yt)||(ee.add(Yt),E.push({value:Yt,label:H.value.labels[Yt]||_e(Yt)}))}for(const rt of r.value){const Yt=((gt=(yt=rt.threads[0])==null?void 0:yt.cwd)==null?void 0:gt.trim())??"";!Yt||ee.has(Yt)||(ee.add(Yt),E.push({value:Yt,label:s.value[rt.projectName]??rt.projectName}))}const Ce=F.value.trim();return Ce&&!ee.has(Ce)&&E.unshift({value:Ce,label:_e(Ce)}),E}),en=typeof window<"u"?window.matchMedia("(prefers-color-scheme: dark)"):null;Or(()=>{window.addEventListener("keydown",Cn),document.addEventListener("visibilitychange",Xn),window.addEventListener("pageshow",An),window.addEventListener("focus",xn),Jt(),en==null||en.addEventListener("change",Jt),Li(),K(),Ee(),R()}),Ci(()=>{window.removeEventListener("keydown",Cn),document.removeEventListener("visibilitychange",Xn),window.removeEventListener("pageshow",An),window.removeEventListener("focus",xn),en==null||en.removeEventListener("change",Jt),Ie&&(clearTimeout(Ie),Ie=null),fe()}),mt(G,E=>{const ee=E.trim();if(Ie&&(clearTimeout(Ie),Ie=null),!ee){ke.value=null;return}Ie=setTimeout(()=>{r0(ee,1e3).then(Ce=>{G.value.trim()===ee&&(ke.value=Ce.threadIds)}).catch(()=>{G.value.trim()===ee&&(ke.value=null)})},220)});function $n(){ce()}function Bn(){Te.value=!Te.value,Te.value?qt(()=>{var E;return(E=ve.value)==null?void 0:E.focus()}):G.value=""}function rn(){var E;G.value="",(E=ve.value)==null||E.focus()}function kn(E){E.key==="Escape"&&(Te.value=!1,G.value="")}function Fn(E){E&&(Re.name==="thread"&&ot.value===E||(k.push({name:"thread",params:{threadId:E}}),I.value&&Wt(!0)))}async function pr(E){E&&(c.value!==E&&(await me(E),await k.push({name:"thread",params:{threadId:E}})),await qt(),zt())}function mr(E){X(E)}function Un(E){var yt,gt;const ee=r.value.find(rt=>rt.projectName===E),Ce=((gt=(yt=ee==null?void 0:ee.threads[0])==null?void 0:yt.cwd)==null?void 0:gt.trim())??"";Ce&&(F.value=Ce),I.value&&Wt(!0),!Pt.value&&k.push({name:"home"})}function Le(E){var yt,gt;const ee=r.value.find(rt=>rt.projectName===E),Ce=((gt=(yt=ee==null?void 0:ee.threads[0])==null?void 0:yt.cwd)==null?void 0:gt.trim())??"";!Ce||typeof window>"u"||window.open(`/codex-local-browse${encodeURI(Ce)}`,"_blank","noopener,noreferrer")}function Pe(){var ee,Ce;const E=((Ce=(ee=o.value)==null?void 0:ee.cwd)==null?void 0:Ce.trim())??"";E&&(F.value=E),I.value&&Wt(!0),!Pt.value&&k.push({name:"home"})}function Tn(E){it(E.projectName,E.displayName)}function Ft(E){le(E.threadId,E.title)}async function En(E){await lt(E),await Ee(),R()}function On(E){Ve(E.projectName,E.toIndex)}function pn(E){ae(E.threadId,E.state)}function Nn(E){Dt(E)}function Wt(E){z.value!==E&&(z.value=E,Dr(E))}function Cn(E){E.defaultPrevented||!E.ctrlKey&&!E.metaKey||E.shiftKey||E.altKey||E.key.toLowerCase()==="b"&&(E.preventDefault(),Wt(!z.value))}function Xn(){if(!(typeof document>"u")&&I.value){if(document.visibilityState==="hidden"){Ot.value=Date.now(),hn.value=!1;return}A()}}function An(E){E.persisted&&A()}function xn(){A()}function A(){typeof window>"u"||typeof document>"u"||!I.value||document.visibilityState!=="visible"||hn.value||Ot.value===null||Date.now()-Ot.value<sx||(hn.value=!0,Ot.value=null,j())}async function j(){if(!ut.value){ut.value=!0;try{await we({includeSelectedThreadMessages:!0,awaitAncillaryRefreshes:!0}),await Do(),await Vs()}finally{ut.value=!1}}}function re(E){const ee=E.text;if(Pt.value){Ws(ee,E.imageUrls,E.skills,E.fileAttachments);return}te(ee,E.imageUrls,E.skills,E.mode,E.fileAttachments)}function je(E){F.value=E.trim()}async function g(E){const ee=E.trim();if(!ee)return;const Ce=v(ee),yt=await m(),gt=Ce?ee:he(yt,ee);if(gt)try{const rt=await e0(gt,{createIfMissing:!Ce,label:Ce?"":ee});rt&&(F.value=rt,V(_e(rt)),Ee(),R())}catch{}}async function m(){const E=B();if(E)return E;try{const ee=await gu();if(ee)return tt.value=ee,ee}catch{}return""}function v(E){return E?E.startsWith("~/")||E.startsWith("/")?!0:/^[a-zA-Z]:[\\/]/.test(E):!1}async function R(){const E=B();if(!E){Ue.value="New Project (1)";return}try{const ee=await t0(E);Ue.value=ee.name||"New Project (1)"}catch{Ue.value="New Project (1)"}}function B(){var Ce,yt;const E=F.value.trim();if(E)return Q(E);const ee=((yt=(Ce=Mn.value[0])==null?void 0:Ce.value)==null?void 0:yt.trim())??"";return ee?Q(ee):tt.value.trim()}async function K(){try{tt.value=await gu()}catch{tt.value=""}}async function Ee(){try{const E=await Zs();H.value={order:[...E.order],labels:{...E.labels}}}catch{H.value={order:[],labels:{}}}}function Q(E){const ee=E.trim().replace(/\/+$/,"");if(!ee)return"";const Ce=ee.lastIndexOf("/");return Ce<=0?"":ee.slice(0,Ce)}function _e(E){const ee=E.trim().replace(/\/+$/,"");if(!ee)return"";const Ce=ee.lastIndexOf("/");return Ce<0?ee:ee.slice(Ce+1)}function he(E,ee){const Ce=E.trim().replace(/\/+$/,""),yt=ee.trim().replace(/^\/+/,"");return!Ce||!yt?"":`${Ce}/${yt}`}function Ke(E){Be(E)}function jt(E){at(E)}function Ht(){Ne()}function Ct(E){qe(E.turnIndex)}function zt(){if(Pt.value||Et.value||typeof document>"u"||!o.value||In.value.length===0)return;const E=Us(),ee=S(),Ce=new Blob([E],{type:"text/markdown;charset=utf-8"}),yt=URL.createObjectURL(Ce),gt=document.createElement("a");gt.href=yt,gt.download=ee,document.body.appendChild(gt),gt.click(),document.body.removeChild(gt),window.setTimeout(()=>URL.revokeObjectURL(yt),0)}function Us(){var Ce,yt,gt;const E=[],ee=((yt=(Ce=o.value)==null?void 0:Ce.title)==null?void 0:yt.trim())||"Untitled thread";E.push(`# ${x(ee)}`),E.push(""),E.push(`- Exported: ${new Date().toISOString()}`),E.push(`- Thread ID: ${((gt=o.value)==null?void 0:gt.id)??""}`),E.push(""),E.push("---"),E.push("");for(const rt of In.value){const Yt=rt.role?rt.role.toUpperCase():"MESSAGE";E.push(`## ${Yt}`),E.push("");const zs=rt.text.trim();if(zs&&(E.push(zs),E.push("")),rt.commandExecution&&(E.push("```text"),E.push(`command: ${rt.commandExecution.command}`),E.push(`status: ${rt.commandExecution.status}`),rt.commandExecution.cwd&&E.push(`cwd: ${rt.commandExecution.cwd}`),rt.commandExecution.exitCode!==null&&E.push(`exitCode: ${rt.commandExecution.exitCode}`),E.push(rt.commandExecution.aggregatedOutput||"(no output)"),E.push("```"),E.push("")),rt.fileAttachments&&rt.fileAttachments.length>0){E.push("Attachments:");for(const Gs of rt.fileAttachments)E.push(`- ${Gs.path}`);E.push("")}if(rt.images&&rt.images.length>0){E.push("Images:");for(const Gs of rt.images)E.push(`- ${Gs}`);E.push("")}}return`${E.join(`
1439
1439
  `).trimEnd()}
1440
1440
  `}function S(){var gt,rt;const Ce=(((rt=(gt=o.value)==null?void 0:gt.title)==null?void 0:rt.trim())||"chat").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"chat",yt=new Date().toISOString().replace(/[:.]/g,"-");return`${Ce}-${yt}.md`}function x(E){return E.replace(/([\\`*_{}\[\]()#+\-.!])/g,"\\$1")}function M(E,ee){if(typeof window>"u")return ee;const Ce=window.localStorage.getItem(E);return Ce===null?ee:Ce==="1"}function Z(){if(typeof window>"u")return"system";const E=window.localStorage.getItem(nd);return E==="light"||E==="dark"?E:"system"}function We(){return typeof window>"u"?"queue":window.localStorage.getItem(td)==="steer"?"steer":"queue"}function $t(){ct.value=!ct.value,window.localStorage.setItem(ed,ct.value?"1":"0")}function tn(){et.value=et.value==="steer"?"queue":"steer",window.localStorage.setItem(td,et.value)}function Zn(){const E=["system","light","dark"],ee=E.indexOf(pt.value);pt.value=E[(ee+1)%E.length],window.localStorage.setItem(nd,pt.value),Jt()}function sn(){Je.value=!Je.value,window.localStorage.setItem(rd,Je.value?"1":"0")}function Jt(){const E=document.documentElement;if(pt.value==="dark")E.classList.add("dark");else if(pt.value==="light")E.classList.remove("dark");else{const ee=window.matchMedia("(prefers-color-scheme: dark)").matches;E.classList.toggle("dark",ee)}}function Hn(){return typeof window>"u"?!1:window.localStorage.getItem(Zu)==="1"}function Dr(E){typeof window>"u"||window.localStorage.setItem(Zu,E?"1":"0")}function er(E,ee){const Ce=(E??"").trim();return Ce.length>0?Ce:ee.trim()||"message"}function Hs(E){ze(E)}async function Li(){await k.isReady(),Re.name==="thread"&&ot.value&&Ae(ot.value),be(),await we({includeSelectedThreadMessages:!0}),await Do(),q.value=!0,await Vs()}function ji(){if(typeof window>"u")return null;try{const E=window.localStorage.getItem(Sa);if(!E)return null;const ee=JSON.parse(E);return!ee||ee.routeName!=="thread"||typeof ee.threadId!="string"||ee.threadId.trim().length===0||typeof ee.updatedAtIso!="string"||ee.updatedAtIso.trim().length===0?null:{routeName:"thread",threadId:ee.threadId.trim(),updatedAtIso:ee.updatedAtIso}}catch{return null}}function Bi(E){if(typeof window>"u")return;const ee=E.trim();if(!ee)return;const Ce={routeName:"thread",threadId:ee,updatedAtIso:new Date().toISOString()};window.localStorage.setItem(Sa,JSON.stringify(Ce))}function Fi(){typeof window>"u"||window.localStorage.removeItem(Sa)}async function Do(){if(Re.name!=="home")return!1;const E=ji(),ee=c.value.trim(),Ce=(E==null?void 0:E.threadId)??ee;return Ce?_t.value.has(Ce)?(await k.replace({name:"thread",params:{threadId:Ce}}),!0):((E==null?void 0:E.threadId)===Ce&&Fi(),!1):!1}async function Vs(){if(!$.value){$.value=!0;try{if(Re.name==="home"||Re.name==="skills"){c.value!==""&&await me("");return}if(Re.name==="thread"){const E=ot.value;if(!E)return;if(!_t.value.has(E)){await k.replace({name:"home"});return}c.value!==E?await me(E):Oe(E,{silent:!0});return}}finally{$.value=!1}}}mt(()=>[Re.name,ot.value,c.value,q.value],([E,ee,Ce,yt])=>{if(!yt||E!=="thread")return;const gt=(ee||Ce).trim();gt&&_t.value.has(gt)&&Bi(gt)}),mt(()=>[Re.name,ot.value,L.value,_t.value.has(ot.value),c.value],async()=>{q.value&&await Vs()}),mt(()=>c.value,async E=>{if(q.value&&!$.value&&!(Pt.value||Et.value)){if(!E){Re.name!=="home"&&await k.replace({name:"home"});return}Re.name==="thread"&&ot.value===E||await k.replace({name:"thread",params:{threadId:E}})}}),mt(()=>[q.value,Re.name,c.value],([E,ee,Ce])=>{E&&ee==="thread"&&Ce&&Oe(Ce,{silent:!0})}),mt(()=>Mn.value,E=>{if(E.length===0){F.value="";return}E.some(Ce=>Ce.value===F.value)||(F.value=E[0].value),R()},{immediate:!0}),mt(()=>F.value,()=>{U.value={phase:"idle",title:"",message:""},R()}),mt(()=>P.value,E=>{E==="local"&&(U.value={phase:"idle",title:"",message:""})}),mt(()=>Re.name,E=>{E!=="home"&&(U.value={phase:"idle",title:"",message:""})}),mt(()=>c.value,()=>{U.value={phase:"idle",title:"",message:""}}),mt(I,E=>{E&&!z.value&&Wt(!0)});async function Ws(E,ee=[],Ce=[],yt=[]){try{U.value={phase:"idle",title:"",message:""};let gt=F.value;if(P.value==="worktree"){U.value={phase:"running",title:"Creating worktree",message:"Creating a worktree and running setup."};try{const Yt=await Zk(F.value);gt=Yt.cwd,F.value=Yt.cwd,U.value={phase:"idle",title:"",message:""}}catch{U.value={phase:"error",title:"Worktree setup failed",message:"Unable to create worktree. Try again or switch to Local project."};return}}const rt=await Me(E,gt,ee,Ce,yt);if(!rt)return;await k.replace({name:"thread",params:{threadId:rt}})}catch{}}return(E,ee)=>(p(),w($e,null,[De(Cv,{"is-sidebar-collapsed":z.value,onCloseSidebar:ee[6]||(ee[6]=Ce=>Wt(!0))},{sidebar:kt(()=>[y("section",FA,[y("div",UA,[z.value?ue("",!0):(p(),vt(Ju,{key:0,class:"sidebar-thread-controls-host","is-sidebar-collapsed":z.value,"show-new-thread-button":!0,onToggleSidebar:ee[0]||(ee[0]=Ce=>Wt(!z.value)),onStartNewThread:Pe},{default:kt(()=>[y("button",{class:"sidebar-search-toggle",type:"button","aria-pressed":Te.value,"aria-label":"Search threads",title:"Search threads",onClick:Bn},[De(za,{class:"sidebar-search-toggle-icon"})],8,HA)]),_:1},8,["is-sidebar-collapsed"])),!z.value&&Te.value?(p(),w("div",VA,[De(za,{class:"sidebar-search-bar-icon"}),xr(y("input",{ref_key:"sidebarSearchInputRef",ref:ve,"onUpdate:modelValue":ee[1]||(ee[1]=Ce=>G.value=Ce),class:"sidebar-search-input",type:"text",placeholder:"Filter threads...",onKeydown:kn},null,544),[[Rr,G.value]]),G.value.length>0?(p(),w("button",{key:0,class:"sidebar-search-clear",type:"button","aria-label":"Clear search",onClick:rn},[De(El,{class:"sidebar-search-clear-icon"})])):ue("",!0)])):ue("",!0),z.value?ue("",!0):(p(),w("button",{key:2,class:ft(["sidebar-skills-link",{"is-active":Et.value}]),type:"button",onClick:ee[2]||(ee[2]=Ce=>{ye(k).push({name:"skills"}),ye(I)&&Wt(!0)})}," Skills Hub ",2)),z.value?ue("",!0):(p(),vt(fw,{key:3,groups:ye(r),"project-display-name-by-id":ye(s),"selected-thread-id":ye(c),"is-loading":ye(L),"search-query":G.value,"search-matched-thread-ids":ke.value,onSelect:Fn,onArchive:mr,onStartNewThread:Un,onRenameProject:Tn,onBrowseProjectFiles:Le,onRenameThread:Ft,onRemoveProject:En,onReorderProject:On,onExportThread:pr},null,8,["groups","project-display-name-by-id","selected-thread-id","is-loading","search-query","search-matched-thread-ids"]))]),z.value?ue("",!0):(p(),w("div",WA,[De(bf,{name:"settings-panel"},{default:kt(()=>[Qe.value?(p(),w("div",zA,[y("button",{class:"sidebar-settings-row",type:"button",onClick:$t},[ee[7]||(ee[7]=y("span",{class:"sidebar-settings-label"},"Require ⌘ + enter to send",-1)),y("span",{class:ft(["sidebar-settings-toggle",{"is-on":!ct.value}])},null,2)]),y("button",{class:"sidebar-settings-row",type:"button",onClick:tn},[ee[8]||(ee[8]=y("span",{class:"sidebar-settings-label"},"When busy, send as",-1)),y("span",GA,W(et.value==="steer"?"Steer":"Queue"),1)]),y("button",{class:"sidebar-settings-row",type:"button",onClick:Zn},[ee[9]||(ee[9]=y("span",{class:"sidebar-settings-label"},"Appearance",-1)),y("span",qA,W(pt.value==="system"?"System":pt.value==="dark"?"Dark":"Light"),1)]),y("button",{class:"sidebar-settings-row",type:"button",onClick:sn},[ee[10]||(ee[10]=y("span",{class:"sidebar-settings-label"},"Click to toggle dictation",-1)),y("span",{class:ft(["sidebar-settings-toggle",{"is-on":Je.value}])},null,2)])])):ue("",!0)]),_:1}),y("button",{class:"sidebar-settings-button",type:"button",onClick:ee[3]||(ee[3]=Ce=>Qe.value=!Qe.value)},[De(uA,{class:"sidebar-settings-icon"}),ee[11]||(ee[11]=y("span",null,"Settings",-1))])]))])]),content:kt(()=>[y("section",KA,[De(yw,{title:Mt.value},{leading:kt(()=>[z.value||ye(I)?(p(),vt(Ju,{key:0,class:"sidebar-thread-controls-header-host","is-sidebar-collapsed":z.value,"show-new-thread-button":!0,onToggleSidebar:ee[4]||(ee[4]=Ce=>Wt(!z.value)),onStartNewThread:Pe},null,8,["is-sidebar-collapsed"])):ue("",!0)]),_:1},8,["title"]),y("section",JA,[Et.value?(p(),vt(JC,{key:0,onSkillsChanged:$n})):Pt.value?(p(),w("div",YA,[y("div",QA,[ee[12]||(ee[12]=y("p",{class:"new-thread-hero"},"Let's build",-1)),De(Wa,{class:"new-thread-folder-dropdown","model-value":F.value,options:Mn.value,placeholder:"Choose folder","enable-search":!0,"search-placeholder":"Quick search project","show-add-action":!0,"add-action-label":"+ Add new project","default-add-value":Ue.value,"add-placeholder":"Project name or absolute path",disabled:!1,"onUpdate:modelValue":je,onAdd:g},null,8,["model-value","options","default-add-value"]),De(tS,{class:"new-thread-runtime-dropdown",modelValue:P.value,"onUpdate:modelValue":ee[5]||(ee[5]=Ce=>P.value=Ce)},null,8,["modelValue"]),U.value.phase!=="idle"?(p(),w("div",{key:0,class:ft(["worktree-init-status",{"is-running":U.value.phase==="running","is-error":U.value.phase==="error"}])},[y("strong",XA,W(U.value.title),1),y("span",ZA,W(U.value.message),1)],2)):ue("",!0)]),De(bu,{"active-thread-id":_n.value,cwd:Lt.value,"collaboration-modes":ye(h),"selected-collaboration-mode":ye(T),models:ye(b),"selected-model":ye(N),"selected-reasoning-effort":ye(O),skills:ye(J),"codex-quota":ye(d),"is-turn-in-progress":!1,"is-interrupting-turn":!1,"send-with-enter":ct.value,"in-progress-submit-mode":et.value,"dictation-click-to-toggle":Je.value,onSubmit:re,"onUpdate:selectedCollaborationMode":Hs,"onUpdate:selectedModel":Ke,"onUpdate:selectedReasoningEffort":jt},null,8,["active-thread-id","cwd","collaboration-modes","selected-collaboration-mode","models","selected-model","selected-reasoning-effort","skills","codex-quota","send-with-enter","in-progress-submit-mode","dictation-click-to-toggle"])])):(p(),w("div",ex,[y("div",tx,[De(lk,{messages:In.value,"is-loading":ye(se),"active-thread-id":_n.value,cwd:Lt.value,"scroll-state":ye(i),"live-overlay":Pn.value,"pending-requests":ye(a),"is-turn-in-progress":Vt.value,"is-rolling-back":ye(He),onUpdateScrollState:pn,onRespondServerRequest:Nn,onRollback:Ct},null,8,["messages","is-loading","active-thread-id","cwd","scroll-state","live-overlay","pending-requests","is-turn-in-progress","is-rolling-back"])]),y("div",nx,[De(qT,{messages:ye(Fe),onSteer:ye(nt),onDelete:ye(xe)},null,8,["messages","onSteer","onDelete"]),De(bu,{"active-thread-id":_n.value,cwd:Lt.value,"collaboration-modes":ye(h),"selected-collaboration-mode":ye(T),models:ye(b),"selected-model":ye(N),"selected-reasoning-effort":ye(O),skills:ye(J),"codex-quota":ye(d),"is-turn-in-progress":Vt.value,"is-interrupting-turn":ye(ne),"has-queue-above":ye(Fe).length>0,"send-with-enter":ct.value,"in-progress-submit-mode":et.value,"dictation-click-to-toggle":Je.value,"onUpdate:selectedCollaborationMode":Hs,onSubmit:re,"onUpdate:selectedModel":Ke,"onUpdate:selectedReasoningEffort":jt,onInterrupt:Ht},null,8,["active-thread-id","cwd","collaboration-modes","selected-collaboration-mode","models","selected-model","selected-reasoning-effort","skills","codex-quota","is-turn-in-progress","is-interrupting-turn","has-queue-above","send-with-enter","in-progress-submit-mode","dictation-click-to-toggle"])])]))])])]),_:1},8,["is-sidebar-collapsed"]),y("div",rx," nervmor "+W(ye(t))+" · v"+W(ye(n)),1)],64))}}),ix=ht(ox,[["__scopeId","data-v-07673db6"]]),Ia={render:()=>null},ax=wv({history:Qg(),routes:[{path:"/",name:"home",component:Ia},{path:"/thread/:threadId",name:"thread",component:Ia},{path:"/skills",name:"skills",component:Ia},{path:"/new-thread",redirect:{name:"home"}},{path:"/:pathMatch(.*)*",redirect:{name:"home"}}]});console.log("Welcome to codexui. npm: https://www.npmjs.com/package/@nervmor/codexui");ug(ix).use(ax).mount("#app");"serviceWorker"in navigator&&window.addEventListener("load",()=>{navigator.serviceWorker.register("/sw.js").catch(e=>{console.error("Service worker registration failed.",e)})});
package/dist/index.html CHANGED
@@ -12,7 +12,7 @@
12
12
  <link rel="icon" type="image/png" sizes="192x192" href="/icons/pwa-192x192.png" />
13
13
  <link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png" />
14
14
  <title>Codex Web</title>
15
- <script type="module" crossorigin src="/assets/index-BUh0F7vz.js"></script>
15
+ <script type="module" crossorigin src="/assets/index-BmK4cun7.js"></script>
16
16
  <link rel="stylesheet" crossorigin href="/assets/index-IKfGXpjw.css">
17
17
  </head>
18
18
  <body class="bg-slate-950">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nervmor/codexui",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "A lightweight web interface for Codex that runs on top of the Codex app-server, allowing remote access from any browser",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,7 +27,6 @@
27
27
  "node": ">=18"
28
28
  },
29
29
  "bin": {
30
- "codexapp": "dist-cli/index.js",
31
30
  "codexui": "dist-cli/index.js"
32
31
  },
33
32
  "files": [